{"version":3,"file":"CLaV70ok.js","sources":["../../../../src/components/components/advancedList/composables/useSortingOptions.ts","../../../../src/components/components/advancedList/useAdvancedList.ts"],"sourcesContent":["import type { DropdownOption } from '../components/dropdown/useDropdown';\nimport type {\n FilterOptions,\n Filters,\n} from '~/components/components/advancedList/useAdvancedList';\n\nexport function useSortingOptions(\n rawOptions: T[],\n t: ReturnType['t'],\n filterOptions: FilterOptions,\n initialFilters: Filters,\n): [Ref, Ref] {\n const options = rawOptions.map((e) => {\n const token = `sorting.${e}`;\n const label = t(token);\n return {\n isAvailable: checkIfSortingOptionIsAvailable(\n filterOptions,\n initialFilters,\n e as string,\n ),\n key: e as string,\n label: label === token ? (e as string) : label,\n };\n });\n\n const value = ref(options.find((e) => e.isAvailable)?.key) as Ref;\n return [value, ref(options)];\n}\n\nfunction checkIfSortingOptionIsAvailable(\n filterOptions: FilterOptions,\n filters: Filters,\n value: string,\n) {\n if (!filters || !Object.keys(filters).length) {\n return true;\n }\n\n let isOptionAvailable = false;\n Object.entries(filters).forEach(([k, v]) => {\n const filterOption = filterOptions[k]?.values.find(\n (option) => option?.id === v,\n );\n if (\n filterOption &&\n filterOption.hasOwnProperty('availableSortingOptions')\n ) {\n isOptionAvailable = filterOption.availableSortingOptions.includes(value);\n } else {\n isOptionAvailable = true;\n }\n });\n\n return isOptionAvailable;\n}\n","import {\n useCachedPost,\n useSecureSessionPost,\n} from '@/composables/dataFetching/genericFetchers';\nimport { useSortingOptions } from './composables/useSortingOptions';\nimport { scrollToElement } from '~/helpers/scroll';\nimport { handleLoadingError } from '~/utils/handleLoadingError';\n\nexport interface FilterOption {\n //use values for dynamic filter content (e.g. count of each value)\n values?: {\n id: string;\n label: string;\n isAvailable?: boolean;\n availableSortingOptions?: string[];\n data?: Record;\n }[];\n //use data only for static filter content (e.g. the filter label)\n data?: Record;\n type?: string;\n}\n\nexport type FilterOptions = Partial<\n Record\n>;\n\nexport interface AdvancedListConfig<\n P = Record,\n S extends string = string,\n F extends string = string,\n> {\n id: string;\n entriesPerPage: number;\n params: P;\n apiPath: string;\n /**\n * at least one sorting option needs to be provided, for the initial sorting\n */\n sortingOptions: S[];\n filterOptions?: FilterOptions;\n useSessionPost?: boolean;\n}\n\nexport interface AdvancedListInitialData {\n entries?: T[];\n entryCount?: number;\n}\n\nexport type Filters = Partial>;\n\n/**\n * @Generic_S enum of the sorting options\n * @Generic_F enum of the filter keys\n * @Generic_P Type of the load entries request params\n *\n * type for the request body to load new data\n */\nexport type AdvancedListLoadBody<\n S = string,\n F extends string = string,\n P = Record,\n> = {\n limit: number;\n offset: number;\n orderBy?: S;\n initial?: boolean;\n} & Filters &\n P;\n\n/**\n * @Generic_T Type of the entries\n * @Generic_F enum of the filter keys\n *\n * type for the response when loading data\n */\nexport interface AdvancedListLoadResult<\n T = any,\n F extends string = string,\n S extends string = string,\n> {\n entries: T[];\n entryCount: number;\n filterOptions: FilterOptions;\n // if there was an error while loading from the gateway\n error?: boolean;\n sortingOptions?: S[];\n}\n\n/**\n * @Generic_T Type of the entries\n * @Generit_P Type of the load entries request params\n * @Generic_S enum of the sorting options\n * @Generic_F enum of the filter keys\n */\nexport async function useAdvancedList<\n T = any,\n P = Record,\n S extends string = string,\n F extends string = string,\n>(\n reactiveConfig: Ref>,\n initialData?: AdvancedListInitialData,\n initialFilters?: Filters,\n) {\n const { t } = useTrans();\n const error = ref(false);\n let initial: Partial> = initialData;\n let data: AdvancedListLoadResult | undefined;\n const config = reactiveConfig.value;\n\n if (!initial) {\n initial = await load(\n reactiveConfig.value,\n config.entriesPerPage,\n 0,\n config.sortingOptions[0] as S,\n initialFilters ?? {},\n true,\n );\n error.value = initial.error;\n }\n\n const [orderBy, sortingOptions] = useSortingOptions(\n initial.sortingOptions ?? config.sortingOptions ?? [],\n t,\n config.filterOptions ?? initial?.filterOptions ?? {},\n initialFilters,\n );\n\n if (\n !initialData &&\n ((initialFilters && !config.filterOptions) ||\n (config.sortingOptions[0] as S) !== orderBy.value)\n ) {\n data = await load(\n reactiveConfig.value,\n config.entriesPerPage,\n 0,\n orderBy.value,\n initialFilters ?? {},\n );\n error.value = data.error;\n }\n\n const isLoading = ref(false);\n const entries = ref(data?.entries ?? initial.entries ?? []) as Ref;\n\n const pages = ref(\n getPages(data?.entryCount ?? initial.entryCount, config.entriesPerPage),\n );\n const page = ref(1);\n const entryCount = ref(data?.entryCount ?? initial.entryCount);\n\n const initialStaticFilterOptions =\n config.filterOptions ?? initial?.filterOptions ?? {};\n const initialDynamicFilterOptions =\n config.filterOptions && initial?.filterOptions\n ? initial.filterOptions\n : data?.filterOptions;\n\n const filterOptions = ref>(\n buildFilterOptions(initialStaticFilterOptions, initialDynamicFilterOptions),\n ) as Ref>;\n\n const filters = reactive>(\n initialFilters ? { ...initialFilters } : {},\n ) as Filters;\n\n const combinedSettings = computed(() => ({\n ...filters,\n orderBy: orderBy.value,\n }));\n\n let loadingIndex = 0;\n\n async function reInitialize() {\n initial = initialData;\n if (!initial) {\n initial = await load(\n reactiveConfig.value,\n config.entriesPerPage,\n 0,\n orderBy.value,\n initialFilters ?? {},\n true,\n );\n error.value = initial.error;\n }\n\n if (!initialData && initialFilters && !config.filterOptions) {\n data = await load(\n reactiveConfig.value,\n config.entriesPerPage,\n 0,\n orderBy.value,\n initialFilters ?? {},\n );\n error.value = data.error;\n }\n\n entries.value = data?.entries ?? initial.entries ?? [];\n\n pages.value = getPages(\n data?.entryCount ?? initial.entryCount,\n config.entriesPerPage,\n );\n page.value = 1;\n entryCount.value = data?.entryCount ?? initial.entryCount;\n\n const initialStaticFilterOptions =\n config.filterOptions ?? initial?.filterOptions ?? {};\n const initialDynamicFilterOptions =\n config.filterOptions && initial?.filterOptions\n ? initial.filterOptions\n : data?.filterOptions;\n filterOptions.value = buildFilterOptions(\n initialStaticFilterOptions,\n initialDynamicFilterOptions,\n );\n\n resetFilters();\n }\n\n async function scopedLoad(\n scopedOffset: number,\n scopedOrderBy: S,\n scopedFilters: Filters,\n ) {\n loadingIndex++;\n const id = loadingIndex;\n const data = await load(\n reactiveConfig.value,\n reactiveConfig.value.entriesPerPage,\n scopedOffset,\n scopedOrderBy,\n scopedFilters,\n );\n error.value = data.error;\n if (id !== loadingIndex) return false;\n\n return data;\n }\n\n const applyChanges = (\n newEntries: T[],\n newEntryCount: number,\n newFilterOptions: FilterOptions,\n ) => {\n // update entries\n entries.value = newEntries;\n\n //if the entry count changed recalculate the amout of pages and set page to 1\n if (entryCount.value !== newEntryCount) {\n pages.value = getPages(newEntryCount, config.entriesPerPage);\n page.value = 1;\n }\n\n //update entry count\n entryCount.value = newEntryCount;\n\n //update filter options\n filterOptions.value = buildFilterOptions(\n initialStaticFilterOptions,\n newFilterOptions,\n );\n };\n\n async function reload() {\n isLoading.value = true;\n\n // load data for first page\n const data = await scopedLoad(0, orderBy.value, filters);\n if (data) {\n // applyChanges\n applyChanges(data.entries, data.entryCount, data.filterOptions);\n // set page to first\n page.value = 1;\n isLoading.value = false;\n }\n }\n\n //on Sort change\n watch(\n () => orderBy.value,\n async (nv) => {\n isLoading.value = true;\n\n //load data for first page\n const data = await scopedLoad(0, nv, filters);\n if (data) {\n ///applyChanges\n applyChanges(data.entries, data.entryCount, data.filterOptions);\n // set first page\n page.value = 1;\n isLoading.value = false;\n }\n },\n );\n\n // on paginate\n watch(\n () => page.value,\n async (nv) => {\n isLoading.value = true;\n\n const element = document.getElementById(config.id);\n scrollToElement(element, 90);\n\n // load data for next page\n const data = await scopedLoad(\n (nv - 1) * config.entriesPerPage,\n orderBy.value,\n filters,\n );\n if (data) {\n // applyChanges\n applyChanges(data.entries, data.entryCount, data.filterOptions);\n isLoading.value = false;\n }\n },\n );\n\n // on filter change\n watch(filters, async (nv) => {\n isLoading.value = true;\n\n // update sorting options because they can vary depending on the filter\n const [newOrderBy, newSortingOptions] = useSortingOptions(\n initial.sortingOptions ?? config.sortingOptions,\n t,\n config.filterOptions ?? initial?.filterOptions ?? {},\n filters,\n );\n\n orderBy.value =\n newOrderBy.value === orderBy.value ? newOrderBy.value : orderBy.value;\n sortingOptions.value = newSortingOptions.value;\n\n // load data for first page\n const data = await scopedLoad(0, orderBy.value, nv);\n if (data) {\n // applyChanges\n applyChanges(data.entries, data.entryCount, data.filterOptions);\n // set page to first\n page.value = 1;\n isLoading.value = false;\n }\n });\n\n function resetFilters(ping = false) {\n if (ping) sendResetFiltersPing();\n\n Object.keys(filters).forEach((key) => {\n delete filters[key as F];\n });\n if (initialFilters) {\n Object.keys(initialFilters).forEach((key) => {\n filters[key as F] = initialFilters[key as F];\n });\n }\n\n const [initialOrderBy, initialSortingOptions] = useSortingOptions(\n initial.sortingOptions ?? config.sortingOptions ?? [],\n t,\n config.filterOptions ?? initial?.filterOptions ?? {},\n initialFilters,\n );\n orderBy.value = initialOrderBy.value;\n sortingOptions.value = initialSortingOptions.value;\n }\n\n /**\n * use this to check if the resetFilters has been triggered\n */\n const resetFiltersPing = ref(false);\n function sendResetFiltersPing() {\n resetFiltersPing.value = true;\n setTimeout(() => {\n resetFiltersPing.value = false;\n }, 5);\n }\n\n return {\n id: config.id,\n isLoading,\n entries,\n pages,\n page,\n entryCount,\n sortingOptions,\n orderBy,\n filterOptions,\n filters,\n combinedSettings,\n error,\n resetFiltersPing,\n sendResetFiltersPing,\n resetFilters,\n reload,\n reInitialize,\n };\n}\n\nasync function load<\n T = any,\n P = Record,\n S extends string = string,\n F extends string = string,\n>(\n config: AdvancedListConfig,\n limit: number,\n offset: number,\n orderBy: S,\n filters: Filters,\n initial = false,\n): Promise> {\n try {\n const rawOptions: AdvancedListLoadBody = {\n ...config.params,\n ...filters,\n orderBy,\n limit,\n offset,\n initial,\n };\n\n const site = useSiteIdent();\n if (!config.useSessionPost) {\n const { data } = await useCachedPost(\n `/api/${site}/${config.apiPath}`,\n rawOptions,\n {\n blockId: config.id,\n },\n );\n\n return {\n entries: data.value?.entries,\n entryCount: data.value?.entryCount,\n filterOptions: data.value?.filterOptions,\n sortingOptions: data.value?.sortingOptions,\n error: false,\n };\n } else {\n const data = await useSecureSessionPost(\n `/api/${site}/${config.apiPath}`,\n rawOptions,\n );\n\n return {\n entries: data?.entries,\n entryCount: data?.entryCount,\n filterOptions: data?.filterOptions,\n sortingOptions: data?.sortingOptions,\n error: false,\n };\n }\n } catch (e) {\n handleLoadingError(e);\n return {\n entries: [],\n entryCount: 0,\n filterOptions: {},\n error: true,\n };\n }\n}\n\n/**\n * build the filter options form statis and dynamic filter options\n * @param staticFilterOptions the static filter options. required.\n * the staic filter options are used to build the structure of the filter options.\n * all values of the static filter options will appear in the filters in the list.\n * @param dynamicFilterOptions the dynamic filter options. optional.\n * the dynamic filter options are used to set the isAvailable flag and if set the data of the individual filter options.\n * if there is a value in the staic filter options and not in the dynamic filter options the isAvailable flag will be set to false.\n *\n * edgecase: if there are no dynamic filter options (example: when initzializing the list) the isAvailable\n * flag will be set to true and the data from the static filter options will taken.\n *\n * @returns the filter options with the isAvailable flag and the data set\n */\nfunction buildFilterOptions(\n staticFilterOptions: FilterOptions,\n dynamicFilterOptions?: FilterOptions,\n): FilterOptions {\n const hasDynamicFilterOptions = !!dynamicFilterOptions;\n\n const options = Object.entries(staticFilterOptions).reduce(\n (acc, [key, value]) => {\n acc[key as F] = {\n ...value,\n values:\n value.values?.map((x) => {\n const dynamicOption = hasDynamicFilterOptions\n ? dynamicFilterOptions?.[key as F]?.values.find(\n (v) => v.id === x.id,\n )\n : undefined;\n return {\n ...x,\n isAvailable: hasDynamicFilterOptions ? !!dynamicOption : true,\n data:\n dynamicOption?.data ??\n (hasDynamicFilterOptions ? undefined : x.data),\n };\n }) ?? [],\n };\n\n return acc;\n },\n {} as FilterOptions,\n );\n\n if (dynamicFilterOptions) {\n Object.entries(dynamicFilterOptions).forEach(\n ([key, filterOption]) => {\n if (options[key as F]) {\n filterOption.values?.forEach((value) => {\n const option = options[key as F].values?.find(\n (x) => x.id === value.id,\n );\n if (!option) {\n options[key as F].values?.push({\n ...value,\n isAvailable: true,\n data: value.data,\n });\n }\n });\n }\n },\n );\n }\n\n return options;\n}\n\nfunction getPages(entryCount: number, entriesPerPage: number) {\n return Math.ceil((entryCount ?? 0) / entriesPerPage);\n}\n\nexport function useListReloadPing() {\n const reloadPing = ref(false);\n\n function sendReloadPing() {\n reloadPing.value = true;\n setTimeout(() => {\n reloadPing.value = false;\n }, 1);\n }\n\n return {\n reloadPing,\n sendReloadPing,\n };\n}\n"],"names":["useSortingOptions","rawOptions","t","filterOptions","initialFilters","options","e","token","label","checkIfSortingOptionIsAvailable","ref","_a","filters","value","isOptionAvailable","k","v","filterOption","option","useAdvancedList","reactiveConfig","initialData","useTrans","error","initial","data","config","load","orderBy","sortingOptions","isLoading","entries","pages","getPages","page","entryCount","initialStaticFilterOptions","initialDynamicFilterOptions","buildFilterOptions","reactive","combinedSettings","computed","loadingIndex","reInitialize","resetFilters","scopedLoad","scopedOffset","scopedOrderBy","scopedFilters","id","applyChanges","newEntries","newEntryCount","newFilterOptions","reload","watch","nv","element","scrollToElement","newOrderBy","newSortingOptions","ping","sendResetFiltersPing","key","initialOrderBy","initialSortingOptions","resetFiltersPing","limit","offset","site","useSiteIdent","useSecureSessionPost","useCachedPost","_b","_c","_d","handleLoadingError","staticFilterOptions","dynamicFilterOptions","hasDynamicFilterOptions","acc","x","dynamicOption","entriesPerPage","useListReloadPing","reloadPing","sendReloadPing"],"mappings":"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"}