admins-components 9.0.80 → 9.0.82

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.
Files changed (42) hide show
  1. package/dist/admins-components103.js +2 -1
  2. package/dist/admins-components103.js.map +1 -1
  3. package/dist/admins-components105.js.map +1 -1
  4. package/dist/admins-components16.js +18 -10
  5. package/dist/admins-components16.js.map +1 -1
  6. package/dist/admins-components17.js.map +1 -1
  7. package/dist/admins-components21.js +43 -39
  8. package/dist/admins-components21.js.map +1 -1
  9. package/dist/admins-components22.js.map +1 -1
  10. package/dist/admins-components38.js +25 -19
  11. package/dist/admins-components38.js.map +1 -1
  12. package/dist/admins-components40.js.map +1 -1
  13. package/dist/admins-components46.js +44 -44
  14. package/dist/admins-components46.js.map +1 -1
  15. package/dist/admins-components48.js.map +1 -1
  16. package/dist/admins-components51.js +9 -2
  17. package/dist/admins-components51.js.map +1 -1
  18. package/dist/admins-components52.js.map +1 -1
  19. package/dist/admins-components60.js +2 -1
  20. package/dist/admins-components60.js.map +1 -1
  21. package/dist/admins-components75.js +179 -161
  22. package/dist/admins-components75.js.map +1 -1
  23. package/dist/admins-components77.js.map +1 -1
  24. package/dist/admins-components87.js +1 -1
  25. package/dist/admins-components87.js.map +1 -1
  26. package/dist/admins-components91.js +75 -81
  27. package/dist/admins-components91.js.map +1 -1
  28. package/dist/admins-components93.js.map +1 -1
  29. package/dist/main.css +1 -1
  30. package/dist/src/components/TextInput.vue.d.ts +8 -0
  31. package/dist/src/types/data-list.d.ts +3 -2
  32. package/dist/src/utils/dataFilters.d.ts +1 -0
  33. package/dist/styles/components/data-table/data-list-options.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  34. package/dist/styles/components/data-table/data-table.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  35. package/dist/styles/components/data-table/filter-tags.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  36. package/dist/widget/dist/favicon.ico +0 -0
  37. package/dist/widget/dist/search-posts-widget.css +1 -0
  38. package/dist/widget/dist/search-posts-widget.es.js +11190 -0
  39. package/dist/widget/dist/search-posts-widget.umd.js +34 -0
  40. package/dist/widget.css +1 -0
  41. package/package.json +6 -2
  42. package/dist/main.css.map +0 -1
@@ -76,7 +76,8 @@ var L = /*@__PURE__*/ x({
76
76
  handleUrl: L("searchConfig")
77
77
  })), z = m(() => ({
78
78
  ...I.filterConfig,
79
- handleUrl: L("filterConfig")
79
+ handleUrl: L("filterConfig"),
80
+ lazy: U.value == null ? I.filterConfig?.lazy ?? !0 : !U.value.filtersEager
80
81
  })), B = p, V = D(!1), H = D(!1), U = D(null), W = D(!1), G = D(null), K = D(!1), q = D(I.filterConfig?.items ? l(I.filterConfig.items, I.id, !1) : {}), J = null;
81
82
  re(() => {
82
83
  J = new ResizeObserver((e) => {
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components103.js","names":[],"sources":["../src/components/data-table/DataList.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type { PaginatorSettings } from '@/types/data-list'\nexport type { DataSearchProps } from './DataSearch.vue'\nexport type { DataFiltersProps } from './DataFilters.vue'\n\nexport interface DataListProps {\n config: DataListConfig\n items: Record<string, unknown>[]\n settings?: Partial<DataListSettings>\n id: string\n layoutBreakpoint?: number\n orderable?: boolean\n pagination?: PaginatorSettings\n loading?: boolean\n handleUrl?: boolean\n useSearch?: boolean\n useFilters?: boolean\n searchConfig?: DataSearchProps\n filterConfig?: DataFiltersProps\n fillHeight?: boolean\n}\n\nexport const dataListDefaults = {\n layoutBreakpoint: 768,\n orderable: true,\n loading: false,\n useSearch: true,\n useFilters: true,\n handleUrl: false,\n fillHeight: false,\n}\n\nexport function getDefaultFetchData(filters: FilterItem[], storageKey: string) {\n const defaultPaginator = getDefaultPaginator(storageKey)\n const defaultSort = getDefaultSort()\n const defaultSearch = getDefaultSearch()\n const defaultFilters = getDefaultFilterValues(filters, storageKey, true)\n\n return {\n ...defaultPaginator,\n ...defaultSort,\n ...defaultSearch,\n ...defaultFilters,\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onBeforeUnmount, useSlots } from 'vue'\nimport DataTable from '@/components/data-table/DataTable.vue'\nimport DataCards from '@/components/data-table/DataCards.vue'\nimport DataListOptions from '@/components/data-table/DataListOptions.vue'\nimport DataPaginator, { getDefaultPaginator } from '@/components/data-table/DataPaginator.vue'\nimport Button from '@/components/Button.vue'\nimport DataSort, { getDefaultSort, type DataSortOption } from '@/components/data-table/DataSort.vue'\nimport type {\n DataListConfig,\n DataListSettings,\n PageSettings,\n PaginatorSettings,\n} from '@/types/data-list'\nimport type { FilterValue } from '@/types/data-list'\nimport DataFilters, {\n type FilterResponse,\n type DataFiltersProps,\n type FilterItem,\n} from '@/components/data-table/DataFilters.vue'\nimport FilterTags from '@/components/data-table/FilterTags.vue'\nimport DataListGuide from '@/components/data-table/DataListGuide.vue'\nimport DataSearch, { getDefaultSearch, type DataSearchProps } from './DataSearch.vue'\nimport { getDefaultFilters, getDefaultFilterValues } from '@/utils/dataFilters.ts'\n\nconst dataFiltersRef = ref<InstanceType<typeof DataFilters> | null>(null)\nconst slots = useSlots()\nconst hasActionsSlot = computed(() => !!slots.actions)\n\nconst props = withDefaults(defineProps<DataListProps>(), {\n ...dataListDefaults,\n searchConfig: undefined,\n filterConfig: undefined,\n})\n\nfunction resolvedHandleUrl(side: 'searchConfig' | 'filterConfig'): boolean | undefined {\n const sideConfig = props[side]\n if (sideConfig && Object.hasOwn(sideConfig as object, 'handleUrl')) {\n return (sideConfig as { handleUrl?: boolean }).handleUrl\n }\n return props.handleUrl\n}\n\nconst mergedSearchConfig = computed<DataSearchProps>(() => ({\n ...props.searchConfig,\n handleUrl: resolvedHandleUrl('searchConfig'),\n}))\n\nconst mergedFilterConfig = computed<DataFiltersProps>(() => ({\n ...(props.filterConfig as DataFiltersProps),\n handleUrl: resolvedHandleUrl('filterConfig'),\n}))\n\nconst emit = defineEmits<{\n 'filter-change': [filters: Record<string, FilterValue>]\n 'selection-change': [selected: unknown[]]\n 'settings-change': [settings: DataListSettings]\n 'pagination-change': [pagination: PageSettings]\n 'sort-change': [sort: { key: string; direction: 'asc' | 'desc' } | null]\n 'search-change': [filters: Record<string, string | boolean>]\n}>()\n\nconst showOptions = ref(false)\nconst showGuide = ref(false)\nconst resolvedSettings = ref<DataListSettings | null>(null)\nconst isMobile = ref(false)\nconst root = ref<HTMLElement | null>(null)\nconst showFilters = ref(false)\n\nconst activeFilters = ref<Record<string, unknown>>(\n props.filterConfig?.items ? getDefaultFilters(props.filterConfig.items, props.id, false) : {},\n)\nlet resizeObserver: ResizeObserver | null = null\n\nonMounted(() => {\n resizeObserver = new ResizeObserver((entries) => {\n isMobile.value = (entries[0]?.contentRect.width ?? 0) < props.layoutBreakpoint\n })\n if (root.value) resizeObserver.observe(root.value)\n})\n\nonBeforeUnmount(() => resizeObserver?.disconnect())\n\nconst effectiveLayout = computed<'table' | 'cards'>(() => {\n const layout = resolvedSettings.value?.layout\n if (layout === 'table' || layout === 'cards') return layout\n return isMobile.value ? 'cards' : 'table'\n})\n\nconst internalConfig = computed<DataListConfig>(() => {\n if (!resolvedSettings.value) return props.config\n const order = resolvedSettings.value.columnOrder\n const mapped = props.config.columns.map((c) => ({\n ...c,\n visible: resolvedSettings.value!.columns[c.property] ?? c.visible !== false,\n }))\n if (order?.length) {\n mapped.sort((a, b) => {\n const ai = order.indexOf(a.property)\n const bi = order.indexOf(b.property)\n return (ai === -1 ? 999 : ai) - (bi === -1 ? 999 : bi)\n })\n }\n return { ...props.config, columns: mapped }\n})\n\nfunction onSettingsChange(s: DataListSettings) {\n resolvedSettings.value = s\n emit('settings-change', s)\n}\n\ndefineExpose({\n openOptions: () => (showOptions.value = true),\n closeOptions: () => (showOptions.value = false),\n openFilters: () => (showFilters.value = true),\n closeFilters: () => (showFilters.value = false),\n})\n\nasync function openFilter(key: string) {\n showFilters.value = true\n setTimeout(() => {\n dataFiltersRef.value?.focusFilter(key)\n }, 300)\n}\n\nfunction onFilterChange(response: FilterResponse) {\n activeFilters.value = response.values\n emit('filter-change', response.transformed)\n}\n\nconst activeFiltersCount = computed(\n () => Object.values(activeFilters.value).filter((v) => v != null && v !== '').length,\n)\n\nconst showPaginator = computed(\n () => !!props.pagination && (props.items.length > 0 || !props.loading),\n)\n\nconst searchChange = (value: Record<string, string | boolean>) => {\n emit('search-change', value)\n}\n\nconst sortableColumns = computed<DataSortOption[]>(() =>\n props.config.columns.filter((c) => c.sort).map((c) => ({ value: c.property, label: c.label })),\n)\n\nconst currentSort = ref<{ key: string; direction: 'asc' | 'desc' } | null>(\n props.handleUrl ? getDefaultSort() : null,\n)\n\nconst onSortChange = (sort: { key: string; direction: 'asc' | 'desc' } | null) => {\n currentSort.value = sort\n emit('sort-change', sort)\n}\n</script>\n\n<template>\n <div\n ref=\"root\"\n class=\"ac-component c-data-list\"\n :class=\"{ 'c-data-list--fill-height': fillHeight }\"\n >\n <div class=\"c-data-list__toolbar\">\n <DataSearch v-if=\"useSearch\" v-bind=\"mergedSearchConfig\" @search-change=\"searchChange\" />\n <Button\n v-if=\"useFilters && filterConfig?.items && filterConfig.items.length > 0\"\n label=\"Szűrők\"\n icon=\"fa-solid fa-filter\"\n @click=\"showFilters = true\"\n style=\"flex-shrink: 0\"\n :type=\"activeFiltersCount > 0 ? 'primary' : 'normal'\"\n :indicator=\"activeFiltersCount > 0 ? activeFiltersCount : undefined\"\n />\n <div\n class=\"flex-center gap-1 flex-center-wrap-on-mobile\"\n v-if=\"useFilters && filterConfig?.items && filterConfig.items.length > 0\"\n >\n <FilterTags\n :filters=\"activeFilters\"\n :items=\"filterConfig.items\"\n compact\n @remove=\"(key: string) => dataFiltersRef?.clearFilter(key)\"\n @openFilter=\"openFilter\"\n />\n </div>\n <div class=\"c-data-list__toolbar__right\">\n <DataSort\n v-if=\"sortableColumns.length > 0\"\n v-model=\"currentSort\"\n :options=\"sortableColumns\"\n :handle-url=\"handleUrl\"\n @sort-change=\"onSortChange\"\n />\n\n <Button\n icon=\"fa-solid fa-gear\"\n class=\"lh-normal settings-btn\"\n ariaLabel=\"Beállítások\"\n @click=\"showOptions = true\"\n />\n <Button\n icon=\"fa-solid fa-question\"\n class=\"lh-normal\"\n @click=\"showGuide = true\"\n ariaLabel=\"Súgó\"\n />\n </div>\n </div>\n <DataFilters\n ref=\"dataFiltersRef\"\n v-if=\"useFilters && filterConfig?.items && filterConfig.items.length > 0\"\n v-bind=\"mergedFilterConfig\"\n :storage-key=\"id\"\n :open=\"showFilters\"\n @close=\"showFilters = false\"\n @change=\"onFilterChange\"\n />\n <DataListGuide :open=\"showGuide\" @close=\"showGuide = false\" />\n <DataTable\n v-if=\"effectiveLayout === 'table'\"\n :config=\"internalConfig\"\n :loading=\"loading\"\n :items=\"items\"\n :settings=\"resolvedSettings ?? undefined\"\n :initial-sort=\"currentSort\"\n @filter-change=\"emit('filter-change', $event)\"\n @selection-change=\"emit('selection-change', $event)\"\n @sort-change=\"onSortChange\"\n >\n <template\n v-for=\"col in internalConfig.columns\"\n :key=\"col.property\"\n #[`cell:${col.property}`]=\"slotProps\"\n >\n <slot :name=\"`cell:${col.property}`\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"hasActionsSlot\" #actions=\"slotProps\">\n <slot name=\"actions\" v-bind=\"slotProps\" />\n </template>\n </DataTable>\n\n <DataCards\n v-else\n :config=\"internalConfig\"\n :loading=\"loading\"\n :items=\"items\"\n :settings=\"resolvedSettings ?? undefined\"\n @selection-change=\"emit('selection-change', $event)\"\n >\n <template\n v-for=\"col in internalConfig.columns\"\n :key=\"col.property\"\n #[`cell:${col.property}`]=\"slotProps\"\n >\n <slot :name=\"`cell:${col.property}`\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"hasActionsSlot\" #actions=\"slotProps\">\n <slot name=\"actions\" v-bind=\"slotProps\" />\n </template>\n </DataCards>\n\n <DataPaginator\n v-if=\"pagination && showPaginator\"\n :settings=\"pagination\"\n :storage-key=\"id\"\n :handle-url=\"handleUrl\"\n @update:pagination=\"emit('pagination-change', $event)\"\n />\n\n <DataListOptions\n :open=\"showOptions\"\n :columns=\"config.columns\"\n :settings=\"settings ?? {}\"\n :storage-key=\"id\"\n :orderable=\"orderable\"\n @close=\"showOptions = false\"\n @change=\"onSettingsChange\"\n />\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-list.scss\"></style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"admins-components103.js","names":[],"sources":["../src/components/data-table/DataList.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type { PaginatorSettings } from '@/types/data-list'\nexport type { DataSearchProps } from './DataSearch.vue'\nexport type { DataFiltersProps } from './DataFilters.vue'\n\nexport interface DataListProps {\n config: DataListConfig\n items: Record<string, unknown>[]\n settings?: Partial<DataListSettings>\n id: string\n layoutBreakpoint?: number\n orderable?: boolean\n pagination?: PaginatorSettings\n loading?: boolean\n handleUrl?: boolean\n useSearch?: boolean\n useFilters?: boolean\n searchConfig?: DataSearchProps\n filterConfig?: DataFiltersProps\n fillHeight?: boolean\n}\n\nexport const dataListDefaults = {\n layoutBreakpoint: 768,\n orderable: true,\n loading: false,\n useSearch: true,\n useFilters: true,\n handleUrl: false,\n fillHeight: false,\n}\n\nexport function getDefaultFetchData(filters: FilterItem[], storageKey: string) {\n const defaultPaginator = getDefaultPaginator(storageKey)\n const defaultSort = getDefaultSort()\n const defaultSearch = getDefaultSearch()\n const defaultFilters = getDefaultFilterValues(filters, storageKey, true)\n\n return {\n ...defaultPaginator,\n ...defaultSort,\n ...defaultSearch,\n ...defaultFilters,\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onBeforeUnmount, useSlots } from 'vue'\nimport DataTable from '@/components/data-table/DataTable.vue'\nimport DataCards from '@/components/data-table/DataCards.vue'\nimport DataListOptions from '@/components/data-table/DataListOptions.vue'\nimport DataPaginator, { getDefaultPaginator } from '@/components/data-table/DataPaginator.vue'\nimport Button from '@/components/Button.vue'\nimport DataSort, { getDefaultSort, type DataSortOption } from '@/components/data-table/DataSort.vue'\nimport type {\n DataListConfig,\n DataListSettings,\n PageSettings,\n PaginatorSettings,\n} from '@/types/data-list'\nimport type { FilterValue } from '@/types/data-list'\nimport DataFilters, {\n type FilterResponse,\n type DataFiltersProps,\n type FilterItem,\n} from '@/components/data-table/DataFilters.vue'\nimport FilterTags from '@/components/data-table/FilterTags.vue'\nimport DataListGuide from '@/components/data-table/DataListGuide.vue'\nimport DataSearch, { getDefaultSearch, type DataSearchProps } from './DataSearch.vue'\nimport { getDefaultFilters, getDefaultFilterValues } from '@/utils/dataFilters.ts'\n\nconst dataFiltersRef = ref<InstanceType<typeof DataFilters> | null>(null)\nconst slots = useSlots()\nconst hasActionsSlot = computed(() => !!slots.actions)\n\nconst props = withDefaults(defineProps<DataListProps>(), {\n ...dataListDefaults,\n searchConfig: undefined,\n filterConfig: undefined,\n})\n\nfunction resolvedHandleUrl(side: 'searchConfig' | 'filterConfig'): boolean | undefined {\n const sideConfig = props[side]\n if (sideConfig && Object.hasOwn(sideConfig as object, 'handleUrl')) {\n return (sideConfig as { handleUrl?: boolean }).handleUrl\n }\n return props.handleUrl\n}\n\nconst mergedSearchConfig = computed<DataSearchProps>(() => ({\n ...props.searchConfig,\n handleUrl: resolvedHandleUrl('searchConfig'),\n}))\n\nconst mergedFilterConfig = computed<DataFiltersProps>(() => ({\n ...(props.filterConfig as DataFiltersProps),\n handleUrl: resolvedHandleUrl('filterConfig'),\n lazy:\n resolvedSettings.value != null\n ? !resolvedSettings.value.filtersEager\n : (props.filterConfig?.lazy ?? true),\n}))\n\nconst emit = defineEmits<{\n 'filter-change': [filters: Record<string, FilterValue>]\n 'selection-change': [selected: unknown[]]\n 'settings-change': [settings: DataListSettings]\n 'pagination-change': [pagination: PageSettings]\n 'sort-change': [sort: { key: string; direction: 'asc' | 'desc' } | null]\n 'search-change': [filters: Record<string, string | boolean>]\n}>()\n\nconst showOptions = ref(false)\nconst showGuide = ref(false)\nconst resolvedSettings = ref<DataListSettings | null>(null)\nconst isMobile = ref(false)\nconst root = ref<HTMLElement | null>(null)\nconst showFilters = ref(false)\n\nconst activeFilters = ref<Record<string, unknown>>(\n props.filterConfig?.items ? getDefaultFilters(props.filterConfig.items, props.id, false) : {},\n)\nlet resizeObserver: ResizeObserver | null = null\n\nonMounted(() => {\n resizeObserver = new ResizeObserver((entries) => {\n isMobile.value = (entries[0]?.contentRect.width ?? 0) < props.layoutBreakpoint\n })\n if (root.value) resizeObserver.observe(root.value)\n})\n\nonBeforeUnmount(() => resizeObserver?.disconnect())\n\nconst effectiveLayout = computed<'table' | 'cards'>(() => {\n const layout = resolvedSettings.value?.layout\n if (layout === 'table' || layout === 'cards') return layout\n return isMobile.value ? 'cards' : 'table'\n})\n\nconst internalConfig = computed<DataListConfig>(() => {\n if (!resolvedSettings.value) return props.config\n const order = resolvedSettings.value.columnOrder\n const mapped = props.config.columns.map((c) => ({\n ...c,\n visible: resolvedSettings.value!.columns[c.property] ?? c.visible !== false,\n }))\n if (order?.length) {\n mapped.sort((a, b) => {\n const ai = order.indexOf(a.property)\n const bi = order.indexOf(b.property)\n return (ai === -1 ? 999 : ai) - (bi === -1 ? 999 : bi)\n })\n }\n return { ...props.config, columns: mapped }\n})\n\nfunction onSettingsChange(s: DataListSettings) {\n resolvedSettings.value = s\n emit('settings-change', s)\n}\n\ndefineExpose({\n openOptions: () => (showOptions.value = true),\n closeOptions: () => (showOptions.value = false),\n openFilters: () => (showFilters.value = true),\n closeFilters: () => (showFilters.value = false),\n})\n\nasync function openFilter(key: string) {\n showFilters.value = true\n setTimeout(() => {\n dataFiltersRef.value?.focusFilter(key)\n }, 300)\n}\n\nfunction onFilterChange(response: FilterResponse) {\n activeFilters.value = response.values\n emit('filter-change', response.transformed)\n}\n\nconst activeFiltersCount = computed(\n () => Object.values(activeFilters.value).filter((v) => v != null && v !== '').length,\n)\n\nconst showPaginator = computed(\n () => !!props.pagination && (props.items.length > 0 || !props.loading),\n)\n\nconst searchChange = (value: Record<string, string | boolean>) => {\n emit('search-change', value)\n}\n\nconst sortableColumns = computed<DataSortOption[]>(() =>\n props.config.columns.filter((c) => c.sort).map((c) => ({ value: c.property, label: c.label })),\n)\n\nconst currentSort = ref<{ key: string; direction: 'asc' | 'desc' } | null>(\n props.handleUrl ? getDefaultSort() : null,\n)\n\nconst onSortChange = (sort: { key: string; direction: 'asc' | 'desc' } | null) => {\n currentSort.value = sort\n emit('sort-change', sort)\n}\n</script>\n\n<template>\n <div\n ref=\"root\"\n class=\"ac-component c-data-list\"\n :class=\"{ 'c-data-list--fill-height': fillHeight }\"\n >\n <div class=\"c-data-list__toolbar\">\n <DataSearch v-if=\"useSearch\" v-bind=\"mergedSearchConfig\" @search-change=\"searchChange\" />\n <Button\n v-if=\"useFilters && filterConfig?.items && filterConfig.items.length > 0\"\n label=\"Szűrők\"\n icon=\"fa-solid fa-filter\"\n @click=\"showFilters = true\"\n style=\"flex-shrink: 0\"\n :type=\"activeFiltersCount > 0 ? 'primary' : 'normal'\"\n :indicator=\"activeFiltersCount > 0 ? activeFiltersCount : undefined\"\n />\n <div\n class=\"flex-center gap-1 flex-center-wrap-on-mobile\"\n v-if=\"useFilters && filterConfig?.items && filterConfig.items.length > 0\"\n >\n <FilterTags\n :filters=\"activeFilters\"\n :items=\"filterConfig.items\"\n compact\n @remove=\"(key: string) => dataFiltersRef?.clearFilter(key)\"\n @openFilter=\"openFilter\"\n />\n </div>\n <div class=\"c-data-list__toolbar__right\">\n <DataSort\n v-if=\"sortableColumns.length > 0\"\n v-model=\"currentSort\"\n :options=\"sortableColumns\"\n :handle-url=\"handleUrl\"\n @sort-change=\"onSortChange\"\n />\n\n <Button\n icon=\"fa-solid fa-gear\"\n class=\"lh-normal settings-btn\"\n ariaLabel=\"Beállítások\"\n @click=\"showOptions = true\"\n />\n <Button\n icon=\"fa-solid fa-question\"\n class=\"lh-normal\"\n @click=\"showGuide = true\"\n ariaLabel=\"Súgó\"\n />\n </div>\n </div>\n <DataFilters\n ref=\"dataFiltersRef\"\n v-if=\"useFilters && filterConfig?.items && filterConfig.items.length > 0\"\n v-bind=\"mergedFilterConfig\"\n :storage-key=\"id\"\n :open=\"showFilters\"\n @close=\"showFilters = false\"\n @change=\"onFilterChange\"\n />\n <DataListGuide :open=\"showGuide\" @close=\"showGuide = false\" />\n <DataTable\n v-if=\"effectiveLayout === 'table'\"\n :config=\"internalConfig\"\n :loading=\"loading\"\n :items=\"items\"\n :settings=\"resolvedSettings ?? undefined\"\n :initial-sort=\"currentSort\"\n @filter-change=\"emit('filter-change', $event)\"\n @selection-change=\"emit('selection-change', $event)\"\n @sort-change=\"onSortChange\"\n >\n <template\n v-for=\"col in internalConfig.columns\"\n :key=\"col.property\"\n #[`cell:${col.property}`]=\"slotProps\"\n >\n <slot :name=\"`cell:${col.property}`\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"hasActionsSlot\" #actions=\"slotProps\">\n <slot name=\"actions\" v-bind=\"slotProps\" />\n </template>\n </DataTable>\n\n <DataCards\n v-else\n :config=\"internalConfig\"\n :loading=\"loading\"\n :items=\"items\"\n :settings=\"resolvedSettings ?? undefined\"\n @selection-change=\"emit('selection-change', $event)\"\n >\n <template\n v-for=\"col in internalConfig.columns\"\n :key=\"col.property\"\n #[`cell:${col.property}`]=\"slotProps\"\n >\n <slot :name=\"`cell:${col.property}`\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"hasActionsSlot\" #actions=\"slotProps\">\n <slot name=\"actions\" v-bind=\"slotProps\" />\n </template>\n </DataCards>\n\n <DataPaginator\n v-if=\"pagination && showPaginator\"\n :settings=\"pagination\"\n :storage-key=\"id\"\n :handle-url=\"handleUrl\"\n @update:pagination=\"emit('pagination-change', $event)\"\n />\n\n <DataListOptions\n :open=\"showOptions\"\n :columns=\"config.columns\"\n :settings=\"settings ?? {}\"\n :storage-key=\"id\"\n :orderable=\"orderable\"\n @close=\"showOptions = false\"\n @change=\"onSettingsChange\"\n />\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-list.scss\"></style>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components105.js","names":[],"sources":["../src/components/data-table/DataList.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type { PaginatorSettings } from '@/types/data-list'\nexport type { DataSearchProps } from './DataSearch.vue'\nexport type { DataFiltersProps } from './DataFilters.vue'\n\nexport interface DataListProps {\n config: DataListConfig\n items: Record<string, unknown>[]\n settings?: Partial<DataListSettings>\n id: string\n layoutBreakpoint?: number\n orderable?: boolean\n pagination?: PaginatorSettings\n loading?: boolean\n handleUrl?: boolean\n useSearch?: boolean\n useFilters?: boolean\n searchConfig?: DataSearchProps\n filterConfig?: DataFiltersProps\n fillHeight?: boolean\n}\n\nexport const dataListDefaults = {\n layoutBreakpoint: 768,\n orderable: true,\n loading: false,\n useSearch: true,\n useFilters: true,\n handleUrl: false,\n fillHeight: false,\n}\n\nexport function getDefaultFetchData(filters: FilterItem[], storageKey: string) {\n const defaultPaginator = getDefaultPaginator(storageKey)\n const defaultSort = getDefaultSort()\n const defaultSearch = getDefaultSearch()\n const defaultFilters = getDefaultFilterValues(filters, storageKey, true)\n\n return {\n ...defaultPaginator,\n ...defaultSort,\n ...defaultSearch,\n ...defaultFilters,\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onBeforeUnmount, useSlots } from 'vue'\nimport DataTable from '@/components/data-table/DataTable.vue'\nimport DataCards from '@/components/data-table/DataCards.vue'\nimport DataListOptions from '@/components/data-table/DataListOptions.vue'\nimport DataPaginator, { getDefaultPaginator } from '@/components/data-table/DataPaginator.vue'\nimport Button from '@/components/Button.vue'\nimport DataSort, { getDefaultSort, type DataSortOption } from '@/components/data-table/DataSort.vue'\nimport type {\n DataListConfig,\n DataListSettings,\n PageSettings,\n PaginatorSettings,\n} from '@/types/data-list'\nimport type { FilterValue } from '@/types/data-list'\nimport DataFilters, {\n type FilterResponse,\n type DataFiltersProps,\n type FilterItem,\n} from '@/components/data-table/DataFilters.vue'\nimport FilterTags from '@/components/data-table/FilterTags.vue'\nimport DataListGuide from '@/components/data-table/DataListGuide.vue'\nimport DataSearch, { getDefaultSearch, type DataSearchProps } from './DataSearch.vue'\nimport { getDefaultFilters, getDefaultFilterValues } from '@/utils/dataFilters.ts'\n\nconst dataFiltersRef = ref<InstanceType<typeof DataFilters> | null>(null)\nconst slots = useSlots()\nconst hasActionsSlot = computed(() => !!slots.actions)\n\nconst props = withDefaults(defineProps<DataListProps>(), {\n ...dataListDefaults,\n searchConfig: undefined,\n filterConfig: undefined,\n})\n\nfunction resolvedHandleUrl(side: 'searchConfig' | 'filterConfig'): boolean | undefined {\n const sideConfig = props[side]\n if (sideConfig && Object.hasOwn(sideConfig as object, 'handleUrl')) {\n return (sideConfig as { handleUrl?: boolean }).handleUrl\n }\n return props.handleUrl\n}\n\nconst mergedSearchConfig = computed<DataSearchProps>(() => ({\n ...props.searchConfig,\n handleUrl: resolvedHandleUrl('searchConfig'),\n}))\n\nconst mergedFilterConfig = computed<DataFiltersProps>(() => ({\n ...(props.filterConfig as DataFiltersProps),\n handleUrl: resolvedHandleUrl('filterConfig'),\n}))\n\nconst emit = defineEmits<{\n 'filter-change': [filters: Record<string, FilterValue>]\n 'selection-change': [selected: unknown[]]\n 'settings-change': [settings: DataListSettings]\n 'pagination-change': [pagination: PageSettings]\n 'sort-change': [sort: { key: string; direction: 'asc' | 'desc' } | null]\n 'search-change': [filters: Record<string, string | boolean>]\n}>()\n\nconst showOptions = ref(false)\nconst showGuide = ref(false)\nconst resolvedSettings = ref<DataListSettings | null>(null)\nconst isMobile = ref(false)\nconst root = ref<HTMLElement | null>(null)\nconst showFilters = ref(false)\n\nconst activeFilters = ref<Record<string, unknown>>(\n props.filterConfig?.items ? getDefaultFilters(props.filterConfig.items, props.id, false) : {},\n)\nlet resizeObserver: ResizeObserver | null = null\n\nonMounted(() => {\n resizeObserver = new ResizeObserver((entries) => {\n isMobile.value = (entries[0]?.contentRect.width ?? 0) < props.layoutBreakpoint\n })\n if (root.value) resizeObserver.observe(root.value)\n})\n\nonBeforeUnmount(() => resizeObserver?.disconnect())\n\nconst effectiveLayout = computed<'table' | 'cards'>(() => {\n const layout = resolvedSettings.value?.layout\n if (layout === 'table' || layout === 'cards') return layout\n return isMobile.value ? 'cards' : 'table'\n})\n\nconst internalConfig = computed<DataListConfig>(() => {\n if (!resolvedSettings.value) return props.config\n const order = resolvedSettings.value.columnOrder\n const mapped = props.config.columns.map((c) => ({\n ...c,\n visible: resolvedSettings.value!.columns[c.property] ?? c.visible !== false,\n }))\n if (order?.length) {\n mapped.sort((a, b) => {\n const ai = order.indexOf(a.property)\n const bi = order.indexOf(b.property)\n return (ai === -1 ? 999 : ai) - (bi === -1 ? 999 : bi)\n })\n }\n return { ...props.config, columns: mapped }\n})\n\nfunction onSettingsChange(s: DataListSettings) {\n resolvedSettings.value = s\n emit('settings-change', s)\n}\n\ndefineExpose({\n openOptions: () => (showOptions.value = true),\n closeOptions: () => (showOptions.value = false),\n openFilters: () => (showFilters.value = true),\n closeFilters: () => (showFilters.value = false),\n})\n\nasync function openFilter(key: string) {\n showFilters.value = true\n setTimeout(() => {\n dataFiltersRef.value?.focusFilter(key)\n }, 300)\n}\n\nfunction onFilterChange(response: FilterResponse) {\n activeFilters.value = response.values\n emit('filter-change', response.transformed)\n}\n\nconst activeFiltersCount = computed(\n () => Object.values(activeFilters.value).filter((v) => v != null && v !== '').length,\n)\n\nconst showPaginator = computed(\n () => !!props.pagination && (props.items.length > 0 || !props.loading),\n)\n\nconst searchChange = (value: Record<string, string | boolean>) => {\n emit('search-change', value)\n}\n\nconst sortableColumns = computed<DataSortOption[]>(() =>\n props.config.columns.filter((c) => c.sort).map((c) => ({ value: c.property, label: c.label })),\n)\n\nconst currentSort = ref<{ key: string; direction: 'asc' | 'desc' } | null>(\n props.handleUrl ? getDefaultSort() : null,\n)\n\nconst onSortChange = (sort: { key: string; direction: 'asc' | 'desc' } | null) => {\n currentSort.value = sort\n emit('sort-change', sort)\n}\n</script>\n\n<template>\n <div\n ref=\"root\"\n class=\"ac-component c-data-list\"\n :class=\"{ 'c-data-list--fill-height': fillHeight }\"\n >\n <div class=\"c-data-list__toolbar\">\n <DataSearch v-if=\"useSearch\" v-bind=\"mergedSearchConfig\" @search-change=\"searchChange\" />\n <Button\n v-if=\"useFilters && filterConfig?.items && filterConfig.items.length > 0\"\n label=\"Szűrők\"\n icon=\"fa-solid fa-filter\"\n @click=\"showFilters = true\"\n style=\"flex-shrink: 0\"\n :type=\"activeFiltersCount > 0 ? 'primary' : 'normal'\"\n :indicator=\"activeFiltersCount > 0 ? activeFiltersCount : undefined\"\n />\n <div\n class=\"flex-center gap-1 flex-center-wrap-on-mobile\"\n v-if=\"useFilters && filterConfig?.items && filterConfig.items.length > 0\"\n >\n <FilterTags\n :filters=\"activeFilters\"\n :items=\"filterConfig.items\"\n compact\n @remove=\"(key: string) => dataFiltersRef?.clearFilter(key)\"\n @openFilter=\"openFilter\"\n />\n </div>\n <div class=\"c-data-list__toolbar__right\">\n <DataSort\n v-if=\"sortableColumns.length > 0\"\n v-model=\"currentSort\"\n :options=\"sortableColumns\"\n :handle-url=\"handleUrl\"\n @sort-change=\"onSortChange\"\n />\n\n <Button\n icon=\"fa-solid fa-gear\"\n class=\"lh-normal settings-btn\"\n ariaLabel=\"Beállítások\"\n @click=\"showOptions = true\"\n />\n <Button\n icon=\"fa-solid fa-question\"\n class=\"lh-normal\"\n @click=\"showGuide = true\"\n ariaLabel=\"Súgó\"\n />\n </div>\n </div>\n <DataFilters\n ref=\"dataFiltersRef\"\n v-if=\"useFilters && filterConfig?.items && filterConfig.items.length > 0\"\n v-bind=\"mergedFilterConfig\"\n :storage-key=\"id\"\n :open=\"showFilters\"\n @close=\"showFilters = false\"\n @change=\"onFilterChange\"\n />\n <DataListGuide :open=\"showGuide\" @close=\"showGuide = false\" />\n <DataTable\n v-if=\"effectiveLayout === 'table'\"\n :config=\"internalConfig\"\n :loading=\"loading\"\n :items=\"items\"\n :settings=\"resolvedSettings ?? undefined\"\n :initial-sort=\"currentSort\"\n @filter-change=\"emit('filter-change', $event)\"\n @selection-change=\"emit('selection-change', $event)\"\n @sort-change=\"onSortChange\"\n >\n <template\n v-for=\"col in internalConfig.columns\"\n :key=\"col.property\"\n #[`cell:${col.property}`]=\"slotProps\"\n >\n <slot :name=\"`cell:${col.property}`\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"hasActionsSlot\" #actions=\"slotProps\">\n <slot name=\"actions\" v-bind=\"slotProps\" />\n </template>\n </DataTable>\n\n <DataCards\n v-else\n :config=\"internalConfig\"\n :loading=\"loading\"\n :items=\"items\"\n :settings=\"resolvedSettings ?? undefined\"\n @selection-change=\"emit('selection-change', $event)\"\n >\n <template\n v-for=\"col in internalConfig.columns\"\n :key=\"col.property\"\n #[`cell:${col.property}`]=\"slotProps\"\n >\n <slot :name=\"`cell:${col.property}`\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"hasActionsSlot\" #actions=\"slotProps\">\n <slot name=\"actions\" v-bind=\"slotProps\" />\n </template>\n </DataCards>\n\n <DataPaginator\n v-if=\"pagination && showPaginator\"\n :settings=\"pagination\"\n :storage-key=\"id\"\n :handle-url=\"handleUrl\"\n @update:pagination=\"emit('pagination-change', $event)\"\n />\n\n <DataListOptions\n :open=\"showOptions\"\n :columns=\"config.columns\"\n :settings=\"settings ?? {}\"\n :storage-key=\"id\"\n :orderable=\"orderable\"\n @close=\"showOptions = false\"\n @change=\"onSettingsChange\"\n />\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-list.scss\"></style>\n"],"mappings":""}
1
+ {"version":3,"file":"admins-components105.js","names":[],"sources":["../src/components/data-table/DataList.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type { PaginatorSettings } from '@/types/data-list'\nexport type { DataSearchProps } from './DataSearch.vue'\nexport type { DataFiltersProps } from './DataFilters.vue'\n\nexport interface DataListProps {\n config: DataListConfig\n items: Record<string, unknown>[]\n settings?: Partial<DataListSettings>\n id: string\n layoutBreakpoint?: number\n orderable?: boolean\n pagination?: PaginatorSettings\n loading?: boolean\n handleUrl?: boolean\n useSearch?: boolean\n useFilters?: boolean\n searchConfig?: DataSearchProps\n filterConfig?: DataFiltersProps\n fillHeight?: boolean\n}\n\nexport const dataListDefaults = {\n layoutBreakpoint: 768,\n orderable: true,\n loading: false,\n useSearch: true,\n useFilters: true,\n handleUrl: false,\n fillHeight: false,\n}\n\nexport function getDefaultFetchData(filters: FilterItem[], storageKey: string) {\n const defaultPaginator = getDefaultPaginator(storageKey)\n const defaultSort = getDefaultSort()\n const defaultSearch = getDefaultSearch()\n const defaultFilters = getDefaultFilterValues(filters, storageKey, true)\n\n return {\n ...defaultPaginator,\n ...defaultSort,\n ...defaultSearch,\n ...defaultFilters,\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onBeforeUnmount, useSlots } from 'vue'\nimport DataTable from '@/components/data-table/DataTable.vue'\nimport DataCards from '@/components/data-table/DataCards.vue'\nimport DataListOptions from '@/components/data-table/DataListOptions.vue'\nimport DataPaginator, { getDefaultPaginator } from '@/components/data-table/DataPaginator.vue'\nimport Button from '@/components/Button.vue'\nimport DataSort, { getDefaultSort, type DataSortOption } from '@/components/data-table/DataSort.vue'\nimport type {\n DataListConfig,\n DataListSettings,\n PageSettings,\n PaginatorSettings,\n} from '@/types/data-list'\nimport type { FilterValue } from '@/types/data-list'\nimport DataFilters, {\n type FilterResponse,\n type DataFiltersProps,\n type FilterItem,\n} from '@/components/data-table/DataFilters.vue'\nimport FilterTags from '@/components/data-table/FilterTags.vue'\nimport DataListGuide from '@/components/data-table/DataListGuide.vue'\nimport DataSearch, { getDefaultSearch, type DataSearchProps } from './DataSearch.vue'\nimport { getDefaultFilters, getDefaultFilterValues } from '@/utils/dataFilters.ts'\n\nconst dataFiltersRef = ref<InstanceType<typeof DataFilters> | null>(null)\nconst slots = useSlots()\nconst hasActionsSlot = computed(() => !!slots.actions)\n\nconst props = withDefaults(defineProps<DataListProps>(), {\n ...dataListDefaults,\n searchConfig: undefined,\n filterConfig: undefined,\n})\n\nfunction resolvedHandleUrl(side: 'searchConfig' | 'filterConfig'): boolean | undefined {\n const sideConfig = props[side]\n if (sideConfig && Object.hasOwn(sideConfig as object, 'handleUrl')) {\n return (sideConfig as { handleUrl?: boolean }).handleUrl\n }\n return props.handleUrl\n}\n\nconst mergedSearchConfig = computed<DataSearchProps>(() => ({\n ...props.searchConfig,\n handleUrl: resolvedHandleUrl('searchConfig'),\n}))\n\nconst mergedFilterConfig = computed<DataFiltersProps>(() => ({\n ...(props.filterConfig as DataFiltersProps),\n handleUrl: resolvedHandleUrl('filterConfig'),\n lazy:\n resolvedSettings.value != null\n ? !resolvedSettings.value.filtersEager\n : (props.filterConfig?.lazy ?? true),\n}))\n\nconst emit = defineEmits<{\n 'filter-change': [filters: Record<string, FilterValue>]\n 'selection-change': [selected: unknown[]]\n 'settings-change': [settings: DataListSettings]\n 'pagination-change': [pagination: PageSettings]\n 'sort-change': [sort: { key: string; direction: 'asc' | 'desc' } | null]\n 'search-change': [filters: Record<string, string | boolean>]\n}>()\n\nconst showOptions = ref(false)\nconst showGuide = ref(false)\nconst resolvedSettings = ref<DataListSettings | null>(null)\nconst isMobile = ref(false)\nconst root = ref<HTMLElement | null>(null)\nconst showFilters = ref(false)\n\nconst activeFilters = ref<Record<string, unknown>>(\n props.filterConfig?.items ? getDefaultFilters(props.filterConfig.items, props.id, false) : {},\n)\nlet resizeObserver: ResizeObserver | null = null\n\nonMounted(() => {\n resizeObserver = new ResizeObserver((entries) => {\n isMobile.value = (entries[0]?.contentRect.width ?? 0) < props.layoutBreakpoint\n })\n if (root.value) resizeObserver.observe(root.value)\n})\n\nonBeforeUnmount(() => resizeObserver?.disconnect())\n\nconst effectiveLayout = computed<'table' | 'cards'>(() => {\n const layout = resolvedSettings.value?.layout\n if (layout === 'table' || layout === 'cards') return layout\n return isMobile.value ? 'cards' : 'table'\n})\n\nconst internalConfig = computed<DataListConfig>(() => {\n if (!resolvedSettings.value) return props.config\n const order = resolvedSettings.value.columnOrder\n const mapped = props.config.columns.map((c) => ({\n ...c,\n visible: resolvedSettings.value!.columns[c.property] ?? c.visible !== false,\n }))\n if (order?.length) {\n mapped.sort((a, b) => {\n const ai = order.indexOf(a.property)\n const bi = order.indexOf(b.property)\n return (ai === -1 ? 999 : ai) - (bi === -1 ? 999 : bi)\n })\n }\n return { ...props.config, columns: mapped }\n})\n\nfunction onSettingsChange(s: DataListSettings) {\n resolvedSettings.value = s\n emit('settings-change', s)\n}\n\ndefineExpose({\n openOptions: () => (showOptions.value = true),\n closeOptions: () => (showOptions.value = false),\n openFilters: () => (showFilters.value = true),\n closeFilters: () => (showFilters.value = false),\n})\n\nasync function openFilter(key: string) {\n showFilters.value = true\n setTimeout(() => {\n dataFiltersRef.value?.focusFilter(key)\n }, 300)\n}\n\nfunction onFilterChange(response: FilterResponse) {\n activeFilters.value = response.values\n emit('filter-change', response.transformed)\n}\n\nconst activeFiltersCount = computed(\n () => Object.values(activeFilters.value).filter((v) => v != null && v !== '').length,\n)\n\nconst showPaginator = computed(\n () => !!props.pagination && (props.items.length > 0 || !props.loading),\n)\n\nconst searchChange = (value: Record<string, string | boolean>) => {\n emit('search-change', value)\n}\n\nconst sortableColumns = computed<DataSortOption[]>(() =>\n props.config.columns.filter((c) => c.sort).map((c) => ({ value: c.property, label: c.label })),\n)\n\nconst currentSort = ref<{ key: string; direction: 'asc' | 'desc' } | null>(\n props.handleUrl ? getDefaultSort() : null,\n)\n\nconst onSortChange = (sort: { key: string; direction: 'asc' | 'desc' } | null) => {\n currentSort.value = sort\n emit('sort-change', sort)\n}\n</script>\n\n<template>\n <div\n ref=\"root\"\n class=\"ac-component c-data-list\"\n :class=\"{ 'c-data-list--fill-height': fillHeight }\"\n >\n <div class=\"c-data-list__toolbar\">\n <DataSearch v-if=\"useSearch\" v-bind=\"mergedSearchConfig\" @search-change=\"searchChange\" />\n <Button\n v-if=\"useFilters && filterConfig?.items && filterConfig.items.length > 0\"\n label=\"Szűrők\"\n icon=\"fa-solid fa-filter\"\n @click=\"showFilters = true\"\n style=\"flex-shrink: 0\"\n :type=\"activeFiltersCount > 0 ? 'primary' : 'normal'\"\n :indicator=\"activeFiltersCount > 0 ? activeFiltersCount : undefined\"\n />\n <div\n class=\"flex-center gap-1 flex-center-wrap-on-mobile\"\n v-if=\"useFilters && filterConfig?.items && filterConfig.items.length > 0\"\n >\n <FilterTags\n :filters=\"activeFilters\"\n :items=\"filterConfig.items\"\n compact\n @remove=\"(key: string) => dataFiltersRef?.clearFilter(key)\"\n @openFilter=\"openFilter\"\n />\n </div>\n <div class=\"c-data-list__toolbar__right\">\n <DataSort\n v-if=\"sortableColumns.length > 0\"\n v-model=\"currentSort\"\n :options=\"sortableColumns\"\n :handle-url=\"handleUrl\"\n @sort-change=\"onSortChange\"\n />\n\n <Button\n icon=\"fa-solid fa-gear\"\n class=\"lh-normal settings-btn\"\n ariaLabel=\"Beállítások\"\n @click=\"showOptions = true\"\n />\n <Button\n icon=\"fa-solid fa-question\"\n class=\"lh-normal\"\n @click=\"showGuide = true\"\n ariaLabel=\"Súgó\"\n />\n </div>\n </div>\n <DataFilters\n ref=\"dataFiltersRef\"\n v-if=\"useFilters && filterConfig?.items && filterConfig.items.length > 0\"\n v-bind=\"mergedFilterConfig\"\n :storage-key=\"id\"\n :open=\"showFilters\"\n @close=\"showFilters = false\"\n @change=\"onFilterChange\"\n />\n <DataListGuide :open=\"showGuide\" @close=\"showGuide = false\" />\n <DataTable\n v-if=\"effectiveLayout === 'table'\"\n :config=\"internalConfig\"\n :loading=\"loading\"\n :items=\"items\"\n :settings=\"resolvedSettings ?? undefined\"\n :initial-sort=\"currentSort\"\n @filter-change=\"emit('filter-change', $event)\"\n @selection-change=\"emit('selection-change', $event)\"\n @sort-change=\"onSortChange\"\n >\n <template\n v-for=\"col in internalConfig.columns\"\n :key=\"col.property\"\n #[`cell:${col.property}`]=\"slotProps\"\n >\n <slot :name=\"`cell:${col.property}`\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"hasActionsSlot\" #actions=\"slotProps\">\n <slot name=\"actions\" v-bind=\"slotProps\" />\n </template>\n </DataTable>\n\n <DataCards\n v-else\n :config=\"internalConfig\"\n :loading=\"loading\"\n :items=\"items\"\n :settings=\"resolvedSettings ?? undefined\"\n @selection-change=\"emit('selection-change', $event)\"\n >\n <template\n v-for=\"col in internalConfig.columns\"\n :key=\"col.property\"\n #[`cell:${col.property}`]=\"slotProps\"\n >\n <slot :name=\"`cell:${col.property}`\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"hasActionsSlot\" #actions=\"slotProps\">\n <slot name=\"actions\" v-bind=\"slotProps\" />\n </template>\n </DataCards>\n\n <DataPaginator\n v-if=\"pagination && showPaginator\"\n :settings=\"pagination\"\n :storage-key=\"id\"\n :handle-url=\"handleUrl\"\n @update:pagination=\"emit('pagination-change', $event)\"\n />\n\n <DataListOptions\n :open=\"showOptions\"\n :columns=\"config.columns\"\n :settings=\"settings ?? {}\"\n :storage-key=\"id\"\n :orderable=\"orderable\"\n @close=\"showOptions = false\"\n @change=\"onSettingsChange\"\n />\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-list.scss\"></style>\n"],"mappings":""}
@@ -8,7 +8,8 @@ var h = { class: "ac-component c-input-wrapper" }, g = ["for"], _ = {
8
8
  clearable: !0,
9
9
  autocomplete: !0,
10
10
  labelOnBorder: void 0,
11
- size: "normal"
11
+ size: "normal",
12
+ debounce: 300
12
13
  }, v = /*@__PURE__*/ o({
13
14
  __name: "TextInput",
14
15
  props: /*@__PURE__*/ s({
@@ -22,7 +23,8 @@ var h = { class: "ac-component c-input-wrapper" }, g = ["for"], _ = {
22
23
  autocomplete: { type: Boolean },
23
24
  size: {},
24
25
  id: {},
25
- inputClass: {}
26
+ inputClass: {},
27
+ debounce: {}
26
28
  }, _),
27
29
  emits: ["update:modelValue"],
28
30
  setup(o, { emit: s }) {
@@ -34,14 +36,20 @@ var h = { class: "ac-component c-input-wrapper" }, g = ["for"], _ = {
34
36
  e !== b.value && (b.value = e);
35
37
  });
36
38
  let S = t(() => !!_.labelOnBorder && _.labelOnBorder.trim() !== ""), C = t(() => S.value && x.value || _.label);
37
- function w(e) {
38
- let t = e.target.value;
39
- b.value = t, T(t);
39
+ function w(t) {
40
+ return e((e) => {
41
+ v("update:modelValue", _.type === "number" ? e === "" ? null : Number(e) : e);
42
+ }, t);
40
43
  }
41
- let T = e((e) => {
42
- v("update:modelValue", _.type === "number" ? e === "" ? null : Number(e) : e);
44
+ let T = u(w(_.debounce));
45
+ m(() => _.debounce, (e) => {
46
+ T.value = w(e);
43
47
  });
44
- function E() {
48
+ function E(e) {
49
+ let t = e.target.value;
50
+ b.value = t, T.value(t);
51
+ }
52
+ function D() {
45
53
  let e = _.type === "number" ? null : "";
46
54
  b.value = e, v("update:modelValue", e);
47
55
  }
@@ -68,7 +76,7 @@ var h = { class: "ac-component c-input-wrapper" }, g = ["for"], _ = {
68
76
  disabled: o.disabled,
69
77
  inputmode: o.type === "number" ? "decimal" : void 0,
70
78
  autocomplete: o.autocomplete ? "on" : "off",
71
- onInput: w
79
+ onInput: E
72
80
  }, null, 40, [
73
81
  "id",
74
82
  "type",
@@ -83,7 +91,7 @@ var h = { class: "ac-component c-input-wrapper" }, g = ["for"], _ = {
83
91
  type: "button",
84
92
  class: c(["c-icon-btn c-icon-btn--clear", { "c-icon-btn--hidden": !x.value }]),
85
93
  "aria-label": "Mező törlése",
86
- onClick: E
94
+ onClick: D
87
95
  }, [...t[0] ||= [a("i", { class: "fa-solid fa-fw fa-xmark" }, null, -1)]], 2)) : r("", !0)], 2)]));
88
96
  }
89
97
  });
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components16.js","names":[],"sources":["../src/components/TextInput.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ControlSize } from '@/types/types'\nimport { debounce } from '@/utils/debounce'\n\nexport type TextInputType = 'text' | 'number' | 'textarea'\nexport interface TextInputProps {\n modelValue?: string | number | null\n type?: TextInputType\n label?: string\n labelOnBorder?: string\n placeholder?: string\n disabled?: boolean\n clearable?: boolean\n autocomplete?: boolean\n size?: ControlSize\n id?: string\n inputClass?: string\n}\n\nexport const textInputDefaults = {\n modelValue: undefined,\n type: 'text',\n disabled: false,\n clearable: true,\n autocomplete: true,\n labelOnBorder: undefined,\n size: 'normal' as ControlSize,\n} as TextInputProps\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref, useId, watch } from 'vue'\n\nconst props = withDefaults(defineProps<TextInputProps>(), textInputDefaults)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null]\n}>()\n\nconst inputId = computed(() => props.id ?? `c-input-${useId()}`)\n\nconst localValue = ref<string | number | null | undefined>(props.modelValue)\n\nconst hasValue = computed(() => {\n const v = localValue.value\n return v !== null && v !== undefined && String(v) !== ''\n})\n\nwatch(\n () => props.modelValue,\n (val) => {\n if (val === localValue.value) return\n localValue.value = val\n },\n)\n\nconst hasLabelOnBorder = computed(() => !!props.labelOnBorder && props.labelOnBorder.trim() !== '')\n\nconst borderLabelVisible = computed(() => (hasLabelOnBorder.value && hasValue.value) || props.label)\n\nfunction onInput(e: Event) {\n const raw = (e.target as HTMLInputElement).value\n localValue.value = raw\n debouncedEmit(raw)\n}\n\nconst debouncedEmit = debounce((raw: string) => {\n emit('update:modelValue', props.type === 'number' ? (raw === '' ? null : Number(raw)) : raw)\n})\n\nfunction clear() {\n const next = props.type === 'number' ? null : ''\n localValue.value = next\n emit('update:modelValue', next)\n}\n</script>\n\n<template>\n <div class=\"ac-component c-input-wrapper\">\n <label\n v-if=\"hasLabelOnBorder || label\"\n class=\"c-label pointer\"\n :class=\"{\n 'c-label--on-border': hasLabelOnBorder,\n hide: !borderLabelVisible,\n }\"\n :for=\"inputId\"\n >\n {{ hasLabelOnBorder ? labelOnBorder : label }}\n </label>\n <div\n class=\"c-input-row\"\n :class=\"{\n 'c-input-row--sm': size === 'small',\n 'c-input-row--lg': size === 'large',\n 'c-input-row--disabled': disabled,\n }\"\n >\n <component\n :is=\"type === 'textarea' ? 'textarea' : 'input'\"\n :id=\"inputId\"\n :type=\"type\"\n class=\"c-input\"\n :class=\"[\n {\n 'c-textarea': type === 'textarea',\n 'c-input--disabled': disabled,\n },\n inputClass,\n ]\"\n :value=\"localValue == null ? '' : String(localValue)\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :inputmode=\"type === 'number' ? 'decimal' : undefined\"\n :autocomplete=\"autocomplete ? 'on' : 'off'\"\n @input=\"onInput\"\n />\n <button\n v-if=\"clearable && !disabled\"\n type=\"button\"\n class=\"c-icon-btn c-icon-btn--clear\"\n :class=\"{ 'c-icon-btn--hidden': !hasValue }\"\n aria-label=\"Mező törlése\"\n @click=\"clear\"\n >\n <i class=\"fa-solid fa-fw fa-xmark\"></i>\n </button>\n </div>\n </div>\n</template>\n"],"mappings":";;;gEAmBa,IAAoB;CAC/B,YAAY,KAAA;CACZ,MAAM;CACN,UAAU;CACV,WAAW;CACX,cAAc;CACd,eAAe,KAAA;CACf,MAAM;AACR;;;;;;;;;;;;;;;;;EAMA,IAAM,IAAQ,GAER,IAAO,GAIP,IAAU,QAAe,EAAM,MAAM,WAAW,EAAM,GAAG,GAEzD,IAAa,EAAwC,EAAM,UAAU,GAErE,IAAW,QAAe;GAC9B,IAAM,IAAI,EAAW;GACrB,OAAO,KAAM,QAA2B,OAAO,CAAC,MAAM;EACxD,CAAC;EAED,QACQ,EAAM,aACX,MAAQ;GACH,MAAQ,EAAW,UACvB,EAAW,QAAQ;EACrB,CACF;EAEA,IAAM,IAAmB,QAAe,CAAC,CAAC,EAAM,iBAAiB,EAAM,cAAc,KAAK,MAAM,EAAE,GAE5F,IAAqB,QAAgB,EAAiB,SAAS,EAAS,SAAU,EAAM,KAAK;EAEnG,SAAS,EAAQ,GAAU;GACzB,IAAM,IAAO,EAAE,OAA4B;GAE3C,AADA,EAAW,QAAQ,GACnB,EAAc,CAAG;EACnB;EAEA,IAAM,IAAgB,GAAU,MAAgB;GAC9C,EAAK,qBAAqB,EAAM,SAAS,WAAY,MAAQ,KAAK,OAAO,OAAO,CAAG,IAAK,CAAG;EAC7F,CAAC;EAED,SAAS,IAAQ;GACf,IAAM,IAAO,EAAM,SAAS,WAAW,OAAO;GAE9C,AADA,EAAW,QAAQ,GACnB,EAAK,qBAAqB,CAAI;EAChC;oBAIE,EAAA,GAAA,EAkDM,OAlDN,GAkDM,CAhDI,EAAA,SAAoB,EAAA,SAD5B,EAAA,GAAA,EAUQ,SAAA;;GARN,OAAK,EAAA,CAAC,mBAAiB;IACiB,sBAAA,EAAA;IAAiC,MAAA,CAAA,EAAA;;GAIxE,KAAK,EAAA;EAEH,GAAA,EAAA,EAAA,QAAmB,EAAA,gBAAgB,EAAA,KAAK,GAAA,IAAA,CAAA,KAAA,EAAA,IAAA,EAAA,GAE7C,EAqCM,OAAA,EApCJ,OAAK,EAAA,CAAC,eAAa;GACkB,mBAAA,EAAA,SAAI;GAAyC,mBAAA,EAAA,SAAI;GAA+C,yBAAA,EAAA;EAMrI,CAAA,CAAA,EAAA,GAAA,EAAA,EAAA,GAAA,EAkBE,EAjBK,EAAA,SAAI,aAAA,aAAA,OAAA,GAAA;GACR,IAAI,EAAA;GACJ,MAAM,EAAA;GACP,OAAK,EAAA,CAAC,WAAS,CAAA;IACiC,cAAA,EAAA,SAAI;IAAkD,qBAAA,EAAA;GAAiC,GAAA,EAAA,UAAA,CAAA,CAAA;GAOtI,OAAO,EAAA,SAAU,OAAA,KAAgB,OAAO,EAAA,KAAU;GAClD,aAAa,EAAA;GACb,UAAU,EAAA;GACV,WAAW,EAAA,SAAI,WAAA,YAA4B,KAAA;GAC3C,cAAc,EAAA,eAAY,OAAA;GACnB;;;;;;;;;;EAGF,CAAA,IAAA,EAAA,aAAS,CAAK,EAAA,YADtB,EAAA,GAAA,EASS,UAAA;;GAPP,MAAK;GACL,OAAK,EAAA,CAAC,gCAA8B,EAAA,sBAAA,CACH,EAAA,MAAQ,CAAA,CAAA;GACzC,cAAW;GACV,SAAO;EAER,GAAA,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAuC,KAAA,EAApC,OAAM,0BAAyB,GAAA,MAAA,EAAA,CAAA,CAAA,GAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,GAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"admins-components16.js","names":[],"sources":["../src/components/TextInput.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ControlSize } from '@/types/types'\nimport { debounce } from '@/utils/debounce'\n\nexport type TextInputType = 'text' | 'number' | 'textarea'\nexport interface TextInputProps {\n modelValue?: string | number | null\n type?: TextInputType\n label?: string\n labelOnBorder?: string\n placeholder?: string\n disabled?: boolean\n clearable?: boolean\n autocomplete?: boolean\n size?: ControlSize\n id?: string\n inputClass?: string\n /**\n * Delay (in milliseconds) before the `update:modelValue` event is\n * emitted after the last keystroke. Useful for throttling expensive\n * downstream work like filtering or server-side lookups. Defaults\n * to 300ms.\n */\n debounce?: number\n}\n\nexport const textInputDefaults = {\n modelValue: undefined,\n type: 'text',\n disabled: false,\n clearable: true,\n autocomplete: true,\n labelOnBorder: undefined,\n size: 'normal' as ControlSize,\n debounce: 300,\n} as TextInputProps\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref, useId, watch } from 'vue'\n\nconst props = withDefaults(defineProps<TextInputProps>(), textInputDefaults)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null]\n}>()\n\nconst inputId = computed(() => props.id ?? `c-input-${useId()}`)\n\nconst localValue = ref<string | number | null | undefined>(props.modelValue)\n\nconst hasValue = computed(() => {\n const v = localValue.value\n return v !== null && v !== undefined && String(v) !== ''\n})\n\nwatch(\n () => props.modelValue,\n (val) => {\n if (val === localValue.value) return\n localValue.value = val\n },\n)\n\nconst hasLabelOnBorder = computed(() => !!props.labelOnBorder && props.labelOnBorder.trim() !== '')\n\nconst borderLabelVisible = computed(() => (hasLabelOnBorder.value && hasValue.value) || props.label)\n\n// `debouncedEmit` is recreated whenever `props.debounce` changes so a\n// caller can adjust the throttling at runtime. We keep the latest\n// function in a ref so `onInput` can invoke the current version.\nfunction makeDebouncedEmit(delay: number) {\n return debounce((raw: string) => {\n emit('update:modelValue', props.type === 'number' ? (raw === '' ? null : Number(raw)) : raw)\n }, delay)\n}\n\nconst debouncedEmit = ref(makeDebouncedEmit(props.debounce))\n\nwatch(\n () => props.debounce,\n (delay) => {\n debouncedEmit.value = makeDebouncedEmit(delay)\n },\n)\n\nfunction onInput(e: Event) {\n const raw = (e.target as HTMLInputElement).value\n localValue.value = raw\n debouncedEmit.value(raw)\n}\n\nfunction clear() {\n const next = props.type === 'number' ? null : ''\n localValue.value = next\n emit('update:modelValue', next)\n}\n</script>\n\n<template>\n <div class=\"ac-component c-input-wrapper\">\n <label\n v-if=\"hasLabelOnBorder || label\"\n class=\"c-label pointer\"\n :class=\"{\n 'c-label--on-border': hasLabelOnBorder,\n hide: !borderLabelVisible,\n }\"\n :for=\"inputId\"\n >\n {{ hasLabelOnBorder ? labelOnBorder : label }}\n </label>\n <div\n class=\"c-input-row\"\n :class=\"{\n 'c-input-row--sm': size === 'small',\n 'c-input-row--lg': size === 'large',\n 'c-input-row--disabled': disabled,\n }\"\n >\n <component\n :is=\"type === 'textarea' ? 'textarea' : 'input'\"\n :id=\"inputId\"\n :type=\"type\"\n class=\"c-input\"\n :class=\"[\n {\n 'c-textarea': type === 'textarea',\n 'c-input--disabled': disabled,\n },\n inputClass,\n ]\"\n :value=\"localValue == null ? '' : String(localValue)\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :inputmode=\"type === 'number' ? 'decimal' : undefined\"\n :autocomplete=\"autocomplete ? 'on' : 'off'\"\n @input=\"onInput\"\n />\n <button\n v-if=\"clearable && !disabled\"\n type=\"button\"\n class=\"c-icon-btn c-icon-btn--clear\"\n :class=\"{ 'c-icon-btn--hidden': !hasValue }\"\n aria-label=\"Mező törlése\"\n @click=\"clear\"\n >\n <i class=\"fa-solid fa-fw fa-xmark\"></i>\n </button>\n </div>\n </div>\n</template>\n"],"mappings":";;;gEA0Ba,IAAoB;CAC/B,YAAY,KAAA;CACZ,MAAM;CACN,UAAU;CACV,WAAW;CACX,cAAc;CACd,eAAe,KAAA;CACf,MAAM;CACN,UAAU;AACZ;;;;;;;;;;;;;;;;;;EAMA,IAAM,IAAQ,GAER,IAAO,GAIP,IAAU,QAAe,EAAM,MAAM,WAAW,EAAM,GAAG,GAEzD,IAAa,EAAwC,EAAM,UAAU,GAErE,IAAW,QAAe;GAC9B,IAAM,IAAI,EAAW;GACrB,OAAO,KAAM,QAA2B,OAAO,CAAC,MAAM;EACxD,CAAC;EAED,QACQ,EAAM,aACX,MAAQ;GACH,MAAQ,EAAW,UACvB,EAAW,QAAQ;EACrB,CACF;EAEA,IAAM,IAAmB,QAAe,CAAC,CAAC,EAAM,iBAAiB,EAAM,cAAc,KAAK,MAAM,EAAE,GAE5F,IAAqB,QAAgB,EAAiB,SAAS,EAAS,SAAU,EAAM,KAAK;EAKnG,SAAS,EAAkB,GAAe;GACxC,OAAO,GAAU,MAAgB;IAC/B,EAAK,qBAAqB,EAAM,SAAS,WAAY,MAAQ,KAAK,OAAO,OAAO,CAAG,IAAK,CAAG;GAC7F,GAAG,CAAK;EACV;EAEA,IAAM,IAAgB,EAAI,EAAkB,EAAM,QAAQ,CAAC;EAE3D,QACQ,EAAM,WACX,MAAU;GACT,EAAc,QAAQ,EAAkB,CAAK;EAC/C,CACF;EAEA,SAAS,EAAQ,GAAU;GACzB,IAAM,IAAO,EAAE,OAA4B;GAE3C,AADA,EAAW,QAAQ,GACnB,EAAc,MAAM,CAAG;EACzB;EAEA,SAAS,IAAQ;GACf,IAAM,IAAO,EAAM,SAAS,WAAW,OAAO;GAE9C,AADA,EAAW,QAAQ,GACnB,EAAK,qBAAqB,CAAI;EAChC;oBAIE,EAAA,GAAA,EAkDM,OAlDN,GAkDM,CAhDI,EAAA,SAAoB,EAAA,SAD5B,EAAA,GAAA,EAUQ,SAAA;;GARN,OAAK,EAAA,CAAC,mBAAiB;IACiB,sBAAA,EAAA;IAAiC,MAAA,CAAA,EAAA;;GAIxE,KAAK,EAAA;EAEH,GAAA,EAAA,EAAA,QAAmB,EAAA,gBAAgB,EAAA,KAAK,GAAA,IAAA,CAAA,KAAA,EAAA,IAAA,EAAA,GAE7C,EAqCM,OAAA,EApCJ,OAAK,EAAA,CAAC,eAAa;GACkB,mBAAA,EAAA,SAAI;GAAyC,mBAAA,EAAA,SAAI;GAA+C,yBAAA,EAAA;EAMrI,CAAA,CAAA,EAAA,GAAA,EAAA,EAAA,GAAA,EAkBE,EAjBK,EAAA,SAAI,aAAA,aAAA,OAAA,GAAA;GACR,IAAI,EAAA;GACJ,MAAM,EAAA;GACP,OAAK,EAAA,CAAC,WAAS,CAAA;IACiC,cAAA,EAAA,SAAI;IAAkD,qBAAA,EAAA;GAAiC,GAAA,EAAA,UAAA,CAAA,CAAA;GAOtI,OAAO,EAAA,SAAU,OAAA,KAAgB,OAAO,EAAA,KAAU;GAClD,aAAa,EAAA;GACb,UAAU,EAAA;GACV,WAAW,EAAA,SAAI,WAAA,YAA4B,KAAA;GAC3C,cAAc,EAAA,eAAY,OAAA;GACnB;;;;;;;;;;EAGF,CAAA,IAAA,EAAA,aAAS,CAAK,EAAA,YADtB,EAAA,GAAA,EASS,UAAA;;GAPP,MAAK;GACL,OAAK,EAAA,CAAC,gCAA8B,EAAA,sBAAA,CACH,EAAA,MAAQ,CAAA,CAAA;GACzC,cAAW;GACV,SAAO;EAER,GAAA,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAuC,KAAA,EAApC,OAAM,0BAAyB,GAAA,MAAA,EAAA,CAAA,CAAA,GAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,GAAA,CAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components17.js","names":[],"sources":["../src/components/TextInput.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ControlSize } from '@/types/types'\nimport { debounce } from '@/utils/debounce'\n\nexport type TextInputType = 'text' | 'number' | 'textarea'\nexport interface TextInputProps {\n modelValue?: string | number | null\n type?: TextInputType\n label?: string\n labelOnBorder?: string\n placeholder?: string\n disabled?: boolean\n clearable?: boolean\n autocomplete?: boolean\n size?: ControlSize\n id?: string\n inputClass?: string\n}\n\nexport const textInputDefaults = {\n modelValue: undefined,\n type: 'text',\n disabled: false,\n clearable: true,\n autocomplete: true,\n labelOnBorder: undefined,\n size: 'normal' as ControlSize,\n} as TextInputProps\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref, useId, watch } from 'vue'\n\nconst props = withDefaults(defineProps<TextInputProps>(), textInputDefaults)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null]\n}>()\n\nconst inputId = computed(() => props.id ?? `c-input-${useId()}`)\n\nconst localValue = ref<string | number | null | undefined>(props.modelValue)\n\nconst hasValue = computed(() => {\n const v = localValue.value\n return v !== null && v !== undefined && String(v) !== ''\n})\n\nwatch(\n () => props.modelValue,\n (val) => {\n if (val === localValue.value) return\n localValue.value = val\n },\n)\n\nconst hasLabelOnBorder = computed(() => !!props.labelOnBorder && props.labelOnBorder.trim() !== '')\n\nconst borderLabelVisible = computed(() => (hasLabelOnBorder.value && hasValue.value) || props.label)\n\nfunction onInput(e: Event) {\n const raw = (e.target as HTMLInputElement).value\n localValue.value = raw\n debouncedEmit(raw)\n}\n\nconst debouncedEmit = debounce((raw: string) => {\n emit('update:modelValue', props.type === 'number' ? (raw === '' ? null : Number(raw)) : raw)\n})\n\nfunction clear() {\n const next = props.type === 'number' ? null : ''\n localValue.value = next\n emit('update:modelValue', next)\n}\n</script>\n\n<template>\n <div class=\"ac-component c-input-wrapper\">\n <label\n v-if=\"hasLabelOnBorder || label\"\n class=\"c-label pointer\"\n :class=\"{\n 'c-label--on-border': hasLabelOnBorder,\n hide: !borderLabelVisible,\n }\"\n :for=\"inputId\"\n >\n {{ hasLabelOnBorder ? labelOnBorder : label }}\n </label>\n <div\n class=\"c-input-row\"\n :class=\"{\n 'c-input-row--sm': size === 'small',\n 'c-input-row--lg': size === 'large',\n 'c-input-row--disabled': disabled,\n }\"\n >\n <component\n :is=\"type === 'textarea' ? 'textarea' : 'input'\"\n :id=\"inputId\"\n :type=\"type\"\n class=\"c-input\"\n :class=\"[\n {\n 'c-textarea': type === 'textarea',\n 'c-input--disabled': disabled,\n },\n inputClass,\n ]\"\n :value=\"localValue == null ? '' : String(localValue)\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :inputmode=\"type === 'number' ? 'decimal' : undefined\"\n :autocomplete=\"autocomplete ? 'on' : 'off'\"\n @input=\"onInput\"\n />\n <button\n v-if=\"clearable && !disabled\"\n type=\"button\"\n class=\"c-icon-btn c-icon-btn--clear\"\n :class=\"{ 'c-icon-btn--hidden': !hasValue }\"\n aria-label=\"Mező törlése\"\n @click=\"clear\"\n >\n <i class=\"fa-solid fa-fw fa-xmark\"></i>\n </button>\n </div>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"admins-components17.js","names":[],"sources":["../src/components/TextInput.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ControlSize } from '@/types/types'\nimport { debounce } from '@/utils/debounce'\n\nexport type TextInputType = 'text' | 'number' | 'textarea'\nexport interface TextInputProps {\n modelValue?: string | number | null\n type?: TextInputType\n label?: string\n labelOnBorder?: string\n placeholder?: string\n disabled?: boolean\n clearable?: boolean\n autocomplete?: boolean\n size?: ControlSize\n id?: string\n inputClass?: string\n /**\n * Delay (in milliseconds) before the `update:modelValue` event is\n * emitted after the last keystroke. Useful for throttling expensive\n * downstream work like filtering or server-side lookups. Defaults\n * to 300ms.\n */\n debounce?: number\n}\n\nexport const textInputDefaults = {\n modelValue: undefined,\n type: 'text',\n disabled: false,\n clearable: true,\n autocomplete: true,\n labelOnBorder: undefined,\n size: 'normal' as ControlSize,\n debounce: 300,\n} as TextInputProps\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref, useId, watch } from 'vue'\n\nconst props = withDefaults(defineProps<TextInputProps>(), textInputDefaults)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null]\n}>()\n\nconst inputId = computed(() => props.id ?? `c-input-${useId()}`)\n\nconst localValue = ref<string | number | null | undefined>(props.modelValue)\n\nconst hasValue = computed(() => {\n const v = localValue.value\n return v !== null && v !== undefined && String(v) !== ''\n})\n\nwatch(\n () => props.modelValue,\n (val) => {\n if (val === localValue.value) return\n localValue.value = val\n },\n)\n\nconst hasLabelOnBorder = computed(() => !!props.labelOnBorder && props.labelOnBorder.trim() !== '')\n\nconst borderLabelVisible = computed(() => (hasLabelOnBorder.value && hasValue.value) || props.label)\n\n// `debouncedEmit` is recreated whenever `props.debounce` changes so a\n// caller can adjust the throttling at runtime. We keep the latest\n// function in a ref so `onInput` can invoke the current version.\nfunction makeDebouncedEmit(delay: number) {\n return debounce((raw: string) => {\n emit('update:modelValue', props.type === 'number' ? (raw === '' ? null : Number(raw)) : raw)\n }, delay)\n}\n\nconst debouncedEmit = ref(makeDebouncedEmit(props.debounce))\n\nwatch(\n () => props.debounce,\n (delay) => {\n debouncedEmit.value = makeDebouncedEmit(delay)\n },\n)\n\nfunction onInput(e: Event) {\n const raw = (e.target as HTMLInputElement).value\n localValue.value = raw\n debouncedEmit.value(raw)\n}\n\nfunction clear() {\n const next = props.type === 'number' ? null : ''\n localValue.value = next\n emit('update:modelValue', next)\n}\n</script>\n\n<template>\n <div class=\"ac-component c-input-wrapper\">\n <label\n v-if=\"hasLabelOnBorder || label\"\n class=\"c-label pointer\"\n :class=\"{\n 'c-label--on-border': hasLabelOnBorder,\n hide: !borderLabelVisible,\n }\"\n :for=\"inputId\"\n >\n {{ hasLabelOnBorder ? labelOnBorder : label }}\n </label>\n <div\n class=\"c-input-row\"\n :class=\"{\n 'c-input-row--sm': size === 'small',\n 'c-input-row--lg': size === 'large',\n 'c-input-row--disabled': disabled,\n }\"\n >\n <component\n :is=\"type === 'textarea' ? 'textarea' : 'input'\"\n :id=\"inputId\"\n :type=\"type\"\n class=\"c-input\"\n :class=\"[\n {\n 'c-textarea': type === 'textarea',\n 'c-input--disabled': disabled,\n },\n inputClass,\n ]\"\n :value=\"localValue == null ? '' : String(localValue)\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :inputmode=\"type === 'number' ? 'decimal' : undefined\"\n :autocomplete=\"autocomplete ? 'on' : 'off'\"\n @input=\"onInput\"\n />\n <button\n v-if=\"clearable && !disabled\"\n type=\"button\"\n class=\"c-icon-btn c-icon-btn--clear\"\n :class=\"{ 'c-icon-btn--hidden': !hasValue }\"\n aria-label=\"Mező törlése\"\n @click=\"clear\"\n >\n <i class=\"fa-solid fa-fw fa-xmark\"></i>\n </button>\n </div>\n </div>\n</template>\n"],"mappings":""}
@@ -1,18 +1,18 @@
1
1
  import { earlierOf as e, endOfDay as t, formatDate as n, laterOf as r, localToUTCString as i } from "./admins-components3.js";
2
2
  import a from "./admins-components6.js";
3
3
  import { dateRangePickerConfigDefaults as o } from "./admins-components7.js";
4
- import { useDropdownAnchor as ee } from "./admins-components12.js";
5
- import s from "./admins-components14.js";
6
- import { applyPredefinedRange as te, canStepInBounds as c, isPredefinedRangeInBounds as ne, matchPredefinedRange as re, predefinedRanges as l } from "./admins-components20.js";
7
- import { Fragment as u, Teleport as d, computed as f, createBlock as p, createCommentVNode as m, createElementBlock as h, createElementVNode as g, createVNode as _, defineComponent as v, normalizeClass as y, normalizeStyle as ie, openBlock as b, ref as x, renderList as ae, resolveDirective as oe, toDisplayString as S, unref as C, useId as se, watch as w, withDirectives as T, withModifiers as E } from "vue";
4
+ import { useDropdownAnchor as s } from "./admins-components12.js";
5
+ import c from "./admins-components14.js";
6
+ import { applyPredefinedRange as ee, canStepInBounds as l, isPredefinedRangeInBounds as te, matchPredefinedRange as ne, predefinedRanges as u } from "./admins-components20.js";
7
+ import { Fragment as d, Teleport as re, computed as f, createBlock as p, createCommentVNode as m, createElementBlock as h, createElementVNode as g, createVNode as _, defineComponent as v, normalizeClass as y, normalizeStyle as ie, openBlock as b, ref as x, renderList as S, resolveDirective as ae, toDisplayString as C, unref as w, useId as oe, watch as T, withDirectives as E, withModifiers as D } from "vue";
8
8
  //#region src/components/DateRangePicker.vue?vue&type=script&setup=true&lang.ts
9
- var ce = { class: "ac-component" }, le = { class: "drp-input" }, ue = { class: "c-truncate drp-input__single" }, de = { class: "drp-input__multi" }, fe = { class: "c-truncate drp-input__line" }, pe = { class: "c-truncate drp-input__line" }, me = {
9
+ var se = { class: "ac-component" }, ce = { class: "drp-input" }, le = { class: "c-truncate drp-input__single" }, ue = { class: "drp-input__multi" }, de = { class: "c-truncate drp-input__line" }, fe = { class: "c-truncate drp-input__line" }, pe = {
10
10
  key: 1,
11
11
  class: "c-placeholder drp-input__placeholder"
12
- }, he = { class: "ac-component" }, ge = { class: "drp-pickers" }, _e = { class: "drp-picker-group" }, ve = ["for"], ye = { class: "drp-picker-group" }, be = ["for"], xe = {
12
+ }, me = { class: "ac-component" }, he = { class: "drp-pickers" }, ge = { class: "drp-picker-group" }, _e = ["for"], ve = { class: "drp-picker-group" }, ye = ["for"], be = {
13
13
  key: 0,
14
14
  class: "drp-toolbar"
15
- }, Se = { class: "d-flex" }, Ce = { class: "predefined-ranges" }, D = ["aria-disabled", "onClick"], O = { class: "d-flex" }, k = {
15
+ }, xe = { class: "d-flex" }, Se = { class: "predefined-ranges" }, Ce = ["aria-disabled", "onClick"], O = { class: "d-flex" }, k = {
16
16
  key: 1,
17
17
  class: "c-footer"
18
18
  }, A = /*@__PURE__*/ v({
@@ -23,10 +23,10 @@ var ce = { class: "ac-component" }, le = { class: "drp-input" }, ue = { class: "
23
23
  },
24
24
  emits: ["update:modelValue"],
25
25
  setup(v, { expose: A, emit: we }) {
26
- let j = v, M = we, N = `drp-input-${se()}`, P = f(() => ({
26
+ let j = v, M = we, N = `drp-input-${oe()}`, P = f(() => ({
27
27
  ...o,
28
28
  ...j.config
29
- })), F = x(null), I = x(null), { isOpen: L, dropdownStyle: Te } = ee(F, I, { isOutsideClick: (e, t, n) => {
29
+ })), F = x(null), I = x(null), { isOpen: L, dropdownStyle: Te } = s(F, I, { isOutsideClick: (e, t, n) => {
30
30
  let r = e.target;
31
31
  return !(t?.contains(r) ?? !1) && !(n?.contains(r) ?? !1) && !(r instanceof Element && r.closest(".c-dropdown"));
32
32
  } });
@@ -50,10 +50,10 @@ var ce = { class: "ac-component" }, le = { class: "drp-input" }, ue = { class: "
50
50
  return e ? n(new Date(e), De.value) : "...";
51
51
  }
52
52
  let V = x(R(j.modelValue?.fromUtc ?? null)), H = x(R(j.modelValue?.toUtc ?? null)), U = x(j.modelValue?.fromUtc ?? null), W = x(j.modelValue?.toUtc ?? null), G = f(() => U.value != null || W.value != null), Oe = f(() => V.value?.local ?? null), ke = f(() => H.value?.local ?? null), Ae = f(() => P.value.minDate ?? null), je = f(() => e(P.value.maxDate ?? null, ke.value ?? null)), Me = f(() => r(P.value.minDate ?? null, Oe.value ?? null)), Ne = f(() => P.value.maxDate ?? null);
53
- w(() => j.modelValue, (e) => {
53
+ T(() => j.modelValue, (e) => {
54
54
  let t = e?.fromUtc ?? null, n = e?.toUtc ?? null;
55
55
  V.value = R(t), H.value = R(n), U.value = t, W.value = n;
56
- }), w(L, (e) => {
56
+ }), T(L, (e) => {
57
57
  e && P.value.lazy && (V.value = R(U.value), H.value = R(W.value));
58
58
  });
59
59
  function Pe(e) {
@@ -87,16 +87,20 @@ var ce = { class: "ac-component" }, le = { class: "drp-input" }, ue = { class: "
87
87
  }
88
88
  A({ focusAndOpen: Le });
89
89
  function Y() {
90
- let e = V.value?.local, t = H.value?.local;
91
- if (!e || !t) return null;
92
- let n = 864e5;
93
- return P.value.showTime ? t.getTime() - e.getTime() : (Math.round((t.getTime() - e.getTime()) / n) + 1) * n;
90
+ let e = V.value, t = H.value;
91
+ if (!e?.local || !t?.local) return null;
92
+ let n = 864e5, r = e.local, i = t.local, a = new Date(r);
93
+ a.setHours(0, 0, 0, 0);
94
+ let o = new Date(i);
95
+ o.setHours(0, 0, 0, 0);
96
+ let s = r.getTime() === a.getTime(), c = i.getTime() === o.getTime() + 8634e4;
97
+ return !P.value.showTime || s && c ? (Math.round((o.getTime() - a.getTime()) / n) + 1) * n : i.getTime() - r.getTime();
94
98
  }
95
99
  let X = f(() => {
96
100
  let e = V.value?.local, t = H.value?.local;
97
101
  if (!e || !t) return !1;
98
102
  let n = Y();
99
- return n != null && c(e, t, -n, {
103
+ return n != null && l(e, t, -n, {
100
104
  minDate: P.value.minDate ?? null,
101
105
  maxDate: P.value.maxDate ?? null,
102
106
  showTime: P.value.showTime ?? !1
@@ -105,7 +109,7 @@ var ce = { class: "ac-component" }, le = { class: "drp-input" }, ue = { class: "
105
109
  let e = V.value?.local, t = H.value?.local;
106
110
  if (!e || !t) return !1;
107
111
  let n = Y();
108
- return n != null && c(e, t, n, {
112
+ return n != null && l(e, t, n, {
109
113
  minDate: P.value.minDate ?? null,
110
114
  maxDate: P.value.maxDate ?? null,
111
115
  showTime: P.value.showTime ?? !1
@@ -115,7 +119,7 @@ var ce = { class: "ac-component" }, le = { class: "drp-input" }, ue = { class: "
115
119
  let t = V.value?.local, n = H.value?.local;
116
120
  if (!t || !n) return;
117
121
  let r = Y();
118
- r != null && c(t, n, r * e, {
122
+ r != null && l(t, n, r * e, {
119
123
  minDate: P.value.minDate ?? null,
120
124
  maxDate: P.value.maxDate ?? null,
121
125
  showTime: P.value.showTime ?? !1
@@ -123,23 +127,23 @@ var ce = { class: "ac-component" }, le = { class: "drp-input" }, ue = { class: "
123
127
  }
124
128
  let Re = f(() => {
125
129
  let e = V.value?.local, t = H.value?.local;
126
- return !e || !t ? null : re(e, t, { showTime: P.value.showTime ?? !1 });
130
+ return !e || !t ? null : ne(e, t, { showTime: P.value.showTime ?? !1 });
127
131
  }), $ = f(() => {
128
132
  let e = {
129
133
  minDate: P.value.minDate ?? null,
130
134
  maxDate: P.value.maxDate ?? null,
131
135
  showTime: P.value.showTime ?? !1
132
136
  }, t = {};
133
- for (let n of l) t[n.key] = !ne(n.key, e);
137
+ for (let n of u) t[n.key] = !te(n.key, e);
134
138
  return t;
135
139
  });
136
140
  function ze(e) {
137
- let { from: t, to: n } = te(e, { showTime: P.value.showTime ?? !1 });
141
+ let { from: t, to: n } = ee(e, { showTime: P.value.showTime ?? !1 });
138
142
  V.value = t, H.value = n, q(), P.value.lazy && (L.value = !1);
139
143
  }
140
144
  return (e, t) => {
141
- let n = oe("tooltip");
142
- return b(), h("div", ce, [g("div", {
145
+ let n = ae("tooltip");
146
+ return b(), h("div", se, [g("div", {
143
147
  ref_key: "wrapperRef",
144
148
  ref: F,
145
149
  class: y(["drp-wrapper", { "drp-wrapper--compact": P.value.compact }])
@@ -147,35 +151,35 @@ var ce = { class: "ac-component" }, le = { class: "drp-input" }, ue = { class: "
147
151
  class: y(["c-input-row", {
148
152
  "c-input-row--sm": P.value.size === "small",
149
153
  "c-input-row--lg": P.value.size === "large",
150
- "c-input-row--focus": C(L)
154
+ "c-input-row--focus": w(L)
151
155
  }]),
152
- onClick: t[1] ||= (e) => L.value = !C(L)
156
+ onClick: t[1] ||= (e) => L.value = !w(L)
153
157
  }, [
154
- g("div", le, [G.value ? (b(), h(u, { key: 0 }, [g("span", ue, S(B(U.value)) + " – " + S(B(W.value)), 1), g("span", de, [g("span", fe, S(B(U.value)), 1), g("span", pe, S(B(W.value)), 1)])], 64)) : (b(), h("span", me, S(P.value.placeholderFrom) + " – " + S(P.value.placeholderTo), 1))]),
158
+ g("div", ce, [G.value ? (b(), h(d, { key: 0 }, [g("span", le, C(B(U.value)) + " – " + C(B(W.value)), 1), g("span", ue, [g("span", de, C(B(U.value)), 1), g("span", fe, C(B(W.value)), 1)])], 64)) : (b(), h("span", pe, C(P.value.placeholderFrom) + " – " + C(P.value.placeholderTo), 1))]),
155
159
  g("button", {
156
160
  type: "button",
157
161
  class: y(["c-icon-btn dp-clear c-icon-btn--clear", { "c-icon-btn--hidden": !G.value }]),
158
- onClick: E(J, ["stop"]),
162
+ onClick: D(J, ["stop"]),
159
163
  "aria-label": "Törlés"
160
164
  }, [...t[5] ||= [g("i", { class: "fa-solid fa-fw fa-xmark" }, null, -1)]], 2),
161
165
  P.value.showIcon ? (b(), h("button", {
162
166
  key: 0,
163
167
  type: "button",
164
168
  class: "c-icon-btn c-icon-btn--calendar",
165
- onClick: t[0] ||= E((e) => L.value = !C(L), ["stop"]),
169
+ onClick: t[0] ||= D((e) => L.value = !w(L), ["stop"]),
166
170
  "aria-label": "Naptár megnyitása"
167
171
  }, [...t[6] ||= [g("i", { class: "fa-regular fa-fw fa-calendar" }, null, -1)]])) : m("", !0)
168
- ], 2), (b(), p(d, { to: "body" }, [g("div", he, [C(L) ? (b(), h("div", {
172
+ ], 2), (b(), p(re, { to: "body" }, [g("div", me, [w(L) ? (b(), h("div", {
169
173
  key: 0,
170
174
  ref_key: "dropdownRef",
171
175
  ref: I,
172
176
  class: "c-dropdown drp-dropdown",
173
- style: ie(C(Te))
177
+ style: ie(w(Te))
174
178
  }, [
175
- g("div", ge, [g("div", _e, [g("label", {
179
+ g("div", he, [g("div", ge, [g("label", {
176
180
  class: "drp-label",
177
181
  for: `${N}-from`
178
- }, S(P.value.placeholderFrom), 9, ve), _(s, {
182
+ }, C(P.value.placeholderFrom), 9, _e), _(c, {
179
183
  id: `${N}-from`,
180
184
  "model-value": V.value,
181
185
  config: {
@@ -189,10 +193,10 @@ var ce = { class: "ac-component" }, le = { class: "drp-input" }, ue = { class: "
189
193
  "id",
190
194
  "model-value",
191
195
  "config"
192
- ])]), g("div", ye, [g("label", {
196
+ ])]), g("div", ve, [g("label", {
193
197
  class: "drp-label",
194
198
  for: `${N}-to`
195
- }, S(P.value.placeholderTo), 9, be), _(s, {
199
+ }, C(P.value.placeholderTo), 9, ye), _(c, {
196
200
  id: `${N}-to`,
197
201
  "model-value": H.value,
198
202
  config: {
@@ -207,14 +211,14 @@ var ce = { class: "ac-component" }, le = { class: "drp-input" }, ue = { class: "
207
211
  "model-value",
208
212
  "config"
209
213
  ])])]),
210
- P.value.showPresets ? (b(), h("div", xe, [
211
- T((b(), h("span", Se, [_(a, {
214
+ P.value.showPresets ? (b(), h("div", be, [
215
+ E((b(), h("span", xe, [_(a, {
212
216
  icon: "fa-solid fa-chevron-left",
213
217
  class: "drp-toolbar__stepper drp-toolbar__stepper--left",
214
218
  disabled: !X.value,
215
219
  onClick: t[2] ||= (e) => Q(-1)
216
220
  }, null, 8, ["disabled"])])), [[n, X.value ? "Intervallum mozgatása visszafelé" : "Nem léphető tovább a minimum dátum miatt"]]),
217
- g("div", Ce, [(b(!0), h(u, null, ae(C(l), (e) => (b(), h("a", {
221
+ g("div", Se, [(b(!0), h(d, null, S(w(u), (e) => (b(), h("a", {
218
222
  key: e.key,
219
223
  class: y(["predefined-range", {
220
224
  "predefined-range--active": Re.value === e.key,
@@ -222,8 +226,8 @@ var ce = { class: "ac-component" }, le = { class: "drp-input" }, ue = { class: "
222
226
  }]),
223
227
  "aria-disabled": $.value[e.key],
224
228
  onClick: (t) => $.value[e.key] ? null : ze(e.key)
225
- }, S(e.label), 11, D))), 128))]),
226
- T((b(), h("span", O, [_(a, {
229
+ }, C(e.label), 11, Ce))), 128))]),
230
+ E((b(), h("span", O, [_(a, {
227
231
  icon: "fa-solid fa-chevron-right",
228
232
  disabled: !Z.value,
229
233
  onClick: t[3] ||= (e) => Q(1),