diff --git a/app/Actions/Article/CreateArticleAction.php b/app/Actions/Article/CreateArticleAction.php index a960ba73..824e1528 100644 --- a/app/Actions/Article/CreateArticleAction.php +++ b/app/Actions/Article/CreateArticleAction.php @@ -9,14 +9,13 @@ use App\Models\Article; use App\Notifications\PostArticleToTelegram; use Carbon\Carbon; -use DateTimeInterface; use Illuminate\Support\Facades\Auth; final class CreateArticleAction { public function execute(CreateArticleData $articleData): Article { - if ($articleData->publishedAt && ! ($articleData->publishedAt instanceof DateTimeInterface)) { + if ($articleData->publishedAt) { $articleData->publishedAt = new Carbon( time: $articleData->publishedAt, tz: config('app.timezone') @@ -41,12 +40,14 @@ public function execute(CreateArticleData $articleData): Article } if ($articleData->file) { - $article->addMedia($articleData->file->getRealPath())->toMediaCollection('media'); + $article->addMedia($articleData->file->getRealPath()) + ->toMediaCollection('media'); } if ($article->isAwaitingApproval()) { // Envoi de la notification sur le channel Telegram pour la validation de l'article. Auth::user()?->notify(new PostArticleToTelegram($article)); + session()->flash('status', __('notifications.article.created')); } diff --git a/app/Actions/Forum/CreateReplyAction.php b/app/Actions/Forum/CreateReplyAction.php new file mode 100644 index 00000000..ee55249a --- /dev/null +++ b/app/Actions/Forum/CreateReplyAction.php @@ -0,0 +1,29 @@ + $body]); + $reply->authoredBy($user); + $reply->to($model); + $reply->save(); + + givePoint(new ReplyCreated($model, $user)); + event(new ReplyWasCreated($reply)); + } +} diff --git a/app/Actions/Forum/SubscribeToThreadAction.php b/app/Actions/Forum/SubscribeToThreadAction.php new file mode 100644 index 00000000..73bc91de --- /dev/null +++ b/app/Actions/Forum/SubscribeToThreadAction.php @@ -0,0 +1,23 @@ +uuid = Uuid::uuid4()->toString(); + $subscription->user()->associate(Auth::user()); + $subscription->subscribeAble()->associate($thread); + + $thread->subscribes()->save($subscription); + } +} diff --git a/app/Console/Commands/UpdateUserBestRepliesPoints.php b/app/Console/Commands/UpdateUserBestRepliesPoints.php index 7fc30bf3..afc4f842 100644 --- a/app/Console/Commands/UpdateUserBestRepliesPoints.php +++ b/app/Console/Commands/UpdateUserBestRepliesPoints.php @@ -7,6 +7,7 @@ use App\Gamify\Points\BestReply; use App\Models\Thread; use Illuminate\Console\Command; +use Illuminate\Support\Collection; final class UpdateUserBestRepliesPoints extends Command { @@ -18,10 +19,11 @@ public function handle(): void { $this->info('Updating users bests replies reputations...'); - $resolvedThread = Thread::resolved()->with('solutionReply')->get(); + /** @var Collection | Thread[] $resolvedThread */ + $resolvedThread = Thread::with('solutionReply')->scopes('resolved')->get(); foreach ($resolvedThread as $thread) { - givePoint(new BestReply($thread->solutionReply)); + givePoint(new BestReply($thread->solutionReply)); // @phpstan-ignore-line } $this->info('All done!'); diff --git a/app/Exceptions/UnverifiedUserException.php b/app/Exceptions/UnverifiedUserException.php new file mode 100644 index 00000000..53dc7164 --- /dev/null +++ b/app/Exceptions/UnverifiedUserException.php @@ -0,0 +1,9 @@ +subject = $subject; } - - public function payee(): User - { - // @phpstan-ignore-next-line - return $this->getSubject()->user; - } } diff --git a/app/Gamify/Points/BestReply.php b/app/Gamify/Points/BestReply.php index e7b41703..cd643c43 100644 --- a/app/Gamify/Points/BestReply.php +++ b/app/Gamify/Points/BestReply.php @@ -4,15 +4,16 @@ namespace App\Gamify\Points; +use App\Models\Reply; use QCod\Gamify\PointType; final class BestReply extends PointType { public int $points = 20; - protected string $payee = 'author'; + protected string $payee = 'user'; - public function __construct(mixed $subject) + public function __construct(Reply $subject) { $this->subject = $subject; } diff --git a/app/Gamify/Points/DiscussionCreated.php b/app/Gamify/Points/DiscussionCreated.php index 04083e9c..66e94afc 100644 --- a/app/Gamify/Points/DiscussionCreated.php +++ b/app/Gamify/Points/DiscussionCreated.php @@ -5,21 +5,16 @@ namespace App\Gamify\Points; use App\Models\Discussion; -use App\Models\User; use QCod\Gamify\PointType; final class DiscussionCreated extends PointType { public int $points = 20; + protected string $payee = 'user'; + public function __construct(Discussion $subject) { $this->subject = $subject; } - - public function payee(): User - { - // @phpstan-ignore-next-line - return $this->getSubject()->user; - } } diff --git a/app/Gamify/Points/PostCreated.php b/app/Gamify/Points/PostCreated.php index 950a7180..5ec37b35 100644 --- a/app/Gamify/Points/PostCreated.php +++ b/app/Gamify/Points/PostCreated.php @@ -5,21 +5,16 @@ namespace App\Gamify\Points; use App\Models\Article; -use App\Models\User; use QCod\Gamify\PointType; final class PostCreated extends PointType { public int $points = 50; + protected string $payee = 'user'; + public function __construct(Article $subject) { $this->subject = $subject; } - - public function payee(): User - { - // @phpstan-ignore-next-line - return $this->getSubject()->user; - } } diff --git a/app/Gamify/Points/ThreadCreated.php b/app/Gamify/Points/ThreadCreated.php index 9cbf930b..d84f0204 100644 --- a/app/Gamify/Points/ThreadCreated.php +++ b/app/Gamify/Points/ThreadCreated.php @@ -5,21 +5,16 @@ namespace App\Gamify\Points; use App\Models\Thread; -use App\Models\User; use QCod\Gamify\PointType; final class ThreadCreated extends PointType { public int $points = 55; + protected string $payee = 'user'; + public function __construct(Thread $subject) { $this->subject = $subject; } - - public function payee(): User - { - // @phpstan-ignore-next-line - return $this->getSubject()->user; - } } diff --git a/app/Http/Controllers/ThreadController.php b/app/Http/Controllers/ThreadController.php deleted file mode 100644 index 7011e5c2..00000000 --- a/app/Http/Controllers/ThreadController.php +++ /dev/null @@ -1,62 +0,0 @@ -middleware(['auth', 'verified'], ['only' => ['create', 'edit']]); - } - - public function index(Request $request): View - { - $filter = getFilter('sortBy', ['recent', 'resolved', 'unresolved']); - $threads = Thread::filter($request) - ->withviewscount() - ->orderByDesc('created_at') - ->paginate(10); - - return view('forum.index', [ - 'channel' => null, - 'threads' => $threads, - 'filter' => $filter, - ]); - } - - public function channel(Request $request, Channel $channel): View - { - $filter = getFilter('sortBy', ['recent', 'resolved', 'unresolved']); - $threads = Thread::forChannel($channel) - ->filter($request) - ->withviewscount() - ->orderByDesc('created_at') - ->paginate(10); - - return view('forum.index', compact('channel', 'threads', 'filter')); - } - - public function create(): View - { - return view('forum.create'); - } - - public function show(Thread $thread): View - { - views($thread)->record(); - - return view('forum.thread', compact('thread')); - } - - public function edit(Thread $thread): View - { - return view('forum.edit', compact('thread')); - } -} diff --git a/app/Listeners/SendNewCommentNotification.php b/app/Listeners/SendNewCommentNotification.php index d125e08b..48d6a636 100644 --- a/app/Listeners/SendNewCommentNotification.php +++ b/app/Listeners/SendNewCommentNotification.php @@ -17,9 +17,7 @@ public function handle(CommentWasAdded $event): void foreach ($discussion->subscribes as $subscription) { /** @var Subscribe $subscription */ - // @phpstan-ignore-next-line if ($this->replyAuthorDoesNotMatchSubscriber(author: $event->reply->user, subscription: $subscription)) { - // @phpstan-ignore-next-line $subscription->user->notify(new NewCommentNotification( reply: $event->reply, subscription: $subscription, diff --git a/app/Listeners/SendNewReplyNotification.php b/app/Listeners/SendNewReplyNotification.php index be55d1de..bf627b2f 100644 --- a/app/Listeners/SendNewReplyNotification.php +++ b/app/Listeners/SendNewReplyNotification.php @@ -22,9 +22,8 @@ public function handle(ReplyWasCreated $event): void foreach ($thread->subscribes as $subscription) { /** @var Subscribe $subscription */ - // @phpstan-ignore-next-line if ($this->replyAuthorDoesNotMatchSubscriber(author: $event->reply->user, subscription: $subscription)) { - $subscription->user->notify(new NewReplyNotification($event->reply, $subscription)); // @phpstan-ignore-line + $subscription->user->notify(new NewReplyNotification($event->reply, $subscription)); } } } diff --git a/app/Listeners/SendNewThreadNotification.php b/app/Listeners/SendNewThreadNotification.php index 80b02e65..ecc1b9b1 100644 --- a/app/Listeners/SendNewThreadNotification.php +++ b/app/Listeners/SendNewThreadNotification.php @@ -13,6 +13,6 @@ public function handle(ThreadWasCreated $event): void { $thread = $event->thread; - $thread->user->notify(new PostThreadToSlack($thread)); // @phpstan-ignore-line + $thread->user->notify(new PostThreadToSlack($thread)); } } diff --git a/app/Livewire/Components/ChannelsSelector.php b/app/Livewire/Components/ChannelsSelector.php new file mode 100644 index 00000000..bd161941 --- /dev/null +++ b/app/Livewire/Components/ChannelsSelector.php @@ -0,0 +1,50 @@ +slug = Channel::query()->find($channelId)?->slug; + + $this->dispatch('channelUpdated', channelId: $channelId); + } + + public function resetChannel(): void + { + $this->slug = null; + + $this->dispatch('channelUpdated', channelId: null); + } + + #[Computed] + public function currentChannel(): ?Channel + { + return $this->slug ? Channel::findBySlug($this->slug) : null; + } + + public function render(): View + { + return view('livewire.components.channels-selector', [ + 'channels' => Cache::remember( + 'channels', + now()->addMonth(), + fn () => Channel::with('items')->whereNull('parent_id')->get() + ), + ]); + } +} diff --git a/app/Livewire/Components/Forum/Reply.php b/app/Livewire/Components/Forum/Reply.php new file mode 100644 index 00000000..b63ecd57 --- /dev/null +++ b/app/Livewire/Components/Forum/Reply.php @@ -0,0 +1,88 @@ +label(__('actions.edit')) + ->color('gray') + ->authorize('update', $this->reply) + ->action( + fn () => $this->dispatch( + 'replyForm', + replyId: $this->reply->id + )->to(ReplyForm::class) + ); + } + + public function deleteAction(): Action + { + return Action::make('delete') + ->label(__('actions.delete')) + ->color('danger') + ->authorize('delete', $this->reply) + ->requiresConfirmation() + ->action(function (): void { + $this->reply->delete(); + + $this->redirectRoute('forum.show', $this->thread, navigate: true); + }); + } + + public function solutionAction(): Action + { + return Action::make('solution') + ->label(__('pages/forum.mark_answer')) + ->color('success') + ->authorize('manage', $this->thread) + ->action(function (): void { + if ($this->thread->isSolved()) { + undoPoint(new BestReply($this->thread->solutionReply)); + } + + $this->thread->markSolution($this->reply, Auth::user()); // @phpstan-ignore-line + + givePoint(new BestReply($this->reply)); + + Notification::make() + ->title(__('notifications.thread.best_reply')) + ->success() + ->duration(5000) + ->send(); + + $this->redirect(route('forum.show', $this->thread).$this->reply->getPathUrl(), navigate: true); + }); + } + + #[On('reply.save.{reply.id}')] + public function render(): View + { + return view('livewire.components.forum.reply'); + } +} diff --git a/app/Livewire/Components/Forum/ReplyForm.php b/app/Livewire/Components/Forum/ReplyForm.php new file mode 100644 index 00000000..82731778 --- /dev/null +++ b/app/Livewire/Components/Forum/ReplyForm.php @@ -0,0 +1,121 @@ +form->fill(); + } + + #[On('replyForm')] + public function open(?int $replyId = null): void + { + $this->reply = Reply::query()->find($replyId); + + $this->form->fill(['body' => $this->reply?->body ?? '']); + + $this->show = true; + } + + public function close(): void + { + $this->show = false; + $this->body = null; + $this->reply = null; + } + + public function form(Form $form): Form + { + return $form + ->schema([ + Forms\Components\MarkdownEditor::make('body') + ->hiddenLabel() + ->fileAttachmentsDisk('public') + ->autofocus() + ->toolbarButtons([ + 'attachFiles', + 'blockquote', + 'bold', + 'bulletList', + 'codeBlock', + 'link', + ]), + ]); + } + + public function save(): void + { + $this->validate(); + + if ($this->reply) { + $this->updateReply(); + } else { + $this->createReply(); + } + + $this->redirectRoute('forum.show', $this->thread, navigate: true); + } + + public function createReply(): void + { + $this->authorize('create', Reply::class); + + app(CreateReplyAction::class)->execute( + body: (string) $this->body, + model: $this->thread, + ); + + Notification::make() + ->title(__('notifications.reply.created')) + ->success() + ->duration(5000) + ->send(); + } + + public function updateReply(): void + { + $this->authorize('update', $this->reply); + + $this->reply?->update(['body' => $this->body]); + + Notification::make() + ->title(__('notifications.reply.updated')) + ->success() + ->duration(5000) + ->send(); + } + + public function render(): View + { + return view('livewire.components.forum.reply-form'); + } +} diff --git a/app/Livewire/Components/Forum/Subscribe.php b/app/Livewire/Components/Forum/Subscribe.php new file mode 100644 index 00000000..bcffadaa --- /dev/null +++ b/app/Livewire/Components/Forum/Subscribe.php @@ -0,0 +1,56 @@ +authorize('subscribe', $this->thread); + + app(SubscribeToThreadAction::class)->execute($this->thread); + + Notification::make() + ->title(__('notifications.thread.subscribe')) + ->success() + ->duration(5000) + ->send(); + + $this->dispatch('subscription.update')->self(); + } + + public function unsubscribe(): void + { + $this->authorize('unsubscribe', $this->thread); + + $this->thread->subscribes() + ->where('user_id', Auth::id()) + ->delete(); + + Notification::make() + ->title(__('notifications.thread.unsubscribe')) + ->success() + ->duration(5000) + ->send(); + + $this->dispatch('subscription.update')->self(); + } + + #[On('subscription.update')] + public function render(): View + { + return view('livewire.components.forum.subscribe'); + } +} diff --git a/app/Livewire/Components/Slideovers/ThreadForm.php b/app/Livewire/Components/Slideovers/ThreadForm.php new file mode 100644 index 00000000..8bf899b1 --- /dev/null +++ b/app/Livewire/Components/Slideovers/ThreadForm.php @@ -0,0 +1,149 @@ +thread = $threadId + ? Thread::query()->findOrFail($threadId) + : new Thread; + + $this->form->fill(array_merge( + $this->thread->toArray(), + ['user_id' => $this->thread->user_id ?? Auth::id()] + )); + } + + public static function panelMaxWidth(): string + { + return '2xl'; + } + + public function form(Form $form): Form + { + return $form + ->schema([ + Forms\Components\Hidden::make('user_id'), + Forms\Components\TextInput::make('title') + ->label(__('validation.attributes.title')) + ->helperText(__('pages/forum.max_thread_length')) + ->required() + ->live(onBlur: true) + ->afterStateUpdated(function (string $operation, $state, Forms\Set $set): void { + $set('slug', Str::slug($state)); + }) + ->maxLength(100), + Forms\Components\Hidden::make('slug'), + Forms\Components\Select::make('channels') + ->multiple() + ->relationship(titleAttribute: 'name') + ->searchable() + ->required() + ->minItems(1) + ->maxItems(3), + Forms\Components\MarkdownEditor::make('body') + ->fileAttachmentsDisk('public') + ->toolbarButtons([ + 'attachFiles', + 'blockquote', + 'bold', + 'bulletList', + 'codeBlock', + 'link', + ]) + ->label(__('validation.attributes.content')) + ->required() + ->minLength(20), + Forms\Components\Placeholder::make('') + ->content(fn () => new HtmlString(Blade::render(<<<'Blade' +

+ {{ __('pages/forum.torchlight') }} + + Torchlight + +

+ Blade))), + ]) + ->statePath('data') + ->model($this->thread); + } + + public function save(): void + { + // @phpstan-ignore-next-line + if (! Auth::user()->hasVerifiedEmail()) { + throw new UnverifiedUserException( + message: __('notifications.exceptions.unverified_user') + ); + } + + $this->validate(); + + if ($this->thread?->id) { + $this->authorize('update', $this->thread); + } + + if ($this->thread?->id) { + $this->thread->update($this->form->getState()); + $this->form->model($this->thread)->saveRelationships(); + } else { + $thread = Thread::query()->create($this->form->getState()); + $this->form->model($thread)->saveRelationships(); + + app(SubscribeToThreadAction::class)->execute($thread); + + givePoint(new ThreadCreated($thread)); + event(new ThreadWasCreated($thread)); + } + + Notification::make() + ->title( + $this->thread?->id + ? __('notifications.thread.updated') + : __('notifications.thread.created'), + ) + ->success() + ->send(); + + $this->dispatch('thread.save.{$thread->id}'); + + $this->redirect(route('forum.show', ['thread' => $thread ?? $this->thread]), navigate: true); + } + + public function render(): View + { + return view('livewire.components.slideovers.thread-form'); + } +} diff --git a/app/Livewire/Forum/CreateReply.php b/app/Livewire/Forum/CreateReply.php deleted file mode 100644 index ea56229a..00000000 --- a/app/Livewire/Forum/CreateReply.php +++ /dev/null @@ -1,66 +0,0 @@ - 'onMarkdownUpdate']; - - /** - * @var string[] - */ - protected $rules = [ - 'body' => 'required', - ]; - - public function onMarkdownUpdate(string $content): void - { - $this->body = $content; - } - - public function save(): void - { - $this->authorize(ReplyPolicy::CREATE, Reply::class); - - $this->validate(); - - $reply = new Reply(['body' => $this->body]); - $reply->authoredBy(Auth::user()); // @phpstan-ignore-line - $reply->to($this->thread); - $reply->save(); - - givePoint(new ReplyCreated($this->thread, Auth::user())); - - event(new ReplyWasCreated($reply)); - - session()->flash('status', 'Réponse ajoutée avec succès!'); - - $this->redirectRoute('forum.show', $this->thread); - } - - public function render(): View - { - return view('livewire.forum.create-reply'); - } -} diff --git a/app/Livewire/Forum/CreateThread.php b/app/Livewire/Forum/CreateThread.php deleted file mode 100644 index 84f7b3a8..00000000 --- a/app/Livewire/Forum/CreateThread.php +++ /dev/null @@ -1,80 +0,0 @@ - 'onMarkdownUpdate']; - - /** - * @var string[] - */ - protected $rules = [ - 'title' => 'required|max:75', - 'body' => 'required', - ]; - - public function onMarkdownUpdate(string $content): void - { - $this->body = $content; - } - - public function store(): void - { - $this->validate(); - $author = Auth::user(); - - $thread = Thread::create([ - 'title' => $this->title, - 'body' => $this->body, - 'slug' => $this->title, - 'user_id' => $author->id, // @phpstan-ignore-line - ]); - - $thread->syncChannels($this->associateChannels); - - // Subscribe author to the thread. - $subscription = new \App\Models\Subscribe; - $subscription->uuid = Uuid::uuid4()->toString(); - $subscription->user()->associate($author); - $subscription->subscribeAble()->associate($thread); - - $thread->subscribes()->save($subscription); - - givePoint(new ThreadCreated($thread)); - - if (app()->environment('production')) { - event(new ThreadWasCreated($thread)); - } - - $this->redirectRoute('forum.show', $thread); - } - - public function render(): View - { - return view('livewire.forum.create-thread', [ - 'channels' => Channel::all(), - ]); - } -} diff --git a/app/Livewire/Forum/EditThread.php b/app/Livewire/Forum/EditThread.php deleted file mode 100644 index 45054180..00000000 --- a/app/Livewire/Forum/EditThread.php +++ /dev/null @@ -1,69 +0,0 @@ - 'onMarkdownUpdate']; - - /** - * @var string[] - */ - protected $rules = [ - 'title' => 'required|max:75', - 'body' => 'required', - ]; - - public function mount(Thread $thread): void - { - $this->title = $thread->title; - $this->body = $thread->body; - $this->associateChannels = $this->channels_selected = old('channels', $thread->channels()->pluck('id')->toArray()); - } - - public function onMarkdownUpdate(string $content): void - { - $this->body = $content; - } - - public function store(): void - { - $this->validate(); - - $this->thread->update([ - 'title' => $this->title, - 'slug' => $this->title, - 'body' => $this->body, - ]); - - $this->thread->syncChannels($this->associateChannels); - - $this->redirectRoute('forum.show', $this->thread); - } - - public function render(): View - { - return view('livewire.forum.edit-thread', [ - 'channels' => Channel::all(), - ]); - } -} diff --git a/app/Livewire/Forum/Reply.php b/app/Livewire/Forum/Reply.php deleted file mode 100644 index 6f5fa5c1..00000000 --- a/app/Livewire/Forum/Reply.php +++ /dev/null @@ -1,121 +0,0 @@ - '$refresh', - 'editor:update' => 'onEditorUpdate', - ]; - - /** - * @var string[] - */ - protected $rules = [ - 'body' => 'required', - ]; - - public function mount(ReplyModel $reply, Thread $thread): void - { - $this->thread = $thread; - $this->reply = $reply; - $this->body = $reply->body; - } - - public function onEditorUpdate(string $body): void - { - $this->body = $body; - } - - public function edit(): void - { - $this->authorize(ReplyPolicy::UPDATE, $this->reply); - - $this->validate(); - - $this->reply->update(['body' => $this->body]); - - Notification::make() - ->title(__('Réponse modifiée')) - ->body(__('Vous avez modifié cette solution avec succès.')) - ->success() - ->duration(5000) - ->send(); - - $this->isUpdating = false; - - $this->dispatch('refresh')->self(); - } - - public function UnMarkAsSolution(): void - { - $this->authorize(ThreadPolicy::UPDATE, $this->thread); - - undoPoint(new BestReply($this->reply)); - - $this->thread->unmarkSolution(); - - $this->dispatch('refresh')->self(); - - Notification::make() - ->title(__('Réponse rejetée')) - ->body(__('Vous avez retiré cette réponse comme solution pour ce sujet.')) - ->success() - ->duration(5000) - ->send(); - } - - public function markAsSolution(): void - { - $this->authorize(ThreadPolicy::UPDATE, $this->thread); - - if ($this->thread->isSolved()) { - undoPoint(new BestReply($this->thread->solutionReply)); - } - - $this->thread->markSolution($this->reply, Auth::user()); // @phpstan-ignore-line - - givePoint(new BestReply($this->reply)); - - $this->dispatch('refresh')->self(); - - Notification::make() - ->title(__('Réponse acceptée')) - ->body(__('Vous avez accepté cette solution pour ce sujet.')) - ->success() - ->duration(5000) - ->send(); - } - - public function render(): View - { - return view('livewire.forum.reply'); - } -} diff --git a/app/Livewire/Forum/Subscribe.php b/app/Livewire/Forum/Subscribe.php deleted file mode 100644 index 8c1f3c2d..00000000 --- a/app/Livewire/Forum/Subscribe.php +++ /dev/null @@ -1,69 +0,0 @@ - '$refresh']; - - public function subscribe(): void - { - $this->authorize(ThreadPolicy::SUBSCRIBE, $this->thread); - - $subscribe = new SubscribeModel; - $subscribe->uuid = Uuid::uuid4()->toString(); - $subscribe->user()->associate(Auth::user()); - $this->thread->subscribes()->save($subscribe); - - Notification::make() - ->title(__('Abonnement')) - ->body(__('Vous êtes maintenant abonné à ce sujet.')) - ->success() - ->duration(5000) - ->send(); - - $this->dispatch('refresh')->self(); - } - - public function unsubscribe(): void - { - $this->authorize(ThreadPolicy::UNSUBSCRIBE, $this->thread); - - $this->thread->subscribes() - ->where('user_id', Auth::id()) - ->delete(); - - Notification::make() - ->title(__('Désabonnement')) - ->body(__('Vous vous êtes désabonné de ce sujet.')) - ->success() - ->duration(5000) - ->send(); - - $this->dispatch('refresh')->self(); - } - - public function render(): View - { - return view('livewire.forum.subscribe'); - } -} diff --git a/app/Livewire/Modals/DeleteReply.php b/app/Livewire/Modals/DeleteReply.php index a7565d44..b7ed9568 100644 --- a/app/Livewire/Modals/DeleteReply.php +++ b/app/Livewire/Modals/DeleteReply.php @@ -5,7 +5,6 @@ namespace App\Livewire\Modals; use App\Models\Reply; -use App\Policies\ReplyPolicy; use Illuminate\Contracts\View\View; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use LivewireUI\Modal\ModalComponent; @@ -20,15 +19,15 @@ final class DeleteReply extends ModalComponent public function mount(int $id, string $slug): void { - $this->reply = Reply::find($id); + $this->reply = Reply::query()->find($id); $this->slug = $slug; } public function delete(): void { - $this->authorize(ReplyPolicy::DELETE, $this->reply); + $this->authorize('delete', $this->reply); - $this->reply->delete(); // @phpstan-ignore-line + $this->reply?->delete(); session()->flash('status', __('La réponse a ete supprimée avec succès.')); diff --git a/app/Livewire/Modals/DeleteThread.php b/app/Livewire/Modals/DeleteThread.php index cb71a6db..38b2e390 100644 --- a/app/Livewire/Modals/DeleteThread.php +++ b/app/Livewire/Modals/DeleteThread.php @@ -5,7 +5,6 @@ namespace App\Livewire\Modals; use App\Models\Thread; -use App\Policies\ThreadPolicy; use Illuminate\Contracts\View\View; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use LivewireUI\Modal\ModalComponent; @@ -18,7 +17,7 @@ final class DeleteThread extends ModalComponent public function mount(int $id): void { - $this->thread = Thread::find($id); + $this->thread = Thread::query()->find($id); } public static function modalMaxWidth(): string @@ -28,9 +27,9 @@ public static function modalMaxWidth(): string public function delete(): void { - $this->authorize(ThreadPolicy::DELETE, $this->thread); + $this->authorize('delete', $this->thread); - $this->thread->delete(); // @phpstan-ignore-line + $this->thread?->delete(); session()->flash('status', __('Le sujet a été supprimé avec toutes ses réponses.')); diff --git a/app/Livewire/Pages/Forum/Channels.php b/app/Livewire/Pages/Forum/Channels.php new file mode 100644 index 00000000..f9e98ed2 --- /dev/null +++ b/app/Livewire/Pages/Forum/Channels.php @@ -0,0 +1,31 @@ + Channel::query() + ->withCount('threads') + ->whereNull('parent_id') + ->get() + ->sortByDesc('threads_count'), + 'childChannels' => Channel::query() + ->withCount('threads') + ->whereNotNull('parent_id') + ->get() + ->sortByDesc('threads_count'), + ]) + ->title(__('pages/forum.navigation.channels')); + } +} diff --git a/app/Livewire/Pages/Forum/DetailThread.php b/app/Livewire/Pages/Forum/DetailThread.php new file mode 100644 index 00000000..cd0b2df5 --- /dev/null +++ b/app/Livewire/Pages/Forum/DetailThread.php @@ -0,0 +1,68 @@ +cooldown(now()->addHour())->record(); + + $this->thread = $thread->loadCount('views'); + } + + public function editAction(): Action + { + return Action::make('edit') + ->label(__('actions.edit')) + ->color('gray') + ->authorize('update', $this->thread) + ->action( + fn () => $this->dispatch( + 'openPanel', + component: 'components.slideovers.thread-form', + arguments: ['threadId' => $this->thread->id] + ) + ); + } + + public function deleteAction(): Action + { + return Action::make('delete') + ->label(__('actions.delete')) + ->color('danger') + ->authorize('delete', $this->thread) + ->requiresConfirmation() + ->action(function (): void { + $this->thread->delete(); + + $this->redirectRoute('forum.index', navigate: true); + }); + } + + #[On('thread.save.{thread.id}')] + public function render(): View + { + return view('livewire.pages.forum.detail-thread') + ->title($this->thread->subject()); + } +} diff --git a/app/Livewire/Pages/Forum/Index.php b/app/Livewire/Pages/Forum/Index.php new file mode 100644 index 00000000..1ccdcd24 --- /dev/null +++ b/app/Livewire/Pages/Forum/Index.php @@ -0,0 +1,140 @@ +channel) { + $this->currentChannel = Channel::findBySlug($this->channel); + } + } + + #[On('channelUpdated')] + public function reloadThreads(?int $channelId): void + { + if ($channelId) { + $this->currentChannel = Channel::query()->find($channelId); + } else { + $this->currentChannel = null; + } + + $this->resetPage(); + $this->dispatch('render'); + } + + protected function applySearch(Builder $query): Builder + { + if ($this->search) { + return $query->where(function (Builder $query): void { + $query->where('title', 'like', '%'.$this->search.'%'); + }); + } + + return $query; + } + + protected function applySolved(Builder $query): Builder + { + if ($this->solved) { + return match ($this->solved) { + 'no' => $query->scopes('unresolved'), + 'yes' => $query->scopes('resolved'), + }; + } + + return $query; + } + + protected function applyAuthor(Builder $query): Builder + { + if (Auth::check() && $this->user) { + return $query->whereHas('user', function (Builder $query): void { + $query->where('user_id', Auth::id()); + }); + } + + return $query; + } + + protected function applyChannel(Builder $query): Builder + { + if ($this->currentChannel?->id) { + return $query->scopes(['channel' => $this->currentChannel]); + } + + return $query; + } + + protected function applySubscribe(Builder $query): Builder + { + return $query; + } + + protected function applyUnAnswer(Builder $query): Builder + { + return $query; + } + + public function render(): View + { + $query = Thread::with('channels') + ->orderByDesc('created_at'); + + $query = $this->applyChannel($query); + $query = $this->applySearch($query); + $query = $this->applySolved($query); + $query = $this->applyAuthor($query); + $query = $this->applySubscribe($query); + $query = $this->applyUnAnswer($query); + + $threads = $query + ->scopes('withViewsCount') + ->paginate($this->perPage); + + return view('livewire.pages.forum.index', [ + 'threads' => $threads, + ]) + ->title(__('pages/forum.channel_title', ['channel' => isset($this->currentChannel) ? ' ~ '.$this->currentChannel->name : ''])); + } +} diff --git a/app/Livewire/Reactions.php b/app/Livewire/Reactions.php index b787e164..0dd238a0 100644 --- a/app/Livewire/Reactions.php +++ b/app/Livewire/Reactions.php @@ -19,7 +19,7 @@ final class Reactions extends Component public bool $withBackground = true; - public string $direction = 'right'; + public string $direction = 'horizontal'; public function userReacted(string $reaction): void { @@ -33,6 +33,7 @@ public function userReacted(string $reaction): void } else { /** @var Reaction $react */ $react = Reaction::query()->where('name', $reaction)->first(); + Auth::user()->reactTo($this->model, $react); // @phpstan-ignore-line } } diff --git a/app/Livewire/Traits/WithAuthenticatedUser.php b/app/Livewire/Traits/WithAuthenticatedUser.php new file mode 100644 index 00000000..2400d6cb --- /dev/null +++ b/app/Livewire/Traits/WithAuthenticatedUser.php @@ -0,0 +1,17 @@ +redirect(route('login'), navigate: true); + } + } +} diff --git a/app/Mail/NewReplyEmail.php b/app/Mail/NewReplyEmail.php index a71402f6..6f8cde7e 100644 --- a/app/Mail/NewReplyEmail.php +++ b/app/Mail/NewReplyEmail.php @@ -21,6 +21,7 @@ public function __construct( public function build(): self { + // @phpstan-ignore-next-line return $this->subject("Re: {$this->reply->replyAble->subject()}") ->markdown('emails.new_reply'); } diff --git a/app/Models/Activity.php b/app/Models/Activity.php index e8add905..a3475784 100644 --- a/app/Models/Activity.php +++ b/app/Models/Activity.php @@ -4,12 +4,24 @@ namespace App\Models; +use Carbon\Carbon; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Support\Collection; +/** + * @property-read int $id + * @property int $user_id + * @property array | null $data + * @property string $subject_type + * @property int $subject_id + * @property string $type + * @property User $user + * @property Carbon $created_at + * @property Carbon $updated_at + */ final class Activity extends Model { use HasFactory; @@ -36,18 +48,14 @@ public function user(): BelongsTo return $this->belongsTo(User::class); } - /** - * @return array>> - */ - public static function feed(User $user, int $take = 50): array + public static function feed(User $user, int $take = 50): Collection { - // @phpstan-ignore-next-line return self::where('user_id', $user->id) ->latest() ->with('subject') ->take($take) ->get() - ->groupBy(fn (Activity $activity) => $activity->created_at->format('Y-m-d')); // @phpstan-ignore-line + ->groupBy(fn (Activity $activity) => $activity->created_at->format('Y-m-d')); } public static function latestFeed(User $user, int $take = 10): Collection diff --git a/app/Models/Article.php b/app/Models/Article.php index 1f5e9241..118d270e 100644 --- a/app/Models/Article.php +++ b/app/Models/Article.php @@ -20,6 +20,14 @@ use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; +/** + * @property-read int $id + * @property string $title + * @property string $slug + * @property string $body + * @property int $user_id + * @property User $user + */ final class Article extends Model implements HasMedia, ReactableInterface, Viewable { use HasAuthor; @@ -36,7 +44,6 @@ final class Article extends Model implements HasMedia, ReactableInterface, Viewa 'body', 'slug', 'canonical_url', - 'cover_image', 'show_toc', 'is_pinned', 'user_id', @@ -428,7 +435,7 @@ public static function nexForSharingToTelegram(): ?self public function markAsPublish(): void { - $this->update(['tweet_id' => $this->user->id]); // @phpstan-ignore-line + $this->update(['tweet_id' => $this->user->id]); } public function delete(): ?bool diff --git a/app/Models/Channel.php b/app/Models/Channel.php index 9a0fd3e5..a8d7853a 100644 --- a/app/Models/Channel.php +++ b/app/Models/Channel.php @@ -11,22 +11,31 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; +use Spatie\Translatable\HasTranslations; +/** + * @property-read int $id + * @property string $name + * @property string $slug + * @property array $description + * @property string $color + * @property int | null $parent_id + */ final class Channel extends Model { use HasFactory; use HasSlug; + use HasTranslations; protected $fillable = [ 'name', 'slug', + 'description', 'parent_id', 'color', ]; - protected $withCount = [ - 'threads', - ]; + public array $translatable = ['description']; protected static function boot(): void { diff --git a/app/Models/Discussion.php b/app/Models/Discussion.php index bf109a53..47243227 100644 --- a/app/Models/Discussion.php +++ b/app/Models/Discussion.php @@ -14,6 +14,7 @@ use App\Traits\HasTags; use App\Traits\Reactable; use App\Traits\RecordsActivity; +use Carbon\Carbon; use CyrildeWit\EloquentViewable\Contracts\Viewable; use CyrildeWit\EloquentViewable\InteractsWithViews; use Illuminate\Database\Eloquent\Builder; @@ -21,6 +22,18 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; +/** + * @property-read int $id + * @property string $title + * @property string $slug + * @property string $body + * @property bool $locked + * @property bool $is_pinned + * @property int $user_id + * @property Carbon $created_at + * @property Carbon $updated_at + * @property User $user + */ final class Discussion extends Model implements ReactableInterface, ReplyInterface, SubscribeInterface, Viewable { use HasAuthor; diff --git a/app/Models/Reply.php b/app/Models/Reply.php index b91ee99c..2048b7f9 100644 --- a/app/Models/Reply.php +++ b/app/Models/Reply.php @@ -19,6 +19,16 @@ use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Support\Str; +/** + * @property-read int $id + * @property string $body + * @property int $user_id + * @property Carbon $created_at + * @property Carbon $updated_at + * @property User $user + * @property int $replyable_id + * @property string $replyable_type + */ final class Reply extends Model implements ReactableInterface, ReplyInterface { use HasAuthor; @@ -53,7 +63,7 @@ public function solutionTo(): HasOne public function wasJustPublished(): bool { - return $this->created_at->gt(Carbon::now()->subMinute()); // @phpstan-ignore-line + return $this->created_at->gt(Carbon::now()->subMinute()); } public function excerpt(int $limit = 100): string @@ -68,14 +78,16 @@ public function mentionedUsers(): array return $matches[1]; } - public function to(ReplyInterface $replyAble): void + public function to(ReplyInterface $replyable): void { - $this->replyAble()->associate($replyAble); + $this->replyAble()->associate($replyable); } public function allChildReplies(): MorphMany { - return $this->replies()->with('allChildReplies')->where('replyable_type', 'reply'); + return $this->replies() + ->with('allChildReplies') + ->where('replyable_type', 'reply'); } /** diff --git a/app/Models/Subscribe.php b/app/Models/Subscribe.php index c94e1317..9b956467 100644 --- a/app/Models/Subscribe.php +++ b/app/Models/Subscribe.php @@ -10,6 +10,13 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\MorphTo; +/** + * @property string $uuid + * @property int $user_id + * @property int $subscribeable_id + * @property string $subscribeable_type + * @property User $user + */ final class Subscribe extends Model { use HasFactory; diff --git a/app/Models/Thread.php b/app/Models/Thread.php index a49b0924..91db05a1 100644 --- a/app/Models/Thread.php +++ b/app/Models/Thread.php @@ -32,6 +32,23 @@ use Spatie\Feed\Feedable; use Spatie\Feed\FeedItem; +/** + * @property-read int $id + * @property string $title + * @property string $slug + * @property string $body + * @property int $user_id + * @property int $solution_reply_id + * @property bool $locked + * @property Carbon | null $last_posted_at + * @property Carbon $created_at + * @property Carbon $updated_at + * @property int | null $resolved_by + * @property User | null $resolvedBy + * @property User $user + * @property Reply | null $solutionReply + * @property \Illuminate\Database\Eloquent\Collection | Channel[] $channels + */ final class Thread extends Model implements Feedable, ReactableInterface, ReplyInterface, SubscribeInterface, Viewable { use HasAuthor; @@ -58,10 +75,6 @@ final class Thread extends Model implements Feedable, ReactableInterface, ReplyI 'last_posted_at' => 'datetime', ]; - protected $with = [ - 'channels', - ]; - protected bool $removeViewsOnDelete = true; public function getRouteKeyName(): string @@ -81,10 +94,10 @@ public function replyAbleSubject(): string public function getPathUrl(): string { - return "/forum/{$this->slug()}"; + return route('forum.show', $this->slug()); } - public function excerpt(int $limit = 100): string + public function excerpt(int $limit = 200): string { return Str::limit(strip_tags((string) md_to_html($this->body)), $limit); } @@ -147,7 +160,7 @@ public function unmarkSolution(): void $this->save(); } - public function scopeForChannel(Builder $query, Channel $channel): Builder + public function scopeChannel(Builder $query, Channel $channel): Builder { return $query->whereHas('channels', function ($query) use ($channel): void { if ($channel->hasItems()) { @@ -216,7 +229,7 @@ public function toFeedItem(): FeedItem ->summary($this->body) ->updated($updatedAt) ->link(route('forum.show', $this->slug)) - ->authorName($this->user->name); // @phpstan-ignore-line + ->authorName($this->user->name); } /** diff --git a/app/Models/User.php b/app/Models/User.php index 73019b48..159864eb 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -32,6 +32,14 @@ use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\Permission\Traits\HasRoles; +/** + * @property-read int $id + * @property string $name + * @property string $email + * @property string $username + * @property string $bio + * @property Collection | Activity[] $activities + */ final class User extends Authenticatable implements FeaturableInterface, FilamentUser, HasAvatar, HasMedia, HasName, MustVerifyEmail { use Featurable; diff --git a/app/Policies/NotificationPolicy.php b/app/Policies/NotificationPolicy.php index 1ebaa09a..31c1a071 100644 --- a/app/Policies/NotificationPolicy.php +++ b/app/Policies/NotificationPolicy.php @@ -13,6 +13,6 @@ final class NotificationPolicy public function markAsRead(User $user, DatabaseNotification $notification): bool { - return $notification->notifiable->is($user); + return $notification->notifiable->is($user); // @phpstan-ignore-line } } diff --git a/app/Policies/ReplyPolicy.php b/app/Policies/ReplyPolicy.php index 5b4521c7..b7d02fba 100644 --- a/app/Policies/ReplyPolicy.php +++ b/app/Policies/ReplyPolicy.php @@ -9,11 +9,10 @@ final class ReplyPolicy { - public const CREATE = 'create'; - - public const UPDATE = 'update'; - - public const DELETE = 'delete'; + public function manage(User $user, Reply $reply): bool + { + return $reply->isAuthoredBy($user) || $user->isModerator() || $user->isAdmin(); + } public function create(User $user): bool { @@ -22,7 +21,7 @@ public function create(User $user): bool public function update(User $user, Reply $reply): bool { - return $reply->isAuthoredBy($user) || $user->isModerator() || $user->isAdmin(); + return $reply->isAuthoredBy($user) && $user->hasVerifiedEmail(); } public function delete(User $user, Reply $reply): bool diff --git a/app/Policies/ThreadPolicy.php b/app/Policies/ThreadPolicy.php index 1e8d8894..2e104ca9 100644 --- a/app/Policies/ThreadPolicy.php +++ b/app/Policies/ThreadPolicy.php @@ -9,17 +9,14 @@ final class ThreadPolicy { - public const UPDATE = 'update'; - - public const DELETE = 'delete'; - - public const SUBSCRIBE = 'subscribe'; - - public const UNSUBSCRIBE = 'unsubscribe'; + public function manage(User $user, Thread $thread): bool + { + return $thread->isAuthoredBy($user) || $user->isModerator() || $user->isAdmin(); + } public function update(User $user, Thread $thread): bool { - return $thread->isAuthoredBy($user) || $user->isModerator() || $user->isAdmin(); + return $thread->isAuthoredBy($user); } public function delete(User $user, Thread $thread): bool diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 3b23f193..dd644e31 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -15,7 +15,6 @@ use App\Policies\ThreadPolicy; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Illuminate\Notifications\DatabaseNotification as Notification; -use Illuminate\Support\Facades\Gate; final class AuthServiceProvider extends ServiceProvider { @@ -35,7 +34,5 @@ final class AuthServiceProvider extends ServiceProvider public function boot(): void { $this->registerPolicies(); - - Gate::before(fn ($user) => $user->hasRole('admin') ? true : null); } } diff --git a/app/Spotlight/Article.php b/app/Spotlight/Article.php index ffa0980e..e679c217 100644 --- a/app/Spotlight/Article.php +++ b/app/Spotlight/Article.php @@ -31,14 +31,14 @@ public function dependencies(): ?SpotlightCommandDependencies public function searchArticle(string $query): Collection { - return ArticleModel::published() - ->with('user') + return ArticleModel::with('user') + ->scopes('published') ->where('title', 'like', "%{$query}%") ->get() ->map(fn (ArticleModel $article) => new SpotlightSearchResult( $article->slug(), $article->title, - sprintf('par @%s', $article->user?->username) + sprintf('par @%s', $article->user->username) )); } diff --git a/app/Spotlight/Discussion.php b/app/Spotlight/Discussion.php index 04879e59..3e8485de 100644 --- a/app/Spotlight/Discussion.php +++ b/app/Spotlight/Discussion.php @@ -37,7 +37,7 @@ public function searchDiscussion(string $query): Collection ->map(fn (DiscussionModel $discussion) => new SpotlightSearchResult( $discussion->slug(), $discussion->title, - sprintf('par @%s', $discussion->user?->username) + sprintf('par @%s', $discussion->user->username) )); } diff --git a/app/Spotlight/Sujet.php b/app/Spotlight/Sujet.php index 6f33416f..2cf9aafb 100644 --- a/app/Spotlight/Sujet.php +++ b/app/Spotlight/Sujet.php @@ -42,7 +42,7 @@ public function searchThread(string $query): Collection ->map(fn (Thread $thread) => new SpotlightSearchResult( $thread->slug(), $thread->title, - sprintf('par @%s', $thread->user?->username) + sprintf('par @%s', $thread->user->username) )); } diff --git a/app/Traits/HasAuthor.php b/app/Traits/HasAuthor.php index adda508f..a2e5ceb2 100644 --- a/app/Traits/HasAuthor.php +++ b/app/Traits/HasAuthor.php @@ -21,13 +21,8 @@ public function user(): BelongsTo return $this->belongsTo(User::class); } - public function getUser(): ?User + public function isAuthoredBy(User $user): bool { - return $this->user; - } - - public function isAuthoredBy(User $user): ?bool - { - return $this->user?->is($user); + return $this->user->is($user); } } diff --git a/app/Traits/HasReplies.php b/app/Traits/HasReplies.php index 3ee7befd..b0ae2289 100644 --- a/app/Traits/HasReplies.php +++ b/app/Traits/HasReplies.php @@ -55,11 +55,9 @@ public function isConversationOld(): bool if ($reply = $this->replies()->latest()->first()) { /** @var $reply Reply */ - // @phpstan-ignore-next-line return $reply->created_at->lt($sixMonthsAgo); } - // @phpstan-ignore-next-line return $this->created_at->lt($sixMonthsAgo); } } diff --git a/app/Traits/RecordsActivity.php b/app/Traits/RecordsActivity.php index 347de8a5..7ccd0257 100644 --- a/app/Traits/RecordsActivity.php +++ b/app/Traits/RecordsActivity.php @@ -6,13 +6,14 @@ use App\Models\Activity; use Illuminate\Database\Eloquent\Relations\MorphMany; +use Illuminate\Support\Facades\Auth; use ReflectionClass; trait RecordsActivity { protected static function bootRecordsActivity(): void { - if (auth()->guest()) { + if (Auth::guest()) { return; } @@ -23,7 +24,7 @@ protected static function bootRecordsActivity(): void } static::deleting(function ($model): void { - $model->activity()->delete(); + $model->activities()->delete(); }); } @@ -40,14 +41,14 @@ protected static function getActivitiesToRecord(): array */ protected function recordActivity(string $event, bool $useDefaultEvent = true, array $data = []): void { - $this->activity()->create([ - 'user_id' => auth()->id(), + $this->activities()->create([ + 'user_id' => Auth::id(), 'type' => $useDefaultEvent ? $this->getActivityType($event) : $event, 'data' => $data, ]); } - public function activity(): MorphMany + public function activities(): MorphMany { return $this->morphMany(Activity::class, 'subject'); } diff --git a/app/View/Components/ForumLayout.php b/app/View/Components/ForumLayout.php new file mode 100644 index 00000000..52777d90 --- /dev/null +++ b/app/View/Components/ForumLayout.php @@ -0,0 +1,16 @@ +slug()) : - route('discussions.show', $replyAble->slug()); + $routeName = $replyAble instanceof \App\Models\Thread ? 'forum.show' : 'discussions.show'; + + return route($routeName, $replyAble->slug()); } } diff --git a/composer.json b/composer.json index b406634a..e32f847c 100644 --- a/composer.json +++ b/composer.json @@ -11,14 +11,13 @@ "archtechx/laravel-seo": "^0.9", "arrilot/laravel-widgets": "^3.13.2", "blade-ui-kit/blade-heroicons": "^2.0", - "blade-ui-kit/blade-ui-kit": "^0.4", "cyrildewit/eloquent-viewable": "^7.0", "doctrine/dbal": "^3.6.4", "filament/filament": "^3.0", "filament/notifications": "^3.0", "francescomalatesta/laravel-feature": "dev-l10-compatibility", "gehrisandro/tailwind-merge-laravel": "^1.1", - "graham-campbell/markdown": "^15.0", + "graham-campbell/markdown": "^15.2", "guzzlehttp/guzzle": "^7.7.0", "jenssegers/agent": "^2.6.4", "laravel-notification-channels/telegram": "^4.0", @@ -29,10 +28,11 @@ "laravel/slack-notification-channel": "^2.5", "laravel/socialite": "^5.6.3", "laravel/tinker": "^2.8.1", - "laravelcm/laravel-subscriptions": "^1.0", + "laravelcm/laravel-subscriptions": "^1.3", + "laravelcm/livewire-slide-overs": "^1.0", "livewire/livewire": "^3.0", "mckenziearts/blade-untitledui-icons": "^1.3", - "notchpay/notchpay-php": "^1.3", + "notchpay/notchpay-php": "^1.6", "qcod/laravel-gamify": "1.0.7", "ramsey/uuid": "^4.7.4", "sentry/sentry-laravel": "^3.7", @@ -43,6 +43,7 @@ "spatie/laravel-medialibrary": "^10.10.0", "spatie/laravel-permission": "^5.10.1", "spatie/laravel-sitemap": "^6.3.1", + "spatie/laravel-translatable": "^6.8", "stevebauman/location": "^6.6.2", "symfony/http-client": "^6.3.1", "symfony/mailgun-mailer": "^6.3", diff --git a/composer.lock b/composer.lock index 2c9357c7..de7211f1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "42f558fa0f8ae1e1ed438d0842232bcf", + "content-hash": "c894b3d2be13a5dd5f1e496299b2d0f0", "packages": [ { "name": "abraham/twitteroauth", @@ -1244,16 +1244,16 @@ }, { "name": "blade-ui-kit/blade-icons", - "version": "1.7.1", + "version": "1.7.2", "source": { "type": "git", "url": "https://github.com/blade-ui-kit/blade-icons.git", - "reference": "8f787baf09d88cdfd6ec4dbaba11ebfa885f0595" + "reference": "75a54a3f5a2810fcf6574ab23e91b6cc229a1b53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/blade-ui-kit/blade-icons/zipball/8f787baf09d88cdfd6ec4dbaba11ebfa885f0595", - "reference": "8f787baf09d88cdfd6ec4dbaba11ebfa885f0595", + "url": "https://api.github.com/repos/blade-ui-kit/blade-icons/zipball/75a54a3f5a2810fcf6574ab23e91b6cc229a1b53", + "reference": "75a54a3f5a2810fcf6574ab23e91b6cc229a1b53", "shasum": "" }, "require": { @@ -1321,87 +1321,7 @@ "type": "paypal" } ], - "time": "2024-08-14T14:25:11+00:00" - }, - { - "name": "blade-ui-kit/blade-ui-kit", - "version": "0.4.0", - "source": { - "type": "git", - "url": "https://github.com/blade-ui-kit/blade-ui-kit.git", - "reference": "bfb5beb26e1347e0f2be6f245a22388410fe53ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/blade-ui-kit/blade-ui-kit/zipball/bfb5beb26e1347e0f2be6f245a22388410fe53ce", - "reference": "bfb5beb26e1347e0f2be6f245a22388410fe53ce", - "shasum": "" - }, - "require": { - "ext-json": "*", - "illuminate/filesystem": "^9.0|^10.0", - "illuminate/support": "^9.0|^10.0", - "illuminate/view": "^9.0|^10.0", - "nesbot/carbon": "^2.38", - "php": "^8.0" - }, - "require-dev": { - "gajus/dindent": "^2.0", - "guzzlehttp/guzzle": "^7.4", - "league/commonmark": "^1.4|^2.0", - "lorisleiva/cron-translator": "^0.1.1", - "orchestra/testbench": "^7.1|^8.0", - "phpunit/phpunit": "^9.0" - }, - "suggest": { - "league/commonmark": "Required to use the markdown component (^1.4).", - "lorisleiva/cron-translator": "Required to use the cron component (^0.1.1)." - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "BladeUIKit\\BladeUIKitServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "BladeUIKit\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Dries Vints", - "homepage": "https://driesvints.com" - } - ], - "description": "A set of renderless components to utilise in your Laravel Blade views.", - "homepage": "https://github.com/blade-ui-kit/blade-ui-kit", - "keywords": [ - "blade", - "laravel", - "ui" - ], - "support": { - "issues": "https://github.com/blade-ui-kit/blade-ui-kit/issues", - "source": "https://github.com/blade-ui-kit/blade-ui-kit" - }, - "funding": [ - { - "url": "https://github.com/caneco", - "type": "github" - }, - { - "url": "https://github.com/driesvints", - "type": "github" - } - ], - "time": "2023-02-13T16:56:05+00:00" + "time": "2024-10-17T17:38:00+00:00" }, { "name": "brick/math", @@ -2672,16 +2592,16 @@ }, { "name": "filament/actions", - "version": "v3.2.117", + "version": "v3.2.122", "source": { "type": "git", "url": "https://github.com/filamentphp/actions.git", - "reference": "886108b59ce99edc26f5bc1231134a95ec58718a" + "reference": "3badf1a1589bf70fdc625130f6dfc1ca2146a32f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/actions/zipball/886108b59ce99edc26f5bc1231134a95ec58718a", - "reference": "886108b59ce99edc26f5bc1231134a95ec58718a", + "url": "https://api.github.com/repos/filamentphp/actions/zipball/3badf1a1589bf70fdc625130f6dfc1ca2146a32f", + "reference": "3badf1a1589bf70fdc625130f6dfc1ca2146a32f", "shasum": "" }, "require": { @@ -2721,20 +2641,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-10-09T11:19:22+00:00" + "time": "2024-10-31T13:38:12+00:00" }, { "name": "filament/filament", - "version": "v3.2.117", + "version": "v3.2.122", "source": { "type": "git", "url": "https://github.com/filamentphp/panels.git", - "reference": "84f839b4b42549c0d4bd231648da17561ada70c2" + "reference": "076f5367a3dfe5f6864d117f6826ca7821586931" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/panels/zipball/84f839b4b42549c0d4bd231648da17561ada70c2", - "reference": "84f839b4b42549c0d4bd231648da17561ada70c2", + "url": "https://api.github.com/repos/filamentphp/panels/zipball/076f5367a3dfe5f6864d117f6826ca7821586931", + "reference": "076f5367a3dfe5f6864d117f6826ca7821586931", "shasum": "" }, "require": { @@ -2786,20 +2706,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-10-08T14:24:12+00:00" + "time": "2024-10-31T13:38:14+00:00" }, { "name": "filament/forms", - "version": "v3.2.117", + "version": "v3.2.122", "source": { "type": "git", "url": "https://github.com/filamentphp/forms.git", - "reference": "896c868cca474b2e925a3e6162b7c76d8ff3e5fc" + "reference": "c863b5765b871485a2c624c43a0eb6e957a04b54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/forms/zipball/896c868cca474b2e925a3e6162b7c76d8ff3e5fc", - "reference": "896c868cca474b2e925a3e6162b7c76d8ff3e5fc", + "url": "https://api.github.com/repos/filamentphp/forms/zipball/c863b5765b871485a2c624c43a0eb6e957a04b54", + "reference": "c863b5765b871485a2c624c43a0eb6e957a04b54", "shasum": "" }, "require": { @@ -2842,20 +2762,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-10-09T11:19:26+00:00" + "time": "2024-10-31T13:38:16+00:00" }, { "name": "filament/infolists", - "version": "v3.2.117", + "version": "v3.2.122", "source": { "type": "git", "url": "https://github.com/filamentphp/infolists.git", - "reference": "fc5f01c094fe25ef906f3e1b88d3d8883a73d6be" + "reference": "2d934d4d7f420fc1165ced33df0959a656163a0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/infolists/zipball/fc5f01c094fe25ef906f3e1b88d3d8883a73d6be", - "reference": "fc5f01c094fe25ef906f3e1b88d3d8883a73d6be", + "url": "https://api.github.com/repos/filamentphp/infolists/zipball/2d934d4d7f420fc1165ced33df0959a656163a0c", + "reference": "2d934d4d7f420fc1165ced33df0959a656163a0c", "shasum": "" }, "require": { @@ -2893,20 +2813,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-10-08T14:24:09+00:00" + "time": "2024-10-24T13:47:00+00:00" }, { "name": "filament/notifications", - "version": "v3.2.117", + "version": "v3.2.122", "source": { "type": "git", "url": "https://github.com/filamentphp/notifications.git", - "reference": "a5f684b690354630210fc9a90bd06da9b1f6ae82" + "reference": "c19df07c801c5550de0d30957c5a316f53019533" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/notifications/zipball/a5f684b690354630210fc9a90bd06da9b1f6ae82", - "reference": "a5f684b690354630210fc9a90bd06da9b1f6ae82", + "url": "https://api.github.com/repos/filamentphp/notifications/zipball/c19df07c801c5550de0d30957c5a316f53019533", + "reference": "c19df07c801c5550de0d30957c5a316f53019533", "shasum": "" }, "require": { @@ -2945,20 +2865,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-10-08T14:24:11+00:00" + "time": "2024-10-23T07:36:14+00:00" }, { "name": "filament/support", - "version": "v3.2.117", + "version": "v3.2.122", "source": { "type": "git", "url": "https://github.com/filamentphp/support.git", - "reference": "31fcff80b873b4decdba10d5f7010310e12c8e94" + "reference": "e7174cee7e1d08205f7120d0dcc0d00d9bdd4d32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/support/zipball/31fcff80b873b4decdba10d5f7010310e12c8e94", - "reference": "31fcff80b873b4decdba10d5f7010310e12c8e94", + "url": "https://api.github.com/repos/filamentphp/support/zipball/e7174cee7e1d08205f7120d0dcc0d00d9bdd4d32", + "reference": "e7174cee7e1d08205f7120d0dcc0d00d9bdd4d32", "shasum": "" }, "require": { @@ -2969,7 +2889,7 @@ "illuminate/support": "^10.45|^11.0", "illuminate/view": "^10.45|^11.0", "kirschbaum-development/eloquent-power-joins": "^3.0|^4.0", - "livewire/livewire": "^3.4.10 <= 3.5.6", + "livewire/livewire": "^3.4.10", "php": "^8.1", "ryangjchandler/blade-capture-directive": "^0.2|^0.3|^1.0", "spatie/color": "^1.5", @@ -3004,20 +2924,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-10-08T14:24:29+00:00" + "time": "2024-10-31T13:38:25+00:00" }, { "name": "filament/tables", - "version": "v3.2.117", + "version": "v3.2.122", "source": { "type": "git", "url": "https://github.com/filamentphp/tables.git", - "reference": "152bf46a8f2c46f047835771a67085c2866b039b" + "reference": "56a852f7992a01ad8d7b85034cdbb2ae8a21086a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/tables/zipball/152bf46a8f2c46f047835771a67085c2866b039b", - "reference": "152bf46a8f2c46f047835771a67085c2866b039b", + "url": "https://api.github.com/repos/filamentphp/tables/zipball/56a852f7992a01ad8d7b85034cdbb2ae8a21086a", + "reference": "56a852f7992a01ad8d7b85034cdbb2ae8a21086a", "shasum": "" }, "require": { @@ -3056,11 +2976,11 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-10-08T14:24:25+00:00" + "time": "2024-10-31T13:38:27+00:00" }, { "name": "filament/widgets", - "version": "v3.2.117", + "version": "v3.2.122", "source": { "type": "git", "url": "https://github.com/filamentphp/widgets.git", @@ -3789,16 +3709,16 @@ }, { "name": "guzzlehttp/promises", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", "shasum": "" }, "require": { @@ -3852,7 +3772,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.3" + "source": "https://github.com/guzzle/promises/tree/2.0.4" }, "funding": [ { @@ -3868,7 +3788,7 @@ "type": "tidelift" } ], - "time": "2024-07-18T10:29:17+00:00" + "time": "2024-10-17T10:06:22+00:00" }, { "name": "guzzlehttp/psr7", @@ -4705,16 +4625,16 @@ }, { "name": "laravel/fortify", - "version": "v1.24.2", + "version": "v1.24.4", "source": { "type": "git", "url": "https://github.com/laravel/fortify.git", - "reference": "42695c45087e5abb3e173725b4f1ef4956a7b47d" + "reference": "5bd3bdd535acf4054865c64eec6d8bb8c60cc127" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/fortify/zipball/42695c45087e5abb3e173725b4f1ef4956a7b47d", - "reference": "42695c45087e5abb3e173725b4f1ef4956a7b47d", + "url": "https://api.github.com/repos/laravel/fortify/zipball/5bd3bdd535acf4054865c64eec6d8bb8c60cc127", + "reference": "5bd3bdd535acf4054865c64eec6d8bb8c60cc127", "shasum": "" }, "require": { @@ -4766,7 +4686,7 @@ "issues": "https://github.com/laravel/fortify/issues", "source": "https://github.com/laravel/fortify" }, - "time": "2024-09-16T19:20:52+00:00" + "time": "2024-10-29T13:59:23+00:00" }, { "name": "laravel/framework", @@ -5361,16 +5281,16 @@ }, { "name": "laravelcm/laravel-subscriptions", - "version": "v1.3.1", + "version": "v1.3.2", "source": { "type": "git", "url": "https://github.com/laravelcm/laravel-subscriptions.git", - "reference": "0fb781ac067a769a7653c6580aef68e1ace351fc" + "reference": "fbde435db5488b33a181e76d6719acd4db74e5d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravelcm/laravel-subscriptions/zipball/0fb781ac067a769a7653c6580aef68e1ace351fc", - "reference": "0fb781ac067a769a7653c6580aef68e1ace351fc", + "url": "https://api.github.com/repos/laravelcm/laravel-subscriptions/zipball/fbde435db5488b33a181e76d6719acd4db74e5d9", + "reference": "fbde435db5488b33a181e76d6719acd4db74e5d9", "shasum": "" }, "require": { @@ -5388,7 +5308,8 @@ "larastan/larastan": "^2.0", "laravel/pint": "^1.13", "orchestra/testbench": "^8.0|^9.0", - "pestphp/pest": "^2.18" + "pestphp/pest": "^2.18", + "spatie/test-time": "^1.3" }, "type": "library", "extra": { @@ -5441,7 +5362,67 @@ "type": "github" } ], - "time": "2024-07-24T04:08:22+00:00" + "time": "2024-11-01T20:48:24+00:00" + }, + { + "name": "laravelcm/livewire-slide-overs", + "version": "v1.0.8", + "source": { + "type": "git", + "url": "https://github.com/laravelcm/livewire-slide-overs.git", + "reference": "eaacf38da9bf159707b1f66a08f06361df2299a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravelcm/livewire-slide-overs/zipball/eaacf38da9bf159707b1f66a08f06361df2299a8", + "reference": "eaacf38da9bf159707b1f66a08f06361df2299a8", + "shasum": "" + }, + "require": { + "livewire/livewire": "^3.4", + "php": "^8.2", + "spatie/laravel-package-tools": "^1.15" + }, + "require-dev": { + "laravel/pint": "^1.1", + "orchestra/testbench": "^8.5", + "pestphp/pest": "^2.34", + "pestphp/pest-plugin-livewire": "^2.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravelcm\\LivewireSlideOvers\\LivewireSlideOverServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravelcm\\LivewireSlideOvers\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Arthur Monney", + "email": "monneylobe@gmail.com" + } + ], + "description": "Livewire component that provides drawers (slide overs) that support multiple children while maintaining state.", + "keywords": [ + "laravel", + "livewire", + "slide-overs" + ], + "support": { + "issues": "https://github.com/laravelcm/livewire-slide-overs/issues", + "source": "https://github.com/laravelcm/livewire-slide-overs/tree/v1.0.8" + }, + "time": "2024-07-12T23:00:38+00:00" }, { "name": "league/commonmark", @@ -5633,16 +5614,16 @@ }, { "name": "league/csv", - "version": "9.17.0", + "version": "9.18.0", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "8cab815fb11ec93aa2f7b8a57b3daa1f1a364011" + "reference": "b02d010e4055ae992247f6ffd1e7b103ef2a0790" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/8cab815fb11ec93aa2f7b8a57b3daa1f1a364011", - "reference": "8cab815fb11ec93aa2f7b8a57b3daa1f1a364011", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/b02d010e4055ae992247f6ffd1e7b103ef2a0790", + "reference": "b02d010e4055ae992247f6ffd1e7b103ef2a0790", "shasum": "" }, "require": { @@ -5654,11 +5635,11 @@ "ext-xdebug": "*", "friendsofphp/php-cs-fixer": "^3.64.0", "phpbench/phpbench": "^1.3.1", - "phpstan/phpstan": "^1.12.5", + "phpstan/phpstan": "^1.12.6", "phpstan/phpstan-deprecation-rules": "^1.2.1", "phpstan/phpstan-phpunit": "^1.4.0", "phpstan/phpstan-strict-rules": "^1.6.1", - "phpunit/phpunit": "^10.5.16 || ^11.4.0", + "phpunit/phpunit": "^10.5.16 || ^11.4.1", "symfony/var-dumper": "^6.4.8 || ^7.1.5" }, "suggest": { @@ -5716,7 +5697,7 @@ "type": "github" } ], - "time": "2024-10-10T10:30:28+00:00" + "time": "2024-10-18T08:14:48+00:00" }, { "name": "league/flysystem", @@ -6223,16 +6204,16 @@ }, { "name": "livewire/livewire", - "version": "v3.5.6", + "version": "v3.5.12", "source": { "type": "git", "url": "https://github.com/livewire/livewire.git", - "reference": "597a2808d8d3001cc3ed5ce89a6ebab00f83b80f" + "reference": "3c8d1f9d7d9098aaea663093ae168f2d5d2ae73d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/597a2808d8d3001cc3ed5ce89a6ebab00f83b80f", - "reference": "597a2808d8d3001cc3ed5ce89a6ebab00f83b80f", + "url": "https://api.github.com/repos/livewire/livewire/zipball/3c8d1f9d7d9098aaea663093ae168f2d5d2ae73d", + "reference": "3c8d1f9d7d9098aaea663093ae168f2d5d2ae73d", "shasum": "" }, "require": { @@ -6240,7 +6221,7 @@ "illuminate/routing": "^10.0|^11.0", "illuminate/support": "^10.0|^11.0", "illuminate/validation": "^10.0|^11.0", - "laravel/prompts": "^0.1.24", + "laravel/prompts": "^0.1.24|^0.2|^0.3", "league/mime-type-detection": "^1.9", "php": "^8.1", "symfony/console": "^6.0|^7.0", @@ -6287,7 +6268,7 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v3.5.6" + "source": "https://github.com/livewire/livewire/tree/v3.5.12" }, "funding": [ { @@ -6295,7 +6276,7 @@ "type": "github" } ], - "time": "2024-08-19T11:52:18+00:00" + "time": "2024-10-15T19:35:06+00:00" }, { "name": "maennchen/zipstream-php", @@ -6559,16 +6540,16 @@ }, { "name": "mckenziearts/blade-untitledui-icons", - "version": "v1.3", + "version": "v1.3.1", "source": { "type": "git", "url": "https://github.com/mckenziearts/blade-untitledui-icons.git", - "reference": "46c98a2f5c8fa41960a997b2e2cb0481e431240d" + "reference": "31319c395bdcf2c734f24dba9277f238144b0edf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mckenziearts/blade-untitledui-icons/zipball/46c98a2f5c8fa41960a997b2e2cb0481e431240d", - "reference": "46c98a2f5c8fa41960a997b2e2cb0481e431240d", + "url": "https://api.github.com/repos/mckenziearts/blade-untitledui-icons/zipball/31319c395bdcf2c734f24dba9277f238144b0edf", + "reference": "31319c395bdcf2c734f24dba9277f238144b0edf", "shasum": "" }, "require": { @@ -6612,7 +6593,7 @@ ], "support": { "issues": "https://github.com/mckenziearts/blade-untitledui-icons/issues", - "source": "https://github.com/mckenziearts/blade-untitledui-icons/tree/v1.3" + "source": "https://github.com/mckenziearts/blade-untitledui-icons/tree/v1.3.1" }, "funding": [ { @@ -6620,7 +6601,7 @@ "type": "github" } ], - "time": "2024-04-05T11:39:07+00:00" + "time": "2024-10-20T09:06:46+00:00" }, { "name": "mobiledetect/mobiledetectlib", @@ -8159,23 +8140,23 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.8.2", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "153ae662783729388a584b4361f2545e4d841e3c" + "reference": "1fb5ba8d045f5dd984ebded5b1cc66f29459422d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", - "reference": "153ae662783729388a584b4361f2545e4d841e3c", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/1fb5ba8d045f5dd984ebded5b1cc66f29459422d", + "reference": "1fb5ba8d045f5dd984ebded5b1cc66f29459422d", "shasum": "" }, "require": { "doctrine/deprecations": "^1.0", "php": "^7.3 || ^8.0", "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.13" + "phpstan/phpdoc-parser": "^1.18" }, "require-dev": { "ext-tokenizer": "*", @@ -8211,9 +8192,9 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.9.0" }, - "time": "2024-02-23T11:10:43+00:00" + "time": "2024-11-03T20:11:34+00:00" }, { "name": "phpoption/phpoption", @@ -10307,16 +10288,16 @@ }, { "name": "spatie/laravel-data", - "version": "4.10.1", + "version": "4.11.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-data.git", - "reference": "d3113c6bc03a6f1c241074d6f5832e05daa7ca77" + "reference": "df5b58baebae34475ca35338b4e9a131c9e2a8e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-data/zipball/d3113c6bc03a6f1c241074d6f5832e05daa7ca77", - "reference": "d3113c6bc03a6f1c241074d6f5832e05daa7ca77", + "url": "https://api.github.com/repos/spatie/laravel-data/zipball/df5b58baebae34475ca35338b4e9a131c9e2a8e0", + "reference": "df5b58baebae34475ca35338b4e9a131c9e2a8e0", "shasum": "" }, "require": { @@ -10342,7 +10323,7 @@ "phpstan/extension-installer": "^1.1", "phpunit/phpunit": "^10.0", "spatie/invade": "^1.0", - "spatie/laravel-typescript-transformer": "^2.3", + "spatie/laravel-typescript-transformer": "^2.5", "spatie/pest-plugin-snapshots": "^2.1", "spatie/test-time": "^1.2" }, @@ -10379,7 +10360,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-data/issues", - "source": "https://github.com/spatie/laravel-data/tree/4.10.1" + "source": "https://github.com/spatie/laravel-data/tree/4.11.1" }, "funding": [ { @@ -10387,7 +10368,7 @@ "type": "github" } ], - "time": "2024-10-07T08:36:46+00:00" + "time": "2024-10-23T07:14:53+00:00" }, { "name": "spatie/laravel-feed", @@ -11110,16 +11091,16 @@ }, { "name": "spatie/robots-txt", - "version": "2.2.2", + "version": "2.2.3", "source": { "type": "git", "url": "https://github.com/spatie/robots-txt.git", - "reference": "560d6d1776ee3a13af26ac4e04171a5d32f3923f" + "reference": "31763e5ca23fb0efa6dc6b700beb5ebfeab89432" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/robots-txt/zipball/560d6d1776ee3a13af26ac4e04171a5d32f3923f", - "reference": "560d6d1776ee3a13af26ac4e04171a5d32f3923f", + "url": "https://api.github.com/repos/spatie/robots-txt/zipball/31763e5ca23fb0efa6dc6b700beb5ebfeab89432", + "reference": "31763e5ca23fb0efa6dc6b700beb5ebfeab89432", "shasum": "" }, "require": { @@ -11154,7 +11135,7 @@ ], "support": { "issues": "https://github.com/spatie/robots-txt/issues", - "source": "https://github.com/spatie/robots-txt/tree/2.2.2" + "source": "https://github.com/spatie/robots-txt/tree/2.2.3" }, "funding": [ { @@ -11166,7 +11147,7 @@ "type": "github" } ], - "time": "2024-09-25T08:55:09+00:00" + "time": "2024-10-22T08:17:03+00:00" }, { "name": "spatie/temporary-directory", @@ -11299,16 +11280,16 @@ }, { "name": "symfony/console", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765" + "reference": "f793dd5a7d9ae9923e35d0503d08ba734cec1d79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765", - "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765", + "url": "https://api.github.com/repos/symfony/console/zipball/f793dd5a7d9ae9923e35d0503d08ba734cec1d79", + "reference": "f793dd5a7d9ae9923e35d0503d08ba734cec1d79", "shasum": "" }, "require": { @@ -11373,7 +11354,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.12" + "source": "https://github.com/symfony/console/tree/v6.4.13" }, "funding": [ { @@ -11389,20 +11370,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:15:52+00:00" + "time": "2024-10-09T08:40:40+00:00" }, { "name": "symfony/css-selector", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" + "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", - "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", + "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", "shasum": "" }, "require": { @@ -11438,7 +11419,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.1.1" + "source": "https://github.com/symfony/css-selector/tree/v7.1.6" }, "funding": [ { @@ -11454,7 +11435,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/deprecation-contracts", @@ -11525,16 +11506,16 @@ }, { "name": "symfony/dom-crawler", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "9d307ecbcb917001692be333cdc58f474fdb37f0" + "reference": "ae074dffb018c37a57071990d16e6152728dd972" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/9d307ecbcb917001692be333cdc58f474fdb37f0", - "reference": "9d307ecbcb917001692be333cdc58f474fdb37f0", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/ae074dffb018c37a57071990d16e6152728dd972", + "reference": "ae074dffb018c37a57071990d16e6152728dd972", "shasum": "" }, "require": { @@ -11572,7 +11553,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.4.12" + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.13" }, "funding": [ { @@ -11588,20 +11569,20 @@ "type": "tidelift" } ], - "time": "2024-09-15T06:35:36+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/error-handler", - "version": "v6.4.10", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "231f1b2ee80f72daa1972f7340297d67439224f0" + "reference": "e3c78742f86a5b65fe2ac4c4b6b776d92fd7ca0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/231f1b2ee80f72daa1972f7340297d67439224f0", - "reference": "231f1b2ee80f72daa1972f7340297d67439224f0", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/e3c78742f86a5b65fe2ac4c4b6b776d92fd7ca0c", + "reference": "e3c78742f86a5b65fe2ac4c4b6b776d92fd7ca0c", "shasum": "" }, "require": { @@ -11647,7 +11628,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.10" + "source": "https://github.com/symfony/error-handler/tree/v6.4.13" }, "funding": [ { @@ -11663,20 +11644,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" + "reference": "87254c78dd50721cfd015b62277a8281c5589702" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87254c78dd50721cfd015b62277a8281c5589702", + "reference": "87254c78dd50721cfd015b62277a8281c5589702", "shasum": "" }, "require": { @@ -11727,7 +11708,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.6" }, "funding": [ { @@ -11743,7 +11724,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -11823,16 +11804,16 @@ }, { "name": "symfony/finder", - "version": "v6.4.11", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453" + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/d7eb6daf8cd7e9ac4976e9576b32042ef7253453", - "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453", + "url": "https://api.github.com/repos/symfony/finder/zipball/daea9eca0b08d0ed1dc9ab702a46128fd1be4958", + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958", "shasum": "" }, "require": { @@ -11867,7 +11848,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.11" + "source": "https://github.com/symfony/finder/tree/v6.4.13" }, "funding": [ { @@ -11883,20 +11864,20 @@ "type": "tidelift" } ], - "time": "2024-08-13T14:27:37+00:00" + "time": "2024-10-01T08:30:56+00:00" }, { "name": "symfony/html-sanitizer", - "version": "v7.1.5", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/html-sanitizer.git", - "reference": "89bf376c056926bd7fe8a81c0f486a060e20fdbc" + "reference": "a25620fc6407e14331f3c0c5668eb4f35c392d4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/89bf376c056926bd7fe8a81c0f486a060e20fdbc", - "reference": "89bf376c056926bd7fe8a81c0f486a060e20fdbc", + "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/a25620fc6407e14331f3c0c5668eb4f35c392d4a", + "reference": "a25620fc6407e14331f3c0c5668eb4f35c392d4a", "shasum": "" }, "require": { @@ -11936,7 +11917,7 @@ "sanitizer" ], "support": { - "source": "https://github.com/symfony/html-sanitizer/tree/v7.1.5" + "source": "https://github.com/symfony/html-sanitizer/tree/v7.1.6" }, "funding": [ { @@ -11952,20 +11933,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T13:35:23+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/http-client", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "fbebfcce21084d3e91ea987ae5bdd8c71ff0fd56" + "reference": "509d0e8a798bf5e41e0b6317e9bce1140af47376" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/fbebfcce21084d3e91ea987ae5bdd8c71ff0fd56", - "reference": "fbebfcce21084d3e91ea987ae5bdd8c71ff0fd56", + "url": "https://api.github.com/repos/symfony/http-client/zipball/509d0e8a798bf5e41e0b6317e9bce1140af47376", + "reference": "509d0e8a798bf5e41e0b6317e9bce1140af47376", "shasum": "" }, "require": { @@ -12029,7 +12010,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.4.12" + "source": "https://github.com/symfony/http-client/tree/v6.4.13" }, "funding": [ { @@ -12045,7 +12026,7 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:21:33+00:00" + "time": "2024-10-14T18:15:01+00:00" }, { "name": "symfony/http-client-contracts", @@ -12127,16 +12108,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "133ac043875f59c26c55e79cf074562127cce4d2" + "reference": "4c0341b3e0a7291e752c69d2a1ed9a84b68d604c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/133ac043875f59c26c55e79cf074562127cce4d2", - "reference": "133ac043875f59c26c55e79cf074562127cce4d2", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4c0341b3e0a7291e752c69d2a1ed9a84b68d604c", + "reference": "4c0341b3e0a7291e752c69d2a1ed9a84b68d604c", "shasum": "" }, "require": { @@ -12184,7 +12165,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.12" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.13" }, "funding": [ { @@ -12200,20 +12181,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:18:25+00:00" + "time": "2024-10-11T19:20:58+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "96df83d51b5f78804f70c093b97310794fd6257b" + "reference": "4474015c363ec0cd3bf47d55657e68630dbae66e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/96df83d51b5f78804f70c093b97310794fd6257b", - "reference": "96df83d51b5f78804f70c093b97310794fd6257b", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4474015c363ec0cd3bf47d55657e68630dbae66e", + "reference": "4474015c363ec0cd3bf47d55657e68630dbae66e", "shasum": "" }, "require": { @@ -12298,7 +12279,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.12" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.13" }, "funding": [ { @@ -12314,20 +12295,20 @@ "type": "tidelift" } ], - "time": "2024-09-21T06:02:57+00:00" + "time": "2024-10-27T13:00:29+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "b6a25408c569ae2366b3f663a4edad19420a9c26" + "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/b6a25408c569ae2366b3f663a4edad19420a9c26", - "reference": "b6a25408c569ae2366b3f663a4edad19420a9c26", + "url": "https://api.github.com/repos/symfony/mailer/zipball/c2f7e0d8d7ac8fe25faccf5d8cac462805db2663", + "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663", "shasum": "" }, "require": { @@ -12378,7 +12359,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.12" + "source": "https://github.com/symfony/mailer/tree/v6.4.13" }, "funding": [ { @@ -12394,20 +12375,20 @@ "type": "tidelift" } ], - "time": "2024-09-08T12:30:05+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/mailgun-mailer", - "version": "v6.4.10", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mailgun-mailer.git", - "reference": "3eb7c7b644179a766f5d816620b7b6d4a4e7ec43" + "reference": "ad4e79798a5eb80af99004a4871b4fe5effe33a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/3eb7c7b644179a766f5d816620b7b6d4a4e7ec43", - "reference": "3eb7c7b644179a766f5d816620b7b6d4a4e7ec43", + "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/ad4e79798a5eb80af99004a4871b4fe5effe33a3", + "reference": "ad4e79798a5eb80af99004a4871b4fe5effe33a3", "shasum": "" }, "require": { @@ -12447,7 +12428,7 @@ "description": "Symfony Mailgun Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailgun-mailer/tree/v6.4.10" + "source": "https://github.com/symfony/mailgun-mailer/tree/v6.4.13" }, "funding": [ { @@ -12463,20 +12444,20 @@ "type": "tidelift" } ], - "time": "2024-07-04T11:16:22+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/mime", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "abe16ee7790b16aa525877419deb0f113953f0e1" + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/abe16ee7790b16aa525877419deb0f113953f0e1", - "reference": "abe16ee7790b16aa525877419deb0f113953f0e1", + "url": "https://api.github.com/repos/symfony/mime/zipball/1de1cf14d99b12c7ebbb850491ec6ae3ed468855", + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855", "shasum": "" }, "require": { @@ -12532,7 +12513,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.12" + "source": "https://github.com/symfony/mime/tree/v6.4.13" }, "funding": [ { @@ -12548,20 +12529,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:18:25+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/options-resolver", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55" + "reference": "85e95eeede2d41cd146146e98c9c81d9214cae85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/47aa818121ed3950acd2b58d1d37d08a94f9bf55", - "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/85e95eeede2d41cd146146e98c9c81d9214cae85", + "reference": "85e95eeede2d41cd146146e98c9c81d9214cae85", "shasum": "" }, "require": { @@ -12599,7 +12580,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.1.1" + "source": "https://github.com/symfony/options-resolver/tree/v7.1.6" }, "funding": [ { @@ -12615,7 +12596,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/polyfill-ctype", @@ -13255,16 +13236,16 @@ }, { "name": "symfony/process", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3" + "reference": "1f9f59b46880201629df3bd950fc5ae8c55b960f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/3f94e5f13ff58df371a7ead461b6e8068900fbb3", - "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3", + "url": "https://api.github.com/repos/symfony/process/zipball/1f9f59b46880201629df3bd950fc5ae8c55b960f", + "reference": "1f9f59b46880201629df3bd950fc5ae8c55b960f", "shasum": "" }, "require": { @@ -13296,7 +13277,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.12" + "source": "https://github.com/symfony/process/tree/v6.4.13" }, "funding": [ { @@ -13312,7 +13293,7 @@ "type": "tidelift" } ], - "time": "2024-09-17T12:47:12+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -13405,16 +13386,16 @@ }, { "name": "symfony/routing", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "a7c8036bd159486228dc9be3e846a00a0dda9f9f" + "reference": "640a74250d13f9c30d5ca045b6aaaabcc8215278" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/a7c8036bd159486228dc9be3e846a00a0dda9f9f", - "reference": "a7c8036bd159486228dc9be3e846a00a0dda9f9f", + "url": "https://api.github.com/repos/symfony/routing/zipball/640a74250d13f9c30d5ca045b6aaaabcc8215278", + "reference": "640a74250d13f9c30d5ca045b6aaaabcc8215278", "shasum": "" }, "require": { @@ -13468,7 +13449,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.12" + "source": "https://github.com/symfony/routing/tree/v6.4.13" }, "funding": [ { @@ -13484,7 +13465,7 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:32:26+00:00" + "time": "2024-10-01T08:30:56+00:00" }, { "name": "symfony/service-contracts", @@ -13571,16 +13552,16 @@ }, { "name": "symfony/string", - "version": "v7.1.5", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306" + "reference": "61b72d66bf96c360a727ae6232df5ac83c71f626" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306", - "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306", + "url": "https://api.github.com/repos/symfony/string/zipball/61b72d66bf96c360a727ae6232df5ac83c71f626", + "reference": "61b72d66bf96c360a727ae6232df5ac83c71f626", "shasum": "" }, "require": { @@ -13638,7 +13619,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.5" + "source": "https://github.com/symfony/string/tree/v7.1.6" }, "funding": [ { @@ -13654,20 +13635,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:28:38+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/translation", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "cf8360b8352b086be620fae8342c4d96e391a489" + "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/cf8360b8352b086be620fae8342c4d96e391a489", - "reference": "cf8360b8352b086be620fae8342c4d96e391a489", + "url": "https://api.github.com/repos/symfony/translation/zipball/bee9bfabfa8b4045a66bf82520e492cddbaffa66", + "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66", "shasum": "" }, "require": { @@ -13733,7 +13714,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.12" + "source": "https://github.com/symfony/translation/tree/v6.4.13" }, "funding": [ { @@ -13749,7 +13730,7 @@ "type": "tidelift" } ], - "time": "2024-09-16T06:02:54+00:00" + "time": "2024-09-27T18:14:25+00:00" }, { "name": "symfony/translation-contracts", @@ -13831,16 +13812,16 @@ }, { "name": "symfony/uid", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d" + "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d", - "reference": "2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d", + "url": "https://api.github.com/repos/symfony/uid/zipball/18eb207f0436a993fffbdd811b5b8fa35fa5e007", + "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007", "shasum": "" }, "require": { @@ -13885,7 +13866,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.4.12" + "source": "https://github.com/symfony/uid/tree/v6.4.13" }, "funding": [ { @@ -13901,20 +13882,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:32:26+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.11", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "ee14c8254a480913268b1e3b1cba8045ed122694" + "reference": "2acb151474ed8cb43624e3f41a0bf7c4c8ce4f41" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ee14c8254a480913268b1e3b1cba8045ed122694", - "reference": "ee14c8254a480913268b1e3b1cba8045ed122694", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2acb151474ed8cb43624e3f41a0bf7c4c8ce4f41", + "reference": "2acb151474ed8cb43624e3f41a0bf7c4c8ce4f41", "shasum": "" }, "require": { @@ -13970,7 +13951,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.11" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.13" }, "funding": [ { @@ -13986,7 +13967,7 @@ "type": "tidelift" } ], - "time": "2024-08-30T16:03:21+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -14911,36 +14892,37 @@ }, { "name": "larastan/larastan", - "version": "v2.9.8", + "version": "v2.9.10", "source": { "type": "git", "url": "https://github.com/larastan/larastan.git", - "reference": "340badd89b0eb5bddbc503a4829c08cf9a2819d7" + "reference": "9e7233d88f4f10796fadb8a2d85c5f2b55277c76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/larastan/larastan/zipball/340badd89b0eb5bddbc503a4829c08cf9a2819d7", - "reference": "340badd89b0eb5bddbc503a4829c08cf9a2819d7", + "url": "https://api.github.com/repos/larastan/larastan/zipball/9e7233d88f4f10796fadb8a2d85c5f2b55277c76", + "reference": "9e7233d88f4f10796fadb8a2d85c5f2b55277c76", "shasum": "" }, "require": { "ext-json": "*", - "illuminate/console": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/container": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/contracts": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/database": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/http": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/pipeline": "^9.52.16 || ^10.28.0 || ^11.0", - "illuminate/support": "^9.52.16 || ^10.28.0 || ^11.0", + "illuminate/console": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/container": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/contracts": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/database": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/http": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/pipeline": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/support": "^9.52.16 || ^10.28.0 || ^11.16", "php": "^8.0.2", "phpmyadmin/sql-parser": "^5.9.0", - "phpstan/phpstan": "^1.11.2" + "phpstan/phpstan": "^1.12.5" }, "require-dev": { "doctrine/coding-standard": "^12.0", "nikic/php-parser": "^4.19.1", "orchestra/canvas": "^7.11.1 || ^8.11.0 || ^9.0.2", "orchestra/testbench": "^7.33.0 || ^8.13.0 || ^9.0.3", + "phpstan/phpstan-deprecation-rules": "^1.2", "phpunit/phpunit": "^9.6.13 || ^10.5.16" }, "suggest": { @@ -14989,7 +14971,7 @@ ], "support": { "issues": "https://github.com/larastan/larastan/issues", - "source": "https://github.com/larastan/larastan/tree/v2.9.8" + "source": "https://github.com/larastan/larastan/tree/v2.9.10" }, "funding": [ { @@ -15009,7 +14991,7 @@ "type": "patreon" } ], - "time": "2024-07-06T17:46:02+00:00" + "time": "2024-10-19T23:04:40+00:00" }, { "name": "laravel/pint", @@ -15079,16 +15061,16 @@ }, { "name": "laravel/sail", - "version": "v1.36.0", + "version": "v1.37.1", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "f184d3d687155d06bc8cb9ff6dc48596a138460c" + "reference": "7efa151ea0d16f48233d6a6cd69f81270acc6e93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/f184d3d687155d06bc8cb9ff6dc48596a138460c", - "reference": "f184d3d687155d06bc8cb9ff6dc48596a138460c", + "url": "https://api.github.com/repos/laravel/sail/zipball/7efa151ea0d16f48233d6a6cd69f81270acc6e93", + "reference": "7efa151ea0d16f48233d6a6cd69f81270acc6e93", "shasum": "" }, "require": { @@ -15138,7 +15120,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2024-10-10T13:26:02+00:00" + "time": "2024-10-29T20:18:14+00:00" }, { "name": "mockery/mockery", @@ -15976,16 +15958,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.12.6", + "version": "1.12.7", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae" + "reference": "dc2b9976bd8b0f84ec9b0e50cc35378551de7af0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dc4d2f145a88ea7141ae698effd64d9df46527ae", - "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dc2b9976bd8b0f84ec9b0e50cc35378551de7af0", + "reference": "dc2b9976bd8b0f84ec9b0e50cc35378551de7af0", "shasum": "" }, "require": { @@ -16030,7 +16012,7 @@ "type": "github" } ], - "time": "2024-10-06T15:03:59+00:00" + "time": "2024-10-18T11:12:07+00:00" }, { "name": "phpunit/php-code-coverage", @@ -16624,16 +16606,16 @@ }, { "name": "sebastian/comparator", - "version": "5.0.2", + "version": "5.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53" + "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", - "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", + "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", "shasum": "" }, "require": { @@ -16644,7 +16626,7 @@ "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^10.4" + "phpunit/phpunit": "^10.5" }, "type": "library", "extra": { @@ -16689,7 +16671,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.2" + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.3" }, "funding": [ { @@ -16697,7 +16679,7 @@ "type": "github" } ], - "time": "2024-08-12T06:03:08+00:00" + "time": "2024-10-18T14:56:07+00:00" }, { "name": "sebastian/complexity", @@ -17819,16 +17801,16 @@ }, { "name": "symfony/yaml", - "version": "v7.1.5", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4" + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4e561c316e135e053bd758bf3b3eb291d9919de4", - "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4", + "url": "https://api.github.com/repos/symfony/yaml/zipball/3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", "shasum": "" }, "require": { @@ -17870,7 +17852,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.5" + "source": "https://github.com/symfony/yaml/tree/v7.1.6" }, "funding": [ { @@ -17886,7 +17868,7 @@ "type": "tidelift" } ], - "time": "2024-09-17T12:49:58+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "ta-tikoma/phpunit-architecture-test", diff --git a/config/livewire-slide-over.php b/config/livewire-slide-over.php new file mode 100644 index 00000000..f4707846 --- /dev/null +++ b/config/livewire-slide-over.php @@ -0,0 +1,64 @@ + false, + + /* + |-------------------------------------------------------------------------- + | Include JS + |-------------------------------------------------------------------------- + | + | Livewire Slide Overs will inject the required Javascript in your blade template. + | If you want to bundle the required Javascript you can set this to false + | and add `require('vendor/laravelcm/livewire-slide-overs/resources/js/slide-over');` + | to your script bundler like webpack. + | + */ + 'include_js' => false, + + /* + |-------------------------------------------------------------------------- + | Default Slide Over Position + |-------------------------------------------------------------------------- + | Configure which way the slide-over will open + | + | Available slide overs position + | Position::Right, Position::Left, Position::Bottom + | + */ + + 'default_position' => \Laravelcm\LivewireSlideOvers\Position::Right, + + /* + |-------------------------------------------------------------------------- + | Slide Over Component Defaults + |-------------------------------------------------------------------------- + | + | Configure the default properties for a slide-over component. + | + | Supported slide_over_max_width + | 'sm', 'md', 'lg', 'xl', '2xl', '3xl', '4xl', '5xl', '6xl', '7xl' + */ + + 'component_defaults' => [ + 'slide_over_max_width' => 'xl', + 'close_slide_over_on_click_away' => true, + 'close_slide_over_on_escape' => true, + 'close_slide_over_on_escape_is_forceful' => true, + 'dispatch_close_event' => false, + 'destroy_on_close' => false, + ], + +]; diff --git a/config/livewire.php b/config/livewire.php index f2dc751e..6decbb4e 100644 --- a/config/livewire.php +++ b/config/livewire.php @@ -131,7 +131,7 @@ 'navigate' => [ 'show_progress_bar' => true, - 'progress_bar_color' => '#2299dd', + 'progress_bar_color' => '#099170', ], /* diff --git a/config/markdown.php b/config/markdown.php index 60df990b..89d021e5 100644 --- a/config/markdown.php +++ b/config/markdown.php @@ -56,7 +56,7 @@ ], 'heading_permalink' => [ - 'html_class' => 'anchor mr-2 !text-skin-primary !no-underline hover:!text-skin-primary-hover focus:!text-skin-primary-hover focus:outline-none', + 'html_class' => 'anchor mr-2 !text-primary-500 !no-underline hover:!text-primary-500 focus:outline-none', 'fragment_prefix' => '', 'id_prefix' => '', 'symbol' => '#', @@ -127,7 +127,7 @@ | */ - 'html_input' => 'allow', + 'html_input' => 'strip', /* |-------------------------------------------------------------------------- diff --git a/database/migrations/2024_11_04_194431_add_description_columns_to_channels_table.php b/database/migrations/2024_11_04_194431_add_description_columns_to_channels_table.php new file mode 100644 index 00000000..b236c930 --- /dev/null +++ b/database/migrations/2024_11_04_194431_add_description_columns_to_channels_table.php @@ -0,0 +1,24 @@ +json('description')->nullable(); + }); + } + + public function down(): void + { + Schema::table('channels', function (Blueprint $table): void { + $table->dropColumn('description'); + }); + } +}; diff --git a/database/seeders/Fixtures/ThreadTableSeeder.php b/database/seeders/Fixtures/ThreadTableSeeder.php index 7842ac9c..78efc86d 100644 --- a/database/seeders/Fixtures/ThreadTableSeeder.php +++ b/database/seeders/Fixtures/ThreadTableSeeder.php @@ -4,6 +4,9 @@ namespace Database\Seeders\Fixtures; +use App\Models\Reply; +use App\Models\Thread; +use App\Models\User; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; @@ -11,5 +14,21 @@ final class ThreadTableSeeder extends Seeder { use WithoutModelEvents; - public function run(): void {} + public function run(): void + { + $usersIds = User::query()->inRandomOrder() + ->limit(20) + ->get() + ->modelKeys(); + + Thread::factory(['user_id' => random_int(1, count($usersIds))]) + ->count(40) + ->create(); + + /*$threadsIds = Thread::query()->inRandomOrder() + ->get() + ->modelKeys(); + + Reply::factory(['user_id' => random_int(1, count($threadsIds))])->create();*/ + } } diff --git a/lang/en.json b/lang/en.json deleted file mode 100644 index 9800982d..00000000 --- a/lang/en.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "The :attribute must be at least :length characters.": "The :attribute must be at least :length characters.", - "The given :attribute has appeared in a data leak. Please choose a different :attribute.": "The given :attribute has appeared in a data leak. Please choose a different :attribute.", - "Verify Email Address": "Verify Email Address", - "Please click the button below to verify your email address.": "Please click the button below to verify your email address.", - "If you did not create an account, no further action is required.": "If you did not create an account, no further action is required.", - "Articles soumis en attente d'approbation:" : "Pending approval articles:", - "[@:username](:profile_url) a soumit l'article :title le: :date" : "[@:username](:profile_url) submitted the article :title on: :date", - "Voir l'article" : "Voir l'article" -} diff --git a/lang/en/actions.php b/lang/en/actions.php index a131fde7..22ff7b6c 100644 --- a/lang/en/actions.php +++ b/lang/en/actions.php @@ -4,9 +4,11 @@ return [ - 'new_thread' => 'Lancer un thread', + 'new_thread' => 'Start a thread', 'edit' => 'Edit', 'approve' => 'Approve', 'delete' => 'Delete', + 'cancel' => 'Cancel', + 'save' => 'Save', ]; diff --git a/lang/en/global.php b/lang/en/global.php index ca581280..a49876a0 100644 --- a/lang/en/global.php +++ b/lang/en/global.php @@ -23,6 +23,9 @@ 'rules' => 'Rules', 'privacy' => 'Privacy Policy', 'terms' => 'Terms & Conditions', + 'settings' => 'Settings', + 'profile' => 'Profile', + 'dashboard' => 'Dashboard', ], 'footer' => [ 'title' => 'Footer', @@ -35,6 +38,7 @@ 'description' => 'Integrate our various communication platforms, receive tutorials, articles and podcasts on web design and programming.', ], 'ask' => 'asked', + 'posted' => 'posted', 'posted_by' => 'Posted by', 'members' => 'Members', 'developers' => 'PHP & Laravel developers', @@ -47,8 +51,30 @@ 'sponsored' => 'Sponsored', 'read_time' => ':time min reading', 'page_views' => ':number views', + 'views' => 'views', 'open_navigation' => 'Open main menu', 'close_navigation' => 'Close menu', 'view_notifications' => 'View notifications', + 'reset' => 'Reset', + 'answers' => 'answers', + 'first_to_react' => 'Be the first to react', + 'rule_advise' => "Make sure you've read our rules before proceeding.", + 'read_rules' => 'Learn about rules', + 'error_title' => 'Error', + 'error_description' => 'There seems to be a problem right now! Please try again later.', + 'forum_description' => 'Learn, discover and share in the Forum.', + 'podcasts_description' => 'Radio programs on development and IT in general.', + 'rules_description' => 'User guide and site settings.', + 'articles_description' => 'The latest news and information on the Blog.', + 'popular_pages' => 'Popular pages', + 'back_home' => 'Or return to homepage', + 'signed_as' => 'Signed in as', + 'view_more' => 'View more →', + 'or' => 'or', + 'need' => 'You need', + 'discord' => [ + 'title' => 'Join discord', + 'description' => 'Join the community Discord server and connect with other developers.', + ], ]; diff --git a/lang/en/notifications.php b/lang/en/notifications.php index 24685a37..91ddd4b9 100644 --- a/lang/en/notifications.php +++ b/lang/en/notifications.php @@ -8,4 +8,22 @@ 'created' => 'Thank you for submitting your article. We will only contact you once we have accepted your article.', ], + 'thread' => [ + 'created' => 'Thread was successfully created.', + 'updated' => 'Thread was successfully updated.', + 'deleted' => 'Thread was successfully deleted.', + 'best_reply' => 'You have accepted this solution as the best answer for this thread.', + 'subscribe' => 'You are now subscribed to this thread.', + 'unsubscribe' => 'You have unsubscribed from this thread.', + ], + + 'exceptions' => [ + 'unverified_user' => 'You are not authorized to do this. Your e-mail is not verified', + ], + + 'reply' => [ + 'created' => 'Answer successfully added.', + 'updated' => 'Successfully updated answer.', + ], + ]; diff --git a/lang/en/pages/forum.php b/lang/en/pages/forum.php new file mode 100644 index 00000000..4efa3b0d --- /dev/null +++ b/lang/en/pages/forum.php @@ -0,0 +1,44 @@ + 'Forum :channel', + 'channel_selector' => 'Select a channel', + 'channel_placeholder' => 'Find a channel', + 'channel_lists' => 'All', + 'view_channel' => 'View', + 'new_thread' => 'New thread', + 'reply_thread' => 'Reply thread', + 'subscribe_thread' => 'Subscribe', + 'unsubscribe_thread' => 'Unsubscribe', + 'navigation' => [ + 'threads' => 'All threads', + 'channels' => 'Channels', + 'me' => 'My questions', + 'following' => 'Following', + 'popular' => 'Popular', + 'solve' => 'Solve', + 'unresolved' => 'Unresolved', + 'no_reply' => 'No answer', + 'leaderboard' => 'Leaderboard', + ], + 'info' => [ + 'title' => 'Helpful hints', + 'description' => 'Please search for your question before posting your topic by using the search field in the navigation bar to see if it has already been answered.', + ], + 'thread_search' => 'Search a thread', + 'collaborate_thread' => 'to join the conversation.', + 'verify_account' => 'You will need to verify your account before participating in this conversation.', + 'received_link' => 'Received link', + 'torchlight' => 'For code formatting (syntax color, language, etc.) we use', + 'old_thread' => 'The last reply to this topic was more than six months ago. Consider opening a new topic if you have a similar question.', + 'best_answer' => 'Best answer', + 'mark_answer' => 'Mark as solution', + 'report_spam' => 'Report spam', + 'max_thread_length' => '100 characters maximum', + 'answer_reply' => 'Answer to', + 'threads_count' => ':count messages', + +]; diff --git a/lang/en/pages/home.php b/lang/en/pages/home.php index a8ad6f19..2f0f0eee 100644 --- a/lang/en/pages/home.php +++ b/lang/en/pages/home.php @@ -4,42 +4,42 @@ return [ - 'title' => 'La plus grande communauté de développeurs Laravel & PHP au Cameroun', - 'description' => 'Laravel Cameroun est le portail de la communauté de développeurs PHP & Laravel au Cameroun, on partage, on apprend, on découvre et on construit une grande communauté.', + 'title' => 'The largest community of Laravel & PHP developers in Cameroon', + 'description' => 'Laravel Cameroun is the portal for the PHP & Laravel developer community in Cameroon, where we share, learn, discover and build a great community.', 'sponsor' => [ 'title' => 'Sponsor', - 'description' => 'Soutenez Laravel Cameroun aujourd\'hui en sponsorisant', - 'description_small' => 'Soutenez Laravel Cameroun', + 'description' => 'Support Laravel Cameroun today by sponsoring', + 'description_small' => 'Support Laravel Cameroun', ], 'join_community' => 'Join the community', 'visit_forum' => 'Visit the forum', - 'work_associations' => 'Nous travaillons avec d’autres communautés et startups', - 'view_logo_question' => 'Votre logo ici ?', + 'work_associations' => 'We work with other communities and startups', + 'view_logo_question' => 'Your logo here ?', 'popular_posts' => [ 'title' => 'Popular Posts', - 'description' => 'Découvrez les articles les plus appréciés et partagés par les membres de la communauté', + 'description' => 'Discover the most popular articles shared by community members', ], - 'view_posts' => 'Voir tous les articles', + 'view_posts' => 'See all articles', 'threads' => [ - 'title' => 'On apprend aussi en aidant les autres', - 'description' => 'En rejoignant la communauté, vous pouvez consulter les dernières questions non résolues et apporter votre pierre à l’édifice.', - 'show' => 'Afficher la question', - 'show_all' => 'Voir tous les sujets', + 'title' => 'We also learn by helping others', + 'description' => 'By joining the community, you can consult the latest unresolved questions and make your contribution to the edifice.', + 'show' => 'Show question', + 'show_all' => 'View all threads', ], 'discussions' => [ - 'title' => 'Ou venez juste discuter', - 'description' => 'Dans la communauté on partage aussi des sujets de discussions dans divers domaines, pour nous édifier tous ensemble. Rejoins nous en participant', - 'read' => 'Lire la discussion', - 'show_all' => 'Voir toutes les discussions', + 'title' => 'Or just come and chat', + 'description' => 'The community also shares topics for discussion in a variety of areas, to edify us all together. Join us by participating', + 'read' => 'Read the discussion', + 'show_all' => 'View all discussions', ], 'about' => [ - 'heading' => "Nous construisons une communauté Open Source d'apprenants et d'enseignants", - 'everybody_learn' => 'Tout le monde enseigne, tout le monde apprend', - 'community_spirit' => "Tel est l'esprit qui est derrière la communauté. Une communauté qui se veut grandissante et qui donne la possibilité à tout le monde de partager ses connaissances et d'apprendre.", - 'join_members' => 'qui ont rejoint les différents groupes de la communauté', - 'developers_location' => 'dans l’ensemble du territoire national.', - 'young_community' => 'car la communauté est encore très jeune.', - 'projects' => 'sur les projets réalisés par les développeurs camerounais sur Github.', + 'heading' => 'We build an Open Source community of learners and teachers', + 'everybody_learn' => 'Everyone teaches, everyone learns', + 'community_spirit' => 'This is the spirit behind the community. A community that aims to grow and give everyone the chance to share their knowledge and learn.', + 'join_members' => 'who joined the various community groups', + 'developers_location' => 'throughout the country.', + 'young_community' => 'because the community is still very young.', + 'projects' => 'on projects created by Cameroonian developers on Github.', ], ]; diff --git a/lang/en/pagination.php b/lang/en/pagination.php index f03c42c6..d90fa15c 100644 --- a/lang/en/pagination.php +++ b/lang/en/pagination.php @@ -17,5 +17,10 @@ 'previous' => '« Previous', 'next' => 'Next »', + 'go_to_page' => 'Go to page :page', + 'results' => 'results', + 'showing' => 'Showing', + 'to' => 'to', + 'of' => 'of', ]; diff --git a/lang/fr.json b/lang/fr.json deleted file mode 100644 index 9ef90469..00000000 --- a/lang/fr.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "The :attribute must be at least :length characters.": "Le champ :attribute doit contenir au moins :length caractères.", - "The given :attribute has appeared in a data leak. Please choose a different :attribute.": "Le champ :attribute donné est apparu dans une fuite de données. Veuillez choisir un autre :attribute.", - "Verify Email Address": "Vérifier l'adresse e-mail", - "Please click the button below to verify your email address.": "Veuillez cliquer sur le bouton ci-dessous pour vérifier votre adresse email.", - "If you did not create an account, no further action is required.": "Si vous n'avez pas créé de compte, aucune autre action n'est requise.", - "Articles soumis en attente d'approbation:" : "Articles soumis en attente d'approbation:", - "[@:username](:profile_url) a soumit l'article [:title](:url) le: :date" : "[@:username](:profile_url) a soumit l'article [:title](:url) le: :date", - "Voir l'article": "Voir l'article" -} diff --git a/lang/fr/actions.php b/lang/fr/actions.php index 4925039d..480f102a 100644 --- a/lang/fr/actions.php +++ b/lang/fr/actions.php @@ -8,5 +8,7 @@ 'edit' => 'Éditer', 'approve' => 'Approuver', 'delete' => 'Supprimer', + 'cancel' => 'Annuler', + 'save' => 'Enregistrer', ]; diff --git a/lang/fr/global.php b/lang/fr/global.php index 348aa942..41f897e2 100644 --- a/lang/fr/global.php +++ b/lang/fr/global.php @@ -23,6 +23,9 @@ 'rules' => 'Code de conduite', 'privacy' => 'Confidentialité', 'terms' => 'Conditions d’utilisation', + 'settings' => 'Paramètres', + 'profile' => 'Mon profil', + 'dashboard' => 'Tableau de bord', ], 'footer' => [ 'title' => 'Pied de page', @@ -35,6 +38,7 @@ 'description' => 'Intégrez nos différentes plateformes de communication, recevez des tutoriels, articles et podcasts sur le design et la programmation web.', ], 'ask' => 'a posé', + 'posted' => 'a répondu', 'posted_by' => 'Posté par', 'members' => 'Membres', 'developers' => 'Développeurs PHP & Laravel', @@ -47,8 +51,30 @@ 'sponsored' => 'Sponsorisé', 'read_time' => ':time min de lecture', 'page_views' => ':number vues', + 'views' => 'vues', 'open_navigation' => 'Ouvrir le menu', 'close_navigation' => 'Fermer le menu', 'view_notifications' => 'Voir les notifications', + 'reset' => 'Réinitialiser', + 'answers' => 'réponses', + 'first_to_react' => 'Soyez le premier à réagir', + 'rule_advise' => "Assurez-vous d'avoir lu nos règles avant de continuer.", + 'read_rules' => 'Consulter les règles', + 'error_title' => 'Erreur', + 'error_description' => 'Il semble y avoir un problème en ce moment ! Veuillez réessayer plus tard.', + 'forum_description' => 'Apprenez, découvrez, partagez dans le Forum.', + 'podcasts_description' => "Des émissions radios pour dans le domaine du développement et de l'IT en général.", + 'rules_description' => "Guide d'utilisation et paramétrage du site.", + 'articles_description' => 'Les dernières nouveautés, informations sur le Blog.', + 'popular_pages' => 'Pages Populaires', + 'back_home' => "Ou retourner à l'accueil", + 'signed_as' => 'Connecté en tant que', + 'view_more' => 'En savoir plus →', + 'or' => 'ou', + 'need' => 'Il faut', + 'discord' => [ + 'title' => 'Rejoindre Discord', + 'description' => 'Rejoignez le serveur Discord de la communauté et connectez-vous avec d\'autres développeurs.', + ], ]; diff --git a/lang/fr/notifications.php b/lang/fr/notifications.php index 7da5bcdb..dbdead6b 100644 --- a/lang/fr/notifications.php +++ b/lang/fr/notifications.php @@ -8,4 +8,22 @@ 'created' => 'Merci d\'avoir soumis votre article. Vous aurez des nouvelles que lorsque nous accepterons votre article.', ], + 'thread' => [ + 'created' => 'Votre sujet à été crée.', + 'updated' => 'Votre sujet à été modifié.', + 'deleted' => 'Le sujet a été supprimé.', + 'best_reply' => 'Vous avez accepté cette solution comme meilleure réponse pour ce sujet.', + 'subscribe' => 'Vous êtes maintenant abonné à ce sujet.', + 'unsubscribe' => 'Vous vous êtes désabonné de ce sujet.', + ], + + 'exceptions' => [ + 'unverified_user' => "Vous n'êtes pas autorisé à effectuer cette. Votre e-mail n'est pas vérifiée", + ], + + 'reply' => [ + 'created' => 'Réponse ajoutée avec succès!', + 'updated' => 'Réponse modifiée avec succès.', + ], + ]; diff --git a/lang/fr/pages/forum.php b/lang/fr/pages/forum.php new file mode 100644 index 00000000..fff63c38 --- /dev/null +++ b/lang/fr/pages/forum.php @@ -0,0 +1,44 @@ + 'Forum :channel', + 'channel_selector' => 'Sélectionner un channel', + 'channel_placeholder' => 'Rechercher un channel', + 'channel_lists' => 'Toutes', + 'view_channel' => 'Afficher', + 'new_thread' => 'Nouveau sujet', + 'reply_thread' => 'Répondre', + 'subscribe_thread' => "S'abonner", + 'unsubscribe_thread' => 'Se désabonner', + 'navigation' => [ + 'threads' => 'Tous les sujets', + 'channels' => 'Channels', + 'me' => 'Mes questions', + 'following' => 'Suivi', + 'popular' => 'Populaire', + 'solve' => 'Résolu', + 'unresolved' => 'Non résolu', + 'no_reply' => 'Aucune réponse', + 'leaderboard' => 'Classement', + ], + 'info' => [ + 'title' => 'Bon à savoir', + 'description' => "Veuillez rechercher votre question avant de publier votre sujet en utilisant le champ de recherche dans la barre de navigation pour voir si elle n'a pas déjà été traitée.", + ], + 'thread_search' => 'Rechercher un sujet', + 'collaborate_thread' => 'pour participer à cette conversation.', + 'verify_account' => 'Vous devrez vérifier votre compte avant de participer à cette conversation.', + 'received_link' => 'Recevoir un lien', + 'torchlight' => 'Pour le formatage du code (couleur syntaxique, langage, etc) nous utilisons', + 'old_thread' => 'La dernière réponse à ce sujet remonte à plus de six mois. Pensez à ouvrir un nouveau sujet si vous avez une question similaire.', + 'best_answer' => 'Meilleure réponse', + 'mark_answer' => 'Marquer comme réponse', + 'report_spam' => 'Signaler un spam', + 'max_thread_length' => 'Maximum de 100 caractères.', + 'answer_reply' => 'Répondre au sujet', + 'threads_count' => ':count messages', + +]; diff --git a/lang/fr/pagination.php b/lang/fr/pagination.php index 15c69f69..2f727c7c 100644 --- a/lang/fr/pagination.php +++ b/lang/fr/pagination.php @@ -17,5 +17,10 @@ 'previous' => '« Précédent', 'next' => 'Suivant »', + 'go_to_page' => 'Aller à la page :page', + 'results' => 'résultats', + 'showing' => 'Affichage de', + 'to' => 'à', + 'of' => 'sur', ]; diff --git a/lang/fr/validation.php b/lang/fr/validation.php index 22d42a54..ad4818f7 100644 --- a/lang/fr/validation.php +++ b/lang/fr/validation.php @@ -170,7 +170,7 @@ 'age' => 'âge', 'available' => 'disponible', 'city' => 'ville', - 'content' => 'contenu', + 'content' => 'Contenu', 'country' => 'pays', 'current_password' => 'mot de passe actuel', 'date' => 'date', @@ -193,7 +193,7 @@ 'sex' => 'sexe', 'size' => 'taille', 'time' => 'heure', - 'title' => 'titre', + 'title' => 'Titre', 'username' => 'Pseudo d\'utilisateur', 'year' => 'année', ], diff --git a/public/images/reactions/clap.svg b/public/images/reactions/clap.svg index f05ba4fc..70c809a5 100755 --- a/public/images/reactions/clap.svg +++ b/public/images/reactions/clap.svg @@ -1,75 +1,20 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/public/images/reactions/fire.svg b/public/images/reactions/fire.svg index 4953f727..631e15a5 100755 --- a/public/images/reactions/fire.svg +++ b/public/images/reactions/fire.svg @@ -1,95 +1,22 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + diff --git a/public/images/reactions/handshake.svg b/public/images/reactions/handshake.svg index 0d6c4d89..5e3225f9 100755 --- a/public/images/reactions/handshake.svg +++ b/public/images/reactions/handshake.svg @@ -1,65 +1,36 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/public/images/reactions/joy.svg b/public/images/reactions/joy.svg index d1907b3b..e8d767c5 100755 --- a/public/images/reactions/joy.svg +++ b/public/images/reactions/joy.svg @@ -1,63 +1,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/public/images/reactions/love.svg b/public/images/reactions/love.svg index ae72aea5..6dd0705f 100755 --- a/public/images/reactions/love.svg +++ b/public/images/reactions/love.svg @@ -1,52 +1,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + diff --git a/public/images/reactions/money.svg b/public/images/reactions/money.svg index 087e480c..8f8c79aa 100755 --- a/public/images/reactions/money.svg +++ b/public/images/reactions/money.svg @@ -1,98 +1,34 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - XAF - + + + + + + + + + + + + + + XAF diff --git a/public/images/reactions/party.svg b/public/images/reactions/party.svg index 369c6048..31828a65 100755 --- a/public/images/reactions/party.svg +++ b/public/images/reactions/party.svg @@ -1,99 +1,26 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/public/images/reactions/pray.svg b/public/images/reactions/pray.svg index 92409bb1..9baf4f3a 100755 --- a/public/images/reactions/pray.svg +++ b/public/images/reactions/pray.svg @@ -1,71 +1,35 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/resources/css/app.css b/resources/css/app.css index afa7ad15..b0d4a4dc 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -10,32 +10,32 @@ @import 'header.css'; :root { - --brand-laravel: #ff2d20; - --brand-livewire: #fb70a9; - --brand-inertia: #8b5cf6; - --brand-javascript: #f7df1e; - --brand-typesript: #007acc; - --brand-react: #53c1de; - --brand-vue-js: #41b883; - --brand-php: #777bb3; - --brand-digital-ocean: #0080ff; - --brand-forge: #19b69b; - --brand-packages: #4f46e5; - --brand-outils: #22d3ee; - --brand-tailwindcss: #06b6d4; - --brand-design: #78350f; - --brand-alpinejs: #2d3441; - --brand-open-source: #f97316; - --brand-freelance: #f43f5e; - --brand-salaire: #c7d2fe; - --brand-projets: #14b8a6; - --brand-entrepreneuriat: #0ea5e9; - --brand-paiement-en-ligne: #10b981; - --brand-branding: #ec4899; - --brand-applications: #0284c7; - --brand-developpement: #4d7c0f; - --brand-event: #36bffa; - --brand-tutoriel: #164e63; - --brand-communaute: #dd2590; - --brand-astuces: #d6bbfb; + --laravel: #F56857; + --livewire: #fb70a9; + --inertia: #8b5cf6; + --javascript: #f7df1e; + --typesript: #007acc; + --react: #53c1de; + --vue-js: #41b883; + --php: #777bb3; + --digital-ocean: #0080ff; + --forge: #19b69b; + --packages: #4f46e5; + --outils: #22d3ee; + --tailwindcss: #06b6d4; + --design: #78350f; + --alpinejs: #2d3441; + --open-source: #f97316; + --freelance: #f43f5e; + --salaire: #c7d2fe; + --projets: #14b8a6; + --entrepreneuriat: #0ea5e9; + --paiement-en-ligne: #10b981; + --branding: #ec4899; + --applications: #0284c7; + --developpement: #4d7c0f; + --event: #36bffa; + --tutoriel: #164e63; + --communaute: #dd2590; + --astuces: #d6bbfb; } diff --git a/resources/css/forms.css b/resources/css/forms.css index d299edaa..76e2396a 100644 --- a/resources/css/forms.css +++ b/resources/css/forms.css @@ -16,65 +16,3 @@ input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; /* <-- Apparently some margin are still there even though it's hidden */ } - -/** Choices.js **/ -.choices { - margin-top: 8px; -} - -.standard .choices__input.choices__input--cloned { - @apply hidden; -} - -.standard .choices__inner { - @apply flex h-12 w-full items-center rounded border border-gray-300 bg-white p-2 !important; -} - -.standard .choices__list--dropdown { - @apply border-2 border-gray-300 !important; -} - -.standard .choices__list--dropdown .choices__list { - @apply border border-gray-500 bg-white !important; -} - -.standard .choices__list--single { - @apply p-0 !important; -} - -.standard .choices__item { - @apply my-0 cursor-pointer rounded border-0 bg-white px-2 py-1 text-sm text-gray-500 !important; -} - -.standard .choices__item.choices__item--choice { - @apply rounded-none py-2 !important; -} - -.standard .choices__item.choices__item--choice.choices__item--selectable { - @apply rounded-none bg-white p-2 text-gray-500 !important; -} - -.standard .choices__item.choices__item--choice.choices__item--selectable:hover { - @apply bg-white !important; -} - -.standard .choices__item.choices__item--selectable { - @apply border-green-500 bg-green-500 text-white !important; -} - -.standard .choices__item.is-highlighted { - @apply border-green-600 bg-green-600 text-white !important; -} - -.standard .choices[data-type*='select-one']:after { - border-color: var(--color-input-border) transparent transparent transparent !important; -} - -.standard .choices[data-type*='select-one'] .choices__input { - @apply rounded-none border-b-2 border-gray-300 !important; -} - -.standard .choices__item.choices__item--choice.choices__item--selectable.is-highlighted, -.standard .choices__item.choices__item--choice.is-selected.choices__item--selectable { - @apply border-green-500 bg-green-500 text-white !important; -} diff --git a/resources/css/tag.css b/resources/css/tag.css index 939763ba..9cea98ca 100644 --- a/resources/css/tag.css +++ b/resources/css/tag.css @@ -1,99 +1,103 @@ .brand-laravel { - color: var(--brand-laravel); + color: var(--laravel); } .brand-alpinejs { - color: var(--brand-alpinejs); + color: var(--alpinejs); } .brand-javascript { - color: var(--brand-javascript); + color: var(--javascript); } .brand-typesript { - color: var(--brand-typesript); + color: var(--typesript); } .brand-react { - color: var(--brand-react); + color: var(--react); } .brand-vue-js { - color: var(--brand-vue-js); + color: var(--vue-js); } .brand-php { - color: var(--brand-php); + color: var(--php); } .brand-digital-ocean { - color: var(--brand-digital-ocean); + color: var(--digital-ocean); } .brand-forge { - color: var(--brand-forge); + color: var(--forge); } .brand-packages { - color: var(--brand-packages); + color: var(--packages); } .brand-outils { - color: var(--brand-outils); + color: var(--outils); } .brand-tailwindcss { - color: var(--brand-tailwindcss); + color: var(--tailwindcss); } .brand-design { - color: var(--brand-design); + color: var(--design); } .brand-open-source { - color: var(--brand-open-source); + color: var(--open-source); } .brand-freelance { - color: var(--brand-freelance); + color: var(--freelance); } .brand-salaire { - color: var(--brand-salaire); + color: var(--salaire); } .brand-projets { - color: var(--brand-projets); + color: var(--projets); } .brand-entrepreneuriat { - color: var(--brand-entrepreneuriat); + color: var(--entrepreneuriat); } .brand-paiement-en-ligne { - color: var(--brand-paiement-en-ligne); + color: var(--paiement-en-ligne); } .brand-branding { - color: var(--brand-branding); + color: var(--branding); } .brand-applications { - color: var(--brand-applications); + color: var(--applications); } .brand-event { - color: var(--brand-event); + color: var(--event); } .brand-tutoriel { - color: var(--brand-tutoriel); + color: var(--tutoriel); } .brand-communaute { - color: var(--brand-communaute); + color: var(--communaute); } .brand-astuces { - color: var(--brand-astuces); + color: var(--astuces); +} + +.is-channel { + @apply dark:border-white/20 dark:text-[var(--channel-color)] [&_svg]:dark:hover:fill-white dark:hover:text-white; } diff --git a/resources/css/torchlight.css b/resources/css/torchlight.css index 0919ba5f..7a3336fc 100644 --- a/resources/css/torchlight.css +++ b/resources/css/torchlight.css @@ -3,7 +3,7 @@ overflow-x-auto is recommended. */ pre { - @apply my-4 overflow-x-auto rounded; + @apply my-4 overflow-x-auto rounded-lg; padding: 0 !important; } @@ -14,7 +14,7 @@ pre { colors extend edge to edge. */ pre code.torchlight { - @apply block min-w-max py-6; + @apply block min-w-max py-6 max-h-[43.75rem]; } /* diff --git a/resources/js/app.js b/resources/js/app.js index 1558b9d9..c5a9bfb2 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1,4 +1,5 @@ import { Livewire, Alpine } from '../../vendor/livewire/livewire/dist/livewire.esm' +import '../../vendor/laravelcm/livewire-slide-overs/resources/js/slide-over'; import intersect from '@alpinejs/intersect' import Tooltip from '@ryangjchandler/alpine-tooltip' diff --git a/resources/views/components/ads.blade.php b/resources/views/components/ads.blade.php index 2413451d..1f0eef31 100644 --- a/resources/views/components/ads.blade.php +++ b/resources/views/components/ads.blade.php @@ -1,26 +1,23 @@ @php($ads = Illuminate\Support\Arr::random(config('lcm.ads')))
- + {{ $ads['alt'] }} -

- - {{ $ads['description'] }} - +

+ {{ __($ads['description']) }}

diff --git a/resources/views/components/buttons/default.blade.php b/resources/views/components/buttons/default.blade.php index 246d616f..f0cd4d26 100644 --- a/resources/views/components/buttons/default.blade.php +++ b/resources/views/components/buttons/default.blade.php @@ -1,5 +1,5 @@ @php - $classes = 'inline-flex justify-center py-2 px-4 bg-white border-0 ring-1 ring-gray-200 rounded-lg shadow-sm text-sm text-gray-700 hover:text-gray-900 dark:text-gray-400 hover:bg-gray-50/50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-white focus:ring-green-500 dark:bg-gray-800 dark:focus:ring-offset-gray-900'; + $classes = 'inline-flex justify-center py-2 px-4 bg-white border-0 ring-1 ring-gray-200 dark:ring-white/20 rounded-lg shadow-sm text-sm text-gray-700 hover:text-gray-900 dark:text-gray-400 hover:bg-white/50 dark:hover:bg-white/10 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-white focus:ring-green-500 dark:bg-gray-800 dark:focus:ring-offset-gray-900'; @endphp @if ($attributes->hasAny(['href', ':href'])) diff --git a/resources/views/components/buttons/submit.blade.php b/resources/views/components/buttons/submit.blade.php index 04f76acf..7506ea82 100644 --- a/resources/views/components/buttons/submit.blade.php +++ b/resources/views/components/buttons/submit.blade.php @@ -1,13 +1,13 @@ @props([ - 'title', + 'title' => null, ]) twMerge(['class' => 'data-[loading]:pointer-events-none']) }} + {{ $attributes->twMerge(['class' => 'relative data-[loading]:pointer-events-none']) }} > - - {{ $title }} + + {{ $title ?? $slot }} diff --git a/resources/views/components/discord.blade.php b/resources/views/components/discord.blade.php index 401d9ef2..5aff6c10 100644 --- a/resources/views/components/discord.blade.php +++ b/resources/views/components/discord.blade.php @@ -1,11 +1,6 @@ -
- - +
+ + @@ -13,12 +8,11 @@ class="h-12 w-auto text-[#5865F2]" d="M191.4 36.9h-134c-11.3 0-20.5 9.2-20.5 20.5v134c0 11.3 9.2 20.5 20.5 20.5h113.4l-5.3-18.3 12.8 11.8 12.1 11.1 21.6 18.7V57.4c-.1-11.3-9.3-20.5-20.6-20.5zm-38.6 129.5s-3.6-4.3-6.6-8c13.1-3.7 18.1-11.8 18.1-11.8-4.1 2.7-8 4.6-11.5 5.9-5 2.1-9.8 3.4-14.5 4.3-9.6 1.8-18.4 1.3-25.9-.1-5.7-1.1-10.6-2.6-14.7-4.3-2.3-.9-4.8-2-7.3-3.4-.3-.2-.6-.3-.9-.5-.2-.1-.3-.2-.4-.2-1.8-1-2.8-1.7-2.8-1.7s4.8 7.9 17.5 11.7c-3 3.8-6.7 8.2-6.7 8.2-22.1-.7-30.5-15.1-30.5-15.1 0-31.9 14.4-57.8 14.4-57.8 14.4-10.7 28-10.4 28-10.4l1 1.2c-18 5.1-26.2 13-26.2 13s2.2-1.2 5.9-2.8c10.7-4.7 19.2-5.9 22.7-6.3.6-.1 1.1-.2 1.7-.2 6.1-.8 13-1 20.2-.2 9.5 1.1 19.7 3.9 30.1 9.5 0 0-7.9-7.5-24.9-12.6l1.4-1.6s13.7-.3 28 10.4c0 0 14.4 25.9 14.4 57.8 0-.1-8.4 14.3-30.5 15zM303.8 79.7h-33.2V117l22.1 19.9v-36.2h11.8c7.5 0 11.2 3.6 11.2 9.4v27.7c0 5.8-3.5 9.7-11.2 9.7h-34v21.1h33.2c17.8.1 34.5-8.8 34.5-29.2v-29.8c.1-20.8-16.6-29.9-34.4-29.9zm174 59.7v-30.6c0-11 19.8-13.5 25.8-2.5l18.3-7.4c-7.2-15.8-20.3-20.4-31.2-20.4-17.8 0-35.4 10.3-35.4 30.3v30.6c0 20.2 17.6 30.3 35 30.3 11.2 0 24.6-5.5 32-19.9l-19.6-9c-4.8 12.3-24.9 9.3-24.9-1.4zM417.3 113c-6.9-1.5-11.5-4-11.8-8.3.4-10.3 16.3-10.7 25.6-.8l14.7-11.3c-9.2-11.2-19.6-14.2-30.3-14.2-16.3 0-32.1 9.2-32.1 26.6 0 16.9 13 26 27.3 28.2 7.3 1 15.4 3.9 15.2 8.9-.6 9.5-20.2 9-29.1-1.8l-14.2 13.3c8.3 10.7 19.6 16.1 30.2 16.1 16.3 0 34.4-9.4 35.1-26.6 1-21.7-14.8-27.2-30.6-30.1zm-67 55.5h22.4V79.7h-22.4v88.8zM728 79.7h-33.2V117l22.1 19.9v-36.2h11.8c7.5 0 11.2 3.6 11.2 9.4v27.7c0 5.8-3.5 9.7-11.2 9.7h-34v21.1H728c17.8.1 34.5-8.8 34.5-29.2v-29.8c0-20.8-16.7-29.9-34.5-29.9zm-162.9-1.2c-18.4 0-36.7 10-36.7 30.5v30.3c0 20.3 18.4 30.5 36.9 30.5 18.4 0 36.7-10.2 36.7-30.5V109c0-20.4-18.5-30.5-36.9-30.5zm14.4 60.8c0 6.4-7.2 9.7-14.3 9.7-7.2 0-14.4-3.1-14.4-9.7V109c0-6.5 7-10 14-10 7.3 0 14.7 3.1 14.7 10v30.3zM682.4 109c-.5-20.8-14.7-29.2-33-29.2h-35.5v88.8h22.7v-28.2h4l20.6 28.2h28L665 138.1c10.7-3.4 17.4-12.7 17.4-29.1zm-32.6 12h-13.2v-20.3h13.2c14.1 0 14.1 20.3 0 20.3z" /> -

- Laravel Cameroun Discord - - Rejoignez le serveur Discord de la communauté et connectez-vous avec d'autres développeurs partageant - les mêmes objectifs ! - -

+
+
{{ __('global.discord.title') }}
+

+ {{ __('global.discord.description') }} +

+
diff --git a/resources/views/components/dropdown-profile.blade.php b/resources/views/components/dropdown-profile.blade.php index 08283f99..643a5756 100644 --- a/resources/views/components/dropdown-profile.blade.php +++ b/resources/views/components/dropdown-profile.blade.php @@ -1,8 +1,17 @@ -
+@php + $user = \Illuminate\Support\Facades\Auth::user(); +@endphp + +
@@ -23,7 +32,7 @@ class="flex rounded-full bg-skin-menu text-sm focus:outline-none focus:ring-2 fo x-transition:leave="transition duration-75 ease-in" x-transition:leave-start="scale-100 transform opacity-100" x-transition:leave-end="scale-95 transform opacity-0" - class="absolute right-0 mt-2 w-60 origin-top-right divide-y divide-skin-light rounded-md bg-skin-menu py-1 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none" + class="absolute -right-4 mt-2 w-60 origin-top-right divide-y divide-gray-200 dark:divide-white/20 rounded-lg bg-white py-1 shadow ring-1 ring-black ring-opacity-5 dark:bg-gray-800 dark:ring-white/20 focus:outline-none" x-ref="menu" role="menu" aria-orientation="vertical" @@ -34,31 +43,34 @@ class="absolute right-0 mt-2 w-60 origin-top-right divide-y divide-skin-light ro @keyup.space.prevent="open = false;" style="display: none" > -
-

Connecté en tant que

-

- {{ Auth::user()->email }} +

+

+ {{ __('global.signed_as') }} +

+

+ {{ $user->email }}

- @if (Auth::user()->hasRole(['admin', 'moderator'])) -
- hasRole(['admin', 'moderator'])) + @endif - @feature('job_profile') + {{--@feature('job_profile')
Profil Développeur
@@ -80,7 +92,8 @@ class="group flex items-center py-1.5 text-sm font-normal text-gray-500 dark:tex id="user-menu-item-0" >
- @endfeature + @endfeature--}} -
- + - - Tableau de bord - - - + - - Paramètres - -
+
diff --git a/resources/views/components/footer-link.blade.php b/resources/views/components/footer-link.blade.php index 30cfc6aa..47616c3f 100644 --- a/resources/views/components/footer-link.blade.php +++ b/resources/views/components/footer-link.blade.php @@ -1,16 +1,10 @@ @props([ 'title', 'url', - 'soon' => false, ])
  • - + {{ $title }} - @if ($soon) - - {{ __('global.soon') }} - - @endif
  • diff --git a/resources/views/components/form-slider-over.blade.php b/resources/views/components/form-slider-over.blade.php new file mode 100644 index 00000000..8884f4fb --- /dev/null +++ b/resources/views/components/form-slider-over.blade.php @@ -0,0 +1,46 @@ +@props([ + 'action', + 'title', + 'description' => null, +]) + +
    + +
    + + {{ __('actions.cancel') }} + + +
    +
    diff --git a/resources/views/components/forum/channel.blade.php b/resources/views/components/forum/channel.blade.php index 932f61b6..6323b43d 100644 --- a/resources/views/components/forum/channel.blade.php +++ b/resources/views/components/forum/channel.blade.php @@ -3,10 +3,10 @@ ]) twMerge(['class' => 'inline-flex items-center gap-2 rounded-full text-gray-900 border border-gray-200 px-2.5 py-1 text-sm font-medium leading-none transition duration-200 ease-in-out dark:text-white']) }} > diff --git a/resources/views/components/forum/channels-grid.blade.php b/resources/views/components/forum/channels-grid.blade.php new file mode 100644 index 00000000..fe97956f --- /dev/null +++ b/resources/views/components/forum/channels-grid.blade.php @@ -0,0 +1,29 @@ +@props([ + 'channels', +]) + +
    twMerge(['class' => 'mt-5 grid gap-4 lg:grid-cols-2']) }}> + @foreach($channels as $channel) +
    +
    +
    + @if($channel->color) + + @endif + + {{ $channel->name }} + + +
    + + {{ __('pages/forum.threads_count', ['count' => $channel->threads_count]) }} + +
    + @if($channel->description) +

    + {{ $channel->description }} +

    + @endif +
    + @endforeach +
    diff --git a/resources/views/components/forum/thread-author.blade.php b/resources/views/components/forum/thread-author.blade.php index 30944f45..eda332b4 100644 --- a/resources/views/components/forum/thread-author.blade.php +++ b/resources/views/components/forum/thread-author.blade.php @@ -1,3 +1,5 @@ +{{-- @deprecated: A supprimer --}} + @props([ 'author', ]) diff --git a/resources/views/components/forum/thread-channels.blade.php b/resources/views/components/forum/thread-channels.blade.php new file mode 100644 index 00000000..5a35e818 --- /dev/null +++ b/resources/views/components/forum/thread-channels.blade.php @@ -0,0 +1,20 @@ +@props([ + 'thread', +]) + +@if (count($channels = $thread->channels->load('parent'))) +
    twMerge(['class' => 'flex mb-2 flex-wrap gap-1.5']) }}> + @foreach ($channels as $channel) + @php + $color = $channel->parent_id ? $channel->parent->color : $channel->color; + @endphp + + + + @endforeach +
    +@endif diff --git a/resources/views/components/forum/thread-metadata.blade.php b/resources/views/components/forum/thread-metadata.blade.php new file mode 100644 index 00000000..bc443478 --- /dev/null +++ b/resources/views/components/forum/thread-metadata.blade.php @@ -0,0 +1,27 @@ +@props([ + 'thread', + 'vertical' => false, +]) + +
    class([ + 'flex items-center gap-2 text-sm', + 'flex-col' => $vertical +]) }}> +

    $vertical + ])> +

    + +

    $vertical + ])> +

    +
    diff --git a/resources/views/components/forum/thread-overview.blade.php b/resources/views/components/forum/thread-overview.blade.php deleted file mode 100644 index 45c3f081..00000000 --- a/resources/views/components/forum/thread-overview.blade.php +++ /dev/null @@ -1,113 +0,0 @@ -@props([ - 'thread', -]) - -
    -
    -
    -
    - -
    - @if (count($channels = $thread->channels->load('parent'))) -
    - @foreach ($channels as $channel) - - - - @endforeach -
    - @endif -
    -
    -

    - {{ $thread->subject() }} -

    -
    - -
    -
    - -

    - - - - {{ count($thread->replies) }} - {{ __('réponses') }} -

    -

    - - - - - {{ $thread->views_count }} - {{ __('vues') }} -

    -
    -
    -

    - @if ($thread->isSolved()) - - - - - {{ __('Résolu') }} - - @endif -

    -
    -
    -
    -
    diff --git a/resources/views/components/forum/thread.blade.php b/resources/views/components/forum/thread.blade.php index 381a1a75..9c47a765 100644 --- a/resources/views/components/forum/thread.blade.php +++ b/resources/views/components/forum/thread.blade.php @@ -2,129 +2,46 @@ 'thread', ]) -
    - @canany([App\Policies\ThreadPolicy::UPDATE, App\Policies\ThreadPolicy::DELETE], $thread) -
    -
    -
    -
    - -
    +
    + - -
    -
    +
    +
    + + + + {{ '@' . $thread->user->username }} + + + + {{ __('global.ask') }} + +
    - @endcanany -
    - -
    -
    - +
    -
    + diff --git a/resources/views/components/guirlandes.blade.php b/resources/views/components/guirlandes.blade.php deleted file mode 100644 index aaeffd64..00000000 --- a/resources/views/components/guirlandes.blade.php +++ /dev/null @@ -1,12 +0,0 @@ -
    -
    -
    diff --git a/resources/views/components/info-panel.blade.php b/resources/views/components/info-panel.blade.php index bd4ec476..31015794 100644 --- a/resources/views/components/info-panel.blade.php +++ b/resources/views/components/info-panel.blade.php @@ -1,9 +1,9 @@ -
    merge(['class' => 'rounded-md bg-blue-50 p-4']) }}> +
    twMerge(['class' => 'rounded-lg bg-gray-100 ring-1 ring-gray-200 p-4 dark:bg-gray-800 dark:ring-white/20']) }}>
    - +
    -
    +
    {{ $slot }}
    diff --git a/resources/views/components/layouts/footer.blade.php b/resources/views/components/layouts/footer.blade.php index e6b5cf75..c8022351 100644 --- a/resources/views/components/layouts/footer.blade.php +++ b/resources/views/components/layouts/footer.blade.php @@ -1,103 +1,105 @@ -
    +

    {{ __('global.footer.title') }}

    -
    -
    -
    -
    -
    -
    -

    - {{ __('global.footer.resources') }} -

    - -
    -
    -

    - {{ __('global.footer.legal') }} -

    -
      - - - - -
    -
    -
    -
    -
    -

    - {{ __('global.joins_us.title') }} -

    -

    - {{ __('global.joins_us.description') }}

    -
    - - - - - - +
    +
    +

    + {{ __('global.footer.resources') }} +

    +
      + + + + +
    +
    +
    +

    + {{ __('global.footer.legal') }} +

    +
      + + + + +
    +
    +
    +
    +
    +

    + {{ __('global.joins_us.title') }} +

    +

    + {{ __('global.joins_us.description') }} +

    +
    +
    + + + + + + +
    -
    -
    -

    - {{ __('global.footer.copyright', ['date' => date('Y')]) }} -

    -
    - - Twitter - +
    +

    + {{ __('global.footer.copyright', ['date' => date('Y')]) }} +

    +
    + + Twitter + - - Facebook - + + Facebook + - - LinkedIn - + + LinkedIn + - - GitHub - + + GitHub + - - YouTube - + + YouTube + +
    -
    +
    diff --git a/resources/views/components/layouts/header.blade.php b/resources/views/components/layouts/header.blade.php index 70aaec63..abb01535 100644 --- a/resources/views/components/layouts/header.blade.php +++ b/resources/views/components/layouts/header.blade.php @@ -1,4 +1,4 @@ -
    twMerge(['class' => 'relative z-10 backdrop-blur-sm bg-white lg:bg-transparent']) }}> +
    twMerge(['class' => 'relative z-10 bg-white lg:bg-transparent']) }}>
    -
    +
    @include('partials._search') diff --git a/resources/views/components/link.blade.php b/resources/views/components/link.blade.php index c3ffd72d..5d711982 100644 --- a/resources/views/components/link.blade.php +++ b/resources/views/components/link.blade.php @@ -1,3 +1,3 @@ - + {{ $slot }} diff --git a/resources/views/components/nav-link.blade.php b/resources/views/components/nav-link.blade.php deleted file mode 100644 index 39872f8e..00000000 --- a/resources/views/components/nav-link.blade.php +++ /dev/null @@ -1,14 +0,0 @@ -@props([ - 'active', -]) - -@php - $classes = - $active ?? false - ? 'group flex items-center rounded-md bg-green-100 px-3 py-2 font-sans text-sm font-medium text-green-800 transition duration-150 ease-in-out' - : 'group flex items-center rounded-md px-3 py-2 font-sans text-sm font-medium text-gray-500 dark:text-gray-400 transition duration-150 ease-in-out hover:bg-skin-card'; -@endphp - -twMerge(['class' => $classes]) }}> - {{ $slot }} - diff --git a/resources/views/components/nav/forum-link.blade.php b/resources/views/components/nav/forum-link.blade.php new file mode 100644 index 00000000..2ac67ef5 --- /dev/null +++ b/resources/views/components/nav/forum-link.blade.php @@ -0,0 +1,30 @@ +@props([ + 'active' => false, + 'href' => '#', + 'icon', +]) + +@php + $activeClasses = $active + ? 'ring-1 ring-gray-200 text-gray-900 bg-gray-100 dark:bg-gray-800 dark:text-white dark:ring-white/10' + : 'text-gray-500 hover:text-gray-900 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-white'; + + $iconClasses = $active + ? 'size-5 text-primary-600 dark:text-primary-500' + : 'size-5 text-gray-400 dark:text-gray-500'; +@endphp + +class([ + 'group flex items-center gap-2 py-2 px-3 rounded-lg text-sm font-medium transition duration-200 ease-in-out', + $activeClasses + ]) }} +> + @if($icon instanceof \Illuminate\View\ComponentAttributeBag) + {{ $icon }} + @else + @svg($icon, $iconClasses, ['stroke-width' => '1.5', 'aria-hidden' => true]) + @endif + {{ $slot }} + diff --git a/resources/views/components/section-header.blade.php b/resources/views/components/section-header.blade.php index 9be5799b..33226faf 100644 --- a/resources/views/components/section-header.blade.php +++ b/resources/views/components/section-header.blade.php @@ -4,6 +4,6 @@ ])
    -

    {{ $title }}

    +

    {{ $title }}

    {{ $content }}

    diff --git a/resources/views/components/skeleton.blade.php b/resources/views/components/skeleton.blade.php index de953cc0..02b356af 100644 --- a/resources/views/components/skeleton.blade.php +++ b/resources/views/components/skeleton.blade.php @@ -1,11 +1,11 @@ -
    +
    -
    +
    -
    -
    -
    +
    +
    +
    diff --git a/resources/views/components/soon.blade.php b/resources/views/components/soon.blade.php deleted file mode 100644 index eef97e88..00000000 --- a/resources/views/components/soon.blade.php +++ /dev/null @@ -1 +0,0 @@ -Bientôt diff --git a/resources/views/components/status-message.blade.php b/resources/views/components/status-message.blade.php index b64bdb53..b169a91b 100644 --- a/resources/views/components/status-message.blade.php +++ b/resources/views/components/status-message.blade.php @@ -1,5 +1,5 @@ @if (session('status')) -
    merge(['class' => 'rounded-md bg-green-50 p-4']) }}> +
    merge(['class' => 'rounded-lg bg-green-50 p-4 dark:bg-green-800/20']) }}>
    + + diff --git a/resources/views/faq.blade.php b/resources/views/faq.blade.php index bb61ae99..c61efee7 100644 --- a/resources/views/faq.blade.php +++ b/resources/views/faq.blade.php @@ -68,7 +68,7 @@

    Mais la communauté dispose aussi d'un groupe - Telegram + Telegram et d'un groupe WhatsApp (limite par les règles de gestion de groupe de WhatsApp) qui sont accessibles par tous.

    @@ -264,7 +264,7 @@

    Mais la communauté dispose aussi d'un groupe - Telegram + Telegram et d'un groupe WhatsApp (limite par les règles de gestion de groupe de WhatsApp) qui sont accessibles par tous.

    @@ -487,7 +487,7 @@

    Mais la communauté dispose aussi d'un groupe - Telegram + Telegram et d'un groupe WhatsApp (limite par les règles de gestion de groupe de WhatsApp) qui sont accessibles par tous.

    diff --git a/resources/views/forum/_channels.blade.php b/resources/views/forum/_channels.blade.php deleted file mode 100644 index a4b1392b..00000000 --- a/resources/views/forum/_channels.blade.php +++ /dev/null @@ -1,80 +0,0 @@ - diff --git a/resources/views/forum/_moderators.blade.php b/resources/views/forum/_moderators.blade.php deleted file mode 100644 index 26ea3d9c..00000000 --- a/resources/views/forum/_moderators.blade.php +++ /dev/null @@ -1,36 +0,0 @@ -
    -
    -
    -

    Modérateurs

    -
    -
      - @foreach ($moderators as $moderator) -
    • -
      -
      - -
      -
      -

      - {{ $moderator->name }} -

      -

      - {{ '@' . $moderator->username }} -

      -
      - -
      -
    • - @endforeach -
    -
    -
    -
    -
    diff --git a/resources/views/forum/_top-members.blade.php b/resources/views/forum/_top-members.blade.php deleted file mode 100644 index e69de29b..00000000 diff --git a/resources/views/forum/create.blade.php b/resources/views/forum/create.blade.php deleted file mode 100644 index 96b43592..00000000 --- a/resources/views/forum/create.blade.php +++ /dev/null @@ -1,18 +0,0 @@ - -
    -
    -
    -

    Créer un sujet

    -

    - Assurez-vous d'avoir lu nos - - règles de conduite - - avant de continuer. -

    -
    - - -
    -
    -
    diff --git a/resources/views/forum/edit.blade.php b/resources/views/forum/edit.blade.php deleted file mode 100644 index 2f0ee170..00000000 --- a/resources/views/forum/edit.blade.php +++ /dev/null @@ -1,18 +0,0 @@ - -
    -
    -
    -

    Modifier mon sujet

    -

    - Assurez-vous d'avoir lu nos - - règles de conduite - - avant de continuer. -

    -
    - - -
    -
    -
    diff --git a/resources/views/forum/index.blade.php b/resources/views/forum/index.blade.php deleted file mode 100644 index 4e484fb3..00000000 --- a/resources/views/forum/index.blade.php +++ /dev/null @@ -1,45 +0,0 @@ -@php(($subTitle = isset($channel) ? $channel->name : null)) - - - -
    -
    - @include('forum._channels') -
    - -
    - - -
    - -
    - -
    -
    -
    - @foreach ($threads as $thread) - - @endforeach - -
    - {{ $threads->links() }} -
    -
    -
    - - -
    -
    -
    diff --git a/resources/views/forum/thread.blade.php b/resources/views/forum/thread.blade.php deleted file mode 100644 index 59f5cc96..00000000 --- a/resources/views/forum/thread.blade.php +++ /dev/null @@ -1,158 +0,0 @@ - - -
    - -
    -

    - {{ $thread->subject() }} -

    - -
    -
    -
    - - - {{ '@' . $thread->user->username }} - - - - a posé - - - - dans -
    -
    -
    - @if (count($channels = $thread->channels->load('parent'))) -
    - @foreach ($channels as $channel) - - - - @endforeach -
    - @endif -
    - @if ($thread->isSolved()) -
    - - - - Résolu - -
    - @endif -
    -
    -
    - - - - - - @if ($thread->replies->isNotEmpty()) -
    -
      - @foreach ($thread->replies as $reply) - - @endforeach -
    -
    - @endif - - @can(App\Policies\ReplyPolicy::CREATE, App\Models\Reply::class) - @if ($thread->isConversationOld()) - -

    - La dernière réponse à ce sujet remonte à plus de six mois. Pensez à ouvrir un nouveau - sujet si vous avez une question similaire. -

    -

    - - Créer un nouveau sujet - - -

    -
    - @else -
    - -
    - @endif - @else - @guest -

    - Veuillez vous - - connecter - - ou - - créer un compte - - pour participer à cette conversation. -

    - @else -
    -

    Vous devrez vérifier votre compte avant de participer à cette conversation.

    - -
    - @csrf - - Recevoir un lien - - -
    -
    - @endguest - @endcan -
    -
    -
    -
    diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index 975e738f..13368147 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -27,7 +27,7 @@ class="inline-flex items-center rounded-full bg-green-700 p-1 pr-2 text-white sm

    @auth - + {{ __('actions.new_thread') }} @else diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index ece9960c..73dd74bc 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -44,6 +44,7 @@ {{-- @livewire('livewire-ui-spotlight') --}} @livewire('wire-elements-modal') @livewire(\Filament\Notifications\Livewire\Notifications::class) + @livewire(\Laravelcm\LivewireSlideOvers\SlideOverPanel::class) @filamentScripts @livewireScriptConfig diff --git a/resources/views/layouts/forum.blade.php b/resources/views/layouts/forum.blade.php new file mode 100644 index 00000000..b33b0b94 --- /dev/null +++ b/resources/views/layouts/forum.blade.php @@ -0,0 +1,99 @@ + + @php + $isLogged = \Illuminate\Support\Facades\Auth::check(); + @endphp + + +
    + + +
    $isLogged, + 'lg:col-span-6' => ! $isLogged, + ])> + {{ $slot }} +
    + + @guest + + @endguest +
    +
    +
    diff --git a/resources/views/livewire/articles/_form.blade.php b/resources/views/livewire/articles/_form.blade.php index da0239d5..261089c1 100644 --- a/resources/views/livewire/articles/_form.blade.php +++ b/resources/views/livewire/articles/_form.blade.php @@ -170,9 +170,9 @@ class="size-6"