vuestic-ui
Version:
Vue 3 UI Framework
1 lines • 4.25 kB
Source Map (JSON)
{"version":3,"file":"useSelectableList.mjs","sources":["../../../../src/composables/useSelectableList.ts"],"sourcesContent":["import type { ExtractPropTypes, PropType } from 'vue'\n\nimport { getValueByKey } from '../utils/value-by-key'\nimport { isObject } from '../utils/is-object'\n\nexport type SelectableOption = string | number | boolean | Record<string, any> | null | undefined\nexport type StringOrFunction = string | ((option: SelectableOption) => unknown)\n\nexport const useSelectableListProps = {\n options: { type: Array as PropType<SelectableOption[]>, default: () => [] },\n textBy: { type: [String, Function] as PropType<StringOrFunction>, default: 'text' },\n valueBy: { type: [String, Function] as PropType<StringOrFunction>, default: '' },\n trackBy: { type: [String, Function] as PropType<StringOrFunction>, default: '' },\n disabledBy: { type: [String, Function] as PropType<StringOrFunction>, default: 'disabled' },\n groupBy: { type: [String, Function] as PropType<StringOrFunction>, default: 'group' },\n}\n\nexport function useSelectableList (props: ExtractPropTypes<typeof useSelectableListProps>) {\n const tryResolveByValue = <T>(value: T): SelectableOption | T => {\n const options = props.options\n for (let i = 0; i < options.length; i++) {\n if (getValue(options[i]) === value) {\n return options[i]\n }\n }\n\n return value\n }\n\n const getOptionProperty = (option: SelectableOption, prop: StringOrFunction) => {\n // if option is a primitive value, we return itself\n if (!isObject(option)) { return option }\n\n return getValueByKey(option, prop)\n }\n\n const getTrackBy = (option: SelectableOption): string | number => {\n return props.trackBy ? getOptionProperty(option, props.trackBy) : getValue(option)\n }\n\n const getDisabled = (option: SelectableOption): boolean => {\n // any non-object options should return `false`\n if (!isObject(option)) { return false }\n\n return getOptionProperty(option, props.disabledBy)\n }\n\n const getText = (option: SelectableOption): string => {\n const optionText = getOptionProperty(option, props.textBy)\n\n // `String` should prevent wrong type errors in case of number/boolean value\n if (['number', 'boolean'].includes(typeof optionText)) { return String(optionText) }\n\n return optionText\n }\n\n // group by is used as object's key, so it can be only string or number\n const getGroupBy = (option: SelectableOption): string | number | undefined => {\n if (!isObject(option)) { return undefined }\n\n return getOptionProperty(option, props.groupBy)\n }\n\n // value can be any type except array\n const getValue = (option: SelectableOption) => getOptionProperty(option, props.valueBy)\n\n return {\n tryResolveByValue,\n getValue,\n getText,\n getDisabled,\n getTrackBy,\n getGroupBy,\n }\n}\n"],"names":[],"mappings":";;AAQO,MAAM,yBAAyB;AAAA,EACpC,SAAS,EAAE,MAAM,OAAuC,SAAS,MAAM,CAAA,EAAG;AAAA,EAC1E,QAAQ,EAAE,MAAM,CAAC,QAAQ,QAAQ,GAAiC,SAAS,OAAO;AAAA,EAClF,SAAS,EAAE,MAAM,CAAC,QAAQ,QAAQ,GAAiC,SAAS,GAAG;AAAA,EAC/E,SAAS,EAAE,MAAM,CAAC,QAAQ,QAAQ,GAAiC,SAAS,GAAG;AAAA,EAC/E,YAAY,EAAE,MAAM,CAAC,QAAQ,QAAQ,GAAiC,SAAS,WAAW;AAAA,EAC1F,SAAS,EAAE,MAAM,CAAC,QAAQ,QAAQ,GAAiC,SAAS,QAAQ;AACtF;AAEO,SAAS,kBAAmB,OAAwD;AACnF,QAAA,oBAAoB,CAAI,UAAmC;AAC/D,UAAM,UAAU,MAAM;AACtB,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAI,SAAS,QAAQ,CAAC,CAAC,MAAM,OAAO;AAClC,eAAO,QAAQ,CAAC;AAAA,MAClB;AAAA,IACF;AAEO,WAAA;AAAA,EAAA;AAGH,QAAA,oBAAoB,CAAC,QAA0B,SAA2B;AAE1E,QAAA,CAAC,SAAS,MAAM,GAAG;AAAS,aAAA;AAAA,IAAO;AAEhC,WAAA,cAAc,QAAQ,IAAI;AAAA,EAAA;AAG7B,QAAA,aAAa,CAAC,WAA8C;AACzD,WAAA,MAAM,UAAU,kBAAkB,QAAQ,MAAM,OAAO,IAAI,SAAS,MAAM;AAAA,EAAA;AAG7E,QAAA,cAAc,CAAC,WAAsC;AAErD,QAAA,CAAC,SAAS,MAAM,GAAG;AAAS,aAAA;AAAA,IAAM;AAE/B,WAAA,kBAAkB,QAAQ,MAAM,UAAU;AAAA,EAAA;AAG7C,QAAA,UAAU,CAAC,WAAqC;AACpD,UAAM,aAAa,kBAAkB,QAAQ,MAAM,MAAM;AAGzD,QAAI,CAAC,UAAU,SAAS,EAAE,SAAS,OAAO,UAAU,GAAG;AAAE,aAAO,OAAO,UAAU;AAAA,IAAE;AAE5E,WAAA;AAAA,EAAA;AAIH,QAAA,aAAa,CAAC,WAA0D;AACxE,QAAA,CAAC,SAAS,MAAM,GAAG;AAAS,aAAA;AAAA,IAAU;AAEnC,WAAA,kBAAkB,QAAQ,MAAM,OAAO;AAAA,EAAA;AAIhD,QAAM,WAAW,CAAC,WAA6B,kBAAkB,QAAQ,MAAM,OAAO;AAE/E,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;"}