UNPKG

ivue-material-plus

Version:

A high quality UI components Library with Vue.js

1 lines 19.8 kB
{"version":3,"file":"select-head.mjs","sources":["../../../../../src/components/ivue-select/select-head.vue"],"sourcesContent":["<template>\r\n <div :class=\"wrapperClasses\" ref=\"wrapper\">\r\n <!-- 图标 -->\r\n <span :class=\"`${prefixCls}-prefix`\" v-if=\"$slots.prefix || prefix\">\r\n <slot name=\"prefix\">\r\n <ivue-icon v-if=\"prefix\">{{ prefix }}</ivue-icon>\r\n </slot>\r\n </span>\r\n <!-- 多选和设置了最大显示数时的方框 -->\r\n <template v-for=\"(item, index) in selectedMultiple\">\r\n <div\r\n :class=\"`${prefixCls}-tag`\"\r\n :key=\"item.value\"\r\n v-if=\"maxTagCount === undefined || index < maxTagCount\"\r\n >\r\n <span\r\n :class=\"{\r\n [`${prefixCls}-tag-text`]: true,\r\n [`${prefixCls}-multiple-tag-hidden`]: item.disabled,\r\n }\"\r\n >{{ item.label }}</span\r\n >\r\n <ivue-icon\r\n v-if=\"!item.disabled\"\r\n :class=\"multipleIcon\"\r\n @click.stop=\"handleRemoveSelectItem(item)\"\r\n >{{ multipleIcon }}</ivue-icon\r\n >\r\n </div>\r\n </template>\r\n <!-- 多选达到最大值省略 -->\r\n <div\r\n :class=\"`${prefixCls}-tag`\"\r\n v-if=\"maxTagCount !== undefined && selectedMultiple.length > maxTagCount\"\r\n >\r\n <span :class=\"`${prefixCls}-tag-text ${prefixCls}-max-tag`\">\r\n <template v-if=\"maxTagPlaceholder\">{{\r\n maxTagPlaceholder(selectedMultiple.length - maxTagCount)\r\n }}</template>\r\n <template v-else\r\n >+{{ selectedMultiple.length - maxTagCount }}...</template\r\n >\r\n </span>\r\n </div>\r\n <!-- 普通渲染 -->\r\n <input\r\n :class=\"defaultDisplayClasses\"\r\n :value=\"defaultDisplayValue\"\r\n type=\"text\"\r\n tabindex=\"0\"\r\n readonly\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n :disabled=\"disabled\"\r\n :id=\"id\"\r\n @focus=\"handleInputFocus\"\r\n @blur=\"handleInputBlur\"\r\n v-if=\"defaultDisplayValue\"\r\n />\r\n <!-- 输入框 -->\r\n <input\r\n type=\"text\"\r\n v-if=\"filterable\"\r\n v-model=\"data.filterQuery\"\r\n :class=\"inputClasses\"\r\n :style=\"inputStyles\"\r\n :placeholder=\"showPlaceholder ? placeholder : ''\"\r\n :disabled=\"disabled\"\r\n :id=\"id\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n @focus=\"handleInputFocus\"\r\n @blur=\"handleInputBlur\"\r\n @input=\"handleResetInputState\"\r\n @keydown.delete=\"handleInputDelete\"\r\n @keydown.enter=\"handleInputEnter\"\r\n ref=\"input\"\r\n />\r\n <!-- 下拉图标 -->\r\n <transition name=\"ivue-select-fade\">\r\n <ivue-icon\r\n :class=\"[`${prefixCls}-arrow`]\"\r\n v-if=\"!resetSelect && !isSearchMethod\"\r\n >{{ arrowDownIcon }}</ivue-icon\r\n >\r\n </transition>\r\n <transition name=\"ivue-select-fade\">\r\n <!-- 重置选择 -->\r\n <ivue-icon\r\n :class=\"[`${prefixCls}-arrow`, `${prefixCls}-clear`]\"\r\n v-if=\"resetSelect\"\r\n @click.stop=\"handleClear\"\r\n >{{ resetSelectIcon }}</ivue-icon\r\n >\r\n </transition>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport {\r\n defineComponent,\r\n computed,\r\n inject,\r\n reactive,\r\n watch,\r\n nextTick,\r\n ref,\r\n} from 'vue';\r\n\r\nimport IvueIcon from '../ivue-icon/index.vue';\r\n\r\n// type\r\nimport { SelectContextKey } from './types/select';\r\nimport type { Props, Data } from './types/select-head';\r\n\r\nconst prefixCls = 'ivue-select';\r\n\r\nexport default defineComponent({\r\n name: 'ivue-select-head',\r\n props: {\r\n /**\r\n * 是否禁用\r\n *\r\n * @type {Boolean}\r\n */\r\n disabled: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 是否开启多选\r\n *\r\n * @type {Boolean}\r\n */\r\n multiple: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 是否开启多选后的图表\r\n *\r\n * @type {Boolean}\r\n */\r\n multipleIcon: {\r\n type: String,\r\n default: '',\r\n },\r\n /**\r\n * 最终渲染的数据\r\n *\r\n * @type {Array}\r\n */\r\n values: {\r\n type: Array,\r\n default: () => [],\r\n },\r\n /**\r\n * 在 Select 内显示图标\r\n *\r\n * @type {String}\r\n */\r\n prefix: {\r\n type: String,\r\n },\r\n /**\r\n * 开启过滤筛选\r\n *\r\n * @type {Boolean}\r\n */\r\n filterable: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 多选时最多显示多少个 tag\r\n *\r\n * @type {Number}\r\n */\r\n maxTagCount: {\r\n type: Number,\r\n },\r\n /**\r\n * 隐藏 tag 时显示的内容,参数是剩余项数量\r\n *\r\n * @type {Function}\r\n */\r\n maxTagPlaceholder: {\r\n type: Function,\r\n },\r\n /**\r\n * 输入提示\r\n *\r\n * @type {String}\r\n */\r\n placeholder: {\r\n type: String,\r\n default: '请选择',\r\n },\r\n /**\r\n * 下拉图标\r\n *\r\n * @type {Boolean}\r\n */\r\n arrowDownIcon: {\r\n type: String,\r\n },\r\n /**\r\n * 是否可以清楚选择\r\n *\r\n * @type {Boolean}\r\n */\r\n clearable: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 是否有搜索方法\r\n *\r\n * @type {Boolean}\r\n */\r\n isSearchMethod: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 重置选择图标\r\n *\r\n * @type {Boolean}\r\n */\r\n resetSelectIcon: {\r\n type: String,\r\n default: '',\r\n },\r\n /**\r\n * 外部过滤输入\r\n *\r\n * @type {String}\r\n */\r\n filterQueryProp: {\r\n type: String,\r\n default: '',\r\n },\r\n /**\r\n * 外部dom元素\r\n *\r\n * @type {Object}\r\n */\r\n selectionDom: {\r\n type: Object,\r\n },\r\n /**\r\n * 是否允许用户创建新条目,需开启 filterable\r\n *\r\n * @type {Boolean}\r\n */\r\n allowCreate: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 显示创建的选项\r\n *\r\n * @type {Boolean}\r\n */\r\n showCreateItem: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * id\r\n *\r\n * @type {String}\r\n */\r\n id: {\r\n type: String,\r\n },\r\n },\r\n setup(props: Props, { slots, emit }) {\r\n const wrapper = ref<HTMLElement>();\r\n const input = ref<HTMLInputElement>();\r\n\r\n // inject\r\n const select = inject(SelectContextKey);\r\n\r\n // data\r\n const data = reactive<Data>({\r\n /**\r\n * 输入框长度\r\n *\r\n * @type { Number}\r\n */\r\n inputLength: 30,\r\n /**\r\n * 输入框输入数据\r\n *\r\n * @type { String}\r\n */\r\n filterQuery: props.filterQueryProp,\r\n /**\r\n * 输入框是否输入-这里不是判断直接赋值v-model而是输入框确实有输入行为\r\n *\r\n * @type { Boolean}\r\n */\r\n isInputChange: false,\r\n });\r\n\r\n // computed\r\n\r\n // 外层样式\r\n const wrapperClasses = computed(() => {\r\n return {\r\n [`${prefixCls}-head-wrapper`]: true,\r\n [`${prefixCls}-head-is-prefix`]: slots.prefix || props.prefix,\r\n // 开启了过滤 && 有图标\r\n [`${prefixCls}-head-flex`]:\r\n props.filterable && (slots.prefix || props.prefix),\r\n };\r\n });\r\n\r\n // 多项选择\r\n const selectedMultiple = computed(() => {\r\n return props.multiple ? props.values : [];\r\n });\r\n\r\n // 普通显示的class\r\n const defaultDisplayClasses = computed(() => {\r\n return [\r\n `${prefixCls}-head-input`,\r\n {\r\n [`${prefixCls}-head-with-prefix`]: slots.prefix || props.prefix,\r\n [`${prefixCls}-selection-value`]:\r\n !showPlaceholder.value && !props.multiple && !props.filterable,\r\n [`${prefixCls}-placeholder`]:\r\n showPlaceholder.value && !props.filterable,\r\n },\r\n ];\r\n });\r\n\r\n // 过滤输入框\r\n const inputClasses = computed(() => {\r\n return [\r\n `${prefixCls}-input-filter`,\r\n {\r\n 'ivue-select-input-filter-placeholder': showPlaceholder.value,\r\n },\r\n ];\r\n });\r\n\r\n // 是否显示占位符\r\n const showPlaceholder = computed(() => {\r\n let status = false;\r\n if (!props.multiple) {\r\n const value = props.values[0];\r\n\r\n // 判断 undefined 和清除空格\r\n if (typeof value === 'undefined' || String(value).trim() === '') {\r\n status = true;\r\n }\r\n } else {\r\n if (!(props.values.length > 0)) {\r\n status = true;\r\n }\r\n }\r\n\r\n return status;\r\n });\r\n\r\n // 普通显示的值\r\n const defaultDisplayValue = computed(() => {\r\n // 判断是否是多选 或者 是否开启了输入框过滤\r\n if ((props.multiple && props.values.length > 0) || props.filterable) {\r\n return '';\r\n }\r\n\r\n return `${selectedSingle.value}` || props.placeholder;\r\n });\r\n\r\n // 选择单个选项\r\n const selectedSingle = computed(() => {\r\n const selected = props.values[0];\r\n\r\n return selected ? selected.label : '';\r\n });\r\n\r\n // 重置选择\r\n const resetSelect = computed(() => {\r\n return !showPlaceholder.value && props.clearable;\r\n });\r\n\r\n // 输入框样式\r\n const inputStyles = computed(() => {\r\n const style: {\r\n width?: string;\r\n } = {};\r\n\r\n // 多选\r\n if (props.multiple) {\r\n if (showPlaceholder.value) {\r\n style.width = '100%';\r\n } else {\r\n style.width = `${data.inputLength}px`;\r\n }\r\n }\r\n\r\n return style;\r\n });\r\n\r\n // methods\r\n\r\n // 清除选择\r\n const handleClear = () => {\r\n emit('on-clear');\r\n };\r\n\r\n // 删除选择选项\r\n const handleRemoveSelectItem = (value) => {\r\n if (props.disabled) {\r\n return false;\r\n }\r\n\r\n // 多选删除了\r\n select.handleOptionClick(value, 'delete-multiple');\r\n };\r\n\r\n // 判断焦点发送事件\r\n const handleInputFocus = () => {\r\n emit('on-input-focus');\r\n };\r\n\r\n // 失去焦点\r\n const handleInputBlur = () => {\r\n if (props.showCreateItem) {\r\n return;\r\n }\r\n\r\n // 没有选项\r\n if (!props.values.length) {\r\n data.filterQuery = '';\r\n }\r\n\r\n emit('on-input-blur');\r\n };\r\n\r\n // 重置输入框状态\r\n const handleResetInputState = (event = null) => {\r\n const value = (event && event.target.value) || data.filterQuery;\r\n\r\n data.inputLength = value.length * 12 + 20;\r\n\r\n const wrapperOffsetWidth = wrapper.value.offsetWidth;\r\n\r\n if (data.inputLength > wrapperOffsetWidth) {\r\n data.inputLength = wrapperOffsetWidth;\r\n }\r\n };\r\n\r\n // 输入框删除\r\n const handleInputDelete = (event: Event) => {\r\n const targetValue = (event.target as HTMLInputElement).value;\r\n\r\n if (\r\n props.multiple &&\r\n selectedMultiple.value.length &&\r\n data.filterQuery === '' &&\r\n targetValue === ''\r\n ) {\r\n handleRemoveSelectItem(\r\n selectedMultiple.value[selectedMultiple.value.length - 1]\r\n );\r\n }\r\n };\r\n\r\n // 点击确认\r\n const handleInputEnter = (event: Event) => {\r\n emit('on-enter', event);\r\n };\r\n\r\n // watch\r\n\r\n // 监听最终渲染的数据\r\n watch(\r\n () => props.values,\r\n ([value]) => {\r\n // 开启了过滤\r\n if (!props.filterable) {\r\n return;\r\n }\r\n\r\n data.isInputChange = true;\r\n\r\n // 判断多选\r\n if (props.multiple) {\r\n // 输入框输入数据\r\n data.filterQuery = '';\r\n // 判断输入框是否输入-这里不是判断直接赋值v-model而是输入框确实有输入行为\r\n data.isInputChange = false;\r\n\r\n return;\r\n }\r\n\r\n if (\r\n typeof value === 'undefined' ||\r\n (typeof value === 'string' && value === '') ||\r\n value === null\r\n ) {\r\n data.filterQuery = '';\r\n } else {\r\n data.filterQuery = `${value.label}`;\r\n }\r\n\r\n nextTick(() => {\r\n // 判断输入框是否输入-这里不是判断直接赋值v-model而是输入框确实有输入行为\r\n data.isInputChange = false;\r\n });\r\n }\r\n );\r\n\r\n // 监听过滤输入\r\n watch(\r\n () => data.filterQuery,\r\n (value) => {\r\n if (data.isInputChange) {\r\n data.isInputChange = false;\r\n return;\r\n }\r\n\r\n emit('on-filter-query-change', value);\r\n }\r\n );\r\n\r\n // 监听外部过滤输入\r\n watch(\r\n () => props.filterQueryProp,\r\n (filterQuery) => {\r\n if (filterQuery !== data.filterQuery && props.filterable) {\r\n data.filterQuery = filterQuery;\r\n }\r\n\r\n // 重置输入框长度\r\n handleResetInputState();\r\n }\r\n );\r\n\r\n return {\r\n prefixCls,\r\n\r\n // dom\r\n wrapper,\r\n input,\r\n\r\n // data\r\n data,\r\n\r\n // computed\r\n wrapperClasses,\r\n selectedMultiple,\r\n defaultDisplayClasses,\r\n defaultDisplayValue,\r\n resetSelect,\r\n showPlaceholder,\r\n inputStyles,\r\n inputClasses,\r\n\r\n // methods\r\n handleClear,\r\n handleRemoveSelectItem,\r\n handleInputFocus,\r\n handleInputBlur,\r\n handleResetInputState,\r\n handleInputDelete,\r\n handleInputEnter,\r\n };\r\n },\r\n components: {\r\n IvueIcon,\r\n },\r\n});\r\n</script>\r\n"],"names":["_resolveComponent","_openBlock","_createElementBlock","_normalizeClass","_createCommentVNode","_createBlock","_withCtx","_Fragment","_renderList","_createElementVNode","_withModifiers","_toDisplayString","_withDirectives","_normalizeStyle","_withKeys","_createVNode","_Transition"],"mappings":"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"}