@anzusystems/common-admin 1.47.0-beta.21 → 1.47.0-beta.211

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labs.js","sources":["../src/labs/filters/filterInjectionKeys.ts","../src/labs/filters/filterFactory.ts","../src/labs/filters/AFilterBooleanSelect.vue","../src/labs/filters/AFilterDatetimePicker.vue","../src/labs/filters/AFilterInteger.vue","../src/labs/filters/pagination.ts","../src/labs/filters/AFilterRemoteAutocomplete.vue","../src/labs/filters/AFilterRemoteAutocompleteWithMinimal.vue","../src/labs/filters/AFilterString.vue","../src/labs/filters/filterTimeIntervalTools.ts","../src/labs/filters/AFilterTimeInterval.vue","../src/labs/filters/AFilterValueObjectOptionsSelect.vue","../src/labs/filters/AFilterAdvancedButton.vue","../src/labs/filters/FiltersSelected.vue","../src/labs/filters/AFilterEmpty.vue","../src/labs/filters/FilterDetailItem.vue","../src/labs/filters/UserAdminConfigFilter.ts","../src/types/UserAdminConfig.ts","../src/labs/api/useApiQueryBuilder.ts","../src/model/error/AnzuApiAxiosError.ts","../src/model/error/AnzuApiTimeoutError.ts","../src/labs/api/useApiFetchList.ts","../src/labs/api/useApiRequest.ts","../src/labs/filters/userAdminConfig.ts","../src/labs/filters/bookmarksStore.ts","../src/model/factory/UserAdminConfigFactory.ts","../src/labs/filters/FilterBookmarkDialog.vue","../src/components/buttons/filter/AFilterBookmarkButton.vue","../src/labs/filters/FilterBookmarks.vue","../src/labs/filters/AFilterWrapper.vue","../src/labs/filters/ADatatableOrdering.vue","../src/labs/filters/ADatatablePagination.vue","../src/labs/api/useApiFetchByIds.ts","../src/labs/api/useApiFetchListBatch.ts","../src/labs/filters/datatableColumns.ts"],"sourcesContent":["import type { InjectionKey, Ref } from 'vue'\nimport type { FilterConfig, FilterData } from '@/labs/filters/filterFactory'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport type { Pagination } from '@/labs/filters/pagination'\n\nexport const FilterDataKey: InjectionKey<FilterData> = Symbol.for('anzu:FilterDataKey')\nexport const FilterConfigKey: InjectionKey<FilterConfig> = Symbol.for('anzu:FilterConfigKey')\n\nexport const FilterInnerDataKey: InjectionKey<FilterData> = Symbol.for('anzu:FilterInnerDataKey')\nexport const FilterInnerConfigKey: InjectionKey<FilterConfig> = Symbol.for('anzu:FilterInnerConfigKey')\n\nexport const FilterSubmitResetCounterKey: InjectionKey<Ref<number>> = Symbol.for('anzu:FilterSubmitResetCounterKey')\nexport const FilterSelectedKey: InjectionKey<Ref<Map<string, ValueObjectOption<string | number>[]>>> =\n Symbol.for('anzu:FilterSelectedKey')\nexport const FilterTouchedKey: InjectionKey<Ref<boolean>> = Symbol.for('anzu:FilterTouchedKey')\n\nexport const DatatablePaginationKey: InjectionKey<Ref<Pagination>> = Symbol.for('anzu:DatatablePaginationKey')\n","import { reactive, type Ref } from 'vue'\nimport {\n cloneDeep,\n isArray,\n isEmptyArray,\n isEmptyObject,\n isNull,\n isObject,\n isString,\n isUndefined,\n} from '@/utils/common'\nimport type { AnyFn } from '@vueuse/core'\nimport type { Pagination } from '@/labs/filters/pagination'\nimport { type DatatableSortBy, SortOrder } from '@/composables/system/datatableColumns'\n\nconst SORT_URL_PARAM = '_sort'\n\nconst defaultRenderOptions: FilerRenderOptions = {\n skip: false,\n xs: 12,\n sm: 6,\n md: 4,\n lg: 3,\n xl: 2,\n}\n\nexport function createFilter<F extends readonly MakeFilterOption<string>[]>(\n filterFields: F,\n store: FilterData<F>,\n options?: Partial<GeneralFilterOptions>\n): {\n filterConfig: FilterConfig<F>\n filterData: FilterData<F>\n} {\n const config = filterFields.reduce(\n (acc, filter) => {\n const key = filter.name as keyof FilterData<F>\n const defaultValue = cloneDeep(store[key] as AllowedFilterValues)\n\n return {\n ...acc,\n [key]: {\n name: key as string,\n variant: resolveValue(filter.variant, 'eq'),\n type: resolveValue(filter.type, 'custom'),\n titleT:\n filter.titleT ??\n (options?.system && options?.subject && filter.name\n ? `${options.system}.${options.subject}.filter.${filter.name}`\n : undefined),\n apiName: resolveValue(filter.apiName, ''),\n clearable: resolveValue(filter.clearable, true),\n mandatory: resolveValue(filter.mandatory, false),\n multiple: isArray(defaultValue),\n advanced: resolveValue(filter.advanced, false),\n related: resolveValue(filter.related, undefined),\n exclude: resolveValue(filter.exclude, false),\n default: defaultValue,\n render: { ...defaultRenderOptions, ...resolveValue(filter.render, {}) },\n },\n }\n },\n {} as FilterConfig<F>['fields']\n )\n\n const defaultGlobalOptions: GeneralFilterOptions = {\n elastic: false,\n system: undefined,\n subject: undefined,\n ...options,\n }\n\n const filterConfig = reactive({\n general: defaultGlobalOptions,\n fields: config,\n }) as FilterConfig<F>\n\n return {\n filterConfig,\n filterData: store as FilterData<F>,\n }\n}\n\nfunction resolveValue<T>(value: T | undefined, fallback: T): T {\n return isUndefined(value) ? fallback : value\n}\n\nexport function useFilterClearHelpers<\n F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[],\n>() {\n const clearOne = (name: keyof FilterData<F>, filterData: FilterData<F>, filterConfig: FilterConfig<F>) => {\n if (!filterConfig.fields[name]?.clearable) return\n filterData[name] = cloneDeep(filterConfig.fields[name].default)\n }\n\n const clearAll = (filterData: FilterData<F>, filterConfig: FilterConfig<F>) => {\n for (const filterName in filterConfig.fields) {\n clearOne(filterName as keyof FilterData<F>, filterData, filterConfig)\n }\n }\n\n return {\n clearOne,\n clearAll,\n // resetFilter,\n }\n}\n\nexport function useFilterHelpers<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[]>(\n filterData: FilterData<F>,\n filterConfig: FilterConfig<F>,\n systemResource: string | undefined = undefined\n) {\n const END_FILTER_MARKER = '~'\n\n const storeKey = systemResource ? 'datatableFilter_' + systemResource : undefined\n\n const getFilterDataForStoring = (): Record<string, AllowedFilterValues> => {\n const data: Record<string, AllowedFilterValues> = {}\n for (const filterName in filterData) {\n try {\n const key = filterName as keyof FilterData<F>\n const value = filterData[key]\n if (\n !isUndefined(value) &&\n !isNull(value) &&\n !isEmptyArray(value) &&\n value !== filterConfig.fields[key].default\n ) {\n data[filterName] = value\n }\n } catch (e) {\n // Ignore errors\n }\n }\n return data\n }\n\n const serializeFilters = (\n data: Record<string, AllowedFilterValues>,\n pagination: Ref<Pagination>,\n includeSort: boolean\n ): string => {\n const params = new URLSearchParams()\n for (const key in data) {\n const value = data[key]\n if (isUndefined(value) || isNull(value)) continue\n if (isArray(value) && isEmptyArray(value)) continue\n if (isObject(value) && isEmptyObject(value)) continue\n if (isString(value) && value.length === 0) continue\n if (isArray(value)) {\n params.set(key, value.join(','))\n } else {\n params.set(key, String(value))\n }\n }\n if (includeSort && pagination.value.sortBy) {\n params.set(SORT_URL_PARAM, `${pagination.value.sortBy.key},${pagination.value.sortBy.order}`)\n }\n if (params.size === 0) return ''\n return params.toString() + END_FILTER_MARKER\n }\n\n const deserializeFilters = (\n hash: string\n ): { filters: Record<string, AllowedFilterValues>; sortBy: DatatableSortBy } | null => {\n if (!hash) return null\n if (hash.startsWith('#')) hash = hash.substring(1)\n\n if (!hash.endsWith(END_FILTER_MARKER)) {\n const lastAmpersand = hash.lastIndexOf('&')\n if (lastAmpersand !== -1) {\n hash = hash.substring(0, lastAmpersand)\n } else {\n return null\n }\n } else {\n hash = hash.slice(0, -1)\n }\n\n const params = new URLSearchParams(hash)\n const result: Record<string, AllowedFilterValues> = {}\n let sortBy: DatatableSortBy = null\n\n const sortParam = params.get(SORT_URL_PARAM)\n if (sortParam) {\n const [key, order] = sortParam.split(',')\n if (key && (order === SortOrder.Asc || order === SortOrder.Desc)) {\n sortBy = { key, order }\n }\n params.delete(SORT_URL_PARAM)\n }\n\n for (const [key, value] of params.entries()) {\n const fieldConfig = filterConfig.fields[key as keyof typeof filterConfig.fields]\n const isMultiple = fieldConfig.multiple ?? false\n\n if (isMultiple) {\n const items = value.split(',')\n\n const allNumeric = items.every((item) => !isNaN(Number(item)))\n\n result[key] = allNumeric ? items.map(Number) : items\n } else {\n result[key] = value\n }\n }\n\n return { filters: result, sortBy }\n }\n\n const updateLocationHash = (serialized: string) => {\n window.location.hash = serialized\n }\n\n const parseLocationHash = () => {\n return deserializeFilters(window.location.hash)\n }\n\n const storeFilterLocalStorage = (serialized: string) => {\n if (!storeKey || !localStorage) return\n localStorage.setItem(storeKey, serialized)\n }\n\n const loadFilterLocalStorage = () => {\n if (!storeKey || !localStorage) return null\n const stored = localStorage.getItem(storeKey)\n if (!stored || !isString(stored)) return null\n return deserializeFilters(stored)\n }\n\n const resetFilter = (pagination: Ref<Pagination>, callback?: AnyFn) => {\n pagination.value = { ...pagination.value, page: 1 }\n if (storeKey && localStorage) {\n localStorage.removeItem(storeKey)\n }\n window.location.hash = ''\n if (callback) callback()\n }\n\n const submitFilter = (pagination: Ref<Pagination>, callback?: AnyFn) => {\n const data = getFilterDataForStoring()\n const serialized = serializeFilters(data, pagination, true)\n updateLocationHash(serialized)\n storeFilterLocalStorage(serialized)\n pagination.value = { ...pagination.value, page: 1 }\n if (callback) callback()\n }\n\n const loadStoredFilters = () => {\n let source: 'hash' | 'localStorage' = 'hash'\n let storedFromHash = parseLocationHash()\n if (isNull(storedFromHash)) {\n source = 'localStorage'\n storedFromHash = loadFilterLocalStorage()\n }\n if (isNull(storedFromHash) || isEmptyObject(storedFromHash.filters)) return false\n\n for (const filterName in filterData) {\n const key = filterName as keyof FilterData<F>\n const value = storedFromHash.filters[key]\n if (isUndefined(value)) continue\n filterData[key] = value\n }\n if (source === 'localStorage' && storeKey && localStorage) {\n const stored = localStorage.getItem(storeKey)\n if (stored) {\n updateLocationHash(stored)\n }\n }\n return true\n }\n\n return {\n loadStoredFilters,\n resetFilter,\n submitFilter,\n serializeFilters,\n deserializeFilters,\n }\n}\n\nexport type AllowedFilterValues = number | number[] | string | string[] | null | undefined | boolean\n\nexport interface GeneralFilterOptions {\n system?: string\n subject?: string\n elastic?: boolean\n}\n\nexport interface FilerRenderOptions {\n skip: boolean\n xs: number\n sm: number\n md: number\n lg: number\n xl: number\n}\n\nexport type FilterVariant =\n | 'search'\n | 'lt'\n | 'in'\n | 'notIn'\n | 'endsWith'\n | 'startsWith'\n | 'memberOf'\n | 'contains'\n | 'neq'\n | 'gte'\n | 'gt'\n | 'eq'\n | 'lte'\n | 'custom'\n\nexport type FilterType = 'boolean' | 'datetime' | 'integer' | 'string' | 'custom' | 'timeInterval'\n\nexport interface MakeFilterOption<TName extends string = string> {\n name: TName\n type?: FilterType\n variant?: FilterVariant\n titleT?: string\n apiName?: string\n clearable?: boolean\n mandatory?: boolean\n advanced?: boolean\n exclude?: boolean\n related?: string | undefined\n render?: Partial<FilerRenderOptions>\n}\n\nexport interface FilterField {\n name: string\n type: FilterType\n variant: FilterVariant\n titleT?: string\n default: AllowedFilterValues\n apiName: string\n clearable: boolean\n mandatory: boolean\n multiple: boolean\n advanced: boolean\n exclude: boolean\n related: string | undefined\n render: FilerRenderOptions\n}\n\nexport type FilterConfig<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[]> = {\n general: GeneralFilterOptions\n fields: {\n [P in F[number]['name']]: FilterField\n }\n}\n\nexport type FilterData<F extends readonly MakeFilterOption<string>[] = readonly MakeFilterOption<string>[]> = {\n [P in F[number]['name']]: AllowedFilterValues\n}\n\nexport type FilterStore<T extends readonly { name: string }[]> = {\n [K in T[number]['name']]: AllowedFilterValues\n}\n","<script lang=\"ts\" setup>\nimport { useI18n } from 'vue-i18n'\nimport { computed, inject } from 'vue'\nimport { isNull, isUndefined } from '@/utils/common'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n FilterTouchedKey,\n} from '@/labs/filters/filterInjectionKeys'\nimport { useFilterClearHelpers } from '@/labs/filters/filterFactory'\n\ninterface BooleanSelectOption {\n value: 0 | 1 | -1\n title: string\n}\n\nconst props = withDefaults(\n defineProps<{\n name: string\n allT?: string\n trueT?: string\n falseT?: string\n dataCy?: string\n }>(),\n {\n dataCy: 'filter-boolean',\n allT: 'common.model.all',\n trueT: 'common.model.boolean.true',\n falseT: 'common.model.boolean.false',\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst touched = inject(FilterTouchedKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(touched) ||\n isUndefined(filterSelected) ||\n isUndefined(filterConfig) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n isUndefined(filterData) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterData[props.name])\n) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst modelValue = computed({\n get(): BooleanSelectOption {\n if (isUndefined(filterData[props.name]) || isNull(filterData[props.name]))\n return {\n value: -1,\n title: t(props.allT),\n }\n return filterData[props.name] ? { value: 1, title: t(props.trueT) } : { value: 0, title: t(props.falseT) }\n },\n set(newValue: BooleanSelectOption) {\n let returnValue: null | boolean = null\n if (newValue?.value === 1) returnValue = true\n if (newValue?.value === 0) returnValue = false\n filterData[props.name] = returnValue\n updateSelected()\n touched.value = true\n emit('change')\n },\n})\n\nconst filterConfigCurrent = computed(() => filterConfig.fields[props.name])\n\nconst { t } = useI18n()\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\nconst items = computed<BooleanSelectOption[]>(() => {\n return [\n { value: -1, title: t(props.allT) },\n { value: 1, title: t(props.trueT) },\n { value: 0, title: t(props.falseT) },\n ]\n})\n\nconst { clearOne } = useFilterClearHelpers()\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\nconst updateSelected = () => {\n if (modelValue.value.value === -1) {\n filterSelected.value.delete(props.name)\n return\n }\n filterSelected.value.set(props.name, [{ title: modelValue.value.title, value: modelValue.value.value }])\n}\n</script>\n\n<template>\n <VSelect\n v-model=\"modelValue\"\n :data-cy=\"dataCy\"\n :label=\"label\"\n :items=\"items\"\n :clearable=\"!filterConfigCurrent.mandatory && modelValue.value !== -1\"\n return-object\n hide-details\n @click:clear.stop=\"clearField\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, inject } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport ADatetimePicker from '@/components/datetime/ADatetimePicker.vue'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n FilterTouchedKey,\n} from '@/labs/filters/filterInjectionKeys'\nimport { isString, isUndefined } from '@/utils/common'\nimport { useFilterClearHelpers } from '@/labs/filters/filterFactory'\nimport type { DatetimeUTCNullable } from '@/types/common'\nimport { dateTimePretty } from '@/utils/datetime'\n\nconst props = withDefaults(\n defineProps<{\n name: string\n dataCy?: string\n }>(),\n {\n dataCy: 'filter-datepicker',\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst touched = inject(FilterTouchedKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(touched) ||\n isUndefined(filterSelected) ||\n isUndefined(filterConfig) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n isUndefined(filterData) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterData[props.name])\n) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst modelValue = computed({\n get() {\n return filterData[props.name] as DatetimeUTCNullable\n },\n set(newValue: DatetimeUTCNullable) {\n filterData[props.name] = newValue\n updateSelected()\n touched.value = true\n emit('change')\n },\n})\n\nconst { t } = useI18n()\n\nconst filterConfigCurrent = computed(() => filterConfig.fields[props.name])\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\nconst { clearOne } = useFilterClearHelpers()\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\nconst updateSelected = () => {\n if (!isString(modelValue.value) || (isString(modelValue.value) && modelValue.value.length === 0)) return\n filterSelected.value.set(props.name, [{ title: dateTimePretty(modelValue.value), value: modelValue.value }])\n}\n</script>\n\n<template>\n <ADatetimePicker\n v-model=\"modelValue\"\n :data-cy=\"dataCy\"\n :clearable=\"!filterConfigCurrent.mandatory\"\n :default-value=\"filterConfigCurrent.default as DatetimeUTCNullable\"\n :label=\"label\"\n v-bind=\"$attrs\"\n @after-clear=\"clearField\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport { useFilterClearHelpers } from '@/labs/filters/filterFactory'\nimport { computed, inject, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { isArray, isBoolean, isNull, isString, isUndefined } from '@/utils/common'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n FilterTouchedKey,\n} from '@/labs/filters/filterInjectionKeys'\n\nconst props = withDefaults(\n defineProps<{\n name: string\n placeholder?: string | undefined\n dataCy?: string\n }>(),\n {\n placeholder: undefined,\n dataCy: 'filter-integer',\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst touched = inject(FilterTouchedKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(touched) ||\n isUndefined(filterSelected) ||\n isUndefined(filterConfig) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n isUndefined(filterData) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterData[props.name])\n) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst modelValue = computed({\n get() {\n return filterData[props.name]\n },\n set(newValue) {\n filterData[props.name] = newValue\n touched.value = true\n emit('change')\n },\n})\n\nconst filterConfigCurrent = computed(() => filterConfig.fields[props.name])\n\nconst { t } = useI18n()\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (filterConfigCurrent.value.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (filterConfigCurrent.value.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (filterConfigCurrent.value.variant === 'contains' || filterConfigCurrent.value.variant === 'search')\n return t('common.model.filterPlaceholder.contains')\n return ''\n})\n\nconst { clearOne } = useFilterClearHelpers()\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\nconst updateSelected = () => {\n if (!isString(modelValue.value) || (isString(modelValue.value) && modelValue.value.length === 0)) return\n filterSelected.value.set(props.name, [{ title: modelValue.value, value: modelValue.value }])\n}\n\nwatch(\n () => filterData[props.name],\n (newValue, oldValue) => {\n if (newValue === oldValue || isBoolean(newValue)) return\n if (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0)) {\n return\n }\n updateSelected()\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VTextField\n v-model=\"modelValue\"\n :label=\"label\"\n :placeholder=\"placeholderComputed\"\n :clearable=\"!filterConfigCurrent.mandatory\"\n :data-cy=\"dataCy\"\n hide-details\n @blur=\"updateSelected\"\n @click:clear.stop=\"clearField\"\n />\n</template>\n","import type { DatatableSortBy } from '@/composables/system/datatableColumns'\nimport { ref } from 'vue'\n\nexport interface Pagination {\n sortBy: DatatableSortBy\n page: number\n rowsPerPage: number\n rowsNumber: number\n hasNextPage: null | boolean\n currentViewCount: number\n totalCount: number\n}\n\nexport function usePagination(sortBy: DatatableSortBy = null) {\n return ref<Pagination>({\n sortBy,\n page: 1,\n rowsPerPage: 25,\n rowsNumber: 0,\n hasNextPage: null,\n currentViewCount: 0,\n totalCount: 0,\n })\n}\n","<script lang=\"ts\" setup>\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, inject, type Ref, ref, watch } from 'vue'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport { isArray, isBoolean, isNull, isUndefined } from '@/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport type { DocId, IntegerId } from '@/types/common'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterInnerConfigKey,\n FilterInnerDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n FilterTouchedKey,\n} from '@/labs/filters/filterInjectionKeys'\nimport { type FilterConfig, type FilterData, useFilterClearHelpers } from '@/labs/filters/filterFactory'\nimport { isOneOf } from '@/utils/enum'\nimport type { DatatableSortBy } from '@/composables/system/datatableColumns'\n\nimport { type Pagination, usePagination } from '@/labs/filters/pagination'\n\ntype FetchItemsByIdsType =\n | ((ids: IntegerId[]) => Promise<ValueObjectOption<IntegerId>[]>)\n | ((ids: DocId[]) => Promise<ValueObjectOption<DocId>[]>)\n\nconst props = withDefaults(\n defineProps<{\n name: string\n fetchItems: (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n ) => Promise<ValueObjectOption<string | number>[]>\n fetchItemsByIds: FetchItemsByIdsType\n filterByField: string\n filterSortBy?: DatatableSortBy\n placeholder?: string | undefined\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n searchMinChars?: number\n }>(),\n {\n filterSortBy: null,\n placeholder: undefined,\n prefetch: false,\n searchMinChars: 2,\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst touched = inject(FilterTouchedKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(touched) ||\n isUndefined(filterSelected) ||\n isUndefined(filterConfig) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n isUndefined(filterData) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterData[props.name]) ||\n isUndefined(filterInnerConfig) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerConfig.fields[props.filterByField]) ||\n isUndefined(filterInnerData) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerData[props.filterByField])\n) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst selected = ref<any>([])\nconst search = ref('')\nconst isFocused = ref(false)\nconst autoFetchTimer: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined)\n\nconst apiRequestCounter = ref(0)\n\nconst { t } = useI18n()\n\nconst filterConfigCurrent = computed(() => filterConfig.fields[props.name])\n\nconst onBlur = () => {\n isFocused.value = true\n}\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst pagination = usePagination(props.filterSortBy)\nconst fetchedItems = ref<ValueObjectOption<string | number>[]>([])\nconst selectedItemsCache = ref<ValueObjectOption<string | number>[]>([])\n\nconst allItems = computed<ValueObjectOption<DocId | IntegerId>[]>(() => {\n const final = new Map()\n selectedItemsCache.value.forEach((value) => {\n final.set(value.value, { value: value.value, title: value.title, subtitle: value.subtitle })\n })\n fetchedItems.value.forEach((value) => {\n final.set(value.value, { value: value.value, title: value.title, subtitle: value.subtitle })\n })\n return Array.from(final, ([key, value]) => {\n return { value: key, title: value.title, subtitle: value.subtitle }\n })\n})\n\nconst loading = ref(false)\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n loading.value = true\n filterInnerData[props.filterByField] = query\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n loading.value = false\n}\n\nconst findLocalDataByValues = (values: Array<DocId | IntegerId>) => {\n const found = allItems.value.filter((item: ValueObjectOption<string | number>) => values.includes(item.value))\n return ([] as ValueObjectOption<string | number>[]).concat(found)\n}\n\nconst tryToLoadFromLocalData = async (newValue: string | number | Array<string | number>) => {\n let count = 1\n let foundItems: ValueObjectOption<string | number>[] = []\n if (isArray(newValue)) {\n count = newValue.length\n foundItems = findLocalDataByValues(newValue)\n } else {\n foundItems = findLocalDataByValues([newValue])\n }\n selectedItemsCache.value = foundItems\n return foundItems.length === count\n}\n\nconst autoFetched = ref(false)\n\nconst clearAutoFetchTimer = () => {\n clearTimeout(autoFetchTimer.value)\n autoFetchTimer.value = undefined\n}\n\nconst autoFetch = async () => {\n clearAutoFetchTimer()\n if (autoFetched.value === true) return\n autoFetched.value = true\n loading.value = true\n const res = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n if (apiRequestCounter.value === 0) fetchedItems.value = res\n loading.value = false\n}\n\nconst onFocus = () => {\n isFocused.value = true\n if (props.prefetch === false) return\n clearAutoFetchTimer()\n autoFetch()\n}\n\nconst onMouseEnter = () => {\n if (props.prefetch === 'focus' || props.prefetch === false) return\n clearAutoFetchTimer()\n autoFetch()\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!filterConfigCurrent.value.multiple && selectedItemsCache.value[0]) {\n return selectedItemsCache.value[0].title\n }\n return undefined\n})\n\nconst onSearchUpdate = (query: string) => {\n if (!filterConfigCurrent.value.multiple && !isFocused.value && query.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === query) return\n search.value = query\n}\n\nconst onSelectedUpdate = (newValue: any) => {\n touched.value = true\n let final: null | string | number | string[] | number[] = null\n if (isArray(newValue)) {\n final = newValue.map((item: any) => item.value) as string[] | number[]\n } else if (!isNull(newValue)) {\n final = newValue.value\n }\n filterData[props.name] = final\n touched.value = true\n emit('change')\n}\n\nconst onClickClear = async () => {\n fetchedItems.value = await props.fetchItems(pagination, filterInnerData, filterInnerConfig)\n clearField()\n}\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (filterConfigCurrent.value.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (filterConfigCurrent.value.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (filterConfigCurrent.value.variant === 'contains' || filterConfigCurrent.value.variant === 'search')\n return t('common.model.filterPlaceholder.contains')\n return ''\n})\n\nconst { clearOne } = useFilterClearHelpers()\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\nconst updateFilterSelected = (\n newValue: ValueObjectOption<string | number> | ValueObjectOption<string | number>[] | null\n) => {\n filterSelected.value.delete(props.name)\n if ((isArray(newValue) && newValue.length === 0) || isNull(newValue)) {\n filterSelected.value.delete(props.name)\n return\n }\n if (isArray(newValue)) {\n filterSelected.value.set(\n props.name,\n newValue.map((item) => ({ title: item.title, value: item.value }))\n )\n return\n }\n filterSelected.value.set(props.name, [{ title: newValue.title, value: newValue.value }])\n}\n\nwatch(\n () => filterData[props.name],\n async (newValue, oldValue) => {\n if (newValue === oldValue || isBoolean(newValue)) return\n if (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0)) {\n selectedItemsCache.value = []\n if (filterConfigCurrent.value.multiple) {\n selected.value = []\n } else {\n selected.value = null\n }\n updateFilterSelected(selected.value)\n if (autoFetched.value === true || isOneOf(props.prefetch, ['hover', 'focus', false])) return\n autoFetchTimer.value = setTimeout(() => {\n autoFetch()\n }, 3000)\n return\n }\n const found = await tryToLoadFromLocalData(newValue)\n if (found) {\n selected.value = selectedItemsCache.value.map((item) => ({ title: item.title, value: item.value }))\n updateFilterSelected(selected.value)\n return\n }\n if (isArray(newValue)) {\n loading.value = true\n selectedItemsCache.value = await props.fetchItemsByIds(newValue as Array<IntegerId & DocId>)\n selected.value = selectedItemsCache.value.map((item) => ({ title: item.title, value: item.value }))\n updateFilterSelected(selected.value)\n loading.value = false\n return\n }\n loading.value = true\n selectedItemsCache.value = await props.fetchItemsByIds([newValue as DocId & IntegerId])\n selected.value = selectedItemsCache.value.map((item) => ({ title: item.title, value: item.value }))[0]\n updateFilterSelected(selected.value)\n loading.value = false\n },\n { immediate: true }\n)\n\nwatchDebounced(\n search,\n (newValue, oldValue) => {\n if (newValue.length < props.searchMinChars) return\n if (newValue !== oldValue) {\n apiRequestCounter.value++\n apiSearch(newValue, apiRequestCounter.value)\n }\n },\n { debounce: 300 }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"selected\"\n :items=\"allItems\"\n no-filter\n :placeholder=\"placeholderComputed\"\n :multiple=\"filterConfigCurrent.multiple\"\n :clearable=\"!filterConfigCurrent.mandatory\"\n :label=\"label\"\n :chips=\"filterConfigCurrent.multiple\"\n :loading=\"loading\"\n hide-details\n return-object\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onSelectedUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <template\n v-if=\"loading\"\n #no-data\n >\n <VListItem :title=\"t('$vuetify.loading')\" />\n </template>\n <template #item=\"{ props: itemProps, item }\">\n <VListItem\n v-bind=\"itemProps\"\n :title=\"item.raw.title\"\n :subtitle=\"item.raw.subtitle\"\n />\n </template>\n </VAutocomplete>\n</template>\n","<script lang=\"ts\" setup>\nimport { watchDebounced } from '@vueuse/core'\nimport { computed, inject, type Ref, ref, watch } from 'vue'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport { isArray, isBoolean, isNull, isUndefined } from '@/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport type { DocId, IntegerId } from '@/types/common'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterInnerConfigKey,\n FilterInnerDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n FilterTouchedKey,\n} from '@/labs/filters/filterInjectionKeys'\nimport { type FilterConfig, type FilterData, useFilterClearHelpers } from '@/labs/filters/filterFactory'\nimport { isOneOf } from '@/utils/enum'\nimport type { DatatableSortBy } from '@/composables/system/datatableColumns'\n\nimport { type Pagination, usePagination } from '@/labs/filters/pagination'\n\ntype FetchItemsMinimalByIdsType = ((ids: IntegerId[]) => Promise<any[]>) | ((ids: DocId[]) => Promise<any[]>)\n\ntype FetchItemsMinimalType = (\n pagination: Ref<Pagination>,\n filterData: FilterData,\n filterConfig: FilterConfig\n) => Promise<any[]>\n\nconst props = withDefaults(\n defineProps<{\n name: string\n fetchItemsMinimal: FetchItemsMinimalType\n fetchItemsMinimalByIds: FetchItemsMinimalByIdsType\n filterByField: string\n filterSortBy?: DatatableSortBy\n placeholder?: string | undefined\n prefetch?: 'hover' | 'focus' | 'mounted' | false\n searchMinChars?: number\n itemTitle?: string\n itemValue?: string\n }>(),\n {\n filterSortBy: null,\n placeholder: undefined,\n prefetch: false,\n searchMinChars: 2,\n itemTitle: 'name',\n itemValue: 'id',\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst touched = inject(FilterTouchedKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterInnerConfig = inject(FilterInnerConfigKey)\nconst filterInnerData = inject(FilterInnerDataKey)\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(touched) ||\n isUndefined(filterSelected) ||\n isUndefined(filterConfig) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n isUndefined(filterData) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterData[props.name]) ||\n isUndefined(filterInnerConfig) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerConfig.fields[props.filterByField]) ||\n isUndefined(filterInnerData) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterInnerData[props.filterByField])\n) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst selected = ref<any>([])\nconst search = ref('')\nconst isFocused = ref(false)\nconst autoFetchTimer: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined)\n\nconst apiRequestCounter = ref(0)\n\nconst { t } = useI18n()\n\nconst filterConfigCurrent = computed(() => filterConfig.fields[props.name])\n\nconst onBlur = () => {\n isFocused.value = true\n}\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst pagination = usePagination(props.filterSortBy)\nconst fetchedItems = ref<ValueObjectOption<string | number>[]>([])\nconst selectedItemsCache = ref<ValueObjectOption<string | number>[]>([])\n\nconst allItems = computed<ValueObjectOption<DocId | IntegerId>[]>(() => {\n const final = new Map()\n selectedItemsCache.value.forEach((value) => {\n final.set(value.value, { value: value.value, title: value.title, subtitle: value.subtitle })\n })\n fetchedItems.value.forEach((value) => {\n final.set(value.value, { value: value.value, title: value.title, subtitle: value.subtitle })\n })\n return Array.from(final, ([key, value]) => {\n return { value: key, title: value.title, subtitle: value.subtitle }\n })\n})\n\nconst loading = ref(false)\n\nconst apiSearch = async (query: string, requestCounter: number) => {\n loading.value = true\n filterInnerData[props.filterByField] = query\n const res = await props.fetchItemsMinimal(pagination, filterInnerData, filterInnerConfig)\n if (requestCounter === apiRequestCounter.value) fetchedItems.value = res\n loading.value = false\n}\n\nconst findLocalDataByValues = (values: Array<DocId | IntegerId>) => {\n const found = allItems.value.filter((item: ValueObjectOption<string | number>) => values.includes(item.value))\n return ([] as ValueObjectOption<string | number>[]).concat(found)\n}\n\nconst tryToLoadFromLocalData = async (newValue: string | number | Array<string | number>) => {\n let count = 1\n let foundItems: ValueObjectOption<string | number>[] = []\n if (isArray(newValue)) {\n count = newValue.length\n foundItems = findLocalDataByValues(newValue)\n } else {\n foundItems = findLocalDataByValues([newValue])\n }\n selectedItemsCache.value = foundItems\n return foundItems.length === count\n}\n\nconst autoFetched = ref(false)\n\nconst clearAutoFetchTimer = () => {\n clearTimeout(autoFetchTimer.value)\n autoFetchTimer.value = undefined\n}\n\nconst autoFetch = async () => {\n clearAutoFetchTimer()\n if (autoFetched.value === true) return\n autoFetched.value = true\n loading.value = true\n const res = await props.fetchItemsMinimal(pagination, filterInnerData, filterInnerConfig)\n if (apiRequestCounter.value === 0) fetchedItems.value = res\n loading.value = false\n}\n\nconst onFocus = () => {\n isFocused.value = true\n if (props.prefetch === false) return\n clearAutoFetchTimer()\n autoFetch()\n}\n\nconst onMouseEnter = () => {\n if (props.prefetch === 'focus' || props.prefetch === false) return\n clearAutoFetchTimer()\n autoFetch()\n}\n\nconst singleItemSelectedTitle = computed(() => {\n if (!filterConfigCurrent.value.multiple && selectedItemsCache.value[0]) {\n return selectedItemsCache.value[0].title\n }\n return undefined\n})\n\nconst onSearchUpdate = (query: string) => {\n if (!filterConfigCurrent.value.multiple && !isFocused.value && query.length === 0) return // vuetify fix\n if (singleItemSelectedTitle.value === query) return\n search.value = query\n}\n\nconst onSelectedUpdate = (newValue: any) => {\n touched.value = true\n let final: null | string | number | string[] | number[] = null\n if (isArray(newValue)) {\n final = newValue.map((item: any) => item.value) as string[] | number[]\n } else if (!isNull(newValue)) {\n final = newValue.value\n }\n filterData[props.name] = final\n touched.value = true\n emit('change')\n}\n\nconst onClickClear = async () => {\n fetchedItems.value = await props.fetchItemsMinimal(pagination, filterInnerData, filterInnerConfig)\n clearField()\n}\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (filterConfigCurrent.value.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (filterConfigCurrent.value.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (filterConfigCurrent.value.variant === 'contains' || filterConfigCurrent.value.variant === 'search')\n return t('common.model.filterPlaceholder.contains')\n return ''\n})\n\nconst { clearOne } = useFilterClearHelpers()\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\nconst updateFilterSelected = (\n newValue: ValueObjectOption<string | number> | ValueObjectOption<string | number>[] | null\n) => {\n filterSelected.value.delete(props.name)\n if ((isArray(newValue) && newValue.length === 0) || isNull(newValue)) {\n filterSelected.value.delete(props.name)\n return\n }\n if (isArray(newValue)) {\n filterSelected.value.set(\n props.name,\n newValue.map((item) => ({ title: item.title, value: item.value }))\n )\n return\n }\n filterSelected.value.set(props.name, [{ title: newValue.title, value: newValue.value }])\n}\n\nwatch(\n () => filterData[props.name],\n async (newValue, oldValue) => {\n if (newValue === oldValue || isBoolean(newValue)) return\n if (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0)) {\n selectedItemsCache.value = []\n if (filterConfigCurrent.value.multiple) {\n selected.value = []\n } else {\n selected.value = null\n }\n updateFilterSelected(selected.value)\n if (autoFetched.value === true || isOneOf(props.prefetch, ['hover', 'focus'])) return\n autoFetchTimer.value = setTimeout(() => {\n autoFetch()\n }, 3000)\n return\n }\n const found = await tryToLoadFromLocalData(newValue)\n if (found) {\n selected.value = selectedItemsCache.value.map((item) => ({ title: item.title, value: item.value }))\n updateFilterSelected(selected.value)\n return\n }\n if (isArray(newValue)) {\n loading.value = true\n selectedItemsCache.value = await props.fetchItemsMinimalByIds(newValue as Array<IntegerId & DocId>)\n selected.value = selectedItemsCache.value.map((item) => ({ title: item.title, value: item.value }))\n updateFilterSelected(selected.value)\n loading.value = false\n return\n }\n loading.value = true\n selectedItemsCache.value = await props.fetchItemsMinimalByIds([newValue as DocId & IntegerId])\n selected.value = selectedItemsCache.value.map((item) => ({ title: item.title, value: item.value }))[0]\n updateFilterSelected(selected.value)\n loading.value = false\n },\n { immediate: true }\n)\n\nwatchDebounced(\n search,\n (newValue, oldValue) => {\n if (newValue.length < props.searchMinChars) return\n if (newValue !== oldValue) {\n apiRequestCounter.value++\n apiSearch(newValue, apiRequestCounter.value)\n }\n },\n { debounce: 300 }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"selected\"\n :items=\"allItems\"\n no-filter\n :placeholder=\"placeholderComputed\"\n :multiple=\"filterConfigCurrent.multiple\"\n :clearable=\"!filterConfigCurrent.mandatory\"\n :label=\"label\"\n :chips=\"filterConfigCurrent.multiple\"\n :loading=\"loading\"\n hide-details\n return-object\n @update:search=\"onSearchUpdate\"\n @update:model-value=\"onSelectedUpdate\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @mouseenter=\"onMouseEnter\"\n @click:clear=\"onClickClear\"\n >\n <!-- @vue-skip -->\n <template #item=\"{ props: itemProps, item: itemItem }\">\n <slot\n name=\"item\"\n :item=\"itemItem\"\n :props=\"itemProps\"\n >\n <VListItem\n v-bind=\"itemProps\"\n :title=\"itemItem.raw.title\"\n :subtitle=\"itemItem.raw.subtitle\"\n />\n </slot>\n </template>\n <!-- @vue-skip -->\n <template #chip=\"{ props: chipProps, item: chipItem }\">\n <slot\n name=\"chip\"\n :props=\"chipProps\"\n :item=\"chipItem\"\n >\n <VChip\n v-bind=\"chipProps\"\n :text=\"chipItem.title\"\n />\n </slot>\n </template>\n </VAutocomplete>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, inject, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { isArray, isBoolean, isNull, isString, isUndefined } from '@/utils/common'\nimport { useFilterClearHelpers } from '@/labs/filters/filterFactory'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n FilterTouchedKey,\n} from '@/labs/filters/filterInjectionKeys'\n\nconst props = withDefaults(\n defineProps<{\n name: string\n placeholder?: string | undefined\n dataCy?: string\n }>(),\n {\n placeholder: undefined,\n dataCy: 'filter-string',\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst touched = inject(FilterTouchedKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(touched) ||\n isUndefined(filterSelected) ||\n isUndefined(filterConfig) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n isUndefined(filterData) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterData[props.name])\n) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst modelValue = computed({\n get() {\n return filterData[props.name]\n },\n set(newValue) {\n filterData[props.name] = newValue\n touched.value = true\n emit('change')\n },\n})\n\nconst filterConfigCurrent = computed(() => filterConfig.fields[props.name])\n\nconst { t } = useI18n()\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\nconst placeholderComputed = computed(() => {\n if (!isUndefined(props.placeholder)) return props.placeholder\n if (filterConfigCurrent.value.variant === 'startsWith') return t('common.model.filterPlaceholder.startsWith')\n if (filterConfigCurrent.value.variant === 'eq') return t('common.model.filterPlaceholder.eq')\n if (filterConfigCurrent.value.variant === 'contains' || filterConfigCurrent.value.variant === 'search')\n return t('common.model.filterPlaceholder.contains')\n return ''\n})\n\nconst { clearOne } = useFilterClearHelpers()\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\nconst updateSelected = () => {\n if (!isString(modelValue.value)) return\n if ((isString(modelValue.value) && modelValue.value.length === 0)) {\n filterSelected.value.delete(props.name)\n return\n }\n filterSelected.value.set(props.name, [{ title: modelValue.value, value: modelValue.value }])\n}\n\nwatch(\n () => filterData[props.name],\n (newValue, oldValue) => {\n if (newValue === oldValue || isBoolean(newValue)) return\n if (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0)) {\n return\n }\n updateSelected()\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VTextField\n v-model=\"modelValue\"\n :label=\"label\"\n :placeholder=\"placeholderComputed\"\n :clearable=\"!filterConfigCurrent.mandatory\"\n :data-cy=\"dataCy\"\n hide-details\n @blur=\"updateSelected\"\n @click:clear.stop=\"clearField\"\n />\n</template>\n","import { computed, type Ref } from 'vue'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport { isNull, isUndefined } from '@/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { useValidate } from '@/validators/vuelidate/useValidate'\nimport useVuelidate from '@vuelidate/core'\nimport type { DatetimeUTCNullable } from '@/types/common'\n\n/** note: number value represents time interval in minutes, null represent unselected */\nexport type TimeIntervalToolsValue = number | TimeIntervalSpecialOptionsType | null\n\nexport const TimeIntervalSpecialOptions = {\n CurrentMonth: 'cm',\n LastMonth: 'lm',\n Last3Months: 'l3m',\n Custom: 'custom',\n} as const\n\nexport type TimeIntervalSpecialOptionsType =\n (typeof TimeIntervalSpecialOptions)[keyof typeof TimeIntervalSpecialOptions]\n\nexport function useTimeIntervalOptions(allowed: TimeIntervalToolsValue[] | undefined = undefined) {\n const { t } = useI18n()\n\n const timeIntervalOptions = computed<ValueObjectOption<TimeIntervalToolsValue>[]>(() => {\n const values = [\n {\n value: null,\n title: t('common.model.all'),\n },\n {\n value: 60,\n title: '1 hodina',\n },\n {\n value: 1_440,\n title: '1 deň',\n },\n {\n value: 10_080,\n title: '7 dní',\n },\n {\n value: 40_320,\n title: '28 dní',\n },\n {\n value: TimeIntervalSpecialOptions.CurrentMonth,\n title: 'Prebiehajúci mesiac',\n },\n {\n value: TimeIntervalSpecialOptions.LastMonth,\n title: 'Minulý mesiac',\n },\n {\n value: TimeIntervalSpecialOptions.Last3Months,\n title: 'Posledné 3 mesiace',\n },\n {\n value: TimeIntervalSpecialOptions.Custom,\n title: 'Vlastné',\n },\n ]\n if (isUndefined(allowed)) return values\n\n return values.filter((item) => allowed.includes(item.value) || isNull(item.value))\n })\n\n const getTimeIntervalOption = (value: TimeIntervalToolsValue) => {\n return timeIntervalOptions.value.find((item) => item.value === value)\n }\n\n return {\n timeIntervalOptions,\n getTimeIntervalOption,\n }\n}\n\nexport function useFilterTimeIntervalValidators(\n dialogData: Ref<{\n from: DatetimeUTCNullable\n until: DatetimeUTCNullable\n }>\n) {\n // const { t } = useI18n()\n const { datesCompare, required } = useValidate()\n\n const fromComputed = computed(() => {\n return dialogData.value.from\n })\n\n const untilComputed = computed(() => {\n return dialogData.value.until\n })\n\n const rules = {\n dialogData: {\n from: {\n required,\n datesCompare: datesCompare(untilComputed, 'Until', 'onOrBefore'),\n },\n until: {\n required,\n datesCompare: datesCompare(fromComputed, 'From', 'laterThan'),\n },\n },\n }\n\n const v$ = useVuelidate(rules, { dialogData }, { $scope: 'AFilterTimeIntervalScope' })\n\n return {\n v$,\n }\n}\n\n","<script setup lang=\"ts\">\nimport { computed, inject, ref, watch } from 'vue'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n FilterTouchedKey,\n} from '@/labs/filters/filterInjectionKeys'\nimport { isArray, isBoolean, isNull, isUndefined } from '@/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { useFilterClearHelpers } from '@/labs/filters/filterFactory'\nimport {\n TimeIntervalSpecialOptions,\n type TimeIntervalToolsValue,\n useFilterTimeIntervalValidators,\n useTimeIntervalOptions,\n} from '@/labs/filters/filterTimeIntervalTools'\nimport ADialogToolbar from '@/components/ADialogToolbar.vue'\nimport AFormDatetimePicker from '@/components/form/AFormDatetimePicker.vue'\nimport type { DatetimeUTCNullable } from '@/types/common'\nimport ARow from '@/components/ARow.vue'\nimport { dateTimeNow, dateTimePretty, isDatetimeUTC } from '@/utils/datetime'\nimport { useAlerts } from '@/composables/system/alerts'\n\nconst props = withDefaults(\n defineProps<{\n nameFrom: string\n nameUntil: string\n allowed?: TimeIntervalToolsValue[]\n placeholder?: string | undefined\n dataCy?: string\n }>(),\n {\n allowed: undefined,\n placeholder: undefined,\n dataCy: 'filter-time-interval',\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst touched = inject(FilterTouchedKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(touched) ||\n isUndefined(filterSelected) ||\n isUndefined(filterConfig) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.nameFrom]) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.nameUntil]) ||\n isUndefined(filterData) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterData[props.nameFrom]) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterData[props.nameUntil])\n) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst modelValue = computed({\n get() {\n return filterData[props.nameFrom]\n },\n set(newValue) {\n filterData[props.nameFrom] = newValue\n updateSelected()\n touched.value = true\n emit('change')\n },\n})\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { timeIntervalOptions, getTimeIntervalOption } = useTimeIntervalOptions(props.allowed)\nconst modelInternal = ref<TimeIntervalToolsValue>(null)\nconst dialogCustom = ref(false)\nconst dialogData = ref<{ from: DatetimeUTCNullable; until: DatetimeUTCNullable }>({\n from: null,\n until: dateTimeNow(),\n})\nconst displayFromTo = ref(false)\n\nconst { v$ } = useFilterTimeIntervalValidators(dialogData)\n\nconst filterConfigCurrent = computed(() => filterConfig.fields[props.nameFrom])\n\nconst { t } = useI18n()\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\nconst { clearOne } = useFilterClearHelpers()\nconst { showValidationError } = useAlerts()\n\nconst onClear = () => {\n displayFromTo.value = false\n modelInternal.value = null\n clearField()\n}\n\nconst onDialogConfirm = () => {\n v$.value.$touch()\n if (v$.value.$invalid) {\n showValidationError()\n return\n }\n displayFromTo.value = true\n dialogCustom.value = false\n filterData[props.nameUntil] = dialogData.value.until\n modelValue.value = dialogData.value.from\n}\n\nconst onDialogClose = () => {\n dialogCustom.value = false\n modelInternal.value = null\n}\n\nconst clearField = () => {\n clearOne(props.nameFrom, filterData, filterConfig)\n filterSelected.value.delete(props.nameFrom)\n}\n\nconst updateSelected = () => {\n if (isArray(modelValue.value) || isBoolean(modelValue.value)) return\n if (isNull(modelValue.value) || isUndefined(modelValue.value)) {\n filterSelected.value.delete(props.nameFrom)\n return\n }\n const found = getTimeIntervalOption(modelValue.value as TimeIntervalToolsValue)\n if (!found && isDatetimeUTC(modelValue.value)) {\n const customOption = getTimeIntervalOption(TimeIntervalSpecialOptions.Custom)!\n filterSelected.value.set(props.nameFrom, [\n {\n title:\n customOption.title +\n ': ' +\n dateTimePretty(dialogData.value.from) +\n ' - ' +\n dateTimePretty(dialogData.value.until),\n value: modelValue.value,\n },\n ])\n return\n }\n if (!found) return\n filterSelected.value.set(props.nameFrom, [{ title: found.title, value: modelValue.value }])\n}\n\nconst onEditInterval = (clear = false) => {\n v$.value.$reset()\n if (clear) {\n dialogData.value.from = null\n dialogData.value.until = dateTimeNow()\n }\n dialogCustom.value = true\n}\n\nwatch(modelInternal, (newValue) => {\n if (newValue === TimeIntervalSpecialOptions.Custom) {\n onEditInterval(true)\n return\n }\n filterData[props.nameUntil] = null\n modelValue.value = newValue\n})\n\nwatch(modelValue, (newValue) => {\n if (isArray(newValue) || isBoolean(newValue)) return\n displayFromTo.value = false\n if (isUndefined(newValue) || isNull(newValue)) {\n modelInternal.value = null\n return\n }\n const found = getTimeIntervalOption(modelValue.value as TimeIntervalToolsValue)\n const filterDataUntil = filterData[props.nameUntil]\n if (!found && isDatetimeUTC(modelValue.value) && isDatetimeUTC(filterDataUntil)) {\n modelInternal.value = TimeIntervalSpecialOptions.Custom\n dialogData.value.from = modelValue.value\n dialogData.value.until = filterDataUntil\n displayFromTo.value = true\n }\n if (found) {\n modelInternal.value = found.value\n }\n}, { immediate: true })\n\nwatch(\n [() => filterData[props.nameFrom], () => filterData[props.nameUntil]],\n ([nameFromNewValue, nameUntilNewValue], [nameFromOldValue, nameUntilOldValue]) => {\n if (nameFromNewValue === nameFromOldValue && nameUntilNewValue === nameUntilOldValue) return\n if (\n isBoolean(nameFromNewValue) ||\n isBoolean(nameUntilNewValue) ||\n isUndefined(nameFromNewValue) ||\n isUndefined(nameUntilNewValue) ||\n (isArray(nameFromNewValue) && nameFromNewValue.length === 0) ||\n (isArray(nameUntilNewValue) && nameUntilNewValue.length === 0)\n ) {\n return\n }\n updateSelected()\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VTextarea\n v-if=\"displayFromTo\"\n :label=\"label\"\n :model-value=\"dateTimePretty(dialogData.from) + ' - ' + dateTimePretty(dialogData.until)\"\n readonly\n rows=\"1\"\n auto-grow\n hide-details\n append-inner-icon=\"mdi-menu-down\"\n clearable\n class=\"cursor-pointer\"\n @click:clear.stop=\"onClear\"\n @click.stop=\"onEditInterval()\"\n />\n <VSelect\n v-else\n v-model=\"modelInternal\"\n item-title=\"title\"\n item-value=\"value\"\n :label=\"label\"\n :clearable=\"!isNull(modelInternal)\"\n no-filter\n :data-cy=\"dataCy\"\n :items=\"timeIntervalOptions\"\n hide-details\n @click:clear.stop=\"onClear\"\n />\n <VDialog\n v-if=\"dialogCustom\"\n :model-value=\"true\"\n width=\"auto\"\n :min-width=\"360\"\n >\n <VCard>\n <ADialogToolbar @on-cancel=\"onDialogClose\">\n <slot name=\"title\">\n {{ label }}\n </slot>\n </ADialogToolbar>\n <VCardText>\n <ARow>\n <AFormDatetimePicker\n v-model=\"dialogData.from\"\n :v=\"v$.dialogData.from\"\n label=\"From\"\n required\n />\n </ARow>\n <ARow>\n <AFormDatetimePicker\n v-model=\"dialogData.until\"\n :v=\"v$.dialogData.until\"\n label=\"Until\"\n required\n />\n </ARow>\n </VCardText>\n <VCardActions>\n <VSpacer />\n <ABtnTertiary\n data-cy=\"button-cancel\"\n @click.stop=\"onDialogClose\"\n >\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <ABtnPrimary\n data-cy=\"button-confirm\"\n @click.stop=\"onDialogConfirm\"\n >\n {{ t('common.button.confirm') }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n\n<style lang=\"scss\" scoped>\n.v-text-field.cursor-pointer {\n ::v-deep(.v-field),\n ::v-deep(.v-field__input) {\n cursor: pointer;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport { computed, inject, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n FilterTouchedKey,\n} from '@/labs/filters/filterInjectionKeys'\nimport { isArray, isBoolean, isNull, isUndefined } from '@/utils/common'\nimport { useFilterClearHelpers } from '@/labs/filters/filterFactory'\n\nconst props = withDefaults(\n defineProps<{\n name: string\n items: ValueObjectOption<string | number>[]\n }>(),\n {}\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst submitResetCounter = inject(FilterSubmitResetCounterKey)\nconst touched = inject(FilterTouchedKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\n\nif (\n isUndefined(submitResetCounter) ||\n isUndefined(touched) ||\n isUndefined(filterSelected) ||\n isUndefined(filterConfig) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name]) ||\n isUndefined(filterData) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterData[props.name])\n) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst modelValue = computed({\n get() {\n return filterData[props.name]\n },\n set(newValue) {\n filterData[props.name] = newValue\n updateSelected()\n touched.value = true\n emit('change')\n },\n})\n\nconst filterConfigCurrent = computed(() => filterConfig.fields[props.name])\n\nconst { t } = useI18n()\n\nconst label = computed(() => {\n return filterConfigCurrent.value.titleT ? t(filterConfigCurrent.value.titleT) : undefined\n})\n\nconst { clearOne } = useFilterClearHelpers()\n\nconst clearField = () => {\n clearOne(props.name, filterData, filterConfig)\n filterSelected.value.delete(props.name)\n}\n\nconst updateSelected = () => {\n if (isArray(modelValue.value) && modelValue.value.length === 0) return\n if (isArray(modelValue.value)) {\n filterSelected.value.set(\n props.name,\n modelValue.value.map((modelItemValue) => {\n const found = props.items.find((item) => item.value === modelItemValue)\n if (found) return { title: found.title, value: found.value }\n return { title: modelItemValue as string, value: modelItemValue as string }\n })\n )\n return\n }\n const found = props.items.find((item) => item.value === modelValue.value)\n if (found) {\n filterSelected.value.set(props.name, [{ title: found.title as string, value: found.value as string }])\n }\n}\n\nwatch(\n () => filterData[props.name],\n (newValue, oldValue) => {\n if (newValue === oldValue || isBoolean(newValue)) return\n if (isNull(newValue) || isUndefined(newValue) || (isArray(newValue) && newValue.length === 0)) {\n return\n }\n updateSelected()\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <VAutocomplete\n v-model=\"modelValue\"\n :items=\"items\"\n :chips=\"filterConfigCurrent.multiple\"\n :label=\"label\"\n :multiple=\"filterConfigCurrent.multiple\"\n :clearable=\"!filterConfigCurrent.mandatory\"\n data-cy=\"filter-value\"\n hide-details\n @click:clear.stop=\"clearField\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport { ref } from 'vue'\nimport { eventClickBlur } from '@/utils/event'\nimport { useI18n } from 'vue-i18n'\n\nwithDefaults(\n defineProps<{\n tooltipT?: string\n buttonClass?: string\n dataCy?: string\n }>(),\n {\n tooltipT: 'common.button.advancedFilters',\n buttonClass: 'mt-1',\n dataCy: 'filter-advanced',\n }\n)\nconst emit = defineEmits<{\n (e: 'advancedFilter'): void\n}>()\n\nconst active = ref(false)\n\nconst onClick = (event: Event) => {\n eventClickBlur(event)\n active.value = !active.value\n emit('advancedFilter')\n}\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <VBtn\n :class=\"buttonClass\"\n :data-cy=\"dataCy\"\n icon\n size=\"x-small\"\n variant=\"text\"\n @click.stop=\"onClick\"\n >\n <VIcon icon=\"mdi-filter-variant\" />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t(tooltipT) }}\n </VTooltip>\n </VBtn>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, inject, toRaw } from 'vue'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterSelectedKey,\n FilterTouchedKey,\n} from '@/labs/filters/filterInjectionKeys'\nimport { isArray, isBoolean, isNumber, isString, isUndefined } from '@/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport type { AllowedFilterValues } from '@/labs/filters/filterFactory'\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst filterSelected = inject(FilterSelectedKey)\nconst touched = inject(FilterTouchedKey)\n\nif (isUndefined(filterConfig) || isUndefined(filterData) || isUndefined(filterSelected) || isUndefined(touched)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\n\nconst getTitleFromConfig = (name: string) => {\n const titleT = filterConfig.fields?.[name]?.titleT\n if (titleT) return t(titleT)\n return name\n}\n\nconst selectedArray = computed(() => {\n const fieldOrder = Object.keys(filterConfig.fields)\n return Array.from(filterSelected.value)\n .map(([key, valueArray]) => ({\n name: key,\n title: getTitleFromConfig(key),\n options: valueArray,\n }))\n .sort((a, b) => fieldOrder.indexOf(a.name) - fieldOrder.indexOf(b.name))\n})\n\nconst clickClose = (name: string, optionValue: number | string) => {\n // update selected\n const selectedFound = filterSelected.value.get(name)\n if (selectedFound && selectedFound.length === 1) {\n filterSelected.value.delete(name)\n } else if (selectedFound) {\n const foundIndex = selectedFound.findIndex((item) => item.value === optionValue)\n selectedFound.splice(foundIndex, 1)\n }\n // update data\n if (isArray(filterData[name]) && filterData[name].length > 0) {\n const foundIndex = filterData[name].findIndex((item) => item === optionValue)\n const newArray = [...toRaw(filterData[name])]\n newArray.splice(foundIndex, 1)\n filterData[name] = newArray as AllowedFilterValues\n } else if (isString(filterData[name]) || isNumber(filterData[name])) {\n filterData[name] = filterConfig.fields[name].default\n } else if (isBoolean(filterData[name])) {\n filterData[name] = filterConfig.fields[name].default\n }\n touched.value = true\n}\n</script>\n\n<template>\n <div\n v-for=\"item in selectedArray\"\n :key=\"item.name\"\n class=\"a-selected-filters\"\n >\n <div class=\"a-selected-filters__label text-caption\">\n {{ item.title }}:\n </div>\n <div\n v-for=\"option in item.options\"\n :key=\"option.value\"\n class=\"a-selected-filters__chips\"\n >\n <VChip\n closable\n size=\"small\"\n class=\"a-selected-filters__chip\"\n @click:close.stop=\"clickClose(item.name, option.value)\"\n >\n <template #close>\n <VIcon\n size=\"16\"\n icon=\"mdi-close-circle\"\n />\n </template>\n {{ option.title }}\n </VChip>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n.a-selected-filters {\n display: inline-flex;\n align-items: center;\n background: #f5f5f5;\n border-radius: 20px;\n padding: 4px 4px 4px 12px;\n margin: 0 4px 2px 0;\n gap: 8px;\n max-width: 100%;\n\n &__label {\n white-space: nowrap;\n }\n\n &__chips {\n display: flex;\n gap: 4px;\n flex-wrap: wrap;\n }\n\n &__chip {\n background: white;\n box-shadow: none;\n\n .v-chip__content {\n max-width: 40vw;\n }\n\n &:hover .v-chip__close {\n opacity: 0.8;\n }\n }\n\n .v-chip__close {\n opacity: 0.3;\n transition: opacity 0.2s;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nconst props = withDefaults(\n defineProps<{\n name: string\n }>(),\n {}\n)\n</script>\n\n<template>\n <div>{{ props.name }}</div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject } from 'vue'\nimport { FilterConfigKey } from '@/labs/filters/filterInjectionKeys'\nimport { isUndefined } from '@/utils/common'\nimport AFilterEmpty from '@/labs/filters/AFilterEmpty.vue'\nimport AFilterString from '@/labs/filters/AFilterString.vue'\nimport AFilterBooleanSelect from '@/labs/filters/AFilterBooleanSelect.vue'\nimport AFilterDatetimePicker from '@/labs/filters/AFilterDatetimePicker.vue'\nimport AFilterInteger from '@/labs/filters/AFilterInteger.vue'\n\nconst props = withDefaults(\n defineProps<{\n name: string\n }>(),\n {}\n)\n\nconst filterConfig = inject(FilterConfigKey)\n\nif (\n isUndefined(filterConfig) ||\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n isUndefined(filterConfig.fields[props.name])\n) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst filterConfigCurrent = computed(() => filterConfig.fields[props.name])\n\nconst componentComputed = computed(() => {\n if (filterConfigCurrent.value.render.skip) return AFilterEmpty\n switch (filterConfigCurrent.value.type) {\n case 'string':\n return AFilterString\n case 'datetime':\n return AFilterDatetimePicker\n case 'boolean':\n return AFilterBooleanSelect\n case 'integer':\n return AFilterInteger\n default:\n return AFilterEmpty\n }\n})\n</script>\n\n<template>\n <component\n :is=\"componentComputed\"\n :name=\"name\"\n />\n</template>\n","import { reactive } from 'vue'\nimport { createFilter, type FilterStore, type MakeFilterOption } from '@/labs/filters/filterFactory'\n\nexport function useUserAdminConfigInnerFilter(system: string, subject: string = 'userAdminConfig') {\n const filterFields = [\n { name: 'user' as const },\n { name: 'configType' as const },\n { name: 'layoutType' as const },\n { name: 'systemResource' as const },\n { name: 'customName' as const },\n { name: 'defaultConfig' as const },\n ] satisfies readonly MakeFilterOption[]\n\n const { filterConfig, filterData } = createFilter(\n filterFields,\n reactive<FilterStore<{ name: (typeof filterFields)[number]['name'] }[]>>({\n user: null,\n configType: null,\n layoutType: null,\n systemResource: null,\n customName: null,\n defaultConfig: null,\n }),\n {\n system,\n subject,\n }\n )\n\n return {\n filterConfig,\n filterData,\n }\n}\n","import type { AnzuUserAndTimeTrackingAware } from '@/types/AnzuUserAndTimeTrackingAware'\nimport type { SortableItemDataAware } from '@/components/sortable/sortableUtils'\nimport type { IntegerId } from '@/types/common'\nimport type { DatatableSortBy } from '@/composables/system/datatableColumns'\n\nexport interface UserAdminConfig<TData = UserAdminConfigDataFilterBookmark | UserAdminConfigDataPinnedWidgets>\n extends AnzuUserAndTimeTrackingAware,\n SortableItemDataAware {\n id: IntegerId\n user: IntegerId\n configType: UserAdminConfigTypeType\n layoutType: UserAdminConfigLayoutTypeType\n systemResource: string\n customName: string\n defaultConfig: boolean\n data: TData\n position: number\n _resourceName: 'userAdminConfig'\n _system: string\n}\n\nexport const UserAdminConfigType = {\n PinnedWidgets: 'pinnedWidgets',\n FilterBookmark: 'filterBookmark',\n} as const\nexport const UserAdminConfigTypeDefault = UserAdminConfigType.PinnedWidgets\nexport type UserAdminConfigTypeType = (typeof UserAdminConfigType)[keyof typeof UserAdminConfigType]\n\nexport const UserAdminConfigLayoutType = {\n Desktop: 'desktop',\n Mobile: 'mobile',\n} as const\nexport const UserAdminConfigLayoutTypeDefault = UserAdminConfigLayoutType.Desktop\nexport type UserAdminConfigLayoutTypeType = (typeof UserAdminConfigLayoutType)[keyof typeof UserAdminConfigLayoutType]\n\nexport interface UserAdminConfigDataFilterBookmark {\n filter: string\n datatableHiddenColumns?: string[]\n sortBy?: DatatableSortBy\n}\n\nexport type UserAdminConfigDataPinnedWidgets<TVariant extends string = string> = Array<{\n variant: TVariant\n position: number\n}>\n","import { ref } from 'vue'\nimport { isArray, isBoolean, isNull, isNumber, isString, isUndefined } from '@/utils/common'\nimport type { FilterVariant } from '@/types/Filter'\nimport type { AllowedFilterValues, FilterConfig, FilterData, FilterField } from '@/labs/filters/filterFactory'\nimport type { DatetimeUTCNullable } from '@/types/common'\nimport { TimeIntervalSpecialOptions, type TimeIntervalToolsValue } from '@/labs/filters/filterTimeIntervalTools'\nimport { dateModifyMinutes, dateTimeNow, dateTimeToDate, dateToUtc, getMonthInterval } from '@/utils/datetime'\nimport { SortOrder } from '@/composables/system/datatableColumns'\n\n/**\n * Docs: /doc/Admin-Cms-Doc/Filters.md\n */\nexport function useApiQueryBuilder() {\n const q = ref<string[]>([])\n\n const querySetLimit = (value: number): void => {\n queryAdd('limit', value)\n }\n\n const querySetOffset = (page: number, limit: number): void => {\n queryAdd('offset', page * limit - limit)\n }\n\n const querySetOrder = (field: string | null, desc: boolean): void => {\n if (!isNull(field) && field.length > 0) queryAdd('order[' + field + ']', desc ? SortOrder.Desc : SortOrder.Asc)\n }\n\n const formatValue = (value: string | number | boolean): string | number => {\n if (isBoolean(value)) {\n return value ? '1' : '0'\n }\n return value\n }\n\n const queryAddFilter = (filterVariant: FilterVariant, field: string, value: string | number | boolean): void => {\n if (isString(value) && value.length === 0) return\n q.value.push('filter_' + filterVariant + '[' + field + ']=' + formatValue(value))\n }\n\n const resolveTimeIntervalFilter = (\n fromName: string,\n untilName: string,\n filterData: FilterData<any>,\n filterConfig: FilterConfig<any>,\n mandatory: boolean\n ): null | {\n from: DatetimeUTCNullable\n until: DatetimeUTCNullable\n } => {\n let fromValue = filterData[fromName] as TimeIntervalToolsValue\n let untilValue = filterData[untilName] as DatetimeUTCNullable\n if (isNull(fromValue) && mandatory) {\n fromValue = filterConfig.fields[fromName].default as TimeIntervalToolsValue\n }\n if (isNull(untilValue) && mandatory) {\n untilValue = filterConfig.fields[fromName].default as DatetimeUTCNullable\n }\n const now = dateTimeNow()\n const nowDate = dateTimeToDate(now)\n switch (fromValue) {\n case TimeIntervalSpecialOptions.CurrentMonth: {\n return getMonthInterval(nowDate, 'utc', 0, false)\n }\n case TimeIntervalSpecialOptions.LastMonth: {\n return getMonthInterval(nowDate, 'utc', -1, false)\n }\n case TimeIntervalSpecialOptions.Last3Months: {\n return getMonthInterval(nowDate, 'utc', -2, true)\n }\n case TimeIntervalSpecialOptions.Custom: {\n return {\n from: fromValue,\n until: untilValue,\n }\n }\n default: {\n if (isNumber(fromValue)) {\n return {\n from: dateToUtc(dateModifyMinutes(fromValue * -1, nowDate)),\n until: now,\n }\n }\n }\n }\n return null\n }\n\n const getValue = (\n value: AllowedFilterValues,\n config: FilterField\n ): string | number | boolean | null => {\n if (isNull(value)) {\n if (config.mandatory && !isUndefined(config.default)) {\n return isArray(config.default) ? config.default.join(',') : config.default\n }\n return null\n }\n if (isString(value)) {\n if (value.length === 0) {\n if (config.mandatory && !isUndefined(config.default) && !isNull(config.default)) {\n return encodeURIComponent(isArray(config.default) ? config.default.join(',') : config.default)\n }\n return null\n }\n return encodeURIComponent(value)\n }\n if (isArray(value)) {\n if (value.length === 0) {\n if (config.mandatory && isArray(config.default)) {\n return config.default.map((item) => (isString(item) ? encodeURIComponent(item) : item)).join(',')\n }\n return null\n }\n return value.map((item) => (isString(item) ? encodeURIComponent(item) : item)).join(',')\n }\n if (isNumber(value) || isBoolean(value)) {\n return value\n }\n\n return null\n }\n\n const queryAdd = (key: string, value: any): void => {\n q.value.push(key + '=' + value)\n }\n\n const queryBuild = (): string => {\n return '?' + q.value.join('&')\n }\n\n const querySetFilters = (filterData: FilterData<any>, filterConfig: FilterConfig<any>): void => {\n const isSearchApi = filterConfig.general.elastic\n for (const filterName in filterData) {\n const filterFieldValue = filterData[filterName] as AllowedFilterValues\n const filterFieldConfig = filterConfig.fields[filterName]\n if (isUndefined(filterFieldConfig) || filterFieldConfig.exclude) {\n continue\n }\n if (filterFieldConfig.type === 'timeInterval' && !isUndefined(filterFieldConfig.related)) {\n const data = resolveTimeIntervalFilter(\n filterName,\n filterFieldConfig.related,\n filterData,\n filterConfig,\n filterFieldConfig.mandatory\n )\n if (isNull(data)) {\n continue\n }\n if (isSearchApi) {\n queryAdd(filterName, data.from)\n queryAdd(filterFieldConfig.related, data.until)\n continue\n }\n if (data.from) queryAddFilter('gte', filterName, data.from)\n if (data.until) queryAddFilter('lte', filterFieldConfig.related, data.until)\n continue\n }\n const value = getValue(filterFieldValue, filterFieldConfig)\n if (isNull(value)) {\n continue\n }\n if (isSearchApi) {\n queryAdd(filterName, value)\n continue\n }\n queryAddFilter(filterFieldConfig.variant, filterName, value)\n }\n }\n\n return {\n querySetLimit,\n querySetOffset,\n querySetOrder,\n queryAddFilter,\n querySetFilters,\n queryAdd,\n queryBuild,\n }\n}\n","/**\n * Custom error class for Axios-related errors\n */\nexport class AnzuApiAxiosError extends Error {\n constructor(cause: Error) {\n super('API request failed')\n this.name = 'AnzuApiAxiosError'\n this.cause = cause\n }\n}\n","import axios from 'axios'\n\nexport const axiosErrorIsTimeout = (error: Error) => {\n return (\n axios.isAxiosError(error) &&\n (error.code === 'ECONNABORTED' ||\n error.message.includes('timeout') ||\n (error.cause instanceof Error && error.cause.message.includes('timeout')))\n )\n}\n\n/**\n * Custom error class for timeout error\n */\nexport class AnzuApiTimeoutError extends Error {\n constructor(cause: Error | undefined = undefined) {\n super('API request failed')\n this.name = 'AnzuApiAxiosError'\n this.cause = cause\n }\n}\n","import { AnzuApiResponseCodeError, isAnzuApiResponseCodeError } from '@/model/error/AnzuApiResponseCodeError'\nimport { AnzuApiValidationError, axiosErrorResponseHasValidationData } from '@/model/error/AnzuApiValidationError'\nimport { replaceUrlParameters, type UrlParams } from '@/services/api/apiHelper'\nimport { isValidHTTPStatus } from '@/utils/response'\nimport type { AxiosInstance, AxiosRequestConfig } from 'axios'\nimport axios from 'axios'\nimport { useApiQueryBuilder } from '@/labs/api/useApiQueryBuilder'\nimport { AnzuApiForbiddenError, axiosErrorResponseIsForbidden } from '@/model/error/AnzuApiForbiddenError'\nimport { AnzuFatalError } from '@/model/error/AnzuFatalError'\nimport type { ApiInfiniteResponseList, ApiResponseList } from '@/types/ApiResponse'\nimport { isApiInfiniteResponseList, isApiResponseList } from '@/types/ApiResponse'\nimport {\n AnzuApiForbiddenOperationError,\n axiosErrorResponseHasForbiddenOperationData,\n} from '@/model/error/AnzuApiForbiddenOperationError'\nimport { HTTP_STATUS_NO_CONTENT } from '@/composables/statusCodes'\nimport {\n AnzuApiDependencyExistsError,\n axiosErrorResponseHasDependencyExistsData,\n} from '@/model/error/AnzuApiDependencyExistsError'\nimport type { FilterConfig, FilterData } from '@/labs/filters/filterFactory'\nimport type { Ref } from 'vue'\nimport { AnzuApiAxiosError } from '@/model/error/AnzuApiAxiosError'\nimport { AnzuApiTimeoutError, axiosErrorIsTimeout } from '@/model/error/AnzuApiTimeoutError'\nimport { isUndefined } from '@/utils/common'\nimport type { Pagination } from '@/labs/filters/pagination'\nimport { SortOrder } from '@/composables/system/datatableColumns'\n\nexport const generateListQuery = (\n pagination: Ref<Pagination>,\n filterData: FilterData<any>,\n filterConfig: FilterConfig<any>\n): string => {\n const { querySetLimit, querySetOffset, querySetOrder, queryBuild, querySetFilters } = useApiQueryBuilder()\n querySetLimit(pagination.value.rowsPerPage)\n querySetOffset(pagination.value.page, pagination.value.rowsPerPage)\n if (pagination.value.sortBy) {\n querySetOrder(pagination.value.sortBy.key, pagination.value.sortBy.order === SortOrder.Desc)\n }\n querySetFilters(filterData, filterConfig)\n return queryBuild()\n}\n\n/**\n * @template R Response type override, optional\n */\nexport const useApiFetchList = <R>(\n client: () => AxiosInstance,\n system: string,\n entity: string,\n options: AxiosRequestConfig = {}\n): UseApiFetchListReturnType<R> => {\n let abortController: AbortController | null = null\n\n const executeFetch = async (\n pagination: Ref<Pagination>,\n filterData: FilterData<any>,\n filterConfig: FilterConfig<any>,\n urlTemplate: string,\n urlParams: UrlParams | undefined = undefined\n ): Promise<R> => {\n abortController = new AbortController()\n\n try {\n const searchApi = filterConfig.general.elastic ? '/search' : ''\n const url =\n (isUndefined(urlParams) ? urlTemplate : replaceUrlParameters(urlTemplate, urlParams)) +\n searchApi +\n generateListQuery(pagination, filterData, filterConfig)\n\n const res = await client().get(url, {\n ...options,\n signal: abortController.signal,\n })\n\n if (!isValidHTTPStatus(res.status)) {\n throw new AnzuApiResponseCodeError(res.status)\n }\n\n if (res.data) {\n const resData = res.data as unknown as ApiResponseList<R> | ApiInfiniteResponseList<R>\n if (isApiInfiniteResponseList(resData)) {\n pagination.value = {\n ...pagination.value,\n ...{ hasNextPage: resData.hasNextPage, currentViewCount: res.data.data.length },\n }\n } else if (isApiResponseList(resData)) {\n pagination.value = {\n ...pagination.value,\n ...{ totalCount: resData.totalCount, currentViewCount: res.data.data.length },\n }\n }\n return resData.data\n }\n\n if (res.status === HTTP_STATUS_NO_CONTENT) {\n return [] as R\n }\n\n throw new AnzuFatalError()\n } catch (err: any) {\n if (err instanceof DOMException && err.name === 'AbortError') {\n return [] as R\n }\n\n if (isAnzuApiResponseCodeError(err)) {\n throw err\n }\n\n if (axiosErrorResponseIsForbidden(err)) {\n throw new AnzuApiForbiddenError(err)\n }\n\n if (axiosErrorResponseHasValidationData(err)) {\n throw new AnzuApiValidationError(err, system, entity, err)\n }\n\n if (axiosErrorResponseHasDependencyExistsData(err)) {\n throw new AnzuApiDependencyExistsError(err, system, entity, err)\n }\n\n if (axiosErrorResponseHasForbiddenOperationData(err)) {\n throw new AnzuApiForbiddenOperationError(err, err)\n }\n\n if (axiosErrorIsTimeout(err)) {\n throw new AnzuApiTimeoutError(err)\n }\n\n if (axios.isAxiosError(err)) {\n console.error('Axios error: ' + urlTemplate, err.cause)\n throw new AnzuApiAxiosError(err)\n }\n\n console.error('AnzuFatalError: ', err)\n throw new AnzuFatalError(err)\n } finally {\n abortController = null\n }\n }\n\n const abortFetch = () => {\n if (abortController) {\n abortController.abort()\n }\n }\n\n return {\n executeFetch,\n abortFetch,\n }\n}\n\nexport type UseApiFetchListReturnType<R> = {\n executeFetch: (\n pagination: Ref<Pagination>,\n filterData: FilterData<any>,\n filterConfig: FilterConfig<any>,\n urlTemplate: string,\n urlParams?: UrlParams | undefined\n ) => Promise<R>\n abortFetch: () => void\n}\n","import { AnzuApiResponseCodeError, isAnzuApiResponseCodeError } from '@/model/error/AnzuApiResponseCodeError'\nimport { AnzuApiValidationError, axiosErrorResponseHasValidationData } from '@/model/error/AnzuApiValidationError'\nimport { replaceUrlParameters, type UrlParams } from '@/services/api/apiHelper'\nimport { isNull, isUndefined } from '@/utils/common'\nimport { isValidHTTPStatus } from '@/utils/response'\nimport axios, { type AxiosInstance, type AxiosRequestConfig, type Method } from 'axios'\nimport { AnzuFatalError } from '@/model/error/AnzuFatalError'\nimport { AnzuApiForbiddenError, axiosErrorResponseIsForbidden } from '@/model/error/AnzuApiForbiddenError'\nimport {\n AnzuApiForbiddenOperationError,\n axiosErrorResponseHasForbiddenOperationData,\n} from '@/model/error/AnzuApiForbiddenOperationError'\nimport { HTTP_STATUS_NO_CONTENT } from '@/composables/statusCodes'\nimport {\n AnzuApiDependencyExistsError,\n axiosErrorResponseHasDependencyExistsData,\n} from '@/model/error/AnzuApiDependencyExistsError'\nimport { AnzuApiTimeoutError, axiosErrorIsTimeout } from '@/model/error/AnzuApiTimeoutError'\nimport { AnzuApiAxiosError } from '@/model/error/AnzuApiAxiosError'\n\n/**\n * @template T Type used for request payload, by default same as Response type\n * @template R Response type override, optional\n */\nexport const useApiRequest = <R, T = R>(\n client: () => AxiosInstance,\n method: Method,\n system: string,\n entity: string,\n options: AxiosRequestConfig = {}\n): UseApiAnyRequestReturnType<R, T> => {\n let abortController: AbortController | null = null\n\n const executeRequest = async (\n urlTemplate = '',\n urlParams: UrlParams | undefined = undefined,\n object: T | undefined = undefined\n ): Promise<R> => {\n abortController = new AbortController()\n\n try {\n const axiosConfig: AxiosRequestConfig = { method: method }\n axiosConfig.url = urlTemplate\n if (urlTemplate !== '' && !isUndefined(urlParams)) {\n axiosConfig.url = replaceUrlParameters(urlTemplate, urlParams)\n }\n if (!isNull(object)) {\n axiosConfig.data = JSON.stringify(object)\n }\n const res = await client().request({\n ...options,\n ...axiosConfig,\n signal: abortController.signal,\n })\n\n if (!isValidHTTPStatus(res.status)) {\n throw new AnzuApiResponseCodeError(res.status)\n }\n\n if (res.data) {\n return res.data as R\n }\n\n if (res.status === HTTP_STATUS_NO_CONTENT) {\n return undefined as R\n }\n\n throw new AnzuFatalError()\n } catch (err: any) {\n if (err instanceof DOMException && err.name === 'AbortError') {\n return [] as R\n }\n\n if (isAnzuApiResponseCodeError(err)) {\n throw err\n }\n\n if (axiosErrorResponseIsForbidden(err)) {\n throw new AnzuApiForbiddenError(err)\n }\n\n if (axiosErrorResponseHasValidationData(err)) {\n throw new AnzuApiValidationError(err, system, entity, err)\n }\n\n if (axiosErrorResponseHasDependencyExistsData(err)) {\n throw new AnzuApiDependencyExistsError(err, system, entity, err)\n }\n\n if (axiosErrorResponseHasForbiddenOperationData(err)) {\n throw new AnzuApiForbiddenOperationError(err, err)\n }\n\n if (axiosErrorIsTimeout(err)) {\n throw new AnzuApiTimeoutError(err)\n }\n\n if (axios.isAxiosError(err)) {\n console.error('Axios error: ' + urlTemplate, err.cause)\n throw new AnzuApiAxiosError(err)\n }\n\n console.error('AnzuFatalError: ', err)\n throw new AnzuFatalError(err)\n } finally {\n abortController = null\n }\n }\n\n const abortRequest = () => {\n if (abortController) {\n abortController.abort()\n }\n }\n\n return {\n executeRequest,\n abortRequest,\n }\n}\n\nexport type UseApiAnyRequestReturnType<R, T = R> = {\n executeRequest: (urlTemplate: string, urlParams?: UrlParams | undefined, object?: T | undefined) => Promise<R>\n abortRequest: () => void\n}\n","import type { AxiosInstance } from 'axios'\nimport { useApiFetchList } from '@/labs/api/useApiFetchList'\nimport type { IntegerId } from '@/types/common'\nimport type { UserAdminConfig } from '@/types/UserAdminConfig'\nimport { useApiRequest } from '@/labs/api/useApiRequest'\n\nexport const END_POINT = '/adm/v1/user-admin-config'\nconst ENTITY = 'userAdminConfig'\n\nexport function useUserAdminConfigApi(\n client: () => AxiosInstance,\n system: string,\n entity: string = ENTITY,\n endPoint: string = END_POINT\n) {\n const useFetchUserAdminConfigList = () => useApiFetchList<UserAdminConfig[]>(client, system, entity)\n\n const fetchUserAdminConfig = (id: IntegerId) => {\n const { executeRequest } = useApiRequest<UserAdminConfig>(client, 'GET', system, entity)\n return executeRequest(endPoint + '/:id', { id })\n }\n\n const createUserAdminConfig = (data: UserAdminConfig) => {\n const { executeRequest } = useApiRequest<UserAdminConfig>(client, 'POST', system, entity)\n return executeRequest(endPoint, undefined, data)\n }\n\n const updateUserAdminConfig = (id: IntegerId, data: UserAdminConfig) => {\n const { executeRequest } = useApiRequest<UserAdminConfig>(client, 'POST', system, entity)\n return executeRequest(endPoint + '/:id', { id }, data)\n }\n\n const deleteUserAdminConfig = (id: IntegerId) => {\n const { executeRequest } = useApiRequest(client, 'DELETE', system, entity)\n return executeRequest(endPoint + '/:id', { id })\n }\n\n const updateUserAdminConfigPositions = (ids: IntegerId[]) => {\n const { executeRequest } = useApiRequest<{ userAdminConfigs: IntegerId[] }>(client, 'PATCH', system, entity)\n return executeRequest(endPoint + '/update-positions', undefined, { userAdminConfigs: ids })\n }\n\n return {\n useFetchUserAdminConfigList,\n fetchUserAdminConfig,\n createUserAdminConfig,\n updateUserAdminConfig,\n deleteUserAdminConfig,\n updateUserAdminConfigPositions,\n }\n}\n","import { acceptHMRUpdate, defineStore } from 'pinia'\nimport { ref } from 'vue'\nimport { useUserAdminConfigInnerFilter } from '@/labs/filters/UserAdminConfigFilter'\nimport {\n type UserAdminConfig,\n type UserAdminConfigLayoutTypeType,\n UserAdminConfigType,\n} from '@/types/UserAdminConfig'\nimport type { IntegerId } from '@/types/common'\nimport type { UseApiFetchListReturnType } from '@/labs/api/useApiFetchList'\nimport { END_POINT } from '@/labs/filters/userAdminConfig'\nimport { usePagination } from '@/labs/filters/pagination'\nimport { SortOrder } from '@/composables/system/datatableColumns'\n\ninterface CacheItem<T = UserAdminConfig> {\n lastUsed: number\n items: T[]\n}\n\nconst MAX_BOOKMARKS = 3\nexport const MAX_BOOKMARK_ITEMS = 8\n\nexport const useFilterBookmarkStore = defineStore('filterBookmarkStore', () => {\n const bookmarks = ref(new Map<string, CacheItem>())\n const error = ref(false)\n\n function generateKey(system: string, layoutType: UserAdminConfigLayoutTypeType, systemResource: string) {\n return `${system}/userAdminConfig/${layoutType}/${systemResource}`\n }\n\n function removeOldestBookmark() {\n let oldestKey: string | null = null\n let oldestTime = Infinity\n bookmarks.value.forEach((value, bookmarkKey) => {\n if (value.lastUsed < oldestTime) {\n oldestTime = value.lastUsed\n oldestKey = bookmarkKey\n }\n })\n if (oldestKey !== null) {\n bookmarks.value.delete(oldestKey)\n }\n }\n\n async function getBookmarks(\n identifier: {\n system: string\n user: IntegerId\n layoutType: UserAdminConfigLayoutTypeType\n systemResource: string\n },\n useApiFetch: () => UseApiFetchListReturnType<UserAdminConfig[]>,\n forceFetch: boolean = false\n ): Promise<UserAdminConfig[]> {\n error.value = false\n const key = generateKey(identifier.system, identifier.layoutType, identifier.systemResource)\n const now = Date.now()\n\n if (!forceFetch) {\n const cached = bookmarks.value.get(key)\n if (cached) {\n cached.lastUsed = now\n return cached.items\n }\n }\n\n const pagination = usePagination({ key: 'position', order: SortOrder.Asc })\n pagination.value.rowsPerPage = MAX_BOOKMARK_ITEMS\n\n const { filterConfig, filterData } = useUserAdminConfigInnerFilter(identifier.system)\n filterData.configType = UserAdminConfigType.FilterBookmark\n filterData.layoutType = identifier.layoutType\n filterData.systemResource = identifier.systemResource\n filterData.user = identifier.user\n\n let items: UserAdminConfig[] = []\n try {\n const { executeFetch } = useApiFetch()\n items = await executeFetch(pagination, filterData, filterConfig, END_POINT)\n bookmarks.value.set(key, { lastUsed: now, items })\n } catch (e) {\n error.value = true\n }\n\n if (bookmarks.value.size > MAX_BOOKMARKS) {\n removeOldestBookmark()\n }\n\n return items\n }\n\n async function fetchBookmarksCount(\n identifier: {\n system: string\n user: IntegerId\n layoutType: UserAdminConfigLayoutTypeType\n systemResource: string\n },\n useApiFetch: () => UseApiFetchListReturnType<UserAdminConfig[]>\n ): Promise<number> {\n error.value = false\n const pagination = usePagination({ key: 'position', order: SortOrder.Asc })\n pagination.value.rowsPerPage = MAX_BOOKMARK_ITEMS + 1\n\n const { filterConfig, filterData } = useUserAdminConfigInnerFilter(identifier.system)\n filterData.configType = UserAdminConfigType.FilterBookmark\n filterData.layoutType = identifier.layoutType\n filterData.systemResource = identifier.systemResource\n filterData.user = identifier.user\n\n let length = Infinity\n try {\n const { executeFetch } = useApiFetch()\n const res = await executeFetch(pagination, filterData, filterConfig, END_POINT)\n length = res.length\n } catch (e) {\n error.value = true\n }\n\n return length\n }\n\n function addOne(key: string, data: UserAdminConfig) {\n bookmarks.value.get(key)?.items.push(data)\n }\n\n return {\n bookmarks,\n error,\n getBookmarks,\n generateKey,\n addOne,\n fetchBookmarksCount,\n }\n})\n\nif (import.meta.hot) {\n import.meta.hot.accept(acceptHMRUpdate(useFilterBookmarkStore, import.meta.hot))\n}\n","import type { UserAdminConfig } from '@/types/UserAdminConfig'\nimport { UserAdminConfigLayoutTypeDefault, UserAdminConfigTypeDefault } from '@/types/UserAdminConfig'\nimport { dateTimeNow } from '@/utils/datetime'\n\nexport function useUserAdminConfigFactory() {\n const createDefaultUserAdminConfig = (system: string): UserAdminConfig => {\n return {\n id: 0,\n user: 0,\n configType: UserAdminConfigTypeDefault,\n layoutType: UserAdminConfigLayoutTypeDefault,\n systemResource: '',\n customName: '',\n defaultConfig: false,\n data: [],\n position: 0,\n createdAt: dateTimeNow(),\n modifiedAt: dateTimeNow(),\n createdBy: null,\n modifiedBy: null,\n _resourceName: 'userAdminConfig',\n _system: system,\n }\n }\n\n return {\n createDefaultUserAdminConfig,\n }\n}\n","<script lang=\"ts\" setup>\nimport ADialogToolbar from '@/components/ADialogToolbar.vue'\nimport { useI18n } from 'vue-i18n'\nimport { inject, nextTick, ref, useTemplateRef, watch } from 'vue'\nimport AFormTextField from '@/components/form/AFormTextField.vue'\nimport ARow from '@/components/ARow.vue'\nimport AFormSwitch from '@/components/form/AFormSwitch.vue'\nimport type { SortableItem } from '@/components/sortable/sortableActions'\nimport ASortable from '@/components/sortable/ASortable.vue'\nimport type { AxiosInstance } from 'axios'\nimport type { IntegerId } from '@/types/common'\nimport { MAX_BOOKMARK_ITEMS, useFilterBookmarkStore } from '@/labs/filters/bookmarksStore'\nimport { useUserAdminConfigApi } from '@/labs/filters/userAdminConfig'\nimport { useAlerts } from '@/composables/system/alerts'\nimport { useUserAdminConfigFactory } from '@/model/factory/UserAdminConfigFactory'\nimport { type UserAdminConfig, UserAdminConfigLayoutType, UserAdminConfigType } from '@/types/UserAdminConfig'\nimport useVuelidate from '@vuelidate/core'\nimport { useValidate } from '@/validators/vuelidate/useValidate'\nimport { cloneDeep, isNull, isUndefined } from '@/utils/common'\nimport { DatatablePaginationKey, FilterConfigKey, FilterDataKey } from '@/labs/filters/filterInjectionKeys'\nimport { useFilterHelpers } from '@/labs/filters/filterFactory'\n\nconst props = withDefaults(\n defineProps<{\n client: () => AxiosInstance\n system: string\n user: IntegerId\n systemResource: string\n datatableHiddenColumns?: string[] | undefined\n }>(),\n {\n datatableHiddenColumns: undefined,\n }\n)\n\nconst emit = defineEmits<{\n (e: 'onClose'): void\n}>()\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination) || isUndefined(filterConfig) || isUndefined(filterData)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst activeTab = ref<'add' | 'manage'>('add')\nconst customName = ref('')\nconst storeDatatableHiddenColumns = ref(false)\nconst storeDatatableOrder = ref(false)\nconst saveButtonLoading = ref(false)\nconst listLoading = ref(false)\nconst errorCount = ref(false)\nconst itemsManage = ref<Array<UserAdminConfig>>([])\nconst itemEdit = ref<{ id: IntegerId; customName: string } | null>(null)\n\nconst { required, maxLength } = useValidate()\nconst rulesCreate = {\n customName: {\n required,\n maxLength: maxLength(100),\n },\n}\nconst vCreate$ = useVuelidate(rulesCreate, { customName }, { $stopPropagation: true })\nconst rulesEdit = {\n itemEdit: {\n required,\n maxLength: maxLength(100),\n },\n}\nconst vEdit$ = useVuelidate(rulesEdit, { itemEdit }, { $stopPropagation: true })\n\nconst filterBookmarkStore = useFilterBookmarkStore()\n\nconst {\n createUserAdminConfig,\n useFetchUserAdminConfigList,\n updateUserAdminConfigPositions,\n deleteUserAdminConfig,\n updateUserAdminConfig,\n} =\n // eslint-disable-next-line vue/no-setup-props-reactivity-loss\n useUserAdminConfigApi(props.client, props.system)\nconst { t } = useI18n()\nconst { showErrorsDefault, showValidationError } = useAlerts()\nconst { createDefaultUserAdminConfig } = useUserAdminConfigFactory()\n\nconst sortItems = async () => {\n saveButtonLoading.value = true\n const items = itemsManage.value\n const ids = items.map((item) => item.id)\n try {\n await updateUserAdminConfigPositions(ids)\n saveButtonLoading.value = false\n await reloadItems()\n emit('onClose')\n } catch (e) {\n showErrorsDefault(e)\n saveButtonLoading.value = false\n }\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { serializeFilters } = useFilterHelpers(filterData, filterConfig, props.systemResource)\n\nconst addBookmark = async () => {\n saveButtonLoading.value = true\n errorCount.value = false\n const config = createDefaultUserAdminConfig(props.system)\n config.user = props.user\n config.configType = UserAdminConfigType.FilterBookmark\n config.layoutType = UserAdminConfigLayoutType.Desktop\n config.systemResource = props.systemResource\n config.customName = customName.value\n config.data = {\n filter: serializeFilters(filterData, pagination, false),\n datatableHiddenColumns:\n storeDatatableHiddenColumns.value && props.datatableHiddenColumns ? props.datatableHiddenColumns : undefined,\n sortBy: storeDatatableOrder.value && pagination.value.sortBy ? pagination.value.sortBy : undefined,\n }\n try {\n const count = await filterBookmarkStore.fetchBookmarksCount(\n {\n system: props.system,\n user: props.user,\n layoutType: UserAdminConfigLayoutType.Desktop,\n systemResource: props.systemResource,\n },\n useFetchUserAdminConfigList\n )\n if (count >= MAX_BOOKMARK_ITEMS) {\n errorCount.value = true\n return\n }\n config.position = count + 1\n const res = await createUserAdminConfig(config)\n filterBookmarkStore.addOne(\n filterBookmarkStore.generateKey(\n props.system,\n UserAdminConfigLayoutType.Desktop,\n props.systemResource\n ),\n res\n )\n saveButtonLoading.value = false\n emit('onClose')\n } catch (e) {\n showErrorsDefault(e)\n saveButtonLoading.value = false\n }\n}\n\nconst onConfirm = () => {\n if (activeTab.value === 'add') {\n vCreate$.value.$touch()\n if (vCreate$.value.$invalid) {\n showValidationError()\n return\n }\n addBookmark()\n } else if (activeTab.value === 'manage' && itemsManage.value.length > 0) {\n sortItems()\n }\n}\n\nconst onDelete = async (data: SortableItem<UserAdminConfig>) => {\n listLoading.value = true\n try {\n await deleteUserAdminConfig(data.raw.id)\n await reloadItems()\n onItemCancel()\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n listLoading.value = false\n }\n}\n\nconst inputRef = useTemplateRef('inputRef')\n\nconst onEdit = async (data: SortableItem<UserAdminConfig>) => {\n itemEdit.value = { id: data.raw.id, customName: data.raw.customName }\n await nextTick()\n inputRef.value?.focus()\n}\n\nconst onItemConfirm = async (data: SortableItem<UserAdminConfig>) => {\n if (isNull(itemEdit.value)) return\n listLoading.value = true\n const modified = cloneDeep(data.raw)\n modified.customName = itemEdit.value.customName\n try {\n await updateUserAdminConfig(modified.id, modified)\n await reloadItems()\n onItemCancel()\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n listLoading.value = false\n }\n}\n\nconst onItemCancel = () => {\n itemEdit.value = null\n}\n\nconst reloadItems = async () => {\n listLoading.value = true\n try {\n itemsManage.value = await filterBookmarkStore.getBookmarks(\n {\n system: props.system,\n user: props.user,\n layoutType: UserAdminConfigLayoutType.Desktop,\n systemResource: props.systemResource,\n },\n useFetchUserAdminConfigList,\n true\n )\n } catch (e) {\n showErrorsDefault(e)\n } finally {\n listLoading.value = false\n }\n}\n\nwatch(activeTab, () => {\n errorCount.value = false\n if (activeTab.value === 'manage') {\n reloadItems()\n }\n})\n</script>\n\n<template>\n <VDialog\n :model-value=\"true\"\n :width=\"500\"\n >\n <VCard>\n <ADialogToolbar @on-cancel=\"emit('onClose')\">\n Bookmarks\n </ADialogToolbar>\n <VCardText class=\"pt-0\">\n <VTabs\n v-model=\"activeTab\"\n fixed-tabs\n >\n <VTab value=\"add\">\n Add bookmark\n </VTab>\n <VTab value=\"manage\">\n Manage bookmarks\n </VTab>\n </VTabs>\n <div\n v-if=\"activeTab === 'add'\"\n class=\"w-100 pt-4\"\n >\n <ARow title=\"Current selected filters will be stored with this bookmark.\" />\n <ARow\n v-if=\"errorCount\"\n class=\"text-error\"\n title=\"Max numbers of bookmarks reached. You can delete some bookmarks to add new one.\"\n />\n <ARow>\n <AFormTextField\n v-model=\"customName\"\n label=\"Name\"\n required\n :v=\"vCreate$.customName\"\n />\n </ARow>\n <ARow>\n <AFormSwitch\n v-model=\"storeDatatableHiddenColumns\"\n label=\"Save datatable columns also\"\n />\n </ARow>\n <ARow>\n <AFormSwitch\n v-model=\"storeDatatableOrder\"\n label=\"Save order\"\n />\n </ARow>\n </div>\n <div\n v-else-if=\"activeTab === 'manage'\"\n class=\"w-100 pt-4\"\n >\n <div\n v-if=\"listLoading\"\n class=\"d-flex w-100 align-center justify-center\"\n >\n <VProgressCircular indeterminate />\n </div>\n <ASortable\n v-else\n v-model=\"itemsManage\"\n show-edit-button\n show-delete-button\n @on-delete=\"onDelete\"\n @on-edit=\"onEdit\"\n >\n <template #item=\"{ item }: { item: SortableItem<UserAdminConfig> }\">\n <AFormTextField\n v-if=\"itemEdit && itemEdit.id === item.raw.id\"\n ref=\"inputRef\"\n v-model=\"itemEdit.customName\"\n hide-details=\"auto\"\n :v=\"vEdit$\"\n />\n <div v-else>\n {{ item.raw.customName }}\n </div>\n </template>\n <template\n v-if=\"!isNull(itemEdit)\"\n #item-buttons=\"{ item }: { item: SortableItem<UserAdminConfig> }\"\n >\n <div\n v-if=\"itemEdit && itemEdit.id === item.raw.id\"\n class=\"d-flex align-center justify-end\"\n >\n <VBtn\n icon\n size=\"x-small\"\n variant=\"text\"\n class=\"mx-1\"\n @click.stop=\"onItemConfirm(item)\"\n >\n <VIcon icon=\"mdi-check\" />\n <VTooltip\n anchor=\"bottom\"\n activator=\"parent\"\n :text=\"t('common.button.confirm')\"\n />\n </VBtn>\n <VBtn\n icon\n size=\"x-small\"\n variant=\"text\"\n class=\"mx-1\"\n @click.stop=\"onItemCancel()\"\n >\n <VIcon icon=\"mdi-close\" />\n <VTooltip\n anchor=\"bottom\"\n activator=\"parent\"\n :text=\"t('common.button.cancel')\"\n />\n </VBtn>\n </div>\n </template>\n </ASortable>\n </div>\n </VCardText>\n <VCardActions>\n <VSpacer />\n <ABtnTertiary\n data-cy=\"button-cancel\"\n @click.stop=\"emit('onClose')\"\n >\n {{ t('common.button.cancel') }}\n </ABtnTertiary>\n <ABtnPrimary\n data-cy=\"button-confirm\"\n :loading=\"saveButtonLoading\"\n :disabled=\"!isNull(itemEdit)\"\n @click.stop=\"onConfirm\"\n >\n {{ t('common.button.confirm') }}\n </ABtnPrimary>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n","<script lang=\"ts\" setup>\nimport { eventClickBlur } from '@/utils/event'\nimport { useI18n } from 'vue-i18n'\nimport FilterBookmarkDialog from '@/labs/filters/FilterBookmarkDialog.vue'\nimport type { AxiosInstance } from 'axios'\nimport type { IntegerId } from '@/types/common'\nimport type { DatatableSortBy } from '@/composables/system/datatableColumns'\n\nwithDefaults(\n defineProps<{\n client: () => AxiosInstance\n system: string\n user: IntegerId\n systemResource: string\n tooltipT?: string\n buttonClass?: string\n dataCy?: string\n datatableHiddenColumns?: string[] | undefined\n datatableSortBy?: DatatableSortBy\n }>(),\n {\n tooltipT: 'common.button.bookmarkFilter',\n buttonClass: 'ml-2',\n dataCy: 'filter-bookmark',\n datatableHiddenColumns: undefined,\n datatableSortBy: undefined,\n }\n)\n\nconst dialog = defineModel<boolean>('dialog', { default: false, required: false })\n\nconst onClick = (event: Event) => {\n eventClickBlur(event)\n dialog.value = true\n}\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <VBtn\n :class=\"buttonClass\"\n class=\"px-2\"\n :data-cy=\"dataCy\"\n color=\"light\"\n min-width=\"36px\"\n variant=\"flat\"\n @click.stop=\"onClick\"\n >\n <VIcon\n color=\"grey darken-1\"\n icon=\"mdi-bookmark-outline\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n >\n {{ t(tooltipT) }}\n </VTooltip>\n </VBtn>\n <FilterBookmarkDialog\n v-if=\"dialog\"\n :client=\"client\"\n :system=\"system\"\n :user=\"user\"\n :system-resource=\"systemResource\"\n :datatable-hidden-columns=\"datatableHiddenColumns\"\n @on-close=\"dialog = false\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, inject, nextTick, onMounted, ref, useTemplateRef, watch } from 'vue'\nimport { useFilterBookmarkStore } from '@/labs/filters/bookmarksStore'\nimport { useUserAdminConfigApi } from '@/labs/filters/userAdminConfig'\nimport type { AxiosInstance } from 'axios'\nimport {\n type UserAdminConfig,\n type UserAdminConfigDataFilterBookmark,\n UserAdminConfigLayoutType,\n} from '@/types/UserAdminConfig'\nimport type { IntegerId } from '@/types/common'\nimport { useResizeObserver, watchThrottled } from '@vueuse/core'\nimport { cloneDeep, isDefined, isNull, isUndefined } from '@/utils/common'\nimport {\n DatatablePaginationKey,\n FilterConfigKey,\n FilterDataKey,\n FilterSelectedKey,\n} from '@/labs/filters/filterInjectionKeys'\nimport { type FilterData, useFilterHelpers } from '@/labs/filters/filterFactory'\n\nconst props = withDefaults(\n defineProps<{\n client: () => AxiosInstance\n system: string\n userId: IntegerId\n systemResource: string\n }>(),\n {}\n)\n\nconst emit = defineEmits<{\n (e: 'submit'): void\n}>()\n\nconst datatableHiddenColumns = defineModel<string[] | undefined>('datatableHiddenColumns', {\n default: undefined,\n required: true,\n})\n\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nconst pagination = inject(DatatablePaginationKey)\nconst filterSelected = inject(FilterSelectedKey)\n\nif (isUndefined(pagination) || isUndefined(filterConfig) || isUndefined(filterData) || isUndefined(filterSelected)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst loading = ref(false)\nconst toolbarRef = useTemplateRef('toolbar')\nconst toolbarWidth = ref(300)\nconst visibleItemsCount = ref(1000)\n\nconst filterBookmarkStore = useFilterBookmarkStore()\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { useFetchUserAdminConfigList } = useUserAdminConfigApi(props.client, props.system)\n\nconst loadBookmarks = async (force = false) => {\n loading.value = true\n await filterBookmarkStore.getBookmarks(\n {\n system: props.system,\n user: props.userId,\n layoutType: UserAdminConfigLayoutType.Desktop,\n systemResource: props.systemResource,\n },\n useFetchUserAdminConfigList,\n force\n )\n loading.value = false\n}\n\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss\nconst { deserializeFilters } = useFilterHelpers(filterData, filterConfig, props.systemResource)\n\nconst onItemClick = (item: UserAdminConfig) => {\n const config = item.data as UserAdminConfigDataFilterBookmark\n if (isDefined(config.datatableHiddenColumns)) {\n datatableHiddenColumns.value = config.datatableHiddenColumns\n }\n if (isDefined(config.sortBy)) {\n pagination.value = { ...pagination.value, sortBy: { key: config.sortBy!.key, order: config.sortBy!.order } }\n }\n const deserialized = deserializeFilters(config.filter)\n if (isNull(deserialized)) return\n for (const filterName in filterData) {\n const key = filterName as keyof FilterData\n const value = deserialized.filters[key]\n if (isUndefined(value) && filterConfig.fields[key]?.clearable) {\n filterData[key] = cloneDeep(filterConfig.fields[key].default)\n filterSelected.value.delete(key)\n continue\n }\n filterData[key] = value\n }\n emit('submit')\n}\n\nconst THREE_DOTS_WIDTH = 32\n\nconst calculateVisible = async (totalWidth: number) => {\n const container = toolbarRef.value\n if (isNull(container)) return\n visibleItemsCount.value = 1000\n await nextTick()\n let cumulativeWidth = 0\n let visible = 0\n for (let i = 0; i < container.children.length; i++) {\n const child = container.children[i] as HTMLElement\n const childWidth = child.offsetWidth\n cumulativeWidth += childWidth\n if (cumulativeWidth >= totalWidth - THREE_DOTS_WIDTH) {\n break\n }\n visible++\n }\n visibleItemsCount.value = visible\n}\n\nuseResizeObserver(toolbarRef, (entries) => {\n if (entries[0]) {\n toolbarWidth.value = entries[0].contentRect.width\n }\n})\n\nwatchThrottled(\n toolbarWidth,\n (newValue, oldValue) => {\n if (newValue === oldValue) return\n calculateVisible(newValue)\n },\n { throttle: 1000 }\n)\n\nconst items = computed(() => {\n const key = filterBookmarkStore.generateKey(props.system, UserAdminConfigLayoutType.Desktop, props.systemResource)\n const result = filterBookmarkStore.bookmarks.get(key)\n return result?.items ?? []\n})\n\nconst itemsComputed = computed(() => {\n const visible = visibleItemsCount.value\n return {\n visible: items.value.slice(0, visible),\n hidden: items.value.slice(visible),\n }\n})\n\nwatch([loading, () => items.value.length], ([newLoading]) => {\n if (newLoading === true || isNull(toolbarRef.value)) return\n toolbarWidth.value = toolbarRef.value.clientWidth\n nextTick(() => {\n calculateVisible(toolbarWidth.value)\n })\n})\n\nonMounted(() => {\n loadBookmarks()\n})\n</script>\n\n<template>\n <div\n ref=\"toolbar\"\n :key=\"items.length\"\n class=\"w-100 d-flex overflow-hidden align-center mb-1\"\n >\n <div v-if=\"loading\" />\n <template v-else>\n <div\n v-for=\"item in itemsComputed.visible\"\n :key=\"item.id\"\n class=\"white-space-nowrap\"\n >\n <VBtn\n text\n prepend-icon=\"mdi-bookmark-outline\"\n size=\"small\"\n class=\"mr-1 mb-1 bg-grey-lighten-4 text-grey-darken-3\"\n @click=\"onItemClick(item)\"\n >\n {{ item.customName }}\n </VBtn>\n </div>\n <VMenu\n v-if=\"itemsComputed.hidden.length > 0\"\n bottom\n offset-y\n >\n <template #activator=\"{ props: activatorProps }\">\n <VBtn\n icon=\"mdi-menu-down\"\n size=\"x-small\"\n :width=\"28\"\n :height=\"28\"\n v-bind=\"activatorProps\"\n />\n </template>\n <VList density=\"compact\">\n <VListItem\n v-for=\"item in itemsComputed.hidden\"\n :key=\"item.id\"\n @click=\"onItemClick(item)\"\n >\n <VListItemTitle>{{ item.customName }}</VListItemTitle>\n </VListItem>\n </VList>\n </VMenu>\n </template>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport AFilterAdvancedButton from '@/labs/filters/AFilterAdvancedButton.vue'\nimport AFilterSubmitButton from '@/components/buttons/filter/AFilterSubmitButton.vue'\nimport AFilterResetButton from '@/components/buttons/filter/AFilterResetButton.vue'\nimport { inject, nextTick, provide, ref } from 'vue'\nimport {\n FilterConfigKey,\n FilterDataKey,\n FilterSelectedKey,\n FilterSubmitResetCounterKey,\n FilterTouchedKey,\n} from '@/labs/filters/filterInjectionKeys'\nimport FiltersSelected from '@/labs/filters/FiltersSelected.vue'\nimport type { ValueObjectOption } from '@/types/ValueObject'\nimport { isDefined, isUndefined } from '@/utils/common'\nimport { useFilterClearHelpers } from '@/labs/filters/filterFactory'\nimport { datatableSlotName } from '@/components/datatable/datatable'\nimport FilterDetailItem from '@/labs/filters/FilterDetailItem.vue'\nimport AFilterBookmarkButton from '@/components/buttons/filter/AFilterBookmarkButton.vue'\nimport FilterBookmarks from '@/labs/filters/FilterBookmarks.vue'\nimport type { IntegerIdNullable } from '@/types/common'\nimport type { AxiosInstance } from 'axios'\n\nwithDefaults(\n defineProps<{\n enableTop?: boolean\n hideButtons?: boolean\n formName?: string\n disableFilterUrlSync?: boolean\n system?: string | undefined\n userId?: IntegerIdNullable | undefined\n client?: (() => AxiosInstance) | undefined\n bookmarkSystemResource?: string | undefined\n }>(),\n {\n enableTop: false,\n hideButtons: false,\n formName: 'search',\n disableFilterUrlSync: false,\n system: undefined,\n userId: undefined,\n client: undefined,\n bookmarkSystemResource: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'bookmarkLoadAfter'): void\n (e: 'reset'): void\n}>()\n\nconst datatableHiddenColumns = defineModel<string[] | undefined>('datatableHiddenColumns', {\n default: undefined,\n required: false,\n})\nconst showDetail = defineModel<boolean>('showDetail', { default: false, required: false })\nconst touched = defineModel<boolean>('touched', { default: false, required: false })\n\nprovide(FilterTouchedKey, touched)\nconst filterConfig = inject(FilterConfigKey)\nconst filterData = inject(FilterDataKey)\nif (isUndefined(filterConfig) || isUndefined(filterData)) {\n throw new Error('Incorrect provide/inject config.')\n}\nconst submitResetCounter = ref(0)\nprovide(FilterSubmitResetCounterKey, submitResetCounter)\nconst filterSelected = ref<Map<string, ValueObjectOption<string | number>[]>>(new Map())\nprovide(FilterSelectedKey, filterSelected)\n\nconst submitFilter = () => {\n touched.value = false\n submitResetCounter.value++\n nextTick(() => {\n emit('submit')\n })\n}\n\nconst { clearAll } = useFilterClearHelpers()\n\nconst submitFilterBookmark = () => {\n nextTick(() => {\n submitResetCounter.value++\n emit('bookmarkLoadAfter')\n })\n}\n\nconst resetFilter = () => {\n touched.value = false\n clearAll(filterData, filterConfig)\n filterSelected.value.clear()\n nextTick(() => {\n submitResetCounter.value++\n emit('reset')\n })\n}\n\nconst toggleFilterDetail = () => {\n showDetail.value = !showDetail.value\n}\n\ndefineExpose({\n submit: submitFilter,\n reset: resetFilter,\n})\n</script>\n\n<template>\n <VForm\n :name=\"formName\"\n @submit.prevent=\"submitFilter\"\n >\n <VRow\n v-if=\"enableTop\"\n dense\n >\n <VCol>\n <slot name=\"top\" />\n </VCol>\n </VRow>\n <VRow dense>\n <VCol v-if=\"bookmarkSystemResource && userId && system && isDefined(client)\">\n <slot name=\"bookmarks\">\n <div class=\"d-flex flex-wrap align-center\">\n <FilterBookmarks\n v-model:datatable-hidden-columns=\"datatableHiddenColumns\"\n :client=\"client\"\n :system=\"system\"\n :user-id=\"userId\"\n :system-resource=\"bookmarkSystemResource\"\n @submit=\"submitFilterBookmark\"\n />\n </div>\n </slot>\n </VCol>\n </VRow>\n <VRow dense>\n <VCol cols=\"auto\">\n <AFilterAdvancedButton\n :button-active=\"showDetail\"\n @advanced-filter=\"toggleFilterDetail\"\n />\n </VCol>\n <VCol>\n <div class=\"a-filter__container\">\n <div class=\"a-filter__search\">\n <slot name=\"search\" />\n </div>\n <FiltersSelected />\n </div>\n </VCol>\n <VCol\n v-if=\"!hideButtons\"\n class=\"text-right\"\n cols=\"auto\"\n >\n <slot name=\"buttons\">\n <AFilterSubmitButton :touched=\"touched\" />\n <AFilterResetButton @reset=\"resetFilter\" />\n <AFilterBookmarkButton\n v-if=\"bookmarkSystemResource && userId && system && isDefined(client)\"\n :client=\"client\"\n :system=\"system\"\n :user=\"userId\"\n :system-resource=\"bookmarkSystemResource\"\n :datatable-hidden-columns=\"datatableHiddenColumns\"\n />\n </slot>\n </VCol>\n </VRow>\n <div>\n <VSlideYTransition>\n <div\n v-show=\"showDetail\"\n class=\"mt-6 pa-4 system-border-a\"\n >\n <slot name=\"detail\">\n <VRow>\n <VCol\n v-for=\"field in filterConfig.fields\"\n :key=\"field.name\"\n :cols=\"field.render.xs\"\n :sm=\"field.render.sm\"\n :md=\"field.render.md\"\n :lg=\"field.render.lg\"\n :xl=\"field.render.xl\"\n :class=\"{ 'd-none': field.render.skip }\"\n >\n <slot\n :name=\"datatableSlotName(field.name)\"\n :item-config=\"field\"\n >\n <FilterDetailItem :name=\"field.name\" />\n </slot>\n </VCol>\n </VRow>\n </slot>\n </div>\n </VSlideYTransition>\n </div>\n </VForm>\n</template>\n\n<style lang=\"scss\">\n@use 'vuetify/tools' as *;\n\n.a-filter {\n &__container {\n width: 100%;\n }\n\n &__search {\n display: inline-flex;\n vertical-align: middle;\n min-width: 100%;\n height: 34px;\n\n @include media-breakpoint-up(sm) {\n min-width: 50%;\n margin-right: 8px;\n }\n\n @include media-breakpoint-up(md) {\n min-width: 40%;\n }\n\n @include media-breakpoint-up(lg) {\n min-width: 30%;\n }\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, type Ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport {\n type DatatableOrderingOption,\n type DatatableOrderingOptions,\n SORT_BY_SCORE,\n SortOrder,\n} from '@/composables/system/datatableColumns'\nimport { isUndefined } from '@/utils/common'\nimport { DatatablePaginationKey } from '@/labs/filters/filterInjectionKeys'\n\nimport type { Pagination } from '@/labs/filters/pagination'\n\nconst props = withDefaults(\n defineProps<{\n variant?: 'default' | 'id' | 'most-relevant'\n customOptions?: undefined | DatatableOrderingOptions\n paginationUpdateCustomCb?: ((option: DatatableOrderingOption, pagination: Ref<Pagination>) => void) | undefined\n }>(),\n {\n variant: 'default',\n customOptions: undefined,\n paginationUpdateCustomCb: undefined,\n }\n)\nconst emit = defineEmits<{\n (e: 'sortByChange', data: DatatableOrderingOption): void\n}>()\n\nconst modelValue = defineModel<number>('modelValue', {\n default: 1,\n required: false,\n})\n\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\n\nconst defaultItems: DatatableOrderingOptions = [\n { id: 1, titleT: 'common.system.datatable.ordering.mostRecent', sortBy: { key: 'createdAt', order: SortOrder.Desc } },\n { id: 2, titleT: 'common.system.datatable.ordering.oldest', sortBy: { key: 'createdAt', order: SortOrder.Asc } },\n]\n\nconst defaultItemsId: DatatableOrderingOptions = [\n { id: 1, titleT: 'common.system.datatable.ordering.mostRecent', sortBy: { key: 'id', order: SortOrder.Desc } },\n { id: 2, titleT: 'common.system.datatable.ordering.oldest', sortBy: { key: 'id', order: SortOrder.Asc } },\n]\n\nconst defaultItemsMostRelevant: DatatableOrderingOptions = [\n {\n id: 3,\n titleT: 'common.system.datatable.ordering.mostRelevant',\n sortBy: { key: SORT_BY_SCORE, order: SortOrder.Desc },\n },\n { id: 1, titleT: 'common.system.datatable.ordering.mostRecent', sortBy: { key: 'createdAt', order: SortOrder.Desc } },\n { id: 2, titleT: 'common.system.datatable.ordering.oldest', sortBy: { key: 'createdAt', order: SortOrder.Asc } },\n]\n\nconst activeTitle = computed(() => {\n const found = options.value.find((item: any) => item.id === modelValue.value)\n if (found) return t(found.titleT)\n return ''\n})\n\nconst options = computed(() => {\n if (props.customOptions) return props.customOptions\n if (props.variant === 'most-relevant') return defaultItemsMostRelevant\n if (props.variant === 'id') return defaultItemsId\n return defaultItems\n})\n\nconst onItemClick = (item: DatatableOrderingOption) => {\n modelValue.value = item.id\n}\n\nconst paginationUpdateDefault = (found: DatatableOrderingOption) => {\n if (!found.sortBy) {\n pagination.value = { ...pagination.value, ...{ sortBy: null, descending: true } }\n emit('sortByChange', found)\n }\n pagination.value.sortBy = found.sortBy\n emit('sortByChange', found)\n}\n\nwatch(\n modelValue,\n (newValue, oldValue) => {\n if (newValue === oldValue) return\n const found = options.value.find((option) => {\n return option.id === newValue\n })\n if (isUndefined(found)) {\n return\n }\n if (isUndefined(props.paginationUpdateCustomCb)) {\n paginationUpdateDefault(found)\n return\n }\n props.paginationUpdateCustomCb(found, pagination)\n },\n { immediate: true }\n)\n\nwatch(\n pagination,\n (newValue, oldValue) => {\n if (newValue.sortBy?.key === oldValue?.sortBy?.key && newValue.sortBy?.order === oldValue?.sortBy?.order) {\n return\n }\n const found = options.value.find((option) => {\n return newValue.sortBy?.key === option.sortBy?.key && newValue.sortBy?.order === option.sortBy?.order\n })\n if (isUndefined(found)) {\n return\n }\n modelValue.value = found.id\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div class=\"d-flex align-center justify-center\">\n <div class=\"text-caption mr-1\">\n {{ t('common.system.datatable.ordering.title') }}:\n </div>\n <VBtn\n variant=\"text\"\n rounded=\"xl\"\n size=\"small\"\n append-icon=\"mdi-chevron-down\"\n >\n {{ activeTitle }}\n <VMenu\n activator=\"parent\"\n location=\"bottom\"\n close-on-content-click\n >\n <VList\n density=\"compact\"\n class=\"pa-0\"\n >\n <VListItem\n v-for=\"item in options\"\n :key=\"item.id\"\n @click=\"onItemClick(item)\"\n >\n <VListItemTitle :class=\"{ 'font-weight-bold': item.id === modelValue }\">\n {{ t(item.titleT) }}\n </VListItemTitle>\n </VListItem>\n </VList>\n </VMenu>\n </VBtn>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, inject, watch } from 'vue'\nimport { isNull, isUndefined } from '@/utils/common'\nimport { useI18n } from 'vue-i18n'\nimport { DatatablePaginationKey } from '@/labs/filters/filterInjectionKeys'\n\nwithDefaults(\n defineProps<{\n itemsPerPageOptions?: number[]\n hideRecordsPerPage?: boolean\n }>(),\n {\n itemsPerPageOptions: () => [10, 25, 50],\n hideRecordsPerPage: false,\n }\n)\nconst emit = defineEmits<{\n (e: 'change'): void\n}>()\n\nconst pagination = inject(DatatablePaginationKey)\n\nif (isUndefined(pagination)) {\n throw new Error('Incorrect provide/inject config.')\n}\n\nconst { t } = useI18n()\n\nconst lastPage = computed(() => {\n return Math.ceil(pagination.value.totalCount / pagination.value.rowsPerPage)\n})\n\nconst displayedFrom = computed(() => {\n return pagination.value.page * pagination.value.rowsPerPage - pagination.value.rowsPerPage + 1\n})\n\nconst displayedTo = computed(() => {\n return (\n pagination.value.page * pagination.value.rowsPerPage -\n pagination.value.rowsPerPage +\n pagination.value.currentViewCount\n )\n})\n\nconst disabledFirstAndPrev = computed(() => {\n return pagination.value.page === 1\n})\n\nconst disabledLast = computed(() => {\n return !isNull(pagination.value.hasNextPage) || pagination.value.page === lastPage.value\n})\n\nconst disabledNext = computed(() => {\n return (\n (isNull(pagination.value.hasNextPage) && pagination.value.page === lastPage.value) ||\n pagination.value.hasNextPage === false\n )\n})\n\nconst computedTotalCountText = computed(() => {\n if (!isNull(pagination.value.hasNextPage)) {\n return pagination.value.hasNextPage ? displayedTo.value + 1 + '+' : displayedTo.value\n }\n return pagination.value.totalCount\n})\n\nwatch(\n () => pagination.value.rowsPerPage,\n (newValue, oldValue) => {\n if (newValue !== oldValue) {\n pagination.value.page = 1\n emit('change')\n }\n }\n)\n\nwatch(\n () => pagination.value.page,\n (newValue, oldValue) => {\n if (newValue !== oldValue) {\n emit('change')\n }\n }\n)\n\nconst onClickFirst = () => {\n pagination.value.page = 1\n}\n\nconst onClickLast = () => {\n pagination.value.page = lastPage.value\n}\n\nconst onClickPrev = () => {\n pagination.value.page = pagination.value.page - 1\n}\n\nconst onClickNext = () => {\n pagination.value.page = pagination.value.page + 1\n}\n</script>\n\n<template>\n <div class=\"anzu-data-footer\">\n <div\n v-if=\"!hideRecordsPerPage\"\n class=\"anzu-data-footer__page-limit\"\n >\n {{ t('common.system.datatable.itemsPerPage') }}:\n <VBtnToggle\n v-model=\"pagination.rowsPerPage\"\n class=\"ml-2\"\n density=\"compact\"\n mandatory\n data-cy=\"table-size\"\n >\n <VBtn\n v-for=\"item in itemsPerPageOptions\"\n :key=\"item\"\n :color=\"item === pagination.rowsPerPage ? 'secondary' : ''\"\n :value=\"item\"\n density=\"compact\"\n size=\"small\"\n variant=\"text\"\n >\n {{ item }}\n </VBtn>\n </VBtnToggle>\n </div>\n <div class=\"anzu-data-footer__pagination\">\n {{ displayedFrom }} - {{ displayedTo }} {{ t('common.system.datatable.from') }} {{ computedTotalCountText }}\n </div>\n <div class=\"anzu-data-footer__icons-before\">\n <VBtn\n :disabled=\"disabledFirstAndPrev\"\n icon=\"mdi-page-first\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickFirst\"\n />\n <VBtn\n :disabled=\"disabledFirstAndPrev\"\n icon=\"mdi-chevron-left\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickPrev\"\n />\n </div>\n <div class=\"current-page\">\n <span>{{ pagination.page }}</span>\n </div>\n <div class=\"anzu-data-footer__icons-after\">\n <VBtn\n :disabled=\"disabledNext\"\n icon=\"mdi-chevron-right\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickNext\"\n />\n <VBtn\n :disabled=\"disabledLast\"\n icon=\"mdi-page-last\"\n size=\"small\"\n variant=\"text\"\n @click.stop=\"onClickLast\"\n />\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n.anzu-data-footer {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n align-items: center;\n font-size: 0.75rem;\n padding: 0 8px;\n\n > div.current-page {\n padding-left: 10px;\n padding-right: 10px;\n user-select: none;\n min-width: 40px;\n display: flex;\n text-align: center;\n align-items: center;\n justify-content: center;\n }\n\n &__page-limit {\n display: flex;\n align-items: center;\n flex: 0 0 0;\n justify-content: flex-end;\n white-space: nowrap;\n margin-right: 14px;\n }\n\n &__pagination {\n display: block;\n text-align: center;\n margin: 0 32px 0 24px;\n }\n}\n</style>\n","import { AnzuApiResponseCodeError, isAnzuApiResponseCodeError } from '@/model/error/AnzuApiResponseCodeError'\nimport { AnzuApiValidationError, axiosErrorResponseHasValidationData } from '@/model/error/AnzuApiValidationError'\nimport { replaceUrlParameters, type UrlParams } from '@/services/api/apiHelper'\nimport { isValidHTTPStatus } from '@/utils/response'\nimport axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios'\nimport { useApiQueryBuilder } from '@/services/api/queryBuilder'\nimport { AnzuApiForbiddenError, axiosErrorResponseIsForbidden } from '@/model/error/AnzuApiForbiddenError'\nimport { AnzuFatalError } from '@/model/error/AnzuFatalError'\nimport {\n AnzuApiForbiddenOperationError,\n axiosErrorResponseHasForbiddenOperationData,\n} from '@/model/error/AnzuApiForbiddenOperationError'\nimport { HTTP_STATUS_NO_CONTENT } from '@/composables/statusCodes'\nimport {\n AnzuApiDependencyExistsError,\n axiosErrorResponseHasDependencyExistsData,\n} from '@/model/error/AnzuApiDependencyExistsError'\nimport type { DocId, IntegerId } from '@/types/common'\nimport { AnzuApiTimeoutError, axiosErrorIsTimeout } from '@/model/error/AnzuApiTimeoutError'\nimport { AnzuApiAxiosError } from '@/model/error/AnzuApiAxiosError'\nimport { isUndefined } from '@/utils/common'\n\n/**\n * @template T Type used for request payload, by default same as Response type\n * @template R Response type override, optional\n */\nconst generateByIdsApiQuery = (ids: IntegerId[] | DocId[], isSearchApi: boolean, field = 'id'): string => {\n const { querySetLimit, querySetOffset, querySetOrder, queryBuild, queryAddFilter, queryAdd } = useApiQueryBuilder()\n const limit = ids.length // todo add batch fetch\n querySetLimit(limit)\n querySetOffset(1, limit)\n querySetOrder(field, false)\n if (isSearchApi) queryAdd(field, ids.join(','))\n else queryAddFilter('in', field, ids.join(','))\n\n return queryBuild()\n}\n\nexport const useApiFetchByIds = <R>(\n client: () => AxiosInstance,\n system: string,\n entity: string,\n options: AxiosRequestConfig = {},\n isSearchApi = false,\n field = 'id'\n): UseApiFetchByIdsReturnType<R> => {\n let abortController: AbortController | null = null\n\n const executeFetch = async (\n ids: DocId[] | IntegerId[],\n urlTemplate: string,\n urlParams: UrlParams | undefined = undefined\n ): Promise<R> => {\n abortController = new AbortController()\n\n try {\n const url =\n (isUndefined(urlParams) ? urlTemplate : replaceUrlParameters(urlTemplate, urlParams)) +\n generateByIdsApiQuery(ids, isSearchApi, field)\n\n const res = await client().get(url, {\n ...options,\n signal: abortController.signal,\n })\n\n if (!isValidHTTPStatus(res.status)) {\n throw new AnzuApiResponseCodeError(res.status)\n }\n\n if (res.data?.data) {\n return res.data.data as R\n }\n\n if (res.status === HTTP_STATUS_NO_CONTENT) {\n return [] as R\n }\n\n throw new AnzuFatalError()\n } catch (err: any) {\n if (err instanceof DOMException && err.name === 'AbortError') {\n return [] as R\n }\n\n if (isAnzuApiResponseCodeError(err)) {\n throw err\n }\n\n if (axiosErrorResponseIsForbidden(err)) {\n throw new AnzuApiForbiddenError(err)\n }\n\n if (axiosErrorResponseHasValidationData(err)) {\n throw new AnzuApiValidationError(err, system, entity, err)\n }\n\n if (axiosErrorResponseHasDependencyExistsData(err)) {\n throw new AnzuApiDependencyExistsError(err, system, entity, err)\n }\n\n if (axiosErrorResponseHasForbiddenOperationData(err)) {\n throw new AnzuApiForbiddenOperationError(err, err)\n }\n\n if (axiosErrorIsTimeout(err)) {\n throw new AnzuApiTimeoutError(err)\n }\n\n if (axios.isAxiosError(err)) {\n console.error('Axios error: ' + urlTemplate, err.cause)\n throw new AnzuApiAxiosError(err)\n }\n\n console.error('AnzuFatalError: ', err)\n throw new AnzuFatalError(err)\n } finally {\n abortController = null\n }\n }\n\n const abortFetch = () => {\n if (abortController) {\n abortController.abort()\n }\n }\n\n return {\n executeFetch,\n abortFetch,\n }\n}\n\nexport type UseApiFetchByIdsReturnType<R> = {\n executeFetch: (ids: DocId[] | IntegerId[], urlTemplate: string, urlParams?: UrlParams | undefined) => Promise<R>\n abortFetch: () => void\n}\n","import { AnzuApiResponseCodeError, isAnzuApiResponseCodeError } from '@/model/error/AnzuApiResponseCodeError'\nimport { AnzuApiValidationError, axiosErrorResponseHasValidationData } from '@/model/error/AnzuApiValidationError'\nimport { replaceUrlParameters, type UrlParams } from '@/services/api/apiHelper'\nimport { isUndefined } from '@/utils/common'\nimport { isValidHTTPStatus } from '@/utils/response'\nimport axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios'\nimport { AnzuApiForbiddenError, axiosErrorResponseIsForbidden } from '@/model/error/AnzuApiForbiddenError'\nimport { AnzuFatalError } from '@/model/error/AnzuFatalError'\nimport type { ApiInfiniteResponseList, ApiResponseList } from '@/types/ApiResponse'\nimport { isApiInfiniteResponseList, isApiResponseList } from '@/types/ApiResponse'\nimport {\n AnzuApiForbiddenOperationError,\n axiosErrorResponseHasForbiddenOperationData,\n} from '@/model/error/AnzuApiForbiddenOperationError'\nimport { HTTP_STATUS_NO_CONTENT } from '@/composables/statusCodes'\nimport {\n AnzuApiDependencyExistsError,\n axiosErrorResponseHasDependencyExistsData,\n} from '@/model/error/AnzuApiDependencyExistsError'\nimport { generateListQuery } from '@/labs/api/useApiFetchList'\nimport { AnzuApiTimeoutError, axiosErrorIsTimeout } from '@/model/error/AnzuApiTimeoutError'\nimport { AnzuApiAxiosError } from '@/model/error/AnzuApiAxiosError'\nimport type { FilterConfig, FilterData } from '@/labs/filters/filterFactory'\nimport { ref } from 'vue'\nimport { usePagination as usePagination } from '@/labs/filters/pagination'\nimport { SortOrder } from '@/composables/system/datatableColumns'\n\n/**\n * @template R Response type override\n */\nexport const useApiFetchListBatch = <R>(\n client: () => AxiosInstance,\n system: string,\n entity: string,\n options: AxiosRequestConfig = {}\n): UseApiFetchListBatchReturnType<R> => {\n let abortController: AbortController | null = null\n\n const executeFetch = async (\n filterData: FilterData<any>,\n filterConfig: FilterConfig<any>,\n urlTemplate: string,\n urlParams: UrlParams | undefined = undefined,\n sortBy = 'id',\n sortDesc = true,\n batchSize = 100,\n forceElastic = false\n ): Promise<R> => {\n abortController = new AbortController()\n\n try {\n const searchApi = (filterConfig.general.elastic || forceElastic) ? '/search' : ''\n const pagination = usePagination({ key: sortBy, order: sortDesc ? SortOrder.Desc : SortOrder.Asc })\n pagination.value.rowsPerPage = batchSize\n const url = (isUndefined(urlParams) ? urlTemplate : replaceUrlParameters(urlTemplate, urlParams)) + searchApi\n const results = [] as unknown as R\n\n // First page request\n const res = await client().get(url + generateListQuery(pagination, filterData, filterConfig), {\n ...options,\n signal: abortController.signal\n })\n\n if (!isValidHTTPStatus(res.status)) {\n throw new AnzuApiResponseCodeError(res.status)\n }\n\n if (res.data) {\n const resData = res.data as unknown as ApiResponseList<R> | ApiInfiniteResponseList<R>\n // @ts-ignore\n results.push(...resData.data)\n\n if (isApiInfiniteResponseList(resData)) {\n pagination.value.hasNextPage = resData.hasNextPage\n\n // Handle pagination for infinite lists\n while (pagination.value.hasNextPage) {\n pagination.value.page++\n const nextPageResponse = await client().get(url + generateListQuery(pagination, filterData, filterConfig), {\n ...options,\n signal: abortController.signal\n })\n const nextPageData = nextPageResponse.data\n // @ts-ignore\n results.push(...nextPageData.data)\n pagination.value.hasNextPage = nextPageData.hasNextPage\n }\n } else if (isApiResponseList(resData)) {\n pagination.value.totalCount = resData.totalCount\n\n if (pagination.value.totalCount <= pagination.value.rowsPerPage) {\n return results as R\n }\n\n // Handle pagination for regular lists - fetch all remaining pages in parallel\n const promises: Promise<any>[] = []\n const numPages = Math.ceil(pagination.value.totalCount / pagination.value.rowsPerPage)\n\n for (let i = 1; i < numPages; i++) { // Start from 1 since we already fetched page 0\n const pageCopy = { ...pagination.value, page: i + 1 }\n const paginationRef = ref(pageCopy)\n promises.push(\n client().get(url + generateListQuery(paginationRef, filterData, filterConfig), {\n ...options,\n signal: abortController.signal\n })\n )\n }\n\n const allResponses = await Promise.all(promises)\n allResponses.forEach((pageResponse) => {\n // @ts-ignore\n results.push(...pageResponse.data.data)\n })\n }\n\n return results as R\n }\n\n if (res.status === HTTP_STATUS_NO_CONTENT) {\n return [] as R\n }\n\n throw new AnzuFatalError()\n } catch (err: any) {\n if (err instanceof DOMException && err.name === 'AbortError') {\n return [] as R\n }\n\n if (isAnzuApiResponseCodeError(err)) {\n throw err\n }\n\n if (axiosErrorResponseIsForbidden(err)) {\n throw new AnzuApiForbiddenError(err)\n }\n\n if (axiosErrorResponseHasValidationData(err)) {\n throw new AnzuApiValidationError(err, system, entity, err)\n }\n\n if (axiosErrorResponseHasDependencyExistsData(err)) {\n throw new AnzuApiDependencyExistsError(err, system, entity, err)\n }\n\n if (axiosErrorResponseHasForbiddenOperationData(err)) {\n throw new AnzuApiForbiddenOperationError(err, err)\n }\n\n if (axiosErrorIsTimeout(err)) {\n throw new AnzuApiTimeoutError(err)\n }\n\n if (axios.isAxiosError(err)) {\n console.error('Axios error: ' + urlTemplate, err.cause)\n throw new AnzuApiAxiosError(err)\n }\n\n console.error('AnzuFatalError: ', err)\n throw new AnzuFatalError(err)\n } finally {\n abortController = null\n }\n }\n\n const abortFetch = () => {\n if (abortController) {\n abortController.abort()\n }\n }\n\n return {\n executeFetch,\n abortFetch,\n }\n}\n\nexport type UseApiFetchListBatchReturnType<R> = {\n executeFetch: (\n filterData: FilterData<any>,\n filterConfig: FilterConfig<any>,\n urlTemplate: string,\n urlParams?: UrlParams,\n sortBy?: string,\n sortDesc?: boolean,\n batchSize?: number,\n forceElastic?: boolean\n ) => Promise<R>\n abortFetch: () => void\n}\n","import {\n type ColumnConfig,\n type ColumnInternalValues,\n DATETIME_AUTO_LABEL_TRACKING,\n type StoredData,\n} from '@/composables/system/datatableColumns'\nimport { computed, onMounted, type Ref, watch } from 'vue'\nimport { i18n } from '@/plugins/i18n'\nimport { isArray, isObject, isUndefined } from '@/utils/common'\n\nconst defaultColumn: ColumnInternalValues = {\n key: '',\n title: undefined,\n sortable: false,\n fixed: false,\n}\n\nexport function createDatatableColumnsConfig(\n config: ColumnConfig[],\n columnsHidden: Ref<Array<string>>,\n system: string | undefined = undefined,\n subject: string | undefined = undefined,\n disableActions: boolean = false,\n customI18n: undefined | any = undefined,\n showExpand: undefined | boolean = undefined,\n storeId: string | undefined = undefined,\n) {\n const localI18n = customI18n ?? i18n\n const { t } = localI18n.global || localI18n\n\n const columnsAll = config.map((item) => {\n const obj = { ...defaultColumn, ...item }\n if (!isUndefined(obj.title)) {\n // do not modify\n } else if (isUndefined(obj.title) && DATETIME_AUTO_LABEL_TRACKING.includes(obj.key)) {\n obj.title = t('common.model.tracking.' + obj.key)\n } else if (isUndefined(obj.title) && system && subject) {\n obj.title = t(system + '.' + subject + '.model.' + obj.key)\n } else {\n obj.title = ''\n }\n return obj\n })\n\n const columnsVisible = computed(() => {\n const columns: any = []\n if (showExpand) columns.push({ key: 'data-table-expand', sortable: false })\n columnsAll.forEach((column) => {\n if (!columnsHidden.value.includes(column.key)) {\n columns.push(column)\n }\n })\n if (!disableActions) columns.push({ key: 'actions', sortable: false, fixed: true })\n return columns\n })\n\n const loadStoredColumns = () => {\n if (!storeId || !localStorage) return\n const stored = localStorage.getItem(storeId)\n if (!stored) return\n const storedData = JSON.parse(stored) as StoredData\n if (!isObject(storedData)) return\n if (!isArray(storedData.hidden)) return\n columnsHidden.value = storedData.hidden as string[]\n }\n\n const storeColumns = (columns: string[]) => {\n if (!storeId || !localStorage) return\n localStorage.setItem(storeId, JSON.stringify({ hidden: columns }))\n }\n\n onMounted(() => {\n loadStoredColumns()\n })\n\n watch(columnsHidden, (newValue) => {\n storeColumns(newValue)\n })\n\n return {\n columnsAll,\n columnsVisible,\n columnsHidden,\n }\n}\n"],"names":["FilterDataKey","FilterConfigKey","FilterInnerDataKey","FilterInnerConfigKey","FilterSubmitResetCounterKey","FilterSelectedKey","FilterTouchedKey","DatatablePaginationKey","SORT_URL_PARAM","defaultRenderOptions","createFilter","filterFields","store","options","config","acc","filter","key","defaultValue","cloneDeep","resolveValue","isArray","defaultGlobalOptions","reactive","value","fallback","isUndefined","useFilterClearHelpers","clearOne","name","filterData","filterConfig","_a","filterName","useFilterHelpers","systemResource","END_FILTER_MARKER","storeKey","getFilterDataForStoring","data","isNull","isEmptyArray","serializeFilters","pagination","includeSort","params","isObject","isEmptyObject","isString","deserializeFilters","hash","lastAmpersand","result","sortBy","sortParam","order","SortOrder","items","allNumeric","item","updateLocationHash","serialized","parseLocationHash","storeFilterLocalStorage","loadFilterLocalStorage","stored","source","storedFromHash","callback","props","__props","emit","__emit","submitResetCounter","inject","touched","filterSelected","modelValue","computed","newValue","returnValue","updateSelected","filterConfigCurrent","useI18n","label","clearField","_createBlock","_component_VSelect","$event","dataCy","t","dateTimePretty","_openBlock","ADatetimePicker","_mergeProps","$attrs","placeholderComputed","watch","oldValue","isBoolean","_component_VTextField","usePagination","ref","filterInnerConfig","filterInnerData","selected","search","isFocused","autoFetchTimer","apiRequestCounter","onBlur","fetchedItems","selectedItemsCache","allItems","final","loading","apiSearch","query","requestCounter","res","findLocalDataByValues","values","found","tryToLoadFromLocalData","count","foundItems","autoFetched","clearAutoFetchTimer","autoFetch","onFocus","onMouseEnter","singleItemSelectedTitle","onSearchUpdate","onSelectedUpdate","onClickClear","updateFilterSelected","isOneOf","watchDebounced","_component_VAutocomplete","_withCtx","itemProps","_createVNode","_component_VListItem","_unref","itemItem","_renderSlot","_ctx","chipProps","chipItem","_component_VChip","TimeIntervalSpecialOptions","useTimeIntervalOptions","allowed","timeIntervalOptions","useFilterTimeIntervalValidators","dialogData","datesCompare","required","useValidate","fromComputed","untilComputed","rules","useVuelidate","getTimeIntervalOption","modelInternal","dialogCustom","dateTimeNow","displayFromTo","v$","showValidationError","useAlerts","onClear","onDialogConfirm","onDialogClose","isDatetimeUTC","customOption","onEditInterval","clear","filterDataUntil","nameFromNewValue","nameUntilNewValue","nameFromOldValue","nameUntilOldValue","_component_VTextarea","_component_VDialog","_component_VCard","ADialogToolbar","_component_VCardText","ARow","AFormDatetimePicker","_cache","_component_VCardActions","_component_VSpacer","_component_ABtnTertiary","_component_ABtnPrimary","modelItemValue","active","onClick","event","eventClickBlur","_component_VBtn","buttonClass","_component_VIcon","_component_VTooltip","_createTextVNode","_toDisplayString","tooltipT","getTitleFromConfig","titleT","_b","selectedArray","fieldOrder","valueArray","a","b","clickClose","optionValue","selectedFound","foundIndex","newArray","toRaw","isNumber","_createElementBlock","_Fragment","_renderList","_createElementVNode","_hoisted_1","option","_withModifiers","componentComputed","AFilterEmpty","AFilterString","AFilterDatetimePicker","AFilterBooleanSelect","AFilterInteger","_resolveDynamicComponent","useUserAdminConfigInnerFilter","system","subject","UserAdminConfigType","UserAdminConfigTypeDefault","UserAdminConfigLayoutType","UserAdminConfigLayoutTypeDefault","useApiQueryBuilder","q","querySetLimit","queryAdd","querySetOffset","page","limit","querySetOrder","field","desc","formatValue","queryAddFilter","filterVariant","resolveTimeIntervalFilter","fromName","untilName","mandatory","fromValue","untilValue","now","nowDate","dateTimeToDate","getMonthInterval","dateToUtc","dateModifyMinutes","getValue","isSearchApi","filterFieldValue","filterFieldConfig","AnzuApiAxiosError","cause","axiosErrorIsTimeout","error","axios","AnzuApiTimeoutError","generateListQuery","queryBuild","querySetFilters","useApiFetchList","client","entity","abortController","urlTemplate","urlParams","searchApi","url","replaceUrlParameters","isValidHTTPStatus","AnzuApiResponseCodeError","resData","isApiInfiniteResponseList","isApiResponseList","HTTP_STATUS_NO_CONTENT","AnzuFatalError","err","isAnzuApiResponseCodeError","axiosErrorResponseIsForbidden","AnzuApiForbiddenError","axiosErrorResponseHasValidationData","AnzuApiValidationError","axiosErrorResponseHasDependencyExistsData","AnzuApiDependencyExistsError","axiosErrorResponseHasForbiddenOperationData","AnzuApiForbiddenOperationError","useApiRequest","method","object","axiosConfig","END_POINT","ENTITY","useUserAdminConfigApi","endPoint","id","executeRequest","ids","MAX_BOOKMARKS","MAX_BOOKMARK_ITEMS","useFilterBookmarkStore","defineStore","bookmarks","generateKey","layoutType","removeOldestBookmark","oldestKey","oldestTime","bookmarkKey","getBookmarks","identifier","useApiFetch","forceFetch","cached","executeFetch","fetchBookmarksCount","length","addOne","useUserAdminConfigFactory","activeTab","customName","storeDatatableHiddenColumns","storeDatatableOrder","saveButtonLoading","listLoading","errorCount","itemsManage","itemEdit","maxLength","rulesCreate","vCreate$","rulesEdit","vEdit$","filterBookmarkStore","createUserAdminConfig","useFetchUserAdminConfigList","updateUserAdminConfigPositions","deleteUserAdminConfig","updateUserAdminConfig","showErrorsDefault","createDefaultUserAdminConfig","sortItems","reloadItems","e","addBookmark","onConfirm","onDelete","onItemCancel","inputRef","useTemplateRef","onEdit","nextTick","onItemConfirm","modified","_component_VTabs","_component_VTab","AFormTextField","AFormSwitch","_hoisted_2","_hoisted_3","_component_VProgressCircular","ASortable","_hoisted_4","_hoisted_5","dialog","_useModel","_normalizeClass","FilterBookmarkDialog","user","datatableHiddenColumns","THREE_DOTS_WIDTH","toolbarRef","toolbarWidth","visibleItemsCount","loadBookmarks","force","onItemClick","isDefined","deserialized","calculateVisible","totalWidth","container","cumulativeWidth","visible","i","childWidth","useResizeObserver","entries","watchThrottled","itemsComputed","newLoading","onMounted","_component_VMenu","activatorProps","_component_VList","_component_VListItemTitle","showDetail","provide","submitFilter","clearAll","submitFilterBookmark","resetFilter","toggleFilterDetail","__expose","_component_VForm","formName","enableTop","_component_VRow","_component_VCol","bookmarkSystemResource","userId","FilterBookmarks","AFilterAdvancedButton","FiltersSelected","hideButtons","AFilterSubmitButton","AFilterResetButton","AFilterBookmarkButton","_component_VSlideYTransition","_withDirectives","datatableSlotName","FilterDetailItem","defaultItems","defaultItemsId","defaultItemsMostRelevant","SORT_BY_SCORE","activeTitle","paginationUpdateDefault","_c","_d","lastPage","displayedFrom","displayedTo","disabledFirstAndPrev","disabledLast","disabledNext","computedTotalCountText","onClickFirst","onClickLast","onClickPrev","onClickNext","hideRecordsPerPage","_component_VBtnToggle","itemsPerPageOptions","_hoisted_6","generateByIdsApiQuery","useApiFetchByIds","useApiFetchListBatch","sortDesc","batchSize","forceElastic","results","nextPageData","promises","numPages","pageCopy","paginationRef","pageResponse","defaultColumn","createDatatableColumnsConfig","columnsHidden","disableActions","customI18n","showExpand","storeId","localI18n","i18n","columnsAll","obj","DATETIME_AUTO_LABEL_TRACKING","columnsVisible","columns","column","loadStoredColumns","storedData","storeColumns"],"mappings":"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"}