element-plus
Version:
A Component Library for Vue 3
1 lines • 5.55 kB
Source Map (JSON)
{"version":3,"file":"useOption.mjs","sources":["../../../../../../packages/components/select/src/useOption.ts"],"sourcesContent":["import { inject, computed, getCurrentInstance, watch, toRaw, unref } from 'vue'\nimport { getValueByPath, escapeRegexpString } from '@element-plus/utils/util'\nimport { selectKey, selectGroupKey } from './token'\n\nimport type { Ref } from 'vue'\nimport type { QueryChangeCtx } from './token'\n\nexport function useOption(props, states) {\n // inject\n const select = inject(selectKey)\n const selectGroup = inject(selectGroupKey, { disabled: false })\n\n // computed\n const isObject = computed(() => {\n return (\n Object.prototype.toString.call(props.value).toLowerCase() ===\n '[object object]'\n )\n })\n\n const itemSelected = computed(() => {\n if (!select.props.multiple) {\n return isEqual(props.value, select.props.modelValue)\n } else {\n return contains(select.props.modelValue as unknown[], props.value)\n }\n })\n\n const limitReached = computed(() => {\n if (select.props.multiple) {\n const modelValue = (select.props.modelValue || []) as unknown[]\n return (\n !itemSelected.value &&\n modelValue.length >= select.props.multipleLimit &&\n select.props.multipleLimit > 0\n )\n } else {\n return false\n }\n })\n\n const currentLabel = computed(() => {\n return props.label || (isObject.value ? '' : props.value)\n })\n\n const currentValue = computed(() => {\n return props.value || props.label || ''\n })\n\n const isDisabled = computed(() => {\n return props.disabled || states.groupDisabled || limitReached.value\n })\n\n const instance = getCurrentInstance()\n\n const contains = (arr = [], target) => {\n if (!isObject.value) {\n return arr && arr.indexOf(target) > -1\n } else {\n const valueKey = select.props.valueKey\n return (\n arr &&\n arr.some((item) => {\n return (\n getValueByPath(item, valueKey) === getValueByPath(target, valueKey)\n )\n })\n )\n }\n }\n\n const isEqual = (a: unknown, b: unknown) => {\n if (!isObject.value) {\n return a === b\n } else {\n const { valueKey } = select.props\n return getValueByPath(a, valueKey) === getValueByPath(b, valueKey)\n }\n }\n\n const hoverItem = () => {\n if (!props.disabled && !selectGroup.disabled) {\n select.hoverIndex = select.optionsArray.indexOf(instance)\n }\n }\n\n watch(\n () => currentLabel.value,\n () => {\n if (!props.created && !select.props.remote) select.setSelected()\n }\n )\n\n watch(\n () => props.value,\n (val, oldVal) => {\n const { remote, valueKey } = select.props\n if (!props.created && !remote) {\n if (\n valueKey &&\n typeof val === 'object' &&\n typeof oldVal === 'object' &&\n val[valueKey] === oldVal[valueKey]\n ) {\n return\n }\n select.setSelected()\n }\n }\n )\n\n watch(\n () => selectGroup.disabled,\n () => {\n states.groupDisabled = selectGroup.disabled\n },\n { immediate: true }\n )\n\n const { queryChange } = toRaw(select)\n watch(queryChange, (changes: Ref<QueryChangeCtx>) => {\n const { query } = unref(changes)\n\n const regexp = new RegExp(escapeRegexpString(query), 'i')\n states.visible = regexp.test(currentLabel.value) || props.created\n if (!states.visible) {\n select.filteredOptionsCount--\n }\n })\n\n return {\n select,\n currentLabel,\n currentValue,\n itemSelected,\n isDisabled,\n hoverItem,\n }\n}\n"],"names":[],"mappings":";;;;mBAO0B,OAAO,QAAQ;AAEvC,QAAM,SAAS,OAAO;AACtB,QAAM,cAAc,OAAO,gBAAgB,EAAE,UAAU;AAGvD,QAAM,WAAW,SAAS,MAAM;AAC9B,WACE,OAAO,UAAU,SAAS,KAAK,MAAM,OAAO,kBAC5C;AAAA;AAIJ,QAAM,eAAe,SAAS,MAAM;AAClC,QAAI,CAAC,OAAO,MAAM,UAAU;AAC1B,aAAO,QAAQ,MAAM,OAAO,OAAO,MAAM;AAAA,WACpC;AACL,aAAO,SAAS,OAAO,MAAM,YAAyB,MAAM;AAAA;AAAA;AAIhE,QAAM,eAAe,SAAS,MAAM;AAClC,QAAI,OAAO,MAAM,UAAU;AACzB,YAAM,aAAc,OAAO,MAAM,cAAc;AAC/C,aACE,CAAC,aAAa,SACd,WAAW,UAAU,OAAO,MAAM,iBAClC,OAAO,MAAM,gBAAgB;AAAA,WAE1B;AACL,aAAO;AAAA;AAAA;AAIX,QAAM,eAAe,SAAS,MAAM;AAClC,WAAO,MAAM,mBAAmB,QAAQ,KAAK,MAAM;AAAA;AAGrD,QAAM,eAAe,SAAS,MAAM;AAClC,WAAO,MAAM,SAAS,MAAM,SAAS;AAAA;AAGvC,QAAM,aAAa,SAAS,MAAM;AAChC,WAAO,MAAM,YAAY,OAAO,iBAAiB,aAAa;AAAA;AAGhE,QAAM,WAAW;AAEjB,QAAM,WAAW,CAAC,MAAM,IAAI,WAAW;AACrC,QAAI,CAAC,SAAS,OAAO;AACnB,aAAO,OAAO,IAAI,QAAQ,UAAU;AAAA,WAC/B;AACL,YAAM,WAAW,OAAO,MAAM;AAC9B,aACE,OACA,IAAI,KAAK,CAAC,SAAS;AACjB,eACE,eAAe,MAAM,cAAc,eAAe,QAAQ;AAAA;AAAA;AAAA;AAOpE,QAAM,UAAU,CAAC,GAAY,MAAe;AAC1C,QAAI,CAAC,SAAS,OAAO;AACnB,aAAO,MAAM;AAAA,WACR;AACL,YAAM,EAAE,aAAa,OAAO;AAC5B,aAAO,eAAe,GAAG,cAAc,eAAe,GAAG;AAAA;AAAA;AAI7D,QAAM,YAAY,MAAM;AACtB,QAAI,CAAC,MAAM,YAAY,CAAC,YAAY,UAAU;AAC5C,aAAO,aAAa,OAAO,aAAa,QAAQ;AAAA;AAAA;AAIpD,QACE,MAAM,aAAa,OACnB,MAAM;AACJ,QAAI,CAAC,MAAM,WAAW,CAAC,OAAO,MAAM;AAAQ,aAAO;AAAA;AAIvD,QACE,MAAM,MAAM,OACZ,CAAC,KAAK,WAAW;AACf,UAAM,EAAE,QAAQ,aAAa,OAAO;AACpC,QAAI,CAAC,MAAM,WAAW,CAAC,QAAQ;AAC7B,UACE,YACA,OAAO,QAAQ,YACf,OAAO,WAAW,YAClB,IAAI,cAAc,OAAO,WACzB;AACA;AAAA;AAEF,aAAO;AAAA;AAAA;AAKb,QACE,MAAM,YAAY,UAClB,MAAM;AACJ,WAAO,gBAAgB,YAAY;AAAA,KAErC,EAAE,WAAW;AAGf,QAAM,EAAE,gBAAgB,MAAM;AAC9B,QAAM,aAAa,CAAC,YAAiC;AACnD,UAAM,EAAE,UAAU,MAAM;AAExB,UAAM,SAAS,IAAI,OAAO,mBAAmB,QAAQ;AACrD,WAAO,UAAU,OAAO,KAAK,aAAa,UAAU,MAAM;AAC1D,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA;AAAA;AAIX,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;;;;"}