admins-components 9.0.37 → 9.0.38

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.
@@ -106,7 +106,7 @@ var E = {
106
106
  e.key === "Enter" && e.target?.tagName !== "TEXTAREA" && (e.preventDefault(), W());
107
107
  }
108
108
  function X(e, t) {
109
- e.onChangeCallback && e.onChangeCallback(t);
109
+ e.dropdownFilterCallback && e.dropdownFilterCallback(t);
110
110
  }
111
111
  return (s, c) => (x(), p(o, {
112
112
  open: v.open,
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components82.js","names":[],"sources":["../src/components/data-table/DataFilters.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { DropdownOption } from '@/components/DropdownSelect.vue'\n\nexport interface FilterItem {\n type: FilterItemType\n key: string\n label?: string\n placeholder?: string\n value?: any\n options?: DropdownOption[]\n fullWidth?: boolean\n config?: Record<string, any>\n displayClass?: string\n transformer?: (value: any) => Record<string, any> | null | undefined\n onChangeCallback?: (value: any) => void\n}\n\nexport interface FilterResponse {\n values: Record<string, any>\n transformed: Record<string, any>\n}\n\nexport interface DataFiltersProps {\n items: FilterItem[]\n open?: boolean\n position?: SidebarPosition\n lazy?: boolean\n handleUrl?: boolean\n historyEnabled?: boolean\n storageKey?: string\n}\n\n\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport Sidebar, { type SidebarPosition } from '@/components/Sidebar.vue'\nimport DatePicker from '@/components/DatePicker.vue'\nimport DateRangePicker from '@/components/DateRangePicker.vue'\nimport DropdownSelect from '@/components/DropdownSelect.vue'\nimport TextInput, { type TextInputType } from '@/components/TextInput.vue'\nimport Button from '@/components/Button.vue'\nimport Checkbox from '@/components/Checkbox.vue'\nimport FiltersHistory from '@/components/data-table/FiltersHistory.vue'\nimport type { DatePickerConfig, DateRangePickerConfig } from '@/types/datepickers'\nimport type { FilterItemType, PickedDate, PickedUtcRange } from '@/types/types'\nimport {\n filterEmptyValues,\n getDefaultFilters,\n writeFilterParams,\n} from '@/utils/dataFilters'\n\nconst props = withDefaults(defineProps<DataFiltersProps>(), {\n open: false,\n position: 'left',\n lazy: true,\n handleUrl: false,\n historyEnabled: true,\n})\n\nconst emit = defineEmits<{\n close: []\n change: [response: FilterResponse]\n}>()\n\nconst values = ref<Record<string, any>>(getDefaultFilters(props.items, props.storageKey, false))\nconst filterRefs = ref<Record<string, any>>({})\n\nfunction setFilterRef(key: string, el: any) {\n if (el) filterRefs.value[key] = el\n else delete filterRefs.value[key]\n}\n\nfunction buildDatePickerConfig(item: FilterItem): DatePickerConfig {\n return {\n ...(item.config ?? {}),\n showTime: item.type === 'datetime',\n placeholder: item.placeholder ?? (item.type === 'datetime' ? 'Időpont' : 'Dátum'),\n }\n}\n\nfunction buildDateRangePickerConfig(item: FilterItem): DateRangePickerConfig {\n return {\n ...(item.config ?? {}),\n ...(!item.fullWidth ? { compact: true } : {}),\n showTime: item.type === 'datetimerange',\n }\n}\n\nfunction update(key: string, value: any) {\n values.value = { ...values.value, [key]: value }\n if (!props.lazy) emitChange()\n}\n\nconst hasActiveFilters = computed(() =>\n Object.values(values.value).some((v) => v !== null && v !== '' && v !== undefined),\n)\n\nfunction buildResponse(): FilterResponse {\n const transformed: Record<string, any> = {}\n for (const item of props.items) {\n if (item.type === 'separator') continue\n const val = values.value[item.key]\n if (item.transformer) Object.assign(transformed, item.transformer(val) ?? {})\n else transformed[item.key] = val\n }\n return { values: filterEmptyValues(values.value), transformed: filterEmptyValues(transformed) }\n}\n\nfunction emitChange() {\n if (props.handleUrl) writeFilterParams(props.items, values.value)\n emit('change', buildResponse())\n}\n\nfunction confirm() {\n emitChange()\n emit('close')\n}\n\nfunction clearAll() {\n values.value = {}\n emitChange()\n}\n\nfunction clearFilter(key: string) {\n values.value = { ...values.value, [key]: null }\n emitChange()\n}\n\nfunction focusFilter(key: string) {\n const el = (filterRefs.value as Record<string, any>)[key]\n if (!el) return\n\n if (typeof el.focusAndOpen === 'function') el.focusAndOpen()\n else if (typeof el.focus === 'function') el.focus()\n}\n\nfunction onHistoryLoad(loaded: Record<string, any>) {\n const next: Record<string, any> = { ...values.value }\n for (const item of props.items) {\n if (item.type === 'separator') continue\n if (item.key in loaded) next[item.key] = loaded[item.key] ?? null\n }\n values.value = next\n emitChange()\n}\n\ndefineExpose({ clearFilter, focusFilter })\n\nfunction handleFilterKeydown(event: KeyboardEvent) {\n if (event.key !== 'Enter') return\n\n // Allow Enter in textarea for line breaks\n const target = event.target as HTMLElement\n if (target?.tagName === 'TEXTAREA') return\n\n event.preventDefault()\n confirm()\n}\n\nfunction handleDropdownFilterInput(item: FilterItem, text: string) {\n if (item.onChangeCallback) item.onChangeCallback(text)\n}\n</script>\n\n<template>\n <Sidebar :open=\"open\" title=\"Szűrők\" :position=\"position\" @close=\"emit('close')\">\n <div class=\"data-filters\" @keydown=\"handleFilterKeydown\">\n <div\n v-for=\"item in items\"\n :key=\"item.key\"\n class=\"data-filters__field\"\n :class=\"{ 'data-filters__field--full': item.fullWidth || item.type === 'separator' }\"\n >\n <hr v-if=\"item.type === 'separator'\" class=\"data-filters__separator\" />\n <template v-else-if=\"item.type === 'checkbox'\">\n <Checkbox\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :model-value=\"(values[item.key] as boolean) ?? false\"\n :label=\"item.label ?? item.key\"\n @update:model-value=\"(val) => update(item.key, val)\"\n v-bind=\"item.config\"\n />\n </template>\n <template v-else-if=\"['text', 'number', 'textarea'].includes(item.type)\">\n <TextInput\n :type=\"item.type as TextInputType\"\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :id=\"`df-${item.key}`\"\n :model-value=\"(values[item.key] as string) ?? ''\"\n :label=\"item.label ?? item.key\"\n :placeholder=\"item.placeholder\"\n @update:model-value=\"(val) => update(item.key, val || null)\"\n v-bind=\"item.config\"\n />\n </template>\n <template v-else-if=\"item.type === 'date' || item.type === 'datetime'\">\n <label class=\"c-label\" :for=\"`df-${item.key}`\">{{ item.label ?? item.key }}</label>\n <DatePicker\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :id=\"`df-${item.key}`\"\n :model-value=\"(values[item.key] as PickedDate) ?? null\"\n :config=\"buildDatePickerConfig(item)\"\n @update:model-value=\"update(item.key, $event)\"\n />\n </template>\n <template v-else-if=\"item.type === 'daterange' || item.type === 'datetimerange'\">\n <span class=\"c-label\">{{ item.label ?? item.key }}</span>\n <DateRangePicker\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :model-value=\"(values[item.key] as PickedUtcRange) ?? null\"\n :config=\"buildDateRangePickerConfig(item)\"\n @update:model-value=\"update(item.key, $event)\"\n />\n </template>\n <template v-else-if=\"item.type === 'dropdown'\">\n <span class=\"c-label\">{{ item.label ?? item.key }}</span>\n <DropdownSelect\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :model-value=\"(values[item.key] as string) ?? null\"\n :options=\"item.options ?? []\"\n :config=\"{\n ...(item.config ?? {}),\n placeholder: item.placeholder ?? 'Válassz...',\n clearable: true,\n filterable: true,\n }\"\n @filter-input=\"handleDropdownFilterInput(item, $event)\"\n @update:model-value=\"update(item.key, $event)\"\n />\n </template>\n </div>\n </div>\n <div class=\"data-filters__footer\">\n <Button\n icon=\"fa-solid fa-trash-can\"\n :disabled=\"!hasActiveFilters\"\n label=\"Szűrők törlése\"\n aria-label=\"Szűrők törlése\"\n size=\"small\"\n @click=\"clearAll\"\n />\n <Button label=\"Szűrés\" aria-label=\"Szűrés\" type=\"success\" @click=\"confirm\" />\n </div>\n <template v-if=\"historyEnabled\">\n <hr class=\"separator my-3\" />\n <FiltersHistory\n :items=\"items\"\n :values=\"values\"\n :storage-key=\"storageKey\"\n @load=\"onHistoryLoad\"\n />\n </template>\n </Sidebar>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-filters.scss\"></style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"admins-components82.js","names":[],"sources":["../src/components/data-table/DataFilters.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { DropdownOption } from '@/components/DropdownSelect.vue'\n\nexport interface FilterItem {\n type: FilterItemType\n key: string\n label?: string\n placeholder?: string\n value?: any\n options?: DropdownOption[]\n fullWidth?: boolean\n config?: Record<string, any>\n displayClass?: string\n transformer?: (value: any) => Record<string, any> | null | undefined\n dropdownFilterCallback?: (value: string) => void\n}\n\nexport interface FilterResponse {\n values: Record<string, any>\n transformed: Record<string, any>\n}\n\nexport interface DataFiltersProps {\n items: FilterItem[]\n open?: boolean\n position?: SidebarPosition\n lazy?: boolean\n handleUrl?: boolean\n historyEnabled?: boolean\n storageKey?: string\n}\n\n\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport Sidebar, { type SidebarPosition } from '@/components/Sidebar.vue'\nimport DatePicker from '@/components/DatePicker.vue'\nimport DateRangePicker from '@/components/DateRangePicker.vue'\nimport DropdownSelect from '@/components/DropdownSelect.vue'\nimport TextInput, { type TextInputType } from '@/components/TextInput.vue'\nimport Button from '@/components/Button.vue'\nimport Checkbox from '@/components/Checkbox.vue'\nimport FiltersHistory from '@/components/data-table/FiltersHistory.vue'\nimport type { DatePickerConfig, DateRangePickerConfig } from '@/types/datepickers'\nimport type { FilterItemType, PickedDate, PickedUtcRange } from '@/types/types'\nimport {\n filterEmptyValues,\n getDefaultFilters,\n writeFilterParams,\n} from '@/utils/dataFilters'\n\nconst props = withDefaults(defineProps<DataFiltersProps>(), {\n open: false,\n position: 'left',\n lazy: true,\n handleUrl: false,\n historyEnabled: true,\n})\n\nconst emit = defineEmits<{\n close: []\n change: [response: FilterResponse]\n}>()\n\nconst values = ref<Record<string, any>>(getDefaultFilters(props.items, props.storageKey, false))\nconst filterRefs = ref<Record<string, any>>({})\n\nfunction setFilterRef(key: string, el: any) {\n if (el) filterRefs.value[key] = el\n else delete filterRefs.value[key]\n}\n\nfunction buildDatePickerConfig(item: FilterItem): DatePickerConfig {\n return {\n ...(item.config ?? {}),\n showTime: item.type === 'datetime',\n placeholder: item.placeholder ?? (item.type === 'datetime' ? 'Időpont' : 'Dátum'),\n }\n}\n\nfunction buildDateRangePickerConfig(item: FilterItem): DateRangePickerConfig {\n return {\n ...(item.config ?? {}),\n ...(!item.fullWidth ? { compact: true } : {}),\n showTime: item.type === 'datetimerange',\n }\n}\n\nfunction update(key: string, value: any) {\n values.value = { ...values.value, [key]: value }\n if (!props.lazy) emitChange()\n}\n\nconst hasActiveFilters = computed(() =>\n Object.values(values.value).some((v) => v !== null && v !== '' && v !== undefined),\n)\n\nfunction buildResponse(): FilterResponse {\n const transformed: Record<string, any> = {}\n for (const item of props.items) {\n if (item.type === 'separator') continue\n const val = values.value[item.key]\n if (item.transformer) Object.assign(transformed, item.transformer(val) ?? {})\n else transformed[item.key] = val\n }\n return { values: filterEmptyValues(values.value), transformed: filterEmptyValues(transformed) }\n}\n\nfunction emitChange() {\n if (props.handleUrl) writeFilterParams(props.items, values.value)\n emit('change', buildResponse())\n}\n\nfunction confirm() {\n emitChange()\n emit('close')\n}\n\nfunction clearAll() {\n values.value = {}\n emitChange()\n}\n\nfunction clearFilter(key: string) {\n values.value = { ...values.value, [key]: null }\n emitChange()\n}\n\nfunction focusFilter(key: string) {\n const el = (filterRefs.value as Record<string, any>)[key]\n if (!el) return\n\n if (typeof el.focusAndOpen === 'function') el.focusAndOpen()\n else if (typeof el.focus === 'function') el.focus()\n}\n\nfunction onHistoryLoad(loaded: Record<string, any>) {\n const next: Record<string, any> = { ...values.value }\n for (const item of props.items) {\n if (item.type === 'separator') continue\n if (item.key in loaded) next[item.key] = loaded[item.key] ?? null\n }\n values.value = next\n emitChange()\n}\n\ndefineExpose({ clearFilter, focusFilter })\n\nfunction handleFilterKeydown(event: KeyboardEvent) {\n if (event.key !== 'Enter') return\n\n // Allow Enter in textarea for line breaks\n const target = event.target as HTMLElement\n if (target?.tagName === 'TEXTAREA') return\n\n event.preventDefault()\n confirm()\n}\n\nfunction handleDropdownFilterInput(item: FilterItem, text: string) {\n if (item.dropdownFilterCallback) item.dropdownFilterCallback(text)\n}\n</script>\n\n<template>\n <Sidebar :open=\"open\" title=\"Szűrők\" :position=\"position\" @close=\"emit('close')\">\n <div class=\"data-filters\" @keydown=\"handleFilterKeydown\">\n <div\n v-for=\"item in items\"\n :key=\"item.key\"\n class=\"data-filters__field\"\n :class=\"{ 'data-filters__field--full': item.fullWidth || item.type === 'separator' }\"\n >\n <hr v-if=\"item.type === 'separator'\" class=\"data-filters__separator\" />\n <template v-else-if=\"item.type === 'checkbox'\">\n <Checkbox\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :model-value=\"(values[item.key] as boolean) ?? false\"\n :label=\"item.label ?? item.key\"\n @update:model-value=\"(val) => update(item.key, val)\"\n v-bind=\"item.config\"\n />\n </template>\n <template v-else-if=\"['text', 'number', 'textarea'].includes(item.type)\">\n <TextInput\n :type=\"item.type as TextInputType\"\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :id=\"`df-${item.key}`\"\n :model-value=\"(values[item.key] as string) ?? ''\"\n :label=\"item.label ?? item.key\"\n :placeholder=\"item.placeholder\"\n @update:model-value=\"(val) => update(item.key, val || null)\"\n v-bind=\"item.config\"\n />\n </template>\n <template v-else-if=\"item.type === 'date' || item.type === 'datetime'\">\n <label class=\"c-label\" :for=\"`df-${item.key}`\">{{ item.label ?? item.key }}</label>\n <DatePicker\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :id=\"`df-${item.key}`\"\n :model-value=\"(values[item.key] as PickedDate) ?? null\"\n :config=\"buildDatePickerConfig(item)\"\n @update:model-value=\"update(item.key, $event)\"\n />\n </template>\n <template v-else-if=\"item.type === 'daterange' || item.type === 'datetimerange'\">\n <span class=\"c-label\">{{ item.label ?? item.key }}</span>\n <DateRangePicker\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :model-value=\"(values[item.key] as PickedUtcRange) ?? null\"\n :config=\"buildDateRangePickerConfig(item)\"\n @update:model-value=\"update(item.key, $event)\"\n />\n </template>\n <template v-else-if=\"item.type === 'dropdown'\">\n <span class=\"c-label\">{{ item.label ?? item.key }}</span>\n <DropdownSelect\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :model-value=\"(values[item.key] as string) ?? null\"\n :options=\"item.options ?? []\"\n :config=\"{\n ...(item.config ?? {}),\n placeholder: item.placeholder ?? 'Válassz...',\n clearable: true,\n filterable: true,\n }\"\n @filter-input=\"handleDropdownFilterInput(item, $event)\"\n @update:model-value=\"update(item.key, $event)\"\n />\n </template>\n </div>\n </div>\n <div class=\"data-filters__footer\">\n <Button\n icon=\"fa-solid fa-trash-can\"\n :disabled=\"!hasActiveFilters\"\n label=\"Szűrők törlése\"\n aria-label=\"Szűrők törlése\"\n size=\"small\"\n @click=\"clearAll\"\n />\n <Button label=\"Szűrés\" aria-label=\"Szűrés\" type=\"success\" @click=\"confirm\" />\n </div>\n <template v-if=\"historyEnabled\">\n <hr class=\"separator my-3\" />\n <FiltersHistory\n :items=\"items\"\n :values=\"values\"\n :storage-key=\"storageKey\"\n @load=\"onHistoryLoad\"\n />\n </template>\n </Sidebar>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-filters.scss\"></style>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components84.js","names":[],"sources":["../src/components/data-table/DataFilters.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { DropdownOption } from '@/components/DropdownSelect.vue'\n\nexport interface FilterItem {\n type: FilterItemType\n key: string\n label?: string\n placeholder?: string\n value?: any\n options?: DropdownOption[]\n fullWidth?: boolean\n config?: Record<string, any>\n displayClass?: string\n transformer?: (value: any) => Record<string, any> | null | undefined\n onChangeCallback?: (value: any) => void\n}\n\nexport interface FilterResponse {\n values: Record<string, any>\n transformed: Record<string, any>\n}\n\nexport interface DataFiltersProps {\n items: FilterItem[]\n open?: boolean\n position?: SidebarPosition\n lazy?: boolean\n handleUrl?: boolean\n historyEnabled?: boolean\n storageKey?: string\n}\n\n\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport Sidebar, { type SidebarPosition } from '@/components/Sidebar.vue'\nimport DatePicker from '@/components/DatePicker.vue'\nimport DateRangePicker from '@/components/DateRangePicker.vue'\nimport DropdownSelect from '@/components/DropdownSelect.vue'\nimport TextInput, { type TextInputType } from '@/components/TextInput.vue'\nimport Button from '@/components/Button.vue'\nimport Checkbox from '@/components/Checkbox.vue'\nimport FiltersHistory from '@/components/data-table/FiltersHistory.vue'\nimport type { DatePickerConfig, DateRangePickerConfig } from '@/types/datepickers'\nimport type { FilterItemType, PickedDate, PickedUtcRange } from '@/types/types'\nimport {\n filterEmptyValues,\n getDefaultFilters,\n writeFilterParams,\n} from '@/utils/dataFilters'\n\nconst props = withDefaults(defineProps<DataFiltersProps>(), {\n open: false,\n position: 'left',\n lazy: true,\n handleUrl: false,\n historyEnabled: true,\n})\n\nconst emit = defineEmits<{\n close: []\n change: [response: FilterResponse]\n}>()\n\nconst values = ref<Record<string, any>>(getDefaultFilters(props.items, props.storageKey, false))\nconst filterRefs = ref<Record<string, any>>({})\n\nfunction setFilterRef(key: string, el: any) {\n if (el) filterRefs.value[key] = el\n else delete filterRefs.value[key]\n}\n\nfunction buildDatePickerConfig(item: FilterItem): DatePickerConfig {\n return {\n ...(item.config ?? {}),\n showTime: item.type === 'datetime',\n placeholder: item.placeholder ?? (item.type === 'datetime' ? 'Időpont' : 'Dátum'),\n }\n}\n\nfunction buildDateRangePickerConfig(item: FilterItem): DateRangePickerConfig {\n return {\n ...(item.config ?? {}),\n ...(!item.fullWidth ? { compact: true } : {}),\n showTime: item.type === 'datetimerange',\n }\n}\n\nfunction update(key: string, value: any) {\n values.value = { ...values.value, [key]: value }\n if (!props.lazy) emitChange()\n}\n\nconst hasActiveFilters = computed(() =>\n Object.values(values.value).some((v) => v !== null && v !== '' && v !== undefined),\n)\n\nfunction buildResponse(): FilterResponse {\n const transformed: Record<string, any> = {}\n for (const item of props.items) {\n if (item.type === 'separator') continue\n const val = values.value[item.key]\n if (item.transformer) Object.assign(transformed, item.transformer(val) ?? {})\n else transformed[item.key] = val\n }\n return { values: filterEmptyValues(values.value), transformed: filterEmptyValues(transformed) }\n}\n\nfunction emitChange() {\n if (props.handleUrl) writeFilterParams(props.items, values.value)\n emit('change', buildResponse())\n}\n\nfunction confirm() {\n emitChange()\n emit('close')\n}\n\nfunction clearAll() {\n values.value = {}\n emitChange()\n}\n\nfunction clearFilter(key: string) {\n values.value = { ...values.value, [key]: null }\n emitChange()\n}\n\nfunction focusFilter(key: string) {\n const el = (filterRefs.value as Record<string, any>)[key]\n if (!el) return\n\n if (typeof el.focusAndOpen === 'function') el.focusAndOpen()\n else if (typeof el.focus === 'function') el.focus()\n}\n\nfunction onHistoryLoad(loaded: Record<string, any>) {\n const next: Record<string, any> = { ...values.value }\n for (const item of props.items) {\n if (item.type === 'separator') continue\n if (item.key in loaded) next[item.key] = loaded[item.key] ?? null\n }\n values.value = next\n emitChange()\n}\n\ndefineExpose({ clearFilter, focusFilter })\n\nfunction handleFilterKeydown(event: KeyboardEvent) {\n if (event.key !== 'Enter') return\n\n // Allow Enter in textarea for line breaks\n const target = event.target as HTMLElement\n if (target?.tagName === 'TEXTAREA') return\n\n event.preventDefault()\n confirm()\n}\n\nfunction handleDropdownFilterInput(item: FilterItem, text: string) {\n if (item.onChangeCallback) item.onChangeCallback(text)\n}\n</script>\n\n<template>\n <Sidebar :open=\"open\" title=\"Szűrők\" :position=\"position\" @close=\"emit('close')\">\n <div class=\"data-filters\" @keydown=\"handleFilterKeydown\">\n <div\n v-for=\"item in items\"\n :key=\"item.key\"\n class=\"data-filters__field\"\n :class=\"{ 'data-filters__field--full': item.fullWidth || item.type === 'separator' }\"\n >\n <hr v-if=\"item.type === 'separator'\" class=\"data-filters__separator\" />\n <template v-else-if=\"item.type === 'checkbox'\">\n <Checkbox\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :model-value=\"(values[item.key] as boolean) ?? false\"\n :label=\"item.label ?? item.key\"\n @update:model-value=\"(val) => update(item.key, val)\"\n v-bind=\"item.config\"\n />\n </template>\n <template v-else-if=\"['text', 'number', 'textarea'].includes(item.type)\">\n <TextInput\n :type=\"item.type as TextInputType\"\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :id=\"`df-${item.key}`\"\n :model-value=\"(values[item.key] as string) ?? ''\"\n :label=\"item.label ?? item.key\"\n :placeholder=\"item.placeholder\"\n @update:model-value=\"(val) => update(item.key, val || null)\"\n v-bind=\"item.config\"\n />\n </template>\n <template v-else-if=\"item.type === 'date' || item.type === 'datetime'\">\n <label class=\"c-label\" :for=\"`df-${item.key}`\">{{ item.label ?? item.key }}</label>\n <DatePicker\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :id=\"`df-${item.key}`\"\n :model-value=\"(values[item.key] as PickedDate) ?? null\"\n :config=\"buildDatePickerConfig(item)\"\n @update:model-value=\"update(item.key, $event)\"\n />\n </template>\n <template v-else-if=\"item.type === 'daterange' || item.type === 'datetimerange'\">\n <span class=\"c-label\">{{ item.label ?? item.key }}</span>\n <DateRangePicker\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :model-value=\"(values[item.key] as PickedUtcRange) ?? null\"\n :config=\"buildDateRangePickerConfig(item)\"\n @update:model-value=\"update(item.key, $event)\"\n />\n </template>\n <template v-else-if=\"item.type === 'dropdown'\">\n <span class=\"c-label\">{{ item.label ?? item.key }}</span>\n <DropdownSelect\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :model-value=\"(values[item.key] as string) ?? null\"\n :options=\"item.options ?? []\"\n :config=\"{\n ...(item.config ?? {}),\n placeholder: item.placeholder ?? 'Válassz...',\n clearable: true,\n filterable: true,\n }\"\n @filter-input=\"handleDropdownFilterInput(item, $event)\"\n @update:model-value=\"update(item.key, $event)\"\n />\n </template>\n </div>\n </div>\n <div class=\"data-filters__footer\">\n <Button\n icon=\"fa-solid fa-trash-can\"\n :disabled=\"!hasActiveFilters\"\n label=\"Szűrők törlése\"\n aria-label=\"Szűrők törlése\"\n size=\"small\"\n @click=\"clearAll\"\n />\n <Button label=\"Szűrés\" aria-label=\"Szűrés\" type=\"success\" @click=\"confirm\" />\n </div>\n <template v-if=\"historyEnabled\">\n <hr class=\"separator my-3\" />\n <FiltersHistory\n :items=\"items\"\n :values=\"values\"\n :storage-key=\"storageKey\"\n @load=\"onHistoryLoad\"\n />\n </template>\n </Sidebar>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-filters.scss\"></style>\n"],"mappings":""}
1
+ {"version":3,"file":"admins-components84.js","names":[],"sources":["../src/components/data-table/DataFilters.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { DropdownOption } from '@/components/DropdownSelect.vue'\n\nexport interface FilterItem {\n type: FilterItemType\n key: string\n label?: string\n placeholder?: string\n value?: any\n options?: DropdownOption[]\n fullWidth?: boolean\n config?: Record<string, any>\n displayClass?: string\n transformer?: (value: any) => Record<string, any> | null | undefined\n dropdownFilterCallback?: (value: string) => void\n}\n\nexport interface FilterResponse {\n values: Record<string, any>\n transformed: Record<string, any>\n}\n\nexport interface DataFiltersProps {\n items: FilterItem[]\n open?: boolean\n position?: SidebarPosition\n lazy?: boolean\n handleUrl?: boolean\n historyEnabled?: boolean\n storageKey?: string\n}\n\n\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport Sidebar, { type SidebarPosition } from '@/components/Sidebar.vue'\nimport DatePicker from '@/components/DatePicker.vue'\nimport DateRangePicker from '@/components/DateRangePicker.vue'\nimport DropdownSelect from '@/components/DropdownSelect.vue'\nimport TextInput, { type TextInputType } from '@/components/TextInput.vue'\nimport Button from '@/components/Button.vue'\nimport Checkbox from '@/components/Checkbox.vue'\nimport FiltersHistory from '@/components/data-table/FiltersHistory.vue'\nimport type { DatePickerConfig, DateRangePickerConfig } from '@/types/datepickers'\nimport type { FilterItemType, PickedDate, PickedUtcRange } from '@/types/types'\nimport {\n filterEmptyValues,\n getDefaultFilters,\n writeFilterParams,\n} from '@/utils/dataFilters'\n\nconst props = withDefaults(defineProps<DataFiltersProps>(), {\n open: false,\n position: 'left',\n lazy: true,\n handleUrl: false,\n historyEnabled: true,\n})\n\nconst emit = defineEmits<{\n close: []\n change: [response: FilterResponse]\n}>()\n\nconst values = ref<Record<string, any>>(getDefaultFilters(props.items, props.storageKey, false))\nconst filterRefs = ref<Record<string, any>>({})\n\nfunction setFilterRef(key: string, el: any) {\n if (el) filterRefs.value[key] = el\n else delete filterRefs.value[key]\n}\n\nfunction buildDatePickerConfig(item: FilterItem): DatePickerConfig {\n return {\n ...(item.config ?? {}),\n showTime: item.type === 'datetime',\n placeholder: item.placeholder ?? (item.type === 'datetime' ? 'Időpont' : 'Dátum'),\n }\n}\n\nfunction buildDateRangePickerConfig(item: FilterItem): DateRangePickerConfig {\n return {\n ...(item.config ?? {}),\n ...(!item.fullWidth ? { compact: true } : {}),\n showTime: item.type === 'datetimerange',\n }\n}\n\nfunction update(key: string, value: any) {\n values.value = { ...values.value, [key]: value }\n if (!props.lazy) emitChange()\n}\n\nconst hasActiveFilters = computed(() =>\n Object.values(values.value).some((v) => v !== null && v !== '' && v !== undefined),\n)\n\nfunction buildResponse(): FilterResponse {\n const transformed: Record<string, any> = {}\n for (const item of props.items) {\n if (item.type === 'separator') continue\n const val = values.value[item.key]\n if (item.transformer) Object.assign(transformed, item.transformer(val) ?? {})\n else transformed[item.key] = val\n }\n return { values: filterEmptyValues(values.value), transformed: filterEmptyValues(transformed) }\n}\n\nfunction emitChange() {\n if (props.handleUrl) writeFilterParams(props.items, values.value)\n emit('change', buildResponse())\n}\n\nfunction confirm() {\n emitChange()\n emit('close')\n}\n\nfunction clearAll() {\n values.value = {}\n emitChange()\n}\n\nfunction clearFilter(key: string) {\n values.value = { ...values.value, [key]: null }\n emitChange()\n}\n\nfunction focusFilter(key: string) {\n const el = (filterRefs.value as Record<string, any>)[key]\n if (!el) return\n\n if (typeof el.focusAndOpen === 'function') el.focusAndOpen()\n else if (typeof el.focus === 'function') el.focus()\n}\n\nfunction onHistoryLoad(loaded: Record<string, any>) {\n const next: Record<string, any> = { ...values.value }\n for (const item of props.items) {\n if (item.type === 'separator') continue\n if (item.key in loaded) next[item.key] = loaded[item.key] ?? null\n }\n values.value = next\n emitChange()\n}\n\ndefineExpose({ clearFilter, focusFilter })\n\nfunction handleFilterKeydown(event: KeyboardEvent) {\n if (event.key !== 'Enter') return\n\n // Allow Enter in textarea for line breaks\n const target = event.target as HTMLElement\n if (target?.tagName === 'TEXTAREA') return\n\n event.preventDefault()\n confirm()\n}\n\nfunction handleDropdownFilterInput(item: FilterItem, text: string) {\n if (item.dropdownFilterCallback) item.dropdownFilterCallback(text)\n}\n</script>\n\n<template>\n <Sidebar :open=\"open\" title=\"Szűrők\" :position=\"position\" @close=\"emit('close')\">\n <div class=\"data-filters\" @keydown=\"handleFilterKeydown\">\n <div\n v-for=\"item in items\"\n :key=\"item.key\"\n class=\"data-filters__field\"\n :class=\"{ 'data-filters__field--full': item.fullWidth || item.type === 'separator' }\"\n >\n <hr v-if=\"item.type === 'separator'\" class=\"data-filters__separator\" />\n <template v-else-if=\"item.type === 'checkbox'\">\n <Checkbox\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :model-value=\"(values[item.key] as boolean) ?? false\"\n :label=\"item.label ?? item.key\"\n @update:model-value=\"(val) => update(item.key, val)\"\n v-bind=\"item.config\"\n />\n </template>\n <template v-else-if=\"['text', 'number', 'textarea'].includes(item.type)\">\n <TextInput\n :type=\"item.type as TextInputType\"\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :id=\"`df-${item.key}`\"\n :model-value=\"(values[item.key] as string) ?? ''\"\n :label=\"item.label ?? item.key\"\n :placeholder=\"item.placeholder\"\n @update:model-value=\"(val) => update(item.key, val || null)\"\n v-bind=\"item.config\"\n />\n </template>\n <template v-else-if=\"item.type === 'date' || item.type === 'datetime'\">\n <label class=\"c-label\" :for=\"`df-${item.key}`\">{{ item.label ?? item.key }}</label>\n <DatePicker\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :id=\"`df-${item.key}`\"\n :model-value=\"(values[item.key] as PickedDate) ?? null\"\n :config=\"buildDatePickerConfig(item)\"\n @update:model-value=\"update(item.key, $event)\"\n />\n </template>\n <template v-else-if=\"item.type === 'daterange' || item.type === 'datetimerange'\">\n <span class=\"c-label\">{{ item.label ?? item.key }}</span>\n <DateRangePicker\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :model-value=\"(values[item.key] as PickedUtcRange) ?? null\"\n :config=\"buildDateRangePickerConfig(item)\"\n @update:model-value=\"update(item.key, $event)\"\n />\n </template>\n <template v-else-if=\"item.type === 'dropdown'\">\n <span class=\"c-label\">{{ item.label ?? item.key }}</span>\n <DropdownSelect\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :model-value=\"(values[item.key] as string) ?? null\"\n :options=\"item.options ?? []\"\n :config=\"{\n ...(item.config ?? {}),\n placeholder: item.placeholder ?? 'Válassz...',\n clearable: true,\n filterable: true,\n }\"\n @filter-input=\"handleDropdownFilterInput(item, $event)\"\n @update:model-value=\"update(item.key, $event)\"\n />\n </template>\n </div>\n </div>\n <div class=\"data-filters__footer\">\n <Button\n icon=\"fa-solid fa-trash-can\"\n :disabled=\"!hasActiveFilters\"\n label=\"Szűrők törlése\"\n aria-label=\"Szűrők törlése\"\n size=\"small\"\n @click=\"clearAll\"\n />\n <Button label=\"Szűrés\" aria-label=\"Szűrés\" type=\"success\" @click=\"confirm\" />\n </div>\n <template v-if=\"historyEnabled\">\n <hr class=\"separator my-3\" />\n <FiltersHistory\n :items=\"items\"\n :values=\"values\"\n :storage-key=\"storageKey\"\n @load=\"onHistoryLoad\"\n />\n </template>\n </Sidebar>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-filters.scss\"></style>\n"],"mappings":""}
@@ -12,7 +12,7 @@ export interface FilterItem {
12
12
  config?: Record<string, any>;
13
13
  displayClass?: string;
14
14
  transformer?: (value: any) => Record<string, any> | null | undefined;
15
- onChangeCallback?: (value: any) => void;
15
+ dropdownFilterCallback?: (value: string) => void;
16
16
  }
17
17
  export interface FilterResponse {
18
18
  values: Record<string, any>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "admins-components",
3
- "version": "9.0.37",
3
+ "version": "9.0.38",
4
4
  "type": "module",
5
5
  "module": "./dist/admins-components.js",
6
6
  "types": "./dist/index.d.ts",