{"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;;;;"}