@platforma-sdk/ui-vue 1.45.45 → 1.46.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/.turbo/turbo-build.log +10 -10
  2. package/.turbo/turbo-type-check.log +1 -1
  3. package/CHANGELOG.md +18 -0
  4. package/dist/components/PlAdvancedFilter/FilterEditor.vue.d.ts +2 -6
  5. package/dist/components/PlAdvancedFilter/FilterEditor.vue2.js +138 -141
  6. package/dist/components/PlAdvancedFilter/FilterEditor.vue2.js.map +1 -1
  7. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue.d.ts +2 -12
  8. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue2.js +54 -56
  9. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue2.js.map +1 -1
  10. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js +8 -8
  11. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js.map +1 -1
  12. package/dist/components/PlAnnotations/components/FilterSidebar.vue.d.ts +2 -6
  13. package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js +29 -31
  14. package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js.map +1 -1
  15. package/dist/components/PlAnnotations/components/PlAnnotations.vue2.js +14 -16
  16. package/dist/components/PlAnnotations/components/PlAnnotations.vue2.js.map +1 -1
  17. package/dist/components/PlAnnotations/components/PlAnnotationsModal.vue2.js +13 -15
  18. package/dist/components/PlAnnotations/components/PlAnnotationsModal.vue2.js.map +1 -1
  19. package/package.json +7 -7
  20. package/src/components/PlAdvancedFilter/FilterEditor.vue +16 -20
  21. package/src/components/PlAdvancedFilter/PlAdvancedFilter.vue +2 -6
  22. package/src/components/PlAgDataTable/PlAgDataTableV2.vue +7 -5
  23. package/src/components/PlAnnotations/components/FilterSidebar.vue +1 -5
  24. package/src/components/PlAnnotations/components/PlAnnotations.vue +0 -1
  25. package/src/components/PlAnnotations/components/PlAnnotationsModal.vue +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"FilterEditor.vue2.js","sources":["../../../src/components/PlAdvancedFilter/FilterEditor.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { PlAutocomplete, PlAutocompleteMulti, PlDropdown, PlIcon16, PlNumberField, PlTextField, PlToggleSwitch, Slider } from '@milaboratories/uikit';\nimport type { AnchoredPColumnId, AxisFilterByIdx, AxisFilterValue, SUniversalPColumnId } from '@platforma-sdk/model';\nimport { isFilteredPColumn, parseColumnId, stringifyColumnId, type ListOptionBase } from '@platforma-sdk/model';\nimport { computed } from 'vue';\nimport type { SUPPORTED_FILTER_TYPES } from './constants';\nimport { DEFAULT_FILTER_TYPE, DEFAULT_FILTERS } from './constants';\nimport OperandButton from './OperandButton.vue';\nimport type { EditableFilter, Operand, PlAdvancedFilterColumnId, SourceOptionInfo } from './types';\nimport { getFilterInfo, getNormalizedSpec, isNumericFilter, isPositionFilter } from './utils';\n\nconst filter = defineModel<EditableFilter>('filter', { required: true });\n\nconst props = defineProps<{\n isLast: boolean;\n operand: Operand;\n enableDnd: boolean;\n columnOptions: SourceOptionInfo[];\n supportedFilters: typeof SUPPORTED_FILTER_TYPES;\n getSuggestOptions: (params: { columnId: PlAdvancedFilterColumnId; searchStr: string; axisIdx?: number }) =>\n ListOptionBase<string | number>[] | Promise<ListOptionBase<string | number>[]>;\n getSuggestModel?: (params: { columnId: PlAdvancedFilterColumnId; searchStr: string; axisIdx?: number }) =>\n ListOptionBase<string | number> | Promise<ListOptionBase<string | number>>;\n onDelete: (columnId: PlAdvancedFilterColumnId) => void;\n onChangeOperand: (op: Operand) => void;\n}>();\n\nconst getSuggestModel = (...args: Parameters<typeof props.getSuggestOptions>) => typeof props.getSuggestModel === 'function'\n ? props.getSuggestModel(...args)\n : Promise.resolve(props.getSuggestOptions(...args)).then((options) => options[0]);\n\nasync function getSuggestModelMultiFn(id: PlAdvancedFilterColumnId, v: string[], axisIdx?: number): Promise<ListOptionBase<string>[]> {\n return Promise.all(v.map((v) => getSuggestModel({ columnId: id, searchStr: v, axisIdx }) as Promise<ListOptionBase<string>>));\n}\nasync function getSuggestModelSingleFn(id: PlAdvancedFilterColumnId, v: string, axisIdx?: number): Promise<ListOptionBase<string>> {\n return getSuggestModel({ columnId: id, searchStr: v, axisIdx }) as Promise<ListOptionBase<string>>;\n}\nasync function getSuggestOptionsFn(id: PlAdvancedFilterColumnId, str: string, axisIdx?: number): Promise<ListOptionBase<string>[]> {\n return props.getSuggestOptions({ columnId: id, searchStr: str, axisIdx }) as Promise<ListOptionBase<string>[]>;\n}\n\ntype Entries<T> = { [K in keyof T]: [K, T[K]] }[keyof T][];\nfunction changeFilterType() {\n const defaultFilter = DEFAULT_FILTERS[filter.value.type];\n\n filter.value = (Object.entries(defaultFilter) as Entries<EditableFilter>).reduce((res, [key, val]) => {\n res[key] = filter.value[key] ?? val;\n return res;\n }, {} as Record<keyof EditableFilter, EditableFilter[keyof EditableFilter]>) as EditableFilter;\n}\n\nfunction changeSourceId(newSourceId?: PlAdvancedFilterColumnId) {\n if (!newSourceId) {\n return;\n }\n const newSourceInfo = props.columnOptions.find((v) => v.id === getSourceId(newSourceId));\n if (!newSourceInfo) {\n return;\n }\n const filterInfo = getFilterInfo(filter.value.type);\n const newSourceSpec = getNormalizedSpec(newSourceInfo?.spec);\n if (filterInfo.supportedFor(newSourceSpec)) { // don't do anything except update source id\n filter.value.column = newSourceId;\n } else { // reset to default filter which fits to any column\n filter.value = {\n ...DEFAULT_FILTERS[DEFAULT_FILTER_TYPE],\n column: newSourceId,\n };\n }\n}\n\nconst inconsistentSourceSelected = computed(() => {\n const selectedOption = props.columnOptions.find((op) => op.id === getSourceId(filter.value.column));\n return selectedOption === undefined;\n});\nconst sourceOptions = computed(() => {\n const options = props.columnOptions.map((v) => ({ value: v.id, label: v.label ?? v }));\n if (inconsistentSourceSelected.value) {\n options.unshift({ value: filter.value.column, label: 'Inconsistent value' });\n }\n return options;\n});\n\nfunction getSourceId(column: PlAdvancedFilterColumnId): PlAdvancedFilterColumnId {\n try {\n const parsedColumnId = parseColumnId(column as SUniversalPColumnId);\n if (isFilteredPColumn(parsedColumnId)) {\n return stringifyColumnId(parsedColumnId.source);\n } else {\n return column;\n }\n } catch {\n return column;\n }\n}\n\n// similar to FilteredPColumnId but source is stringified and axis filters can be undefined\ntype ColumnAsSourceAndFixedAxes = { source: PlAdvancedFilterColumnId; axisFiltersByIndex: Record<number, AxisFilterValue | undefined> };\nfunction getColumnAsSourceAndFixedAxes(column: PlAdvancedFilterColumnId): ColumnAsSourceAndFixedAxes {\n const sourceId = getSourceId(column);\n const option = props.columnOptions.find((op) => op.id === sourceId);\n const axesToBeFixed = (option?.axesToBeFixed ?? []).reduce((res, item) => {\n res[item.idx] = undefined;\n return res;\n }, {} as Record<number, AxisFilterValue | undefined>);\n try {\n const parsedColumnId = parseColumnId(column as SUniversalPColumnId);\n if (isFilteredPColumn(parsedColumnId)) {\n return {\n source: sourceId,\n axisFiltersByIndex: parsedColumnId.axisFilters.reduce((res, item) => {\n res[item[0]] = item[1];\n return res;\n }, axesToBeFixed),\n };\n }\n } catch {\n return { source: column, axisFiltersByIndex: axesToBeFixed };\n }\n return { source: column, axisFiltersByIndex: axesToBeFixed };\n}\n\nfunction stringifyColumn(value: ColumnAsSourceAndFixedAxes): PlAdvancedFilterColumnId {\n if (Object.keys(value.axisFiltersByIndex).length === 0) {\n return value.source;\n }\n return stringifyColumnId({\n source: parseColumnId(value.source as SUniversalPColumnId) as AnchoredPColumnId,\n axisFilters: Object.entries(value.axisFiltersByIndex).map(([idx, value]) => [Number(idx), value] as AxisFilterByIdx),\n });\n}\n\nconst columnAsSourceAndFixedAxes = computed({\n get: () => {\n return getColumnAsSourceAndFixedAxes(filter.value.column);\n },\n set: (value) => {\n filter.value.column = stringifyColumn(value);\n },\n});\nfunction updateAxisFilterValue(idx: number, value: AxisFilterValue | undefined) {\n columnAsSourceAndFixedAxes.value = {\n ...columnAsSourceAndFixedAxes.value,\n axisFiltersByIndex: { ...columnAsSourceAndFixedAxes.value.axisFiltersByIndex, [idx]: value } };\n}\n\nconst currentOption = computed(() => props.columnOptions.find((op) => op.id === columnAsSourceAndFixedAxes.value.source));\nconst currentSpec = computed(() => currentOption.value?.spec ? getNormalizedSpec(currentOption.value.spec) : null);\nconst currentType = computed(() => currentSpec.value?.valueType);\nconst currentError = computed(() => Boolean(currentOption.value?.error) || inconsistentSourceSelected.value);\n\nconst filterTypesOptions = computed(() => props.supportedFilters\n .filter((v) => filter.value.type === v\n || (currentSpec.value\n ? getFilterInfo(v).supportedFor(currentSpec.value)\n : true),\n )\n .map((v) => ({ value: v, label: getFilterInfo(v).label })),\n);\n\nconst wildcardOptions = computed(() => {\n if (filter.value.type !== 'patternFuzzyContainSubsequence') {\n return [];\n }\n if (currentOption.value?.alphabet === 'nucleotide') {\n return [{ label: 'N', value: 'N' }];\n }\n if (currentOption.value?.alphabet === 'aminoacid') {\n return [{ label: 'X', value: 'X' }];\n }\n return [...new Set(filter.value.value.split(''))].sort().map((v) => ({ value: v, label: v }));\n});\n\nconst stringMatchesError = computed(() => {\n if (filter.value.type !== 'patternMatchesRegularExpression') {\n return false;\n }\n try {\n new RegExp(filter.value.value);\n return false;\n } catch {\n return true;\n }\n});\n\n</script>\n<template>\n <div :class=\"$style.filterWrapper\">\n <!-- top element - column selector / column label - for all filter types-->\n <div v-if=\"enableDnd\" :class=\"[$style.top, $style.columnChip, {[$style.error]: currentError}]\">\n <div :class=\"[$style.typeIcon, {[$style.error]: currentError}]\">\n <PlIcon16 v-if=\"currentError\" name=\"warning\"/>\n <PlIcon16 v-else :name=\"currentType === 'String' || currentType === undefined ? 'cell-type-txt' : 'cell-type-num'\"/>\n </div>\n <div :class=\"$style.titleWrapper\" :title=\"currentOption?.label ?? ''\">\n <div :class=\"$style.title\">\n {{ inconsistentSourceSelected ? 'Inconsistent value' : currentOption?.label ?? filter.column }}\n </div>\n </div>\n <div :class=\"$style.closeIcon\" @click=\"onDelete(filter.column)\">\n <PlIcon16 name=\"close\"/>\n </div>\n </div>\n <div v-else :class=\"$style.top\" >\n <PlDropdown\n v-model=\"columnAsSourceAndFixedAxes.source\"\n :errorStatus=\"currentError\"\n :options=\"sourceOptions\"\n :style=\"{width: '100%'}\"\n group-position=\"top-left\"\n @update:model-value=\"changeSourceId\"\n />\n <div :class=\"$style.closeButton\" @click=\"onDelete(filter.column)\">\n <PlIcon16 name=\"close\"/>\n </div>\n </div>\n\n <div v-if=\"currentOption?.axesToBeFixed?.length\" :class=\"$style.fixedAxesBlock\">\n <template v-for=\"value in currentOption?.axesToBeFixed\" :key=\"value.idx\">\n <PlAutocomplete\n v-model=\"columnAsSourceAndFixedAxes.axisFiltersByIndex[value.idx]\"\n :label=\"value.label\"\n :options-search=\"(str) => getSuggestOptionsFn(columnAsSourceAndFixedAxes.source, str, value.idx)\"\n :model-search=\"(v) => getSuggestModelSingleFn(columnAsSourceAndFixedAxes.source, String(v), value.idx)\"\n :disabled=\"inconsistentSourceSelected\"\n :clearable=\"true\"\n @update:model-value=\"(v) => updateAxisFilterValue(value.idx, v)\"\n />\n </template>\n </div>\n\n <!-- middle - filter type selector - for all filter types -->\n <div :class=\"filter.type === 'isNA' || filter.type === 'isNotNA' ? $style.bottom : $style.middle\">\n <PlDropdown\n v-model=\"filter.type\"\n :options=\"filterTypesOptions\"\n :group-position=\"filter.type === 'isNA' || filter.type === 'isNotNA' ? 'bottom' : 'middle'\"\n @update:model-value=\"changeFilterType\"\n />\n </div>\n\n <!-- middle - for fuzzy contains filter -->\n <template v-if=\"filter.type === 'patternFuzzyContainSubsequence'\">\n <div :class=\"$style.middle\">\n <PlTextField\n v-model=\"filter.value\"\n placeholder=\"Substring\"\n group-position=\"middle\"\n />\n </div>\n <div :class=\"$style.innerSection\">\n <Slider\n v-model=\"filter.maxEdits\"\n :max=\"5\"\n breakpoints label=\"Maximum number of substitutions and indels\"\n />\n <PlToggleSwitch\n v-model=\"filter.substitutionsOnly\"\n label=\"Substitutions only\"\n />\n </div>\n </template>\n\n <!-- bottom element - individual settings for every filter type -->\n <div :class=\"$style.bottom\">\n <template v-if=\"filter.type === 'patternEquals' || filter.type === 'patternNotEquals'\" >\n <PlAutocomplete\n v-model=\"filter.value\"\n :options-search=\"(str) => getSuggestOptionsFn(columnAsSourceAndFixedAxes.source, str)\"\n :model-search=\"(v) => getSuggestModelSingleFn(columnAsSourceAndFixedAxes.source, String(v))\"\n :disabled=\"inconsistentSourceSelected\"\n :clearable=\"true\"\n group-position=\"bottom\"\n />\n </template>\n <template v-if=\"filter.type === 'inSet' || filter.type === 'notInSet'\" >\n <PlAutocompleteMulti\n v-model=\"filter.value\"\n :options-search=\"(str) => getSuggestOptionsFn(columnAsSourceAndFixedAxes.source, str)\"\n :model-search=\"(v) => getSuggestModelMultiFn(columnAsSourceAndFixedAxes.source, v.map((v) => String(v)))\"\n :disabled=\"inconsistentSourceSelected\"\n group-position=\"bottom\"\n />\n </template>\n <PlNumberField\n v-if=\"isNumericFilter(filter)\"\n v-model=\"filter.x\"\n group-position=\"bottom\"\n />\n <PlNumberField\n v-if=\"isPositionFilter(filter)\"\n v-model=\"filter.n\"\n group-position=\"bottom\"\n />\n <PlTextField\n v-if=\"filter.type === 'patternContainSubsequence' || filter.type === 'patternNotContainSubsequence'\"\n v-model=\"filter.value\"\n placeholder=\"Substring\"\n group-position=\"bottom\"\n />\n <PlTextField\n v-if=\"filter.type === 'patternMatchesRegularExpression'\"\n v-model=\"filter.value\"\n :error=\"stringMatchesError ? 'Regular expression is not valid' : undefined\"\n placeholder=\"Regular expression\"\n group-position=\"bottom\"\n />\n <PlDropdown\n v-if=\"filter.type === 'patternFuzzyContainSubsequence'\"\n v-model=\"filter.wildcard\"\n clearable\n placeholder=\"Wildcard value\"\n :options=\"wildcardOptions\"\n group-position=\"bottom\"\n />\n </div>\n </div>\n <OperandButton\n :active=\"operand\"\n :disabled=\"isLast\"\n :on-select=\"onChangeOperand\"\n />\n</template>\n\n<style module>\n.filterWrapper {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n cursor: default;\n}\n\n.typeIcon {\n display: inline-flex;\n margin-right: 8px;\n}\n\n.typeIcon.error {\n --icon-color: var(--txt-error);\n}\n\n.closeIcon {\n display: inline-flex;\n margin-left: 12px;\n cursor: pointer;\n}\n\n.titleWrapper {\n flex-grow: 1;\n overflow: hidden;\n}\n.title {\n overflow: hidden;\n color: var(--txt-01);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.columnChip {\n width: 100%;\n display: flex;\n padding: 10px 12px;\n align-items: center;\n border-radius: 6px;\n border: 1px solid var(--txt-01);\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n\n &.error {\n border-color: var(--txt-error);\n }\n}\n\n.innerSection {\n border: 1px solid var(--txt-01);\n border-top: none;\n padding: 16px 12px;\n}\n\n.closeButton {\n border: 1px solid var(--txt-01);\n border-top-right-radius: 6px;\n border-left: none;\n width: 40px;\n height: 40px;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-shrink: 0;\n cursor: pointer;\n}\n\n.top {\n position: relative;\n display: flex;\n width: 100%;\n z-index: 1;\n background: #fff;\n}\n\n.fixedAxesBlock {\n position: relative;\n display: flex;\n flex-direction: column;\n padding: 12px 8px;\n gap: 12px;\n border-left: 1px solid var(--txt-01);\n border-right: 1px solid var(--txt-01);\n}\n\n.fixedAxesBlock > * {\n background: #fff;\n}\n\n.middle, .bottom {\n position: relative;\n margin-top: -1px;\n background: #fff;\n}\n\n</style>\n"],"names":["filter","_useModel","__props","props","getSuggestModel","args","options","getSuggestModelMultiFn","id","v","axisIdx","getSuggestModelSingleFn","getSuggestOptionsFn","str","changeFilterType","defaultFilter","DEFAULT_FILTERS","res","key","val","changeSourceId","newSourceId","newSourceInfo","getSourceId","filterInfo","getFilterInfo","newSourceSpec","getNormalizedSpec","DEFAULT_FILTER_TYPE","inconsistentSourceSelected","computed","op","sourceOptions","column","parsedColumnId","parseColumnId","isFilteredPColumn","stringifyColumnId","getColumnAsSourceAndFixedAxes","sourceId","option","axesToBeFixed","item","stringifyColumn","value","idx","columnAsSourceAndFixedAxes","updateAxisFilterValue","currentOption","currentSpec","_a","currentType","currentError","filterTypesOptions","wildcardOptions","_b","stringMatchesError","_createElementVNode","_normalizeClass","$style","_createElementBlock","_createBlock","_unref","PlIcon16","_toDisplayString","_cache","$event","_createVNode","PlDropdown","_d","_c","_openBlock","_Fragment","_renderList","_e","PlAutocomplete","PlTextField","Slider","PlToggleSwitch","PlAutocompleteMulti","isNumericFilter","PlNumberField","isPositionFilter","OperandButton"],"mappings":"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"}
1
+ {"version":3,"file":"FilterEditor.vue2.js","sources":["../../../src/components/PlAdvancedFilter/FilterEditor.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { PlAutocomplete, PlAutocompleteMulti, PlDropdown, PlIcon16, PlNumberField, PlTextField, PlToggleSwitch, Slider } from '@milaboratories/uikit';\nimport type { AnchoredPColumnId, AxisFilterByIdx, AxisFilterValue, SUniversalPColumnId } from '@platforma-sdk/model';\nimport { isFilteredPColumn, parseColumnId, stringifyColumnId, type ListOptionBase } from '@platforma-sdk/model';\nimport { computed } from 'vue';\nimport type { SUPPORTED_FILTER_TYPES } from './constants';\nimport { DEFAULT_FILTER_TYPE, DEFAULT_FILTERS } from './constants';\nimport OperandButton from './OperandButton.vue';\nimport type { EditableFilter, Operand, PlAdvancedFilterColumnId, SourceOptionInfo } from './types';\nimport { getFilterInfo, getNormalizedSpec, isNumericFilter, isPositionFilter } from './utils';\n\nconst filter = defineModel<EditableFilter>('filter', { required: true });\n\nconst props = defineProps<{\n isLast: boolean;\n operand: Operand;\n enableDnd: boolean;\n columnOptions: SourceOptionInfo[];\n supportedFilters: typeof SUPPORTED_FILTER_TYPES;\n getSuggestOptions: (params: { columnId: PlAdvancedFilterColumnId; axisIdx?: number; searchType: 'value' | 'label'; searchStr: string }) =>\n ListOptionBase<string | number>[] | Promise<ListOptionBase<string | number>[]>;\n onDelete: (columnId: PlAdvancedFilterColumnId) => void;\n onChangeOperand: (op: Operand) => void;\n}>();\n\nasync function getSuggestOptionsFn(id: PlAdvancedFilterColumnId, type: 'value' | 'label', str: string, axisIdx?: number): Promise<ListOptionBase<string>[]> {\n return props.getSuggestOptions({ columnId: id, axisIdx, searchType: type, searchStr: str }) as Promise<ListOptionBase<string>[]>;\n}\n\nasync function getMultiSuggestOptionsFn(id: PlAdvancedFilterColumnId, type: 'value' | 'label', str: string | string[], axisIdx?: number): Promise<ListOptionBase<string>[]> {\n if (type === 'label' && typeof str === 'string') {\n return getSuggestOptionsFn(id, type, str, axisIdx);\n }\n if (type === 'value' && Array.isArray(str)) {\n const results = await Promise.all(str.map((s) => getSuggestOptionsFn(id, type, s, axisIdx)));\n return results.map((x) => x[0]);\n }\n throw new Error('Invalid arguments combination');\n}\n\ntype Entries<T> = { [K in keyof T]: [K, T[K]] }[keyof T][];\nfunction changeFilterType() {\n const defaultFilter = DEFAULT_FILTERS[filter.value.type];\n\n filter.value = (Object.entries(defaultFilter) as Entries<EditableFilter>).reduce((res, [key, val]) => {\n res[key] = filter.value[key] ?? val;\n return res;\n }, {} as Record<keyof EditableFilter, EditableFilter[keyof EditableFilter]>) as EditableFilter;\n}\n\nfunction changeSourceId(newSourceId?: PlAdvancedFilterColumnId) {\n if (!newSourceId) {\n return;\n }\n const newSourceInfo = props.columnOptions.find((v) => v.id === getSourceId(newSourceId));\n if (!newSourceInfo) {\n return;\n }\n const filterInfo = getFilterInfo(filter.value.type);\n const newSourceSpec = getNormalizedSpec(newSourceInfo?.spec);\n if (filterInfo.supportedFor(newSourceSpec)) { // don't do anything except update source id\n filter.value.column = newSourceId;\n } else { // reset to default filter which fits to any column\n filter.value = {\n ...DEFAULT_FILTERS[DEFAULT_FILTER_TYPE],\n column: newSourceId,\n };\n }\n}\n\nconst inconsistentSourceSelected = computed(() => {\n const selectedOption = props.columnOptions.find((op) => op.id === getSourceId(filter.value.column));\n return selectedOption === undefined;\n});\nconst sourceOptions = computed(() => {\n const options = props.columnOptions.map((v) => ({ value: v.id, label: v.label ?? v }));\n if (inconsistentSourceSelected.value) {\n options.unshift({ value: filter.value.column, label: 'Inconsistent value' });\n }\n return options;\n});\n\nfunction getSourceId(column: PlAdvancedFilterColumnId): PlAdvancedFilterColumnId {\n try {\n const parsedColumnId = parseColumnId(column as SUniversalPColumnId);\n if (isFilteredPColumn(parsedColumnId)) {\n return stringifyColumnId(parsedColumnId.source);\n } else {\n return column;\n }\n } catch {\n return column;\n }\n}\n\n// similar to FilteredPColumnId but source is stringified and axis filters can be undefined\ntype ColumnAsSourceAndFixedAxes = { source: PlAdvancedFilterColumnId; axisFiltersByIndex: Record<number, AxisFilterValue | undefined> };\nfunction getColumnAsSourceAndFixedAxes(column: PlAdvancedFilterColumnId): ColumnAsSourceAndFixedAxes {\n const sourceId = getSourceId(column);\n const option = props.columnOptions.find((op) => op.id === sourceId);\n const axesToBeFixed = (option?.axesToBeFixed ?? []).reduce((res, item) => {\n res[item.idx] = undefined;\n return res;\n }, {} as Record<number, AxisFilterValue | undefined>);\n try {\n const parsedColumnId = parseColumnId(column as SUniversalPColumnId);\n if (isFilteredPColumn(parsedColumnId)) {\n return {\n source: sourceId,\n axisFiltersByIndex: parsedColumnId.axisFilters.reduce((res, item) => {\n res[item[0]] = item[1];\n return res;\n }, axesToBeFixed),\n };\n }\n } catch {\n return { source: column, axisFiltersByIndex: axesToBeFixed };\n }\n return { source: column, axisFiltersByIndex: axesToBeFixed };\n}\n\nfunction stringifyColumn(value: ColumnAsSourceAndFixedAxes): PlAdvancedFilterColumnId {\n if (Object.keys(value.axisFiltersByIndex).length === 0) {\n return value.source;\n }\n return stringifyColumnId({\n source: parseColumnId(value.source as SUniversalPColumnId) as AnchoredPColumnId,\n axisFilters: Object.entries(value.axisFiltersByIndex).map(([idx, value]) => [Number(idx), value] as AxisFilterByIdx),\n });\n}\n\nconst columnAsSourceAndFixedAxes = computed({\n get: () => {\n return getColumnAsSourceAndFixedAxes(filter.value.column);\n },\n set: (value) => {\n filter.value.column = stringifyColumn(value);\n },\n});\nfunction updateAxisFilterValue(idx: number, value: AxisFilterValue | undefined) {\n columnAsSourceAndFixedAxes.value = {\n ...columnAsSourceAndFixedAxes.value,\n axisFiltersByIndex: { ...columnAsSourceAndFixedAxes.value.axisFiltersByIndex, [idx]: value } };\n}\n\nconst currentOption = computed(() => props.columnOptions.find((op) => op.id === columnAsSourceAndFixedAxes.value.source));\nconst currentSpec = computed(() => currentOption.value?.spec ? getNormalizedSpec(currentOption.value.spec) : null);\nconst currentType = computed(() => currentSpec.value?.valueType);\nconst currentError = computed(() => Boolean(currentOption.value?.error) || inconsistentSourceSelected.value);\n\nconst filterTypesOptions = computed(() => props.supportedFilters\n .filter((v) => filter.value.type === v\n || (currentSpec.value\n ? getFilterInfo(v).supportedFor(currentSpec.value)\n : true),\n )\n .map((v) => ({ value: v, label: getFilterInfo(v).label })),\n);\n\nconst wildcardOptions = computed(() => {\n if (filter.value.type !== 'patternFuzzyContainSubsequence') {\n return [];\n }\n if (currentOption.value?.alphabet === 'nucleotide') {\n return [{ label: 'N', value: 'N' }];\n }\n if (currentOption.value?.alphabet === 'aminoacid') {\n return [{ label: 'X', value: 'X' }];\n }\n return [...new Set(filter.value.value.split(''))].sort().map((v) => ({ value: v, label: v }));\n});\n\nconst stringMatchesError = computed(() => {\n if (filter.value.type !== 'patternMatchesRegularExpression') {\n return false;\n }\n try {\n new RegExp(filter.value.value);\n return false;\n } catch {\n return true;\n }\n});\n\n</script>\n<template>\n <div :class=\"$style.filterWrapper\">\n <!-- top element - column selector / column label - for all filter types-->\n <div v-if=\"enableDnd\" :class=\"[$style.top, $style.columnChip, {[$style.error]: currentError}]\">\n <div :class=\"[$style.typeIcon, {[$style.error]: currentError}]\">\n <PlIcon16 v-if=\"currentError\" name=\"warning\"/>\n <PlIcon16 v-else :name=\"currentType === 'String' || currentType === undefined ? 'cell-type-txt' : 'cell-type-num'\"/>\n </div>\n <div :class=\"$style.titleWrapper\" :title=\"currentOption?.label ?? ''\">\n <div :class=\"$style.title\">\n {{ inconsistentSourceSelected ? 'Inconsistent value' : currentOption?.label ?? filter.column }}\n </div>\n </div>\n <div :class=\"$style.closeIcon\" @click=\"onDelete(filter.column)\">\n <PlIcon16 name=\"close\"/>\n </div>\n </div>\n <div v-else :class=\"$style.top\" >\n <PlDropdown\n v-model=\"columnAsSourceAndFixedAxes.source\"\n :errorStatus=\"currentError\"\n :options=\"sourceOptions\"\n :style=\"{width: '100%'}\"\n group-position=\"top-left\"\n @update:model-value=\"changeSourceId\"\n />\n <div :class=\"$style.closeButton\" @click=\"onDelete(filter.column)\">\n <PlIcon16 name=\"close\"/>\n </div>\n </div>\n\n <div v-if=\"currentOption?.axesToBeFixed?.length\" :class=\"$style.fixedAxesBlock\">\n <template v-for=\"value in currentOption?.axesToBeFixed\" :key=\"value.idx\">\n <PlAutocomplete\n v-model=\"columnAsSourceAndFixedAxes.axisFiltersByIndex[value.idx]\"\n :label=\"value.label\"\n :options-search=\"(str, type) => getSuggestOptionsFn(columnAsSourceAndFixedAxes.source, type, str, value.idx)\"\n :disabled=\"inconsistentSourceSelected\"\n :clearable=\"true\"\n @update:model-value=\"(v) => updateAxisFilterValue(value.idx, v)\"\n />\n </template>\n </div>\n\n <!-- middle - filter type selector - for all filter types -->\n <div :class=\"filter.type === 'isNA' || filter.type === 'isNotNA' ? $style.bottom : $style.middle\">\n <PlDropdown\n v-model=\"filter.type\"\n :options=\"filterTypesOptions\"\n :group-position=\"filter.type === 'isNA' || filter.type === 'isNotNA' ? 'bottom' : 'middle'\"\n @update:model-value=\"changeFilterType\"\n />\n </div>\n\n <!-- middle - for fuzzy contains filter -->\n <template v-if=\"filter.type === 'patternFuzzyContainSubsequence'\">\n <div :class=\"$style.middle\">\n <PlTextField\n v-model=\"filter.value\"\n placeholder=\"Substring\"\n group-position=\"middle\"\n />\n </div>\n <div :class=\"$style.innerSection\">\n <Slider\n v-model=\"filter.maxEdits\"\n :max=\"5\"\n breakpoints label=\"Maximum number of substitutions and indels\"\n />\n <PlToggleSwitch\n v-model=\"filter.substitutionsOnly\"\n label=\"Substitutions only\"\n />\n </div>\n </template>\n\n <!-- bottom element - individual settings for every filter type -->\n <div :class=\"$style.bottom\">\n <template v-if=\"filter.type === 'patternEquals' || filter.type === 'patternNotEquals'\" >\n <PlAutocomplete\n v-model=\"filter.value\"\n :options-search=\"(str, type) => getSuggestOptionsFn(columnAsSourceAndFixedAxes.source, type, str)\"\n :disabled=\"inconsistentSourceSelected\"\n :clearable=\"true\"\n group-position=\"bottom\"\n />\n </template>\n <template v-if=\"filter.type === 'inSet' || filter.type === 'notInSet'\" >\n <PlAutocompleteMulti\n v-model=\"filter.value\"\n :options-search=\"(str, type) => getMultiSuggestOptionsFn(columnAsSourceAndFixedAxes.source, type, str)\"\n :disabled=\"inconsistentSourceSelected\"\n group-position=\"bottom\"\n />\n </template>\n <PlNumberField\n v-if=\"isNumericFilter(filter)\"\n v-model=\"filter.x\"\n group-position=\"bottom\"\n />\n <PlNumberField\n v-if=\"isPositionFilter(filter)\"\n v-model=\"filter.n\"\n group-position=\"bottom\"\n />\n <PlTextField\n v-if=\"filter.type === 'patternContainSubsequence' || filter.type === 'patternNotContainSubsequence'\"\n v-model=\"filter.value\"\n placeholder=\"Substring\"\n group-position=\"bottom\"\n />\n <PlTextField\n v-if=\"filter.type === 'patternMatchesRegularExpression'\"\n v-model=\"filter.value\"\n :error=\"stringMatchesError ? 'Regular expression is not valid' : undefined\"\n placeholder=\"Regular expression\"\n group-position=\"bottom\"\n />\n <PlDropdown\n v-if=\"filter.type === 'patternFuzzyContainSubsequence'\"\n v-model=\"filter.wildcard\"\n clearable\n placeholder=\"Wildcard value\"\n :options=\"wildcardOptions\"\n group-position=\"bottom\"\n />\n </div>\n </div>\n <OperandButton\n :active=\"operand\"\n :disabled=\"isLast\"\n :on-select=\"onChangeOperand\"\n />\n</template>\n\n<style module>\n.filterWrapper {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n cursor: default;\n}\n\n.typeIcon {\n display: inline-flex;\n margin-right: 8px;\n}\n\n.typeIcon.error {\n --icon-color: var(--txt-error);\n}\n\n.closeIcon {\n display: inline-flex;\n margin-left: 12px;\n cursor: pointer;\n}\n\n.titleWrapper {\n flex-grow: 1;\n overflow: hidden;\n}\n.title {\n overflow: hidden;\n color: var(--txt-01);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.columnChip {\n width: 100%;\n display: flex;\n padding: 10px 12px;\n align-items: center;\n border-radius: 6px;\n border: 1px solid var(--txt-01);\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n\n &.error {\n border-color: var(--txt-error);\n }\n}\n\n.innerSection {\n border: 1px solid var(--txt-01);\n border-top: none;\n padding: 16px 12px;\n}\n\n.closeButton {\n border: 1px solid var(--txt-01);\n border-top-right-radius: 6px;\n border-left: none;\n width: 40px;\n height: 40px;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-shrink: 0;\n cursor: pointer;\n}\n\n.top {\n position: relative;\n display: flex;\n width: 100%;\n z-index: 1;\n background: #fff;\n}\n\n.fixedAxesBlock {\n position: relative;\n display: flex;\n flex-direction: column;\n padding: 12px 8px;\n gap: 12px;\n border-left: 1px solid var(--txt-01);\n border-right: 1px solid var(--txt-01);\n}\n\n.fixedAxesBlock > * {\n background: #fff;\n}\n\n.middle, .bottom {\n position: relative;\n margin-top: -1px;\n background: #fff;\n}\n\n</style>\n"],"names":["filter","_useModel","__props","props","getSuggestOptionsFn","id","type","str","axisIdx","getMultiSuggestOptionsFn","s","x","changeFilterType","defaultFilter","DEFAULT_FILTERS","res","key","val","changeSourceId","newSourceId","newSourceInfo","v","getSourceId","filterInfo","getFilterInfo","newSourceSpec","getNormalizedSpec","DEFAULT_FILTER_TYPE","inconsistentSourceSelected","computed","op","sourceOptions","options","column","parsedColumnId","parseColumnId","isFilteredPColumn","stringifyColumnId","getColumnAsSourceAndFixedAxes","sourceId","option","axesToBeFixed","item","stringifyColumn","value","idx","columnAsSourceAndFixedAxes","updateAxisFilterValue","currentOption","currentSpec","_a","currentType","currentError","filterTypesOptions","wildcardOptions","_b","stringMatchesError","_createElementVNode","_normalizeClass","$style","_createElementBlock","_createBlock","_unref","PlIcon16","_toDisplayString","_cache","$event","_createVNode","PlDropdown","_d","_c","_openBlock","_Fragment","_renderList","_e","PlAutocomplete","PlTextField","Slider","PlToggleSwitch","PlAutocompleteMulti","isNumericFilter","PlNumberField","isPositionFilter","OperandButton"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAWA,UAAMA,IAASC,GAA2BC,GAAC,QAA4B,GAEjEC,IAAQD;AAYd,mBAAeE,EAAoBC,GAA8BC,GAAyBC,GAAaC,GAAqD;AAC1J,aAAOL,EAAM,kBAAkB,EAAE,UAAUE,GAAI,SAAAG,GAAS,YAAYF,GAAM,WAAWC,GAAK;AAAA,IAC5F;AAEA,mBAAeE,EAAyBJ,GAA8BC,GAAyBC,GAAwBC,GAAqD;AAC1K,UAAIF,MAAS,WAAW,OAAOC,KAAQ;AACrC,eAAOH,EAAoBC,GAAIC,GAAMC,GAAKC,CAAO;AAEnD,UAAIF,MAAS,WAAW,MAAM,QAAQC,CAAG;AAEvC,gBADgB,MAAM,QAAQ,IAAIA,EAAI,IAAI,CAACG,MAAMN,EAAoBC,GAAIC,GAAMI,GAAGF,CAAO,CAAC,CAAC,GAC5E,IAAI,CAACG,MAAMA,EAAE,CAAC,CAAC;AAEhC,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AAGA,aAASC,IAAmB;AAC1B,YAAMC,IAAgBC,EAAgBd,EAAO,MAAM,IAAI;AAEvD,MAAAA,EAAO,QAAS,OAAO,QAAQa,CAAa,EAA8B,OAAO,CAACE,GAAK,CAACC,GAAKC,CAAG,OAC9FF,EAAIC,CAAG,IAAIhB,EAAO,MAAMgB,CAAG,KAAKC,GACzBF,IACN,CAAA,CAAwE;AAAA,IAC7E;AAEA,aAASG,EAAeC,GAAwC;AAC9D,UAAI,CAACA;AACH;AAEF,YAAMC,IAAgBjB,EAAM,cAAc,KAAK,CAACkB,MAAMA,EAAE,OAAOC,EAAYH,CAAW,CAAC;AACvF,UAAI,CAACC;AACH;AAEF,YAAMG,IAAaC,EAAcxB,EAAO,MAAM,IAAI,GAC5CyB,IAAgBC,EAAkBN,KAAA,gBAAAA,EAAe,IAAI;AAC3D,MAAIG,EAAW,aAAaE,CAAa,IACvCzB,EAAO,MAAM,SAASmB,IAEtBnB,EAAO,QAAQ;AAAA,QACb,GAAGc,EAAgBa,EAAmB;AAAA,QACtC,QAAQR;AAAA,MAAA;AAAA,IAGd;AAEA,UAAMS,IAA6BC,EAAS,MACnB1B,EAAM,cAAc,KAAK,CAAC2B,MAAOA,EAAG,OAAOR,EAAYtB,EAAO,MAAM,MAAM,CAAC,MACxE,MAC3B,GACK+B,IAAgBF,EAAS,MAAM;AACnC,YAAMG,IAAU7B,EAAM,cAAc,IAAI,CAACkB,OAAO,EAAE,OAAOA,EAAE,IAAI,OAAOA,EAAE,SAASA,IAAI;AACrF,aAAIO,EAA2B,SAC7BI,EAAQ,QAAQ,EAAE,OAAOhC,EAAO,MAAM,QAAQ,OAAO,sBAAsB,GAEtEgC;AAAA,IACT,CAAC;AAED,aAASV,EAAYW,GAA4D;AAC/E,UAAI;AACF,cAAMC,IAAiBC,EAAcF,CAA6B;AAClE,eAAIG,EAAkBF,CAAc,IAC3BG,EAAkBH,EAAe,MAAM,IAEvCD;AAAA,MAEX,QAAQ;AACN,eAAOA;AAAA,MACT;AAAA,IACF;AAIA,aAASK,EAA8BL,GAA8D;AACnG,YAAMM,IAAWjB,EAAYW,CAAM,GAC7BO,IAASrC,EAAM,cAAc,KAAK,CAAC2B,MAAOA,EAAG,OAAOS,CAAQ,GAC5DE,MAAiBD,KAAA,gBAAAA,EAAQ,kBAAiB,CAAA,GAAI,OAAO,CAACzB,GAAK2B,OAC/D3B,EAAI2B,EAAK,GAAG,IAAI,QACT3B,IACN,CAAA,CAAiD;AACpD,UAAI;AACF,cAAMmB,IAAiBC,EAAcF,CAA6B;AAClE,YAAIG,EAAkBF,CAAc;AAClC,iBAAO;AAAA,YACL,QAAQK;AAAA,YACR,oBAAoBL,EAAe,YAAY,OAAO,CAACnB,GAAK2B,OAC1D3B,EAAI2B,EAAK,CAAC,CAAC,IAAIA,EAAK,CAAC,GACd3B,IACN0B,CAAa;AAAA,UAAA;AAAA,MAGtB,QAAQ;AACN,eAAO,EAAE,QAAQR,GAAQ,oBAAoBQ,EAAA;AAAA,MAC/C;AACA,aAAO,EAAE,QAAQR,GAAQ,oBAAoBQ,EAAA;AAAA,IAC/C;AAEA,aAASE,EAAgBC,GAA6D;AACpF,aAAI,OAAO,KAAKA,EAAM,kBAAkB,EAAE,WAAW,IAC5CA,EAAM,SAERP,EAAkB;AAAA,QACvB,QAAQF,EAAcS,EAAM,MAA6B;AAAA,QACzD,aAAa,OAAO,QAAQA,EAAM,kBAAkB,EAAE,IAAI,CAAC,CAACC,GAAKD,CAAK,MAAM,CAAC,OAAOC,CAAG,GAAGD,CAAK,CAAoB;AAAA,MAAA,CACpH;AAAA,IACH;AAEA,UAAME,IAA6BjB,EAAS;AAAA,MAC1C,KAAK,MACIS,EAA8BtC,EAAO,MAAM,MAAM;AAAA,MAE1D,KAAK,CAAC4C,MAAU;AACd,QAAA5C,EAAO,MAAM,SAAS2C,EAAgBC,CAAK;AAAA,MAC7C;AAAA,IAAA,CACD;AACD,aAASG,EAAsBF,GAAaD,GAAoC;AAC9E,MAAAE,EAA2B,QAAQ;AAAA,QACjC,GAAGA,EAA2B;AAAA,QAC9B,oBAAoB,EAAE,GAAGA,EAA2B,MAAM,oBAAoB,CAACD,CAAG,GAAGD,EAAA;AAAA,MAAM;AAAA,IAC/F;AAEA,UAAMI,IAAgBnB,EAAS,MAAM1B,EAAM,cAAc,KAAK,CAAC2B,MAAOA,EAAG,OAAOgB,EAA2B,MAAM,MAAM,CAAC,GAClHG,IAAcpB,EAAS,MAAA;;AAAM,cAAAqB,IAAAF,EAAc,UAAd,QAAAE,EAAqB,OAAOxB,EAAkBsB,EAAc,MAAM,IAAI,IAAI;AAAA,KAAI,GAC3GG,IAActB,EAAS,MAAA;;AAAM,cAAAqB,IAAAD,EAAY,UAAZ,gBAAAC,EAAmB;AAAA,KAAS,GACzDE,IAAevB,EAAS,MAAA;;AAAM,iBAAQqB,IAAAF,EAAc,UAAd,QAAAE,EAAqB,UAAUtB,EAA2B;AAAA,KAAK,GAErGyB,IAAqBxB;AAAA,MAAS,MAAM1B,EAAM,iBAC7C;AAAA,QAAO,CAACkB,MAAMrB,EAAO,MAAM,SAASqB,MAC/B4B,EAAY,QACZzB,EAAcH,CAAC,EAAE,aAAa4B,EAAY,KAAK,IAC/C;AAAA,MAAA,EAEL,IAAI,CAAC5B,OAAO,EAAE,OAAOA,GAAG,OAAOG,EAAcH,CAAC,EAAE,QAAQ;AAAA,IAAA,GAGrDiC,IAAkBzB,EAAS,MAAM;;AACrC,aAAI7B,EAAO,MAAM,SAAS,mCACjB,CAAA,MAELkD,IAAAF,EAAc,UAAd,gBAAAE,EAAqB,cAAa,eAC7B,CAAC,EAAE,OAAO,KAAK,OAAO,KAAK,MAEhCK,IAAAP,EAAc,UAAd,gBAAAO,EAAqB,cAAa,cAC7B,CAAC,EAAE,OAAO,KAAK,OAAO,KAAK,IAE7B,CAAC,GAAG,IAAI,IAAIvD,EAAO,MAAM,MAAM,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,IAAI,CAACqB,OAAO,EAAE,OAAOA,GAAG,OAAOA,EAAA,EAAI;AAAA,IAC9F,CAAC,GAEKmC,IAAqB3B,EAAS,MAAM;AACxC,UAAI7B,EAAO,MAAM,SAAS;AACxB,eAAO;AAET,UAAI;AACF,mBAAI,OAAOA,EAAO,MAAM,KAAK,GACtB;AAAA,MACT,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,CAAC;;;;QAICyD,EA8HM,OAAA;AAAA,UA9HA,OAAKC,EAAEC,EAAAA,OAAO,aAAa;AAAA,QAAA;UAEpBzD,EAAA,kBAAX0D,EAaM,OAAA;AAAA;YAbiB,OAAKF,EAAA,CAAGC,EAAAA,OAAO,KAAKA,EAAAA,OAAO,YAAU,EAAA,CAAIA,EAAAA,OAAO,KAAK,GAAGP,EAAA,OAAY,CAAA;AAAA,UAAA;YACzFK,EAGM,OAAA;AAAA,cAHA,OAAKC,EAAA,CAAGC,SAAO,aAAYA,EAAAA,OAAO,KAAK,GAAGP,EAAA,MAAA,CAAY,CAAA;AAAA,YAAA;cAC1CA,EAAA,cAAhBS,EAA8CC,EAAAC,CAAA,GAAA;AAAA;gBAAhB,MAAK;AAAA,cAAA,YACnCF,EAAoHC,EAAAC,CAAA,GAAA;AAAA;gBAAlG,MAAMZ,EAAA,UAAW,YAAiBA,EAAA,UAAgB,SAAS,kBAAA;AAAA,cAAA;;YAE/EM,EAIM,OAAA;AAAA,cAJA,OAAKC,EAAEC,EAAAA,OAAO,YAAY;AAAA,cAAG,SAAOT,IAAAF,EAAA,UAAA,gBAAAE,EAAe,UAAK;AAAA,YAAA;cAC5DO,EAEM,OAAA;AAAA,gBAFA,OAAKC,EAAEC,EAAAA,OAAO,KAAK;AAAA,cAAA,GACpBK,GAAApC,EAAA,iCAAoD2B,IAAAP,EAAA,UAAA,gBAAAO,EAAe,UAASvD,EAAA,MAAO,MAAM,GAAA,CAAA;AAAA,YAAA;YAGhGyD,EAEM,OAAA;AAAA,cAFA,OAAKC,EAAEC,EAAAA,OAAO,SAAS;AAAA,cAAG,SAAKM,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAEhE,EAAA,SAASF,EAAA,MAAO,MAAM;AAAA,YAAA;cAC3DmE,EAAwBL,EAAAC,CAAA,GAAA,EAAd,MAAK,SAAO;AAAA,YAAA;yBAG1BH,EAYM,OAAA;AAAA;YAZO,OAAKF,EAAEC,EAAAA,OAAO,GAAG;AAAA,UAAA;YAC5BQ,EAOEL,EAAAM,CAAA,GAAA;AAAA,cANS,YAAAtB,EAAA,MAA2B;AAAA;gBAA3BmB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAApB,EAAA,MAA2B,SAAMoB;AAAA,gBAKrBhD;AAAA,cAAA;AAAA,cAJpB,aAAakC,EAAA;AAAA,cACb,SAASrB,EAAA;AAAA,cACT,OAAO,EAAA,OAAA,OAAA;AAAA,cACR,kBAAe;AAAA,YAAA;YAGjB0B,EAEM,OAAA;AAAA,cAFA,OAAKC,EAAEC,EAAAA,OAAO,WAAW;AAAA,cAAG,SAAKM,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAEhE,EAAA,SAASF,EAAA,MAAO,MAAM;AAAA,YAAA;cAC7DmE,EAAwBL,EAAAC,CAAA,GAAA,EAAd,MAAK,SAAO;AAAA,YAAA;;WAIfM,KAAAC,IAAAtB,EAAA,UAAA,gBAAAsB,EAAe,kBAAf,QAAAD,EAA8B,eAAzCT,EAWM,OAAA;AAAA;YAX4C,OAAKF,EAAEC,EAAAA,OAAO,cAAc;AAAA,UAAA;aAC5EY,EAAA,EAAA,GAAAX,EASWY,GAAA,MAAAC,IATeC,IAAA1B,EAAA,UAAA,gBAAA0B,EAAe,gBAAxB9B,YACfiB,EAOEC,EAAAa,CAAA,GAAA;AAAA,cAR0D,KAAA/B,EAAM;AAAA,cAEvD,YAAAE,EAAA,MAA2B,mBAAmBF,EAAM,GAAG;AAAA,cAAvD,uBAAA,CAAA,CAAAsB,MAAApB,EAAA,MAA2B,mBAAmBF,EAAM,GAAG,IAAAsB,GAAA,CAK1C7C,MAAM0B,EAAsBH,EAAM,KAAKvB,CAAC,CAAA;AAAA,cAJ7D,OAAOuB,EAAM;AAAA,cACb,mBAAiBrC,GAAKD,MAASF,EAAoB0C,EAAA,MAA2B,QAAQxC,GAAMC,GAAKqC,EAAM,GAAG;AAAA,cAC1G,UAAUhB,EAAA;AAAA,cACV,WAAW;AAAA,YAAA;;UAOlB6B,EAOM,OAAA;AAAA,YAPA,OAAKC,EAAE1D,EAAA,MAAO,mBAAmBA,EAAA,MAAO,SAAI,YAAiB2D,SAAO,SAASA,EAAAA,OAAO,MAAM;AAAA,UAAA;YAC9FQ,EAKEL,EAAAM,CAAA,GAAA;AAAA,cAJS,YAAApE,EAAA,MAAO;AAAA;gBAAPiE,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAlE,EAAA,MAAO,OAAIkE;AAAA,gBAGCtD;AAAA,cAAA;AAAA,cAFpB,SAASyC,EAAA;AAAA,cACT,kBAAgBrD,EAAA,MAAO,SAAI,UAAeA,EAAA,MAAO,SAAI,YAAA,WAAA;AAAA,YAAA;;UAM1CA,EAAA,MAAO,SAAI,yCAA3B4D,EAmBWY,GAAA,EAAA,KAAA,KAAA;AAAA,YAlBTf,EAMM,OAAA;AAAA,cANA,OAAKC,EAAEC,EAAAA,OAAO,MAAM;AAAA,YAAA;cACxBQ,EAIEL,EAAAc,CAAA,GAAA;AAAA,gBAHS,YAAA5E,EAAA,MAAO;AAAA,gBAAP,uBAAAiE,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAlE,EAAA,MAAO,QAAKkE;AAAA,gBACrB,aAAY;AAAA,gBACZ,kBAAe;AAAA,cAAA;;YAGnBT,EAUM,OAAA;AAAA,cAVA,OAAKC,EAAEC,EAAAA,OAAO,YAAY;AAAA,YAAA;cAC9BQ,EAIEL,EAAAe,EAAA,GAAA;AAAA,gBAHS,YAAA7E,EAAA,MAAO;AAAA,gBAAP,uBAAAiE,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAlE,EAAA,MAAO,WAAQkE;AAAA,gBACvB,KAAK;AAAA,gBACN,aAAA;AAAA,gBAAY,OAAM;AAAA,cAAA;cAEpBC,EAGEL,EAAAgB,EAAA,GAAA;AAAA,gBAFS,YAAA9E,EAAA,MAAO;AAAA,gBAAP,uBAAAiE,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAlE,EAAA,MAAO,oBAAiBkE;AAAA,gBACjC,OAAM;AAAA,cAAA;;;UAMZT,EAiDM,OAAA;AAAA,YAjDA,OAAKC,EAAEC,EAAAA,OAAO,MAAM;AAAA,UAAA;YACR3D,EAAA,MAAO,SAAI,mBAAwBA,EAAA,MAAO,SAAI,2BAC5D6D,EAMEC,EAAAa,CAAA,GAAA;AAAA;cALS,YAAA3E,EAAA,MAAO;AAAA,cAAP,uBAAAiE,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAlE,EAAA,MAAO,QAAKkE;AAAA,cACpB,kBAAc,CAAG3D,GAAKD,MAASF,EAAoB0C,EAAA,MAA2B,QAAQxC,GAAMC,CAAG;AAAA,cAC/F,UAAUqB,EAAA;AAAA,cACV,WAAW;AAAA,cACZ,kBAAe;AAAA,YAAA;YAGH5B,EAAA,MAAO,SAAI,WAAgBA,EAAA,MAAO,SAAI,mBACpD6D,EAKEC,EAAAiB,EAAA,GAAA;AAAA;cAJS,YAAA/E,EAAA,MAAO;AAAA,cAAP,uBAAAiE,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAlE,EAAA,MAAO,QAAKkE;AAAA,cACpB,kBAAc,CAAG3D,GAAKD,MAASG,EAAyBqC,EAAA,MAA2B,QAAQxC,GAAMC,CAAG;AAAA,cACpG,UAAUqB,EAAA;AAAA,cACX,kBAAe;AAAA,YAAA;YAIXkC,EAAAkB,EAAA,EAAgBhF,EAAA,KAAM,UAD9B6D,EAIEC,EAAAmB,CAAA,GAAA;AAAA;cAFS,YAAAjF,EAAA,MAAO;AAAA,cAAP,uBAAAiE,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAlE,EAAA,MAAO,IAACkE;AAAA,cACjB,kBAAe;AAAA,YAAA;YAGTJ,EAAAoB,EAAA,EAAiBlF,EAAA,KAAM,UAD/B6D,EAIEC,EAAAmB,CAAA,GAAA;AAAA;cAFS,YAAAjF,EAAA,MAAO;AAAA,cAAP,uBAAAiE,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAC,MAAAlE,EAAA,MAAO,IAACkE;AAAA,cACjB,kBAAe;AAAA,YAAA;YAGTlE,EAAA,MAAO,SAAI,+BAAoCA,EAAA,MAAO,SAAI,uCADlE6D,EAKEC,EAAAc,CAAA,GAAA;AAAA;cAHS,YAAA5E,EAAA,MAAO;AAAA,cAAP,uBAAAiE,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAC,MAAAlE,EAAA,MAAO,QAAKkE;AAAA,cACrB,aAAY;AAAA,cACZ,kBAAe;AAAA,YAAA;YAGTlE,EAAA,MAAO,SAAI,0CADnB6D,EAMEC,EAAAc,CAAA,GAAA;AAAA;cAJS,YAAA5E,EAAA,MAAO;AAAA,cAAP,uBAAAiE,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAC,MAAAlE,EAAA,MAAO,QAAKkE;AAAA,cACpB,OAAOV,EAAA,QAAkB,oCAAuC;AAAA,cACjE,aAAY;AAAA,cACZ,kBAAe;AAAA,YAAA;YAGTxD,EAAA,MAAO,SAAI,yCADnB6D,EAOEC,EAAAM,CAAA,GAAA;AAAA;cALS,YAAApE,EAAA,MAAO;AAAA,cAAP,uBAAAiE,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAC,MAAAlE,EAAA,MAAO,WAAQkE;AAAA,cACxB,WAAA;AAAA,cACA,aAAY;AAAA,cACX,SAASZ,EAAA;AAAA,cACV,kBAAe;AAAA,YAAA;;;QAIrBa,EAIEgB,IAAA;AAAA,UAHC,QAAQjF,EAAA;AAAA,UACR,UAAUA,EAAA;AAAA,UACV,aAAWA,EAAA;AAAA,QAAA;;;;;"}
@@ -13,15 +13,10 @@ type __VLS_Props = {
13
13
  /** Loading function for unique values for Equal/InSet filters and fixed axes options. */
14
14
  getSuggestOptions: (params: {
15
15
  columnId: PlAdvancedFilterColumnId;
16
- searchStr: string;
17
16
  axisIdx?: number;
18
- }) => ListOptionBase<string | number>[] | Promise<ListOptionBase<string | number>[]>;
19
- /** Loading function for label of selected value for Equal/InSet filters and fixed axes options. */
20
- getSuggestModel?: (params: {
21
- columnId: PlAdvancedFilterColumnId;
22
17
  searchStr: string;
23
- axisIdx?: number;
24
- }) => ListOptionBase<string | number> | Promise<ListOptionBase<string | number>>;
18
+ searchType: 'value' | 'label';
19
+ }) => ListOptionBase<string | number>[] | Promise<ListOptionBase<string | number>[]>;
25
20
  };
26
21
  type __VLS_PublicProps = {
27
22
  'filters': RootFilter;
@@ -42,11 +37,6 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_PublicProps,
42
37
  }>, {
43
38
  enableDnd: boolean;
44
39
  supportedFilters: typeof SUPPORTED_FILTER_TYPES;
45
- getSuggestModel: (params: {
46
- columnId: PlAdvancedFilterColumnId;
47
- searchStr: string;
48
- axisIdx?: number;
49
- }) => ListOptionBase<string | number> | Promise<ListOptionBase<string | number>>;
50
40
  enableAddGroupButton: boolean;
51
41
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
52
42
  declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
@@ -1,27 +1,26 @@
1
- import { defineComponent as M, mergeModels as I, useModel as x, computed as Y, createElementBlock as y, openBlock as l, createVNode as b, createBlock as v, createCommentVNode as T, unref as p, withCtx as i, normalizeClass as g, createElementVNode as D, createTextVNode as f, Fragment as q, renderList as W, renderSlot as j, toRaw as H } from "vue";
1
+ import { defineComponent as I, mergeModels as M, useModel as x, computed as Y, createElementBlock as y, openBlock as r, createVNode as b, createBlock as v, createCommentVNode as F, unref as p, withCtx as l, normalizeClass as f, createElementVNode as D, createTextVNode as g, Fragment as q, renderList as W, renderSlot as j, toRaw as H } from "vue";
2
2
  import { PlElementList as $, PlCheckbox as J, PlBtnSecondary as B } from "@milaboratories/uikit";
3
3
  import K from "./FilterEditor.vue.js";
4
4
  import Q from "./OperandButton.vue.js";
5
5
  import { SUPPORTED_FILTER_TYPES as X, DEFAULT_FILTERS as Z, DEFAULT_FILTER_TYPE as _ } from "./constants.js";
6
6
  import { getNewId as R, createNewGroup as ee, isValidColumnId as N } from "./utils.js";
7
- const te = ["onDrop"], de = /* @__PURE__ */ M({
7
+ const te = ["onDrop"], de = /* @__PURE__ */ I({
8
8
  __name: "PlAdvancedFilter",
9
- props: /* @__PURE__ */ I({
9
+ props: /* @__PURE__ */ M({
10
10
  items: {},
11
11
  supportedFilters: { default: () => X },
12
12
  enableDnd: { type: Boolean, default: !1 },
13
13
  enableAddGroupButton: { type: Boolean, default: !1 },
14
- getSuggestOptions: {},
15
- getSuggestModel: { type: Function, default: void 0 }
14
+ getSuggestOptions: {}
16
15
  }, {
17
16
  filters: { required: !0 },
18
17
  filtersModifiers: {}
19
18
  }),
20
19
  emits: ["update:filters"],
21
20
  setup(m) {
22
- const s = x(m, "filters"), r = m, G = Y(() => {
21
+ const i = x(m, "filters"), s = m, G = Y(() => {
23
22
  var e;
24
- return (e = r.items[0]) == null ? void 0 : e.id;
23
+ return (e = s.items[0]) == null ? void 0 : e.id;
25
24
  }), P = [{
26
25
  id: -1,
27
26
  type: "and",
@@ -29,18 +28,18 @@ const te = ["onDrop"], de = /* @__PURE__ */ M({
29
28
  isExpanded: !0
30
29
  }];
31
30
  function d() {
32
- if (s.value.type !== "or" && s.value.type !== "and")
31
+ if (i.value.type !== "or" && i.value.type !== "and")
33
32
  throw new Error('Invalid model structure, expected root to be "or" or "and" group');
34
- return s.value.filters;
33
+ return i.value.filters;
35
34
  }
36
- function S(e) {
35
+ function A(e) {
37
36
  const o = d()[e];
38
37
  if (o.type !== "and" && o.type !== "or" && o.type !== "not")
39
38
  throw new Error('Invalid group structure, expected "and", "or" or "not" group');
40
39
  return o;
41
40
  }
42
41
  function k(e) {
43
- const t = S(e);
42
+ const t = A(e);
44
43
  if (t.type !== "not")
45
44
  return t;
46
45
  if (t.filter.type !== "and" && t.filter.type !== "or")
@@ -55,11 +54,11 @@ const te = ["onDrop"], de = /* @__PURE__ */ M({
55
54
  isExpanded: !0
56
55
  });
57
56
  }
58
- function A(e, t) {
57
+ function U(e, t) {
59
58
  const o = k(e);
60
- o.filters.length === 1 && t === 0 ? L(e) : o.filters.splice(t, 1);
59
+ o.filters.length === 1 && t === 0 ? S(e) : o.filters.splice(t, 1);
61
60
  }
62
- function U(e) {
61
+ function L(e) {
63
62
  const t = d(), o = t[e];
64
63
  if (o.type === "not") {
65
64
  if (o.filter.type !== "and" && o.filter.type !== "or")
@@ -80,7 +79,7 @@ const te = ["onDrop"], de = /* @__PURE__ */ M({
80
79
  function u(e) {
81
80
  return e.type === "not" ? e.filter : e;
82
81
  }
83
- function L(e) {
82
+ function S(e) {
84
83
  d().splice(e, 1);
85
84
  }
86
85
  function C(e) {
@@ -101,7 +100,7 @@ const te = ["onDrop"], de = /* @__PURE__ */ M({
101
100
  N(o) && C(o);
102
101
  }
103
102
  }
104
- function F(e) {
103
+ function T(e) {
105
104
  e.preventDefault();
106
105
  }
107
106
  function h(e) {
@@ -112,10 +111,10 @@ const te = ["onDrop"], de = /* @__PURE__ */ M({
112
111
  function z(e, t, o) {
113
112
  e[t] = H(o);
114
113
  }
115
- return (e, t) => (l(), y("div", null, [
114
+ return (e, t) => (r(), y("div", null, [
116
115
  b(p($), {
117
- items: s.value.filters,
118
- "onUpdate:items": t[0] || (t[0] = (o) => s.value.filters = o),
116
+ items: i.value.filters,
117
+ "onUpdate:items": t[0] || (t[0] = (o) => i.value.filters = o),
119
118
  "get-item-key": (o) => o.id,
120
119
  "item-class": e.$style.filterGroup,
121
120
  "item-class-content": e.$style.filterGroupContent,
@@ -129,69 +128,68 @@ const te = ["onDrop"], de = /* @__PURE__ */ M({
129
128
  disableToggling: !0,
130
129
  disablePinning: !0
131
130
  }, {
132
- "item-title": i(() => [...t[2] || (t[2] = [
133
- f(" Filter group ", -1)
131
+ "item-title": l(() => [...t[2] || (t[2] = [
132
+ g(" Filter group ", -1)
134
133
  ])]),
135
- "item-content": i(({ item: o, index: n }) => [
134
+ "item-content": l(({ item: o, index: n }) => [
136
135
  D("div", {
137
- class: g(e.$style.groupContent),
136
+ class: f(e.$style.groupContent),
138
137
  dropzone: "true",
139
138
  onDrop: (c) => V(n, c),
140
- onDragover: F
139
+ onDragover: T
141
140
  }, [
142
141
  b(p(J), {
143
142
  "model-value": o.type === "not",
144
- class: g(e.$style.notCheckbox),
145
- "onUpdate:modelValue": (c) => U(n)
143
+ class: f(e.$style.notCheckbox),
144
+ "onUpdate:modelValue": (c) => L(n)
146
145
  }, {
147
- default: i(() => [...t[3] || (t[3] = [
148
- f("NOT", -1)
146
+ default: l(() => [...t[3] || (t[3] = [
147
+ g("NOT", -1)
149
148
  ])]),
150
149
  _: 1
151
150
  }, 8, ["model-value", "class", "onUpdate:modelValue"]),
152
- (l(!0), y(q, null, W(u(o).filters, (c, a) => (l(), v(K, {
151
+ (r(!0), y(q, null, W(u(o).filters, (c, a) => (r(), v(K, {
153
152
  key: a,
154
153
  filter: h(u(o).filters[a]),
155
154
  operand: u(o).type,
156
155
  "column-options": m.items,
157
- "supported-filters": r.supportedFilters,
158
- "get-suggest-model": r.getSuggestModel,
159
- "get-suggest-options": r.getSuggestOptions,
160
- "enable-dnd": !!r.enableDnd,
156
+ "supported-filters": s.supportedFilters,
157
+ "get-suggest-options": s.getSuggestOptions,
158
+ "enable-dnd": !!s.enableDnd,
161
159
  "is-last": a === u(o).filters.length - 1,
162
160
  "on-change-operand": (E) => u(o).type = E,
163
- "on-delete": () => A(n, a),
161
+ "on-delete": () => U(n, a),
164
162
  "onUpdate:filter": (E) => z(u(o).filters, a, E)
165
- }, null, 8, ["filter", "operand", "column-options", "supported-filters", "get-suggest-model", "get-suggest-options", "enable-dnd", "is-last", "on-change-operand", "on-delete", "onUpdate:filter"]))), 128)),
166
- r.enableDnd ? (l(), y("div", {
163
+ }, null, 8, ["filter", "operand", "column-options", "supported-filters", "get-suggest-options", "enable-dnd", "is-last", "on-change-operand", "on-delete", "onUpdate:filter"]))), 128)),
164
+ s.enableDnd ? (r(), y("div", {
167
165
  key: 0,
168
- class: g(e.$style.dropzone)
166
+ class: f(e.$style.dropzone)
169
167
  }, [...t[4] || (t[4] = [
170
168
  D("div", null, "Drop dimensions here", -1)
171
- ])], 2)) : (l(), v(p(B), {
169
+ ])], 2)) : (r(), v(p(B), {
172
170
  key: 1,
173
171
  icon: "add",
174
172
  onClick: (c) => w(n, G.value)
175
173
  }, {
176
- default: i(() => [...t[5] || (t[5] = [
177
- f(" Add filter ", -1)
174
+ default: l(() => [...t[5] || (t[5] = [
175
+ g(" Add filter ", -1)
178
176
  ])]),
179
177
  _: 1
180
178
  }, 8, ["onClick"]))
181
179
  ], 42, te)
182
180
  ]),
183
- "item-after": i(({ index: o }) => [
184
- r.enableAddGroupButton || o < d().length - 1 ? (l(), v(Q, {
181
+ "item-after": l(({ index: o }) => [
182
+ s.enableAddGroupButton || o < d().length - 1 ? (r(), v(Q, {
185
183
  key: 0,
186
- class: g(e.$style.buttonWrapper),
187
- active: s.value.type,
184
+ class: f(e.$style.buttonWrapper),
185
+ active: i.value.type,
188
186
  disabled: o === d().length - 1,
189
- "on-select": (n) => s.value.type = n
190
- }, null, 8, ["class", "active", "disabled", "on-select"])) : T("", !0)
187
+ "on-select": (n) => i.value.type = n
188
+ }, null, 8, ["class", "active", "disabled", "on-select"])) : F("", !0)
191
189
  ]),
192
190
  _: 1
193
191
  }, 8, ["items", "get-item-key", "item-class", "item-class-content", "item-class-title", "is-expanded", "on-expand"]),
194
- r.enableAddGroupButton ? (l(), v(p($), {
192
+ s.enableAddGroupButton ? (r(), v(p($), {
195
193
  key: 0,
196
194
  items: P,
197
195
  "get-item-key": (o) => o.id,
@@ -205,15 +203,15 @@ const te = ["onDrop"], de = /* @__PURE__ */ M({
205
203
  disablePinning: !0,
206
204
  dropzone: "true",
207
205
  onDrop: O,
208
- onDragover: F
206
+ onDragover: T
209
207
  }, {
210
- "item-title": i(() => [...t[6] || (t[6] = [
211
- f("Filter group", -1)
208
+ "item-title": l(() => [...t[6] || (t[6] = [
209
+ g("Filter group", -1)
212
210
  ])]),
213
- "item-content": i(() => [
214
- m.enableDnd ? (l(), y("div", {
211
+ "item-content": l(() => [
212
+ m.enableDnd ? (r(), y("div", {
215
213
  key: 0,
216
- class: g(e.$style.dropzone)
214
+ class: f(e.$style.dropzone)
217
215
  }, [...t[7] || (t[7] = [
218
216
  D("div", null, "Drop dimensions here", -1)
219
217
  ])], 2)) : j(e.$slots, "add-group-buttons", { key: 1 }, () => [
@@ -221,15 +219,15 @@ const te = ["onDrop"], de = /* @__PURE__ */ M({
221
219
  icon: "add",
222
220
  onClick: t[1] || (t[1] = (o) => C(G.value))
223
221
  }, {
224
- default: i(() => [...t[8] || (t[8] = [
225
- f(" Add filter ", -1)
222
+ default: l(() => [...t[8] || (t[8] = [
223
+ g(" Add filter ", -1)
226
224
  ])]),
227
225
  _: 1
228
226
  })
229
227
  ])
230
228
  ]),
231
229
  _: 3
232
- }, 8, ["get-item-key", "item-class", "item-class-content", "item-class-title"])) : T("", !0)
230
+ }, 8, ["get-item-key", "item-class", "item-class-content", "item-class-title"])) : F("", !0)
233
231
  ]));
234
232
  }
235
233
  });
@@ -1 +1 @@
1
- {"version":3,"file":"PlAdvancedFilter.vue2.js","sources":["../../../src/components/PlAdvancedFilter/PlAdvancedFilter.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { PlBtnSecondary, PlCheckbox, PlElementList } from '@milaboratories/uikit';\nimport type { ListOptionBase } from '@platforma-sdk/model';\nimport { computed, toRaw } from 'vue';\nimport FilterEditor from './FilterEditor.vue';\nimport OperandButton from './OperandButton.vue';\nimport { DEFAULT_FILTER_TYPE, DEFAULT_FILTERS, SUPPORTED_FILTER_TYPES } from './constants';\nimport type { CommonFilter, EditableFilter, NodeFilter, PlAdvancedFilterColumnId, RootFilter, SourceOptionInfo } from './types';\nimport { createNewGroup, getNewId, isValidColumnId } from './utils';\n\nconst model = defineModel<RootFilter>('filters', { required: true });\n\nconst props = withDefaults(defineProps<{\n /** List of ids of sources (columns, axes) that can be selected in filters */\n items: SourceOptionInfo[];\n /** List of supported filter types */\n supportedFilters?: typeof SUPPORTED_FILTER_TYPES;\n /** If true - new filter can be added by droppind element into filter group; else new column is added by button click */\n enableDnd?: boolean;\n /** If true - \"Add group\" button is shown below the filter groups */\n enableAddGroupButton?: boolean;\n /** Loading function for unique values for Equal/InSet filters and fixed axes options. */\n getSuggestOptions: (params: { columnId: PlAdvancedFilterColumnId; searchStr: string; axisIdx?: number }) =>\n ListOptionBase<string | number>[] | Promise<ListOptionBase<string | number>[]>;\n /** Loading function for label of selected value for Equal/InSet filters and fixed axes options. */\n getSuggestModel?: (params: { columnId: PlAdvancedFilterColumnId; searchStr: string; axisIdx?: number }) =>\n ListOptionBase<string | number> | Promise<ListOptionBase<string | number>>;\n}>(), {\n supportedFilters: () => SUPPORTED_FILTER_TYPES,\n getSuggestModel: undefined,\n\n enableDnd: false,\n enableAddGroupButton: false,\n});\n\nconst firstColumnId = computed(() => props.items[0]?.id);\nconst emptyGroup: NodeFilter[] = [{\n id: -1,\n type: 'and',\n filters: [],\n isExpanded: true,\n}];\n\nfunction getRootGroups() {\n if (model.value.type !== 'or' && model.value.type !== 'and') {\n throw new Error('Invalid model structure, expected root to be \"or\" or \"and\" group');\n }\n return model.value.filters;\n}\n\nfunction getRootGroup(idx: number): NodeFilter {\n const groups = getRootGroups();\n const group = groups[idx];\n if (group.type !== 'and' && group.type !== 'or' && group.type !== 'not') {\n throw new Error('Invalid group structure, expected \"and\", \"or\" or \"not\" group');\n }\n return group;\n}\n\nfunction getRootGroupContent(idx: number): Exclude<NodeFilter, { type: 'not' }> {\n const group = getRootGroup(idx);\n\n if (group.type !== 'not') {\n return group;\n }\n\n if (group.filter.type !== 'and' && group.filter.type !== 'or') {\n throw new Error('Invalid group structure, expected \"and\" or \"or\" group inside \"not\"');\n }\n\n return group.filter;\n}\n\nfunction addColumnToGroup(groupIdx: number, selectedSourceId: PlAdvancedFilterColumnId) {\n const group = getRootGroupContent(groupIdx);\n\n group.filters.push({\n ...DEFAULT_FILTERS[DEFAULT_FILTER_TYPE],\n column: selectedSourceId,\n id: getNewId(),\n isExpanded: true,\n } as CommonFilter);\n}\n\nfunction removeFilterFromGroup(groupIdx: number, filterIdx: number) {\n const group = getRootGroupContent(groupIdx);\n\n if (group.filters.length === 1 && filterIdx === 0) {\n removeGroup(groupIdx);\n } else {\n group.filters.splice(filterIdx, 1);\n }\n}\nfunction inverseRootNode(groupIdx: number) {\n const groups = getRootGroups();\n const group = groups[groupIdx];\n if (group.type === 'not') {\n if (group.filter.type !== 'and' && group.filter.type !== 'or') {\n throw new Error('Invalid group structure, expected \"and\" or \"or\" group inside \"not\"');\n }\n groups[groupIdx] = group.filter;\n } else {\n const type = groups[groupIdx].type;\n if (type !== 'and' && type !== 'or' && type !== 'not') {\n throw new Error('Invalid group structure, expected \"and\", \"or\" or \"not\" group');\n }\n\n groups[groupIdx] = {\n id: getNewId(),\n isExpanded: true,\n type: 'not',\n filter: groups[groupIdx],\n };\n }\n}\n\nfunction getNotContent<T extends CommonFilter>(item: T): Exclude<T, { type: 'not' }> {\n return item.type === 'not' ? item.filter as Exclude<T, { type: 'not' }> : item as Exclude<T, { type: 'not' }>;\n}\n\nfunction removeGroup(groupIdx: number) {\n const groups = getRootGroups();\n groups.splice(groupIdx, 1);\n}\nfunction addGroup(selectedSourceId: PlAdvancedFilterColumnId) {\n const newGroup = createNewGroup(selectedSourceId);\n const groups = getRootGroups();\n groups.push(newGroup);\n}\n\nfunction handleDropToExistingGroup(groupIdx: number, event: DragEvent) {\n const dataTransfer = event.dataTransfer;\n if (dataTransfer?.getData('text/plain')) {\n const draggedId = dataTransfer.getData('text/plain');\n if (isValidColumnId(draggedId)) {\n addColumnToGroup(groupIdx, draggedId);\n }\n }\n}\nfunction handleDropToNewGroup(event: DragEvent) {\n const dataTransfer = event.dataTransfer;\n if (dataTransfer?.getData('text/plain')) {\n const draggedId = dataTransfer.getData('text/plain');\n if (isValidColumnId(draggedId)) {\n addGroup(draggedId);\n }\n }\n}\nfunction dragOver(event: DragEvent) {\n event.preventDefault();\n}\n\nfunction validateFilter<T extends CommonFilter>(item: T): EditableFilter {\n if (item.type === 'and' || item.type === 'or' || item.type === 'not') {\n throw new Error('Invalid filter structure, expected leaf filter');\n }\n\n return item as EditableFilter;\n}\n\nfunction updateFilter(filters: CommonFilter[], idx: number, updatedFilter: EditableFilter) {\n filters[idx] = toRaw(updatedFilter as CommonFilter);\n}\n</script>\n<template>\n <div>\n <PlElementList\n v-model:items=\"model.filters\"\n :get-item-key=\"(filter) => filter.id\"\n\n :item-class=\"$style.filterGroup\"\n :item-class-content=\"$style.filterGroupContent\"\n :item-class-title=\"$style.filterGroupTitle\"\n\n :is-expanded=\"(filter) => filter.isExpanded === true\"\n :on-expand=\"(group) => { group.isExpanded = !group.isExpanded}\"\n\n :disableDragging=\"false\"\n :disableRemoving=\"false\"\n :disableToggling=\"true\"\n :disablePinning=\"true\"\n >\n <template #item-title>\n Filter group\n </template>\n <template #item-content=\"{ item, index }\">\n <div\n :class=\"$style.groupContent\"\n dropzone=\"true\"\n @drop=\"(event) => handleDropToExistingGroup(index, event)\"\n @dragover=\"dragOver\"\n >\n <PlCheckbox :model-value=\"item.type === 'not'\" :class=\"$style.notCheckbox\" @update:model-value=\"inverseRootNode(index)\">NOT</PlCheckbox>\n <template v-for=\"(_, filterIdx) in getNotContent(item).filters\" :key=\"filterIdx\">\n <FilterEditor\n :filter=\"validateFilter(getNotContent(item).filters[filterIdx])\"\n :operand=\"getNotContent(item).type\"\n :column-options=\"items\"\n :supported-filters=\"props.supportedFilters\"\n :get-suggest-model=\"props.getSuggestModel\"\n :get-suggest-options=\"props.getSuggestOptions\"\n :enable-dnd=\"Boolean(props.enableDnd)\"\n :is-last=\"filterIdx === getNotContent(item).filters.length - 1\"\n :on-change-operand=\"(v) => getNotContent(item).type = v\"\n :on-delete=\"() => removeFilterFromGroup(index, filterIdx)\"\n @update:filter=\"(value) => updateFilter(getNotContent(item).filters, filterIdx, value)\"\n />\n </template>\n <div v-if=\"props.enableDnd\" :class=\"$style.dropzone\">\n <div>Drop dimensions here</div>\n </div>\n <PlBtnSecondary v-else icon=\"add\" @click=\"addColumnToGroup(index, firstColumnId)\">\n Add filter\n </PlBtnSecondary>\n </div>\n </template>\n <template #item-after=\"{ index }\">\n <OperandButton\n v-if=\"props.enableAddGroupButton || index < getRootGroups().length - 1\"\n :class=\"$style.buttonWrapper\"\n :active=\"model.type\"\n :disabled=\"index === getRootGroups().length - 1\"\n :on-select=\"(v) => model.type = v\"\n />\n </template>\n </PlElementList>\n\n <!-- Last group - always empty, just for adding new groups -->\n <PlElementList\n v-if=\"props.enableAddGroupButton\"\n :items=\"emptyGroup\"\n :get-item-key=\"(group) => group.id\"\n :item-class=\"$style.filterGroup\"\n :item-class-content=\"$style.filterGroupContent\"\n :item-class-title=\"$style.filterGroupTitle\"\n\n :is-expanded=\"() => true\"\n\n :disableDragging=\"true\"\n :disableRemoving=\"true\"\n :disableToggling=\"true\"\n :disablePinning=\"true\"\n dropzone=\"true\"\n @drop=\"handleDropToNewGroup\"\n @dragover=\"dragOver\"\n >\n <template #item-title>Filter group</template>\n <template #item-content>\n <div v-if=\"enableDnd\" :class=\"$style.dropzone\">\n <div>Drop dimensions here</div>\n </div>\n <slot v-else name=\"add-group-buttons\">\n <PlBtnSecondary icon=\"add\" @click=\"addGroup(firstColumnId)\">\n Add filter\n </PlBtnSecondary>\n </slot>\n </template>\n </PlElementList>\n </div>\n</template>\n<style module>\n .filterGroup {\n background: var(--bg-base-light);\n }\n .filterGroup:hover {\n background: rgba(99, 224, 36, 0.12);\n }\n .filterGroupTitle {\n background: none;\n }\n .filterGroupContent {\n padding: 4px 24px 24px 24px;\n }\n .groupContent {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .notCheckbox {\n margin: 4px 0;\n }\n .dropzone {\n border-radius: 6px;\n border: 1.5px dashed var(--color-div-grey);\n color: var(--txt-03);\n font-family: Manrope;\n font-size: 14px;\n font-style: normal;\n font-weight: 500;\n height: 40px;\n cursor: default;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n .buttonWrapper {\n margin-top: 8px;\n height: 56px;\n display: flex;\n align-items: center;\n }\n :global(.sortable-chosen) .buttonWrapper {\n visibility: hidden;\n }\n</style>\n"],"names":["model","_useModel","__props","props","firstColumnId","computed","_a","emptyGroup","getRootGroups","getRootGroup","idx","group","getRootGroupContent","addColumnToGroup","groupIdx","selectedSourceId","DEFAULT_FILTERS","DEFAULT_FILTER_TYPE","getNewId","removeFilterFromGroup","filterIdx","removeGroup","inverseRootNode","groups","type","getNotContent","item","addGroup","newGroup","createNewGroup","handleDropToExistingGroup","event","dataTransfer","draggedId","isValidColumnId","handleDropToNewGroup","dragOver","validateFilter","updateFilter","filters","updatedFilter","toRaw","_createElementBlock","_createVNode","_unref","PlElementList","_cache","$event","filter","$style","_withCtx","index","_createElementVNode","_normalizeClass","PlCheckbox","_Fragment","_renderList","_","_createBlock","FilterEditor","v","value","PlBtnSecondary","OperandButton","_renderSlot","_ctx"],"mappings":"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"}
1
+ {"version":3,"file":"PlAdvancedFilter.vue2.js","sources":["../../../src/components/PlAdvancedFilter/PlAdvancedFilter.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { PlBtnSecondary, PlCheckbox, PlElementList } from '@milaboratories/uikit';\nimport type { ListOptionBase } from '@platforma-sdk/model';\nimport { computed, toRaw } from 'vue';\nimport FilterEditor from './FilterEditor.vue';\nimport OperandButton from './OperandButton.vue';\nimport { DEFAULT_FILTER_TYPE, DEFAULT_FILTERS, SUPPORTED_FILTER_TYPES } from './constants';\nimport type { CommonFilter, EditableFilter, NodeFilter, PlAdvancedFilterColumnId, RootFilter, SourceOptionInfo } from './types';\nimport { createNewGroup, getNewId, isValidColumnId } from './utils';\n\nconst model = defineModel<RootFilter>('filters', { required: true });\n\nconst props = withDefaults(defineProps<{\n /** List of ids of sources (columns, axes) that can be selected in filters */\n items: SourceOptionInfo[];\n /** List of supported filter types */\n supportedFilters?: typeof SUPPORTED_FILTER_TYPES;\n /** If true - new filter can be added by droppind element into filter group; else new column is added by button click */\n enableDnd?: boolean;\n /** If true - \"Add group\" button is shown below the filter groups */\n enableAddGroupButton?: boolean;\n /** Loading function for unique values for Equal/InSet filters and fixed axes options. */\n getSuggestOptions: (params: { columnId: PlAdvancedFilterColumnId; axisIdx?: number; searchStr: string; searchType: 'value' | 'label' }) =>\n ListOptionBase<string | number>[] | Promise<ListOptionBase<string | number>[]>;\n}>(), {\n supportedFilters: () => SUPPORTED_FILTER_TYPES,\n getSuggestModel: undefined,\n\n enableDnd: false,\n enableAddGroupButton: false,\n});\n\nconst firstColumnId = computed(() => props.items[0]?.id);\nconst emptyGroup: NodeFilter[] = [{\n id: -1,\n type: 'and',\n filters: [],\n isExpanded: true,\n}];\n\nfunction getRootGroups() {\n if (model.value.type !== 'or' && model.value.type !== 'and') {\n throw new Error('Invalid model structure, expected root to be \"or\" or \"and\" group');\n }\n return model.value.filters;\n}\n\nfunction getRootGroup(idx: number): NodeFilter {\n const groups = getRootGroups();\n const group = groups[idx];\n if (group.type !== 'and' && group.type !== 'or' && group.type !== 'not') {\n throw new Error('Invalid group structure, expected \"and\", \"or\" or \"not\" group');\n }\n return group;\n}\n\nfunction getRootGroupContent(idx: number): Exclude<NodeFilter, { type: 'not' }> {\n const group = getRootGroup(idx);\n\n if (group.type !== 'not') {\n return group;\n }\n\n if (group.filter.type !== 'and' && group.filter.type !== 'or') {\n throw new Error('Invalid group structure, expected \"and\" or \"or\" group inside \"not\"');\n }\n\n return group.filter;\n}\n\nfunction addColumnToGroup(groupIdx: number, selectedSourceId: PlAdvancedFilterColumnId) {\n const group = getRootGroupContent(groupIdx);\n\n group.filters.push({\n ...DEFAULT_FILTERS[DEFAULT_FILTER_TYPE],\n column: selectedSourceId,\n id: getNewId(),\n isExpanded: true,\n } as CommonFilter);\n}\n\nfunction removeFilterFromGroup(groupIdx: number, filterIdx: number) {\n const group = getRootGroupContent(groupIdx);\n\n if (group.filters.length === 1 && filterIdx === 0) {\n removeGroup(groupIdx);\n } else {\n group.filters.splice(filterIdx, 1);\n }\n}\nfunction inverseRootNode(groupIdx: number) {\n const groups = getRootGroups();\n const group = groups[groupIdx];\n if (group.type === 'not') {\n if (group.filter.type !== 'and' && group.filter.type !== 'or') {\n throw new Error('Invalid group structure, expected \"and\" or \"or\" group inside \"not\"');\n }\n groups[groupIdx] = group.filter;\n } else {\n const type = groups[groupIdx].type;\n if (type !== 'and' && type !== 'or' && type !== 'not') {\n throw new Error('Invalid group structure, expected \"and\", \"or\" or \"not\" group');\n }\n\n groups[groupIdx] = {\n id: getNewId(),\n isExpanded: true,\n type: 'not',\n filter: groups[groupIdx],\n };\n }\n}\n\nfunction getNotContent<T extends CommonFilter>(item: T): Exclude<T, { type: 'not' }> {\n return item.type === 'not' ? item.filter as Exclude<T, { type: 'not' }> : item as Exclude<T, { type: 'not' }>;\n}\n\nfunction removeGroup(groupIdx: number) {\n const groups = getRootGroups();\n groups.splice(groupIdx, 1);\n}\nfunction addGroup(selectedSourceId: PlAdvancedFilterColumnId) {\n const newGroup = createNewGroup(selectedSourceId);\n const groups = getRootGroups();\n groups.push(newGroup);\n}\n\nfunction handleDropToExistingGroup(groupIdx: number, event: DragEvent) {\n const dataTransfer = event.dataTransfer;\n if (dataTransfer?.getData('text/plain')) {\n const draggedId = dataTransfer.getData('text/plain');\n if (isValidColumnId(draggedId)) {\n addColumnToGroup(groupIdx, draggedId);\n }\n }\n}\nfunction handleDropToNewGroup(event: DragEvent) {\n const dataTransfer = event.dataTransfer;\n if (dataTransfer?.getData('text/plain')) {\n const draggedId = dataTransfer.getData('text/plain');\n if (isValidColumnId(draggedId)) {\n addGroup(draggedId);\n }\n }\n}\nfunction dragOver(event: DragEvent) {\n event.preventDefault();\n}\n\nfunction validateFilter<T extends CommonFilter>(item: T): EditableFilter {\n if (item.type === 'and' || item.type === 'or' || item.type === 'not') {\n throw new Error('Invalid filter structure, expected leaf filter');\n }\n\n return item as EditableFilter;\n}\n\nfunction updateFilter(filters: CommonFilter[], idx: number, updatedFilter: EditableFilter) {\n filters[idx] = toRaw(updatedFilter as CommonFilter);\n}\n</script>\n<template>\n <div>\n <PlElementList\n v-model:items=\"model.filters\"\n :get-item-key=\"(filter) => filter.id\"\n\n :item-class=\"$style.filterGroup\"\n :item-class-content=\"$style.filterGroupContent\"\n :item-class-title=\"$style.filterGroupTitle\"\n\n :is-expanded=\"(filter) => filter.isExpanded === true\"\n :on-expand=\"(group) => { group.isExpanded = !group.isExpanded}\"\n\n :disableDragging=\"false\"\n :disableRemoving=\"false\"\n :disableToggling=\"true\"\n :disablePinning=\"true\"\n >\n <template #item-title>\n Filter group\n </template>\n <template #item-content=\"{ item, index }\">\n <div\n :class=\"$style.groupContent\"\n dropzone=\"true\"\n @drop=\"(event) => handleDropToExistingGroup(index, event)\"\n @dragover=\"dragOver\"\n >\n <PlCheckbox :model-value=\"item.type === 'not'\" :class=\"$style.notCheckbox\" @update:model-value=\"inverseRootNode(index)\">NOT</PlCheckbox>\n <template v-for=\"(_, filterIdx) in getNotContent(item).filters\" :key=\"filterIdx\">\n <FilterEditor\n :filter=\"validateFilter(getNotContent(item).filters[filterIdx])\"\n :operand=\"getNotContent(item).type\"\n :column-options=\"items\"\n :supported-filters=\"props.supportedFilters\"\n :get-suggest-options=\"props.getSuggestOptions\"\n :enable-dnd=\"Boolean(props.enableDnd)\"\n :is-last=\"filterIdx === getNotContent(item).filters.length - 1\"\n :on-change-operand=\"(v) => getNotContent(item).type = v\"\n :on-delete=\"() => removeFilterFromGroup(index, filterIdx)\"\n @update:filter=\"(value) => updateFilter(getNotContent(item).filters, filterIdx, value)\"\n />\n </template>\n <div v-if=\"props.enableDnd\" :class=\"$style.dropzone\">\n <div>Drop dimensions here</div>\n </div>\n <PlBtnSecondary v-else icon=\"add\" @click=\"addColumnToGroup(index, firstColumnId)\">\n Add filter\n </PlBtnSecondary>\n </div>\n </template>\n <template #item-after=\"{ index }\">\n <OperandButton\n v-if=\"props.enableAddGroupButton || index < getRootGroups().length - 1\"\n :class=\"$style.buttonWrapper\"\n :active=\"model.type\"\n :disabled=\"index === getRootGroups().length - 1\"\n :on-select=\"(v) => model.type = v\"\n />\n </template>\n </PlElementList>\n\n <!-- Last group - always empty, just for adding new groups -->\n <PlElementList\n v-if=\"props.enableAddGroupButton\"\n :items=\"emptyGroup\"\n :get-item-key=\"(group) => group.id\"\n :item-class=\"$style.filterGroup\"\n :item-class-content=\"$style.filterGroupContent\"\n :item-class-title=\"$style.filterGroupTitle\"\n\n :is-expanded=\"() => true\"\n\n :disableDragging=\"true\"\n :disableRemoving=\"true\"\n :disableToggling=\"true\"\n :disablePinning=\"true\"\n dropzone=\"true\"\n @drop=\"handleDropToNewGroup\"\n @dragover=\"dragOver\"\n >\n <template #item-title>Filter group</template>\n <template #item-content>\n <div v-if=\"enableDnd\" :class=\"$style.dropzone\">\n <div>Drop dimensions here</div>\n </div>\n <slot v-else name=\"add-group-buttons\">\n <PlBtnSecondary icon=\"add\" @click=\"addGroup(firstColumnId)\">\n Add filter\n </PlBtnSecondary>\n </slot>\n </template>\n </PlElementList>\n </div>\n</template>\n<style module>\n .filterGroup {\n background: var(--bg-base-light);\n }\n .filterGroup:hover {\n background: rgba(99, 224, 36, 0.12);\n }\n .filterGroupTitle {\n background: none;\n }\n .filterGroupContent {\n padding: 4px 24px 24px 24px;\n }\n .groupContent {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .notCheckbox {\n margin: 4px 0;\n }\n .dropzone {\n border-radius: 6px;\n border: 1.5px dashed var(--color-div-grey);\n color: var(--txt-03);\n font-family: Manrope;\n font-size: 14px;\n font-style: normal;\n font-weight: 500;\n height: 40px;\n cursor: default;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n .buttonWrapper {\n margin-top: 8px;\n height: 56px;\n display: flex;\n align-items: center;\n }\n :global(.sortable-chosen) .buttonWrapper {\n visibility: hidden;\n }\n</style>\n"],"names":["model","_useModel","__props","props","firstColumnId","computed","_a","emptyGroup","getRootGroups","getRootGroup","idx","group","getRootGroupContent","addColumnToGroup","groupIdx","selectedSourceId","DEFAULT_FILTERS","DEFAULT_FILTER_TYPE","getNewId","removeFilterFromGroup","filterIdx","removeGroup","inverseRootNode","groups","type","getNotContent","item","addGroup","newGroup","createNewGroup","handleDropToExistingGroup","event","dataTransfer","draggedId","isValidColumnId","handleDropToNewGroup","dragOver","validateFilter","updateFilter","filters","updatedFilter","toRaw","_createElementBlock","_createVNode","_unref","PlElementList","_cache","$event","filter","$style","_withCtx","index","_createElementVNode","_normalizeClass","PlCheckbox","_Fragment","_renderList","_","_createBlock","FilterEditor","v","value","PlBtnSecondary","OperandButton","_renderSlot","_ctx"],"mappings":";;;;;;;;;;;;;;;;;;;;AAUA,UAAMA,IAAQC,EAAuBC,GAAC,SAA6B,GAE7DC,IAAQD,GAoBRE,IAAgBC,EAAS,MAAA;;AAAM,cAAAC,IAAAH,EAAM,MAAM,CAAC,MAAb,gBAAAG,EAAgB;AAAA,KAAE,GACjDC,IAA2B,CAAC;AAAA,MAChC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS,CAAA;AAAA,MACT,YAAY;AAAA,IAAA,CACb;AAED,aAASC,IAAgB;AACvB,UAAIR,EAAM,MAAM,SAAS,QAAQA,EAAM,MAAM,SAAS;AACpD,cAAM,IAAI,MAAM,kEAAkE;AAEpF,aAAOA,EAAM,MAAM;AAAA,IACrB;AAEA,aAASS,EAAaC,GAAyB;AAE7C,YAAMC,IADSH,EAAA,EACME,CAAG;AACxB,UAAIC,EAAM,SAAS,SAASA,EAAM,SAAS,QAAQA,EAAM,SAAS;AAChE,cAAM,IAAI,MAAM,8DAA8D;AAEhF,aAAOA;AAAA,IACT;AAEA,aAASC,EAAoBF,GAAmD;AAC9E,YAAMC,IAAQF,EAAaC,CAAG;AAE9B,UAAIC,EAAM,SAAS;AACjB,eAAOA;AAGT,UAAIA,EAAM,OAAO,SAAS,SAASA,EAAM,OAAO,SAAS;AACvD,cAAM,IAAI,MAAM,oEAAoE;AAGtF,aAAOA,EAAM;AAAA,IACf;AAEA,aAASE,EAAiBC,GAAkBC,GAA4C;AAGtF,MAFcH,EAAoBE,CAAQ,EAEpC,QAAQ,KAAK;AAAA,QACjB,GAAGE,EAAgBC,CAAmB;AAAA,QACtC,QAAQF;AAAA,QACR,IAAIG,EAAA;AAAA,QACJ,YAAY;AAAA,MAAA,CACG;AAAA,IACnB;AAEA,aAASC,EAAsBL,GAAkBM,GAAmB;AAClE,YAAMT,IAAQC,EAAoBE,CAAQ;AAE1C,MAAIH,EAAM,QAAQ,WAAW,KAAKS,MAAc,IAC9CC,EAAYP,CAAQ,IAEpBH,EAAM,QAAQ,OAAOS,GAAW,CAAC;AAAA,IAErC;AACA,aAASE,EAAgBR,GAAkB;AACzC,YAAMS,IAASf,EAAA,GACTG,IAAQY,EAAOT,CAAQ;AAC7B,UAAIH,EAAM,SAAS,OAAO;AACxB,YAAIA,EAAM,OAAO,SAAS,SAASA,EAAM,OAAO,SAAS;AACvD,gBAAM,IAAI,MAAM,oEAAoE;AAEtF,QAAAY,EAAOT,CAAQ,IAAIH,EAAM;AAAA,MAC3B,OAAO;AACL,cAAMa,IAAOD,EAAOT,CAAQ,EAAE;AAC9B,YAAIU,MAAS,SAASA,MAAS,QAAQA,MAAS;AAC9C,gBAAM,IAAI,MAAM,8DAA8D;AAGhF,QAAAD,EAAOT,CAAQ,IAAI;AAAA,UACjB,IAAII,EAAA;AAAA,UACJ,YAAY;AAAA,UACZ,MAAM;AAAA,UACN,QAAQK,EAAOT,CAAQ;AAAA,QAAA;AAAA,MAE3B;AAAA,IACF;AAEA,aAASW,EAAsCC,GAAsC;AACnF,aAAOA,EAAK,SAAS,QAAQA,EAAK,SAAwCA;AAAA,IAC5E;AAEA,aAASL,EAAYP,GAAkB;AAErC,MADeN,EAAA,EACR,OAAOM,GAAU,CAAC;AAAA,IAC3B;AACA,aAASa,EAASZ,GAA4C;AAC5D,YAAMa,IAAWC,GAAed,CAAgB;AAEhD,MADeP,EAAA,EACR,KAAKoB,CAAQ;AAAA,IACtB;AAEA,aAASE,EAA0BhB,GAAkBiB,GAAkB;AACrE,YAAMC,IAAeD,EAAM;AAC3B,UAAIC,KAAA,QAAAA,EAAc,QAAQ,eAAe;AACvC,cAAMC,IAAYD,EAAa,QAAQ,YAAY;AACnD,QAAIE,EAAgBD,CAAS,KAC3BpB,EAAiBC,GAAUmB,CAAS;AAAA,MAExC;AAAA,IACF;AACA,aAASE,EAAqBJ,GAAkB;AAC9C,YAAMC,IAAeD,EAAM;AAC3B,UAAIC,KAAA,QAAAA,EAAc,QAAQ,eAAe;AACvC,cAAMC,IAAYD,EAAa,QAAQ,YAAY;AACnD,QAAIE,EAAgBD,CAAS,KAC3BN,EAASM,CAAS;AAAA,MAEtB;AAAA,IACF;AACA,aAASG,EAASL,GAAkB;AAClC,MAAAA,EAAM,eAAA;AAAA,IACR;AAEA,aAASM,EAAuCX,GAAyB;AACvE,UAAIA,EAAK,SAAS,SAASA,EAAK,SAAS,QAAQA,EAAK,SAAS;AAC7D,cAAM,IAAI,MAAM,gDAAgD;AAGlE,aAAOA;AAAA,IACT;AAEA,aAASY,EAAaC,GAAyB7B,GAAa8B,GAA+B;AACzF,MAAAD,EAAQ7B,CAAG,IAAI+B,EAAMD,CAA6B;AAAA,IACpD;2BAGEE,EA4FM,OAAA,MAAA;AAAA,MA3FJC,EA0DgBC,EAAAC,CAAA,GAAA;AAAA,QAzDN,OAAO7C,EAAA,MAAM;AAAA,QAAN,kBAAA8C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAA/C,EAAA,MAAM,UAAO+C;AAAA,QAC3B,gBAAY,CAAGC,MAAWA,EAAO;AAAA,QAEjC,cAAYC,EAAAA,OAAO;AAAA,QACnB,sBAAoBA,EAAAA,OAAO;AAAA,QAC3B,oBAAkBA,EAAAA,OAAO;AAAA,QAEzB,eAAW,CAAGD,MAAWA,EAAO,eAAU;AAAA,QAC1C,aAAS,CAAGrC,MAAK;AAAO,UAAAA,EAAM,aAAU,CAAIA,EAAM;AAAA,QAAU;AAAA,QAE5D,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,MAAA;QAEN,gBAAW,MAEtB,CAAA,GAAAmC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,YAFsB,kBAEtB,EAAA;AAAA,QAAA;QACW,gBAAYI,EACrB,CA2BM,EA5BmB,MAAAxB,GAAM,OAAAyB,QAAK;AAAA,UACpCC,EA2BM,OAAA;AAAA,YA1BH,OAAKC,EAAEJ,EAAAA,OAAO,YAAY;AAAA,YAC3B,UAAS;AAAA,YACR,SAAOlB,MAAUD,EAA0BqB,GAAOpB,CAAK;AAAA,YACvD,YAAUK;AAAA,UAAA;YAEXO,EAAwIC,EAAAU,CAAA,GAAA;AAAA,cAA3H,eAAa5B,EAAK,SAAI;AAAA,cAAa,OAAK2B,EAAEJ,EAAAA,OAAO,WAAW;AAAA,cAAG,uBAAkB,CAAAF,MAAEzB,EAAgB6B,CAAK;AAAA,YAAA;yBAAG,MAAG,CAAA,GAAAL,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,kBAAH,OAAG,EAAA;AAAA,cAAA;;;oBAC3HJ,EAaWa,GAAA,MAAAC,EAbwB/B,EAAcC,CAAI,EAAE,SAAO,CAA5C+B,GAAGrC,YACnBsC,EAWEC,GAAA;AAAA,mBAZkEvC;AAAA,cAEjE,QAAQiB,EAAeZ,EAAcC,CAAI,EAAE,QAAQN,CAAS,CAAA;AAAA,cAC5D,SAASK,EAAcC,CAAI,EAAE;AAAA,cAC7B,kBAAgBxB,EAAA;AAAA,cAChB,qBAAmBC,EAAM;AAAA,cACzB,uBAAqBA,EAAM;AAAA,cAC3B,cAAY,EAAQA,EAAM;AAAA,cAC1B,WAASiB,MAAcK,EAAcC,CAAI,EAAE,QAAQ,SAAM;AAAA,cACzD,qBAAiB,CAAGkC,MAAMnC,EAAcC,CAAI,EAAE,OAAOkC;AAAA,cACrD,aAAS,MAAQzC,EAAsBgC,GAAO/B,CAAS;AAAA,cACvD,mBAAa,CAAGyC,MAAUvB,EAAab,EAAcC,CAAI,EAAE,SAASN,GAAWyC,CAAK;AAAA,YAAA;YAG9E1D,EAAM,kBAAjBuC,EAEM,OAAA;AAAA;cAFuB,OAAKW,EAAEJ,EAAAA,OAAO,QAAQ;AAAA,YAAA;cACjDG,EAA+B,aAA1B,wBAAoB,EAAA;AAAA,YAAA,iBAE3BM,EAEiBd,EAAAkB,CAAA,GAAA;AAAA;cAFM,MAAK;AAAA,cAAO,SAAK,CAAAf,MAAElC,EAAiBsC,GAAO/C,EAAA,KAAa;AAAA,YAAA;yBAAG,MAElF,CAAA,GAAA0C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,kBAFkF,gBAElF,EAAA;AAAA,cAAA;;;;;QAGO,cAAUI,EACnB,CAME,EAPqB,OAAAC,QAAK;AAAA,UAEpBhD,EAAM,wBAAwBgD,IAAQ3C,EAAA,EAAgB,SAAM,UADpEkD,EAMEK,GAAA;AAAA;YAJC,OAAKV,EAAEJ,EAAAA,OAAO,aAAa;AAAA,YAC3B,QAAQjD,EAAA,MAAM;AAAA,YACd,UAAUmD,MAAU3C,EAAA,EAAgB,SAAM;AAAA,YAC1C,cAAYoD,MAAM5D,QAAM,OAAO4D;AAAA,UAAA;;;;MAO9BzD,EAAM,6BADduD,EA6BgBd,EAAAC,CAAA,GAAA;AAAA;QA3Bb,OAAOtC;AAAA,QACP,gBAAY,CAAGI,MAAUA,EAAM;AAAA,QAC/B,cAAYsC,EAAAA,OAAO;AAAA,QACnB,sBAAoBA,EAAAA,OAAO;AAAA,QAC3B,oBAAkBA,EAAAA,OAAO;AAAA,QAEzB,eAAa,MAAA;AAAA,QAEb,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,QACjB,UAAS;AAAA,QACR,QAAMd;AAAA,QACN,YAAUC;AAAA,MAAA;QAEA,gBAAW,MAAY,CAAA,GAAAU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,YAAZ,gBAAY,EAAA;AAAA,QAAA;QACvB,kBACT,MAEM;AAAA,UAFK5C,EAAA,kBAAXwC,EAEM,OAAA;AAAA;YAFiB,OAAKW,EAAEJ,EAAAA,OAAO,QAAQ;AAAA,UAAA;YAC3CG,EAA+B,aAA1B,wBAAoB,EAAA;AAAA,UAAA,WAE3BY,EAIOC,2CAJP,MAIO;AAAA,YAHLtB,EAEiBC,EAAAkB,CAAA,GAAA;AAAA,cAFD,MAAK;AAAA,cAAO,SAAKhB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAEpB,EAASvB,EAAA,KAAa;AAAA,YAAA;yBAAG,MAE5D,CAAA,GAAA0C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,kBAF4D,gBAE5D,EAAA;AAAA,cAAA;;;;;;;;;;"}