UNPKG

@dialpad/dialtone

Version:

Dialpad's Dialtone design system monorepo

1 lines 11.9 kB
{"version":3,"file":"select-menu.cjs","names":[],"sources":["../../../components/select_menu/select_menu.vue"],"sourcesContent":["<template>\n <div\n :class=\"rootClass\"\n v-bind=\"addClassStyleAttrs($attrs)\"\n >\n <label>\n <div\n v-if=\"hasSlotContent($slots.label) || label\"\n :aria-details=\"labelAriaDetails\"\n :class=\"[\n 'd-label',\n LABEL_SIZE_MODIFIERS[size],\n labelClass,\n ]\"\n v-bind=\"labelChildProps\"\n data-qa=\"dt-select-label\"\n >\n <!-- @slot Slot for label, defaults to label prop -->\n <slot name=\"label\">{{ label }}</slot>\n </div>\n <div\n v-if=\"hasSlotContent($slots.description) || description\"\n :id=\"descriptionKey\"\n :class=\"[\n 'd-description',\n DESCRIPTION_SIZE_MODIFIERS[size],\n descriptionClass,\n ]\"\n v-bind=\"descriptionChildProps\"\n data-qa=\"dt-select-description\"\n >\n <!-- @slot Slot for description, defaults to description prop -->\n <slot name=\"description\">{{ description }}</slot>\n </div>\n <div\n :class=\"[\n 'd-select',\n SELECT_SIZE_MODIFIERS[size],\n selectClass,\n { 'd-select--disabled': disabled },\n ]\"\n data-qa=\"dt-select-wrapper\"\n >\n <select\n ref=\"selectElement\"\n :class=\"[\n 'd-select__input',\n SELECT_STATE_MODIFIERS[state],\n ]\"\n v-bind=\"removeClassStyleAttrs($attrs)\"\n data-qa=\"dt-select\"\n :disabled=\"disabled\"\n :value=\"modelValue\"\n v-on=\"selectListeners\"\n >\n <!-- @slot Slot for select menu options, defaults to options prop -->\n <slot>\n <option\n v-for=\"option in options\"\n :key=\"getOptionKey(option.value)\"\n :value=\"option.value\"\n :class=\"optionClass\"\n v-bind=\"optionChildProps\"\n >\n {{ option.label }}\n </option>\n </slot>\n </select>\n </div>\n </label>\n <dt-validation-messages\n :validation-messages=\"formattedMessages\"\n :show-messages=\"showMessages\"\n :class=\"messagesClass\"\n v-bind=\"messagesChildProps\"\n data-qa=\"dt-select-messages\"\n />\n </div>\n</template>\n\n<script>\nimport { warn } from 'vue';\nimport {\n LABEL_SIZE_MODIFIERS,\n DESCRIPTION_SIZE_MODIFIERS,\n} from '@/common/constants';\nimport {\n SELECT_SIZE_MODIFIERS,\n SELECT_STATE_MODIFIERS,\n} from './select_menu_constants';\nimport {\n getUniqueString,\n getValidationState,\n hasSlotContent,\n removeClassStyleAttrs,\n addClassStyleAttrs,\n} from '@/common/utils';\nimport { MessagesMixin } from '@/common/mixins/input';\nimport { optionsValidator } from './select_menu_validators.js';\nimport { DtValidationMessages } from '../validation_messages';\n\n/**\n * A select menu is an input control that allows users to choose one option from a list.\n * @property {Boolean} disabled attribute\n * @property {String} name attribute\n * @property {String} value attribute\n * @see https://dialtone.dialpad.com/components/select.html\n */\nexport default {\n compatConfig: { MODE: 3 },\n name: 'DtSelectMenu',\n\n components: { DtValidationMessages },\n\n mixins: [MessagesMixin],\n\n inheritAttrs: false,\n\n props: {\n /**\n * Label for the select\n */\n label: {\n type: String,\n default: '',\n },\n\n /**\n * Description for the select\n */\n description: {\n type: String,\n default: '',\n },\n\n /**\n * Select Menu Options, overridden by default slot. Each option has the following structure:\n * `{ value: number || string (required), label: string (required) }`\n * @param {Object[]} options - Optional - A list that can be used to create a list of select menu options\n * @param {number|string} options[].value - Required - The option value\n * @param {string} options[].label - Required - The option Label\n */\n options: {\n type: Array,\n default: () => [],\n validator: options => optionsValidator(options),\n },\n\n /**\n * Controls the size of the select\n * @values xs, sm, md, lg, xl\n */\n size: {\n type: String,\n default: 'md',\n validator: (s) => Object.keys(SELECT_SIZE_MODIFIERS).includes(s),\n },\n\n /**\n * Used to customize the label container\n */\n labelClass: {\n type: [String, Array, Object],\n default: '',\n },\n\n /**\n * Used to customize the description container\n */\n descriptionClass: {\n type: [String, Array, Object],\n default: '',\n },\n\n /**\n * Used to customize the select\n */\n selectClass: {\n type: [String, Array, Object],\n default: '',\n },\n\n /**\n * Used to customize each option, should options be provided via prop\n */\n optionClass: {\n type: [String, Array, Object],\n default: '',\n },\n\n /**\n * A set of props that are passed into the label container\n */\n labelChildProps: {\n type: Object,\n default: () => ({}),\n },\n\n /**\n * A set of props that are passed into the description container\n */\n descriptionChildProps: {\n type: Object,\n default: () => ({}),\n },\n\n /**\n * A set of props that are passed into each option, should options be provided via prop\n */\n optionChildProps: {\n type: Object,\n default: () => ({}),\n },\n\n /**\n * Disabled state of the select\n * @values true, false\n */\n disabled: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Additional class name for the root element.\n * Can accept all of: String, Object, and Array, i.e. has the\n * same api as Vue's built-in handling of the class attribute.\n */\n rootClass: {\n type: [String, Object, Array],\n default: '',\n },\n\n /**\n * The value of the select menu\n */\n modelValue: {\n type: [String, Number],\n default: '',\n },\n },\n\n emits: [\n /**\n * Native input event\n *\n * @event input\n * @type {String | Number}\n */\n 'input',\n\n /**\n * Event fired to sync the modelValue prop with the parent component\n *\n * @event input\n * @type {String | Number}\n */\n 'update:modelValue',\n\n /**\n * Native change event\n *\n * @event change\n * @type {String | Number}\n */\n 'change',\n ],\n\n data () {\n return {\n LABEL_SIZE_MODIFIERS,\n DESCRIPTION_SIZE_MODIFIERS,\n SELECT_SIZE_MODIFIERS,\n SELECT_STATE_MODIFIERS,\n hasSlotContent,\n };\n },\n\n computed: {\n selectListeners () {\n return {\n /*\n * Override input listener to as no-op. Prevents parent input listeners from being passed through onto the input\n * element which will result in the handler being called twice (once on the select element and once by the\n * emitted input event by the change listener).\n */\n input: () => {},\n change: event => this.emitValue(event.target.value, event),\n };\n },\n\n state () {\n return getValidationState(this.formattedMessages);\n },\n\n selectKey () {\n return getUniqueString();\n },\n\n descriptionKey () {\n return `select-${this.selectKey}-description`;\n },\n\n labelAriaDetails () {\n if (this.$slots.description || this.description) {\n return this.descriptionKey;\n }\n\n return this.$attrs['aria-details'];\n },\n },\n\n mounted () {\n this.validateOptionsPresence();\n },\n\n beforeUpdate () {\n this.validateOptionsPresence();\n },\n\n methods: {\n removeClassStyleAttrs,\n addClassStyleAttrs,\n emitValue (value, event) {\n this.$emit('update:modelValue', value, event);\n this.$emit('input', value, event);\n this.$emit('change', value, event);\n },\n\n getOptionKey (value) {\n return `select-${this.selectKey}-option-${value}`;\n },\n\n validateOptionsPresence () {\n if (this.options?.length < 1 && !this.$slots.default) {\n warn('Options are expected to be provided via prop or slot', this);\n }\n },\n },\n};\n</script>\n"],"mappings":"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"}