From 3579c9dfece42c80634b7d3ea2bdd37079f7c19d Mon Sep 17 00:00:00 2001 From: Kevin L'Hereec Date: Thu, 23 Jul 2026 11:10:17 +0200 Subject: [PATCH] refactor: uniform validation, fix create form UX, dedupe filter dropdowns - Remove dead registerValidator (Auth/register.ts), unused since signupValidator is the one actually wired to NewAccountController - computers/create.vue: switch to useForm() + @submit.prevent so the form submits on Enter and shows a processing state, matching components/create.vue - components/edit.vue: drop the 'origin' field, which was never provided by the backend (edit() never shared it) and therefore always undefined - Extract FilterDropdown.vue and reuse it in ComponentsViewer/ComputersViewer, removing ~80 lines of duplicated dropdown markup/logic and fixing duplicate HTML ids (id="used" appeared twice in ComputersViewer) - Move MIGRATION_*.md artifacts into docs/migration-history/ --- .adonisjs/server/pages.d.ts | 1 + app/validators/Auth/register.ts | 15 -- .../migration-history/MIGRATION_CHECKLIST.md | 0 .../migration-history/MIGRATION_COMPLETE.md | 0 .../MIGRATION_PAGES_SUMMARY.md | 0 inertia/pages/components/edit.vue | 9 +- inertia/pages/computers/create.vue | 56 ++++-- inertia/pages/widgets/ComponentsViewer.vue | 167 +++--------------- inertia/pages/widgets/ComputersViewer.vue | 105 +++-------- inertia/pages/widgets/FilterDropdown.vue | 72 ++++++++ 10 files changed, 163 insertions(+), 262 deletions(-) delete mode 100644 app/validators/Auth/register.ts rename MIGRATION_CHECKLIST.md => docs/migration-history/MIGRATION_CHECKLIST.md (100%) rename MIGRATION_COMPLETE.md => docs/migration-history/MIGRATION_COMPLETE.md (100%) rename MIGRATION_PAGES_SUMMARY.md => docs/migration-history/MIGRATION_PAGES_SUMMARY.md (100%) create mode 100644 inertia/pages/widgets/FilterDropdown.vue diff --git a/.adonisjs/server/pages.d.ts b/.adonisjs/server/pages.d.ts index f6a826b..d2c4aa1 100644 --- a/.adonisjs/server/pages.d.ts +++ b/.adonisjs/server/pages.d.ts @@ -37,5 +37,6 @@ declare module '@adonisjs/inertia/types' { 'widgets/SimpleGallery': ExtractProps<(typeof import('../../inertia/pages/widgets/SimpleGallery.vue'))['default']> 'widgets/TableComponent': ExtractProps<(typeof import('../../inertia/pages/widgets/TableComponent.vue'))['default']> 'widgets/ValidationError': ExtractProps<(typeof import('../../inertia/pages/widgets/ValidationError.vue'))['default']> + 'widgets/FilterDropdown': ExtractProps<(typeof import('../../inertia/pages/widgets/FilterDropdown.vue'))['default']> } } diff --git a/app/validators/Auth/register.ts b/app/validators/Auth/register.ts deleted file mode 100644 index c5fce1c..0000000 --- a/app/validators/Auth/register.ts +++ /dev/null @@ -1,15 +0,0 @@ -import vine from '@vinejs/vine' - -export const registerValidator = vine.compile( - vine.object({ - name: vine.string().minLength(3).maxLength(64), - email: vine - .string() - .email() - .unique(async (query, field) => { - const user = await query.from('users').where('email', field).first() - return !user - }), - password: vine.string().minLength(8).maxLength(32), - }) -) diff --git a/MIGRATION_CHECKLIST.md b/docs/migration-history/MIGRATION_CHECKLIST.md similarity index 100% rename from MIGRATION_CHECKLIST.md rename to docs/migration-history/MIGRATION_CHECKLIST.md diff --git a/MIGRATION_COMPLETE.md b/docs/migration-history/MIGRATION_COMPLETE.md similarity index 100% rename from MIGRATION_COMPLETE.md rename to docs/migration-history/MIGRATION_COMPLETE.md diff --git a/MIGRATION_PAGES_SUMMARY.md b/docs/migration-history/MIGRATION_PAGES_SUMMARY.md similarity index 100% rename from MIGRATION_PAGES_SUMMARY.md rename to docs/migration-history/MIGRATION_PAGES_SUMMARY.md diff --git a/inertia/pages/components/edit.vue b/inertia/pages/components/edit.vue index 4ca2301..f4f0078 100644 --- a/inertia/pages/components/edit.vue +++ b/inertia/pages/components/edit.vue @@ -3,14 +3,14 @@ import { reactive } from 'vue' import { Link } from '@adonisjs/inertia/vue' import { usePage } from '@inertiajs/vue3' import CustomSelect from '~/pages/widgets/CustomSelect.vue' +import type { Component, ComponentType } from '~/pages/types/UITypes' const { props } = usePage<{ - component: any - types: any[] - origin: string + component: Component + types: ComponentType[] errors?: Record }>() -const { component, types, origin } = props +const { component, types } = props const form = reactive({ id: component.id, @@ -18,7 +18,6 @@ const form = reactive({ price: component.price, typeId: component.type.id, purchaseDate: component.purchaseDate, - origin: origin, }) diff --git a/inertia/pages/computers/create.vue b/inertia/pages/computers/create.vue index 9981a92..28fd668 100644 --- a/inertia/pages/computers/create.vue +++ b/inertia/pages/computers/create.vue @@ -1,11 +1,12 @@ diff --git a/inertia/pages/widgets/ComponentsViewer.vue b/inertia/pages/widgets/ComponentsViewer.vue index 9113335..7934c3f 100644 --- a/inertia/pages/widgets/ComponentsViewer.vue +++ b/inertia/pages/widgets/ComponentsViewer.vue @@ -1,6 +1,7 @@  diff --git a/inertia/pages/widgets/ComputersViewer.vue b/inertia/pages/widgets/ComputersViewer.vue index f955fb4..68a7820 100644 --- a/inertia/pages/widgets/ComputersViewer.vue +++ b/inertia/pages/widgets/ComputersViewer.vue @@ -3,106 +3,45 @@ import { noImagePlaceholder } from '~/assets/images' import { usePage } from '@inertiajs/vue3' import Computer from '#models/computer' import ComputerCard from '~/pages/widgets/ComputerCard.vue' -import { computed, reactive, ref } from 'vue' +import FilterDropdown from '~/pages/widgets/FilterDropdown.vue' +import { computed, ref } from 'vue' const { computers } = usePage<{ computers: Computer[] }>().props -const stateDropdownOpen = ref(false) -function toggleDropdown() { - stateDropdownOpen.value = !stateDropdownOpen.value -} - -const filters = reactive({ +const filters = ref>({ onGoing: true, finished: true, sold: false, }) + +const stateToFilterKey: Record = { + ON_GOING: 'onGoing', + FINISHED: 'finished', + SOLD: 'sold', +} + const filteredComputers = computed(() => { return computers.filter((computer) => { - const isOnGoing = filters.onGoing && computer.state.name == 'ON_GOING' - const isFinished = filters.finished && computer.state.name == 'FINISHED' - const isSold = filters.sold && computer.state.name == 'SOLD' - return isOnGoing || isFinished || isSold + const key = stateToFilterKey[computer.state.name] + return key ? filters.value[key] : false }) }) - - diff --git a/inertia/pages/widgets/FilterDropdown.vue b/inertia/pages/widgets/FilterDropdown.vue new file mode 100644 index 0000000..c89970a --- /dev/null +++ b/inertia/pages/widgets/FilterDropdown.vue @@ -0,0 +1,72 @@ + + +