@htlkg/components 0.0.11 → 0.0.13
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/dist/{AdminWrapper.vue_vue_type_script_setup_true_lang-B32IylcT.js → AdminWrapper.vue_vue_type_script_setup_true_lang-BhnWQ-b0.js} +26 -29
- package/dist/AdminWrapper.vue_vue_type_script_setup_true_lang-BhnWQ-b0.js.map +1 -0
- package/dist/Alert.vue_vue_type_script_setup_true_lang-DxPCS-Hx.js.map +1 -1
- package/dist/DateRange.vue_vue_type_script_setup_true_lang-BLVg1Hah.js.map +1 -1
- package/dist/ProductBadge.vue_vue_type_script_setup_true_lang-Cmr2f4Cy.js.map +1 -1
- package/dist/components.css +4 -4
- package/dist/composables/index.js +23 -22
- package/dist/data/index.js +10 -10
- package/dist/{filterHelpers-DgRyoYSa.js → filterHelpers-DpHSlTuh.js} +11 -11
- package/dist/filterHelpers-DpHSlTuh.js.map +1 -0
- package/dist/index-QK97OdqQ.js.map +1 -1
- package/dist/index.js +34 -33
- package/dist/navigation/index.js +1 -1
- package/dist/{useAdminPage-GhgXp0x8.js → useAdminPage-AgWRvw6o.js} +150 -26
- package/dist/useAdminPage-AgWRvw6o.js.map +1 -0
- package/package.json +3 -3
- package/src/composables/index.ts +1 -0
- package/src/composables/useJsonForm.test.ts +272 -0
- package/src/composables/useJsonForm.ts +261 -0
- package/src/composables/useModal.test.ts +264 -0
- package/src/composables/useModal.ts +54 -8
- package/src/data/Chart/index.ts +2 -0
- package/src/data/DataList/index.ts +1 -0
- package/src/data/{DataTable.vue → DataTable/DataTable.vue} +2 -2
- package/src/data/DataTable/index.ts +8 -0
- package/src/data/SearchableSelect/index.ts +1 -0
- package/src/data/Table/index.ts +1 -0
- package/src/data/index.ts +5 -15
- package/src/domain/BrandCard/index.ts +1 -0
- package/src/domain/BrandSelector/index.ts +1 -0
- package/src/domain/ProductBadge/index.ts +1 -0
- package/src/domain/UserAvatar/index.ts +1 -0
- package/src/domain/index.ts +4 -4
- package/src/forms/DateRange/index.ts +2 -0
- package/src/forms/JsonSchemaForm/index.ts +1 -0
- package/src/forms/index.ts +2 -3
- package/src/navigation/{AdminWrapper.vue → AdminWrapper/AdminWrapper.vue} +41 -30
- package/src/navigation/AdminWrapper/index.ts +1 -0
- package/src/navigation/Breadcrumbs/index.ts +1 -0
- package/src/navigation/Stepper/index.ts +2 -0
- package/src/navigation/Tabs/index.ts +2 -0
- package/src/navigation/index.ts +4 -6
- package/src/overlays/Alert/index.ts +1 -0
- package/src/overlays/Drawer/index.ts +1 -0
- package/src/overlays/Modal/index.ts +1 -0
- package/src/overlays/Notification/index.ts +1 -0
- package/src/overlays/index.ts +4 -4
- package/src/patterns/DASHBOARD_PAGE.md +642 -0
- package/src/patterns/DETAIL_PAGE.md +446 -0
- package/src/patterns/FORM_PAGE.md +439 -0
- package/src/patterns/LIST_PAGE.md +340 -0
- package/src/patterns/PAGE_PATTERNS.md +110 -0
- package/src/patterns/WIZARD_PAGE.md +733 -0
- package/dist/AdminWrapper.vue_vue_type_script_setup_true_lang-B32IylcT.js.map +0 -1
- package/dist/filterHelpers-DgRyoYSa.js.map +0 -1
- package/dist/useAdminPage-GhgXp0x8.js.map +0 -1
- package/src/data/Table.vue +0 -295
- /package/src/data/{Chart.demo.vue → Chart/Chart.demo.vue} +0 -0
- /package/src/data/{Chart.md → Chart/Chart.md} +0 -0
- /package/src/data/{Chart.vue → Chart/Chart.vue} +0 -0
- /package/src/data/{DataList.md → DataList/DataList.md} +0 -0
- /package/src/data/{DataList.test.ts → DataList/DataList.test.ts} +0 -0
- /package/src/data/{DataList.vue → DataList/DataList.vue} +0 -0
- /package/src/data/{SearchableSelect.md → SearchableSelect/SearchableSelect.md} +0 -0
- /package/src/data/{SearchableSelect.vue → SearchableSelect/SearchableSelect.vue} +0 -0
- /package/src/data/{Table.demo.vue → Table/Table.demo.vue} +0 -0
- /package/src/data/{Table.md → Table/Table.md} +0 -0
- /package/src/data/{Table.property.test.ts → Table/Table.property.test.ts} +0 -0
- /package/src/data/{Table.test.ts → Table/Table.test.ts} +0 -0
- /package/src/data/{Table.unit.test.ts → Table/Table.unit.test.ts} +0 -0
- /package/src/domain/{BrandCard.md → BrandCard/BrandCard.md} +0 -0
- /package/src/domain/{BrandCard.vue → BrandCard/BrandCard.vue} +0 -0
- /package/src/domain/{BrandSelector.md → BrandSelector/BrandSelector.md} +0 -0
- /package/src/domain/{BrandSelector.vue → BrandSelector/BrandSelector.vue} +0 -0
- /package/src/domain/{ProductBadge.md → ProductBadge/ProductBadge.md} +0 -0
- /package/src/domain/{ProductBadge.vue → ProductBadge/ProductBadge.vue} +0 -0
- /package/src/domain/{UserAvatar.md → UserAvatar/UserAvatar.md} +0 -0
- /package/src/domain/{UserAvatar.vue → UserAvatar/UserAvatar.vue} +0 -0
- /package/src/forms/{DateRange.demo.vue → DateRange/DateRange.demo.vue} +0 -0
- /package/src/forms/{DateRange.md → DateRange/DateRange.md} +0 -0
- /package/src/forms/{DateRange.vue → DateRange/DateRange.vue} +0 -0
- /package/src/forms/{JsonSchemaForm.demo.vue → JsonSchemaForm/JsonSchemaForm.demo.vue} +0 -0
- /package/src/forms/{JsonSchemaForm.md → JsonSchemaForm/JsonSchemaForm.md} +0 -0
- /package/src/forms/{JsonSchemaForm.property.test.ts → JsonSchemaForm/JsonSchemaForm.property.test.ts} +0 -0
- /package/src/forms/{JsonSchemaForm.test.ts → JsonSchemaForm/JsonSchemaForm.test.ts} +0 -0
- /package/src/forms/{JsonSchemaForm.unit.test.ts → JsonSchemaForm/JsonSchemaForm.unit.test.ts} +0 -0
- /package/src/forms/{JsonSchemaForm.vue → JsonSchemaForm/JsonSchemaForm.vue} +0 -0
- /package/src/navigation/{Breadcrumbs.demo.vue → Breadcrumbs/Breadcrumbs.demo.vue} +0 -0
- /package/src/navigation/{Breadcrumbs.md → Breadcrumbs/Breadcrumbs.md} +0 -0
- /package/src/navigation/{Breadcrumbs.test.ts → Breadcrumbs/Breadcrumbs.test.ts} +0 -0
- /package/src/navigation/{Breadcrumbs.vue → Breadcrumbs/Breadcrumbs.vue} +0 -0
- /package/src/navigation/{Stepper.demo.vue → Stepper/Stepper.demo.vue} +0 -0
- /package/src/navigation/{Stepper.md → Stepper/Stepper.md} +0 -0
- /package/src/navigation/{Stepper.vue → Stepper/Stepper.vue} +0 -0
- /package/src/navigation/{Tabs.demo.vue → Tabs/Tabs.demo.vue} +0 -0
- /package/src/navigation/{Tabs.md → Tabs/Tabs.md} +0 -0
- /package/src/navigation/{Tabs.test.ts → Tabs/Tabs.test.ts} +0 -0
- /package/src/navigation/{Tabs.vue → Tabs/Tabs.vue} +0 -0
- /package/src/overlays/{Alert.demo.vue → Alert/Alert.demo.vue} +0 -0
- /package/src/overlays/{Alert.md → Alert/Alert.md} +0 -0
- /package/src/overlays/{Alert.test.ts → Alert/Alert.test.ts} +0 -0
- /package/src/overlays/{Alert.vue → Alert/Alert.vue} +0 -0
- /package/src/overlays/{Drawer.md → Drawer/Drawer.md} +0 -0
- /package/src/overlays/{Drawer.test.ts → Drawer/Drawer.test.ts} +0 -0
- /package/src/overlays/{Drawer.vue → Drawer/Drawer.vue} +0 -0
- /package/src/overlays/{Modal.demo.vue → Modal/Modal.demo.vue} +0 -0
- /package/src/overlays/{Modal.md → Modal/Modal.md} +0 -0
- /package/src/overlays/{Modal.test.ts → Modal/Modal.test.ts} +0 -0
- /package/src/overlays/{Modal.vue → Modal/Modal.vue} +0 -0
- /package/src/overlays/{Notification.md → Notification/Notification.md} +0 -0
- /package/src/overlays/{Notification.test.ts → Notification/Notification.test.ts} +0 -0
- /package/src/overlays/{Notification.vue → Notification/Notification.vue} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdminWrapper.vue_vue_type_script_setup_true_lang-B32IylcT.js","sources":["../src/navigation/Tabs.vue","../src/navigation/Stepper.vue","../src/navigation/Breadcrumbs.vue","../src/navigation/AdminWrapper.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nexport interface Tab {\n id: string;\n label: string;\n count?: number;\n}\n\ninterface Props {\n tabs: Tab[];\n modelValue?: string;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: ''\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [tabId: string];\n 'tab-change': [tabId: string];\n}>();\n\n// Internal state synced with v-model\nconst currentTab = computed({\n get: () => props.modelValue || (props.tabs.length > 0 ? props.tabs[0].id : ''),\n set: (value: string) => {\n emit('update:modelValue', value);\n emit('tab-change', value);\n }\n});\n\n\n\n// Expose methods for parent components\ndefineExpose({\n setActiveTab: (tabId: string) => { currentTab.value = tabId; },\n getActiveTab: () => currentTab.value,\n nextTab: () => {\n const currentIndex = props.tabs.findIndex(t => t.id === currentTab.value);\n if (currentIndex < props.tabs.length - 1) {\n currentTab.value = props.tabs[currentIndex + 1].id;\n }\n },\n previousTab: () => {\n const currentIndex = props.tabs.findIndex(t => t.id === currentTab.value);\n if (currentIndex > 0) {\n currentTab.value = props.tabs[currentIndex - 1].id;\n }\n }\n});\n</script>\n\n<template>\n <div class=\"tabs-wrapper\">\n <div class=\"border-b border-gray-200\">\n <nav class=\"-mb-px flex space-x-8\" aria-label=\"Tabs\">\n <button\n v-for=\"tab in tabs\"\n :key=\"tab.id\"\n @click=\"currentTab = tab.id\"\n :class=\"[\n currentTab === tab.id\n ? 'border-blue-500 text-blue-600'\n : 'border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700',\n 'whitespace-nowrap border-b-2 py-4 px-1 text-sm font-medium transition-colors'\n ]\"\n :aria-current=\"currentTab === tab.id ? 'page' : undefined\"\n >\n {{ tab.label }}\n <span\n v-if=\"tab.count !== undefined && tab.count > 0\"\n :class=\"[\n currentTab === tab.id\n ? 'bg-blue-100 text-blue-600'\n : 'bg-gray-100 text-gray-900',\n 'ml-3 hidden rounded-full py-0.5 px-2.5 text-xs font-medium md:inline-block'\n ]\"\n >\n {{ tab.count }}\n </span>\n </button>\n </nav>\n </div>\n \n <div class=\"tabs-content mt-4\">\n <template v-for=\"tab in tabs\" :key=\"tab.id\">\n <div v-if=\"currentTab === tab.id\">\n <slot :name=\"tab.id\" :active-tab=\"currentTab\" />\n </div>\n </template>\n </div>\n </div>\n</template>\n\n<style scoped>\n.tabs-wrapper {\n width: 100%;\n}\n\n.tabs-content {\n margin-top: 1rem;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { uiStepsV4 } from '@hotelinking/ui';\n\nexport interface Step {\n id?: string | number;\n label: string;\n status?: 'complete' | 'current' | 'upcoming';\n valid?: boolean; // Validation state for the step\n}\n\ninterface Props {\n steps: Step[];\n currentStep?: number;\n validateOnNext?: boolean; // Enable validation when moving forward\n allowSkip?: boolean; // Allow skipping to any step regardless of validation\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n currentStep: 0,\n validateOnNext: false,\n allowSkip: false\n});\n\nconst emit = defineEmits<{\n 'step-click': [step: Step, index: number];\n 'step-completed': [step: Step];\n 'step-current': [step: Step];\n 'step-upcoming': [step: Step];\n 'validation-failed': [step: Step, index: number];\n 'update:currentStep': [index: number]; // v-model support\n}>();\n\n// Transform steps to uiStepsV4 format\nconst uiSteps = computed(() =>\n props.steps.map((step, index) => ({\n id: step.id || String(index + 1).padStart(2, '0'),\n name: step.label,\n status: step.status || (\n index < props.currentStep ? 'complete' :\n index === props.currentStep ? 'current' :\n 'upcoming'\n )\n }))\n);\n\n// Check if navigation to a step is allowed\nfunction canNavigateToStep(targetIndex: number): boolean {\n if (props.allowSkip) return true;\n if (!props.validateOnNext) return true;\n if (targetIndex < props.currentStep) return true;\n\n const currentStepData = props.steps[props.currentStep];\n if (targetIndex > props.currentStep && currentStepData.valid === false) {\n return false;\n }\n\n for (let i = props.currentStep; i < targetIndex; i++) {\n if (props.steps[i].valid === false) {\n return false;\n }\n }\n\n return true;\n}\n\n// Handle uiStepsV4 events\nfunction handleStepClick(step: any, index: number) {\n const originalStep = props.steps[index];\n \n if (!canNavigateToStep(index)) {\n const currentStepData = props.steps[props.currentStep];\n emit('validation-failed', currentStepData, props.currentStep);\n return;\n }\n\n emit('step-click', originalStep, index);\n emit('update:currentStep', index);\n}\n\nfunction handleStepCompleted(step: any) {\n const index = uiSteps.value.findIndex(s => s.id === step.id);\n if (index !== -1) {\n emit('step-completed', props.steps[index]);\n }\n}\n\nfunction handleStepCurrent(step: any) {\n const index = uiSteps.value.findIndex(s => s.id === step.id);\n if (index !== -1) {\n emit('step-current', props.steps[index]);\n }\n}\n\nfunction handleStepUpcoming(step: any) {\n const index = uiSteps.value.findIndex(s => s.id === step.id);\n if (index !== -1) {\n emit('step-upcoming', props.steps[index]);\n }\n}\n\n// Public methods for programmatic navigation\nfunction goToStep(index: number): boolean {\n if (index < 0 || index >= props.steps.length) return false;\n if (!canNavigateToStep(index)) {\n const currentStepData = props.steps[props.currentStep];\n emit('validation-failed', currentStepData, props.currentStep);\n return false;\n }\n emit('update:currentStep', index);\n return true;\n}\n\nfunction goToNext(): boolean {\n return goToStep(props.currentStep + 1);\n}\n\nfunction goToPrevious(): boolean {\n return goToStep(props.currentStep - 1);\n}\n\nfunction validateCurrentStep(): boolean {\n const currentStepData = props.steps[props.currentStep];\n return currentStepData.valid !== false;\n}\n\ndefineExpose({\n getCurrentStep: () => props.currentStep,\n getSteps: () => props.steps,\n goToStep,\n goToNext,\n goToPrevious,\n validateCurrentStep,\n canNavigateToStep\n});\n</script>\n\n<template>\n <uiStepsV4\n :steps=\"uiSteps\"\n @stepClick=\"handleStepClick\"\n @stepCompleted=\"handleStepCompleted\"\n @stepCurrent=\"handleStepCurrent\"\n @stepUpcoming=\"handleStepUpcoming\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { uiBreadcrumbs } from '@hotelinking/ui';\n\nexport interface BreadcrumbItem {\n label: string;\n routeName: string;\n current?: boolean;\n}\n\ninterface Props {\n items: BreadcrumbItem[];\n loading?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n loading: false\n});\n\nconst emit = defineEmits<{\n 'breadcrumb-click': [routeName: string];\n}>();\n\n// Convert items to uiBreadcrumbs format\nconst pagesConfig = computed(() =>\n props.items.map((item, index) => ({\n name: item.label,\n routeName: item.routeName,\n current: item.current ?? (index === props.items.length - 1)\n }))\n);\n\n// Handle breadcrumb click\nfunction handleBreadcrumbClick(routeName: string) {\n emit('breadcrumb-click', routeName);\n}\n\n// Expose methods for parent components\ndefineExpose({\n getItems: () => props.items\n});\n</script>\n\n<template>\n <div class=\"breadcrumbs-wrapper\">\n <uiBreadcrumbs\n :pages=\"pagesConfig\"\n :loading=\"loading\"\n @bread-crumb-clicked=\"handleBreadcrumbClick\"\n />\n </div>\n</template>\n\n<style scoped>\n.breadcrumbs-wrapper {\n width: 100%;\n}\n</style>\n","/**\n * Admin Wrapper Component\n * \n * Wraps uiWrapper from @hotelinking/ui with sidebar, topbar, and content area.\n */\n\n<template>\n <uiWrapper \n :sidebar=\"sidebarConfig as any\" \n :topbar=\"topbarConfig as any\"\n :sidebarOpen=\"sidebarOpen\"\n @selectChanged=\"handleSelectChanged\"\n @topBarClick=\"handleTopBarClick\"\n @sideBarClick=\"handleSideBarClick\"\n @productBarClick=\"handleProductBarClick\"\n @inputChanged=\"handleInputChanged\"\n @sidebarToggle=\"(isOpen: boolean) => sidebarOpen = isOpen\"\n >\n <slot></slot>\n </uiWrapper>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SelectItemType } from \"@hotelinking/ui\";\nimport { uiWrapper } from \"@hotelinking/ui\";\nimport { useStore } from \"@nanostores/vue\";\nimport { computed, ref } from \"vue\";\nimport { $user } from \"../stores/user\";\n\n// Props interface (user is now from nanostore)\ninterface Props {\n\tsidebarLogo: string;\n\tcurrentPage?: string;\n\tsidebarTitle?: string;\n\tsidebarItems?: Array<{\n\t\tname: string;\n\t\ticon?: string;\n\t\tid: string;\n\t\trouteName: string;\n\t}>;\n\ttopbarActions?: Array<{\n\t\tname: string;\n\t\tevent: string;\n\t\ticon: string;\n\t}>;\n\tselectItems?: Array<{\n\t\tname: string;\n\t\tid: string;\n\t}>;\n\tselectedItem?: {\n\t\tname: string;\n\t\tid: string;\n\t};\n\tproductsSidebar?: Array<{\n\t\tname: string;\n\t\ticon: string;\n\t\tactive?: boolean;\n\t}>;\n\tsidebarOpenByDefault?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n\tcurrentPage: \"dashboard\",\n\tsidebarItems: () => [],\n\ttopbarActions: () => [],\n\tselectItems: () => [],\n\tselectedItem: () => ({ name: \"\", id: \"\" }),\n\tproductsSidebar: () => [],\n\tsidebarOpenByDefault: true,\n});\n\n// Emit events\nconst emit = defineEmits<{\n\tselectChanged: [item: { name: string; id: string }];\n}>();\n\n// Reactive state\nconst sidebarOpen = ref(props.sidebarOpenByDefault);\n\n// Get user from nanostore (no props needed!)\nconst user = useStore($user);\n\n// Computed properties for UI configuration\nconst topbarConfig = computed(() => {\n\treturn {\n\t\tlogo: props.sidebarLogo,\n\t\taccountLogo: user.value?.avatar || \"\",\n\t\talerted: false,\n\t\tprofileMenu: [\n\t\t\t{\n\t\t\t\tname: \"Profile\",\n\t\t\t\tid: \"profile\",\n\t\t\t\thref: \"/profile\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"Settings\",\n\t\t\t\tid: \"settings\",\n\t\t\t\thref: \"/settings\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"Logout\",\n\t\t\t\tid: \"logout\",\n\t\t\t\thref: \"#\",\n\t\t\t},\n\t\t],\n\t\tbrand: {\n\t\t\tname: user.value?.username || \"User\",\n\t\t\tdescription: user.value?.email || \"\",\n\t\t},\n\t\tselectItems: props.selectItems,\n\t\tselectedItem: props.selectedItem,\n\t};\n});\n\nconst sidebarConfig = computed(() => {\n\t// Add current attribute dynamically based on currentPage\n\tconst navigationItems = props.sidebarItems.map((item) => ({\n\t\tname: item.name,\n\t\ticon: item.icon,\n\t\tid: item.id,\n\t\tcurrent: item.id === props.currentPage,\n\t}));\n\n\treturn {\n\t\tnavigation: navigationItems,\n\t\tproductsSidebar: props.productsSidebar,\n\t\tlogo: props.sidebarLogo,\n\t};\n});\n\n// Event handlers\nconst handleSelectChanged = (item: SelectItemType | SelectItemType[]) => {\n\tconsole.log(\"Select changed:\", item);\n\t// Emit to parent component\n\tif (!Array.isArray(item) && item.id) {\n\t\temit(\"selectChanged\", { name: item.name, id: item.id });\n\t}\n};\n\nconst handleTopBarClick = (event: unknown) => {\n\t// Handle different possible event formats\n\tlet menuItem: string | undefined;\n\n\tif (typeof event === \"string\") {\n\t\tmenuItem = event;\n\t} else if (event && typeof event === \"object\") {\n\t\t// Check if it's an object with name or href property\n\t\tconst eventObj = event as Record<string, unknown>;\n\t\tmenuItem = (eventObj.name as string) || (eventObj.href as string);\n\t}\n\n\tconsole.log(\"Extracted menu item:\", menuItem);\n\n\t// The event is the menu item name\n\tif (menuItem === \"logout\") {\n\t\thandleLogout();\n\t} else if (menuItem === \"profile\") {\n\t\twindow.location.href = \"/profile\";\n\t} else if (menuItem === \"settings\") {\n\t\twindow.location.href = \"/settings\";\n\t}\n};\n\nconst handleSideBarClick = (itemId: string) => {\n\tconsole.log(\"Sidebar click:\", itemId);\n\n\t// Find the item by id to get the routeName\n\tconst item = props.sidebarItems.find(\n\t\t(i) => (i.id || i.name.toLowerCase()) === itemId,\n\t);\n\n\tif (item?.routeName) {\n\t\twindow.location.href = item.routeName;\n\t}\n};\n\nconst handleProductBarClick = (event: unknown) => {\n\tconsole.log(\"Product bar click:\", event);\n};\n\nconst handleInputChanged = (event: unknown) => {\n\tconsole.log(\"Input changed:\", event);\n};\n\nconst handleLogout = async () => {\n\ttry {\n\t\t// Import logout from auth package\n\t\tconst { signOut } = await import('@htlkg/core/auth');\n\t\tawait signOut();\n\t\t// Redirect to login page\n\t\twindow.location.href = \"/login\";\n\t} catch (error) {\n\t\tconsole.error(\"Logout error:\", error);\n\t\t// Force redirect even if logout fails\n\t\twindow.location.href = \"/login\";\n\t}\n};\n</script>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_Fragment","_renderList","_normalizeClass","_toDisplayString","_renderSlot","_createBlock","_unref","_createVNode"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useAdminPage-GhgXp0x8.js","sources":["../src/composables/useModal.ts","../src/composables/useTabs.ts","../src/composables/useForm.ts","../src/composables/useFormValidation.ts","../src/composables/useNotifications.ts","../src/composables/usePageContext.ts","../src/composables/useWizard.ts","../src/composables/useStats.ts","../src/composables/useConfirmation.ts","../src/composables/useAdminPage.ts"],"sourcesContent":["import { ref, type Ref } from 'vue';\n\nexport interface UseModalOptions {\n initialOpen?: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nexport interface UseModalReturn {\n isOpen: Ref<boolean>;\n open: () => void;\n close: () => void;\n toggle: () => void;\n}\n\nexport function useModal(options: UseModalOptions = {}): UseModalReturn {\n const isOpen = ref(options.initialOpen ?? false);\n\n function open() {\n isOpen.value = true;\n options.onOpen?.();\n }\n\n function close() {\n isOpen.value = false;\n options.onClose?.();\n }\n\n function toggle() {\n if (isOpen.value) {\n close();\n } else {\n open();\n }\n }\n\n return {\n isOpen,\n open,\n close,\n toggle\n };\n}\n","import { ref, computed, type Ref, type ComputedRef } from 'vue';\n\nexport interface Tab {\n id: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface UseTabsOptions {\n tabs: Tab[];\n initialTab?: string;\n onChange?: (tabId: string) => void;\n}\n\nexport interface UseTabsReturn {\n activeTab: Ref<string>;\n tabs: Ref<Tab[]>;\n currentTabIndex: ComputedRef<number>;\n isFirstTab: ComputedRef<boolean>;\n isLastTab: ComputedRef<boolean>;\n setActiveTab: (tabId: string) => void;\n nextTab: () => void;\n previousTab: () => void;\n isTabActive: (tabId: string) => boolean;\n isTabDisabled: (tabId: string) => boolean;\n}\n\nexport function useTabs(options: UseTabsOptions): UseTabsReturn {\n const tabs = ref(options.tabs);\n const activeTab = ref(\n options.initialTab || (tabs.value.length > 0 ? tabs.value[0].id : '')\n );\n\n const currentTabIndex = computed(() =>\n tabs.value.findIndex(tab => tab.id === activeTab.value)\n );\n\n const isFirstTab = computed(() => currentTabIndex.value === 0);\n\n const isLastTab = computed(() =>\n currentTabIndex.value === tabs.value.length - 1\n );\n\n function setActiveTab(tabId: string) {\n const tab = tabs.value.find(t => t.id === tabId);\n if (tab && !tab.disabled) {\n activeTab.value = tabId;\n options.onChange?.(tabId);\n }\n }\n\n function nextTab() {\n if (!isLastTab.value) {\n const nextIndex = currentTabIndex.value + 1;\n const nextTab = tabs.value[nextIndex];\n if (nextTab && !nextTab.disabled) {\n setActiveTab(nextTab.id);\n } else if (nextIndex < tabs.value.length - 1) {\n // Skip disabled tab and try next\n activeTab.value = nextTab.id;\n nextTab();\n }\n }\n }\n\n function previousTab() {\n if (!isFirstTab.value) {\n const prevIndex = currentTabIndex.value - 1;\n const prevTab = tabs.value[prevIndex];\n if (prevTab && !prevTab.disabled) {\n setActiveTab(prevTab.id);\n } else if (prevIndex > 0) {\n // Skip disabled tab and try previous\n activeTab.value = prevTab.id;\n previousTab();\n }\n }\n }\n\n function isTabActive(tabId: string): boolean {\n return activeTab.value === tabId;\n }\n\n function isTabDisabled(tabId: string): boolean {\n const tab = tabs.value.find(t => t.id === tabId);\n return tab?.disabled ?? false;\n }\n\n return {\n activeTab,\n tabs,\n currentTabIndex,\n isFirstTab,\n isLastTab,\n setActiveTab,\n nextTab,\n previousTab,\n isTabActive,\n isTabDisabled\n };\n}\n","import { ref, computed, type Ref, type ComputedRef } from 'vue';\n\nexport interface ValidationRule<T = any> {\n validate: (value: T) => boolean | Promise<boolean>;\n message: string;\n}\n\nexport interface FieldConfig {\n rules?: ValidationRule[];\n initialValue?: any;\n}\n\nexport interface UseFormOptions<T extends Record<string, any>> {\n initialValues: T;\n validationRules?: Partial<Record<keyof T, ValidationRule[]>>;\n onSubmit?: (values: T) => void | Promise<void>;\n}\n\nexport interface UseFormReturn<T extends Record<string, any>> {\n values: Ref<T>;\n errors: Ref<Partial<Record<keyof T, string>>>;\n touched: Ref<Partial<Record<keyof T, boolean>>>;\n isSubmitting: Ref<boolean>;\n isValid: ComputedRef<boolean>;\n setFieldValue: (field: keyof T, value: any) => void;\n setFieldError: (field: keyof T, error: string) => void;\n setFieldTouched: (field: keyof T, touched: boolean) => void;\n validateField: (field: keyof T) => Promise<boolean>;\n validateForm: () => Promise<boolean>;\n handleSubmit: (event?: Event) => Promise<void>;\n resetForm: () => void;\n}\n\nexport function useForm<T extends Record<string, any>>(\n options: UseFormOptions<T>\n): UseFormReturn<T> {\n const values = ref<T>({ ...options.initialValues }) as Ref<T>;\n const errors = ref<Partial<Record<keyof T, string>>>({});\n const touched = ref<Partial<Record<keyof T, boolean>>>({});\n const isSubmitting = ref(false);\n\n const isValid = computed(() => Object.keys(errors.value).length === 0);\n\n function setFieldValue(field: keyof T, value: any) {\n values.value[field] = value;\n }\n\n function setFieldError(field: keyof T, error: string) {\n errors.value[field] = error;\n }\n\n function setFieldTouched(field: keyof T, isTouched: boolean) {\n touched.value[field] = isTouched;\n }\n\n async function validateField(field: keyof T): Promise<boolean> {\n const rules = options.validationRules?.[field];\n if (!rules || rules.length === 0) return true;\n\n const value = values.value[field];\n\n for (const rule of rules) {\n const isValid = await rule.validate(value);\n if (!isValid) {\n setFieldError(field, rule.message);\n return false;\n }\n }\n\n // Clear error if validation passed\n delete errors.value[field];\n return true;\n }\n\n async function validateForm(): Promise<boolean> {\n const fields = Object.keys(values.value) as Array<keyof T>;\n const validationResults = await Promise.all(\n fields.map(field => validateField(field))\n );\n\n return validationResults.every(result => result);\n }\n\n async function handleSubmit(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n\n if (isSubmitting.value) return;\n\n // Mark all fields as touched\n for (const field of Object.keys(values.value) as Array<keyof T>) {\n setFieldTouched(field, true);\n }\n\n // Validate form\n const isFormValid = await validateForm();\n if (!isFormValid) return;\n\n // Submit form\n isSubmitting.value = true;\n try {\n await options.onSubmit?.(values.value);\n } finally {\n isSubmitting.value = false;\n }\n }\n\n function resetForm() {\n values.value = { ...options.initialValues };\n errors.value = {};\n touched.value = {};\n isSubmitting.value = false;\n }\n\n return {\n values,\n errors,\n touched,\n isSubmitting,\n isValid,\n setFieldValue,\n setFieldError,\n setFieldTouched,\n validateField,\n validateForm,\n handleSubmit,\n resetForm\n };\n}\n","import type { ValidationRule } from './useForm';\n\n// Common validation rules\nexport const required = (message = 'This field is required'): ValidationRule => ({\n validate: (value: any) => {\n if (value === null || value === undefined) return false;\n if (typeof value === 'string') return value.trim().length > 0;\n if (Array.isArray(value)) return value.length > 0;\n return true;\n },\n message\n});\n\nexport const minLength = (min: number, message?: string): ValidationRule => ({\n validate: (value: string) => {\n if (!value) return true; // Let required handle empty values\n return value.length >= min;\n },\n message: message || `Must be at least ${min} characters`\n});\n\nexport const maxLength = (max: number, message?: string): ValidationRule => ({\n validate: (value: string) => {\n if (!value) return true;\n return value.length <= max;\n },\n message: message || `Must be at most ${max} characters`\n});\n\nexport const email = (message = 'Invalid email address'): ValidationRule => ({\n validate: (value: string) => {\n if (!value) return true;\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(value);\n },\n message\n});\n\nexport const pattern = (regex: RegExp, message = 'Invalid format'): ValidationRule => ({\n validate: (value: string) => {\n if (!value) return true;\n return regex.test(value);\n },\n message\n});\n\nexport const min = (minValue: number, message?: string): ValidationRule => ({\n validate: (value: number) => {\n if (value === null || value === undefined) return true;\n return value >= minValue;\n },\n message: message || `Must be at least ${minValue}`\n});\n\nexport const max = (maxValue: number, message?: string): ValidationRule => ({\n validate: (value: number) => {\n if (value === null || value === undefined) return true;\n return value <= maxValue;\n },\n message: message || `Must be at most ${maxValue}`\n});\n\nexport const custom = (\n validator: (value: any) => boolean | Promise<boolean>,\n message: string\n): ValidationRule => ({\n validate: validator,\n message\n});\n\n// Composable for form validation\nexport function useFormValidation() {\n return {\n required,\n minLength,\n maxLength,\n email,\n pattern,\n min,\n max,\n custom\n };\n}\n","import { ref, type Ref } from 'vue';\n\nexport interface Notification {\n id: string;\n message: string;\n type: 'info' | 'success' | 'warning' | 'error';\n duration?: number;\n}\n\nexport interface UseNotificationsReturn {\n notifications: Ref<Notification[]>;\n addNotification: (notification: Omit<Notification, 'id'>) => string;\n removeNotification: (id: string) => void;\n clearAll: () => void;\n info: (message: string, duration?: number) => string;\n success: (message: string, duration?: number) => string;\n warning: (message: string, duration?: number) => string;\n error: (message: string, duration?: number) => string;\n}\n\n// Global notifications state\nconst notifications = ref<Notification[]>([]);\n\nexport function useNotifications(): UseNotificationsReturn {\n function addNotification(notification: Omit<Notification, 'id'>): string {\n const id = `notification-${Date.now()}-${Math.random()}`;\n const newNotification: Notification = {\n ...notification,\n id\n };\n\n notifications.value.push(newNotification);\n\n // Auto-remove after duration\n if (notification.duration) {\n setTimeout(() => {\n removeNotification(id);\n }, notification.duration);\n }\n\n return id;\n }\n\n function removeNotification(id: string) {\n const index = notifications.value.findIndex(n => n.id === id);\n if (index !== -1) {\n notifications.value.splice(index, 1);\n }\n }\n\n function clearAll() {\n notifications.value = [];\n }\n\n function info(message: string, duration = 3000): string {\n return addNotification({ message, type: 'info', duration });\n }\n\n function success(message: string, duration = 3000): string {\n return addNotification({ message, type: 'success', duration });\n }\n\n function warning(message: string, duration = 3000): string {\n return addNotification({ message, type: 'warning', duration });\n }\n\n function error(message: string, duration = 5000): string {\n return addNotification({ message, type: 'error', duration });\n }\n\n return {\n notifications,\n addNotification,\n removeNotification,\n clearAll,\n info,\n success,\n warning,\n error\n };\n}\n","/**\n * Page Context Composable\n *\n * Provides access to common page context data (user, brand, routes)\n * within Vue components, without prop drilling.\n */\n\nimport { computed, inject, type InjectionKey, type ComputedRef } from \"vue\";\nimport { useStore } from \"@nanostores/vue\";\nimport { atom } from \"nanostores\";\nimport { routes, type Routes } from \"@htlkg/core\";\n\n/**\n * User information from authentication\n */\nexport interface PageUser {\n\tusername: string;\n\temail?: string;\n\tisAdmin: boolean;\n\tisSuperAdmin: boolean;\n\tbrandIds?: number[];\n\taccountIds?: number[];\n\troles?: string[];\n}\n\n/**\n * Brand context for brand-scoped pages\n */\nexport interface PageBrand {\n\tid: number;\n\tname: string;\n\tlogo?: string;\n}\n\n/**\n * Full page context\n */\nexport interface PageContext {\n\tuser: PageUser | null;\n\tbrand?: PageBrand;\n\tbrandId?: number;\n\tisAdmin: boolean;\n\tisSuperAdmin: boolean;\n\troutes: Routes;\n}\n\n/**\n * Injection key for providing page context\n */\nexport const PAGE_CONTEXT_KEY: InjectionKey<PageContext> = Symbol(\"pageContext\");\n\n/**\n * Nanostore for user state (set by AdminLayout)\n */\nexport const $user = atom<PageUser | null>(null);\n\n/**\n * Nanostore for current brand (set by BrandLayout)\n */\nexport const $currentBrand = atom<PageBrand | null>(null);\n\n/**\n * Set user in the store (called from layout)\n */\nexport function setUser(user: PageUser | null): void {\n\t$user.set(user);\n}\n\n/**\n * Set current brand in the store (called from layout)\n */\nexport function setCurrentBrand(brand: PageBrand | null): void {\n\t$currentBrand.set(brand);\n}\n\n/**\n * Get page context within a Vue component\n *\n * This composable provides access to:\n * - Current user information\n * - Current brand (if in brand context)\n * - Admin/superadmin status\n * - Type-safe routes\n *\n * @example\n * ```vue\n * <script setup>\n * import { usePageContext } from '@htlkg/components';\n *\n * const { user, isAdmin, routes } = usePageContext();\n *\n * function goToAccounts() {\n * window.location.href = routes.admin.accounts();\n * }\n * </script>\n * ```\n *\n * @example With provider pattern\n * ```vue\n * // In parent component\n * import { provide, PAGE_CONTEXT_KEY } from '@htlkg/components';\n * provide(PAGE_CONTEXT_KEY, { user, brand, isAdmin: true, routes });\n *\n * // In child component\n * const context = usePageContext();\n * ```\n */\nexport function usePageContext(): ComputedRef<PageContext> {\n\t// Try injection first (from provider)\n\tconst injected = inject(PAGE_CONTEXT_KEY, null);\n\tif (injected) {\n\t\treturn computed(() => injected);\n\t}\n\n\t// Fallback to nanostores\n\tconst user = useStore($user);\n\tconst brand = useStore($currentBrand);\n\n\treturn computed(() => ({\n\t\tuser: user.value,\n\t\tbrand: brand.value ?? undefined,\n\t\tbrandId: brand.value?.id,\n\t\tisAdmin: user.value?.isAdmin ?? false,\n\t\tisSuperAdmin: user.value?.isSuperAdmin ?? false,\n\t\troutes,\n\t}));\n}\n\n/**\n * Check if user has access to a specific brand\n */\nexport function useHasAccessToBrand(brandId: number): ComputedRef<boolean> {\n\tconst context = usePageContext();\n\n\treturn computed(() => {\n\t\tconst user = context.value.user;\n\t\tif (!user) return false;\n\t\tif (user.isAdmin || user.isSuperAdmin) return true;\n\t\treturn user.brandIds?.includes(brandId) ?? false;\n\t});\n}\n\n/**\n * Check if user has access to a specific account\n */\nexport function useHasAccessToAccount(accountId: number): ComputedRef<boolean> {\n\tconst context = usePageContext();\n\n\treturn computed(() => {\n\t\tconst user = context.value.user;\n\t\tif (!user) return false;\n\t\tif (user.isAdmin || user.isSuperAdmin) return true;\n\t\treturn user.accountIds?.includes(accountId) ?? false;\n\t});\n}\n\n/**\n * Get user roles\n */\nexport function useUserRoles(): ComputedRef<string[]> {\n\tconst context = usePageContext();\n\treturn computed(() => context.value.user?.roles ?? []);\n}\n\n/**\n * Check if user has a specific role\n */\nexport function useHasRole(role: string): ComputedRef<boolean> {\n\tconst roles = useUserRoles();\n\treturn computed(() => roles.value.includes(role));\n}\n","/**\n * Wizard Composable\n *\n * Manages multi-step form/wizard state with validation support.\n * Integrates with Stepper component and JsonSchemaForm.\n */\n\nimport { ref, computed, type Ref, type ComputedRef, type Component } from 'vue';\n\n/**\n * JSON Schema type for form validation\n */\nexport interface JsonSchema {\n\ttype: string;\n\tproperties?: Record<string, any>;\n\trequired?: string[];\n\ttitle?: string;\n\tdescription?: string;\n}\n\n/**\n * Step definition for the wizard\n */\nexport interface WizardStep<T = any> {\n\t/** Unique step identifier */\n\tid: string;\n\t/** Display label for the step */\n\tlabel: string;\n\t/** Optional description */\n\tdescription?: string;\n\t/** JSON Schema for JsonSchemaForm (optional) */\n\tschema?: JsonSchema;\n\t/** Custom validation function (optional) */\n\tvalidate?: (data: T) => boolean | Promise<boolean>;\n\t/** Icon component for the step (optional) */\n\ticon?: Component;\n\t/** Whether step can be skipped */\n\toptional?: boolean;\n}\n\n/**\n * Step status for Stepper component\n */\nexport type StepStatus = 'complete' | 'current' | 'upcoming' | 'error';\n\n/**\n * Stepper-compatible step format\n */\nexport interface StepperStep {\n\tid: string;\n\tlabel: string;\n\tstatus: StepStatus;\n\tvalid?: boolean;\n}\n\n/**\n * Options for useWizard\n */\nexport interface UseWizardOptions<T extends Record<string, any>> {\n\t/** Step definitions */\n\tsteps: WizardStep<T>[];\n\t/** Initial form data */\n\tinitialData?: Partial<T>;\n\t/** Callback when wizard completes */\n\tonComplete?: (data: T) => void | Promise<void>;\n\t/** Callback when step changes */\n\tonStepChange?: (fromIndex: number, toIndex: number, data: T) => void;\n\t/** Whether to validate before advancing */\n\tvalidateOnNext?: boolean;\n\t/** Whether to allow going back without validation */\n\tallowBackWithoutValidation?: boolean;\n}\n\n/**\n * Return type for useWizard\n */\nexport interface UseWizardReturn<T extends Record<string, any>> {\n\t// State\n\tcurrentStepIndex: Ref<number>;\n\tcurrentStep: ComputedRef<WizardStep<T>>;\n\tdata: Ref<Partial<T>>;\n\tisFirstStep: ComputedRef<boolean>;\n\tisLastStep: ComputedRef<boolean>;\n\tisCompleting: Ref<boolean>;\n\tstepErrors: Ref<Record<string, string>>;\n\n\t// For Stepper component\n\tstepperSteps: ComputedRef<StepperStep[]>;\n\n\t// Validation state\n\tstepValidation: Ref<Record<string, boolean>>;\n\tcurrentStepValid: ComputedRef<boolean>;\n\tallStepsValid: ComputedRef<boolean>;\n\n\t// Navigation\n\tgoToNext: () => Promise<boolean>;\n\tgoToPrevious: () => boolean;\n\tgoToStep: (index: number) => Promise<boolean>;\n\tcanGoToStep: (index: number) => boolean;\n\n\t// Data management\n\tupdateData: (newData: Partial<T>) => void;\n\tupdateStepData: (stepId: string, stepData: Partial<T>) => void;\n\tsetStepValid: (stepId: string, valid: boolean) => void;\n\tsetStepError: (stepId: string, error: string | null) => void;\n\tresetStep: (stepId: string) => void;\n\treset: () => void;\n\n\t// Completion\n\tcomplete: () => Promise<boolean>;\n\n\t// Utilities\n\tgetStepIndex: (stepId: string) => number;\n\tgetStep: (stepId: string) => WizardStep<T> | undefined;\n\tprogress: ComputedRef<number>;\n}\n\n/**\n * Creates a wizard composable for managing multi-step forms\n *\n * @example\n * ```typescript\n * const wizard = useWizard({\n * steps: [\n * { id: 'details', label: 'Details', schema: detailsSchema },\n * { id: 'audience', label: 'Audience', schema: audienceSchema },\n * { id: 'review', label: 'Review' },\n * ],\n * initialData: { name: '', audience: [] },\n * onComplete: async (data) => {\n * await createCampaign(data);\n * },\n * });\n *\n * // In template\n * <Stepper :steps=\"wizard.stepperSteps\" v-model:currentStep=\"wizard.currentStepIndex\" />\n * <JsonSchemaForm\n * v-if=\"wizard.currentStep.schema\"\n * :schema=\"wizard.currentStep.schema\"\n * v-model=\"wizard.data\"\n * />\n * <button @click=\"wizard.goToPrevious\" :disabled=\"wizard.isFirstStep\">Back</button>\n * <button @click=\"wizard.goToNext\" v-if=\"!wizard.isLastStep\">Next</button>\n * <button @click=\"wizard.complete\" v-else :disabled=\"wizard.isCompleting\">Complete</button>\n * ```\n */\nexport function useWizard<T extends Record<string, any>>(\n\toptions: UseWizardOptions<T>\n): UseWizardReturn<T> {\n\tconst {\n\t\tsteps,\n\t\tinitialData = {} as Partial<T>,\n\t\tonComplete,\n\t\tonStepChange,\n\t\tvalidateOnNext = true,\n\t\tallowBackWithoutValidation = true,\n\t} = options;\n\n\t// Core state\n\tconst currentStepIndex = ref(0);\n\tconst data = ref<Partial<T>>({ ...initialData }) as Ref<Partial<T>>;\n\tconst isCompleting = ref(false);\n\tconst stepValidation = ref<Record<string, boolean>>({});\n\tconst stepErrors = ref<Record<string, string>>({});\n\n\t// Computed: Current step\n\tconst currentStep = computed(() => steps[currentStepIndex.value]);\n\n\t// Computed: Navigation flags\n\tconst isFirstStep = computed(() => currentStepIndex.value === 0);\n\tconst isLastStep = computed(() => currentStepIndex.value === steps.length - 1);\n\n\t// Computed: Progress percentage\n\tconst progress = computed(() =>\n\t\tMath.round(((currentStepIndex.value + 1) / steps.length) * 100)\n\t);\n\n\t// Computed: Current step validation status\n\tconst currentStepValid = computed(() => {\n\t\tconst step = currentStep.value;\n\t\tif (!step) return false;\n\t\tif (step.optional) return true;\n\t\treturn stepValidation.value[step.id] !== false;\n\t});\n\n\t// Computed: All required steps valid\n\tconst allStepsValid = computed(() => {\n\t\treturn steps.every(step => {\n\t\t\tif (step.optional) return true;\n\t\t\treturn stepValidation.value[step.id] === true;\n\t\t});\n\t});\n\n\t// Computed: Steps formatted for Stepper component\n\tconst stepperSteps = computed<StepperStep[]>(() =>\n\t\tsteps.map((step, index) => {\n\t\t\tlet status: StepStatus;\n\n\t\t\tif (index < currentStepIndex.value) {\n\t\t\t\tstatus = stepValidation.value[step.id] === false ? 'error' : 'complete';\n\t\t\t} else if (index === currentStepIndex.value) {\n\t\t\t\tstatus = 'current';\n\t\t\t} else {\n\t\t\t\tstatus = 'upcoming';\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tid: step.id,\n\t\t\t\tlabel: step.label,\n\t\t\t\tstatus,\n\t\t\t\tvalid: stepValidation.value[step.id] ?? true,\n\t\t\t};\n\t\t})\n\t);\n\n\t// Utility: Get step index by ID\n\tfunction getStepIndex(stepId: string): number {\n\t\treturn steps.findIndex(s => s.id === stepId);\n\t}\n\n\t// Utility: Get step by ID\n\tfunction getStep(stepId: string): WizardStep<T> | undefined {\n\t\treturn steps.find(s => s.id === stepId);\n\t}\n\n\t// Validate a specific step\n\tasync function validateStep(stepIndex: number): Promise<boolean> {\n\t\tconst step = steps[stepIndex];\n\t\tif (!step) return false;\n\n\t\t// Optional steps are always valid\n\t\tif (step.optional) {\n\t\t\tstepValidation.value[step.id] = true;\n\t\t\treturn true;\n\t\t}\n\n\t\t// Custom validation function\n\t\tif (step.validate) {\n\t\t\ttry {\n\t\t\t\tconst result = await step.validate(data.value as T);\n\t\t\t\tstepValidation.value[step.id] = result;\n\t\t\t\tif (!result) {\n\t\t\t\t\tstepErrors.value[step.id] = 'Validation failed';\n\t\t\t\t} else {\n\t\t\t\t\tdelete stepErrors.value[step.id];\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\tstepValidation.value[step.id] = false;\n\t\t\t\tstepErrors.value[step.id] = error instanceof Error ? error.message : 'Validation error';\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// If no custom validation, check if step was marked valid\n\t\t// Default to true if not explicitly set\n\t\tif (stepValidation.value[step.id] === undefined) {\n\t\t\tstepValidation.value[step.id] = true;\n\t\t}\n\n\t\treturn stepValidation.value[step.id] !== false;\n\t}\n\n\t// Check if navigation to step is allowed\n\tfunction canGoToStep(targetIndex: number): boolean {\n\t\tif (targetIndex < 0 || targetIndex >= steps.length) return false;\n\n\t\t// Can always go back if allowed\n\t\tif (targetIndex < currentStepIndex.value && allowBackWithoutValidation) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// For forward navigation, all previous steps must be valid\n\t\tif (targetIndex > currentStepIndex.value && validateOnNext) {\n\t\t\tfor (let i = 0; i < targetIndex; i++) {\n\t\t\t\tconst step = steps[i];\n\t\t\t\tif (!step.optional && stepValidation.value[step.id] === false) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// Navigation: Go to next step\n\tasync function goToNext(): Promise<boolean> {\n\t\tif (isLastStep.value) return false;\n\n\t\t// Validate current step before advancing\n\t\tif (validateOnNext) {\n\t\t\tconst isValid = await validateStep(currentStepIndex.value);\n\t\t\tif (!isValid) return false;\n\t\t}\n\n\t\tconst fromIndex = currentStepIndex.value;\n\t\tcurrentStepIndex.value++;\n\n\t\tonStepChange?.(fromIndex, currentStepIndex.value, data.value as T);\n\t\treturn true;\n\t}\n\n\t// Navigation: Go to previous step\n\tfunction goToPrevious(): boolean {\n\t\tif (isFirstStep.value) return false;\n\n\t\tconst fromIndex = currentStepIndex.value;\n\t\tcurrentStepIndex.value--;\n\n\t\tonStepChange?.(fromIndex, currentStepIndex.value, data.value as T);\n\t\treturn true;\n\t}\n\n\t// Navigation: Go to specific step\n\tasync function goToStep(targetIndex: number): Promise<boolean> {\n\t\tif (!canGoToStep(targetIndex)) return false;\n\n\t\t// If going forward, validate current step\n\t\tif (targetIndex > currentStepIndex.value && validateOnNext) {\n\t\t\tconst isValid = await validateStep(currentStepIndex.value);\n\t\t\tif (!isValid) return false;\n\t\t}\n\n\t\tconst fromIndex = currentStepIndex.value;\n\t\tcurrentStepIndex.value = targetIndex;\n\n\t\tonStepChange?.(fromIndex, currentStepIndex.value, data.value as T);\n\t\treturn true;\n\t}\n\n\t// Data: Update wizard data\n\tfunction updateData(newData: Partial<T>): void {\n\t\tdata.value = { ...data.value, ...newData };\n\t}\n\n\t// Data: Update data for a specific step\n\tfunction updateStepData(stepId: string, stepData: Partial<T>): void {\n\t\tupdateData(stepData);\n\t\t// Clear error when data is updated\n\t\tdelete stepErrors.value[stepId];\n\t}\n\n\t// Validation: Set step validation status\n\tfunction setStepValid(stepId: string, valid: boolean): void {\n\t\tstepValidation.value[stepId] = valid;\n\t\tif (valid) {\n\t\t\tdelete stepErrors.value[stepId];\n\t\t}\n\t}\n\n\t// Validation: Set step error\n\tfunction setStepError(stepId: string, error: string | null): void {\n\t\tif (error) {\n\t\t\tstepErrors.value[stepId] = error;\n\t\t\tstepValidation.value[stepId] = false;\n\t\t} else {\n\t\t\tdelete stepErrors.value[stepId];\n\t\t}\n\t}\n\n\t// Reset: Reset a specific step\n\tfunction resetStep(stepId: string): void {\n\t\tdelete stepValidation.value[stepId];\n\t\tdelete stepErrors.value[stepId];\n\t}\n\n\t// Reset: Reset entire wizard\n\tfunction reset(): void {\n\t\tcurrentStepIndex.value = 0;\n\t\tdata.value = { ...initialData };\n\t\tstepValidation.value = {};\n\t\tstepErrors.value = {};\n\t\tisCompleting.value = false;\n\t}\n\n\t// Complete: Validate all and trigger completion\n\tasync function complete(): Promise<boolean> {\n\t\tif (isCompleting.value) return false;\n\n\t\tisCompleting.value = true;\n\n\t\ttry {\n\t\t\t// Validate all steps\n\t\t\tfor (let i = 0; i < steps.length; i++) {\n\t\t\t\tconst isValid = await validateStep(i);\n\t\t\t\tif (!isValid && !steps[i].optional) {\n\t\t\t\t\t// Navigate to failed step\n\t\t\t\t\tcurrentStepIndex.value = i;\n\t\t\t\t\tisCompleting.value = false;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Call completion handler\n\t\t\tif (onComplete) {\n\t\t\t\tawait onComplete(data.value as T);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tconsole.error('[useWizard] Completion error:', error);\n\t\t\treturn false;\n\t\t} finally {\n\t\t\tisCompleting.value = false;\n\t\t}\n\t}\n\n\treturn {\n\t\t// State\n\t\tcurrentStepIndex,\n\t\tcurrentStep,\n\t\tdata,\n\t\tisFirstStep,\n\t\tisLastStep,\n\t\tisCompleting,\n\t\tstepErrors,\n\n\t\t// Stepper integration\n\t\tstepperSteps,\n\n\t\t// Validation\n\t\tstepValidation,\n\t\tcurrentStepValid,\n\t\tallStepsValid,\n\n\t\t// Navigation\n\t\tgoToNext,\n\t\tgoToPrevious,\n\t\tgoToStep,\n\t\tcanGoToStep,\n\n\t\t// Data management\n\t\tupdateData,\n\t\tupdateStepData,\n\t\tsetStepValid,\n\t\tsetStepError,\n\t\tresetStep,\n\t\treset,\n\n\t\t// Completion\n\t\tcomplete,\n\n\t\t// Utilities\n\t\tgetStepIndex,\n\t\tgetStep,\n\t\tprogress,\n\t};\n}\n","/**\n * Stats Composable\n *\n * Derives statistics from reactive data with staggered loading animation.\n * Integrates with uiStats component from @hotelinking/ui.\n */\n\nimport { ref, computed, watch, type Ref, type ComputedRef, type Component } from 'vue';\n\n/**\n * Color options matching @hotelinking/ui\n */\nexport type StatColor = 'green' | 'red' | 'yellow' | 'blue' | 'gray' | 'purple' | 'orange' | 'pink';\n\n/**\n * Change type for stat trends\n */\nexport type ChangeType = 'increase' | 'decrease' | 'neutral';\n\n/**\n * Definition for a single stat\n */\nexport interface StatDefinition<T> {\n\t/** Unique identifier */\n\tid: string;\n\t/** Display name */\n\tname: string;\n\t/** Icon component (Heroicons) */\n\ticon: Component;\n\t/** Color theme */\n\tcolor?: StatColor;\n\t/** Function to compute stat value from data */\n\tcompute: (items: T[]) => string | number;\n\t/** Optional: Compute change percentage/value */\n\tcomputeChange?: (items: T[], previousItems?: T[]) => string;\n\t/** Optional: Compute change type (increase/decrease/neutral) */\n\tcomputeChangeType?: (items: T[], previousItems?: T[]) => ChangeType;\n\t/** Show footer with action text */\n\tshowFooter?: boolean;\n\t/** Action text for footer */\n\tactionText?: string;\n}\n\n/**\n * Stat item formatted for uiStats component\n */\nexport interface StatItem {\n\tid: string;\n\tname: string;\n\tstat: string | number;\n\ticon: Component;\n\tcolor: StatColor;\n\tchange?: string;\n\tchangeType?: ChangeType;\n\tshowFooter?: boolean;\n\tactionText?: string;\n}\n\n/**\n * Options for useStats\n */\nexport interface UseStatsOptions<T> {\n\t/** Reactive data source */\n\tdata: Ref<T[]> | ComputedRef<T[]>;\n\t/** Loading state of the data source */\n\tloading: Ref<boolean> | ComputedRef<boolean>;\n\t/** Stat definitions */\n\tdefinitions: StatDefinition<T>[];\n\t/** Delay between each stat reveal (ms) */\n\tstaggerDelay?: number;\n\t/** Initial delay before first stat reveals (ms) */\n\tinitialDelay?: number;\n\t/** Previous data for computing changes (optional) */\n\tpreviousData?: Ref<T[]> | ComputedRef<T[]>;\n}\n\n/**\n * Return type for useStats\n */\nexport interface UseStatsReturn<T> {\n\t/** Computed stats array for uiStats */\n\tstats: ComputedRef<StatItem[]>;\n\t/** Individual loading states for each stat */\n\tloadingStates: Ref<boolean[]>;\n\t/** Combined stats with loading property */\n\tstatsWithLoading: ComputedRef<Array<StatItem & { loading: boolean }>>;\n\t/** Whether all stats are loaded */\n\tallLoaded: ComputedRef<boolean>;\n\t/** Force refresh loading animation */\n\trefreshAnimation: () => void;\n\t/** Get a single stat by ID */\n\tgetStat: (id: string) => StatItem | undefined;\n}\n\n/**\n * Creates a stats composable for deriving statistics from reactive data\n *\n * @example\n * ```typescript\n * import { CheckCircleIcon, ClockIcon, XCircleIcon } from '@heroicons/vue/24/outline';\n *\n * const { statsWithLoading } = useStats({\n * data: campaigns,\n * loading: campaignsLoading,\n * definitions: [\n * {\n * id: 'active',\n * name: 'Active Campaigns',\n * icon: CheckCircleIcon,\n * color: 'green',\n * compute: (items) => items.filter(c => c.status === 'active').length,\n * },\n * {\n * id: 'pending',\n * name: 'Pending',\n * icon: ClockIcon,\n * color: 'yellow',\n * compute: (items) => items.filter(c => c.status === 'pending').length,\n * },\n * {\n * id: 'total-sent',\n * name: 'Total Sent',\n * icon: PaperAirplaneIcon,\n * color: 'blue',\n * compute: (items) => items.reduce((sum, c) => sum + c.sentCount, 0).toLocaleString(),\n * computeChange: (items) => '+12%',\n * computeChangeType: () => 'increase',\n * },\n * ],\n * staggerDelay: 100,\n * });\n *\n * // In template\n * <div class=\"grid grid-cols-4 gap-4\">\n * <uiStats\n * v-for=\"stat in statsWithLoading\"\n * :key=\"stat.id\"\n * :item=\"stat\"\n * :loading=\"stat.loading\"\n * @statClick=\"handleStatClick\"\n * />\n * </div>\n * ```\n */\nexport function useStats<T>(options: UseStatsOptions<T>): UseStatsReturn<T> {\n\tconst {\n\t\tdata,\n\t\tloading,\n\t\tdefinitions,\n\t\tstaggerDelay = 100,\n\t\tinitialDelay = 0,\n\t\tpreviousData,\n\t} = options;\n\n\t// Individual loading states for staggered animation\n\tconst loadingStates = ref<boolean[]>(definitions.map(() => true));\n\n\t// Timers for cleanup\n\tlet timers: ReturnType<typeof setTimeout>[] = [];\n\n\t// Clear all pending timers\n\tfunction clearTimers(): void {\n\t\ttimers.forEach(timer => clearTimeout(timer));\n\t\ttimers = [];\n\t}\n\n\t// Trigger staggered loading animation\n\tfunction triggerStaggeredReveal(): void {\n\t\tclearTimers();\n\n\t\t// Reset all to loading\n\t\tloadingStates.value = definitions.map(() => true);\n\n\t\t// Staggered reveal\n\t\tdefinitions.forEach((_, index) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tloadingStates.value[index] = false;\n\t\t\t}, initialDelay + staggerDelay * (index + 1));\n\t\t\ttimers.push(timer);\n\t\t});\n\t}\n\n\t// Watch for loading state changes\n\twatch(\n\t\t() => loading.value,\n\t\t(isLoading, wasLoading) => {\n\t\t\tif (wasLoading && !isLoading) {\n\t\t\t\t// Data just finished loading, trigger reveal\n\t\t\t\ttriggerStaggeredReveal();\n\t\t\t} else if (isLoading && !wasLoading) {\n\t\t\t\t// Started loading, reset states\n\t\t\t\tclearTimers();\n\t\t\t\tloadingStates.value = definitions.map(() => true);\n\t\t\t}\n\t\t},\n\t\t{ immediate: true }\n\t);\n\n\t// If data is already loaded on mount, trigger reveal\n\tif (!loading.value) {\n\t\ttriggerStaggeredReveal();\n\t}\n\n\t// Computed: Stats derived from data\n\tconst stats = computed<StatItem[]>(() => {\n\t\tconst items = data.value;\n\t\tconst prevItems = previousData?.value;\n\n\t\treturn definitions.map(def => {\n\t\t\tconst stat: StatItem = {\n\t\t\t\tid: def.id,\n\t\t\t\tname: def.name,\n\t\t\t\tstat: def.compute(items),\n\t\t\t\ticon: def.icon,\n\t\t\t\tcolor: def.color ?? 'gray',\n\t\t\t};\n\n\t\t\t// Add change information if provided\n\t\t\tif (def.computeChange) {\n\t\t\t\tstat.change = def.computeChange(items, prevItems);\n\t\t\t}\n\n\t\t\tif (def.computeChangeType) {\n\t\t\t\tstat.changeType = def.computeChangeType(items, prevItems);\n\t\t\t}\n\n\t\t\t// Footer options\n\t\t\tif (def.showFooter !== undefined) {\n\t\t\t\tstat.showFooter = def.showFooter;\n\t\t\t}\n\n\t\t\tif (def.actionText) {\n\t\t\t\tstat.actionText = def.actionText;\n\t\t\t}\n\n\t\t\treturn stat;\n\t\t});\n\t});\n\n\t// Computed: Stats with loading property included\n\tconst statsWithLoading = computed(() =>\n\t\tstats.value.map((stat, index) => ({\n\t\t\t...stat,\n\t\t\tloading: loading.value || loadingStates.value[index],\n\t\t}))\n\t);\n\n\t// Computed: All stats loaded\n\tconst allLoaded = computed(() =>\n\t\t!loading.value && loadingStates.value.every(s => !s)\n\t);\n\n\t// Get a single stat by ID\n\tfunction getStat(id: string): StatItem | undefined {\n\t\treturn stats.value.find(s => s.id === id);\n\t}\n\n\t// Manually refresh animation\n\tfunction refreshAnimation(): void {\n\t\ttriggerStaggeredReveal();\n\t}\n\n\treturn {\n\t\tstats,\n\t\tloadingStates,\n\t\tstatsWithLoading,\n\t\tallLoaded,\n\t\trefreshAnimation,\n\t\tgetStat,\n\t};\n}\n\n/**\n * Helper: Create a simple count stat definition\n */\nexport function countStat<T>(\n\tid: string,\n\tname: string,\n\ticon: Component,\n\tfilter: (item: T) => boolean,\n\toptions?: { color?: StatColor }\n): StatDefinition<T> {\n\treturn {\n\t\tid,\n\t\tname,\n\t\ticon,\n\t\tcolor: options?.color ?? 'gray',\n\t\tcompute: (items) => items.filter(filter).length,\n\t};\n}\n\n/**\n * Helper: Create a sum stat definition\n */\nexport function sumStat<T>(\n\tid: string,\n\tname: string,\n\ticon: Component,\n\tgetValue: (item: T) => number,\n\toptions?: { color?: StatColor; format?: (value: number) => string }\n): StatDefinition<T> {\n\treturn {\n\t\tid,\n\t\tname,\n\t\ticon,\n\t\tcolor: options?.color ?? 'gray',\n\t\tcompute: (items) => {\n\t\t\tconst sum = items.reduce((total, item) => total + getValue(item), 0);\n\t\t\treturn options?.format ? options.format(sum) : sum.toLocaleString();\n\t\t},\n\t};\n}\n\n/**\n * Helper: Create an average stat definition\n */\nexport function averageStat<T>(\n\tid: string,\n\tname: string,\n\ticon: Component,\n\tgetValue: (item: T) => number,\n\toptions?: { color?: StatColor; decimals?: number; suffix?: string }\n): StatDefinition<T> {\n\treturn {\n\t\tid,\n\t\tname,\n\t\ticon,\n\t\tcolor: options?.color ?? 'gray',\n\t\tcompute: (items) => {\n\t\t\tif (items.length === 0) return '0';\n\t\t\tconst sum = items.reduce((total, item) => total + getValue(item), 0);\n\t\t\tconst avg = sum / items.length;\n\t\t\tconst formatted = avg.toFixed(options?.decimals ?? 1);\n\t\t\treturn options?.suffix ? `${formatted}${options.suffix}` : formatted;\n\t\t},\n\t};\n}\n\n/**\n * Helper: Create a percentage stat definition\n */\nexport function percentageStat<T>(\n\tid: string,\n\tname: string,\n\ticon: Component,\n\tfilter: (item: T) => boolean,\n\toptions?: { color?: StatColor; decimals?: number }\n): StatDefinition<T> {\n\treturn {\n\t\tid,\n\t\tname,\n\t\ticon,\n\t\tcolor: options?.color ?? 'gray',\n\t\tcompute: (items) => {\n\t\t\tif (items.length === 0) return '0%';\n\t\t\tconst count = items.filter(filter).length;\n\t\t\tconst percentage = (count / items.length) * 100;\n\t\t\treturn `${percentage.toFixed(options?.decimals ?? 1)}%`;\n\t\t},\n\t};\n}\n","/**\n * Confirmation Composable\n *\n * Manages confirmation dialog state for destructive actions.\n * Works with uiModal from @hotelinking/ui.\n */\n\nimport { ref, computed, type Ref, type ComputedRef, type Component } from 'vue';\n\n/**\n * Confirmation dialog variant\n */\nexport type ConfirmationVariant = 'danger' | 'warning' | 'info' | 'default';\n\n/**\n * Configuration for a confirmation dialog\n */\nexport interface ConfirmationConfig {\n\t/** Dialog title */\n\ttitle: string;\n\t/** Dialog message/description */\n\tmessage: string;\n\t/** Text for confirm button */\n\tconfirmText?: string;\n\t/** Text for cancel button */\n\tcancelText?: string;\n\t/** Visual variant */\n\tvariant?: ConfirmationVariant;\n\t/** Icon component to display */\n\ticon?: Component;\n\t/** Whether action is in progress */\n\tloading?: boolean;\n}\n\n/**\n * Internal state for pending confirmation\n */\ninterface PendingConfirmation {\n\tresolve: (value: boolean) => void;\n\treject: (reason?: unknown) => void;\n}\n\n/**\n * Options for useConfirmation\n */\nexport interface UseConfirmationOptions {\n\t/** Default confirm button text */\n\tdefaultConfirmText?: string;\n\t/** Default cancel button text */\n\tdefaultCancelText?: string;\n\t/** Default variant */\n\tdefaultVariant?: ConfirmationVariant;\n}\n\n/**\n * Return type for useConfirmation\n */\nexport interface UseConfirmationReturn {\n\t/** Whether dialog is open */\n\tisOpen: Ref<boolean>;\n\t/** Current dialog configuration */\n\tconfig: Ref<ConfirmationConfig>;\n\t/** Whether action is in progress */\n\tisLoading: Ref<boolean>;\n\n\t/** Open confirmation dialog and wait for response */\n\tconfirm: (options: ConfirmationConfig) => Promise<boolean>;\n\t/** Handle confirm button click */\n\thandleConfirm: () => void;\n\t/** Handle cancel button click */\n\thandleCancel: () => void;\n\t/** Close dialog without triggering callbacks */\n\tclose: () => void;\n\n\t/** Convenience: Confirm delete action */\n\tconfirmDelete: (itemName: string, options?: Partial<ConfirmationConfig>) => Promise<boolean>;\n\t/** Convenience: Confirm bulk delete action */\n\tconfirmBulkDelete: (count: number, itemType?: string, options?: Partial<ConfirmationConfig>) => Promise<boolean>;\n\t/** Convenience: Confirm destructive action */\n\tconfirmDestructive: (actionName: string, options?: Partial<ConfirmationConfig>) => Promise<boolean>;\n\t/** Convenience: Confirm with custom async action */\n\tconfirmWithAction: <T>(\n\t\toptions: ConfirmationConfig,\n\t\taction: () => Promise<T>\n\t) => Promise<{ confirmed: boolean; result?: T; error?: Error }>;\n\n\t/** Props for uiModal component */\n\tmodalProps: ComputedRef<{\n\t\ttitle: string;\n\t\topen: boolean;\n\t\tmodalName: string;\n\t\tactions: Array<{ name: string; value: string }>;\n\t}>;\n}\n\n/**\n * Creates a confirmation dialog composable\n *\n * @example\n * ```typescript\n * const confirmation = useConfirmation();\n *\n * async function handleDelete(item: Item) {\n * const confirmed = await confirmation.confirmDelete(item.name);\n * if (confirmed) {\n * await deleteItem(item.id);\n * }\n * }\n *\n * // Or with async action\n * async function handleDeleteWithAction(item: Item) {\n * const { confirmed, error } = await confirmation.confirmWithAction(\n * { title: 'Delete Item', message: `Delete \"${item.name}\"?` },\n * () => deleteItem(item.id)\n * );\n * if (confirmed && !error) {\n * showSuccess('Item deleted');\n * }\n * }\n *\n * // In template\n * <Modal\n * v-bind=\"confirmation.modalProps\"\n * @modal-action=\"(e) => e.action === 'confirm' ? confirmation.handleConfirm() : confirmation.handleCancel()\"\n * >\n * <p>{{ confirmation.config.message }}</p>\n * </Modal>\n * ```\n */\nexport function useConfirmation(options: UseConfirmationOptions = {}): UseConfirmationReturn {\n\tconst {\n\t\tdefaultConfirmText = 'Confirm',\n\t\tdefaultCancelText = 'Cancel',\n\t\tdefaultVariant = 'default',\n\t} = options;\n\n\t// State\n\tconst isOpen = ref(false);\n\tconst isLoading = ref(false);\n\tconst config = ref<ConfirmationConfig>({\n\t\ttitle: '',\n\t\tmessage: '',\n\t\tconfirmText: defaultConfirmText,\n\t\tcancelText: defaultCancelText,\n\t\tvariant: defaultVariant,\n\t});\n\n\t// Pending promise resolution\n\tlet pending: PendingConfirmation | null = null;\n\n\t/**\n\t * Open confirmation dialog and wait for user response\n\t */\n\tfunction confirm(confirmConfig: ConfirmationConfig): Promise<boolean> {\n\t\t// Set configuration with defaults\n\t\tconfig.value = {\n\t\t\t...confirmConfig,\n\t\t\tconfirmText: confirmConfig.confirmText ?? defaultConfirmText,\n\t\t\tcancelText: confirmConfig.cancelText ?? defaultCancelText,\n\t\t\tvariant: confirmConfig.variant ?? defaultVariant,\n\t\t};\n\n\t\tisOpen.value = true;\n\t\tisLoading.value = false;\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tpending = { resolve, reject };\n\t\t});\n\t}\n\n\t/**\n\t * Handle confirm button click\n\t */\n\tfunction handleConfirm(): void {\n\t\tif (pending) {\n\t\t\tpending.resolve(true);\n\t\t\tpending = null;\n\t\t}\n\t\tisOpen.value = false;\n\t\tisLoading.value = false;\n\t}\n\n\t/**\n\t * Handle cancel button click\n\t */\n\tfunction handleCancel(): void {\n\t\tif (pending) {\n\t\t\tpending.resolve(false);\n\t\t\tpending = null;\n\t\t}\n\t\tisOpen.value = false;\n\t\tisLoading.value = false;\n\t}\n\n\t/**\n\t * Close dialog without resolving\n\t */\n\tfunction close(): void {\n\t\tif (pending) {\n\t\t\tpending.resolve(false);\n\t\t\tpending = null;\n\t\t}\n\t\tisOpen.value = false;\n\t\tisLoading.value = false;\n\t}\n\n\t/**\n\t * Convenience: Confirm delete action\n\t */\n\tfunction confirmDelete(\n\t\titemName: string,\n\t\tconfirmConfig?: Partial<ConfirmationConfig>\n\t): Promise<boolean> {\n\t\treturn confirm({\n\t\t\ttitle: 'Delete Item',\n\t\t\tmessage: `Are you sure you want to delete \"${itemName}\"? This action cannot be undone.`,\n\t\t\tconfirmText: 'Delete',\n\t\t\tcancelText: 'Cancel',\n\t\t\tvariant: 'danger',\n\t\t\t...confirmConfig,\n\t\t});\n\t}\n\n\t/**\n\t * Convenience: Confirm bulk delete action\n\t */\n\tfunction confirmBulkDelete(\n\t\tcount: number,\n\t\titemType: string = 'items',\n\t\tconfirmConfig?: Partial<ConfirmationConfig>\n\t): Promise<boolean> {\n\t\treturn confirm({\n\t\t\ttitle: `Delete ${count} ${itemType}`,\n\t\t\tmessage: `Are you sure you want to delete ${count} ${itemType}? This action cannot be undone.`,\n\t\t\tconfirmText: 'Delete All',\n\t\t\tcancelText: 'Cancel',\n\t\t\tvariant: 'danger',\n\t\t\t...confirmConfig,\n\t\t});\n\t}\n\n\t/**\n\t * Convenience: Confirm destructive action\n\t */\n\tfunction confirmDestructive(\n\t\tactionName: string,\n\t\tconfirmConfig?: Partial<ConfirmationConfig>\n\t): Promise<boolean> {\n\t\treturn confirm({\n\t\t\ttitle: `Confirm ${actionName}`,\n\t\t\tmessage: `Are you sure you want to ${actionName.toLowerCase()}? This action cannot be undone.`,\n\t\t\tconfirmText: actionName,\n\t\t\tcancelText: 'Cancel',\n\t\t\tvariant: 'danger',\n\t\t\t...confirmConfig,\n\t\t});\n\t}\n\n\t/**\n\t * Convenience: Confirm with async action execution\n\t */\n\tasync function confirmWithAction<T>(\n\t\tconfirmConfig: ConfirmationConfig,\n\t\taction: () => Promise<T>\n\t): Promise<{ confirmed: boolean; result?: T; error?: Error }> {\n\t\tconst confirmed = await confirm(confirmConfig);\n\n\t\tif (!confirmed) {\n\t\t\treturn { confirmed: false };\n\t\t}\n\n\t\t// Show loading state\n\t\tisLoading.value = true;\n\n\t\ttry {\n\t\t\tconst result = await action();\n\t\t\tisOpen.value = false;\n\t\t\tisLoading.value = false;\n\t\t\treturn { confirmed: true, result };\n\t\t} catch (error) {\n\t\t\tisLoading.value = false;\n\t\t\treturn {\n\t\t\t\tconfirmed: true,\n\t\t\t\terror: error instanceof Error ? error : new Error(String(error)),\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Props for uiModal component\n\t */\n\tconst modalProps = computed(() => ({\n\t\ttitle: config.value.title,\n\t\topen: isOpen.value,\n\t\tmodalName: 'confirmation-dialog',\n\t\tactions: [\n\t\t\t{\n\t\t\t\tname: config.value.cancelText ?? defaultCancelText,\n\t\t\t\tvalue: 'cancel',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: config.value.confirmText ?? defaultConfirmText,\n\t\t\t\tvalue: 'confirm',\n\t\t\t},\n\t\t],\n\t}));\n\n\treturn {\n\t\t// State\n\t\tisOpen,\n\t\tconfig,\n\t\tisLoading,\n\n\t\t// Core methods\n\t\tconfirm,\n\t\thandleConfirm,\n\t\thandleCancel,\n\t\tclose,\n\n\t\t// Convenience methods\n\t\tconfirmDelete,\n\t\tconfirmBulkDelete,\n\t\tconfirmDestructive,\n\t\tconfirmWithAction,\n\n\t\t// Modal props\n\t\tmodalProps,\n\t};\n}\n\n/**\n * Global confirmation instance for use across components\n */\nlet globalConfirmation: UseConfirmationReturn | null = null;\n\n/**\n * Get or create global confirmation instance\n *\n * @example\n * ```typescript\n * // In any component\n * const confirmation = useGlobalConfirmation();\n * await confirmation.confirmDelete('Item Name');\n * ```\n */\nexport function useGlobalConfirmation(): UseConfirmationReturn {\n\tif (!globalConfirmation) {\n\t\tglobalConfirmation = useConfirmation();\n\t}\n\treturn globalConfirmation;\n}\n\n/**\n * Reset global confirmation instance (useful for testing)\n */\nexport function resetGlobalConfirmation(): void {\n\tglobalConfirmation = null;\n}\n","/**\n * Admin Page Composable\n *\n * Provides common page-level state and configuration for admin pages.\n * Integrates with AdminWrapper, Breadcrumbs, and page context.\n */\n\nimport { ref, computed, onMounted, type Ref, type ComputedRef, type Component } from 'vue';\nimport { usePageContext, type PageUser, type PageBrand } from './usePageContext';\n\n/**\n * Breadcrumb item\n */\nexport interface BreadcrumbItem {\n\t/** Display name */\n\tname: string;\n\t/** Route path or name */\n\thref?: string;\n\t/** Whether this is the current page */\n\tcurrent?: boolean;\n\t/** Icon component */\n\ticon?: Component;\n}\n\n/**\n * Page action button\n */\nexport interface PageAction {\n\t/** Unique identifier */\n\tid: string;\n\t/** Button text */\n\ttext: string;\n\t/** Button icon */\n\ticon?: Component;\n\t/** Button color variant */\n\tcolor?: 'primary' | 'secondary' | 'danger' | 'warning';\n\t/** Whether button is disabled */\n\tdisabled?: boolean;\n\t/** Whether button shows loading state */\n\tloading?: boolean;\n\t/** Click handler */\n\tonClick?: () => void | Promise<void>;\n}\n\n/**\n * Options for useAdminPage\n */\nexport interface UseAdminPageOptions {\n\t/** Page title */\n\ttitle: string;\n\t/** Page subtitle (optional) */\n\tsubtitle?: string;\n\t/** Page description (optional) */\n\tdescription?: string;\n\t/** Breadcrumb items (without current page) */\n\tbreadcrumbs?: BreadcrumbItem[];\n\t/** Active sidebar item ID */\n\tsidebarActive?: string;\n\t/** Page action buttons */\n\tactions?: PageAction[];\n\t/** Initial loading state */\n\tloading?: boolean;\n\t/** Loading reveal delay (ms) */\n\tloadingDelay?: number;\n}\n\n/**\n * Return type for useAdminPage\n */\nexport interface UseAdminPageReturn {\n\t// Page info\n\ttitle: string;\n\tsubtitle: string | undefined;\n\tdescription: string | undefined;\n\n\t// Breadcrumbs\n\tbreadcrumbs: ComputedRef<BreadcrumbItem[]>;\n\n\t// Loading state (with staggered reveal)\n\tloadingHeader: Ref<boolean>;\n\tloadingContent: Ref<boolean>;\n\tsetLoading: (loading: boolean) => void;\n\n\t// Page context\n\tuser: ComputedRef<PageUser | null>;\n\tbrand: ComputedRef<PageBrand | null>;\n\tisAdmin: ComputedRef<boolean>;\n\tisSuperAdmin: ComputedRef<boolean>;\n\n\t// Actions\n\tactions: Ref<PageAction[]>;\n\tupdateAction: (id: string, updates: Partial<PageAction>) => void;\n\tsetActionLoading: (id: string, loading: boolean) => void;\n\n\t// Wrapper props\n\twrapperProps: ComputedRef<{\n\t\tcurrentPage: string | undefined;\n\t}>;\n\n\t// Header props (for uiViewHeader)\n\theaderProps: ComputedRef<{\n\t\ttitle: string;\n\t\tsubtitle?: string;\n\t\tdescription?: string;\n\t\tpages: BreadcrumbItem[];\n\t\tloading: boolean;\n\t}>;\n}\n\n/**\n * Creates an admin page composable for common page setup\n *\n * @example\n * ```typescript\n * const page = useAdminPage({\n * title: 'Campaigns',\n * subtitle: 'Manage your email campaigns',\n * breadcrumbs: [\n * { name: 'Dashboard', href: '/dashboard' },\n * { name: 'Marketing', href: '/marketing' },\n * ],\n * sidebarActive: 'campaigns',\n * actions: [\n * {\n * id: 'create',\n * text: 'Create Campaign',\n * icon: PlusIcon,\n * color: 'primary',\n * onClick: () => navigateTo('/campaigns/create'),\n * },\n * ],\n * });\n *\n * // In template\n * <AdminWrapper v-bind=\"page.wrapperProps\">\n * <uiViewHeader v-bind=\"page.headerProps\" />\n * <!-- Content -->\n * </AdminWrapper>\n * ```\n */\nexport function useAdminPage(options: UseAdminPageOptions): UseAdminPageReturn {\n\tconst {\n\t\ttitle,\n\t\tsubtitle,\n\t\tdescription,\n\t\tbreadcrumbs: initialBreadcrumbs = [],\n\t\tsidebarActive,\n\t\tactions: initialActions = [],\n\t\tloading: initialLoading = true,\n\t\tloadingDelay = 200,\n\t} = options;\n\n\t// Get page context\n\tconst context = usePageContext();\n\n\t// Loading states\n\tconst loadingHeader = ref(initialLoading);\n\tconst loadingContent = ref(initialLoading);\n\n\t// Actions state\n\tconst actions = ref<PageAction[]>([...initialActions]);\n\n\t// Staggered loading reveal on mount\n\tonMounted(() => {\n\t\tif (initialLoading) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tloadingHeader.value = false;\n\t\t\t}, loadingDelay);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tloadingContent.value = false;\n\t\t\t}, loadingDelay * 2);\n\t\t}\n\t});\n\n\t// Computed: User from context\n\tconst user = computed(() => context.value.user);\n\n\t// Computed: Brand from context\n\tconst brand = computed(() => context.value.brand);\n\n\t// Computed: Admin status\n\tconst isAdmin = computed(() => user.value?.isAdmin ?? false);\n\n\t// Computed: Super admin status\n\tconst isSuperAdmin = computed(() => user.value?.isSuperAdmin ?? false);\n\n\t// Computed: Breadcrumbs with current page\n\tconst breadcrumbs = computed<BreadcrumbItem[]>(() => [\n\t\t...initialBreadcrumbs.map(b => ({ ...b, current: false })),\n\t\t{ name: title, current: true },\n\t]);\n\n\t// Computed: Props for AdminWrapper\n\tconst wrapperProps = computed(() => ({\n\t\tcurrentPage: sidebarActive,\n\t}));\n\n\t// Computed: Props for uiViewHeader\n\tconst headerProps = computed(() => ({\n\t\ttitle,\n\t\tsubtitle,\n\t\tdescription,\n\t\tpages: breadcrumbs.value,\n\t\tloading: loadingHeader.value,\n\t}));\n\n\t// Set loading state\n\tfunction setLoading(loading: boolean): void {\n\t\tif (loading) {\n\t\t\tloadingHeader.value = true;\n\t\t\tloadingContent.value = true;\n\t\t} else {\n\t\t\tsetTimeout(() => {\n\t\t\t\tloadingHeader.value = false;\n\t\t\t}, loadingDelay);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tloadingContent.value = false;\n\t\t\t}, loadingDelay * 2);\n\t\t}\n\t}\n\n\t// Update action by ID\n\tfunction updateAction(id: string, updates: Partial<PageAction>): void {\n\t\tconst index = actions.value.findIndex(a => a.id === id);\n\t\tif (index !== -1) {\n\t\t\tactions.value[index] = { ...actions.value[index], ...updates };\n\t\t}\n\t}\n\n\t// Set action loading state\n\tfunction setActionLoading(id: string, loading: boolean): void {\n\t\tupdateAction(id, { loading });\n\t}\n\n\treturn {\n\t\t// Page info\n\t\ttitle,\n\t\tsubtitle,\n\t\tdescription,\n\n\t\t// Breadcrumbs\n\t\tbreadcrumbs,\n\n\t\t// Loading\n\t\tloadingHeader,\n\t\tloadingContent,\n\t\tsetLoading,\n\n\t\t// Context\n\t\tuser,\n\t\tbrand,\n\t\tisAdmin,\n\t\tisSuperAdmin,\n\n\t\t// Actions\n\t\tactions,\n\t\tupdateAction,\n\t\tsetActionLoading,\n\n\t\t// Props\n\t\twrapperProps,\n\t\theaderProps,\n\t};\n}\n\n/**\n * Helper: Create a list page configuration\n *\n * @example\n * const page = useListPage({\n * title: 'Users',\n * entityName: 'user',\n * breadcrumbs: [{ name: 'Settings', href: '/settings' }],\n * sidebarActive: 'users',\n * onCreateClick: () => navigateTo('/users/create'),\n * });\n */\nexport interface UseListPageOptions extends Omit<UseAdminPageOptions, 'actions'> {\n\t/** Entity name for create button (e.g., 'user' -> 'Create User') */\n\tentityName?: string;\n\t/** Create button click handler */\n\tonCreateClick?: () => void;\n\t/** Create button icon */\n\tcreateIcon?: Component;\n\t/** Hide create button */\n\thideCreate?: boolean;\n}\n\nexport function useListPage(options: UseListPageOptions): UseAdminPageReturn {\n\tconst {\n\t\tentityName,\n\t\tonCreateClick,\n\t\tcreateIcon,\n\t\thideCreate = false,\n\t\t...pageOptions\n\t} = options;\n\n\tconst actions: PageAction[] = [];\n\n\tif (!hideCreate && entityName) {\n\t\tactions.push({\n\t\t\tid: 'create',\n\t\t\ttext: `Create ${entityName.charAt(0).toUpperCase() + entityName.slice(1)}`,\n\t\t\ticon: createIcon,\n\t\t\tcolor: 'primary',\n\t\t\tonClick: onCreateClick,\n\t\t});\n\t}\n\n\treturn useAdminPage({\n\t\t...pageOptions,\n\t\tactions,\n\t});\n}\n\n/**\n * Helper: Create a detail page configuration\n *\n * @example\n * const page = useDetailPage({\n * title: 'User Details',\n * entityName: 'user',\n * breadcrumbs: [\n * { name: 'Settings', href: '/settings' },\n * { name: 'Users', href: '/users' },\n * ],\n * onEditClick: () => navigateTo(`/users/${id}/edit`),\n * onDeleteClick: () => confirmDelete(),\n * });\n */\nexport interface UseDetailPageOptions extends Omit<UseAdminPageOptions, 'actions'> {\n\t/** Entity name for action buttons */\n\tentityName?: string;\n\t/** Edit button click handler */\n\tonEditClick?: () => void;\n\t/** Delete button click handler */\n\tonDeleteClick?: () => void;\n\t/** Edit button icon */\n\teditIcon?: Component;\n\t/** Delete button icon */\n\tdeleteIcon?: Component;\n\t/** Hide edit button */\n\thideEdit?: boolean;\n\t/** Hide delete button */\n\thideDelete?: boolean;\n}\n\nexport function useDetailPage(options: UseDetailPageOptions): UseAdminPageReturn {\n\tconst {\n\t\tentityName,\n\t\tonEditClick,\n\t\tonDeleteClick,\n\t\teditIcon,\n\t\tdeleteIcon,\n\t\thideEdit = false,\n\t\thideDelete = false,\n\t\t...pageOptions\n\t} = options;\n\n\tconst actions: PageAction[] = [];\n\n\tif (!hideEdit && onEditClick) {\n\t\tactions.push({\n\t\t\tid: 'edit',\n\t\t\ttext: 'Edit',\n\t\t\ticon: editIcon,\n\t\t\tcolor: 'secondary',\n\t\t\tonClick: onEditClick,\n\t\t});\n\t}\n\n\tif (!hideDelete && onDeleteClick) {\n\t\tactions.push({\n\t\t\tid: 'delete',\n\t\t\ttext: 'Delete',\n\t\t\ticon: deleteIcon,\n\t\t\tcolor: 'danger',\n\t\t\tonClick: onDeleteClick,\n\t\t});\n\t}\n\n\treturn useAdminPage({\n\t\t...pageOptions,\n\t\tactions,\n\t});\n}\n\n/**\n * Helper: Create a form page configuration\n *\n * @example\n * const page = useFormPage({\n * title: 'Create User',\n * breadcrumbs: [\n * { name: 'Settings', href: '/settings' },\n * { name: 'Users', href: '/users' },\n * ],\n * onSaveClick: () => saveUser(),\n * onCancelClick: () => navigateTo('/users'),\n * });\n */\nexport interface UseFormPageOptions extends Omit<UseAdminPageOptions, 'actions'> {\n\t/** Save button click handler */\n\tonSaveClick?: () => void | Promise<void>;\n\t/** Cancel button click handler */\n\tonCancelClick?: () => void;\n\t/** Save button text */\n\tsaveText?: string;\n\t/** Cancel button text */\n\tcancelText?: string;\n\t/** Save button icon */\n\tsaveIcon?: Component;\n\t/** Cancel button icon */\n\tcancelIcon?: Component;\n\t/** Hide save button */\n\thideSave?: boolean;\n\t/** Hide cancel button */\n\thideCancel?: boolean;\n}\n\nexport function useFormPage(options: UseFormPageOptions): UseAdminPageReturn {\n\tconst {\n\t\tonSaveClick,\n\t\tonCancelClick,\n\t\tsaveText = 'Save',\n\t\tcancelText = 'Cancel',\n\t\tsaveIcon,\n\t\tcancelIcon,\n\t\thideSave = false,\n\t\thideCancel = false,\n\t\t...pageOptions\n\t} = options;\n\n\tconst actions: PageAction[] = [];\n\n\tif (!hideCancel && onCancelClick) {\n\t\tactions.push({\n\t\t\tid: 'cancel',\n\t\t\ttext: cancelText,\n\t\t\ticon: cancelIcon,\n\t\t\tcolor: 'secondary',\n\t\t\tonClick: onCancelClick,\n\t\t});\n\t}\n\n\tif (!hideSave && onSaveClick) {\n\t\tactions.push({\n\t\t\tid: 'save',\n\t\t\ttext: saveText,\n\t\t\ticon: saveIcon,\n\t\t\tcolor: 'primary',\n\t\t\tonClick: onSaveClick,\n\t\t});\n\t}\n\n\treturn useAdminPage({\n\t\t...pageOptions,\n\t\tactions,\n\t});\n}\n"],"names":["nextTab","isValid","min","max"],"mappings":"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"}
|