@htlkg/components 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -0
- package/dist/AdminWrapper.vue_vue_type_script_setup_true_lang-B32IylcT.js +367 -0
- package/dist/AdminWrapper.vue_vue_type_script_setup_true_lang-B32IylcT.js.map +1 -0
- package/dist/Alert.vue_vue_type_script_setup_true_lang-DxPCS-Hx.js +263 -0
- package/dist/Alert.vue_vue_type_script_setup_true_lang-DxPCS-Hx.js.map +1 -0
- package/dist/DateRange.vue_vue_type_script_setup_true_lang-BLVg1Hah.js +580 -0
- package/dist/DateRange.vue_vue_type_script_setup_true_lang-BLVg1Hah.js.map +1 -0
- package/dist/ProductBadge.vue_vue_type_script_setup_true_lang-Cmr2f4Cy.js +187 -0
- package/dist/ProductBadge.vue_vue_type_script_setup_true_lang-Cmr2f4Cy.js.map +1 -0
- package/dist/_plugin-vue_export-helper-1tPrXgE0.js +11 -0
- package/dist/_plugin-vue_export-helper-1tPrXgE0.js.map +1 -0
- package/dist/components.css +15 -0
- package/dist/composables/index.js +32 -573
- package/dist/composables/index.js.map +1 -1
- package/dist/data/index.js +18 -0
- package/dist/data/index.js.map +1 -0
- package/dist/domain/index.js +8 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/filterHelpers-DgRyoYSa.js +1386 -0
- package/dist/filterHelpers-DgRyoYSa.js.map +1 -0
- package/dist/forms/index.js +6 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/index-DGO_pNgG.js +79 -0
- package/dist/index-DGO_pNgG.js.map +1 -0
- package/dist/index-QK97OdqQ.js +25 -0
- package/dist/index-QK97OdqQ.js.map +1 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/navigation/index.js +8 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/overlays/index.js +8 -0
- package/dist/overlays/index.js.map +1 -0
- package/dist/stores/index.js +14 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/useAdminPage-GhgXp0x8.js +1070 -0
- package/dist/useAdminPage-GhgXp0x8.js.map +1 -0
- package/dist/useTable-DutR1gkg.js +293 -0
- package/dist/useTable-DutR1gkg.js.map +1 -0
- package/package.json +43 -14
- package/src/composables/composables.md +109 -0
- package/src/composables/index.ts +69 -0
- package/src/composables/useAdminPage.ts +462 -0
- package/src/composables/useConfirmation.ts +358 -0
- package/src/composables/usePageContext.ts +171 -0
- package/src/composables/useStats.ts +361 -0
- package/src/composables/useTable.ts +26 -5
- package/src/composables/useWizard.ts +448 -0
- package/src/data/DataTable.vue +553 -0
- package/src/data/Table/Table.vue +295 -0
- package/src/data/columnHelpers.ts +503 -0
- package/src/data/data.md +106 -0
- package/src/data/filterHelpers.ts +358 -0
- package/src/data/index.ts +31 -0
- package/src/domain/domain.md +102 -0
- package/src/forms/JsonSchemaForm.vue +4 -1
- package/src/forms/forms.md +89 -0
- package/src/index.ts +4 -3
- package/src/navigation/navigation.md +80 -0
- package/src/overlays/overlays.md +86 -0
- package/src/stores/stores.md +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DateRange.vue_vue_type_script_setup_true_lang-BLVg1Hah.js","sources":["../src/forms/JsonSchemaForm.vue","../src/forms/DateRange.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed } from 'vue';\nimport _Ajv from 'ajv';\nimport addFormats from 'ajv-formats';\nimport {\n uiInput,\n uiSelect,\n uiToggle,\n uiRangeSlider,\n uiTextArea,\n uiButton\n} from '@hotelinking/ui';\n\n// Handle ESM/CJS interop for ajv\nconst Ajv = (_Ajv as unknown as { default: typeof _Ajv }).default ?? _Ajv;\n\n// Initialize AJV for JSON Schema validation with format support\nconst ajv = new Ajv({ allErrors: true });\naddFormats(ajv); // Add support for format keywords like \"email\", \"uri\", \"date\", etc.\n\ninterface JsonSchema {\n type: string;\n properties?: Record<string, any>;\n required?: string[];\n title?: string;\n description?: string;\n}\n\ninterface Props {\n schema: JsonSchema;\n modelValue?: Record<string, any>;\n uiSchema?: Record<string, any>;\n loading?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: () => ({}),\n uiSchema: () => ({}),\n loading: false\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: Record<string, any>];\n 'validation-error': [errors: Array<{ field: string; message: string }>];\n 'submit': [value: Record<string, any>];\n}>();\n\n// Internal form data\nconst formData = computed({\n get: () => props.modelValue,\n set: (value: Record<string, any>) => {\n emit('update:modelValue', value);\n }\n});\n\nconst errors = ref<Record<string, string>>({});\nconst touched = ref<Record<string, boolean>>({});\n\n// Get widget type from UI schema or infer from field schema\nfunction getWidget(fieldName: string): string {\n const uiSchemaField = props.uiSchema[fieldName];\n if (uiSchemaField?.['ui:widget']) {\n return uiSchemaField['ui:widget'];\n }\n \n const fieldSchema = props.schema.properties?.[fieldName];\n if (!fieldSchema) return 'text';\n \n // Infer widget from schema\n if (fieldSchema.type === 'boolean') return 'toggle';\n if (fieldSchema.type === 'number' || fieldSchema.type === 'integer') {\n // Only use slider if explicitly specified in uiSchema\n // Don't auto-infer from min/max presence\n return 'number';\n }\n if (fieldSchema.type === 'string') {\n if (fieldSchema.enum) return 'select';\n if (fieldSchema.format === 'email') return 'email';\n if (fieldSchema.format === 'uri') return 'url';\n if (fieldSchema.minLength && fieldSchema.minLength > 100) return 'textarea';\n }\n if (fieldSchema.type === 'array') return 'array';\n if (fieldSchema.type === 'object') return 'object';\n \n return 'text';\n}\n\n// Get input type for uiInput component\nfunction getInputType(fieldName: string): 'text' | 'email' | 'password' | 'number' | 'date' | 'datetime-local' {\n const widget = getWidget(fieldName);\n \n if (widget === 'password') return 'password';\n if (widget === 'email') return 'email';\n if (widget === 'number') return 'number';\n if (widget === 'date') return 'date';\n if (widget === 'datetime-local') return 'datetime-local';\n \n return 'text';\n}\n\n// Get field color based on validation state (computed for reactivity)\nfunction getFieldColor(fieldName: string): 'gray' | 'green' | 'red' | 'yellow' {\n // Check for errors first (most important)\n if (errors.value[fieldName]) return 'red';\n \n // If field has been touched and has a valid value, show green\n if (touched.value[fieldName]) {\n const value = formData.value[fieldName];\n if (isRequired(fieldName) && value !== undefined && value !== null && value !== '') {\n return 'green';\n }\n }\n \n // Default to gray\n return 'gray';\n}\n\n// Check if field is required\nfunction isRequired(fieldName: string): boolean {\n return props.schema.required?.includes(fieldName) ?? false;\n}\n\n// Get field label\nfunction getFieldLabel(fieldName: string): string {\n const fieldSchema = props.schema.properties?.[fieldName];\n return fieldSchema?.title || fieldName;\n}\n\n// Get field description\nfunction getFieldDescription(fieldName: string): string {\n const fieldSchema = props.schema.properties?.[fieldName];\n return fieldSchema?.description || '';\n}\n\n// Get placeholder from UI schema\nfunction getPlaceholder(fieldName: string): string {\n return props.uiSchema[fieldName]?.['ui:placeholder'] || '';\n}\n\n// Get autocomplete attribute for better UX (especially for passwords)\n// Following https://www.chromium.org/developers/design-documents/create-amazing-password-forms/\nfunction getAutocomplete(fieldName: string): string | undefined {\n const widget = getWidget(fieldName);\n const fieldSchema = props.schema.properties?.[fieldName];\n \n // Check if explicitly set in uiSchema\n if (props.uiSchema[fieldName]?.['ui:autocomplete']) {\n return props.uiSchema[fieldName]['ui:autocomplete'];\n }\n \n // Auto-detect based on field name and type\n const lowerFieldName = fieldName.toLowerCase();\n \n if (widget === 'email' || fieldSchema?.format === 'email') {\n return 'email';\n }\n \n if (widget === 'password') {\n // Check for common password field patterns\n if (lowerFieldName.includes('new') || lowerFieldName.includes('confirm')) {\n return 'new-password';\n }\n if (lowerFieldName.includes('current') || lowerFieldName === 'password') {\n return 'current-password';\n }\n return 'current-password'; // Default for password fields\n }\n \n // Common autocomplete values\n if (lowerFieldName.includes('username') || lowerFieldName === 'user') {\n return 'username';\n }\n if (lowerFieldName.includes('name')) {\n if (lowerFieldName.includes('first')) return 'given-name';\n if (lowerFieldName.includes('last')) return 'family-name';\n return 'name';\n }\n if (lowerFieldName.includes('phone') || lowerFieldName.includes('tel')) {\n return 'tel';\n }\n if (lowerFieldName.includes('address')) {\n return 'street-address';\n }\n if (lowerFieldName.includes('city')) {\n return 'address-level2';\n }\n if (lowerFieldName.includes('country')) {\n return 'country-name';\n }\n if (lowerFieldName.includes('postal') || lowerFieldName.includes('zip')) {\n return 'postal-code';\n }\n \n return undefined;\n}\n\n// Validate form data against schema using AJV\nfunction validate(): Array<{ field: string; message: string }> {\n const validationErrors: Array<{ field: string; message: string }> = [];\n errors.value = {};\n\n // Compile and validate using AJV\n const validateFn = ajv.compile(props.schema);\n const valid = validateFn(formData.value);\n\n if (!valid && validateFn.errors) {\n for (const error of validateFn.errors) {\n // Extract field name from instancePath (e.g., \"/fieldName\" -> \"fieldName\")\n const field = error.instancePath.replace(/^\\//, '') || error.params.missingProperty || 'form';\n \n // Generate user-friendly error message\n let message = '';\n \n if (error.keyword === 'required') {\n const missingField = error.params.missingProperty;\n message = `${getFieldLabel(missingField)} is required`;\n errors.value[missingField] = message;\n validationErrors.push({ field: missingField, message });\n } else if (error.keyword === 'type') {\n message = `${getFieldLabel(field)} must be a ${error.params.type}`;\n errors.value[field] = message;\n validationErrors.push({ field, message });\n } else if (error.keyword === 'minimum') {\n message = `${getFieldLabel(field)} must be at least ${error.params.limit}`;\n errors.value[field] = message;\n validationErrors.push({ field, message });\n } else if (error.keyword === 'maximum') {\n message = `${getFieldLabel(field)} must be at most ${error.params.limit}`;\n errors.value[field] = message;\n validationErrors.push({ field, message });\n } else if (error.keyword === 'minLength') {\n message = `${getFieldLabel(field)} must be at least ${error.params.limit} characters`;\n errors.value[field] = message;\n validationErrors.push({ field, message });\n } else if (error.keyword === 'maxLength') {\n message = `${getFieldLabel(field)} must be at most ${error.params.limit} characters`;\n errors.value[field] = message;\n validationErrors.push({ field, message });\n } else if (error.keyword === 'format') {\n message = `${getFieldLabel(field)} must be a valid ${error.params.format}`;\n errors.value[field] = message;\n validationErrors.push({ field, message });\n } else if (error.keyword === 'enum') {\n message = `${getFieldLabel(field)} must be one of: ${error.params.allowedValues.join(', ')}`;\n errors.value[field] = message;\n validationErrors.push({ field, message });\n } else {\n // Generic error message\n message = error.message || 'Invalid value';\n errors.value[field] = message;\n validationErrors.push({ field, message });\n }\n }\n }\n\n return validationErrors;\n}\n\n// Handle form submission\nfunction handleSubmit(event: Event) {\n event.preventDefault();\n \n const validationErrors = validate();\n if (validationErrors.length > 0) {\n emit('validation-error', validationErrors);\n return;\n }\n \n emit('submit', formData.value);\n}\n\n// Update field value\nfunction updateField(field: string, value: any) {\n touched.value[field] = true;\n \n // Update formData by emitting the new value\n const newData = {\n ...formData.value,\n [field]: value\n };\n emit('update:modelValue', newData);\n \n // Validate field on change with the new value\n validateFieldWithValue(field, value);\n}\n\n// Validate a single field using AJV (reads from formData)\nfunction validateField(fieldName: string) {\n validateFieldWithValue(fieldName, formData.value[fieldName]);\n}\n\n// Validate a single field with a specific value\nfunction validateFieldWithValue(fieldName: string, fieldValue: any) {\n const fieldSchema = props.schema.properties?.[fieldName];\n if (!fieldSchema) return;\n \n // Clear existing error\n delete errors.value[fieldName];\n \n // If field is empty/null/undefined and required, show required error\n if (isRequired(fieldName) && (fieldValue === undefined || fieldValue === null || fieldValue === '')) {\n errors.value[fieldName] = `${getFieldLabel(fieldName)} is required`;\n return;\n }\n \n // If field is empty and not required, no validation needed\n if (fieldValue === undefined || fieldValue === null || fieldValue === '') {\n return;\n }\n \n // Create a mini schema for just this field (without required)\n const singleFieldSchema = {\n type: 'object',\n properties: {\n [fieldName]: fieldSchema\n }\n };\n \n // Validate just this field\n const validateFn = ajv.compile(singleFieldSchema);\n const valid = validateFn({ [fieldName]: fieldValue });\n \n if (!valid && validateFn.errors) {\n for (const error of validateFn.errors) {\n let message = '';\n \n if (error.keyword === 'type') {\n message = `${getFieldLabel(fieldName)} must be a ${error.params.type}`;\n } else if (error.keyword === 'minimum') {\n message = `${getFieldLabel(fieldName)} must be at least ${error.params.limit}`;\n } else if (error.keyword === 'maximum') {\n message = `${getFieldLabel(fieldName)} must be at most ${error.params.limit}`;\n } else if (error.keyword === 'minLength') {\n message = `${getFieldLabel(fieldName)} must be at least ${error.params.limit} characters`;\n } else if (error.keyword === 'maxLength') {\n message = `${getFieldLabel(fieldName)} must be at most ${error.params.limit} characters`;\n } else if (error.keyword === 'format') {\n message = `${getFieldLabel(fieldName)} must be a valid ${error.params.format}`;\n } else if (error.keyword === 'enum') {\n message = `${getFieldLabel(fieldName)} must be one of: ${error.params.allowedValues.join(', ')}`;\n } else {\n message = error.message || 'Invalid value';\n }\n \n errors.value[fieldName] = message;\n break; // Only show first error per field\n }\n }\n}\n\n// Get enum options for select\nfunction getSelectOptions(fieldName: string) {\n const fieldSchema = props.schema.properties?.[fieldName];\n if (!fieldSchema?.enum) return [];\n \n return fieldSchema.enum.map((value: any) => ({\n id: String(value),\n name: String(value),\n label: String(value)\n }));\n}\n\n// Get selected option for select\nfunction getSelectedOption(fieldName: string) {\n const value = formData.value[fieldName];\n if (!value) {\n // Return first option as default if available\n const options = getSelectOptions(fieldName);\n return options.length > 0 ? options[0] : { id: '', name: '', label: '' };\n }\n \n return {\n id: String(value),\n name: String(value),\n label: String(value)\n };\n}\n\n// Array field helpers\nfunction addArrayItem(fieldName: string) {\n const currentArray = formData.value[fieldName] || [];\n updateField(fieldName, [...currentArray, '']);\n}\n\nfunction removeArrayItem(fieldName: string, index: number) {\n const currentArray = formData.value[fieldName] || [];\n const newArray = currentArray.filter((_: any, i: number) => i !== index);\n updateField(fieldName, newArray);\n}\n\nfunction updateArrayItem(fieldName: string, index: number, value: any) {\n const currentArray = formData.value[fieldName] || [];\n const newArray = [...currentArray];\n newArray[index] = value;\n updateField(fieldName, newArray);\n}\n\n// Expose methods\ndefineExpose({\n validate,\n validateField,\n reset: () => { \n emit('update:modelValue', {});\n errors.value = {}; \n touched.value = {};\n },\n // Expose internal state for testing\n formData,\n errors,\n touched,\n // Expose helper methods for testing\n getFieldLabel,\n getFieldDescription,\n isRequired,\n getWidget,\n getInputType,\n getFieldColor,\n getPlaceholder,\n getSelectOptions,\n getSelectedOption,\n updateField\n});\n</script>\n\n<template>\n <form @submit=\"handleSubmit\" class=\"space-y-6\">\n <!-- Form Title and Description -->\n <div v-if=\"schema.title || schema.description\" class=\"mb-6\">\n <h2 v-if=\"schema.title\" class=\"text-2xl font-bold text-gray-900 mb-2\">\n {{ schema.title }}\n </h2>\n <p v-if=\"schema.description\" class=\"text-gray-600\">\n {{ schema.description }}\n </p>\n </div>\n\n <!-- Form Fields -->\n <div v-if=\"schema.properties\" class=\"space-y-6\">\n <div\n v-for=\"(fieldSchema, fieldName) in schema.properties\"\n :key=\"fieldName\"\n >\n <!-- Text/Email/URL/Password Input -->\n <uiInput\n v-if=\"['text', 'email', 'url', 'password'].includes(getWidget(fieldName))\"\n :name=\"fieldName\"\n :label=\"getFieldLabel(fieldName)\"\n :type=\"getInputType(fieldName)\"\n :value=\"formData[fieldName] || ''\"\n :placeholder=\"getPlaceholder(fieldName)\"\n :error=\"errors[fieldName]\"\n :color=\"getFieldColor(fieldName)\"\n :loading=\"loading\"\n :required-text=\"isRequired(fieldName) ? '*' : undefined\"\n @input-changed=\"updateField(fieldName, $event.value)\"\n />\n\n <!-- Number Input -->\n <uiInput\n v-else-if=\"getWidget(fieldName) === 'number'\"\n :name=\"fieldName\"\n :label=\"getFieldLabel(fieldName)\"\n type=\"number\"\n :value=\"String(formData[fieldName] ?? '')\"\n :placeholder=\"getPlaceholder(fieldName)\"\n :error=\"errors[fieldName]\"\n :color=\"getFieldColor(fieldName)\"\n :loading=\"loading\"\n :required-text=\"isRequired(fieldName) ? '*' : undefined\"\n :min=\"schema.properties?.[fieldName]?.minimum\"\n :max=\"schema.properties?.[fieldName]?.maximum\"\n @input-changed=\"updateField(fieldName, $event.value === '' ? null : Number($event.value))\"\n />\n\n <!-- Textarea -->\n <uiTextArea\n v-else-if=\"getWidget(fieldName) === 'textarea'\"\n :name=\"fieldName\"\n :label=\"getFieldLabel(fieldName)\"\n :value=\"formData[fieldName] || ''\"\n :placeholder=\"getPlaceholder(fieldName)\"\n :error=\"errors[fieldName]\"\n :color=\"getFieldColor(fieldName)\"\n :loading=\"loading\"\n :required-text=\"isRequired(fieldName) ? '*' : undefined\"\n :rows=\"4\"\n @input-changed=\"updateField(fieldName, $event.value)\"\n />\n\n <!-- Select Dropdown -->\n <uiSelect\n v-else-if=\"getWidget(fieldName) === 'select'\"\n :label=\"getFieldLabel(fieldName)\"\n :items=\"getSelectOptions(fieldName)\"\n :select=\"getSelectedOption(fieldName)\"\n :placeholder=\"getPlaceholder(fieldName) || 'Select an option'\"\n :error=\"errors[fieldName]\"\n :color=\"getFieldColor(fieldName)\"\n :loading=\"loading\"\n :required-text=\"isRequired(fieldName) ? '*' : undefined\"\n @select-changed=\"(item: any) => updateField(fieldName, item.id)\"\n />\n\n <!-- Toggle (Boolean) -->\n <uiToggle\n v-else-if=\"getWidget(fieldName) === 'toggle'\"\n :item=\"{\n title: getFieldLabel(fieldName),\n subtitle: getFieldDescription(fieldName),\n action: fieldName\n }\"\n :checked=\"formData[fieldName]\"\n :loading=\"loading\"\n @toggle-changed=\"updateField(fieldName, $event.active)\"\n />\n\n <!-- Checkbox (Boolean alternative) -->\n <div v-else-if=\"getWidget(fieldName) === 'checkbox'\" class=\"flex items-start\">\n <input\n :id=\"fieldName\"\n type=\"checkbox\"\n :checked=\"formData[fieldName]\"\n :disabled=\"loading\"\n @change=\"updateField(fieldName, ($event.target as HTMLInputElement).checked)\"\n class=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded mt-1\"\n />\n <label :for=\"fieldName\" class=\"ml-2 block\">\n <span class=\"text-sm font-medium text-gray-700\">\n {{ getFieldLabel(fieldName) }}\n <span v-if=\"isRequired(fieldName)\" class=\"text-red-500\">*</span>\n </span>\n <p v-if=\"getFieldDescription(fieldName)\" class=\"text-sm text-gray-500\">\n {{ getFieldDescription(fieldName) }}\n </p>\n </label>\n </div>\n\n <!-- Range Slider -->\n <uiRangeSlider\n v-else-if=\"getWidget(fieldName) === 'slider'\"\n :label=\"getFieldLabel(fieldName)\"\n :min=\"schema.properties[fieldName].minimum ?? 0\"\n :max=\"schema.properties[fieldName].maximum ?? 100\"\n :slider-value=\"formData[fieldName] ?? schema.properties[fieldName].minimum ?? 0\"\n :loading=\"loading\"\n :required-text=\"isRequired(fieldName) ? '*' : undefined\"\n @sliderUpdated=\"updateField(fieldName, $event)\"\n />\n\n <!-- Array (Simple list) -->\n <div v-else-if=\"getWidget(fieldName) === 'array'\" class=\"space-y-2\">\n <label class=\"block text-sm font-medium text-gray-700\">\n {{ getFieldLabel(fieldName) }}\n <span v-if=\"isRequired(fieldName)\" class=\"text-red-500\">*</span>\n </label>\n <p v-if=\"getFieldDescription(fieldName)\" class=\"text-sm text-gray-500 mb-2\">\n {{ getFieldDescription(fieldName) }}\n </p>\n <div v-if=\"errors[fieldName]\" class=\"text-sm text-red-600 mb-2\">\n {{ errors[fieldName] }}\n </div>\n <div class=\"space-y-2\">\n <div\n v-for=\"(item, index) in (formData[fieldName] || [])\"\n :key=\"index\"\n class=\"flex gap-2\"\n >\n <input\n type=\"text\"\n :value=\"item\"\n :disabled=\"loading\"\n @input=\"updateArrayItem(fieldName, index, ($event.target as HTMLInputElement).value)\"\n class=\"flex-1 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n <button\n type=\"button\"\n @click=\"removeArrayItem(fieldName, index)\"\n :disabled=\"loading\"\n class=\"px-3 py-2 text-red-600 hover:text-red-800 border border-red-300 rounded-md\"\n >\n Remove\n </button>\n </div>\n </div>\n <button\n type=\"button\"\n @click=\"addArrayItem(fieldName)\"\n :disabled=\"loading\"\n class=\"mt-2 px-4 py-2 text-sm text-blue-600 hover:text-blue-800 border border-blue-300 rounded-md\"\n >\n + Add Item\n </button>\n </div>\n\n <!-- Nested Object (Simple rendering) -->\n <div v-else-if=\"getWidget(fieldName) === 'object' || getWidget(fieldName) === 'card'\" class=\"border border-gray-200 rounded-lg p-4 space-y-4\">\n <div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-1\">\n {{ getFieldLabel(fieldName) }}\n </h3>\n <p v-if=\"getFieldDescription(fieldName)\" class=\"text-sm text-gray-600 mb-4\">\n {{ getFieldDescription(fieldName) }}\n </p>\n </div>\n <div class=\"space-y-4 pl-4 border-l-2 border-gray-200\">\n <!-- Recursively render nested fields -->\n <div\n v-for=\"(subSchema, subName) in fieldSchema.properties\"\n :key=\"subName\"\n >\n <!-- Nested field rendering would go here -->\n <p class=\"text-sm text-gray-500\">\n Nested field: {{ subName }} (type: {{ subSchema.type }})\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Form Actions -->\n <div class=\"flex justify-end gap-3 pt-6 border-t\">\n <slot name=\"actions\">\n <uiButton\n type=\"submit\"\n color=\"primary\"\n :loading=\"loading\"\n >\n Submit\n </uiButton>\n </slot>\n </div>\n </form>\n</template>\n","<template>\n <uiDateRange\n :id=\"id\"\n :loading=\"loading\"\n :literals=\"literals\"\n :values=\"internalValues\"\n :color=\"color\"\n :error=\"error\"\n :disabled=\"disabled\"\n :label=\"label\"\n :placeholder=\"placeholder\"\n @uiDateRangeButtonClicked=\"handleSearch\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, computed } from 'vue';\nimport { uiDateRange } from '@hotelinking/ui';\n\nexport interface DateRangeValue {\n from: Date | string;\n to: Date | string;\n}\n\nexport interface DateRangeLiterals {\n from: string;\n to: string;\n search: string;\n}\n\ninterface Props {\n id?: string;\n modelValue?: DateRangeValue;\n literals?: DateRangeLiterals;\n loading?: boolean;\n color?: 'primary' | 'secondary' | 'light' | 'green' | 'yellow' | 'red' | 'black' | 'gray' | 'white';\n error?: string;\n disabled?: boolean;\n label?: string;\n placeholder?: string;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n id: () => `date-range-${Math.random().toString(36).substr(2, 9)}`,\n loading: false,\n literals: () => ({\n from: 'From',\n to: 'To',\n search: 'Search'\n }),\n modelValue: () => ({\n from: '',\n to: new Date().toISOString().slice(0, 16)\n })\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: DateRangeValue | undefined];\n 'search': [value: DateRangeValue | undefined];\n 'change': [value: DateRangeValue | undefined];\n}>();\n\n// Internal state\nconst internalValues = ref<DateRangeValue>({\n from: props.modelValue?.from || '',\n to: props.modelValue?.to || new Date().toISOString().slice(0, 16)\n});\n\n// Watch for external changes\nwatch(() => props.modelValue, (newValue) => {\n if (newValue) {\n internalValues.value = {\n from: newValue.from || '',\n to: newValue.to || new Date().toISOString().slice(0, 16)\n };\n }\n}, { deep: true });\n\n// Handle search button click\nfunction handleSearch(dates: DateRangeValue | undefined) {\n emit('update:modelValue', dates);\n emit('search', dates);\n emit('change', dates);\n}\n\n// Exposed methods\nfunction reset() {\n const resetValue: DateRangeValue = {\n from: '',\n to: new Date().toISOString().slice(0, 16)\n };\n internalValues.value = resetValue;\n emit('update:modelValue', resetValue);\n}\n\nfunction getValue() {\n return internalValues.value;\n}\n\nfunction setValue(value: DateRangeValue) {\n internalValues.value = value;\n emit('update:modelValue', value);\n}\n\ndefineExpose({\n reset,\n getValue,\n setValue\n});\n</script>\n"],"names":["_createElementBlock","_openBlock","_toDisplayString","_Fragment","_createBlock","_unref","_createElementVNode","_renderSlot","_createVNode"],"mappings":"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"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { defineComponent, createElementBlock, openBlock, Fragment, renderList, createBlock, unref, computed, normalizeClass, toDisplayString } from "vue";
|
|
2
|
+
import { uiCard, uiTag } from "@hotelinking/ui";
|
|
3
|
+
const _hoisted_1$1 = { class: "w-full" };
|
|
4
|
+
const _hoisted_2$1 = {
|
|
5
|
+
key: 0,
|
|
6
|
+
class: "text-center py-4 text-gray-500"
|
|
7
|
+
};
|
|
8
|
+
const _hoisted_3 = {
|
|
9
|
+
key: 1,
|
|
10
|
+
class: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"
|
|
11
|
+
};
|
|
12
|
+
const _sfc_main$3 = /* @__PURE__ */ defineComponent({
|
|
13
|
+
__name: "BrandSelector",
|
|
14
|
+
props: {
|
|
15
|
+
modelValue: { default: null },
|
|
16
|
+
brands: { default: () => [] },
|
|
17
|
+
loading: { type: Boolean, default: false }
|
|
18
|
+
},
|
|
19
|
+
emits: ["update:modelValue", "change"],
|
|
20
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
21
|
+
const props = __props;
|
|
22
|
+
const emit = __emit;
|
|
23
|
+
function selectBrand(data) {
|
|
24
|
+
const brand = props.brands.find((b) => b.id === data.id);
|
|
25
|
+
if (brand) {
|
|
26
|
+
emit("update:modelValue", brand);
|
|
27
|
+
emit("change", brand);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
__expose({
|
|
31
|
+
getSelected: () => props.modelValue,
|
|
32
|
+
clearSelection: () => {
|
|
33
|
+
emit("update:modelValue", null);
|
|
34
|
+
emit("change", null);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return (_ctx, _cache) => {
|
|
38
|
+
return openBlock(), createElementBlock("div", _hoisted_1$1, [
|
|
39
|
+
__props.loading ? (openBlock(), createElementBlock("div", _hoisted_2$1, " Loading brands... ")) : (openBlock(), createElementBlock("div", _hoisted_3, [
|
|
40
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.brands, (brand) => {
|
|
41
|
+
return openBlock(), createBlock(unref(uiCard), {
|
|
42
|
+
key: brand.id,
|
|
43
|
+
id: brand.id,
|
|
44
|
+
name: brand.name,
|
|
45
|
+
type: brand.type || "Brand",
|
|
46
|
+
logo: brand.logo || "",
|
|
47
|
+
loading: false,
|
|
48
|
+
onCardSelected: selectBrand
|
|
49
|
+
}, null, 8, ["id", "name", "type", "logo"]);
|
|
50
|
+
}), 128))
|
|
51
|
+
]))
|
|
52
|
+
]);
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
57
|
+
__name: "BrandCard",
|
|
58
|
+
props: {
|
|
59
|
+
brand: {},
|
|
60
|
+
showStatus: { type: Boolean, default: true },
|
|
61
|
+
loading: { type: Boolean, default: false }
|
|
62
|
+
},
|
|
63
|
+
emits: ["click"],
|
|
64
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
65
|
+
const props = __props;
|
|
66
|
+
const emit = __emit;
|
|
67
|
+
const tags = computed(() => {
|
|
68
|
+
if (!props.showStatus || !props.brand.status) return [];
|
|
69
|
+
const statusMap = {
|
|
70
|
+
active: { name: "Active", color: "green" },
|
|
71
|
+
inactive: { name: "Inactive", color: "gray" },
|
|
72
|
+
maintenance: { name: "Maintenance", color: "yellow" },
|
|
73
|
+
suspended: { name: "Suspended", color: "red" }
|
|
74
|
+
};
|
|
75
|
+
return [statusMap[props.brand.status]];
|
|
76
|
+
});
|
|
77
|
+
function handleCardSelected(data) {
|
|
78
|
+
emit("click", props.brand);
|
|
79
|
+
}
|
|
80
|
+
__expose({
|
|
81
|
+
getBrand: () => props.brand
|
|
82
|
+
});
|
|
83
|
+
return (_ctx, _cache) => {
|
|
84
|
+
return openBlock(), createBlock(unref(uiCard), {
|
|
85
|
+
id: __props.brand.id,
|
|
86
|
+
name: __props.brand.name,
|
|
87
|
+
type: __props.brand.timezone || "Brand",
|
|
88
|
+
logo: __props.brand.logo || "",
|
|
89
|
+
tags: tags.value,
|
|
90
|
+
loading: __props.loading,
|
|
91
|
+
onCardSelected: handleCardSelected
|
|
92
|
+
}, null, 8, ["id", "name", "type", "logo", "tags", "loading"]);
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
const _hoisted_1 = ["src", "alt"];
|
|
97
|
+
const _hoisted_2 = {
|
|
98
|
+
key: 1,
|
|
99
|
+
class: "flex items-center justify-center w-full h-full"
|
|
100
|
+
};
|
|
101
|
+
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
102
|
+
__name: "UserAvatar",
|
|
103
|
+
props: {
|
|
104
|
+
user: {},
|
|
105
|
+
size: { default: "medium" }
|
|
106
|
+
},
|
|
107
|
+
setup(__props, { expose: __expose }) {
|
|
108
|
+
const props = __props;
|
|
109
|
+
const initials = computed(() => {
|
|
110
|
+
const name = props.user.name || props.user.username || props.user.email || "";
|
|
111
|
+
const parts = name.split(" ");
|
|
112
|
+
if (parts.length >= 2) {
|
|
113
|
+
return `${parts[0][0]}${parts[1][0]}`.toUpperCase();
|
|
114
|
+
}
|
|
115
|
+
return name.substring(0, 2).toUpperCase();
|
|
116
|
+
});
|
|
117
|
+
const sizeClasses = computed(() => {
|
|
118
|
+
const sizes = {
|
|
119
|
+
small: "w-8 h-8 text-xs",
|
|
120
|
+
medium: "w-10 h-10 text-sm",
|
|
121
|
+
large: "w-14 h-14 text-lg"
|
|
122
|
+
};
|
|
123
|
+
return sizes[props.size];
|
|
124
|
+
});
|
|
125
|
+
__expose({
|
|
126
|
+
getInitials: () => initials.value,
|
|
127
|
+
getUser: () => props.user
|
|
128
|
+
});
|
|
129
|
+
return (_ctx, _cache) => {
|
|
130
|
+
return openBlock(), createElementBlock("div", {
|
|
131
|
+
class: normalizeClass(["flex items-center justify-center rounded-full overflow-hidden bg-blue-500 text-white font-medium", sizeClasses.value])
|
|
132
|
+
}, [
|
|
133
|
+
__props.user.avatar ? (openBlock(), createElementBlock("img", {
|
|
134
|
+
key: 0,
|
|
135
|
+
src: __props.user.avatar,
|
|
136
|
+
alt: __props.user.username || __props.user.email,
|
|
137
|
+
class: "w-full h-full object-cover"
|
|
138
|
+
}, null, 8, _hoisted_1)) : (openBlock(), createElementBlock("div", _hoisted_2, toDisplayString(initials.value), 1))
|
|
139
|
+
], 2);
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
144
|
+
__name: "ProductBadge",
|
|
145
|
+
props: {
|
|
146
|
+
product: {},
|
|
147
|
+
showVersion: { type: Boolean, default: false },
|
|
148
|
+
loading: { type: Boolean, default: false }
|
|
149
|
+
},
|
|
150
|
+
setup(__props) {
|
|
151
|
+
const props = __props;
|
|
152
|
+
const statusColor = computed(() => {
|
|
153
|
+
switch (props.product.status) {
|
|
154
|
+
case "enabled":
|
|
155
|
+
return "green";
|
|
156
|
+
case "disabled":
|
|
157
|
+
return "gray";
|
|
158
|
+
case "pending":
|
|
159
|
+
return "yellow";
|
|
160
|
+
default:
|
|
161
|
+
return "gray";
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
const badgeText = computed(() => {
|
|
165
|
+
let text = props.product.name;
|
|
166
|
+
if (props.showVersion && props.product.version) {
|
|
167
|
+
text += ` v${props.product.version}`;
|
|
168
|
+
}
|
|
169
|
+
return text;
|
|
170
|
+
});
|
|
171
|
+
return (_ctx, _cache) => {
|
|
172
|
+
return openBlock(), createBlock(unref(uiTag), {
|
|
173
|
+
loading: __props.loading,
|
|
174
|
+
color: statusColor.value,
|
|
175
|
+
text: badgeText.value,
|
|
176
|
+
size: "medium"
|
|
177
|
+
}, null, 8, ["loading", "color", "text"]);
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
export {
|
|
182
|
+
_sfc_main$3 as _,
|
|
183
|
+
_sfc_main$2 as a,
|
|
184
|
+
_sfc_main$1 as b,
|
|
185
|
+
_sfc_main as c
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=ProductBadge.vue_vue_type_script_setup_true_lang-Cmr2f4Cy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductBadge.vue_vue_type_script_setup_true_lang-Cmr2f4Cy.js","sources":["../src/domain/BrandSelector.vue","../src/domain/BrandCard.vue","../src/domain/UserAvatar.vue","../src/domain/ProductBadge.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { uiCard } from '@hotelinking/ui';\n\ninterface Brand {\n id: string;\n name: string;\n logo?: string;\n type?: string;\n}\n\ninterface Props {\n modelValue?: Brand | null;\n brands?: Brand[];\n loading?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: null,\n brands: () => [],\n loading: false\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: Brand | null];\n 'change': [value: Brand | null];\n}>();\n\nfunction selectBrand(data: any) {\n const brand = props.brands.find(b => b.id === data.id);\n if (brand) {\n emit('update:modelValue', brand);\n emit('change', brand);\n }\n}\n\n// Expose methods for parent components\ndefineExpose({\n getSelected: () => props.modelValue,\n clearSelection: () => {\n emit('update:modelValue', null);\n emit('change', null);\n }\n});\n</script>\n\n<template>\n <div class=\"w-full\">\n <div v-if=\"loading\" class=\"text-center py-4 text-gray-500\">\n Loading brands...\n </div>\n <div v-else class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n <uiCard\n v-for=\"brand in brands\"\n :key=\"brand.id\"\n :id=\"brand.id\"\n :name=\"brand.name\"\n :type=\"brand.type || 'Brand'\"\n :logo=\"brand.logo || ''\"\n :loading=\"false\"\n @card-selected=\"selectBrand\"\n />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { uiCard } from '@hotelinking/ui';\n\ninterface Brand {\n id: string;\n name: string;\n logo?: string;\n status?: 'active' | 'inactive' | 'maintenance' | 'suspended';\n timezone?: string;\n}\n\ninterface Props {\n brand: Brand;\n showStatus?: boolean;\n loading?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showStatus: true,\n loading: false\n});\n\nconst emit = defineEmits<{\n 'click': [brand: Brand];\n}>();\n\n// Convert status to tag format\nconst tags = computed(() => {\n if (!props.showStatus || !props.brand.status) return [];\n \n const statusMap = {\n active: { name: 'Active', color: 'green' as const },\n inactive: { name: 'Inactive', color: 'gray' as const },\n maintenance: { name: 'Maintenance', color: 'yellow' as const },\n suspended: { name: 'Suspended', color: 'red' as const }\n };\n \n return [statusMap[props.brand.status]];\n});\n\n// Handle card selection\nfunction handleCardSelected(data: any) {\n emit('click', props.brand);\n}\n\n// Expose methods for parent components\ndefineExpose({\n getBrand: () => props.brand\n});\n</script>\n\n<template>\n <uiCard\n :id=\"brand.id\"\n :name=\"brand.name\"\n :type=\"brand.timezone || 'Brand'\"\n :logo=\"brand.logo || ''\"\n :tags=\"tags\"\n :loading=\"loading\"\n @card-selected=\"handleCardSelected\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\ninterface User {\n username?: string;\n email?: string;\n avatar?: string;\n name?: string;\n}\n\ninterface Props {\n user: User;\n size?: 'small' | 'medium' | 'large';\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 'medium'\n});\n\nconst initials = computed(() => {\n const name = props.user.name || props.user.username || props.user.email || '';\n const parts = name.split(' ');\n if (parts.length >= 2) {\n return `${parts[0][0]}${parts[1][0]}`.toUpperCase();\n }\n return name.substring(0, 2).toUpperCase();\n});\n\nconst sizeClasses = computed(() => {\n const sizes = {\n small: 'w-8 h-8 text-xs',\n medium: 'w-10 h-10 text-sm',\n large: 'w-14 h-14 text-lg'\n };\n return sizes[props.size];\n});\n\n// Expose methods for parent components\ndefineExpose({\n getInitials: () => initials.value,\n getUser: () => props.user\n});\n</script>\n\n<template>\n <div\n class=\"flex items-center justify-center rounded-full overflow-hidden bg-blue-500 text-white font-medium\"\n :class=\"sizeClasses\"\n >\n <img\n v-if=\"user.avatar\"\n :src=\"user.avatar\"\n :alt=\"user.username || user.email\"\n class=\"w-full h-full object-cover\"\n />\n <div v-else class=\"flex items-center justify-center w-full h-full\">\n {{ initials }}\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { uiTag } from '@hotelinking/ui';\n\ninterface Product {\n name: string;\n status?: 'enabled' | 'disabled' | 'pending';\n version?: string;\n}\n\ninterface Props {\n product: Product;\n showVersion?: boolean;\n loading?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showVersion: false,\n loading: false\n});\n\nconst statusColor = computed(() => {\n switch (props.product.status) {\n case 'enabled': return 'green' as const;\n case 'disabled': return 'gray' as const;\n case 'pending': return 'yellow' as const;\n default: return 'gray' as const;\n }\n});\n\nconst badgeText = computed(() => {\n let text = props.product.name;\n if (props.showVersion && props.product.version) {\n text += ` v${props.product.version}`;\n }\n return text;\n});\n</script>\n\n<template>\n <uiTag\n :loading=\"loading\"\n :color=\"statusColor\"\n :text=\"badgeText\"\n size=\"medium\"\n />\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_Fragment","_renderList","_createBlock","_unref","_normalizeClass","_toDisplayString"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const _export_sfc = (sfc, props) => {
|
|
2
|
+
const target = sfc.__vccOpts || sfc;
|
|
3
|
+
for (const [key, val] of props) {
|
|
4
|
+
target[key] = val;
|
|
5
|
+
}
|
|
6
|
+
return target;
|
|
7
|
+
};
|
|
8
|
+
export {
|
|
9
|
+
_export_sfc as _
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=_plugin-vue_export-helper-1tPrXgE0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_plugin-vue_export-helper-1tPrXgE0.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|