From c9b9de2885fd918bbcfae4ceda58c626b0adcf63 Mon Sep 17 00:00:00 2001 From: geni_jaho Date: Tue, 12 Mar 2024 20:59:51 +0100 Subject: [PATCH 1/4] Effort to improve tagging --- .../Controllers/PhotoItemTagsController.php | 2 +- .../Requests/StorePhotoItemTagRequest.php | 3 +- resources/js/Components/TagBox.vue | 10 ++ resources/js/Components/TextInput.vue | 2 +- .../js/Pages/Photos/Partials/PhotoItem.vue | 129 ++++++++---------- resources/js/Pages/Photos/Show.vue | 6 +- .../Feature/Tagging/AddTagToPhotoItemTest.php | 8 +- 7 files changed, 78 insertions(+), 82 deletions(-) diff --git a/app/Http/Controllers/PhotoItemTagsController.php b/app/Http/Controllers/PhotoItemTagsController.php index d5bd6c6f..aabd2c07 100644 --- a/app/Http/Controllers/PhotoItemTagsController.php +++ b/app/Http/Controllers/PhotoItemTagsController.php @@ -15,7 +15,7 @@ public function store(PhotoItem $photoItem, StorePhotoItemTagRequest $request): abort(404); } - $photoItem->tags()->syncWithoutDetaching($request->input('tag_id')); + $photoItem->tags()->syncWithoutDetaching($request->input('tag_ids')); return response()->json(); } diff --git a/app/Http/Requests/StorePhotoItemTagRequest.php b/app/Http/Requests/StorePhotoItemTagRequest.php index ecefe9e1..429ad97e 100644 --- a/app/Http/Requests/StorePhotoItemTagRequest.php +++ b/app/Http/Requests/StorePhotoItemTagRequest.php @@ -15,7 +15,8 @@ class StorePhotoItemTagRequest extends FormRequest public function rules(): array { return [ - 'tag_id' => 'required|exists:tags,id', + 'tag_ids' => 'required|array', + 'tag_ids.*' => 'required|integer|exists:tags,id', ]; } } diff --git a/resources/js/Components/TagBox.vue b/resources/js/Components/TagBox.vue index 825b5c08..b71d7954 100644 --- a/resources/js/Components/TagBox.vue +++ b/resources/js/Components/TagBox.vue @@ -17,6 +17,14 @@ const props = defineProps({ type: Boolean, default: false, }, + nullable: { + type: Boolean, + default: false, + }, + placeholder: { + type: String, + default: '', + }, dropdownWidth: { type: String, default: 'w-full md:w-96 right-0', @@ -59,6 +67,7 @@ onMounted(() => { :modelValue="modelValue" @update:modelValue="value => $emit('update:modelValue', value)" :multiple="multiple" + :nullable="nullable" by="id" >
@@ -67,6 +76,7 @@ onMounted(() => { ref="input" class="w-full rounded-md border-0 bg-white dark:bg-gray-900 py-1.5 pl-3 pr-12 text-gray-900 dark:text-gray-300 shadow-sm ring-1 ring-inset ring-gray-300 dark:ring-gray-700 focus:ring-2 focus:ring-inset focus:ring-indigo-500 dark:focus:ring-indigo-600 sm:text-sm sm:leading-6" :displayValue="(item) => item?.name" + :placeholder="placeholder" @change="query = $event.target.value" @focus="$event.target.select()" autocomplete="off" diff --git a/resources/js/Components/TextInput.vue b/resources/js/Components/TextInput.vue index ff626aa9..bc6b8d79 100644 --- a/resources/js/Components/TextInput.vue +++ b/resources/js/Components/TextInput.vue @@ -21,7 +21,7 @@ defineExpose({ focus: () => input.value.focus() });