diff --git a/frontend/src/modules/events/components/EventForm.vue b/frontend/src/modules/events/components/EventForm.vue index bc75b95..aa0f4af 100644 --- a/frontend/src/modules/events/components/EventForm.vue +++ b/frontend/src/modules/events/components/EventForm.vue @@ -53,18 +53,6 @@ const { handleSubmit, values, setValues, setFieldValue } = useForm f !== id) - ) - } else { - setFieldValue('fields', [...current, id]) - } -} - watchEffect(() => { if (props.event) { setValues({ @@ -230,16 +218,39 @@ function removeTag(tagId: string) { - + Linked Fields Choose one or more fields this event uses. diff --git a/frontend/src/modules/events/pages/EventCreatePage.vue b/frontend/src/modules/events/pages/EventCreatePage.vue index fdf3fc0..7ce20f7 100644 --- a/frontend/src/modules/events/pages/EventCreatePage.vue +++ b/frontend/src/modules/events/pages/EventCreatePage.vue @@ -45,7 +45,7 @@ const onSubmit = (values: EventFormValues) => {
- + +import { h, computed } from 'vue' import type { Field } from '@/modules/fields/types' -import Skeleton from '@/shared/ui/skeleton/Skeleton.vue' -import Checkbox from '@/shared/ui/checkbox/Checkbox.vue' +import type { ColumnDef } from '@tanstack/vue-table' +import { Checkbox } from '@/shared/ui/checkbox' +import { Input } from '@/shared/ui/input' +import { useDataTable } from '@/shared/composables/useDataTable' +import DataTable from '@/shared/components/data/DataTable.vue' +import DataTableSkeleton from '@/shared/components/skeletons/DataTableSkeleton.vue' +import CompactDataTablePagination from '@/shared/components/data/CompactDataTablePagination.vue' +import DataTableColumnHeader from '@/shared/components/data/DataTableColumnHeader.vue' -defineProps<{ +const props = defineProps<{ fields: Field[] - selectedIds: number[] + selectedIds?: number[] isLoading?: boolean }>() const emit = defineEmits<{ (e: 'toggle', id: number): void + (e: 'toggleAll', ids: number[], selected: boolean): void }>() + +const safeSelectedIds = computed(() => props.selectedIds || []) + +const columns = computed[]>(() => [ + { + accessorKey: 'id', + enableHiding: false, + meta: { + class: 'w-[6ch] text-center', + headerClass: 'w-[6ch] text-center', + }, + header: ({ column }) => + h(DataTableColumnHeader, { + column, + title: 'ID', + align: 'center', + }), + cell: ({ row }) => h('div', { class: 'text-center font-medium' }, row.original.id), + }, + { + accessorKey: 'name', + enableHiding: false, + header: ({ column }) => h(DataTableColumnHeader, { column, title: 'Name' }), + cell: ({ row }) => + h( + 'div', + { + class: 'truncate whitespace-nowrap overflow-hidden text-left font-medium', + title: row.original.name, + }, + row.original.name + ), + }, + { + id: 'selection', + enableHiding: false, + header: ({ table }) => { + const rows = table.getFilteredRowModel().rows + const allIds = rows.map(r => r.original.id) + const isAllSelected = + allIds.length > 0 && allIds.every(id => safeSelectedIds.value.includes(id)) + const isSomeSelected = allIds.some(id => safeSelectedIds.value.includes(id)) + + return h( + 'div', + { class: 'flex justify-end pr-6' }, + h(Checkbox, { + modelValue: isAllSelected || (isSomeSelected && 'indeterminate'), + 'onUpdate:modelValue': (value: boolean | 'indeterminate') => + emit('toggleAll', allIds, value === true), + ariaLabel: 'Select all', + }) + ) + }, + cell: ({ row }) => + h( + 'div', + { class: 'flex justify-end pr-6' }, + h(Checkbox, { + modelValue: safeSelectedIds.value.includes(row.original.id), + 'onUpdate:modelValue': () => emit('toggle', row.original.id), + ariaLabel: 'Select field', + }) + ), + }, +]) + +const { table } = useDataTable({ + data: () => props.fields, + columns: () => columns.value, + defaultPageSize: 5, +}) diff --git a/frontend/src/shared/components/data/CompactDataTablePagination.vue b/frontend/src/shared/components/data/CompactDataTablePagination.vue index 44477cc..b39d051 100644 --- a/frontend/src/shared/components/data/CompactDataTablePagination.vue +++ b/frontend/src/shared/components/data/CompactDataTablePagination.vue @@ -20,7 +20,7 @@ defineProps<{ - + Page {{ table.getState().pagination.pageIndex + 1 }} of {{ table.getPageCount() }} diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json index b133d1e..263fd43 100644 --- a/frontend/tsconfig.app.json +++ b/frontend/tsconfig.app.json @@ -9,7 +9,6 @@ "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, "noUncheckedSideEffectImports": true, - "baseUrl": ".", "paths": { "@/*": ["./src/*"] } diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index ea88f18..40c8716 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -11,6 +11,9 @@ export default defineConfig({ server: { host: true, port: 5173, + watch: { + usePolling: true, + }, }, resolve: {