UNPKG

@vue-interface/select-field

Version:
1 lines 8.91 kB
{"version":3,"file":"select-field.umd.cjs","sources":["../src/SelectField.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"ModelValue, Value\">\nimport { ActivityIndicator } from '@vue-interface/activity-indicator';\nimport type { FormControlEvents, FormControlProps, FormControlSlots } from '@vue-interface/form-control';\nimport { FormControlErrors, FormControlFeedback, useFormControl } from '@vue-interface/form-control';\nimport { InputHTMLAttributes, onMounted, SelectHTMLAttributes, useSlots, useTemplateRef } from 'vue';\n\nconst props = withDefaults(defineProps<SelectFieldProps<ModelValue,Value>>(), {\n formControlClass: 'form-select',\n labelClass: 'form-label',\n size: 'form-select-md'\n});\n\ndefineOptions({\n inheritAttrs: false\n});\n\nconst model = defineModel<ModelValue>();\n\ndefineSlots<FormControlSlots<SelectFieldControlSizePrefix,ModelValue> & {\n default: () => unknown\n}>();\n\nconst emit = defineEmits<FormControlEvents>();\n\nconst {\n controlAttributes,\n formGroupClasses,\n listeners,\n} = useFormControl<InputHTMLAttributes, SelectFieldControlSizePrefix, ModelValue|undefined, Value>({ model, props, emit });\n\nconst activity = useTemplateRef<InstanceType<typeof ActivityIndicator>>('activity');\nconst help = useTemplateRef<HTMLElement>('help');\nconst label = useTemplateRef<HTMLLabelElement>('label');\nconst field = useTemplateRef<HTMLSelectElement>('field');\nconst wrapper = useTemplateRef<HTMLDivElement>('wrapper');\n\ndefineExpose({\n activity,\n help,\n field,\n label,\n wrapper,\n focus: () => field.value?.focus(),\n blur: () => field.value?.blur(),\n});\n\n// Check the option slots for selected options. If the field has hardcoded\n// selected options, this will ensure the value of the field is always set to\n// the property. This will ensure the model is updated to the selected value.\nonMounted(() => {\n const slot = useSlots().default;\n\n if(!slot) {\n return;\n }\n\n for(const child of slot()) {\n if(!child.props) {\n return;\n }\n \n if('selected' in child.props && (child.props.value ?? child.children)) {\n model.value = child.props.value ?? child.children;\n }\n }\n});\n</script>\n\n<script lang=\"ts\">\nexport type SelectFieldControlSizePrefix = 'form-select';\n\nexport type SelectFieldProps<ModelValue, Value> = FormControlProps<\n SelectHTMLAttributes, \n SelectFieldControlSizePrefix, \n ModelValue, \n Value\n>;\n</script>\n\n<template>\n <div\n ref=\"wrapper\"\n class=\"select-field\"\n :class=\"formGroupClasses\">\n <slot name=\"label\">\n <label\n v-if=\"props.label\"\n ref=\"label\"\n :for=\"controlAttributes.id\"\n :class=\"labelClass\"\n @click=\"field?.click()\">\n {{ props.label }}\n </label>\n </slot>\n\n <div class=\"form-control-inner\">\n <slot\n name=\"control\"\n v-bind=\"{ controlAttributes, listeners }\">\n <div\n v-if=\"$slots.icon\"\n class=\"form-control-inner-icon\"\n @click=\"field?.focus()\">\n <slot name=\"icon\" />\n </div>\n <select\n ref=\"field\"\n v-model=\"model\"\n v-bind=\"{...controlAttributes, ...listeners}\">\n <slot />\n </select>\n </slot>\n \n <div class=\"form-control-activity-indicator\">\n <slot name=\"activity\">\n <Transition name=\"select-field-fade\">\n <ActivityIndicator\n v-if=\"props.activity && indicator\"\n key=\"activity\"\n ref=\"activity\"\n :type=\"indicator\"\n :size=\"indicatorSize\" />\n </Transition>\n </slot>\n </div> \n </div>\n\n <slot\n name=\"errors\"\n v-bind=\"{ error, errors, id, name }\"> \n <FormControlErrors\n v-if=\"!!(error || errors)\"\n :id=\"id && String(id)\"\n v-slot=\"{ error }\"\n :name=\"name && String(name)\"\n :error=\"error\"\n :errors=\"errors\">\n <div\n invalid\n class=\"invalid-feedback\">\n {{ error }}<br>\n </div>\n </FormControlErrors>\n </slot>\n \n <slot\n name=\"feedback\"\n v-bind=\"{ feedback }\">\n <FormControlFeedback\n v-slot=\"{ feedback }\"\n :feedback=\"feedback\">\n <div\n valid\n class=\"valid-feedback\">\n {{ feedback }}\n </div>\n </FormControlFeedback>\n </slot>\n\n <slot\n name=\"help\"\n v-bind=\"{ helpText }\">\n <small\n v-if=\"helpText\"\n ref=\"help\">\n {{ helpText }}\n </small>\n </slot>\n </div>\n</template>"],"names":["props","__props","model","_useModel","emit","__emit","controlAttributes","formGroupClasses","listeners","useFormControl","activity","useTemplateRef","help","label","field","wrapper","__expose","onMounted","slot","useSlots","child","_createElementBlock","_normalizeClass","_unref","_renderSlot","_ctx","_cache","$event","_toDisplayString","_hoisted_1","_createElementVNode","_hoisted_2","_normalizeProps","_guardReactiveProps","$slots","_withDirectives","_mergeProps","_hoisted_3","_createVNode","_Transition","_createBlock","ActivityIndicator","FormControlErrors","_withCtx","error","_hoisted_4","FormControlFeedback","feedback","_hoisted_5"],"mappings":"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"}