@dialpad/dialtone
Version:
Dialpad's Dialtone design system monorepo
1 lines • 29.2 kB
Source Map (JSON)
{"version":3,"file":"combobox-multi-select.cjs","sources":["../../../recipes/comboboxes/combobox_multi_select/combobox_multi_select.vue"],"sourcesContent":["<!-- eslint-disable vue/no-static-inline-styles -->\n<template>\n <dt-recipe-combobox-with-popover\n ref=\"comboboxWithPopover\"\n :label=\"label\"\n :show-list=\"showList\"\n :max-height=\"listMaxHeight\"\n :max-width=\"listMaxWidth\"\n :popover-offset=\"popoverOffset\"\n :has-suggestion-list=\"hasSuggestionList\"\n content-width=\"anchor\"\n :append-to=\"appendTo\"\n :transition=\"transition\"\n @select=\"onComboboxSelect\"\n @highlight=\"comboboxHighlight\"\n >\n <template #input=\"{ onInput }\">\n <span\n ref=\"inputSlotWrapper\"\n class=\"d-recipe-combobox-multi-select__input-wrapper\"\n @focusin=\"handleInputFocusIn\"\n @focusout=\"handleInputFocusOut\"\n >\n <span\n ref=\"chipsWrapper\"\n :class=\"['d-recipe-combobox-multi-select__chip-wrapper', chipWrapperClass]\"\n >\n <dt-chip\n v-for=\"item in selectedItems\"\n ref=\"chips\"\n :key=\"item\"\n :label-class=\"['d-chip__label']\"\n :class=\"[\n 'd-recipe-combobox-multi-select__chip',\n { 'd-recipe-combobox-multi-select__chip--truncate': !!chipMaxWidth },\n ]\"\n :style=\"{ maxWidth: chipMaxWidth }\"\n :size=\"CHIP_SIZES[size]\"\n v-on=\"chipListeners\"\n @keyup.backspace=\"onChipRemove(item)\"\n @close=\"onChipRemove(item)\"\n >\n {{ item }}\n </dt-chip>\n </span>\n\n <dt-input\n ref=\"input\"\n v-model=\"value\"\n class=\"d-recipe-combobox-multi-select__input\"\n :input-class=\"[\n inputClass, {\n 'd-recipe-combobox-multi-select__input--hidden': hideInputText,\n }]\"\n :input-wrapper-class=\"inputWrapperClass\"\n :aria-label=\"label\"\n :label=\"labelVisible ? label : ''\"\n :description=\"description\"\n :placeholder=\"inputPlaceHolder\"\n :show-messages=\"showInputMessages\"\n :messages=\"inputMessages\"\n :size=\"size\"\n v-on=\"inputListeners\"\n @input=\"onInput\"\n />\n\n <dt-validation-messages\n :validation-messages=\"maxSelectedMessage\"\n :show-messages=\"showValidationMessages\"\n />\n </span>\n </template>\n\n <!-- @slot slot for popover header -->\n <template\n v-if=\"hasSlotContent($slots.header)\"\n #header\n >\n <div ref=\"header\">\n <slot name=\"header\" />\n </div>\n </template>\n\n <!-- @slot slot for popover list -->\n <template #list>\n <div\n ref=\"list\"\n class=\"d-recipe-combobox-multi-select__list\"\n @mousedown.prevent\n >\n <slot\n v-if=\"!loading\"\n name=\"list\"\n />\n <div\n v-else\n class=\"d-recipe-combobox-multi-select__list--loading\"\n >\n {{ loadingMessage }}\n </div>\n </div>\n </template>\n\n <!-- @slot slot for popover footer -->\n <template\n v-if=\"hasSlotContent($slots.footer)\"\n #footer\n >\n <div ref=\"footer\">\n <slot name=\"footer\" />\n </div>\n </template>\n </dt-recipe-combobox-with-popover>\n</template>\n\n<script>\n/* eslint-disable max-lines */\nimport DtRecipeComboboxWithPopover from '@/recipes/comboboxes/combobox_with_popover/combobox_with_popover.vue';\nimport DtInput from '@/components/input/input.vue';\nimport DtChip from '@/components/chip/chip.vue';\nimport DtValidationMessages from '@/components/validation_messages/validation_messages.vue';\nimport { validationMessageValidator } from '@/common/validators';\nimport { hasSlotContent, returnFirstEl } from '@/common/utils';\nimport {\n POPOVER_APPEND_TO_VALUES,\n} from '@/components/popover/popover_constants';\nimport {\n MULTI_SELECT_SIZES,\n CHIP_SIZES,\n CHIP_TOP_POSITION,\n} from './combobox_multi_select_constants';\n\nexport default {\n compatConfig: { MODE: 3 },\n name: 'DtRecipeComboboxMultiSelect',\n\n components: {\n DtRecipeComboboxWithPopover,\n DtInput,\n DtChip,\n DtValidationMessages,\n },\n\n props: {\n /**\n * String to use for the input label.\n */\n label: {\n type: String,\n required: true,\n },\n\n /**\n * Determines visibility of input label.\n * @values true, false\n */\n labelVisible: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Description for the input\n */\n description: {\n type: String,\n default: '',\n },\n\n /**\n * Input placeholder\n */\n placeholder: {\n type: String,\n default: 'Select one or start typing',\n },\n\n /**\n * Input validation messages\n */\n inputMessages: {\n type: Array,\n default: () => [],\n validator: inputMessages => {\n return validationMessageValidator(inputMessages);\n },\n },\n\n /**\n * Show input validation message\n */\n showInputMessages: {\n type: Boolean,\n default: true,\n },\n\n // @TODO: https://dialpad.atlassian.net/browse/DP-52324\n // type: {\n // type: String,\n // values: ['input', 'select'],\n // default: 'select',\n // },\n\n /**\n * Determines if the list is loading\n */\n loading: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The message when the list is loading\n */\n loadingMessage: {\n type: String,\n default: 'loading...',\n },\n\n /**\n * Determines when to show the list element and also controls the aria-expanded attribute.\n * Leaving this null will have the combobox trigger on input focus by default.\n * If you set this value, the default trigger behavior will be disabled and you can\n * control it as you need.\n */\n showList: {\n type: Boolean,\n default: null,\n },\n\n /**\n * Determines maximum height for the popover before overflow.\n * Possible units rem|px|em\n */\n listMaxHeight: {\n type: String,\n default: '300px',\n },\n\n /**\n * The selected items\n */\n selectedItems: {\n type: Array,\n default: function () { return []; },\n },\n\n /**\n * Would be the maximum number of selections you can make. 0 is unlimited\n */\n maxSelected: {\n type: Number,\n default: 0,\n },\n\n /**\n * Max select message when the max selections is exceeded with the structure:\n * `[{\"message\": string, \"type\": VALIDATION_MESSAGE_TYPES }]`\n */\n maxSelectedMessage: {\n type: Array,\n default: function () { return []; },\n },\n\n /**\n * Displays the list when the combobox is focused, before the user has typed anything.\n * When this is enabled the list will not close after selection.\n */\n hasSuggestionList: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Size of the chip, one of `xs`, `sm`, `md`\n */\n size: {\n type: String,\n default: 'md',\n validator: (t) => Object.values(MULTI_SELECT_SIZES).includes(t),\n },\n\n /**\n * Sets the element to which the popover is going to append to.\n * 'body' will append to the nearest body (supports shadow DOM).\n * @values 'body', 'parent', HTMLElement,\n */\n appendTo: {\n type: [HTMLElement, String],\n default: 'body',\n validator: appendTo => {\n return POPOVER_APPEND_TO_VALUES.includes(appendTo) ||\n (appendTo instanceof HTMLElement);\n },\n },\n\n /**\n * Named transition when the content display is toggled.\n * @see DtLazyShow\n */\n transition: {\n type: String,\n default: 'fade',\n },\n\n /**\n * Determines whether the combobox should collapse to a single when losing focus.\n * @type {boolean}\n */\n collapseOnFocusOut: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Determines maximum width for the popover before overflow.\n * Possible units rem|px|em\n */\n listMaxWidth: {\n type: String,\n default: '',\n },\n\n /**\n * Amount of reserved space (in px) on the right side of the input\n * before the chips and the input caret jump to the next line.\n * default is 64\n */\n reservedRightSpace: {\n type: Number,\n default: 64,\n },\n\n /**\n * Determines the maximum width of a single chip. If the text within this chip exceeds the value\n * it will be truncated with ellipses.\n * Possible units rem|px|em\n */\n chipMaxWidth: {\n type: String,\n default: '',\n },\n\n /**\n * Additional class name for the input element.\n * Can accept String, Object, and Array, i.e. has the\n * same API as Vue's built-in handling of the class attribute.\n */\n inputClass: {\n type: [String, Object, Array],\n default: '',\n },\n\n /**\n * Additional class name for the input wrapper 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 inputWrapperClass: {\n type: [String, Object, Array],\n default: '',\n },\n },\n\n emits: [\n /**\n * Native input event\n *\n * @event input\n * @type {String }\n */\n 'input',\n\n /**\n * Event fired when item selected\n *\n * @event select\n * @type {Number}\n */\n 'select',\n\n /**\n * Event fired when item removed\n *\n * @event remove\n * @type {String}\n */\n 'remove',\n\n /**\n * Event fired when max selected items limit is reached\n *\n * @event max-selected\n * @type {Object}\n */\n 'max-selected',\n\n /**\n * Native keyup event\n *\n * @event keyup\n * @type {KeyboardEvent}\n */\n 'keyup',\n\n /**\n * Event fired when combobox item is highlighted\n *\n * @event combobox-highlight\n * @type {Object}\n */\n 'combobox-highlight',\n ],\n\n data () {\n return {\n value: '',\n popoverOffset: [0, 4],\n showValidationMessages: false,\n resizeWindowObserver: null,\n initialInputHeight: null,\n CHIP_SIZES,\n hasSlotContent,\n inputFocused: false,\n hideInputText: false,\n };\n },\n\n computed: {\n inputPlaceHolder () {\n return this.selectedItems?.length > 0 ? '' : this.placeholder;\n },\n\n chipListeners () {\n return {\n keyup: event => {\n this.onChipKeyup(event);\n this.$emit('keyup', event);\n },\n };\n },\n\n inputListeners () {\n return {\n input: event => {\n this.$emit('input', event);\n if (this.hasSuggestionList) {\n this.showComboboxList();\n }\n },\n\n keyup: event => {\n this.onInputKeyup(event);\n this.$emit('keyup', event);\n },\n\n click: () => {\n if (this.hasSuggestionList) {\n this.showComboboxList();\n }\n },\n };\n },\n\n chipWrapperClass () {\n return {\n [`d-recipe-combobox-multi-select__chip-wrapper-${this.size}--collapsed`]: !this.inputFocused && this.collapseOnFocusOut,\n };\n },\n },\n\n watch: {\n selectedItems: {\n deep: true,\n handler: async function () {\n this.initSelectedItems();\n },\n },\n\n chipMaxWidth: {\n async handler () {\n this.initSelectedItems();\n },\n },\n\n async label () {\n await this.$nextTick();\n // Adjust the chips position if label changed\n this.setChipsTopPosition();\n },\n\n async description () {\n await this.$nextTick();\n // Adjust the chips position if description changed\n this.setChipsTopPosition();\n },\n\n size: {\n async handler () {\n await this.$nextTick();\n const input = this.getInput();\n this.revertInputPadding(input);\n this.initialInputHeight = input.getBoundingClientRect().height;\n this.setInputPadding();\n this.setChipsTopPosition();\n },\n },\n },\n\n mounted () {\n this.setInitialInputHeight();\n // Recalculate chip position and input padding when resizing window\n this.resizeWindowObserver = new ResizeObserver(async () => {\n this.setChipsTopPosition();\n this.setInputPadding();\n });\n this.resizeWindowObserver.observe(document.body);\n\n this.initSelectedItems();\n },\n\n beforeUnmount () {\n this.resizeWindowObserver?.unobserve(document.body);\n },\n\n methods: {\n comboboxHighlight (highlightIndex) {\n this.$emit('combobox-highlight', highlightIndex);\n },\n\n async initSelectedItems () {\n await this.$nextTick();\n this.setInputPadding();\n this.setChipsTopPosition();\n this.setInputMinWidth();\n this.checkMaxSelected();\n },\n\n onChipRemove (item) {\n this.$emit('remove', item);\n this.$refs.input?.focus();\n },\n\n onComboboxSelect (i) {\n if (this.loading) return;\n this.value = '';\n this.$emit('select', i);\n },\n\n showComboboxList () {\n if (this.showList != null) { return; }\n this.$refs.comboboxWithPopover?.showComboboxList();\n },\n\n closeComboboxList () {\n if (this.showList != null) { return; }\n this.$refs.comboboxWithPopover?.closeComboboxList();\n },\n\n getChipButtons () {\n return this.$refs.chips && this.$refs.chips.map(chip => returnFirstEl(chip.$el).querySelector('button'));\n },\n\n getChips () {\n return this.$refs.chips && this.$refs.chips.map(chip => returnFirstEl(chip.$el));\n },\n\n getLastChipButton () {\n return this.$refs.chips && this.getChipButtons()[this.getChipButtons().length - 1];\n },\n\n getLastChip () {\n return this.$refs.chips && this.getChips()[this.getChips().length - 1];\n },\n\n getFirstChip () {\n return this.$refs.chips && this.getChips()[0];\n },\n\n getInput () {\n return this.$refs.input?.$refs.input;\n },\n\n onChipKeyup (event) {\n const key = event.code?.toLowerCase();\n if (key === 'arrowleft') {\n // Move to the previous chip\n this.navigateBetweenChips(event.target, true);\n } else if (key === 'arrowright') {\n if (event.target.id === this.getLastChipButton().id) {\n // Move to the input if it's the last chip\n this.moveFromChipToInput();\n } else {\n // Move to the next chip\n this.navigateBetweenChips(event.target, false);\n }\n }\n },\n\n onInputKeyup (event) {\n const key = event.code?.toLowerCase();\n // If the cursor is at the start of the text,\n // press 'backspace' or 'left' focuses the last chip\n if (this.selectedItems.length > 0 && event.target.selectionStart === 0) {\n if (key === 'backspace' || key === 'arrowleft') {\n this.moveFromInputToChip();\n }\n }\n },\n\n moveFromInputToChip () {\n this.getLastChipButton().focus();\n this.$refs.input?.blur();\n this.closeComboboxList();\n },\n\n moveFromChipToInput () {\n this.getLastChipButton().blur();\n this.$refs.input?.focus();\n this.showComboboxList();\n },\n\n navigateBetweenChips (target, toLeft) {\n const from = this.getChipButtons().indexOf(target);\n const to = toLeft ? from - 1 : from + 1;\n if (to < 0 || to >= this.$refs.chips?.length) {\n return;\n }\n this.getChipButtons()[from].blur();\n this.getChipButtons()[to].focus();\n this.closeComboboxList();\n },\n\n setChipsTopPosition () {\n // To place the chips in the input box\n // The chip \"top\" position should be the same line as the input box\n const input = this.getInput();\n if (!input) return;\n const inputSlotWrapper = this.$refs.inputSlotWrapper;\n const top = input.getBoundingClientRect().top -\n inputSlotWrapper.getBoundingClientRect().top;\n const chipsWrapper = this.$refs.chipsWrapper;\n chipsWrapper.style.top = (top - CHIP_TOP_POSITION[this.size]) + 'px';\n },\n\n setInputPadding () {\n const lastChip = this.getLastChip();\n const input = this.getInput();\n const chipsWrapper = this.$refs.chipsWrapper;\n if (!input) return;\n this.revertInputPadding(input);\n this.popoverOffset = [0, 4];\n if (!lastChip) return;\n // Avoid adding extra padding when the input is not focused if collapseOnFocusOut is true\n // This ensures the input returns to its original state when resizing\n if (this.collapseOnFocusOut && !this.inputFocused) return;\n\n // Get the position of the last chip\n // The input cursor should be the same \"top\" as that chip and next besides it\n const left = lastChip.offsetLeft + this.getFullWidth(lastChip);\n const spaceLeft = input.getBoundingClientRect().width - left;\n // input.style.paddingLeft = left + 'px';\n\n if (spaceLeft > this.reservedRightSpace) {\n input.style.paddingLeft = left + 'px';\n } else {\n input.style.paddingLeft = '4px';\n }\n\n // Get the chip wrapper height minus the 4px padding\n const chipsWrapperHeight = chipsWrapper.getBoundingClientRect().height - 4;\n const lastChipHeight = lastChip.getBoundingClientRect().height - 4;\n\n // Get lastChip offsetTop plus 2px of the input padding.\n const top = spaceLeft > this.reservedRightSpace\n ? lastChip.offsetTop + 2\n : (chipsWrapperHeight + lastChipHeight - 9);\n\n input.style.paddingTop = `${top}px`;\n },\n\n revertInputPadding (input) {\n input.style.paddingLeft = '';\n input.style.paddingTop = '';\n input.style.paddingBottom = '';\n },\n\n getFullWidth (el) {\n const styles = window.getComputedStyle(el);\n return el.offsetWidth + parseInt(styles.marginLeft) + parseInt(styles.marginRight);\n },\n\n setInputMinWidth () {\n // Ensure the width of the input is \"slightly bigger\" than the width of a single chip\n const firstChip = this.getFirstChip();\n const input = this.getInput();\n if (!input) return;\n if (firstChip) {\n // Add 4px buffer for typing room\n input.style.minWidth = (this.getFullWidth(firstChip) + 4) + 'px';\n } else {\n input.style.minWidth = '';\n }\n },\n\n checkMaxSelected () {\n if (this.maxSelected === 0) return;\n if (this.selectedItems.length > this.maxSelected) {\n this.showValidationMessages = true;\n this.$emit('max-selected');\n } else {\n this.showValidationMessages = false;\n }\n },\n\n setInitialInputHeight () {\n const input = this.getInput();\n if (!input) return;\n this.initialInputHeight = input.getBoundingClientRect().height;\n },\n\n async handleInputFocusIn () {\n this.inputFocused = true;\n if (this.collapseOnFocusOut) {\n this.hideInputText = false;\n await this.$nextTick();\n this.setInputPadding();\n }\n },\n\n async handleInputFocusOut () {\n this.inputFocused = false;\n if (this.collapseOnFocusOut) {\n this.hideInputText = true;\n const input = this.getInput();\n if (!input) return;\n // Hide the input text when is not on first line\n if (!input.style.paddingTop) {\n return;\n }\n this.revertInputPadding(input);\n }\n },\n },\n};\n</script>\n"],"names":["_sfc_main","DtRecipeComboboxWithPopover","DtInput","DtChip","DtValidationMessages","inputMessages","validationMessageValidator","t","MULTI_SELECT_SIZES","appendTo","POPOVER_APPEND_TO_VALUES","CHIP_SIZES","hasSlotContent","_a","event","input","highlightIndex","item","i","chip","returnFirstEl","key","target","toLeft","from","to","inputSlotWrapper","top","chipsWrapper","CHIP_TOP_POSITION","lastChip","left","spaceLeft","chipsWrapperHeight","lastChipHeight","el","styles","firstChip","_hoisted_1","_hoisted_3","_createBlock","_component_dt_recipe_combobox_with_popover","$props","$data","$options","_createSlots","_withCtx","onInput","_createElementVNode","args","_normalizeClass","_openBlock","_createElementBlock","_Fragment","_renderList","_component_dt_chip","_mergeProps","_toHandlers","_withKeys","$event","_createTextVNode","_toDisplayString","_createVNode","_component_dt_input","_cache","_component_dt_validation_messages","_withModifiers","_hoisted_2","_renderSlot","_ctx"],"mappings":"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"}