From 8e5aba669e5af82bfa4026f9b3df774869ef79ac Mon Sep 17 00:00:00 2001 From: Ivan Skvortsov Date: Mon, 25 Aug 2025 11:49:20 +0300 Subject: [PATCH] feat: url query filters for tables and grids (events, fields, tags) --- .../events/components/EventsDataTable.vue | 18 +- .../src/modules/events/pages/EventsPage.vue | 4 + .../fields/components/FieldsDataTable.vue | 18 +- .../src/modules/fields/pages/FieldsPage.vue | 10 +- .../modules/tags/components/TagsDataGrid.vue | 73 ++++++ frontend/src/modules/tags/pages/TagsPage.vue | 98 ++------ .../shared/composables/useDataTableSync.ts | 186 +++++++++++++++ .../composables/useDataTableWithUrlQuery.ts | 41 ++++ .../src/shared/composables/useUrlFilters.ts | 225 ++++++++++++++++++ frontend/src/shared/types/urlFilters.ts | 47 ++++ frontend/src/shared/utils/tableFilters.ts | 2 +- 11 files changed, 635 insertions(+), 87 deletions(-) create mode 100644 frontend/src/modules/tags/components/TagsDataGrid.vue create mode 100644 frontend/src/shared/composables/useDataTableSync.ts create mode 100644 frontend/src/shared/composables/useDataTableWithUrlQuery.ts create mode 100644 frontend/src/shared/composables/useUrlFilters.ts create mode 100644 frontend/src/shared/types/urlFilters.ts diff --git a/frontend/src/modules/events/components/EventsDataTable.vue b/frontend/src/modules/events/components/EventsDataTable.vue index d02f1d4..60df1f7 100644 --- a/frontend/src/modules/events/components/EventsDataTable.vue +++ b/frontend/src/modules/events/components/EventsDataTable.vue @@ -5,11 +5,12 @@ import { Icon } from '@iconify/vue' import { Button } from '@/shared/ui/button' import DataTablePagination from '@/shared/components/data/DataTablePagination.vue' import DataTable from '@/shared/components/data/DataTable.vue' -import { useDataTable } from '@/shared/composables/useDataTable' import DataTableLayout from '@/shared/components/data/DataTableLayout.vue' +import { useDataTableWithUrlQuery } from '@/shared/composables/useDataTableWithUrlQuery' import DataTableSkeleton from '@/shared/components/skeletons/DataTableSkeleton.vue' import DataTableSingleSelectFilter from '@/shared/components/data/DataTableSingleSelectFilter.vue' import type { Tag } from '@/modules/tags/types' +import type { UrlFiltersReturn, EventsUrlFilters } from '@/shared/types/urlFilters' const props = defineProps<{ columns: ColumnDef[] @@ -17,13 +18,18 @@ const props = defineProps<{ tags: Tag[] isLoading: boolean isLoadingTags: boolean + urlFilters: UrlFiltersReturn }>() -const { table } = useDataTable({ - data: () => props.data, - columns: () => props.columns, - defaultSorting: [{ id: 'id', desc: true }], -}) +const { table } = useDataTableWithUrlQuery( + { + data: () => props.data, + columns: () => props.columns, + defaultSorting: [{ id: 'id', desc: true }], + }, + props.urlFilters, + 'events' +)