@htlkg/components 0.0.2 → 0.0.4
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.
- package/README.md +52 -0
- package/dist/AdminWrapper.vue_vue_type_script_setup_true_lang-B32IylcT.js +367 -0
- package/dist/AdminWrapper.vue_vue_type_script_setup_true_lang-B32IylcT.js.map +1 -0
- package/dist/Alert.vue_vue_type_script_setup_true_lang-DxPCS-Hx.js +263 -0
- package/dist/Alert.vue_vue_type_script_setup_true_lang-DxPCS-Hx.js.map +1 -0
- package/dist/DateRange.vue_vue_type_script_setup_true_lang-BLVg1Hah.js +580 -0
- package/dist/DateRange.vue_vue_type_script_setup_true_lang-BLVg1Hah.js.map +1 -0
- package/dist/ProductBadge.vue_vue_type_script_setup_true_lang-Cmr2f4Cy.js +187 -0
- package/dist/ProductBadge.vue_vue_type_script_setup_true_lang-Cmr2f4Cy.js.map +1 -0
- package/dist/_plugin-vue_export-helper-1tPrXgE0.js +11 -0
- package/dist/_plugin-vue_export-helper-1tPrXgE0.js.map +1 -0
- package/dist/components.css +15 -0
- package/dist/composables/index.js +32 -573
- package/dist/composables/index.js.map +1 -1
- package/dist/data/index.js +18 -0
- package/dist/data/index.js.map +1 -0
- package/dist/domain/index.js +8 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/filterHelpers-DgRyoYSa.js +1386 -0
- package/dist/filterHelpers-DgRyoYSa.js.map +1 -0
- package/dist/forms/index.js +6 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/index-DGO_pNgG.js +79 -0
- package/dist/index-DGO_pNgG.js.map +1 -0
- package/dist/index-QK97OdqQ.js +25 -0
- package/dist/index-QK97OdqQ.js.map +1 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/navigation/index.js +8 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/overlays/index.js +8 -0
- package/dist/overlays/index.js.map +1 -0
- package/dist/stores/index.js +14 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/useAdminPage-GhgXp0x8.js +1070 -0
- package/dist/useAdminPage-GhgXp0x8.js.map +1 -0
- package/dist/useTable-DutR1gkg.js +293 -0
- package/dist/useTable-DutR1gkg.js.map +1 -0
- package/package.json +43 -14
- package/src/composables/composables.md +109 -0
- package/src/composables/index.ts +69 -0
- package/src/composables/useAdminPage.ts +462 -0
- package/src/composables/useConfirmation.ts +358 -0
- package/src/composables/usePageContext.ts +171 -0
- package/src/composables/useStats.ts +361 -0
- package/src/composables/useTable.ts +26 -5
- package/src/composables/useWizard.ts +448 -0
- package/src/data/DataTable.vue +553 -0
- package/src/data/Table/Table.vue +295 -0
- package/src/data/columnHelpers.ts +503 -0
- package/src/data/data.md +106 -0
- package/src/data/filterHelpers.ts +358 -0
- package/src/data/index.ts +31 -0
- package/src/domain/domain.md +102 -0
- package/src/forms/JsonSchemaForm.vue +4 -1
- package/src/forms/forms.md +89 -0
- package/src/index.ts +4 -3
- package/src/navigation/navigation.md +80 -0
- package/src/overlays/overlays.md +86 -0
- package/src/stores/stores.md +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filterHelpers-DgRyoYSa.js","sources":["../src/data/Table.vue","../src/data/DataList.vue","../src/data/SearchableSelect.vue","../src/data/Chart.vue","../src/data/DataTable.vue","../src/data/columnHelpers.ts","../src/data/filterHelpers.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed } from 'vue';\nimport {\n type TableItemType,\n type UiDropdownItemType,\n type UiModalInterface,\n type UiTableInterface,\n uiTable\n} from '@hotelinking/ui';\n\ninterface Props {\n // Data\n items: TableItemType[];\n header: UiTableInterface['header'];\n \n // State\n loading?: boolean;\n currentPage?: number;\n totalPages?: number;\n totalItems?: number;\n pageSize?: number;\n orderedBy?: string;\n orderDirection?: 'asc' | 'desc';\n \n // Selection\n actions?: Array<{ name: string; id: string }>;\n selectAllItemsModal?: UiModalInterface;\n resetSelected?: boolean;\n \n // Filters (now integrated in uiTable)\n smartFilterCategories?: Array<{\n id: string;\n name: string;\n componentType: 'uiInput' | 'uiSelect';\n defaultProps: any;\n }>;\n filterLiterals?: {\n filters: string;\n contains: string;\n is: string;\n and: string;\n or: string;\n deleteAll: string;\n filter: string;\n };\n filters?: {\n logicOperator: string;\n filters: Array<{\n name: string;\n label: string;\n type: 'uiInput' | 'uiSelect';\n value: string | undefined;\n }>;\n };\n \n // Additional features\n tableActionsDropdown?: { items: UiDropdownItemType[]; loading?: boolean };\n tableActionButtons?: Array<{\n text: string;\n id: string;\n color?: string;\n size?: string;\n disabled?: boolean;\n icon?: any;\n loading?: boolean;\n }>;\n noResults?: {\n title: string;\n message: string;\n actions?: Array<{ action: string; text: string }>;\n items?: UiDropdownItemType[];\n select?: UiDropdownItemType;\n };\n hiddenColumns?: number[];\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n loading: false,\n currentPage: 1,\n totalPages: 1,\n totalItems: 0,\n pageSize: 10,\n orderedBy: '',\n orderDirection: 'asc',\n resetSelected: false,\n filterLiterals: () => ({\n filters: 'Smart Filters',\n contains: 'contains',\n is: 'is',\n and: 'and',\n or: 'or',\n deleteAll: 'Delete All',\n filter: 'Filter'\n })\n});\n\nconst emit = defineEmits<{\n 'update:currentPage': [page: number];\n 'update:pageSize': [size: number];\n 'update:selected': [items: any[]];\n 'update:orderedBy': [key: string];\n 'update:orderDirection': [direction: 'asc' | 'desc'];\n 'update:resetSelected': [value: boolean];\n 'table-action': [data: { action: string; items: Array<string | number> }];\n 'table-action-selected': [item: any];\n 'table-action-button-clicked': [data: { id: string; text: string }];\n 'smart-filters-sent': [filters: any];\n 'smart-filters-cleared': [];\n 'smart-filter-deleted': [index: number];\n 'custom-emit': [data: any];\n 'modal-action': [data: { modal: string; action: string }];\n 'select-all-items': [];\n 'deselect-all-items': [];\n 'no-results-action': [action: string];\n 'no-results-option-selected': [item: any];\n 'columns-visibility-changed': [data: { index: number; hidden: boolean }];\n 'order-by': [data: { value: string; orderDirection: 'asc' | 'desc' }];\n 'change-page': [page: number];\n 'change-page-size': [size: number | string];\n}>();\n\n// State management\nconst internalHiddenColumns = ref<number[]>(props.hiddenColumns || []);\nconst selectedItemIds = ref<Set<string | number>>(new Set());\n\n// Page size options for uiTable\nconst pageSizeOptions = computed(() => [\n { name: '10', value: '10', active: props.pageSize === 10 },\n { name: '25', value: '25', active: props.pageSize === 25 },\n { name: '50', value: '50', active: props.pageSize === 50 },\n { name: '100', value: '100', active: props.pageSize === 100 }\n]);\n\n// Event handlers\nfunction handleOrderBy(event: { value: string; orderDirection: 'asc' | 'desc' }) {\n emit('update:orderedBy', event.value);\n emit('update:orderDirection', event.orderDirection);\n emit('order-by', event);\n}\n\nfunction handleChangePage(page: number) {\n emit('update:currentPage', page);\n emit('change-page', page);\n}\n\nfunction handleChangePageSize(size: number | string) {\n const numSize = typeof size === 'string' ? Number(size) : size;\n emit('update:pageSize', numSize);\n emit('change-page-size', size);\n emit('update:currentPage', 1);\n}\n\nfunction handleTableAction(data: { action: string; items: Array<string | number> }) {\n selectedItemIds.value = new Set(data.items);\n updateSelectedItems();\n emit('table-action', data);\n}\n\nfunction resetSelectedItems() {\n selectedItemIds.value.clear();\n updateSelectedItems();\n emit('update:resetSelected', true);\n}\n\nfunction handleTableActionSelected(item: any) {\n emit('table-action-selected', item);\n}\n\nfunction handleTableActionButtonClicked(data: { id: string; text: string }) {\n emit('table-action-button-clicked', data);\n}\n\nfunction handleSmartFiltersSent(filters: any) {\n emit('smart-filters-sent', filters);\n}\n\nfunction handleSmartFiltersCleared() {\n emit('smart-filters-cleared');\n}\n\nfunction handleSmartFilterDeleted(index: number) {\n emit('smart-filter-deleted', index);\n}\n\nfunction handleCustomEmit(data: any) {\n emit('custom-emit', data);\n}\n\nfunction handleColumnsVisibilityChanged(event: { index: number; hidden: boolean }) {\n if (event.hidden) {\n if (!internalHiddenColumns.value.includes(event.index)) {\n internalHiddenColumns.value.push(event.index);\n }\n } else {\n const index = internalHiddenColumns.value.indexOf(event.index);\n if (index > -1) {\n internalHiddenColumns.value.splice(index, 1);\n }\n }\n emit('columns-visibility-changed', event);\n}\n\nfunction handleModalAction(data: { modal: string; action: string }) {\n emit('modal-action', data);\n}\n\nfunction handleSelectAllItems() {\n selectedItemIds.value = new Set(props.items.map(item => item.id));\n updateSelectedItems();\n emit('select-all-items');\n}\n\nfunction handleDeselectAllItems() {\n selectedItemIds.value.clear();\n updateSelectedItems();\n emit('deselect-all-items');\n}\n\nfunction handleNoResultsAction(action: string) {\n emit('no-results-action', action);\n}\n\nfunction handleNoResultsOptionSelected(item: any) {\n emit('no-results-option-selected', item);\n}\n\nfunction handleSelectedItemsDeleted() {\n emit('update:resetSelected', false);\n}\n\nfunction updateSelectedItems() {\n const selected = props.items.filter(item => item.id && selectedItemIds.value.has(item.id));\n emit('update:selected', selected);\n}\n\n// Expose methods for parent components\ndefineExpose({\n clearSelection: () => { \n emit('update:resetSelected', true);\n selectedItemIds.value.clear();\n updateSelectedItems();\n },\n getHiddenColumns: () => internalHiddenColumns.value,\n getSelectedItems: () => Array.from(selectedItemIds.value),\n getSelectedItemsData: () => props.items.filter(item => item.id && selectedItemIds.value.has(item.id))\n});\n</script>\n\n<template>\n <uiTable\n :loading=\"loading\"\n :header=\"header\"\n :items=\"items\"\n :ordered-by=\"orderedBy\"\n :order-direction=\"orderDirection\"\n :actions=\"(actions as any)\"\n :hidden-columns=\"internalHiddenColumns\"\n :reset-selected=\"resetSelected\"\n :select-all-items-modal=\"(selectAllItemsModal as any)\"\n :smart-filter-categories=\"smartFilterCategories\"\n :filter-literals=\"filterLiterals\"\n :filters=\"filters\"\n :table-actions-dropdown=\"tableActionsDropdown\"\n :table-action-buttons=\"tableActionButtons\"\n :pagination-current=\"currentPage\"\n :pagination-total=\"totalPages\"\n :pagination-total-items=\"totalItems\"\n :page-size-options=\"pageSizeOptions\"\n :current-page-size=\"pageSize\"\n :no-results=\"noResults\"\n @order-by=\"handleOrderBy\"\n @table-action=\"handleTableAction\"\n @table-action-selected=\"handleTableActionSelected\"\n @table-action-button-clicked=\"handleTableActionButtonClicked\"\n @smart-filters-sent=\"handleSmartFiltersSent\"\n @smart-filters-cleared=\"handleSmartFiltersCleared\"\n @smart-filter-deleted=\"handleSmartFilterDeleted\"\n @change-page=\"handleChangePage\"\n @change-page-size=\"handleChangePageSize\"\n @custom-emit=\"handleCustomEmit\"\n @columns-visibility-changed=\"handleColumnsVisibilityChanged\"\n @selected-items-deleted=\"handleSelectedItemsDeleted\"\n @modal-action=\"handleModalAction\"\n @select-all-items=\"handleSelectAllItems\"\n @deselect-all-items=\"handleDeselectAllItems\"\n @no-results-action=\"handleNoResultsAction\"\n @no-results-option-selected=\"handleNoResultsOptionSelected\"\n />\n</template>\n\n<style scoped>\n.table-component {\n width: 100%;\n}\n</style>\n","<script setup lang=\"ts\" generic=\"T extends Record<string, any>\">\ninterface Props {\n items: T[];\n loading?: boolean;\n emptyMessage?: string;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n loading: false,\n emptyMessage: 'No items to display'\n});\n\nconst emit = defineEmits<{\n 'item-click': [item: T];\n}>();\n\n// Expose methods for parent components\ndefineExpose({\n getItems: () => props.items\n});\n</script>\n\n<template>\n <div class=\"w-full\">\n <div v-if=\"loading\" class=\"p-8 text-center text-gray-600\">\n Loading...\n </div>\n \n <div v-else-if=\"items.length === 0\" class=\"p-8 text-center text-gray-600\">\n {{ emptyMessage }}\n </div>\n \n <div v-else class=\"flex flex-col gap-2\">\n <div\n v-for=\"(item, index) in items\"\n :key=\"index\"\n class=\"p-4 border border-gray-200 rounded-md cursor-pointer hover:bg-gray-50 transition-colors\"\n @click=\"emit('item-click', item)\"\n >\n <slot :item=\"item\" :index=\"index\">\n {{ JSON.stringify(item) }}\n </slot>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T extends Record<string, any>\">\nimport { ref, computed } from 'vue';\nimport { uiSelect, uiSelectMultiple } from '@hotelinking/ui';\n\ninterface Props {\n options: T[];\n modelValue?: T | T[] | null;\n labelKey?: string;\n valueKey?: string;\n placeholder?: string;\n label?: string;\n error?: string;\n color?: 'primary' | 'secondary' | 'light' | 'green' | 'yellow' | 'red' | 'black' | 'gray' | 'white';\n loading?: boolean;\n disabled?: boolean;\n requiredText?: string;\n multiple?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: null,\n labelKey: 'label',\n valueKey: 'id',\n placeholder: 'Select an option',\n label: '',\n error: '',\n color: 'gray',\n loading: false,\n disabled: false,\n requiredText: '',\n multiple: false\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: T | T[] | null];\n 'change': [value: T | T[] | null];\n}>();\n\n// Transform options to match uiSelect/uiSelectMultiple format\nconst transformedItems = computed(() => {\n return props.options.map(option => ({\n id: String(option[props.valueKey]),\n name: String(option[props.labelKey]),\n label: option.label ? String(option.label) : undefined\n }));\n});\n\n// Transform modelValue to match uiSelect format (single selection)\nconst selectedItem = computed(() => {\n if (props.multiple || !props.modelValue) {\n return { id: '', name: '', label: undefined };\n }\n \n const value = props.modelValue as T;\n return {\n id: String(value[props.valueKey]),\n name: String(value[props.labelKey]),\n label: value.label ? String(value.label) : undefined\n };\n});\n\n// Transform modelValue to match uiSelectMultiple format (multiple selection)\nconst selectedItems = computed(() => {\n if (!props.multiple || !props.modelValue) return [];\n \n const values = Array.isArray(props.modelValue) ? props.modelValue : [props.modelValue];\n return values.map(value => ({\n id: String(value[props.valueKey]),\n name: String(value[props.labelKey]),\n label: value.label ? String(value.label) : undefined\n }));\n});\n\nfunction handleSelectChange(selected: any) {\n if (props.multiple) {\n // Multiple selection: transform back to original format\n const originalValues = selected.map((item: any) => {\n return props.options.find(opt => String(opt[props.valueKey]) === item.id);\n }).filter(Boolean);\n \n emit('update:modelValue', originalValues as T[]);\n emit('change', originalValues as T[]);\n } else {\n // Single selection: transform back to original format\n const originalValue = props.options.find(opt => String(opt[props.valueKey]) === selected.id);\n emit('update:modelValue', originalValue || null);\n emit('change', originalValue || null);\n }\n}\n\n// Expose methods for parent components\ndefineExpose({\n getSelected: () => props.modelValue\n});\n</script>\n\n<template>\n <uiSelectMultiple\n v-if=\"multiple\"\n :items=\"transformedItems\"\n :label=\"label\"\n :placeholder=\"placeholder\"\n :error=\"error\"\n :color=\"color\"\n :select=\"selectedItems\"\n :loading=\"loading\"\n :disabled=\"disabled\"\n :required-text=\"requiredText\"\n @selectChanged=\"handleSelectChange\"\n />\n <uiSelect\n v-else\n :items=\"transformedItems\"\n :label=\"label\"\n :placeholder=\"placeholder\"\n :error=\"error\"\n :color=\"color\"\n :select=\"selectedItem\"\n :loading=\"loading\"\n :disabled=\"disabled\"\n :required-text=\"requiredText\"\n @selectChanged=\"handleSelectChange\"\n />\n</template>\n","<template>\n <uiChart\n :id=\"id\"\n :title=\"title\"\n :type=\"type\"\n :series=\"series\"\n :options=\"options\"\n :loading=\"loading\"\n :empty=\"empty\"\n :range=\"range\"\n :horizontal=\"horizontal\"\n :stacked=\"stacked\"\n :height=\"height\"\n :labels=\"labels\"\n :dates=\"dates\"\n :isNps=\"isNps\"\n :npsLiterals=\"npsLiterals\"\n :annotations=\"annotations\"\n @selectedRange=\"handleRangeSelected\"\n @chartUpdated=\"handleChartUpdated\"\n @dataPointSelection=\"handleDataPointSelection\"\n @maximizeChart=\"handleMaximizeChart\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue';\nimport { uiChart } from '@hotelinking/ui';\n\nexport interface ChartSeries {\n name: string;\n type?: 'area' | 'line' | 'bar' | 'scatter';\n data: number[];\n}\n\nexport interface ChartOptions {\n xaxis?: {\n tickAmount?: number;\n decimalsInFloat?: number;\n hideOverlappingLabels?: boolean;\n type?: string;\n max?: number;\n categories?: string[];\n };\n tooltip?: {\n intersect?: boolean;\n };\n [key: string]: any;\n}\n\nexport interface ChartAnnotation {\n text: string;\n high: number;\n}\n\nexport interface ChartDateRange {\n from: Date | string;\n to: Date | string;\n}\n\nexport interface NpsLiterals {\n unhappy: string;\n neutral: string;\n happy: string;\n}\n\ninterface Props {\n id: string;\n title: string;\n series: ChartSeries[];\n type?: 'area' | 'line' | 'bar' | 'scatter';\n options?: ChartOptions;\n loading?: boolean;\n empty?: boolean;\n range?: '24h' | '7d' | '1m' | '3m' | 'all';\n horizontal?: boolean;\n stacked?: boolean;\n height?: number;\n labels?: string[];\n dates?: ChartDateRange;\n isNps?: boolean;\n npsLiterals?: NpsLiterals;\n annotations?: ChartAnnotation;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: 'line',\n loading: false,\n empty: false,\n horizontal: false,\n stacked: false,\n isNps: false\n});\n\nconst emit = defineEmits<{\n 'range-selected': [data: { range: ChartDateRange; chartId: string }];\n 'chart-updated': [];\n 'data-point-selection': [data: any];\n 'maximize': [chartId: string];\n}>();\n\n// Handle events from uiChart\nfunction handleRangeSelected(data: { range: ChartDateRange; chartId: string }) {\n emit('range-selected', data);\n}\n\nfunction handleChartUpdated() {\n emit('chart-updated');\n}\n\nfunction handleDataPointSelection(data: any) {\n emit('data-point-selection', data);\n}\n\nfunction handleMaximizeChart(chartId: string) {\n emit('maximize', chartId);\n}\n\n// Exposed methods\nfunction refresh() {\n // Trigger chart refresh by emitting chart-updated\n emit('chart-updated');\n}\n\nfunction getChartId() {\n return props.id;\n}\n\ndefineExpose({\n refresh,\n getChartId\n});\n</script>\n","<script setup lang=\"ts\" generic=\"T extends Record<string, any>\">\n/**\n * DataTable Component\n *\n * A simplified table component that encapsulates useTable composable and Table component,\n * providing a cleaner API with automatic event wiring and column transformations.\n */\n\nimport { computed, toRef, watch } from \"vue\";\nimport Table from \"./Table.vue\";\nimport { useTable, type SmartFilter } from \"../composables/useTable\";\n\n/**\n * Column definition for DataTable\n */\nexport interface DataTableColumn<TItem = any> {\n\t/** Property key to access from item */\n\tkey: string;\n\t/** Column header label */\n\tlabel: string;\n\t/** Whether column is sortable (default: true) */\n\tsortable?: boolean;\n\t/** Column width */\n\twidth?: string;\n\t/** Custom render function - returns value for table cell */\n\trender?: (item: TItem, index: number) => any;\n\t/** Cell type hint for default formatting */\n\ttype?: \"text\" | \"tag\" | \"badge\" | \"date\" | \"number\" | \"actions\";\n}\n\n/**\n * Filter definition for DataTable\n */\nexport interface DataTableFilter {\n\t/** Filter key (matches column key) */\n\tkey: string;\n\t/** Filter label */\n\tlabel: string;\n\t/** Filter input type */\n\ttype: \"text\" | \"select\" | \"number\" | \"date\" | \"dateRange\";\n\t/** Options for select type */\n\toptions?: Array<{ label: string; value: any }>;\n\t/** Placeholder text */\n\tplaceholder?: string;\n}\n\n/**\n * Bulk action definition\n */\nexport interface BulkAction {\n\t/** Action identifier */\n\tid: string;\n\t/** Display label */\n\tlabel: string;\n\t/** Icon name */\n\ticon?: string;\n\t/** Visual variant */\n\tvariant?: \"default\" | \"danger\" | \"warning\";\n\t/** Require confirmation */\n\tconfirm?: boolean;\n}\n\n/**\n * Row action definition\n */\nexport interface RowAction {\n\t/** Action identifier */\n\tid: string;\n\t/** Display label */\n\tlabel: string;\n\t/** Icon name */\n\ticon?: string;\n}\n\n/**\n * No results configuration\n */\nexport interface NoResultsConfig {\n\t/** Title text */\n\ttitle: string;\n\t/** Message text */\n\tmessage: string;\n\t/** Action buttons */\n\tactions?: Array<{ action: string; text: string }>;\n}\n\ninterface Props {\n\t/** Data items to display */\n\titems: T[];\n\t/** Column definitions */\n\tcolumns: DataTableColumn<T>[];\n\t/** Filter definitions */\n\tfilters?: DataTableFilter[];\n\t/** Initial filter values (from URL params) */\n\tinitialFilters?: Record<string, any>;\n\t/** Loading state */\n\tloading?: boolean;\n\t/** Items per page (default: 10) */\n\tpageSize?: number;\n\t/** Current page (for syncUrl mode) */\n\tcurrentPage?: number;\n\t/** Total pages (for syncUrl mode) */\n\ttotalPages?: number;\n\t/** Total items count (for syncUrl mode) */\n\ttotalItems?: number;\n\t/** Property key for item ID (default: 'id') */\n\tidKey?: keyof T;\n\t/** Row actions (shown in actions column) */\n\tactions?: RowAction[] | string[];\n\t/** Enable row selection */\n\tselectable?: boolean;\n\t/** Bulk actions (shown when items selected) */\n\tbulkActions?: BulkAction[];\n\t/** No results configuration */\n\tnoResults?: NoResultsConfig;\n\t/** Default sort key */\n\tdefaultSortKey?: string;\n\t/** Default sort order */\n\tdefaultSortOrder?: \"asc\" | \"desc\";\n\t/** Sync table state with URL (for SSR pages) */\n\tsyncUrl?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n\tloading: false,\n\tpageSize: 10,\n\tcurrentPage: 1,\n\ttotalPages: 1,\n\ttotalItems: 0,\n\tidKey: \"id\" as keyof T,\n\tselectable: false,\n\tdefaultSortOrder: \"asc\",\n\tsyncUrl: false,\n});\n\nconst emit = defineEmits<{\n\t/** Row action clicked */\n\taction: [action: string, item: T];\n\t/** Bulk action clicked */\n\tbulkAction: [action: string, items: T[]];\n\t/** Selection changed */\n\tselection: [items: T[]];\n\t/** Row clicked */\n\trowClick: [item: T];\n\t/** Custom cell emit (e.g., link clicks with emits config) */\n\tcustomEmit: [data: any];\n\t/** Page changed (for URL sync) */\n\tpageChange: [page: number];\n\t/** Sort changed (for URL sync) */\n\tsortChange: [key: string, order: \"asc\" | \"desc\"];\n\t/** Filters changed (for URL sync) */\n\tfilterChange: [filters: Record<string, any>];\n}>();\n\n/**\n * Update URL with new params (for syncUrl mode)\n */\nfunction updateUrl(params: Record<string, string | undefined>) {\n\tif (typeof window === \"undefined\") return;\n\t\n\tconst url = new URL(window.location.href);\n\tObject.entries(params).forEach(([key, value]) => {\n\t\tif (value !== undefined && value !== \"\") {\n\t\t\turl.searchParams.set(key, value);\n\t\t} else {\n\t\t\turl.searchParams.delete(key);\n\t\t}\n\t});\n\t// Navigate to trigger server-side data fetch\n\twindow.location.href = url.toString();\n}\n\n/**\n * Handle page change with optional URL sync\n */\nfunction handlePageChange(page: number) {\n\tif (props.syncUrl) {\n\t\temit(\"pageChange\", page);\n\t\tupdateUrl({ page: String(page) });\n\t} else {\n\t\ttable.handlePageChange(page);\n\t}\n}\n\n/**\n * Handle page size change with optional URL sync\n */\nfunction handlePageSizeChange(size: number | string) {\n\tif (props.syncUrl) {\n\t\tupdateUrl({ pageSize: String(size), page: \"1\" });\n\t} else {\n\t\ttable.handlePageSizeChange(size);\n\t}\n}\n\n/**\n * Handle sort change with optional URL sync\n */\nfunction handleOrderBy(event: { value: string; orderDirection: \"asc\" | \"desc\" }) {\n\tif (props.syncUrl) {\n\t\temit(\"sortChange\", event.value, event.orderDirection);\n\t\tupdateUrl({ sortKey: event.value, sortOrder: event.orderDirection, page: \"1\" });\n\t} else {\n\t\ttable.handleOrderBy(event);\n\t}\n}\n\n/**\n * Extract actual value from filter value (handles uiSelect objects with { id, name })\n */\nfunction extractFilterValue(value: any): string | undefined {\n\tif (value === undefined || value === null || value === \"\") {\n\t\treturn undefined;\n\t}\n\t// If value is an object with 'id' property (uiSelect format), extract the id\n\tif (typeof value === \"object\" && value !== null && \"id\" in value) {\n\t\treturn String(value.id);\n\t}\n\treturn String(value);\n}\n\n/**\n * Handle filters applied with optional URL sync\n */\nfunction handleFiltersApplied(filters: any) {\n\tif (props.syncUrl) {\n\t\t// Convert filter data to URL params\n\t\tconst filterParams: Record<string, string | undefined> = { page: \"1\" };\n\n\t\t// Handle uiTable format: { logicOperator: 'and', filters: [...] }\n\t\tif (filters && typeof filters === \"object\" && \"filters\" in filters && Array.isArray(filters.filters)) {\n\t\t\tfilters.filters.forEach((f: { name: string; value: any }) => {\n\t\t\t\tconst extractedValue = extractFilterValue(f.value);\n\t\t\t\tif (extractedValue !== undefined) {\n\t\t\t\t\tfilterParams[f.name] = extractedValue;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t// Handle SmartFilter array format: [{ category, operator, value }, ...]\n\t\telse if (Array.isArray(filters)) {\n\t\t\tfilters.forEach((f: { category?: string; name?: string; value: any }) => {\n\t\t\t\tconst key = f.category || f.name;\n\t\t\t\tconst extractedValue = extractFilterValue(f.value);\n\t\t\t\tif (key && extractedValue !== undefined) {\n\t\t\t\t\tfilterParams[key] = extractedValue;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t// Handle simple object format: { email: 'john', status: 'active' }\n\t\telse if (filters && typeof filters === \"object\") {\n\t\t\tObject.entries(filters).forEach(([key, value]) => {\n\t\t\t\t// Skip non-filter keys\n\t\t\t\tif (key === \"logicOperator\" || key === \"filters\") return;\n\t\t\t\tconst extractedValue = extractFilterValue(value);\n\t\t\t\tif (extractedValue !== undefined) {\n\t\t\t\t\tfilterParams[key] = extractedValue;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\temit(\"filterChange\", filterParams);\n\t\tupdateUrl(filterParams);\n\t} else {\n\t\ttable.handleSmartFiltersApplied(filters);\n\t}\n}\n\n/**\n * Handle filters cleared with optional URL sync\n */\nfunction handleFiltersCleared() {\n\tif (props.syncUrl) {\n\t\t// Clear all filter params from URL\n\t\tif (typeof window === \"undefined\") return;\n\t\tconst url = new URL(window.location.href);\n\t\t// Keep only non-filter params\n\t\tconst keysToRemove: string[] = [];\n\t\turl.searchParams.forEach((_, key) => {\n\t\t\tif (![\"page\", \"pageSize\", \"sortKey\", \"sortOrder\"].includes(key)) {\n\t\t\t\tkeysToRemove.push(key);\n\t\t\t}\n\t\t});\n\t\tkeysToRemove.forEach((key) => url.searchParams.delete(key));\n\t\turl.searchParams.set(\"page\", \"1\");\n\t\twindow.location.href = url.toString();\n\t} else {\n\t\ttable.handleSmartFiltersCleared();\n\t}\n}\n\n/**\n * Handle single filter deleted with optional URL sync\n */\nfunction handleFilterDeleted(index: number) {\n\tif (props.syncUrl) {\n\t\t// For URL sync, we need to rebuild filters without the deleted one\n\t\t// This is handled by the UI component, just trigger a page reload\n\t\thandleFiltersCleared();\n\t} else {\n\t\ttable.handleSmartFilterDeleted(index);\n\t}\n}\n\n// Initialize useTable with reactive items\nconst table = useTable<T>({\n\titems: toRef(() => props.items),\n\tpageSize: props.pageSize,\n\tsortKey: props.defaultSortKey ?? \"\",\n\tsortOrder: props.defaultSortOrder,\n\tidKey: props.idKey as string,\n});\n\n// Transform columns to table header format\nconst tableHeader = computed(() =>\n\tprops.columns.map((col) => ({\n\t\tname: col.key,\n\t\tlabel: col.label,\n\t\tsortable: col.sortable !== false,\n\t\twidth: col.width,\n\t}))\n);\n\n// Transform items to table row format\n// When syncUrl is true, data is already paginated server-side, use props.items directly\nconst tableItems = computed(() => {\n\tconst itemsToRender = props.syncUrl ? props.items : table.paginatedItems.value;\n\treturn itemsToRender.map((item, itemIndex) => ({\n\t\tid: item[props.idKey as keyof T],\n\t\trow: props.columns.map((col) => {\n\t\t\t// Use custom render if provided\n\t\t\tif (col.render) {\n\t\t\t\treturn col.render(item, itemIndex);\n\t\t\t}\n\n\t\t\t// Get raw value\n\t\t\tconst value = item[col.key as keyof T];\n\n\t\t\t// Apply type-based formatting\n\t\t\treturn formatCellValue(value, col.type);\n\t\t}),\n\t\t// Store original item for action handlers\n\t\t_originalData: item,\n\t}));\n});\n\n// Transform filters to smart filter categories\nconst filterCategories = computed(() =>\n\tprops.filters?.map((f) => ({\n\t\tid: f.key,\n\t\tname: f.label,\n\t\tcomponentType: mapFilterType(f.type),\n\t\tdefaultProps: buildFilterProps(f),\n\t})) ?? []\n);\n\n// Convert initial filters (from URL params) to Table's filter format\nconst initialTableFilters = computed(() => {\n\tif (!props.initialFilters || !props.filters) return undefined;\n\n\tconst filterEntries = Object.entries(props.initialFilters).filter(\n\t\t([, value]) => value !== undefined && value !== null && value !== \"\"\n\t);\n\n\tif (filterEntries.length === 0) return undefined;\n\n\treturn {\n\t\tlogicOperator: \"and\",\n\t\tfilters: filterEntries.map(([key, value]) => {\n\t\t\tconst filterDef = props.filters?.find((f) => f.key === key);\n\t\t\treturn {\n\t\t\t\tname: key,\n\t\t\t\tlabel: filterDef?.label ?? key,\n\t\t\t\ttype: filterDef ? mapFilterType(filterDef.type) : \"uiInput\",\n\t\t\t\tvalue: String(value),\n\t\t\t};\n\t\t}),\n\t};\n});\n\n// Build row actions for table\nconst rowActions = computed(() => {\n\tif (!props.actions || props.actions.length === 0) return undefined;\n\n\treturn props.actions.map((action) => {\n\t\tif (typeof action === \"string\") {\n\t\t\treturn { name: action, id: action };\n\t\t}\n\t\treturn { name: action.label, id: action.id };\n\t});\n});\n\n// Build bulk action buttons\nconst bulkActionButtons = computed(() => {\n\tif (!props.bulkActions || !props.selectable) return undefined;\n\n\treturn props.bulkActions.map((action) => ({\n\t\ttext: action.label,\n\t\tid: action.id,\n\t\tcolor: action.variant === \"danger\" ? \"red\" : action.variant === \"warning\" ? \"yellow\" : \"blue\",\n\t\ticon: action.icon,\n\t}));\n});\n\n// Select all modal config\nconst selectAllModal = computed(() => {\n\tif (!props.selectable) return undefined;\n\treturn {\n\t\ttitle: \"Select All Items\",\n\t\tmessage: `Select all ${table.totalItems.value} items?`,\n\t\tcancelText: \"Select page only\",\n\t\tconfirmText: \"Select all\",\n\t};\n});\n\n/**\n * Format cell value based on type\n */\nfunction formatCellValue(value: any, type?: string): any {\n\tif (value === null || value === undefined) return \"\";\n\n\tswitch (type) {\n\t\tcase \"date\":\n\t\t\tif (value instanceof Date) {\n\t\t\t\treturn value.toLocaleDateString();\n\t\t\t}\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\treturn new Date(value).toLocaleDateString();\n\t\t\t}\n\t\t\treturn value;\n\n\t\tcase \"number\":\n\t\t\treturn typeof value === \"number\" ? value.toLocaleString() : value;\n\n\t\tcase \"badge\":\n\t\t\treturn { content: value, type: \"badge\" };\n\n\t\tcase \"tag\":\n\t\t\treturn { content: value, type: \"tag\" };\n\n\t\tdefault:\n\t\t\treturn value;\n\t}\n}\n\n/**\n * Map filter type to component type\n */\nfunction mapFilterType(type: string): \"uiInput\" | \"uiSelect\" {\n\tswitch (type) {\n\t\tcase \"select\":\n\t\t\treturn \"uiSelect\";\n\t\tdefault:\n\t\t\treturn \"uiInput\";\n\t}\n}\n\n/**\n * Build filter component props\n */\nfunction buildFilterProps(filter: DataTableFilter): Record<string, any> {\n\tconst defaultProps: Record<string, any> = {};\n\n\tif (filter.placeholder) {\n\t\tdefaultProps.placeholder = filter.placeholder;\n\t}\n\n\tif (filter.type === \"select\" && filter.options) {\n\t\t// uiSelect smart filter uses 'name' as the filter value and 'label' for display\n\t\t// Format: { id: unique, name: actualValue, label: displayText }\n\t\tdefaultProps.items = filter.options.map((opt, index) => ({\n\t\t\tid: String(index),\n\t\t\tname: String(opt.value), // This is what gets used as filter value\n\t\t\tlabel: opt.label, // This is what gets displayed\n\t\t}));\n\t}\n\n\tif (filter.type === \"number\") {\n\t\tdefaultProps.type = \"number\";\n\t}\n\n\treturn defaultProps;\n}\n\n/**\n * Handle table action (row action)\n */\nfunction handleTableAction(data: { action: string; items: Array<string | number> }) {\n\t// Find the item that was acted upon\n\tconst itemId = data.items[0];\n\tconst tableItem = tableItems.value.find((ti) => ti.id === itemId);\n\tif (tableItem && tableItem._originalData) {\n\t\temit(\"action\", data.action, tableItem._originalData);\n\t}\n}\n\n/**\n * Handle bulk action button click\n */\nfunction handleBulkActionClick(data: { id: string; text: string }) {\n\temit(\"bulkAction\", data.id, table.selectedItems.value);\n}\n\n/**\n * Handle custom cell emit (e.g., link clicks with emits config)\n */\nfunction handleCustomEmit(data: any) {\n\temit(\"customEmit\", data);\n}\n\n/**\n * Watch for selection changes\n */\nwatch(\n\t() => table.selectedItems.value,\n\t(items) => {\n\t\temit(\"selection\", items);\n\t},\n\t{ deep: true }\n);\n</script>\n\n<template>\n\t<Table\n\t\t:header=\"tableHeader\"\n\t\t:items=\"tableItems\"\n\t\t:loading=\"loading\"\n\t\t:current-page=\"syncUrl ? currentPage : table.currentPage.value\"\n\t\t:total-pages=\"syncUrl ? totalPages : table.totalPages.value\"\n\t\t:total-items=\"syncUrl ? totalItems : table.totalItems.value\"\n\t\t:page-size=\"syncUrl ? pageSize : table.pageSize.value\"\n\t\t:ordered-by=\"defaultSortKey ?? table.sortKey.value\"\n\t\t:order-direction=\"defaultSortOrder ?? table.sortOrder.value\"\n\t\t:smart-filter-categories=\"filterCategories\"\n\t\t:filters=\"initialTableFilters\"\n\t\t:hidden-columns=\"table.hiddenColumns.value\"\n\t\t:reset-selected=\"table.resetSelected.value\"\n\t\t:actions=\"rowActions\"\n\t\t:select-all-items-modal=\"selectAllModal\"\n\t\t:table-action-buttons=\"bulkActionButtons\"\n\t\t:no-results=\"noResults\"\n\t\t@change-page=\"handlePageChange\"\n\t\t@change-page-size=\"handlePageSizeChange\"\n\t\t@order-by=\"handleOrderBy\"\n\t\t@smart-filters-sent=\"handleFiltersApplied\"\n\t\t@smart-filters-cleared=\"handleFiltersCleared\"\n\t\t@smart-filter-deleted=\"handleFilterDeleted\"\n\t\t@columns-visibility-changed=\"table.handleColumnsVisibilityChanged\"\n\t\t@modal-action=\"table.handleModalAction\"\n\t\t@table-action=\"handleTableAction\"\n\t\t@table-action-button-clicked=\"handleBulkActionClick\"\n\t\t@custom-emit=\"handleCustomEmit\"\n\t/>\n</template>\n","/**\n * Column Definition Helpers\n *\n * Pre-built column definitions for common patterns, reducing boilerplate\n * when defining DataTable columns.\n */\n\nimport type { DataTableColumn } from \"./DataTable.vue\";\n\n/**\n * Date formatting options\n */\nexport interface DateFormatOptions {\n\tformat?: \"short\" | \"medium\" | \"long\" | \"full\";\n\tlocale?: string;\n}\n\n/**\n * Tag color function type\n */\nexport type TagColorFn<T> = (item: T) => string;\n\n/**\n * Pre-built column helpers\n */\nexport const columns = {\n\t/**\n\t * Simple text column\n\t *\n\t * @example\n\t * columns.text('name', 'Name')\n\t */\n\ttext: <T = any>(key: string, label: string, options?: { sortable?: boolean; width?: string }): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"text\",\n\t\tsortable: options?.sortable ?? true,\n\t\twidth: options?.width,\n\t}),\n\n\t/**\n\t * Number column with locale formatting\n\t *\n\t * @example\n\t * columns.number('amount', 'Amount')\n\t * columns.number('price', 'Price', { prefix: '$', decimals: 2 })\n\t */\n\tnumber: <T = any>(\n\t\tkey: string,\n\t\tlabel: string,\n\t\toptions?: { prefix?: string; suffix?: string; decimals?: number; sortable?: boolean }\n\t): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"number\",\n\t\tsortable: options?.sortable ?? true,\n\t\trender: (item: any) => {\n\t\t\tconst value = item[key];\n\t\t\tif (value === null || value === undefined) return \"\";\n\n\t\t\tconst formatted =\n\t\t\t\toptions?.decimals !== undefined\n\t\t\t\t\t? Number(value).toLocaleString(undefined, {\n\t\t\t\t\t\t\tminimumFractionDigits: options.decimals,\n\t\t\t\t\t\t\tmaximumFractionDigits: options.decimals,\n\t\t\t\t\t\t})\n\t\t\t\t\t: Number(value).toLocaleString();\n\n\t\t\treturn `${options?.prefix ?? \"\"}${formatted}${options?.suffix ?? \"\"}`;\n\t\t},\n\t}),\n\n\t/**\n\t * Date column with formatting\n\t *\n\t * @example\n\t * columns.date('createdAt', 'Created')\n\t * columns.date('updatedAt', 'Updated', { format: 'long' })\n\t */\n\tdate: <T = any>(key: string, label: string, options?: DateFormatOptions & { sortable?: boolean }): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"date\",\n\t\tsortable: options?.sortable ?? true,\n\t\trender: (item: any) => {\n\t\t\tconst value = item[key];\n\t\t\tif (!value) return \"\";\n\n\t\t\tconst date = value instanceof Date ? value : new Date(value);\n\t\t\tif (Number.isNaN(date.getTime())) return \"\";\n\n\t\t\tconst formatOptions: Intl.DateTimeFormatOptions = {\n\t\t\t\tshort: { dateStyle: \"short\" },\n\t\t\t\tmedium: { dateStyle: \"medium\" },\n\t\t\t\tlong: { dateStyle: \"long\" },\n\t\t\t\tfull: { dateStyle: \"full\" },\n\t\t\t}[options?.format ?? \"medium\"] as Intl.DateTimeFormatOptions;\n\n\t\t\treturn date.toLocaleDateString(options?.locale, formatOptions);\n\t\t},\n\t}),\n\n\t/**\n\t * DateTime column with formatting\n\t *\n\t * @example\n\t * columns.dateTime('createdAt', 'Created At')\n\t */\n\tdateTime: <T = any>(key: string, label: string, options?: { sortable?: boolean; locale?: string }): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"date\",\n\t\tsortable: options?.sortable ?? true,\n\t\trender: (item: any) => {\n\t\t\tconst value = item[key];\n\t\t\tif (!value) return \"\";\n\n\t\t\tconst date = value instanceof Date ? value : new Date(value);\n\t\t\tif (Number.isNaN(date.getTime())) return \"\";\n\n\t\t\treturn date.toLocaleString(options?.locale, {\n\t\t\t\tdateStyle: \"medium\",\n\t\t\t\ttimeStyle: \"short\",\n\t\t\t});\n\t\t},\n\t}),\n\n\t/**\n\t * Tag column with optional color function\n\t *\n\t * @example\n\t * columns.tag('status', 'Status')\n\t * columns.tag('status', 'Status', (item) => item.active ? 'green' : 'red')\n\t */\n\ttag: <T = any>(key: string, label: string, colorFn?: TagColorFn<T>, options?: { sortable?: boolean }): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"tag\",\n\t\tsortable: options?.sortable ?? true,\n\t\trender: (item: T) => {\n\t\t\tconst value = (item as any)[key];\n\t\t\treturn {\n\t\t\t\tcontent: value,\n\t\t\t\tcolor: colorFn?.(item) ?? \"gray\",\n\t\t\t\ttype: \"tag\",\n\t\t\t};\n\t\t},\n\t}),\n\n\t/**\n\t * Badge column (numeric badge style)\n\t *\n\t * @example\n\t * columns.badge('count', 'Count')\n\t * columns.badge('brandCount', 'Brands')\n\t */\n\tbadge: <T = any>(key: string, label: string, options?: { sortable?: boolean }): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"badge\",\n\t\tsortable: options?.sortable ?? true,\n\t\trender: (item: any) => ({\n\t\t\tcontent: item[key],\n\t\t\ttype: \"badge\",\n\t\t}),\n\t}),\n\n\t/**\n\t * Boolean column rendered as tag\n\t *\n\t * @example\n\t * columns.boolean('active', 'Active')\n\t * columns.boolean('verified', 'Verified', { trueLabel: 'Yes', falseLabel: 'No' })\n\t */\n\tboolean: <T = any>(\n\t\tkey: string,\n\t\tlabel: string,\n\t\toptions?: { trueLabel?: string; falseLabel?: string; trueColor?: string; falseColor?: string; sortable?: boolean }\n\t): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"tag\",\n\t\tsortable: options?.sortable ?? true,\n\t\trender: (item: any) => {\n\t\t\tconst value = Boolean(item[key]);\n\t\t\treturn {\n\t\t\t\tcontent: value ? (options?.trueLabel ?? \"Yes\") : (options?.falseLabel ?? \"No\"),\n\t\t\t\tcolor: value ? (options?.trueColor ?? \"green\") : (options?.falseColor ?? \"red\"),\n\t\t\t\ttype: \"tag\",\n\t\t\t};\n\t\t},\n\t}),\n\n\t/**\n\t * Email column (renders as link)\n\t *\n\t * @example\n\t * columns.email('email', 'Email')\n\t */\n\temail: <T = any>(key: string, label: string, options?: { sortable?: boolean }): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"text\",\n\t\tsortable: options?.sortable ?? true,\n\t\trender: (item: any) => ({\n\t\t\tcontent: item[key],\n\t\t\ttype: \"link\",\n\t\t\thref: `mailto:${item[key]}`,\n\t\t}),\n\t}),\n\n\t/**\n\t * Actions column (row actions)\n\t *\n\t * @example\n\t * columns.actions(['view', 'edit', 'delete'])\n\t */\n\tactions: <T = any>(actions: string[]): DataTableColumn<T> => ({\n\t\tkey: \"_actions\",\n\t\tlabel: \"\",\n\t\tsortable: false,\n\t\trender: () => actions,\n\t}),\n\n\t/**\n\t * Custom render column\n\t *\n\t * @example\n\t * columns.custom('fullName', 'Name', (item) => `${item.firstName} ${item.lastName}`)\n\t */\n\tcustom: <T = any>(\n\t\tkey: string,\n\t\tlabel: string,\n\t\trender: (item: T, index: number) => any,\n\t\toptions?: { sortable?: boolean; width?: string }\n\t): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\tsortable: options?.sortable ?? false,\n\t\twidth: options?.width,\n\t\trender,\n\t}),\n\n\t/**\n\t * Truncated text column\n\t *\n\t * @example\n\t * columns.truncate('description', 'Description', 50)\n\t */\n\ttruncate: <T = any>(key: string, label: string, maxLength: number, options?: { sortable?: boolean }): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"text\",\n\t\tsortable: options?.sortable ?? true,\n\t\trender: (item: any) => {\n\t\t\tconst value = String(item[key] ?? \"\");\n\t\t\tif (value.length <= maxLength) return value;\n\t\t\treturn `${value.substring(0, maxLength)}...`;\n\t\t},\n\t}),\n\n\t/**\n\t * Image column\n\t *\n\t * @example\n\t * columns.image('avatar', 'Avatar', { size: 32 })\n\t */\n\timage: <T = any>(key: string, label: string, options?: { size?: number; fallback?: string }): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\tsortable: false,\n\t\trender: (item: any) => ({\n\t\t\tcontent: item[key] || options?.fallback,\n\t\t\ttype: \"image\",\n\t\t\tsize: options?.size ?? 32,\n\t\t}),\n\t}),\n\n\t/**\n\t * Progress column\n\t *\n\t * @example\n\t * columns.progress('completion', 'Progress')\n\t */\n\tprogress: <T = any>(key: string, label: string, options?: { max?: number; sortable?: boolean }): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"number\",\n\t\tsortable: options?.sortable ?? true,\n\t\trender: (item: any) => ({\n\t\t\tcontent: item[key],\n\t\t\ttype: \"progress\",\n\t\t\tmax: options?.max ?? 100,\n\t\t}),\n\t}),\n\n\t/**\n\t * Clickable link column that emits an action\n\t *\n\t * @example\n\t * // Simple link with action\n\t * columns.link('name', 'Campaign Name', (item) => ({\n\t * action: 'view',\n\t * data: { id: item.id }\n\t * }))\n\t *\n\t * // Link with custom emit handler in parent\n\t * columns.link('title', 'Title', (item) => ({\n\t * action: 'openDetails',\n\t * data: item\n\t * }))\n\t */\n\tlink: <T = any>(\n\t\tkey: string,\n\t\tlabel: string,\n\t\temitConfig: (item: T) => { action: string; data: any },\n\t\toptions?: { sortable?: boolean; width?: string }\n\t): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\tsortable: options?.sortable ?? true,\n\t\twidth: options?.width,\n\t\trender: (item: T) => ({\n\t\t\tcontent: (item as any)[key],\n\t\t\ttype: \"link\",\n\t\t\temits: emitConfig(item),\n\t\t}),\n\t}),\n\n\t/**\n\t * Link to external URL\n\t *\n\t * @example\n\t * columns.externalLink('website', 'Website')\n\t * columns.externalLink('url', 'URL', { newTab: true })\n\t */\n\texternalLink: <T = any>(\n\t\tkey: string,\n\t\tlabel: string,\n\t\toptions?: { sortable?: boolean; newTab?: boolean; displayKey?: string }\n\t): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\tsortable: options?.sortable ?? true,\n\t\trender: (item: any) => {\n\t\t\tconst url = item[key];\n\t\t\tconst display = options?.displayKey ? item[options.displayKey] : url;\n\t\t\treturn {\n\t\t\t\tcontent: display,\n\t\t\t\ttype: \"link\",\n\t\t\t\thref: url,\n\t\t\t\ttarget: options?.newTab ? \"_blank\" : undefined,\n\t\t\t};\n\t\t},\n\t}),\n\n\t/**\n\t * Relative time column (e.g., \"2 hours ago\")\n\t *\n\t * @example\n\t * columns.relativeTime('updatedAt', 'Last Updated')\n\t */\n\trelativeTime: <T = any>(key: string, label: string, options?: { sortable?: boolean; locale?: string }): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"date\",\n\t\tsortable: options?.sortable ?? true,\n\t\trender: (item: any) => {\n\t\t\tconst value = item[key];\n\t\t\tif (!value) return \"\";\n\n\t\t\tconst date = value instanceof Date ? value : new Date(value);\n\t\t\tif (Number.isNaN(date.getTime())) return \"\";\n\n\t\t\tconst now = new Date();\n\t\t\tconst diffMs = now.getTime() - date.getTime();\n\t\t\tconst diffSecs = Math.floor(diffMs / 1000);\n\t\t\tconst diffMins = Math.floor(diffSecs / 60);\n\t\t\tconst diffHours = Math.floor(diffMins / 60);\n\t\t\tconst diffDays = Math.floor(diffHours / 24);\n\n\t\t\tif (diffSecs < 60) return \"Just now\";\n\t\t\tif (diffMins < 60) return `${diffMins}m ago`;\n\t\t\tif (diffHours < 24) return `${diffHours}h ago`;\n\t\t\tif (diffDays < 7) return `${diffDays}d ago`;\n\n\t\t\treturn date.toLocaleDateString(options?.locale);\n\t\t},\n\t}),\n\n\t/**\n\t * User/Avatar column with name and optional subtitle\n\t *\n\t * @example\n\t * columns.user('assignee', 'Assigned To', { avatarKey: 'avatar', subtitleKey: 'email' })\n\t */\n\tuser: <T = any>(\n\t\tkey: string,\n\t\tlabel: string,\n\t\toptions?: { avatarKey?: string; subtitleKey?: string; sortable?: boolean }\n\t): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\tsortable: options?.sortable ?? true,\n\t\trender: (item: any) => ({\n\t\t\tcontent: item[key],\n\t\t\ttype: \"guest\",\n\t\t\tavatar: options?.avatarKey ? item[options.avatarKey] : undefined,\n\t\t\tsubtitle: options?.subtitleKey ? item[options.subtitleKey] : undefined,\n\t\t}),\n\t}),\n\n\t/**\n\t * Currency column with formatting\n\t *\n\t * @example\n\t * columns.currency('amount', 'Total', { currency: 'EUR' })\n\t * columns.currency('price', 'Price', { currency: 'USD', locale: 'en-US' })\n\t */\n\tcurrency: <T = any>(\n\t\tkey: string,\n\t\tlabel: string,\n\t\toptions?: { currency?: string; locale?: string; sortable?: boolean }\n\t): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"number\",\n\t\tsortable: options?.sortable ?? true,\n\t\trender: (item: any) => {\n\t\t\tconst value = item[key];\n\t\t\tif (value === null || value === undefined) return \"\";\n\n\t\t\treturn new Intl.NumberFormat(options?.locale ?? \"en-US\", {\n\t\t\t\tstyle: \"currency\",\n\t\t\t\tcurrency: options?.currency ?? \"EUR\",\n\t\t\t}).format(Number(value));\n\t\t},\n\t}),\n\n\t/**\n\t * Percentage column\n\t *\n\t * @example\n\t * columns.percentage('openRate', 'Open Rate')\n\t * columns.percentage('completion', 'Progress', { decimals: 0 })\n\t */\n\tpercentage: <T = any>(\n\t\tkey: string,\n\t\tlabel: string,\n\t\toptions?: { decimals?: number; sortable?: boolean; multiply?: boolean }\n\t): DataTableColumn<T> => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"number\",\n\t\tsortable: options?.sortable ?? true,\n\t\trender: (item: any) => {\n\t\t\tconst value = item[key];\n\t\t\tif (value === null || value === undefined) return \"\";\n\n\t\t\t// If multiply is true, assume value is 0-1 and needs *100\n\t\t\tconst numValue = options?.multiply ? Number(value) * 100 : Number(value);\n\t\t\treturn `${numValue.toFixed(options?.decimals ?? 1)}%`;\n\t\t},\n\t}),\n};\n\n/**\n * Status color mappings for common status values\n */\nexport const statusColors: Record<string, string> = {\n\tactive: \"green\",\n\tinactive: \"gray\",\n\tpending: \"yellow\",\n\tapproved: \"green\",\n\trejected: \"red\",\n\tdraft: \"gray\",\n\tpublished: \"green\",\n\tarchived: \"gray\",\n\terror: \"red\",\n\tsuccess: \"green\",\n\twarning: \"yellow\",\n\tinfo: \"blue\",\n};\n\n/**\n * Get color for a status value\n *\n * @example\n * columns.tag('status', 'Status', (item) => getStatusColor(item.status))\n */\nexport function getStatusColor(status: string): string {\n\treturn statusColors[status?.toLowerCase()] ?? \"gray\";\n}\n\n/**\n * Create a status color function for a specific key\n *\n * @example\n * columns.tag('status', 'Status', createStatusColorFn('status'))\n */\nexport function createStatusColorFn<T>(key: keyof T): TagColorFn<T> {\n\treturn (item: T) => getStatusColor(String(item[key]));\n}\n","/**\n * Filter Definition Helpers\n *\n * Pre-built filter definitions for common patterns, reducing boilerplate\n * when defining DataTable filters.\n */\n\nimport type { DataTableFilter } from \"./DataTable.vue\";\n\n/**\n * Filter option for select filters\n */\nexport interface FilterOption {\n\tlabel: string;\n\tvalue: string | number | boolean;\n}\n\n/**\n * Common status options\n */\nexport const statusOptions: FilterOption[] = [\n\t{ label: \"Active\", value: \"active\" },\n\t{ label: \"Inactive\", value: \"inactive\" },\n\t{ label: \"Pending\", value: \"pending\" },\n\t{ label: \"Archived\", value: \"archived\" },\n];\n\n/**\n * Boolean options\n */\nexport const booleanOptions: FilterOption[] = [\n\t{ label: \"Yes\", value: \"true\" },\n\t{ label: \"No\", value: \"false\" },\n];\n\n/**\n * Pre-built filter helpers\n */\nexport const filters = {\n\t/**\n\t * Text search filter\n\t *\n\t * @example\n\t * filters.text('name', 'Name')\n\t * filters.text('email', 'Email', 'Search by email address...')\n\t */\n\ttext: (key: string, label: string, placeholder?: string): DataTableFilter => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"text\",\n\t\tplaceholder: placeholder ?? `Search by ${label.toLowerCase()}...`,\n\t}),\n\n\t/**\n\t * Select dropdown filter\n\t *\n\t * @example\n\t * filters.select('role', 'Role', [\n\t * { label: 'Admin', value: 'admin' },\n\t * { label: 'User', value: 'user' },\n\t * ])\n\t */\n\tselect: (key: string, label: string, options: FilterOption[]): DataTableFilter => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"select\",\n\t\toptions,\n\t}),\n\n\t/**\n\t * Status filter with common status options\n\t *\n\t * @example\n\t * filters.status()\n\t * filters.status('state', 'State')\n\t * filters.status('status', 'Status', [\n\t * { label: 'Active', value: 'active' },\n\t * { label: 'Draft', value: 'draft' },\n\t * ])\n\t */\n\tstatus: (key: string = \"status\", label: string = \"Status\", options?: FilterOption[]): DataTableFilter => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"select\",\n\t\toptions: options ?? statusOptions,\n\t}),\n\n\t/**\n\t * Boolean (Yes/No) filter\n\t *\n\t * @example\n\t * filters.boolean('verified', 'Verified')\n\t * filters.boolean('active', 'Active', 'Enabled', 'Disabled')\n\t */\n\tboolean: (key: string, label: string, trueLabel: string = \"Yes\", falseLabel: string = \"No\"): DataTableFilter => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"select\",\n\t\toptions: [\n\t\t\t{ label: trueLabel, value: \"true\" },\n\t\t\t{ label: falseLabel, value: \"false\" },\n\t\t],\n\t}),\n\n\t/**\n\t * Number filter\n\t *\n\t * @example\n\t * filters.number('age', 'Age')\n\t * filters.number('amount', 'Amount', 'Enter amount...')\n\t */\n\tnumber: (key: string, label: string, placeholder?: string): DataTableFilter => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"number\",\n\t\tplaceholder: placeholder ?? `Enter ${label.toLowerCase()}...`,\n\t}),\n\n\t/**\n\t * Date filter\n\t *\n\t * @example\n\t * filters.date('createdAt', 'Created Date')\n\t */\n\tdate: (key: string, label: string): DataTableFilter => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"date\",\n\t}),\n\n\t/**\n\t * Date range filter\n\t *\n\t * @example\n\t * filters.dateRange('createdAt', 'Created')\n\t */\n\tdateRange: (key: string, label: string): DataTableFilter => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"dateRange\",\n\t}),\n\n\t/**\n\t * Role filter with common role options\n\t *\n\t * @example\n\t * filters.role()\n\t * filters.role('userRole', 'User Role')\n\t */\n\trole: (key: string = \"role\", label: string = \"Role\", options?: FilterOption[]): DataTableFilter => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"select\",\n\t\toptions: options ?? [\n\t\t\t{ label: \"Admin\", value: \"admin\" },\n\t\t\t{ label: \"Manager\", value: \"manager\" },\n\t\t\t{ label: \"User\", value: \"user\" },\n\t\t\t{ label: \"Guest\", value: \"guest\" },\n\t\t],\n\t}),\n\n\t/**\n\t * Type filter (generic entity type)\n\t *\n\t * @example\n\t * filters.type('campaignType', 'Type', [\n\t * { label: 'Email', value: 'email' },\n\t * { label: 'SMS', value: 'sms' },\n\t * ])\n\t */\n\ttype: (key: string, label: string, options: FilterOption[]): DataTableFilter => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"select\",\n\t\toptions,\n\t}),\n\n\t/**\n\t * Priority filter\n\t *\n\t * @example\n\t * filters.priority()\n\t * filters.priority('urgency', 'Urgency')\n\t */\n\tpriority: (key: string = \"priority\", label: string = \"Priority\"): DataTableFilter => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"select\",\n\t\toptions: [\n\t\t\t{ label: \"Low\", value: \"low\" },\n\t\t\t{ label: \"Medium\", value: \"medium\" },\n\t\t\t{ label: \"High\", value: \"high\" },\n\t\t\t{ label: \"Critical\", value: \"critical\" },\n\t\t],\n\t}),\n\n\t/**\n\t * Category filter from dynamic options\n\t *\n\t * @example\n\t * // From array of objects\n\t * filters.fromData('categoryId', 'Category', categories, 'name', 'id')\n\t */\n\tfromData: <T extends Record<string, any>>(\n\t\tkey: string,\n\t\tlabel: string,\n\t\tdata: T[],\n\t\tlabelKey: keyof T,\n\t\tvalueKey: keyof T\n\t): DataTableFilter => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"select\",\n\t\toptions: data.map((item) => ({\n\t\t\tlabel: String(item[labelKey]),\n\t\t\tvalue: item[valueKey] as string | number,\n\t\t})),\n\t}),\n\n\t/**\n\t * Enum filter from TypeScript enum\n\t *\n\t * @example\n\t * enum Status { Active = 'active', Inactive = 'inactive' }\n\t * filters.fromEnum('status', 'Status', Status)\n\t */\n\tfromEnum: (key: string, label: string, enumObj: Record<string, string | number>): DataTableFilter => ({\n\t\tkey,\n\t\tlabel,\n\t\ttype: \"select\",\n\t\toptions: Object.entries(enumObj)\n\t\t\t.filter(([k]) => Number.isNaN(Number(k))) // Filter out numeric keys from numeric enums\n\t\t\t.map(([enumKey, enumValue]) => ({\n\t\t\t\tlabel: enumKey.replace(/([A-Z])/g, \" $1\").trim(), // Convert camelCase to Title Case\n\t\t\t\tvalue: enumValue,\n\t\t\t})),\n\t}),\n};\n\n/**\n * Create a filter group with common filters\n *\n * @example\n * const tableFilters = createFilterGroup({\n * search: ['name', 'email'],\n * status: true,\n * dateRange: 'createdAt',\n * custom: [\n * filters.role('userRole', 'Role'),\n * ],\n * });\n */\nexport interface FilterGroupConfig {\n\t/** Fields to include as text search filters */\n\tsearch?: string[];\n\t/** Include status filter */\n\tstatus?: boolean | { key?: string; label?: string; options?: FilterOption[] };\n\t/** Field for date range filter */\n\tdateRange?: string;\n\t/** Additional custom filters */\n\tcustom?: DataTableFilter[];\n}\n\nexport function createFilterGroup(config: FilterGroupConfig): DataTableFilter[] {\n\tconst result: DataTableFilter[] = [];\n\n\t// Add search filters\n\tif (config.search) {\n\t\tconfig.search.forEach((field) => {\n\t\t\tresult.push(filters.text(field, field.charAt(0).toUpperCase() + field.slice(1)));\n\t\t});\n\t}\n\n\t// Add status filter\n\tif (config.status) {\n\t\tif (typeof config.status === \"boolean\") {\n\t\t\tresult.push(filters.status());\n\t\t} else {\n\t\t\tresult.push(filters.status(config.status.key, config.status.label, config.status.options));\n\t\t}\n\t}\n\n\t// Add date range filter\n\tif (config.dateRange) {\n\t\tresult.push(filters.dateRange(config.dateRange, \"Date Range\"));\n\t}\n\n\t// Add custom filters\n\tif (config.custom) {\n\t\tresult.push(...config.custom);\n\t}\n\n\treturn result;\n}\n\n/**\n * Common filter presets for specific entity types\n */\nexport const filterPresets = {\n\t/**\n\t * Filters for user/account tables\n\t */\n\tusers: (): DataTableFilter[] => [\n\t\tfilters.text(\"name\", \"Name\"),\n\t\tfilters.text(\"email\", \"Email\"),\n\t\tfilters.role(),\n\t\tfilters.status(),\n\t],\n\n\t/**\n\t * Filters for campaign tables\n\t */\n\tcampaigns: (): DataTableFilter[] => [\n\t\tfilters.text(\"name\", \"Campaign Name\"),\n\t\tfilters.status(\"status\", \"Status\", [\n\t\t\t{ label: \"Active\", value: \"active\" },\n\t\t\t{ label: \"Draft\", value: \"draft\" },\n\t\t\t{ label: \"Completed\", value: \"completed\" },\n\t\t\t{ label: \"Archived\", value: \"archived\" },\n\t\t\t{ label: \"Failed\", value: \"failed\" },\n\t\t]),\n\t\tfilters.dateRange(\"createdAt\", \"Created Date\"),\n\t],\n\n\t/**\n\t * Filters for contact tables\n\t */\n\tcontacts: (): DataTableFilter[] => [\n\t\tfilters.text(\"name\", \"Name\"),\n\t\tfilters.text(\"email\", \"Email\"),\n\t\tfilters.text(\"phone\", \"Phone\"),\n\t\tfilters.status(),\n\t],\n\n\t/**\n\t * Filters for booking/reservation tables\n\t */\n\tbookings: (): DataTableFilter[] => [\n\t\tfilters.text(\"guestName\", \"Guest Name\"),\n\t\tfilters.text(\"confirmationNumber\", \"Confirmation #\"),\n\t\tfilters.status(\"status\", \"Status\", [\n\t\t\t{ label: \"Confirmed\", value: \"confirmed\" },\n\t\t\t{ label: \"Pending\", value: \"pending\" },\n\t\t\t{ label: \"Cancelled\", value: \"cancelled\" },\n\t\t\t{ label: \"Completed\", value: \"completed\" },\n\t\t]),\n\t\tfilters.dateRange(\"checkIn\", \"Check-in Date\"),\n\t],\n\n\t/**\n\t * Filters for audit/log tables\n\t */\n\tauditLogs: (): DataTableFilter[] => [\n\t\tfilters.text(\"action\", \"Action\"),\n\t\tfilters.text(\"user\", \"User\"),\n\t\tfilters.dateRange(\"timestamp\", \"Date\"),\n\t],\n};\n"],"names":["filters","_createBlock","_unref","_openBlock","_createElementBlock","_toDisplayString","_Fragment","_renderList","_renderSlot"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
let clean = Symbol("clean");
|
|
2
|
+
let listenerQueue = [];
|
|
3
|
+
let lqIndex = 0;
|
|
4
|
+
const QUEUE_ITEMS_PER_LISTENER = 4;
|
|
5
|
+
const atom = /* @__NO_SIDE_EFFECTS__ */ (initialValue) => {
|
|
6
|
+
let listeners = [];
|
|
7
|
+
let $atom = {
|
|
8
|
+
get() {
|
|
9
|
+
if (!$atom.lc) {
|
|
10
|
+
$atom.listen(() => {
|
|
11
|
+
})();
|
|
12
|
+
}
|
|
13
|
+
return $atom.value;
|
|
14
|
+
},
|
|
15
|
+
lc: 0,
|
|
16
|
+
listen(listener) {
|
|
17
|
+
$atom.lc = listeners.push(listener);
|
|
18
|
+
return () => {
|
|
19
|
+
for (let i = lqIndex + QUEUE_ITEMS_PER_LISTENER; i < listenerQueue.length; ) {
|
|
20
|
+
if (listenerQueue[i] === listener) {
|
|
21
|
+
listenerQueue.splice(i, QUEUE_ITEMS_PER_LISTENER);
|
|
22
|
+
} else {
|
|
23
|
+
i += QUEUE_ITEMS_PER_LISTENER;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
let index = listeners.indexOf(listener);
|
|
27
|
+
if (~index) {
|
|
28
|
+
listeners.splice(index, 1);
|
|
29
|
+
if (!--$atom.lc) $atom.off();
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
},
|
|
33
|
+
notify(oldValue, changedKey) {
|
|
34
|
+
let runListenerQueue = !listenerQueue.length;
|
|
35
|
+
for (let listener of listeners) {
|
|
36
|
+
listenerQueue.push(listener, $atom.value, oldValue, changedKey);
|
|
37
|
+
}
|
|
38
|
+
if (runListenerQueue) {
|
|
39
|
+
for (lqIndex = 0; lqIndex < listenerQueue.length; lqIndex += QUEUE_ITEMS_PER_LISTENER) {
|
|
40
|
+
listenerQueue[lqIndex](
|
|
41
|
+
listenerQueue[lqIndex + 1],
|
|
42
|
+
listenerQueue[lqIndex + 2],
|
|
43
|
+
listenerQueue[lqIndex + 3]
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
listenerQueue.length = 0;
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
/* It will be called on last listener unsubscribing.
|
|
50
|
+
We will redefine it in onMount and onStop. */
|
|
51
|
+
off() {
|
|
52
|
+
},
|
|
53
|
+
set(newValue) {
|
|
54
|
+
let oldValue = $atom.value;
|
|
55
|
+
if (oldValue !== newValue) {
|
|
56
|
+
$atom.value = newValue;
|
|
57
|
+
$atom.notify(oldValue);
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
subscribe(listener) {
|
|
61
|
+
let unbind = $atom.listen(listener);
|
|
62
|
+
listener($atom.value);
|
|
63
|
+
return unbind;
|
|
64
|
+
},
|
|
65
|
+
value: initialValue
|
|
66
|
+
};
|
|
67
|
+
if (process.env.NODE_ENV !== "production") {
|
|
68
|
+
$atom[clean] = () => {
|
|
69
|
+
listeners = [];
|
|
70
|
+
$atom.lc = 0;
|
|
71
|
+
$atom.off();
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return $atom;
|
|
75
|
+
};
|
|
76
|
+
export {
|
|
77
|
+
atom as a
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=index-DGO_pNgG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-DGO_pNgG.js","sources":["../../../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/clean-stores/index.js","../../../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/atom/index.js"],"sourcesContent":["import { cleanTasks } from '../task/index.js'\n\nexport let clean = Symbol('clean')\n\nexport let cleanStores = (...stores) => {\n if (process.env.NODE_ENV === 'production') {\n throw new Error(\n 'cleanStores() can be used only during development or tests'\n )\n }\n cleanTasks()\n for (let $store of stores) {\n if ($store) {\n if ($store.mocked) delete $store.mocked\n if ($store[clean]) $store[clean]()\n }\n }\n}\n","import { clean } from '../clean-stores/index.js'\n\nlet listenerQueue = []\nlet lqIndex = 0\nconst QUEUE_ITEMS_PER_LISTENER = 4\nexport let epoch = 0\n\n/* @__NO_SIDE_EFFECTS__ */\nexport const atom = initialValue => {\n let listeners = []\n let $atom = {\n get() {\n if (!$atom.lc) {\n $atom.listen(() => {})()\n }\n return $atom.value\n },\n lc: 0,\n listen(listener) {\n $atom.lc = listeners.push(listener)\n\n return () => {\n for (\n let i = lqIndex + QUEUE_ITEMS_PER_LISTENER;\n i < listenerQueue.length;\n\n ) {\n if (listenerQueue[i] === listener) {\n listenerQueue.splice(i, QUEUE_ITEMS_PER_LISTENER)\n } else {\n i += QUEUE_ITEMS_PER_LISTENER\n }\n }\n\n let index = listeners.indexOf(listener)\n if (~index) {\n listeners.splice(index, 1)\n if (!--$atom.lc) $atom.off()\n }\n }\n },\n notify(oldValue, changedKey) {\n epoch++\n let runListenerQueue = !listenerQueue.length\n for (let listener of listeners) {\n listenerQueue.push(listener, $atom.value, oldValue, changedKey)\n }\n\n if (runListenerQueue) {\n for (\n lqIndex = 0;\n lqIndex < listenerQueue.length;\n lqIndex += QUEUE_ITEMS_PER_LISTENER\n ) {\n listenerQueue[lqIndex](\n listenerQueue[lqIndex + 1],\n listenerQueue[lqIndex + 2],\n listenerQueue[lqIndex + 3]\n )\n }\n listenerQueue.length = 0\n }\n },\n /* It will be called on last listener unsubscribing.\n We will redefine it in onMount and onStop. */\n off() {},\n set(newValue) {\n let oldValue = $atom.value\n if (oldValue !== newValue) {\n $atom.value = newValue\n $atom.notify(oldValue)\n }\n },\n subscribe(listener) {\n let unbind = $atom.listen(listener)\n listener($atom.value)\n return unbind\n },\n value: initialValue\n }\n\n if (process.env.NODE_ENV !== 'production') {\n $atom[clean] = () => {\n listeners = []\n $atom.lc = 0\n $atom.off()\n }\n }\n\n return $atom\n}\n\nexport const readonlyType = store => store\n"],"names":[],"mappings":"AAEO,IAAI,QAAQ,OAAO,OAAO;ACAjC,IAAI,gBAAgB,CAAA;AACpB,IAAI,UAAU;AACd,MAAM,2BAA2B;AAIrB,MAAC,kCAAO,kBAAgB;AAClC,MAAI,YAAY,CAAA;AAChB,MAAI,QAAQ;AAAA,IACV,MAAM;AACJ,UAAI,CAAC,MAAM,IAAI;AACb,cAAM,OAAO,MAAM;AAAA,QAAC,CAAC,EAAC;AAAA,MACxB;AACA,aAAO,MAAM;AAAA,IACf;AAAA,IACA,IAAI;AAAA,IACJ,OAAO,UAAU;AACf,YAAM,KAAK,UAAU,KAAK,QAAQ;AAElC,aAAO,MAAM;AACX,iBACM,IAAI,UAAU,0BAClB,IAAI,cAAc,UAElB;AACA,cAAI,cAAc,CAAC,MAAM,UAAU;AACjC,0BAAc,OAAO,GAAG,wBAAwB;AAAA,UAClD,OAAO;AACL,iBAAK;AAAA,UACP;AAAA,QACF;AAEA,YAAI,QAAQ,UAAU,QAAQ,QAAQ;AACtC,YAAI,CAAC,OAAO;AACV,oBAAU,OAAO,OAAO,CAAC;AACzB,cAAI,CAAC,EAAE,MAAM,GAAI,OAAM,IAAG;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO,UAAU,YAAY;AAE3B,UAAI,mBAAmB,CAAC,cAAc;AACtC,eAAS,YAAY,WAAW;AAC9B,sBAAc,KAAK,UAAU,MAAM,OAAO,UAAU,UAAU;AAAA,MAChE;AAEA,UAAI,kBAAkB;AACpB,aACE,UAAU,GACV,UAAU,cAAc,QACxB,WAAW,0BACX;AACA,wBAAc,OAAO;AAAA,YACnB,cAAc,UAAU,CAAC;AAAA,YACzB,cAAc,UAAU,CAAC;AAAA,YACzB,cAAc,UAAU,CAAC;AAAA,UACrC;AAAA,QACQ;AACA,sBAAc,SAAS;AAAA,MACzB;AAAA,IACF;AAAA;AAAA;AAAA,IAGA,MAAM;AAAA,IAAC;AAAA,IACP,IAAI,UAAU;AACZ,UAAI,WAAW,MAAM;AACrB,UAAI,aAAa,UAAU;AACzB,cAAM,QAAQ;AACd,cAAM,OAAO,QAAQ;AAAA,MACvB;AAAA,IACF;AAAA,IACA,UAAU,UAAU;AAClB,UAAI,SAAS,MAAM,OAAO,QAAQ;AAClC,eAAS,MAAM,KAAK;AACpB,aAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,EACX;AAEE,MAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,UAAM,KAAK,IAAI,MAAM;AACnB,kBAAY,CAAA;AACZ,YAAM,KAAK;AACX,YAAM,IAAG;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AACT;","x_google_ignoreList":[0,1]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { shallowRef, getCurrentScope, onScopeDispose, readonly, getCurrentInstance } from "vue";
|
|
2
|
+
function registerStore(store) {
|
|
3
|
+
let instance = getCurrentInstance();
|
|
4
|
+
if (instance && instance.proxy) {
|
|
5
|
+
let vm = instance.proxy;
|
|
6
|
+
let cache = "_nanostores" in vm ? vm._nanostores : vm._nanostores = [];
|
|
7
|
+
cache.push(store);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function useStore(store) {
|
|
11
|
+
let state = shallowRef();
|
|
12
|
+
let unsubscribe = store.subscribe((value) => {
|
|
13
|
+
state.value = value;
|
|
14
|
+
});
|
|
15
|
+
getCurrentScope() && onScopeDispose(unsubscribe);
|
|
16
|
+
if (process.env.NODE_ENV !== "production") {
|
|
17
|
+
registerStore(store);
|
|
18
|
+
return readonly(state);
|
|
19
|
+
}
|
|
20
|
+
return state;
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
useStore as u
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=index-QK97OdqQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-QK97OdqQ.js","sources":["../../../node_modules/.pnpm/@nanostores+vue@1.0.1_@nanostores+logger@1.0.0_nanostores@1.1.0__nanostores@1.1.0_vue@3.5.25_typescript@5.9.3_/node_modules/@nanostores/vue/use-store/index.js"],"sourcesContent":["import {\n getCurrentInstance,\n getCurrentScope,\n onScopeDispose,\n readonly,\n shallowRef\n} from 'vue'\n\nexport function registerStore(store) {\n let instance = getCurrentInstance()\n if (instance && instance.proxy) {\n let vm = instance.proxy\n let cache = '_nanostores' in vm ? vm._nanostores : (vm._nanostores = [])\n cache.push(store)\n }\n}\n\nexport function useStore(store) {\n let state = shallowRef()\n\n let unsubscribe = store.subscribe(value => {\n state.value = value\n })\n\n getCurrentScope() && onScopeDispose(unsubscribe)\n\n if (process.env.NODE_ENV !== 'production') {\n registerStore(store)\n return readonly(state)\n }\n return state\n}\n"],"names":[],"mappings":";AAQO,SAAS,cAAc,OAAO;AACnC,MAAI,WAAW,mBAAkB;AACjC,MAAI,YAAY,SAAS,OAAO;AAC9B,QAAI,KAAK,SAAS;AAClB,QAAI,QAAQ,iBAAiB,KAAK,GAAG,cAAe,GAAG,cAAc,CAAA;AACrE,UAAM,KAAK,KAAK;AAAA,EAClB;AACF;AAEO,SAAS,SAAS,OAAO;AAC9B,MAAI,QAAQ,WAAU;AAEtB,MAAI,cAAc,MAAM,UAAU,WAAS;AACzC,UAAM,QAAQ;AAAA,EAChB,CAAC;AAED,kBAAe,KAAM,eAAe,WAAW;AAE/C,MAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,kBAAc,KAAK;AACnB,WAAO,SAAS,KAAK;AAAA,EACvB;AACA,SAAO;AACT;","x_google_ignoreList":[0]}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { b, _, c, a, T, k, d, i, e, h, f, g, s, j } from "./filterHelpers-DgRyoYSa.js";
|
|
2
|
+
import { a as a2, _ as _2 } from "./DateRange.vue_vue_type_script_setup_true_lang-BLVg1Hah.js";
|
|
3
|
+
import { a as a3, B, _ as _3, T as T2 } from "./AdminWrapper.vue_vue_type_script_setup_true_lang-B32IylcT.js";
|
|
4
|
+
import { c as c2, a as a4, _ as _4, b as b2 } from "./Alert.vue_vue_type_script_setup_true_lang-DxPCS-Hx.js";
|
|
5
|
+
import { a as a5, _ as _5, c as c3, b as b3 } from "./ProductBadge.vue_vue_type_script_setup_true_lang-Cmr2f4Cy.js";
|
|
6
|
+
import { u } from "./useTable-DutR1gkg.js";
|
|
7
|
+
import { k as k2, $, P, p, n, q, v, j as j2, s as s2, o, w, r, y, b as b4, z, c as c4, t, g as g2, f as f2, i as i2, x, u as u2, d as d2, e as e2, m, a as a6, h as h2, l } from "./useAdminPage-GhgXp0x8.js";
|
|
8
|
+
export {
|
|
9
|
+
k2 as $currentBrand,
|
|
10
|
+
$ as $user,
|
|
11
|
+
a3 as AdminWrapper,
|
|
12
|
+
c2 as Alert,
|
|
13
|
+
a5 as BrandCard,
|
|
14
|
+
_5 as BrandSelector,
|
|
15
|
+
B as Breadcrumbs,
|
|
16
|
+
b as Chart,
|
|
17
|
+
_ as DataList,
|
|
18
|
+
c as DataTable,
|
|
19
|
+
a2 as DateRange,
|
|
20
|
+
a4 as Drawer,
|
|
21
|
+
_2 as JsonSchemaForm,
|
|
22
|
+
_4 as Modal,
|
|
23
|
+
b2 as Notification,
|
|
24
|
+
P as PAGE_CONTEXT_KEY,
|
|
25
|
+
c3 as ProductBadge,
|
|
26
|
+
a as SearchableSelect,
|
|
27
|
+
_3 as Stepper,
|
|
28
|
+
T as Table,
|
|
29
|
+
T2 as Tabs,
|
|
30
|
+
b3 as UserAvatar,
|
|
31
|
+
p as averageStat,
|
|
32
|
+
k as booleanOptions,
|
|
33
|
+
d as columns,
|
|
34
|
+
n as countStat,
|
|
35
|
+
i as createFilterGroup,
|
|
36
|
+
e as createStatusColorFn,
|
|
37
|
+
h as filterPresets,
|
|
38
|
+
f as filters,
|
|
39
|
+
g as getStatusColor,
|
|
40
|
+
q as percentageStat,
|
|
41
|
+
v as resetGlobalConfirmation,
|
|
42
|
+
j2 as setCurrentBrand,
|
|
43
|
+
s2 as setUser,
|
|
44
|
+
s as statusColors,
|
|
45
|
+
j as statusOptions,
|
|
46
|
+
o as sumStat,
|
|
47
|
+
w as useAdminPage,
|
|
48
|
+
r as useConfirmation,
|
|
49
|
+
y as useDetailPage,
|
|
50
|
+
b4 as useForm,
|
|
51
|
+
z as useFormPage,
|
|
52
|
+
c4 as useFormValidation,
|
|
53
|
+
t as useGlobalConfirmation,
|
|
54
|
+
g2 as useHasAccessToAccount,
|
|
55
|
+
f2 as useHasAccessToBrand,
|
|
56
|
+
i2 as useHasRole,
|
|
57
|
+
x as useListPage,
|
|
58
|
+
u2 as useModal,
|
|
59
|
+
d2 as useNotifications,
|
|
60
|
+
e2 as usePageContext,
|
|
61
|
+
m as useStats,
|
|
62
|
+
u as useTable,
|
|
63
|
+
a6 as useTabs,
|
|
64
|
+
h2 as useUserRoles,
|
|
65
|
+
l as useWizard
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { a as atom } from "../index-DGO_pNgG.js";
|
|
2
|
+
const $user = atom(null);
|
|
3
|
+
function setUser(user) {
|
|
4
|
+
$user.set(user);
|
|
5
|
+
}
|
|
6
|
+
function clearUser() {
|
|
7
|
+
$user.set(null);
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
$user,
|
|
11
|
+
clearUser,
|
|
12
|
+
setUser
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/stores/user.ts"],"sourcesContent":["/**\n * User Store\n * \n * Nanostore for sharing user data across components\n * without props (lower hydration cost)\n */\n\nimport { atom } from 'nanostores';\n\nexport interface User {\n\tusername?: string;\n\temail?: string;\n\tavatar?: string;\n\tisAdmin?: boolean;\n\tattributes?: {\n\t\temail?: string;\n\t\t[key: string]: any;\n\t};\n\t[key: string]: any;\n}\n\n// User store\nexport const $user = atom<User | null>(null);\n\n// Helper function to set user\nexport function setUser(user: User | null) {\n\t$user.set(user);\n}\n\n// Helper function to clear user\nexport function clearUser() {\n\t$user.set(null);\n}\n"],"names":[],"mappings":";AAsBO,MAAM,QAAQ,KAAkB,IAAI;AAGpC,SAAS,QAAQ,MAAmB;AAC1C,QAAM,IAAI,IAAI;AACf;AAGO,SAAS,YAAY;AAC3B,QAAM,IAAI,IAAI;AACf;"}
|