From becfa30b0a15b372b2b20eabb7645644af79ebcd Mon Sep 17 00:00:00 2001 From: K Muller Date: Wed, 17 Dec 2025 11:21:55 +0100 Subject: [PATCH] feat: :sparkles: add missing relation in crud between Document and DocumentCategory --- .../Controllers/Back/DocumentController.php | 10 ++++-- .../Back/Document/StoreDocumentRequest.php | 2 ++ lang/en/back.php | 3 ++ lang/en/validation.php | 3 +- lang/fr/back.php | 3 ++ lang/fr/validation.php | 3 +- .../ts/back/Components/Inputs/MultiSelect.tsx | 2 +- resources/ts/back/Pages/Document/Form.tsx | 31 +++++++++++++++++-- resources/ts/back/Pages/Document/Show.tsx | 17 ++++++++++ resources/ts/back/types/global.d.ts | 1 + 10 files changed, 67 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Back/DocumentController.php b/app/Http/Controllers/Back/DocumentController.php index 0b75644f..f59a5fa6 100644 --- a/app/Http/Controllers/Back/DocumentController.php +++ b/app/Http/Controllers/Back/DocumentController.php @@ -7,6 +7,7 @@ use App\Enums\YearsEnum; use App\Http\Requests\Back\Document\StoreDocumentRequest; use App\Http\Requests\Back\Document\UpdateDocumentRequest; use App\Models\Document; +use App\Models\DocumentCategory; use App\Models\DocumentTag; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; @@ -92,7 +93,7 @@ class DocumentController extends Controller public function show(Document $document): \Inertia\Response { return Inertia::render('Document/Show', [ - 'data' => CommonResource::make($document->load('tags')), + 'data' => CommonResource::make($document->load('tags', 'categories')), 'modelName' => $this->modelName, 'enumDocumentStatus' => DocumentStatusEnum::toArray(), 'enumYears' => YearsEnum::toArray() @@ -112,6 +113,7 @@ class DocumentController extends Controller $document->inertiaFill($request->validated()); if ($document->saveOrFail()) { $document->tags()->syncWithoutDetaching($request->input('tags', [])); + $document->categories()->syncWithoutDetaching($request->input('categories', [])); return redirect()->route('back.' . $this->modelName . '.edit', $document); } return redirect()->route('back.' . $this->modelName . '.create'); @@ -127,12 +129,13 @@ class DocumentController extends Controller public function edit(Document $document): \Inertia\Response { $documentTags = DocumentTag::all(); - + $documentCategories = DocumentCategory::all(); return Inertia::render('Document/Edit', [ - 'data' => CommonResource::make($document->load('tags')), + 'data' => CommonResource::make($document->load('tags', 'categories')), 'enumDocumentStatus' => DocumentStatusEnum::toArray(), 'enumYears' => YearsEnum::toArray(), 'tags' => $documentTags, + 'categories' => $documentCategories, 'modelName' => $this->modelName ]); } @@ -150,6 +153,7 @@ class DocumentController extends Controller $document->inertiaFill($request->validated()); if ($document->saveOrFail()) { $document->tags()->sync($request->input('tags', [])); + $document->categories()->sync($request->input('categories', [])); return redirect()->route('back.' . $this->modelName . '.edit', $document); } return redirect()->route('back.' . $this->modelName . '.edit', $document); diff --git a/app/Http/Requests/Back/Document/StoreDocumentRequest.php b/app/Http/Requests/Back/Document/StoreDocumentRequest.php index 0b54f666..adf4b007 100644 --- a/app/Http/Requests/Back/Document/StoreDocumentRequest.php +++ b/app/Http/Requests/Back/Document/StoreDocumentRequest.php @@ -48,6 +48,8 @@ class StoreDocumentRequest extends FormRequest 'path' => $this->pictureRules('required|file|mimes:pdf|max:5120'), 'tags' => 'nullable|array', 'tags.*' => 'integer|exists:document_tags,id', + 'categories' => 'nullable|array', + 'categories.*' => 'integer|exists:document_categories,id', ]; } } diff --git a/lang/en/back.php b/lang/en/back.php index 015829cf..e18d2809 100644 --- a/lang/en/back.php +++ b/lang/en/back.php @@ -74,6 +74,9 @@ return [ "exercice" => [ "placeholder" => "choose an exercice" ], + "category" => [ + "placeholder" => "choose a category" + ] ], "form_title_additional_files" => "Additionnal files", "form_subtitle_additional_files" => "Add additionnal files", diff --git a/lang/en/validation.php b/lang/en/validation.php index a6df28bf..e0dd5237 100644 --- a/lang/en/validation.php +++ b/lang/en/validation.php @@ -271,7 +271,8 @@ return [ "document" => [ "exercice" => "exercice|exercices", "tag" => "etiquette|etiquettes", - "path" => "file" + "path" => "file", + "category" => "category|categories" ], "documentTag" => [ "documents" => "associated file(s)" diff --git a/lang/fr/back.php b/lang/fr/back.php index 8e17159d..71b48e87 100644 --- a/lang/fr/back.php +++ b/lang/fr/back.php @@ -73,6 +73,9 @@ return [ "exercice" => [ "placeholder" => "choisir un exercice" ], + "category" => [ + "placeholder" => "choisir une catégorie" + ] ], "form_title_additional_files" => "Fichier supplémentaire", "form_subtitle_additional_files" => "Ajouter des fichiers supplémentaires", diff --git a/lang/fr/validation.php b/lang/fr/validation.php index 38e886ad..967fdbd2 100644 --- a/lang/fr/validation.php +++ b/lang/fr/validation.php @@ -269,7 +269,8 @@ return [ "document" => [ "exercice" => "exercice|exercices", "tag" => "étiquette|étiquettes", - "path" => "fichier" + "path" => "fichier", + "category" => "catégorie|catégories" ], "documentTag" => [ "documents" => "document(s) associé(s)" diff --git a/resources/ts/back/Components/Inputs/MultiSelect.tsx b/resources/ts/back/Components/Inputs/MultiSelect.tsx index 37220824..6015b18a 100644 --- a/resources/ts/back/Components/Inputs/MultiSelect.tsx +++ b/resources/ts/back/Components/Inputs/MultiSelect.tsx @@ -1049,7 +1049,7 @@ export const MultiSelect = forwardRef( } }} aria-label={`Remove ${option.label} from selection`} - className="ml-2 h-4 w-4 cursor-pointer hover:bg-white/20 rounded-sm p-0.5 -m-0.5 focus:outline-none focus:ring-1 focus:ring-white/50"> + className="ml-2 h-4 w-4 cursor-pointer hover:bg-white/20 rounded-sm -m-0.5 focus:outline-none focus:ring-1 focus:ring-white/50"> + + + +
diff --git a/resources/ts/back/Pages/Document/Show.tsx b/resources/ts/back/Pages/Document/Show.tsx index 6a4b8b2f..3fdb8168 100644 --- a/resources/ts/back/Pages/Document/Show.tsx +++ b/resources/ts/back/Pages/Document/Show.tsx @@ -12,6 +12,7 @@ import { useFormatedDate } from "@/hooks/use-formated-value"; import { AppEnv, AuthProp, + DocumentCategoryModel, DocumentModel, DocumentTagModel, SingleResource, @@ -88,6 +89,22 @@ export default function Show({ data, modelName }: { data: SingleResource, modelN ); } + }, + { + accessorKey: "categories", + header: str(useTrans("validation.custom.document.category", {choice:2})).ucFirst().value(), + cell: ({ value }: { value?: DocumentCategoryModel[] }) => { + if (!value || value.length === 0) return null; + + return ( +
+ {value.map((item, i) => ( + + ))} +
+ ); + } + }, { accessorKey: "created_at", diff --git a/resources/ts/back/types/global.d.ts b/resources/ts/back/types/global.d.ts index c26e5279..d1310378 100644 --- a/resources/ts/back/types/global.d.ts +++ b/resources/ts/back/types/global.d.ts @@ -184,6 +184,7 @@ type DocumentModel = { unpublished_at: Date | null; exercice: number | null; tags: DocumentTagModel[]; + categories: DocumentCategoryModel[]; created_at: Date; updated_at: Date; }