Skip to content

Commit 0ffa312

Browse files
author
Chri$
committed
feat :[LAR-61]Add notification for rejet article and fix unsend mail for approved article
1 parent 7d707d6 commit 0ffa312

File tree

11 files changed

+302
-117
lines changed

11 files changed

+302
-117
lines changed

.phpunit.cache/test-results

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"version":"pest_2.35.1","defects":{"P\\Tests\\Feature\\Article\\SendTelegramNotificationTest::__pest_evaluable_Send_notification_on_telegram_after_submition_on_article":8},"times":{"P\\Tests\\Feature\\Article\\SendTelegramNotificationTest::__pest_evaluable_Send_notification_on_telegram_after_submition_on_article":0.191}}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
3+
namespace App\Http\Livewire\Modals;
4+
5+
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
6+
use App\Notifications\SendDeclinedArticle;
7+
use Illuminate\Support\Facades\Cache;
8+
use LivewireUI\Modal\ModalComponent;
9+
use Livewire\Attributes\Validate;
10+
use App\Policies\ArticlePolicy;
11+
use App\Models\Article;
12+
13+
class DeclinedArticle extends ModalComponent
14+
{
15+
use AuthorizesRequests;
16+
17+
public ?string $raison = null;
18+
19+
public ?string $description = null;
20+
21+
public ?Article $article = null;
22+
23+
protected $rules = [
24+
'raison' => 'required|string|min:6',
25+
'description' => 'required|string',
26+
];
27+
28+
public function mount(int $id): void
29+
{
30+
$this->article = Article::find($id);
31+
}
32+
33+
public static function modalMaxWidth(): string
34+
{
35+
return 'xl';
36+
}
37+
38+
public function declined(): void
39+
{
40+
$data = $this->validate();
41+
42+
$this->authorize(ArticlePolicy::DISAPPROVE, $this->article);
43+
44+
$this->article->update(['declined_at' => now()]); // @phpstan-ignore-line
45+
46+
Cache::forget('post-'.$this->article->id); // @phpstan-ignore-line
47+
48+
$this->article->user->notify(new SendDeclinedArticle($this->article, $data)); // @phpstan-ignore-line
49+
50+
session()->flash('status', __('L\'article a été décliné et le mail a été envoyé à l\'auteur pour le notifier.'));
51+
52+
$this->redirectRoute('articles');
53+
}
54+
55+
56+
public function render()
57+
{
58+
return view('livewire.modals.declined-article');
59+
}
60+
}

app/Notifications/SendApprovedArticle.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@
66

77
use App\Models\Article;
88
use Illuminate\Bus\Queueable;
9-
use Illuminate\Contracts\Queue\ShouldQueue;
109
use Illuminate\Notifications\Messages\MailMessage;
1110
use Illuminate\Notifications\Notification;
1211

13-
final class SendApprovedArticle extends Notification implements ShouldQueue
12+
final class SendApprovedArticle extends Notification
1413
{
1514
use Queueable;
1615

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Notifications;
6+
7+
use App\Models\Article;
8+
use Illuminate\Bus\Queueable;
9+
use Illuminate\Notifications\Messages\MailMessage;
10+
use Illuminate\Notifications\Notification;
11+
12+
final class SendDeclinedArticle extends Notification
13+
{
14+
use Queueable;
15+
16+
public function __construct(public Article $article,public array $data)
17+
{}
18+
19+
public function via(object $notifiable): array
20+
{
21+
return ['mail'];
22+
}
23+
24+
public function toMail(object $notifiable): MailMessage
25+
{
26+
return (new MailMessage)
27+
->subject(__('Article Décliné ❌.'))
28+
->greeting(__('Article Décliné :'.$this->data['raison']))
29+
->line(__('Nous avons le regret de vous informer que votre article a été décliné.'))
30+
->line($this->data['description'])
31+
->action(__('Voir mon article'), route('articles.show', $this->article))
32+
->line(__('Merci d\'avoir utilisé Laravel Cameroun.!'));
33+
}
34+
}

resources/views/articles/show.blade.php

Lines changed: 154 additions & 114 deletions
Large diffs are not rendered by default.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
<button {{ $attributes->merge(['class' => 'inline-flex justify-center w-full rounded-md border border-transparent px-4 py-2 bg-negative-600 text-base leading-6 font-medium text-white shadow-sm hover:bg-negative-500 focus:outline-none focus:border-negative-700 sm:text-sm sm:leading-5 focus:ring-2 focus:ring-offset-2 focus:ring-offset-body focus:ring-negative-500']) }}>
1+
<button {{ $attributes->merge(['class' => 'button inline-flex items-center justify-center rounded-md border border-transparent px-4 py-2 bg-danger-600 text-base leading-6 font-medium text-white shadow-sm hover:bg-danger-500 focus:outline-none focus:border-danger-700 sm:text-sm sm:leading-5 focus:ring-2 focus:ring-offset-2 focus:ring-offset-body focus:ring-danger-500']) }}>
22
{{ $slot }}
33
</button>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
@props(['messages'])
2+
3+
@if ($messages)
4+
<ul {{ $attributes->merge(['class' => 'text-sm text-danger-600 space-y-1']) }}>
5+
@foreach ((array) $messages as $message)
6+
<li>{{ $message }}</li>
7+
@endforeach
8+
</ul>
9+
@endif
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
@props(['disabled' => false])
2+
3+
<input {{ $disabled ? 'disabled' : '' }} {!! $attributes->merge(['class' => 'inline-flex w-full py-2 rounded-lg placeholder-gray-500 border-gray-200 focus:ring-primary-500 focus:ring-2 focus:border-transparent focus:outline-none sm:text-sm']) !!}>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
@props(['value', 'required'])
2+
3+
<label {{ $attributes->merge(['class' => 'block font-medium text-sm text-gray-700']) }}>
4+
{{ $value ?? $slot }}
5+
@if(isset($required))
6+
<span class="text-red-600">*</span>
7+
@endif
8+
</label>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
@props(['disabled' => false])
2+
3+
<textarea {{ $disabled ? 'disabled' : '' }} {!! $attributes->merge(['class' => 'block p-2.5 w-full text-sm placeholder-gray-500 bg-gray-50 rounded-lg border border-gray-200 focus:ring-primary-500 focus:border-primary-500']) !!}>{{ $slot }}</textarea>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<x-modal footerClasses="px-4 pb-5 sm:px-4 sm:flex sm:flex-row-reverse">
2+
<x-slot name="content" class="space-y-4">
3+
<div class="space-y-2">
4+
<x-forms.label for="raison" :value="__('Motif du rejet')" required/>
5+
<x-forms.input wire:model="raison" id="raison" name="raison" type="text"/>
6+
<x-forms.errors :messages="$errors->get('raison')" />
7+
</div>
8+
<div class="space-y-2">
9+
<x-forms.label for='description' :value="__('Description')" required />
10+
<x-forms.textarea id='description' rows='4' wire:model='description' placeholder='Descrition du rejet' name="description"></x-forms.textarea>
11+
<x-forms.errors :messages="$errors->get('description')" />
12+
</div>
13+
</x-slot>
14+
15+
<x-slot name="buttons">
16+
<span class="flex w-full rounded-md shadow-sm sm:ml-3 sm:w-auto">
17+
<x-danger-button wire:click="declined" type="button">
18+
<x-loader class="text-white" wire:loading wire:target="declined" />
19+
{{ __('Decliner') }}
20+
</x-danger-button>
21+
</span>
22+
<span class="flex w-full mt-3 rounded-md shadow-sm sm:mt-0 sm:w-auto">
23+
<x-default-button wire:click="$emit('closeModal')" type="button">
24+
{{ __('Annuler') }}
25+
</x-default-button>
26+
</span>
27+
</x-slot>
28+
</x-modal>

0 commit comments

Comments
 (0)