From 4ea93fff62843e5b01be8bfcfadb6975cc943693 Mon Sep 17 00:00:00 2001 From: JatinderSingh Date: Thu, 1 Feb 2024 17:31:48 -0800 Subject: [PATCH] Add filters to the datatable --- .../src/components/object/ObjectFilters.vue | 6 +- .../src/components/object/ObjectTable.vue | 99 ++++++++++--------- 2 files changed, 59 insertions(+), 46 deletions(-) diff --git a/frontend/src/components/object/ObjectFilters.vue b/frontend/src/components/object/ObjectFilters.vue index 6a81a2f9..e64a94bc 100644 --- a/frontend/src/components/object/ObjectFilters.vue +++ b/frontend/src/components/object/ObjectFilters.vue @@ -39,6 +39,9 @@ const searching = ref(false); const selectedMetadata: Ref = ref([]); const selectedTags: Ref = ref([]); +// Emits +const emit = defineEmits(['selectedFilters']); + // Store subscriptions objectStore.$onAction(({ name, args }) => { // If someone calls fetchObjects to refresh the table, clear the filter @@ -118,7 +121,8 @@ const selectedFilterValuesChanged = () => { // Get the 'display' property out from selected tag and metadata const metaToSearch: Array = selectedMetadata.value.map(({ ...meta }: any) => meta); const tagSetToSearch: Array = selectedTags.value.map(({ ...tag }: any) => tag); - + console.log(metaToSearch); + emit('selectedFilters', { metaToSearch, tagSetToSearch }); // Search the object store with the tagset as a param and metadata as headers objectStore.fetchObjects( { diff --git a/frontend/src/components/object/ObjectTable.vue b/frontend/src/components/object/ObjectTable.vue index 92cc6331..3fc0a90f 100644 --- a/frontend/src/components/object/ObjectTable.vue +++ b/frontend/src/components/object/ObjectTable.vue @@ -12,7 +12,7 @@ import { } from '@/components/object'; import { SyncButton } from '@/components/common'; import { ShareObjectButton } from '@/components/object/share'; -import { Button, Column, DataTable, Dialog, FilterMatchMode, InputText, useToast } from '@/lib/primevue'; +import { Button, Column, DataTable, Dialog, FilterMatchMode, InputText, useToast, MultiSelect } from '@/lib/primevue'; import { useAuthStore, useObjectStore, usePermissionStore } from '@/store'; import { Permissions } from '@/utils/constants'; import { ButtonMode } from '@/utils/enums'; @@ -55,21 +55,30 @@ const permissionsVisible = ref(false); const permissionsObjectId = ref(''); const permissionsObjectName: Ref = ref(''); const tableData: Ref> = ref([]); - +const dt = ref(); const loading = ref(false); const lazyParams: Ref = ref({}); const totalRecords = ref(0); const first = ref(0); const selectedObjects: any = ref(); +const filters = ref({ + name: { value: undefined, matchMode: 'contains' } +}); + +const initPaginationState = { + first: 0, + rows: 3, + page: 0, + sortField: 'updatedAt', + sortOrder: 'desc', + filters: filters +}; + +const tagset = Array<{ key: string; value: string }>; // Actions const toast = useToast(); -function clearSelected() { - selectAll.value = false; - objectStore.setSelectedObjects([]); -} - const formatShortUuid = (uuid: string) => uuid?.slice(0, 8) ?? uuid; const onDeletedSuccess = () => { toast.success('File deleted'); @@ -97,28 +106,35 @@ async function showPermissions(objectId: string) { } onMounted(() => { loading.value = true; + //lazyParams.value = initPaginationState; + lazyParams.value = { first: 0, - rows: 10, + rows: dt.value.rows, sortField: 'updatedAt', + page: dt.value.page, sortOrder: 'desc', - filters: filters.value + filters: filters //filters.value }; loadLazyData(); }); const loadLazyData = (event?: any) => { - lazyParams.value = { ...lazyParams.value, first: event?.first || first.value }; + lazyParams.value = { ...lazyParams.value, first: event?.first || first.value, page: event?.page || 0 }; + + //console.log(lazyParams); objectService .searchObjects({ bucketId: props.bucketId ? [props.bucketId] : undefined, deleteMarker: false, latest: true, permissions: true, - page: lazyParams.value.page ? lazyParams.value.page + 1 : 1, + page: lazyParams.value?.page ? ++lazyParams.value.page : 1, + name: lazyParams.value?.filters.name.value, limit: lazyParams.value.rows, sort: lazyParams.value.sortField, order: lazyParams.value.sortOrder === 1 ? 'asc' : 'desc' + //tagset: { t1: 't1', t2: 't2' } }) .then((r: any) => { tableData.value = r.data; @@ -126,79 +142,73 @@ const loadLazyData = (event?: any) => { loading.value = false; }); }; -const onPage = (event: any) => { +const onPage = (event?: any) => { lazyParams.value = event; loadLazyData(event); }; -const onSort = (event: any) => { - console.log('sort'); - console.log(event); +const onSort = (event?: any) => { lazyParams.value = event; loadLazyData(event); }; +const onFilter = (event?: any) => { + lazyParams.value.filters = filters; + loadLazyData(event); +}; // Clear selections when navigating away onUnmounted(() => { objectStore.setSelectedObjects([]); }); -// Datatable filter(s) -const filters = ref({ - // Need this till PrimeVue gets it together to un-break this again - // TODO: Revisit with PrimeVue 2.37+ - // @ts-ignore - global: { value: null, matchMode: FilterMatchMode.CONTAINS } -}); +const selectedFilters = (payload: any) => { + payload.metaToSearch.map((o: any) => o.value); + payload.tagToSearch.map((o: any) => o.value); + //debugger; +};