@htlkg/components 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +52 -0
  2. package/dist/AdminWrapper.vue_vue_type_script_setup_true_lang-B32IylcT.js +367 -0
  3. package/dist/AdminWrapper.vue_vue_type_script_setup_true_lang-B32IylcT.js.map +1 -0
  4. package/dist/Alert.vue_vue_type_script_setup_true_lang-DxPCS-Hx.js +263 -0
  5. package/dist/Alert.vue_vue_type_script_setup_true_lang-DxPCS-Hx.js.map +1 -0
  6. package/dist/DateRange.vue_vue_type_script_setup_true_lang-BLVg1Hah.js +580 -0
  7. package/dist/DateRange.vue_vue_type_script_setup_true_lang-BLVg1Hah.js.map +1 -0
  8. package/dist/ProductBadge.vue_vue_type_script_setup_true_lang-Cmr2f4Cy.js +187 -0
  9. package/dist/ProductBadge.vue_vue_type_script_setup_true_lang-Cmr2f4Cy.js.map +1 -0
  10. package/dist/_plugin-vue_export-helper-1tPrXgE0.js +11 -0
  11. package/dist/_plugin-vue_export-helper-1tPrXgE0.js.map +1 -0
  12. package/dist/components.css +15 -0
  13. package/dist/composables/index.js +32 -573
  14. package/dist/composables/index.js.map +1 -1
  15. package/dist/data/index.js +18 -0
  16. package/dist/data/index.js.map +1 -0
  17. package/dist/domain/index.js +8 -0
  18. package/dist/domain/index.js.map +1 -0
  19. package/dist/filterHelpers-DgRyoYSa.js +1386 -0
  20. package/dist/filterHelpers-DgRyoYSa.js.map +1 -0
  21. package/dist/forms/index.js +6 -0
  22. package/dist/forms/index.js.map +1 -0
  23. package/dist/index-DGO_pNgG.js +79 -0
  24. package/dist/index-DGO_pNgG.js.map +1 -0
  25. package/dist/index-QK97OdqQ.js +25 -0
  26. package/dist/index-QK97OdqQ.js.map +1 -0
  27. package/dist/index.js +67 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/navigation/index.js +8 -0
  30. package/dist/navigation/index.js.map +1 -0
  31. package/dist/overlays/index.js +8 -0
  32. package/dist/overlays/index.js.map +1 -0
  33. package/dist/stores/index.js +14 -0
  34. package/dist/stores/index.js.map +1 -0
  35. package/dist/useAdminPage-GhgXp0x8.js +1070 -0
  36. package/dist/useAdminPage-GhgXp0x8.js.map +1 -0
  37. package/dist/useTable-DutR1gkg.js +293 -0
  38. package/dist/useTable-DutR1gkg.js.map +1 -0
  39. package/package.json +43 -14
  40. package/src/composables/composables.md +109 -0
  41. package/src/composables/index.ts +69 -0
  42. package/src/composables/useAdminPage.ts +462 -0
  43. package/src/composables/useConfirmation.ts +358 -0
  44. package/src/composables/usePageContext.ts +171 -0
  45. package/src/composables/useStats.ts +361 -0
  46. package/src/composables/useTable.ts +26 -5
  47. package/src/composables/useWizard.ts +448 -0
  48. package/src/data/DataTable.vue +553 -0
  49. package/src/data/Table/Table.vue +295 -0
  50. package/src/data/columnHelpers.ts +503 -0
  51. package/src/data/data.md +106 -0
  52. package/src/data/filterHelpers.ts +358 -0
  53. package/src/data/index.ts +31 -0
  54. package/src/domain/domain.md +102 -0
  55. package/src/forms/JsonSchemaForm.vue +4 -1
  56. package/src/forms/forms.md +89 -0
  57. package/src/index.ts +4 -3
  58. package/src/navigation/navigation.md +80 -0
  59. package/src/overlays/overlays.md +86 -0
  60. package/src/stores/stores.md +82 -0
@@ -0,0 +1,263 @@
1
+ import { defineComponent, computed, createBlock, openBlock, unref, createSlots, withCtx, renderSlot, createElementBlock, createCommentVNode, createElementVNode, withModifiers, normalizeClass, toDisplayString, createVNode } from "vue";
2
+ import { uiModal, uiNotification, uiAlert } from "@hotelinking/ui";
3
+ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4
+ __name: "Modal",
5
+ props: {
6
+ open: { type: Boolean, default: false },
7
+ title: { default: "" },
8
+ content: { default: "" },
9
+ modalName: { default: "modal" },
10
+ actions: { default: () => [] },
11
+ size: { default: "medium" }
12
+ },
13
+ emits: ["update:open", "close", "action"],
14
+ setup(__props, { expose: __expose, emit: __emit }) {
15
+ const props = __props;
16
+ const emit = __emit;
17
+ const isOpen = computed({
18
+ get: () => props.open,
19
+ set: (value) => {
20
+ emit("update:open", value);
21
+ if (!value) {
22
+ emit("close");
23
+ }
24
+ }
25
+ });
26
+ const modalConfig = computed(() => ({
27
+ title: props.title,
28
+ content: props.content,
29
+ modalName: props.modalName,
30
+ open: isOpen.value,
31
+ actions: props.actions
32
+ }));
33
+ function handleModalAction(data) {
34
+ emit("action", data);
35
+ isOpen.value = false;
36
+ }
37
+ __expose({
38
+ open: () => {
39
+ isOpen.value = true;
40
+ },
41
+ close: () => {
42
+ isOpen.value = false;
43
+ },
44
+ toggle: () => {
45
+ isOpen.value = !isOpen.value;
46
+ }
47
+ });
48
+ return (_ctx, _cache) => {
49
+ return openBlock(), createBlock(unref(uiModal), {
50
+ title: modalConfig.value.title,
51
+ content: modalConfig.value.content,
52
+ modalName: modalConfig.value.modalName,
53
+ open: modalConfig.value.open,
54
+ actions: modalConfig.value.actions,
55
+ onModalAction: handleModalAction
56
+ }, createSlots({ _: 2 }, [
57
+ _ctx.$slots.default ? {
58
+ name: "default",
59
+ fn: withCtx(() => [
60
+ renderSlot(_ctx.$slots, "default")
61
+ ]),
62
+ key: "0"
63
+ } : void 0,
64
+ _ctx.$slots.header ? {
65
+ name: "header",
66
+ fn: withCtx(() => [
67
+ renderSlot(_ctx.$slots, "header")
68
+ ]),
69
+ key: "1"
70
+ } : void 0,
71
+ _ctx.$slots.footer ? {
72
+ name: "footer",
73
+ fn: withCtx(() => [
74
+ renderSlot(_ctx.$slots, "footer")
75
+ ]),
76
+ key: "2"
77
+ } : void 0
78
+ ]), 1032, ["title", "content", "modalName", "open", "actions"]);
79
+ };
80
+ }
81
+ });
82
+ const _hoisted_1$1 = { class: "flex justify-between items-center p-4 border-b border-gray-200" };
83
+ const _hoisted_2 = { class: "text-lg font-medium" };
84
+ const _hoisted_3 = { class: "p-4 overflow-auto" };
85
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
86
+ __name: "Drawer",
87
+ props: {
88
+ open: { type: Boolean, default: false },
89
+ position: { default: "right" },
90
+ title: { default: "" }
91
+ },
92
+ emits: ["update:open", "close"],
93
+ setup(__props, { expose: __expose, emit: __emit }) {
94
+ const props = __props;
95
+ const emit = __emit;
96
+ const isOpen = computed({
97
+ get: () => props.open,
98
+ set: (value) => {
99
+ emit("update:open", value);
100
+ if (!value) emit("close");
101
+ }
102
+ });
103
+ function close() {
104
+ isOpen.value = false;
105
+ }
106
+ __expose({
107
+ open: () => {
108
+ isOpen.value = true;
109
+ },
110
+ close: () => {
111
+ isOpen.value = false;
112
+ },
113
+ toggle: () => {
114
+ isOpen.value = !isOpen.value;
115
+ }
116
+ });
117
+ return (_ctx, _cache) => {
118
+ return isOpen.value ? (openBlock(), createElementBlock("div", {
119
+ key: 0,
120
+ class: "fixed inset-0 bg-black bg-opacity-50 z-50",
121
+ onClick: close
122
+ }, [
123
+ createElementVNode("div", {
124
+ class: normalizeClass(["fixed bg-white shadow-xl z-51", {
125
+ "top-0 right-0 bottom-0 w-96 max-w-[90vw]": __props.position === "right",
126
+ "top-0 left-0 bottom-0 w-96 max-w-[90vw]": __props.position === "left",
127
+ "top-0 left-0 right-0 h-96 max-h-[90vh]": __props.position === "top",
128
+ "bottom-0 left-0 right-0 h-96 max-h-[90vh]": __props.position === "bottom"
129
+ }]),
130
+ onClick: _cache[0] || (_cache[0] = withModifiers(() => {
131
+ }, ["stop"]))
132
+ }, [
133
+ createElementVNode("div", _hoisted_1$1, [
134
+ createElementVNode("h3", _hoisted_2, toDisplayString(__props.title), 1),
135
+ createElementVNode("button", {
136
+ onClick: close,
137
+ class: "text-2xl text-gray-500 hover:text-gray-700 bg-transparent border-none cursor-pointer"
138
+ }, " × ")
139
+ ]),
140
+ createElementVNode("div", _hoisted_3, [
141
+ renderSlot(_ctx.$slots, "default")
142
+ ])
143
+ ], 2)
144
+ ])) : createCommentVNode("", true);
145
+ };
146
+ }
147
+ });
148
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
149
+ __name: "Notification",
150
+ props: {
151
+ title: {},
152
+ message: { default: "" },
153
+ type: { default: "info" },
154
+ show: { type: Boolean, default: false },
155
+ fixed: { type: Boolean, default: true }
156
+ },
157
+ emits: ["update:show", "close"],
158
+ setup(__props, { expose: __expose, emit: __emit }) {
159
+ const props = __props;
160
+ const emit = __emit;
161
+ const isVisible = computed({
162
+ get: () => props.show,
163
+ set: (value) => {
164
+ emit("update:show", value);
165
+ if (!value) {
166
+ emit("close");
167
+ }
168
+ }
169
+ });
170
+ function handleClose() {
171
+ isVisible.value = false;
172
+ }
173
+ __expose({
174
+ show: () => {
175
+ isVisible.value = true;
176
+ },
177
+ hide: () => {
178
+ isVisible.value = false;
179
+ },
180
+ toggle: () => {
181
+ isVisible.value = !isVisible.value;
182
+ }
183
+ });
184
+ return (_ctx, _cache) => {
185
+ return openBlock(), createBlock(unref(uiNotification), {
186
+ show: isVisible.value,
187
+ type: __props.type,
188
+ title: __props.title,
189
+ message: __props.message,
190
+ fixed: __props.fixed,
191
+ onCloseNotification: handleClose
192
+ }, null, 8, ["show", "type", "title", "message", "fixed"]);
193
+ };
194
+ }
195
+ });
196
+ const _hoisted_1 = { key: 0 };
197
+ const _sfc_main = /* @__PURE__ */ defineComponent({
198
+ __name: "Alert",
199
+ props: {
200
+ title: {},
201
+ type: { default: "info" },
202
+ actions: { default: () => [] },
203
+ loading: { type: Boolean, default: false },
204
+ show: { type: Boolean, default: true }
205
+ },
206
+ emits: ["update:show", "alertEvent", "close"],
207
+ setup(__props, { expose: __expose, emit: __emit }) {
208
+ const props = __props;
209
+ const emit = __emit;
210
+ const isVisible = computed({
211
+ get: () => props.show,
212
+ set: (value) => {
213
+ emit("update:show", value);
214
+ if (!value) {
215
+ emit("close");
216
+ }
217
+ }
218
+ });
219
+ const alertConfig = computed(() => ({
220
+ title: props.title,
221
+ type: props.type,
222
+ actions: props.actions,
223
+ loading: props.loading
224
+ }));
225
+ function handleAlertEvent(event) {
226
+ emit("alertEvent", event);
227
+ }
228
+ __expose({
229
+ show: () => {
230
+ isVisible.value = true;
231
+ },
232
+ hide: () => {
233
+ isVisible.value = false;
234
+ },
235
+ toggle: () => {
236
+ isVisible.value = !isVisible.value;
237
+ }
238
+ });
239
+ return (_ctx, _cache) => {
240
+ return isVisible.value ? (openBlock(), createElementBlock("div", _hoisted_1, [
241
+ createVNode(unref(uiAlert), {
242
+ title: alertConfig.value.title,
243
+ type: alertConfig.value.type,
244
+ actions: alertConfig.value.actions,
245
+ loading: alertConfig.value.loading,
246
+ onAlertEvent: handleAlertEvent
247
+ }, {
248
+ default: withCtx(() => [
249
+ renderSlot(_ctx.$slots, "default")
250
+ ]),
251
+ _: 3
252
+ }, 8, ["title", "type", "actions", "loading"])
253
+ ])) : createCommentVNode("", true);
254
+ };
255
+ }
256
+ });
257
+ export {
258
+ _sfc_main$3 as _,
259
+ _sfc_main$2 as a,
260
+ _sfc_main$1 as b,
261
+ _sfc_main as c
262
+ };
263
+ //# sourceMappingURL=Alert.vue_vue_type_script_setup_true_lang-DxPCS-Hx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Alert.vue_vue_type_script_setup_true_lang-DxPCS-Hx.js","sources":["../src/overlays/Modal.vue","../src/overlays/Drawer.vue","../src/overlays/Notification.vue","../src/overlays/Alert.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { uiModal as UiModal, type UiModalInterface } from '@hotelinking/ui';\n\ninterface Props {\n open?: boolean;\n title?: string;\n content?: string;\n modalName?: string;\n actions?: UiModalInterface['actions'];\n size?: 'small' | 'medium' | 'large';\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n open: false,\n title: '',\n content: '',\n modalName: 'modal',\n actions: () => [],\n size: 'medium'\n});\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n 'close': [];\n 'action': [action: any];\n}>();\n\n// Internal state synced with v-model\nconst isOpen = computed({\n get: () => props.open,\n set: (value: boolean) => {\n emit('update:open', value);\n if (!value) {\n emit('close');\n }\n }\n});\n\n// Convert to uiModal format\nconst modalConfig = computed<UiModalInterface>(() => ({\n title: props.title,\n content: props.content,\n modalName: props.modalName,\n open: isOpen.value,\n actions: props.actions\n}));\n\n// Handle modal actions from uiModal\n// uiModal emits: { modal: string, action: string }\nfunction handleModalAction(data: { modal: string; action: string }) {\n emit('action', data);\n \n // Close modal when clicking X, clicking outside, or any action\n // This matches uiModal behavior where any action closes the modal\n isOpen.value = false;\n}\n\n// Expose methods for parent components\ndefineExpose({\n open: () => { isOpen.value = true; },\n close: () => { isOpen.value = false; },\n toggle: () => { isOpen.value = !isOpen.value; }\n});\n</script>\n\n<template>\n <UiModal\n :title=\"modalConfig.title\"\n :content=\"modalConfig.content\"\n :modalName=\"modalConfig.modalName\"\n :open=\"modalConfig.open\"\n :actions=\"modalConfig.actions\"\n @modalAction=\"handleModalAction\"\n >\n <template v-if=\"$slots.default\" #default>\n <slot />\n </template>\n <template v-if=\"$slots.header\" #header>\n <slot name=\"header\" />\n </template>\n <template v-if=\"$slots.footer\" #footer>\n <slot name=\"footer\" />\n </template>\n </UiModal>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\ninterface Props {\n open?: boolean;\n position?: 'left' | 'right' | 'top' | 'bottom';\n title?: string;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n open: false,\n position: 'right',\n title: ''\n});\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n 'close': [];\n}>();\n\nconst isOpen = computed({\n get: () => props.open,\n set: (value: boolean) => {\n emit('update:open', value);\n if (!value) emit('close');\n }\n});\n\nfunction close() {\n isOpen.value = false;\n}\n\n// Expose methods for parent components\ndefineExpose({\n open: () => { isOpen.value = true; },\n close: () => { isOpen.value = false; },\n toggle: () => { isOpen.value = !isOpen.value; }\n});\n</script>\n\n<template>\n <!-- Overlay -->\n <div\n v-if=\"isOpen\"\n class=\"fixed inset-0 bg-black bg-opacity-50 z-50\"\n @click=\"close\"\n >\n <!-- Drawer -->\n <div\n class=\"fixed bg-white shadow-xl z-51\"\n :class=\"{\n 'top-0 right-0 bottom-0 w-96 max-w-[90vw]': position === 'right',\n 'top-0 left-0 bottom-0 w-96 max-w-[90vw]': position === 'left',\n 'top-0 left-0 right-0 h-96 max-h-[90vh]': position === 'top',\n 'bottom-0 left-0 right-0 h-96 max-h-[90vh]': position === 'bottom'\n }\"\n @click.stop\n >\n <!-- Header -->\n <div class=\"flex justify-between items-center p-4 border-b border-gray-200\">\n <h3 class=\"text-lg font-medium\">{{ title }}</h3>\n <button\n @click=\"close\"\n class=\"text-2xl text-gray-500 hover:text-gray-700 bg-transparent border-none cursor-pointer\"\n >\n ×\n </button>\n </div>\n \n <!-- Content -->\n <div class=\"p-4 overflow-auto\">\n <slot />\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { uiNotification } from '@hotelinking/ui';\n\ninterface Props {\n title: string;\n message?: string;\n type?: 'info' | 'success' | 'warning' | 'danger';\n show?: boolean;\n fixed?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n message: '',\n type: 'info',\n show: false,\n fixed: true\n});\n\nconst emit = defineEmits<{\n 'update:show': [value: boolean];\n 'close': [];\n}>();\n\n// Internal state synced with v-model\nconst isVisible = computed({\n get: () => props.show,\n set: (value: boolean) => {\n emit('update:show', value);\n if (!value) {\n emit('close');\n }\n }\n});\n\n// Handle notification close\nfunction handleClose() {\n isVisible.value = false;\n}\n\n// Expose methods for parent components\ndefineExpose({\n show: () => { isVisible.value = true; },\n hide: () => { isVisible.value = false; },\n toggle: () => { isVisible.value = !isVisible.value; }\n});\n</script>\n\n<template>\n <uiNotification\n :show=\"isVisible\"\n :type=\"type\"\n :title=\"title\"\n :message=\"message\"\n :fixed=\"fixed\"\n @close-notification=\"handleClose\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { uiAlert, type UiAlertInterface } from '@hotelinking/ui';\n\ninterface Props {\n title: string;\n type?: UiAlertInterface['type'];\n actions?: UiAlertInterface['actions'];\n loading?: boolean;\n show?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: 'info',\n actions: () => [],\n loading: false,\n show: true\n});\n\nconst emit = defineEmits<{\n 'update:show': [value: boolean];\n 'alertEvent': [event: string];\n 'close': [];\n}>();\n\n// Internal state synced with v-model\nconst isVisible = computed({\n get: () => props.show,\n set: (value: boolean) => {\n emit('update:show', value);\n if (!value) {\n emit('close');\n }\n }\n});\n\n// Convert to uiAlert format\nconst alertConfig = computed<UiAlertInterface>(() => ({\n title: props.title,\n type: props.type,\n actions: props.actions,\n loading: props.loading\n}));\n\n// Handle alert action events from uiAlert\nfunction handleAlertEvent(event: string) {\n emit('alertEvent', event);\n}\n\n// Expose methods for parent components\ndefineExpose({\n show: () => { isVisible.value = true; },\n hide: () => { isVisible.value = false; },\n toggle: () => { isVisible.value = !isVisible.value; }\n});\n</script>\n\n<template>\n <div v-if=\"isVisible\">\n <uiAlert\n :title=\"alertConfig.title\"\n :type=\"alertConfig.type\"\n :actions=\"alertConfig.actions\"\n :loading=\"alertConfig.loading\"\n @alert-event=\"handleAlertEvent\"\n >\n <slot />\n </uiAlert>\n </div>\n</template>\n"],"names":["_createBlock","_unref","UiModal","$slots","_renderSlot","_createElementBlock","_createElementVNode","_hoisted_1","_toDisplayString","_createVNode"],"mappings":"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"}