@platforma-sdk/ui-vue 1.63.12 → 1.65.0
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.
- package/.turbo/turbo-build.log +38 -32
- package/.turbo/turbo-formatter$colon$check.log +2 -2
- package/.turbo/turbo-linter$colon$check.log +2 -2
- package/.turbo/turbo-types$colon$check.log +1 -1
- package/CHANGELOG.md +24 -0
- package/dist/components/PlAdvancedFilter/FilterEditor.js.map +1 -1
- package/dist/components/PlAdvancedFilter/FilterEditor.style.js.map +1 -1
- package/dist/components/PlAdvancedFilter/FilterEditor.vue.d.ts +3 -8
- package/dist/components/PlAdvancedFilter/FilterEditor.vue.d.ts.map +1 -1
- package/dist/components/PlAdvancedFilter/FilterEditor.vue2.js +164 -151
- package/dist/components/PlAdvancedFilter/FilterEditor.vue2.js.map +1 -1
- package/dist/components/PlAdvancedFilter/PlAdvancedFilter.js.map +1 -1
- package/dist/components/PlAdvancedFilter/PlAdvancedFilter.style.js +8 -7
- package/dist/components/PlAdvancedFilter/PlAdvancedFilter.style.js.map +1 -1
- package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue.css +1 -1
- package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue.d.ts +24 -8
- package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue.d.ts.map +1 -1
- package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue2.js +176 -110
- package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue2.js.map +1 -1
- package/dist/components/PlAdvancedFilter/types.d.ts +2 -0
- package/dist/components/PlAdvancedFilter/types.d.ts.map +1 -1
- package/dist/components/PlAgDataTable/PlAgDataTableV2.js.map +1 -1
- package/dist/components/PlAgDataTable/PlAgDataTableV2.style.js.map +1 -1
- package/dist/components/PlAgDataTable/PlAgDataTableV2.vue.d.ts.map +1 -1
- package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js +116 -109
- package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js.map +1 -1
- package/dist/components/PlAgDataTable/compositions/useFilterableColumns.js +3 -3
- package/dist/components/PlAgDataTable/compositions/useFilterableColumns.js.map +1 -1
- package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts +6 -5
- package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts.map +1 -1
- package/dist/components/PlAgDataTable/sources/table-source-v2.js +122 -88
- package/dist/components/PlAgDataTable/sources/table-source-v2.js.map +1 -1
- package/dist/components/PlAgDataTable/sources/table-state-v2.d.ts +6 -3
- package/dist/components/PlAgDataTable/sources/table-state-v2.d.ts.map +1 -1
- package/dist/components/PlAgDataTable/sources/table-state-v2.js +182 -97
- package/dist/components/PlAgDataTable/sources/table-state-v2.js.map +1 -1
- package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.js.map +1 -1
- package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.style.js.map +1 -1
- package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue.d.ts.map +1 -1
- package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue2.js +37 -42
- package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue2.js.map +1 -1
- package/dist/components/PlAgGridColumnManager/useFilteredItems.d.ts +5 -5
- package/dist/components/PlAgGridColumnManager/useFilteredItems.d.ts.map +1 -1
- package/dist/components/PlAgGridColumnManager/useFilteredItems.js +2 -2
- package/dist/components/PlAgGridColumnManager/useFilteredItems.js.map +1 -1
- package/dist/components/PlAgGridColumnManager/useGridColumns.js +14 -0
- package/dist/components/PlAgGridColumnManager/useGridColumns.js.map +1 -0
- package/dist/components/PlAnnotations/components/FilterSidebar.js.map +1 -1
- package/dist/components/PlAnnotations/components/FilterSidebar.style.js.map +1 -1
- package/dist/components/PlAnnotations/components/FilterSidebar.vue.d.ts.map +1 -1
- package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js +7 -4
- package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js.map +1 -1
- package/dist/components/PlTableFilters/PlTableFiltersV2.js.map +1 -1
- package/dist/components/PlTableFilters/PlTableFiltersV2.style.js +5 -1
- package/dist/components/PlTableFilters/PlTableFiltersV2.style.js.map +1 -1
- package/dist/components/PlTableFilters/PlTableFiltersV2.vue.css +1 -1
- package/dist/components/PlTableFilters/PlTableFiltersV2.vue.d.ts +7 -9
- package/dist/components/PlTableFilters/PlTableFiltersV2.vue.d.ts.map +1 -1
- package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js +72 -47
- package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/util/helpers/dist/functions.js.map +1 -1
- package/dist/lib/util/helpers/dist/objects.js +4 -1
- package/dist/lib/util/helpers/dist/objects.js.map +1 -1
- package/package.json +8 -7
- package/src/components/PlAdvancedFilter/FilterEditor.vue +99 -55
- package/src/components/PlAdvancedFilter/PlAdvancedFilter.vue +163 -95
- package/src/components/PlAdvancedFilter/types.ts +6 -1
- package/src/components/PlAgDataTable/PlAgDataTableV2.vue +26 -7
- package/src/components/PlAgDataTable/compositions/useFilterableColumns.ts +4 -4
- package/src/components/PlAgDataTable/sources/table-source-v2.ts +231 -131
- package/src/components/PlAgDataTable/sources/table-state-v2.ts +249 -70
- package/src/components/PlAgGridColumnManager/PlAgGridColumnManager.vue +17 -35
- package/src/components/PlAgGridColumnManager/useFilteredItems.ts +9 -11
- package/src/components/PlAgGridColumnManager/useGridColumns.ts +26 -0
- package/src/components/PlAnnotations/components/FilterSidebar.vue +3 -2
- package/src/components/PlTableFilters/PlTableFiltersV2.vue +76 -26
- package/src/index.ts +4 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare function useFilteredItems<T>(props:
|
|
3
|
-
items: T[]
|
|
4
|
-
query: string
|
|
1
|
+
import { Ref } from 'vue';
|
|
2
|
+
export declare function useFilteredItems<T>(props: {
|
|
3
|
+
items: Ref<T[]>;
|
|
4
|
+
query: Ref<string>;
|
|
5
5
|
getStrings: (item: T) => Iterable<string>;
|
|
6
|
-
}
|
|
6
|
+
}): {
|
|
7
7
|
filteredItems: import('vue').ComputedRef<T[]>;
|
|
8
8
|
segments: import('vue').ComputedRef<Map<string, StringSegment[]>>;
|
|
9
9
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFilteredItems.d.ts","sourceRoot":"","sources":["../../../src/components/PlAgGridColumnManager/useFilteredItems.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"useFilteredItems.d.ts","sourceRoot":"","sources":["../../../src/components/PlAgGridColumnManager/useFilteredItems.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAqB,MAAM,KAAK,CAAC;AAE7C,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE;IACzC,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAChB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC3C;;;EAyBA;AA+BD,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC"}
|
|
@@ -3,11 +3,11 @@ import { computed as e, toValue as t } from "vue";
|
|
|
3
3
|
function n(n) {
|
|
4
4
|
let i = e(() => {
|
|
5
5
|
let { items: e, query: i, getStrings: a } = t(n), o = [], s = /* @__PURE__ */ new Map();
|
|
6
|
-
for (let t of e) {
|
|
6
|
+
for (let t of e.value) {
|
|
7
7
|
let e = !1;
|
|
8
8
|
for (let n of a(t)) {
|
|
9
9
|
let a = s.get(n);
|
|
10
|
-
a || (a = r(n, i), s.set(n, a)), !e && (!i || a.some(({ match: e }) => e)) && (o.push(t), e = !0);
|
|
10
|
+
a || (a = r(n, i.value), s.set(n, a)), !e && (!i.value || a.some(({ match: e }) => e)) && (o.push(t), e = !0);
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFilteredItems.js","names":[],"sources":["../../../src/components/PlAgGridColumnManager/useFilteredItems.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"useFilteredItems.js","names":[],"sources":["../../../src/components/PlAgGridColumnManager/useFilteredItems.ts"],"sourcesContent":["import { Ref, computed, toValue } from \"vue\";\n\nexport function useFilteredItems<T>(props: {\n items: Ref<T[]>;\n query: Ref<string>;\n getStrings: (item: T) => Iterable<string>;\n}) {\n const result = computed(() => {\n const { items, query, getStrings } = toValue(props);\n const filteredItems: T[] = [];\n const segments = new Map<string, StringSegment[]>();\n for (const item of items.value) {\n let kept = false;\n for (const string of getStrings(item)) {\n let stringSegments = segments.get(string);\n if (!stringSegments) {\n stringSegments = matchSubstrings(string, query.value);\n segments.set(string, stringSegments);\n }\n if (!kept && (!query.value || stringSegments.some(({ match }) => match))) {\n filteredItems.push(item);\n kept = true;\n }\n }\n }\n return { filteredItems, segments };\n });\n return {\n filteredItems: computed(() => result.value.filteredItems),\n segments: computed(() => result.value.segments),\n };\n}\n\n// Very naïve implementation of substring matching, doesn't handle Unicode well\n// Maybe one day we'll have nice things: https://github.com/tc39/ecma402/issues/506\nfunction matchSubstrings(haystack: string, needle: string): StringSegment[] {\n if (!needle) return [{ value: haystack, match: false }];\n const haystackLower = haystack.toLowerCase();\n const needleLower = needle.toLowerCase();\n const result: StringSegment[] = [];\n let prevEnd = 0;\n while (true) {\n const start = haystackLower.indexOf(needleLower, prevEnd);\n const end = start + needle.length;\n if (start < 0) break;\n if (prevEnd !== start) {\n result.push({ value: haystack.slice(prevEnd, start), match: false });\n }\n const prevSegment = result.at(-1);\n if (prevSegment?.match) {\n prevSegment.value += haystack.slice(start, end);\n } else {\n result.push({ value: haystack.slice(start, end), match: true });\n }\n prevEnd = end;\n }\n if (prevEnd < haystack.length) {\n result.push({ value: haystack.slice(prevEnd), match: false });\n }\n return result;\n}\n\ntype StringSegment = {\n value: string;\n match: boolean;\n};\n"],"mappings":";;AAEA,SAAgB,EAAoB,GAIjC;CACD,IAAM,IAAS,QAAe;EAC5B,IAAM,EAAE,UAAO,UAAO,kBAAe,EAAQ,EAAM,EAC7C,IAAqB,EAAE,EACvB,oBAAW,IAAI,KAA8B;AACnD,OAAK,IAAM,KAAQ,EAAM,OAAO;GAC9B,IAAI,IAAO;AACX,QAAK,IAAM,KAAU,EAAW,EAAK,EAAE;IACrC,IAAI,IAAiB,EAAS,IAAI,EAAO;AAKzC,IAJK,MACH,IAAiB,EAAgB,GAAQ,EAAM,MAAM,EACrD,EAAS,IAAI,GAAQ,EAAe,GAElC,CAAC,MAAS,CAAC,EAAM,SAAS,EAAe,MAAM,EAAE,eAAY,EAAM,MACrE,EAAc,KAAK,EAAK,EACxB,IAAO;;;AAIb,SAAO;GAAE;GAAe;GAAU;GAClC;AACF,QAAO;EACL,eAAe,QAAe,EAAO,MAAM,cAAc;EACzD,UAAU,QAAe,EAAO,MAAM,SAAS;EAChD;;AAKH,SAAS,EAAgB,GAAkB,GAAiC;AAC1E,KAAI,CAAC,EAAQ,QAAO,CAAC;EAAE,OAAO;EAAU,OAAO;EAAO,CAAC;CACvD,IAAM,IAAgB,EAAS,aAAa,EACtC,IAAc,EAAO,aAAa,EAClC,IAA0B,EAAE,EAC9B,IAAU;AACd,UAAa;EACX,IAAM,IAAQ,EAAc,QAAQ,GAAa,EAAQ,EACnD,IAAM,IAAQ,EAAO;AAC3B,MAAI,IAAQ,EAAG;AACf,EAAI,MAAY,KACd,EAAO,KAAK;GAAE,OAAO,EAAS,MAAM,GAAS,EAAM;GAAE,OAAO;GAAO,CAAC;EAEtE,IAAM,IAAc,EAAO,GAAG,GAAG;AAMjC,EALI,GAAa,QACf,EAAY,SAAS,EAAS,MAAM,GAAO,EAAI,GAE/C,EAAO,KAAK;GAAE,OAAO,EAAS,MAAM,GAAO,EAAI;GAAE,OAAO;GAAM,CAAC,EAEjE,IAAU;;AAKZ,QAHI,IAAU,EAAS,UACrB,EAAO,KAAK;EAAE,OAAO,EAAS,MAAM,EAAQ;EAAE,OAAO;EAAO,CAAC,EAExD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ref as e, watch as t } from "vue";
|
|
2
|
+
//#region src/components/PlAgGridColumnManager/useGridColumns.ts
|
|
3
|
+
function n(n) {
|
|
4
|
+
let r = e([]), i = () => {
|
|
5
|
+
r.value = n.api.getAllGridColumns();
|
|
6
|
+
};
|
|
7
|
+
return t(() => n.api, (e, t, n) => {
|
|
8
|
+
e.isDestroyed() || (e.addEventListener("displayedColumnsChanged", i), n(() => e.removeEventListener("displayedColumnsChanged", i)), r.value = e.getAllGridColumns(), r.value.length > 0 && e.moveColumns(r.value, 0));
|
|
9
|
+
}, { immediate: !0 }), r;
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
export { n as useGridColumns };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=useGridColumns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGridColumns.js","names":[],"sources":["../../../src/components/PlAgGridColumnManager/useGridColumns.ts"],"sourcesContent":["import { Column, GridApi } from \"ag-grid-enterprise\";\nimport { ref, watch } from \"vue\";\n\nexport function useGridColumns(props: { api: GridApi }) {\n const columns = ref<Column[]>([]);\n const syncColumns = () => {\n columns.value = props.api.getAllGridColumns();\n };\n watch(\n () => props.api,\n (gridApi, _, onCleanup) => {\n if (gridApi.isDestroyed()) return;\n\n gridApi.addEventListener(\"displayedColumnsChanged\", syncColumns);\n onCleanup(() => gridApi.removeEventListener(\"displayedColumnsChanged\", syncColumns));\n\n columns.value = gridApi.getAllGridColumns();\n if (columns.value.length > 0) {\n gridApi.moveColumns(columns.value, 0);\n }\n },\n { immediate: true },\n );\n\n return columns;\n}\n"],"mappings":";;AAGA,SAAgB,EAAe,GAAyB;CACtD,IAAM,IAAU,EAAc,EAAE,CAAC,EAC3B,UAAoB;AACxB,IAAQ,QAAQ,EAAM,IAAI,mBAAmB;;AAkB/C,QAhBA,QACQ,EAAM,MACX,GAAS,GAAG,MAAc;AACrB,IAAQ,aAAa,KAEzB,EAAQ,iBAAiB,2BAA2B,EAAY,EAChE,QAAgB,EAAQ,oBAAoB,2BAA2B,EAAY,CAAC,EAEpF,EAAQ,QAAQ,EAAQ,mBAAmB,EACvC,EAAQ,MAAM,SAAS,KACzB,EAAQ,YAAY,EAAQ,OAAO,EAAE;IAGzC,EAAE,WAAW,IAAM,CACpB,EAEM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterSidebar.js","names":[],"sources":["../../../../src/components/PlAnnotations/components/FilterSidebar.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type Props = {\n columns: PlAdvancedFilterItem[];\n\n getSuggestOptions: (params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchStr: string;\n searchType: \"value\" | \"label\";\n }) => ListOptionBase<string | number>[] | Promise<ListOptionBase<string | number>[]>;\n\n hasSelectedColumns?: boolean;\n getValuesForSelectedColumns?: () => Promise<\n undefined | { columnId: PObjectId; values: string[] }\n >;\n};\n</script>\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { randomInt } from \"@milaboratories/helpers\";\nimport { PlBtnSecondary, PlEditableTitle, PlSidebarItem } from \"@milaboratories/uikit\";\nimport type { ListOptionBase, PObjectId, SUniversalPColumnId } from \"@platforma-sdk/model\";\n\nimport { PlAdvancedFilterComponent } from \"../../PlAdvancedFilter\";\nimport type {\n PlAdvancedFilterItem,\n PlAdvancedFilterColumnId,\n PlAdvancedFilterSupportedFilters,\n PlAdvancedFilter,\n} from \"../../PlAdvancedFilter\";\nimport type { Filter } from \"../types\";\n\nimport $commonStyle from \"./style.module.css\";\nimport { validateTitle } from \"../utils\";\n\n// Models\nconst step = defineModel<Filter>(\"step\", { required: true });\n// Props\nconst props = defineProps<Props>();\n// State\nconst withSelection = computed(() => {\n return props.hasSelectedColumns !== undefined && props.getValuesForSelectedColumns !== undefined;\n});\n// Actions\nconst addFilterPlaceholder = () => {\n step.value.filter.filters.push({\n id: randomInt(),\n isExpanded: true,\n type: \"or\",\n filters: [\n {\n id: randomInt(),\n type: \"isNA\",\n column: props.columns[0].id as SUniversalPColumnId,\n },\n ],\n });\n};\n\nasync function addFilterFromSelected() {\n if (props.hasSelectedColumns === undefined || props.getValuesForSelectedColumns === undefined)\n return;\n\n const data = await props.getValuesForSelectedColumns();\n if (!data || data.values.length === 0) return;\n\n const { columnId, values } = data;\n const shortReminder =\n values.slice(0, 3).join(\", \") + (values.length > 3 ? ` and ${values.length - 3} more` : \"\");\n\n step.value.filter.filters.push({\n id: randomInt(),\n name: `Selected list (${shortReminder})`,\n isExpanded: false,\n type: \"or\",\n filters: values.map((value, i) => ({\n id: i,\n type: \"patternEquals\",\n column: columnId as SUniversalPColumnId,\n value,\n })),\n });\n}\n\nconst supportedFilters = [\n \"isNA\",\n \"isNotNA\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"patternEquals\",\n \"patternNotEquals\",\n \"patternContainSubsequence\",\n \"patternNotContainSubsequence\",\n \"equal\",\n \"notEqual\",\n \"topN\",\n \"bottomN\",\n] as (typeof PlAdvancedFilterSupportedFilters)[number][];\n</script>\n\n<template>\n <PlSidebarItem v-if=\"step\">\n <template #header-content>\n <PlEditableTitle\n :key=\"step.id\"\n v-model=\"step.label\"\n :class=\"{ [$commonStyle.flashing]: step.label.length === 0 }\"\n :max-length=\"40\"\n max-width=\"600px\"\n placeholder=\"Label\"\n :autofocus=\"step.label.length === 0\"\n :validate=\"validateTitle\"\n />\n </template>\n <template #body-content>\n <PlAdvancedFilterComponent\n
|
|
1
|
+
{"version":3,"file":"FilterSidebar.js","names":[],"sources":["../../../../src/components/PlAnnotations/components/FilterSidebar.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type Props = {\n columns: PlAdvancedFilterItem[];\n\n getSuggestOptions: (params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchStr: string;\n searchType: \"value\" | \"label\";\n }) => ListOptionBase<string | number>[] | Promise<ListOptionBase<string | number>[]>;\n\n hasSelectedColumns?: boolean;\n getValuesForSelectedColumns?: () => Promise<\n undefined | { columnId: PObjectId; values: string[] }\n >;\n};\n</script>\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { randomInt } from \"@milaboratories/helpers\";\nimport { PlBtnSecondary, PlEditableTitle, PlSidebarItem } from \"@milaboratories/uikit\";\nimport type { ListOptionBase, PObjectId, SUniversalPColumnId } from \"@platforma-sdk/model\";\n\nimport { PlAdvancedFilterComponent } from \"../../PlAdvancedFilter\";\nimport type {\n PlAdvancedFilterItem,\n PlAdvancedFilterColumnId,\n PlAdvancedFilterSupportedFilters,\n PlAdvancedFilter,\n} from \"../../PlAdvancedFilter\";\nimport type { Filter } from \"../types\";\n\nimport $commonStyle from \"./style.module.css\";\nimport { validateTitle } from \"../utils\";\n\n// Models\nconst step = defineModel<Filter>(\"step\", { required: true });\n// Props\nconst props = defineProps<Props>();\n// State\nconst withSelection = computed(() => {\n return props.hasSelectedColumns !== undefined && props.getValuesForSelectedColumns !== undefined;\n});\n// Actions\nconst addFilterPlaceholder = () => {\n step.value.filter.filters.push({\n id: randomInt(),\n isExpanded: true,\n type: \"or\",\n filters: [\n {\n id: randomInt(),\n type: \"isNA\",\n column: props.columns[0].id as SUniversalPColumnId,\n },\n ],\n });\n};\n\nasync function addFilterFromSelected() {\n if (props.hasSelectedColumns === undefined || props.getValuesForSelectedColumns === undefined)\n return;\n\n const data = await props.getValuesForSelectedColumns();\n if (!data || data.values.length === 0) return;\n\n const { columnId, values } = data;\n const shortReminder =\n values.slice(0, 3).join(\", \") + (values.length > 3 ? ` and ${values.length - 3} more` : \"\");\n\n step.value.filter.filters.push({\n id: randomInt(),\n name: `Selected list (${shortReminder})`,\n isExpanded: false,\n type: \"or\",\n filters: values.map((value, i) => ({\n id: i,\n type: \"patternEquals\",\n column: columnId as SUniversalPColumnId,\n value,\n })),\n });\n}\n\nconst supportedFilters = [\n \"isNA\",\n \"isNotNA\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"patternEquals\",\n \"patternNotEquals\",\n \"patternContainSubsequence\",\n \"patternNotContainSubsequence\",\n \"equal\",\n \"notEqual\",\n \"topN\",\n \"bottomN\",\n] as (typeof PlAdvancedFilterSupportedFilters)[number][];\n</script>\n\n<template>\n <PlSidebarItem v-if=\"step\">\n <template #header-content>\n <PlEditableTitle\n :key=\"step.id\"\n v-model=\"step.label\"\n :class=\"{ [$commonStyle.flashing]: step.label.length === 0 }\"\n :max-length=\"40\"\n max-width=\"600px\"\n placeholder=\"Label\"\n :autofocus=\"step.label.length === 0\"\n :validate=\"validateTitle\"\n />\n </template>\n <template #body-content>\n <PlAdvancedFilterComponent\n :filters=\"step.filter as PlAdvancedFilter\"\n :class=\"[$style.root, { [$commonStyle.disabled]: step.label.length === 0 }]\"\n :options=\"props.columns\"\n :supported-filters=\"supportedFilters\"\n :get-suggest-options=\"props.getSuggestOptions\"\n :enable-dnd=\"false\"\n :enable-add-group-button=\"true\"\n @update-filters=\"(v) => (step = { ...step, filter: v as typeof step.filter })\"\n >\n <template #add-group-buttons>\n <div :class=\"$style.actions\">\n <PlBtnSecondary icon=\"add\" @click=\"addFilterPlaceholder\"> Add Filter </PlBtnSecondary>\n <PlBtnSecondary\n v-if=\"withSelection\"\n icon=\"add\"\n :disabled=\"!props.hasSelectedColumns\"\n @click=\"addFilterFromSelected\"\n >\n From selection\n </PlBtnSecondary>\n </div>\n </template>\n </PlAdvancedFilterComponent>\n </template>\n </PlSidebarItem>\n</template>\n\n<style module>\n.root {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.actions {\n display: flex;\n flex-direction: row;\n gap: 12px;\n}\n</style>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterSidebar.vue_vue_type_style_index_0_lang.module.js","names":[],"sources":["../../../../src/components/PlAnnotations/components/FilterSidebar.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type Props = {\n columns: PlAdvancedFilterItem[];\n\n getSuggestOptions: (params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchStr: string;\n searchType: \"value\" | \"label\";\n }) => ListOptionBase<string | number>[] | Promise<ListOptionBase<string | number>[]>;\n\n hasSelectedColumns?: boolean;\n getValuesForSelectedColumns?: () => Promise<\n undefined | { columnId: PObjectId; values: string[] }\n >;\n};\n</script>\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { randomInt } from \"@milaboratories/helpers\";\nimport { PlBtnSecondary, PlEditableTitle, PlSidebarItem } from \"@milaboratories/uikit\";\nimport type { ListOptionBase, PObjectId, SUniversalPColumnId } from \"@platforma-sdk/model\";\n\nimport { PlAdvancedFilterComponent } from \"../../PlAdvancedFilter\";\nimport type {\n PlAdvancedFilterItem,\n PlAdvancedFilterColumnId,\n PlAdvancedFilterSupportedFilters,\n PlAdvancedFilter,\n} from \"../../PlAdvancedFilter\";\nimport type { Filter } from \"../types\";\n\nimport $commonStyle from \"./style.module.css\";\nimport { validateTitle } from \"../utils\";\n\n// Models\nconst step = defineModel<Filter>(\"step\", { required: true });\n// Props\nconst props = defineProps<Props>();\n// State\nconst withSelection = computed(() => {\n return props.hasSelectedColumns !== undefined && props.getValuesForSelectedColumns !== undefined;\n});\n// Actions\nconst addFilterPlaceholder = () => {\n step.value.filter.filters.push({\n id: randomInt(),\n isExpanded: true,\n type: \"or\",\n filters: [\n {\n id: randomInt(),\n type: \"isNA\",\n column: props.columns[0].id as SUniversalPColumnId,\n },\n ],\n });\n};\n\nasync function addFilterFromSelected() {\n if (props.hasSelectedColumns === undefined || props.getValuesForSelectedColumns === undefined)\n return;\n\n const data = await props.getValuesForSelectedColumns();\n if (!data || data.values.length === 0) return;\n\n const { columnId, values } = data;\n const shortReminder =\n values.slice(0, 3).join(\", \") + (values.length > 3 ? ` and ${values.length - 3} more` : \"\");\n\n step.value.filter.filters.push({\n id: randomInt(),\n name: `Selected list (${shortReminder})`,\n isExpanded: false,\n type: \"or\",\n filters: values.map((value, i) => ({\n id: i,\n type: \"patternEquals\",\n column: columnId as SUniversalPColumnId,\n value,\n })),\n });\n}\n\nconst supportedFilters = [\n \"isNA\",\n \"isNotNA\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"patternEquals\",\n \"patternNotEquals\",\n \"patternContainSubsequence\",\n \"patternNotContainSubsequence\",\n \"equal\",\n \"notEqual\",\n \"topN\",\n \"bottomN\",\n] as (typeof PlAdvancedFilterSupportedFilters)[number][];\n</script>\n\n<template>\n <PlSidebarItem v-if=\"step\">\n <template #header-content>\n <PlEditableTitle\n :key=\"step.id\"\n v-model=\"step.label\"\n :class=\"{ [$commonStyle.flashing]: step.label.length === 0 }\"\n :max-length=\"40\"\n max-width=\"600px\"\n placeholder=\"Label\"\n :autofocus=\"step.label.length === 0\"\n :validate=\"validateTitle\"\n />\n </template>\n <template #body-content>\n <PlAdvancedFilterComponent\n
|
|
1
|
+
{"version":3,"file":"FilterSidebar.vue_vue_type_style_index_0_lang.module.js","names":[],"sources":["../../../../src/components/PlAnnotations/components/FilterSidebar.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type Props = {\n columns: PlAdvancedFilterItem[];\n\n getSuggestOptions: (params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchStr: string;\n searchType: \"value\" | \"label\";\n }) => ListOptionBase<string | number>[] | Promise<ListOptionBase<string | number>[]>;\n\n hasSelectedColumns?: boolean;\n getValuesForSelectedColumns?: () => Promise<\n undefined | { columnId: PObjectId; values: string[] }\n >;\n};\n</script>\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { randomInt } from \"@milaboratories/helpers\";\nimport { PlBtnSecondary, PlEditableTitle, PlSidebarItem } from \"@milaboratories/uikit\";\nimport type { ListOptionBase, PObjectId, SUniversalPColumnId } from \"@platforma-sdk/model\";\n\nimport { PlAdvancedFilterComponent } from \"../../PlAdvancedFilter\";\nimport type {\n PlAdvancedFilterItem,\n PlAdvancedFilterColumnId,\n PlAdvancedFilterSupportedFilters,\n PlAdvancedFilter,\n} from \"../../PlAdvancedFilter\";\nimport type { Filter } from \"../types\";\n\nimport $commonStyle from \"./style.module.css\";\nimport { validateTitle } from \"../utils\";\n\n// Models\nconst step = defineModel<Filter>(\"step\", { required: true });\n// Props\nconst props = defineProps<Props>();\n// State\nconst withSelection = computed(() => {\n return props.hasSelectedColumns !== undefined && props.getValuesForSelectedColumns !== undefined;\n});\n// Actions\nconst addFilterPlaceholder = () => {\n step.value.filter.filters.push({\n id: randomInt(),\n isExpanded: true,\n type: \"or\",\n filters: [\n {\n id: randomInt(),\n type: \"isNA\",\n column: props.columns[0].id as SUniversalPColumnId,\n },\n ],\n });\n};\n\nasync function addFilterFromSelected() {\n if (props.hasSelectedColumns === undefined || props.getValuesForSelectedColumns === undefined)\n return;\n\n const data = await props.getValuesForSelectedColumns();\n if (!data || data.values.length === 0) return;\n\n const { columnId, values } = data;\n const shortReminder =\n values.slice(0, 3).join(\", \") + (values.length > 3 ? ` and ${values.length - 3} more` : \"\");\n\n step.value.filter.filters.push({\n id: randomInt(),\n name: `Selected list (${shortReminder})`,\n isExpanded: false,\n type: \"or\",\n filters: values.map((value, i) => ({\n id: i,\n type: \"patternEquals\",\n column: columnId as SUniversalPColumnId,\n value,\n })),\n });\n}\n\nconst supportedFilters = [\n \"isNA\",\n \"isNotNA\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"patternEquals\",\n \"patternNotEquals\",\n \"patternContainSubsequence\",\n \"patternNotContainSubsequence\",\n \"equal\",\n \"notEqual\",\n \"topN\",\n \"bottomN\",\n] as (typeof PlAdvancedFilterSupportedFilters)[number][];\n</script>\n\n<template>\n <PlSidebarItem v-if=\"step\">\n <template #header-content>\n <PlEditableTitle\n :key=\"step.id\"\n v-model=\"step.label\"\n :class=\"{ [$commonStyle.flashing]: step.label.length === 0 }\"\n :max-length=\"40\"\n max-width=\"600px\"\n placeholder=\"Label\"\n :autofocus=\"step.label.length === 0\"\n :validate=\"validateTitle\"\n />\n </template>\n <template #body-content>\n <PlAdvancedFilterComponent\n :filters=\"step.filter as PlAdvancedFilter\"\n :class=\"[$style.root, { [$commonStyle.disabled]: step.label.length === 0 }]\"\n :options=\"props.columns\"\n :supported-filters=\"supportedFilters\"\n :get-suggest-options=\"props.getSuggestOptions\"\n :enable-dnd=\"false\"\n :enable-add-group-button=\"true\"\n @update-filters=\"(v) => (step = { ...step, filter: v as typeof step.filter })\"\n >\n <template #add-group-buttons>\n <div :class=\"$style.actions\">\n <PlBtnSecondary icon=\"add\" @click=\"addFilterPlaceholder\"> Add Filter </PlBtnSecondary>\n <PlBtnSecondary\n v-if=\"withSelection\"\n icon=\"add\"\n :disabled=\"!props.hasSelectedColumns\"\n @click=\"addFilterFromSelected\"\n >\n From selection\n </PlBtnSecondary>\n </div>\n </template>\n </PlAdvancedFilterComponent>\n </template>\n </PlSidebarItem>\n</template>\n\n<style module>\n.root {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.actions {\n display: flex;\n flex-direction: row;\n gap: 12px;\n}\n</style>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterSidebar.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/PlAnnotations/components/FilterSidebar.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FilterSidebar.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/PlAnnotations/components/FilterSidebar.vue"],"names":[],"mappings":"AAmKA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAuB,MAAM,sBAAsB,CAAC;AAG3F,OAAO,KAAK,EACV,oBAAoB,EACpB,wBAAwB,EAGzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAMvC,MAAM,MAAM,KAAK,GAAG;IAClB,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAEhC,iBAAiB,EAAE,CAAC,MAAM,EAAE;QAC1B,QAAQ,EAAE,wBAAwB,CAAC;QACnC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC;KAC/B,KAAK,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAErF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,2BAA2B,CAAC,EAAE,MAAM,OAAO,CACzC,SAAS,GAAG;QAAE,QAAQ,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CACtD,CAAC;CACH,CAAC;;UA0EM,MAAM;;;;UAAN,MAAM;;;;AAxEd,wBA8PK"}
|
|
@@ -85,13 +85,16 @@ var b = /* @__PURE__ */ u({
|
|
|
85
85
|
]))]),
|
|
86
86
|
"body-content": g(() => [l(m(t), {
|
|
87
87
|
filters: d.value.filter,
|
|
88
|
-
"onUpdate:filters": i[1] ||= (e) => d.value.filter = e,
|
|
89
88
|
class: f([e.$style.root, { [m(n).disabled]: d.value.label.length === 0 }]),
|
|
90
|
-
|
|
89
|
+
options: b.columns,
|
|
91
90
|
"supported-filters": w,
|
|
92
91
|
"get-suggest-options": b.getSuggestOptions,
|
|
93
92
|
"enable-dnd": !1,
|
|
94
|
-
"enable-add-group-button": !0
|
|
93
|
+
"enable-add-group-button": !0,
|
|
94
|
+
onUpdateFilters: i[1] ||= (e) => d.value = {
|
|
95
|
+
...d.value,
|
|
96
|
+
filter: e
|
|
97
|
+
}
|
|
95
98
|
}, {
|
|
96
99
|
"add-group-buttons": g(() => [s("div", { class: f(e.$style.actions) }, [l(m(_), {
|
|
97
100
|
icon: "add",
|
|
@@ -112,7 +115,7 @@ var b = /* @__PURE__ */ u({
|
|
|
112
115
|
}, 8, [
|
|
113
116
|
"filters",
|
|
114
117
|
"class",
|
|
115
|
-
"
|
|
118
|
+
"options",
|
|
116
119
|
"get-suggest-options"
|
|
117
120
|
])]),
|
|
118
121
|
_: 1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterSidebar.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../../src/components/PlAnnotations/components/FilterSidebar.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type Props = {\n columns: PlAdvancedFilterItem[];\n\n getSuggestOptions: (params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchStr: string;\n searchType: \"value\" | \"label\";\n }) => ListOptionBase<string | number>[] | Promise<ListOptionBase<string | number>[]>;\n\n hasSelectedColumns?: boolean;\n getValuesForSelectedColumns?: () => Promise<\n undefined | { columnId: PObjectId; values: string[] }\n >;\n};\n</script>\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { randomInt } from \"@milaboratories/helpers\";\nimport { PlBtnSecondary, PlEditableTitle, PlSidebarItem } from \"@milaboratories/uikit\";\nimport type { ListOptionBase, PObjectId, SUniversalPColumnId } from \"@platforma-sdk/model\";\n\nimport { PlAdvancedFilterComponent } from \"../../PlAdvancedFilter\";\nimport type {\n PlAdvancedFilterItem,\n PlAdvancedFilterColumnId,\n PlAdvancedFilterSupportedFilters,\n PlAdvancedFilter,\n} from \"../../PlAdvancedFilter\";\nimport type { Filter } from \"../types\";\n\nimport $commonStyle from \"./style.module.css\";\nimport { validateTitle } from \"../utils\";\n\n// Models\nconst step = defineModel<Filter>(\"step\", { required: true });\n// Props\nconst props = defineProps<Props>();\n// State\nconst withSelection = computed(() => {\n return props.hasSelectedColumns !== undefined && props.getValuesForSelectedColumns !== undefined;\n});\n// Actions\nconst addFilterPlaceholder = () => {\n step.value.filter.filters.push({\n id: randomInt(),\n isExpanded: true,\n type: \"or\",\n filters: [\n {\n id: randomInt(),\n type: \"isNA\",\n column: props.columns[0].id as SUniversalPColumnId,\n },\n ],\n });\n};\n\nasync function addFilterFromSelected() {\n if (props.hasSelectedColumns === undefined || props.getValuesForSelectedColumns === undefined)\n return;\n\n const data = await props.getValuesForSelectedColumns();\n if (!data || data.values.length === 0) return;\n\n const { columnId, values } = data;\n const shortReminder =\n values.slice(0, 3).join(\", \") + (values.length > 3 ? ` and ${values.length - 3} more` : \"\");\n\n step.value.filter.filters.push({\n id: randomInt(),\n name: `Selected list (${shortReminder})`,\n isExpanded: false,\n type: \"or\",\n filters: values.map((value, i) => ({\n id: i,\n type: \"patternEquals\",\n column: columnId as SUniversalPColumnId,\n value,\n })),\n });\n}\n\nconst supportedFilters = [\n \"isNA\",\n \"isNotNA\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"patternEquals\",\n \"patternNotEquals\",\n \"patternContainSubsequence\",\n \"patternNotContainSubsequence\",\n \"equal\",\n \"notEqual\",\n \"topN\",\n \"bottomN\",\n] as (typeof PlAdvancedFilterSupportedFilters)[number][];\n</script>\n\n<template>\n <PlSidebarItem v-if=\"step\">\n <template #header-content>\n <PlEditableTitle\n :key=\"step.id\"\n v-model=\"step.label\"\n :class=\"{ [$commonStyle.flashing]: step.label.length === 0 }\"\n :max-length=\"40\"\n max-width=\"600px\"\n placeholder=\"Label\"\n :autofocus=\"step.label.length === 0\"\n :validate=\"validateTitle\"\n />\n </template>\n <template #body-content>\n <PlAdvancedFilterComponent\n
|
|
1
|
+
{"version":3,"file":"FilterSidebar.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../../src/components/PlAnnotations/components/FilterSidebar.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type Props = {\n columns: PlAdvancedFilterItem[];\n\n getSuggestOptions: (params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchStr: string;\n searchType: \"value\" | \"label\";\n }) => ListOptionBase<string | number>[] | Promise<ListOptionBase<string | number>[]>;\n\n hasSelectedColumns?: boolean;\n getValuesForSelectedColumns?: () => Promise<\n undefined | { columnId: PObjectId; values: string[] }\n >;\n};\n</script>\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { randomInt } from \"@milaboratories/helpers\";\nimport { PlBtnSecondary, PlEditableTitle, PlSidebarItem } from \"@milaboratories/uikit\";\nimport type { ListOptionBase, PObjectId, SUniversalPColumnId } from \"@platforma-sdk/model\";\n\nimport { PlAdvancedFilterComponent } from \"../../PlAdvancedFilter\";\nimport type {\n PlAdvancedFilterItem,\n PlAdvancedFilterColumnId,\n PlAdvancedFilterSupportedFilters,\n PlAdvancedFilter,\n} from \"../../PlAdvancedFilter\";\nimport type { Filter } from \"../types\";\n\nimport $commonStyle from \"./style.module.css\";\nimport { validateTitle } from \"../utils\";\n\n// Models\nconst step = defineModel<Filter>(\"step\", { required: true });\n// Props\nconst props = defineProps<Props>();\n// State\nconst withSelection = computed(() => {\n return props.hasSelectedColumns !== undefined && props.getValuesForSelectedColumns !== undefined;\n});\n// Actions\nconst addFilterPlaceholder = () => {\n step.value.filter.filters.push({\n id: randomInt(),\n isExpanded: true,\n type: \"or\",\n filters: [\n {\n id: randomInt(),\n type: \"isNA\",\n column: props.columns[0].id as SUniversalPColumnId,\n },\n ],\n });\n};\n\nasync function addFilterFromSelected() {\n if (props.hasSelectedColumns === undefined || props.getValuesForSelectedColumns === undefined)\n return;\n\n const data = await props.getValuesForSelectedColumns();\n if (!data || data.values.length === 0) return;\n\n const { columnId, values } = data;\n const shortReminder =\n values.slice(0, 3).join(\", \") + (values.length > 3 ? ` and ${values.length - 3} more` : \"\");\n\n step.value.filter.filters.push({\n id: randomInt(),\n name: `Selected list (${shortReminder})`,\n isExpanded: false,\n type: \"or\",\n filters: values.map((value, i) => ({\n id: i,\n type: \"patternEquals\",\n column: columnId as SUniversalPColumnId,\n value,\n })),\n });\n}\n\nconst supportedFilters = [\n \"isNA\",\n \"isNotNA\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"patternEquals\",\n \"patternNotEquals\",\n \"patternContainSubsequence\",\n \"patternNotContainSubsequence\",\n \"equal\",\n \"notEqual\",\n \"topN\",\n \"bottomN\",\n] as (typeof PlAdvancedFilterSupportedFilters)[number][];\n</script>\n\n<template>\n <PlSidebarItem v-if=\"step\">\n <template #header-content>\n <PlEditableTitle\n :key=\"step.id\"\n v-model=\"step.label\"\n :class=\"{ [$commonStyle.flashing]: step.label.length === 0 }\"\n :max-length=\"40\"\n max-width=\"600px\"\n placeholder=\"Label\"\n :autofocus=\"step.label.length === 0\"\n :validate=\"validateTitle\"\n />\n </template>\n <template #body-content>\n <PlAdvancedFilterComponent\n :filters=\"step.filter as PlAdvancedFilter\"\n :class=\"[$style.root, { [$commonStyle.disabled]: step.label.length === 0 }]\"\n :options=\"props.columns\"\n :supported-filters=\"supportedFilters\"\n :get-suggest-options=\"props.getSuggestOptions\"\n :enable-dnd=\"false\"\n :enable-add-group-button=\"true\"\n @update-filters=\"(v) => (step = { ...step, filter: v as typeof step.filter })\"\n >\n <template #add-group-buttons>\n <div :class=\"$style.actions\">\n <PlBtnSecondary icon=\"add\" @click=\"addFilterPlaceholder\"> Add Filter </PlBtnSecondary>\n <PlBtnSecondary\n v-if=\"withSelection\"\n icon=\"add\"\n :disabled=\"!props.hasSelectedColumns\"\n @click=\"addFilterFromSelected\"\n >\n From selection\n </PlBtnSecondary>\n </div>\n </template>\n </PlAdvancedFilterComponent>\n </template>\n </PlSidebarItem>\n</template>\n\n<style module>\n.root {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.actions {\n display: flex;\n flex-direction: row;\n gap: 12px;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAoCA,IAAM,IAAO,EAAmB,GAAC,OAA2B,EAEtD,IAAQ,GAER,IAAgB,QACb,EAAM,uBAAuB,KAAA,KAAa,EAAM,gCAAgC,KAAA,EACvF,EAEI,UAA6B;AACjC,KAAK,MAAM,OAAO,QAAQ,KAAK;IAC7B,IAAI,GAAW;IACf,YAAY;IACZ,MAAM;IACN,SAAS,CACP;KACE,IAAI,GAAW;KACf,MAAM;KACN,QAAQ,EAAM,QAAQ,GAAG;KAC1B,CACF;IACF,CAAC;;EAGJ,eAAe,IAAwB;AACrC,OAAI,EAAM,uBAAuB,KAAA,KAAa,EAAM,gCAAgC,KAAA,EAClF;GAEF,IAAM,IAAO,MAAM,EAAM,6BAA6B;AACtD,OAAI,CAAC,KAAQ,EAAK,OAAO,WAAW,EAAG;GAEvC,IAAM,EAAE,aAAU,cAAW,GACvB,IACJ,EAAO,MAAM,GAAG,EAAE,CAAC,KAAK,KAAK,IAAI,EAAO,SAAS,IAAI,QAAQ,EAAO,SAAS,EAAE,SAAS;AAE1F,KAAK,MAAM,OAAO,QAAQ,KAAK;IAC7B,IAAI,GAAW;IACf,MAAM,kBAAkB,EAAc;IACtC,YAAY;IACZ,MAAM;IACN,SAAS,EAAO,KAAK,GAAO,OAAO;KACjC,IAAI;KACJ,MAAM;KACN,QAAQ;KACR;KACD,EAAE;IACJ,CAAC;;EAGJ,IAAM,IAAmB;GACvB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;mBAIsB,EAAA,SAAA,GAAA,EAArB,EAuCgB,EAAA,EAAA,EAAA,EAAA,KAAA,GAAA,EAAA;GAtCH,kBAAc,QAUrB,EAAA,GAAA,EATF,EASE,EAAA,EAAA,EAAA;IARC,KAAK,EAAA,MAAK;gBACF,EAAA,MAAK;6CAAL,MAAK,QAAK;IAClB,OAAK,EAAA,GAAK,EAAA,EAAY,CAAC,WAAW,EAAA,MAAK,MAAM,WAAM,GAAA,CAAA;IACnD,cAAY;IACb,aAAU;IACV,aAAY;IACX,WAAW,EAAA,MAAK,MAAM,WAAM;IAC5B,UAAU,EAAA,EAAa;;;;;;;GAGjB,gBAAY,QAwBO,CAvB5B,EAuB4B,EAAA,EAAA,EAAA;IAtBzB,SAAS,EAAA,MAAK;IACd,OAAK,EAAA,CAAGA,EAAAA,OAAO,MAAI,GAAK,EAAA,EAAY,CAAC,WAAW,EAAA,MAAK,MAAM,WAAM,GAAA,CAAA,CAAA;IACjE,SAAS,EAAM;IACf,qBAAmB;IACnB,uBAAqB,EAAM;IAC3B,cAAY;IACZ,2BAAyB;IACzB,iBAAc,AAAA,EAAA,QAAG,MAAO,EAAA,QAAI;KAAA,GAAQ,EAAA;KAAI,QAAU;KAAC;;IAEzC,qBAAiB,QAWpB,CAVN,EAUM,OAAA,EAVA,OAAK,EAAEA,EAAAA,OAAO,QAAO,EAAA,EAAA,CACzB,EAAsF,EAAA,EAAA,EAAA;KAAtE,MAAK;KAAO,SAAO;;sBAAkC,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAZ,gBAAY,GAAA,CAAA,CAAA,CAAA;;QAE7D,EAAA,SAAA,GAAA,EADR,EAOiB,EAAA,EAAA,EAAA;;KALf,MAAK;KACJ,UAAQ,CAAG,EAAM;KACjB,SAAO;;sBAGV,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAFC,oBAED,GAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlTableFiltersV2.js","names":[],"sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type {\n PTableColumnSpec,\n PlDataTableFiltersWithMeta,\n PFrameHandle,\n PTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\n Annotation,\n Domain,\n readAnnotation,\n readDomain,\n
|
|
1
|
+
{"version":3,"file":"PlTableFiltersV2.js","names":[],"sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type {\n PTableColumnSpec,\n PlDataTableFiltersWithMeta,\n PFrameHandle,\n PTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\n Annotation,\n Domain,\n readAnnotation,\n readDomain,\n getUniqueSourceValuesWithLabels,\n parseJson,\n getPTableColumnId,\n} from \"@platforma-sdk/model\";\nimport { computed, ref } from \"vue\";\nimport { PlBtnGhost, PlSlideModal, usePlBlockPageTitleTeleportTarget } from \"@milaboratories/uikit\";\nimport {\n PlAdvancedFilter,\n PlAdvancedFilterComponent,\n PlAdvancedFilterSupportedFilters,\n type PlAdvancedFilterItem,\n} from \"../PlAdvancedFilter\";\nimport type { PlAdvancedFilterColumnId } from \"../PlAdvancedFilter/types\";\nimport type { Nil } from \"@milaboratories/helpers\";\nimport { isFunction, isNil } from \"es-toolkit\";\n\nconst props = defineProps<{\n columns: PTableColumnSpec[];\n pframeHandle: Nil | PFrameHandle;\n filters: PlDataTableFiltersWithMeta;\n defaultFilters: Nil | PlDataTableFiltersWithMeta;\n onUpdateFilters: (value: PlDataTableFiltersWithMeta) => void;\n onResetDefaultFilters?: () => void;\n onUpdateDefaultFilters?: (value: PlDataTableFiltersWithMeta) => void;\n}>();\n\nconst teleportTarget = usePlBlockPageTitleTeleportTarget(\"PlTableFiltersV2\");\nconst showManager = ref(false);\nconst hasFilters = computed(() => props.filters.filters.length > 0);\nconst hasDefaultFilters = computed(\n () => !isNil(props.defaultFilters) && props.defaultFilters.filters.length > 0,\n);\nconst filters = computed<PlDataTableFiltersWithMeta>(() => {\n if (isNil(props.defaultFilters) || props.defaultFilters?.filters.length === 0) {\n return props.filters;\n }\n\n return {\n ...props.filters,\n filters: [...(props.defaultFilters?.filters ?? []), ...props.filters.filters],\n };\n});\nconst onUpdateFilters = (_value: PlAdvancedFilter) => {\n const value = _value as PlDataTableFiltersWithMeta;\n\n if (isNil(props.defaultFilters)) {\n return props.onUpdateFilters(value);\n }\n\n const [defaults, ...rest] = value.filters;\n props.onUpdateFilters({ ...value, filters: rest });\n props.onUpdateDefaultFilters?.({ ...props.defaultFilters, filters: [defaults] });\n};\n\nconst options = computed<PlAdvancedFilterItem[]>(() => {\n return props.columns.map((col, idx) => {\n const id = makeFilterColumnId(col);\n const label =\n readAnnotation(col.spec, Annotation.Label)?.trim() ?? `Unlabeled ${col.type} ${idx}`;\n const alphabet =\n readDomain(col.spec, Domain.Alphabet) ?? readAnnotation(col.spec, Annotation.Alphabet);\n return {\n id,\n label,\n spec: col.spec,\n alphabet: alphabet ?? undefined,\n };\n });\n});\n\n// Supported filters (same set as FilterSidebar)\nconst supportedFilters = [\n \"isNA\",\n \"isNotNA\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"patternEquals\",\n \"patternNotEquals\",\n \"patternContainSubsequence\",\n \"patternNotContainSubsequence\",\n \"patternMatchesRegularExpression\",\n \"patternFuzzyContainSubsequence\",\n \"equal\",\n \"notEqual\",\n] as (typeof PlAdvancedFilterSupportedFilters)[number][];\n\n// getSuggestOptions - provide discrete values from column annotations\nfunction handleSuggestOptions(params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchStr: string;\n searchType: \"value\" | \"label\";\n}) {\n if (isNil(props.pframeHandle)) {\n console.warn(\"PFrame handle is not available, cannot fetch suggest options\");\n return [];\n }\n\n const strId = params.columnId as CanonicalizedJson<PTableColumnId>;\n const tableColumnId = parseJson<PTableColumnId>(strId);\n\n if (tableColumnId.type !== \"column\") {\n throw new Error(\"ColumnId should be of type 'column' for suggest options\");\n }\n\n return getUniqueSourceValuesWithLabels(props.pframeHandle, {\n columnId: tableColumnId.id,\n axisIdx: params.axisIdx,\n limit: 100,\n searchQuery: params.searchType === \"label\" ? params.searchStr : undefined,\n searchQueryValue: params.searchType === \"value\" ? params.searchStr : undefined,\n }).then((v) => v.values);\n}\n\nfunction makeFilterColumnId(spec: PTableColumnSpec): CanonicalizedJson<PTableColumnId> {\n return canonicalizeJson<PTableColumnId>(getPTableColumnId(spec));\n}\n</script>\n\n<template>\n <Teleport v-if=\"teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost\n :icon=\"hasFilters || hasDefaultFilters ? 'filter-on' : 'filter'\"\n @click.stop=\"showManager = true\"\n >\n Filters\n </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"showManager\" :close-on-outside-click=\"false\">\n <template #title>Manage Filters</template>\n\n <div :class=\"$style.root\">\n <PlAdvancedFilterComponent\n :filters=\"filters as PlAdvancedFilter\"\n :options=\"options\"\n :supported-filters=\"supportedFilters\"\n :get-suggest-options=\"handleSuggestOptions\"\n :is-pinned=\"(_, index) => hasDefaultFilters && index === 0\"\n :is-removable=\"(_, index) => (hasDefaultFilters ? index > 0 : true)\"\n :is-draggable=\"(_, index) => (hasDefaultFilters ? index > 0 : true)\"\n :enable-dnd=\"false\"\n :enable-toggling=\"true\"\n :enable-add-group-button=\"true\"\n @update-filters=\"onUpdateFilters\"\n >\n <template #group-title=\"{ index }\">\n <div v-if=\"hasDefaultFilters && index === 0\" :class=\"$style.defaultGroupTitle\">\n Default Group\n <PlBtnGhost\n v-if=\"isFunction(props.onResetDefaultFilters)\"\n icon=\"restart\"\n :class=\"$style.restartBtn\"\n @click.stop=\"props.onResetDefaultFilters()\"\n />\n </div>\n <div v-else>Custom Group</div>\n </template>\n </PlAdvancedFilterComponent>\n </div>\n </PlSlideModal>\n</template>\n\n<style module>\n.root {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.defaultGroupTitle {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.restartBtn {\n width: 24px;\n height: 24px;\n padding: 4px;\n --button-width: 24px;\n --btn-min-width: 24px;\n --button-height: 24px;\n --btn-min-height: 24x;\n}\n</style>\n"],"mappings":""}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import './PlTableFiltersV2.vue.css';var e = {
|
|
1
|
+
import './PlTableFiltersV2.vue.css';var e = {
|
|
2
|
+
root: "_root_1da3c_2",
|
|
3
|
+
defaultGroupTitle: "_defaultGroupTitle_1da3c_7",
|
|
4
|
+
restartBtn: "_restartBtn_1da3c_12"
|
|
5
|
+
};
|
|
2
6
|
//#endregion
|
|
3
7
|
export { e as default };
|
|
4
8
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlTableFiltersV2.vue_vue_type_style_index_0_lang.module.js","names":[],"sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type {\n PTableColumnSpec,\n PlDataTableFiltersWithMeta,\n PFrameHandle,\n PTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\n Annotation,\n Domain,\n readAnnotation,\n readDomain,\n
|
|
1
|
+
{"version":3,"file":"PlTableFiltersV2.vue_vue_type_style_index_0_lang.module.js","names":[],"sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type {\n PTableColumnSpec,\n PlDataTableFiltersWithMeta,\n PFrameHandle,\n PTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\n Annotation,\n Domain,\n readAnnotation,\n readDomain,\n getUniqueSourceValuesWithLabels,\n parseJson,\n getPTableColumnId,\n} from \"@platforma-sdk/model\";\nimport { computed, ref } from \"vue\";\nimport { PlBtnGhost, PlSlideModal, usePlBlockPageTitleTeleportTarget } from \"@milaboratories/uikit\";\nimport {\n PlAdvancedFilter,\n PlAdvancedFilterComponent,\n PlAdvancedFilterSupportedFilters,\n type PlAdvancedFilterItem,\n} from \"../PlAdvancedFilter\";\nimport type { PlAdvancedFilterColumnId } from \"../PlAdvancedFilter/types\";\nimport type { Nil } from \"@milaboratories/helpers\";\nimport { isFunction, isNil } from \"es-toolkit\";\n\nconst props = defineProps<{\n columns: PTableColumnSpec[];\n pframeHandle: Nil | PFrameHandle;\n filters: PlDataTableFiltersWithMeta;\n defaultFilters: Nil | PlDataTableFiltersWithMeta;\n onUpdateFilters: (value: PlDataTableFiltersWithMeta) => void;\n onResetDefaultFilters?: () => void;\n onUpdateDefaultFilters?: (value: PlDataTableFiltersWithMeta) => void;\n}>();\n\nconst teleportTarget = usePlBlockPageTitleTeleportTarget(\"PlTableFiltersV2\");\nconst showManager = ref(false);\nconst hasFilters = computed(() => props.filters.filters.length > 0);\nconst hasDefaultFilters = computed(\n () => !isNil(props.defaultFilters) && props.defaultFilters.filters.length > 0,\n);\nconst filters = computed<PlDataTableFiltersWithMeta>(() => {\n if (isNil(props.defaultFilters) || props.defaultFilters?.filters.length === 0) {\n return props.filters;\n }\n\n return {\n ...props.filters,\n filters: [...(props.defaultFilters?.filters ?? []), ...props.filters.filters],\n };\n});\nconst onUpdateFilters = (_value: PlAdvancedFilter) => {\n const value = _value as PlDataTableFiltersWithMeta;\n\n if (isNil(props.defaultFilters)) {\n return props.onUpdateFilters(value);\n }\n\n const [defaults, ...rest] = value.filters;\n props.onUpdateFilters({ ...value, filters: rest });\n props.onUpdateDefaultFilters?.({ ...props.defaultFilters, filters: [defaults] });\n};\n\nconst options = computed<PlAdvancedFilterItem[]>(() => {\n return props.columns.map((col, idx) => {\n const id = makeFilterColumnId(col);\n const label =\n readAnnotation(col.spec, Annotation.Label)?.trim() ?? `Unlabeled ${col.type} ${idx}`;\n const alphabet =\n readDomain(col.spec, Domain.Alphabet) ?? readAnnotation(col.spec, Annotation.Alphabet);\n return {\n id,\n label,\n spec: col.spec,\n alphabet: alphabet ?? undefined,\n };\n });\n});\n\n// Supported filters (same set as FilterSidebar)\nconst supportedFilters = [\n \"isNA\",\n \"isNotNA\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"patternEquals\",\n \"patternNotEquals\",\n \"patternContainSubsequence\",\n \"patternNotContainSubsequence\",\n \"patternMatchesRegularExpression\",\n \"patternFuzzyContainSubsequence\",\n \"equal\",\n \"notEqual\",\n] as (typeof PlAdvancedFilterSupportedFilters)[number][];\n\n// getSuggestOptions - provide discrete values from column annotations\nfunction handleSuggestOptions(params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchStr: string;\n searchType: \"value\" | \"label\";\n}) {\n if (isNil(props.pframeHandle)) {\n console.warn(\"PFrame handle is not available, cannot fetch suggest options\");\n return [];\n }\n\n const strId = params.columnId as CanonicalizedJson<PTableColumnId>;\n const tableColumnId = parseJson<PTableColumnId>(strId);\n\n if (tableColumnId.type !== \"column\") {\n throw new Error(\"ColumnId should be of type 'column' for suggest options\");\n }\n\n return getUniqueSourceValuesWithLabels(props.pframeHandle, {\n columnId: tableColumnId.id,\n axisIdx: params.axisIdx,\n limit: 100,\n searchQuery: params.searchType === \"label\" ? params.searchStr : undefined,\n searchQueryValue: params.searchType === \"value\" ? params.searchStr : undefined,\n }).then((v) => v.values);\n}\n\nfunction makeFilterColumnId(spec: PTableColumnSpec): CanonicalizedJson<PTableColumnId> {\n return canonicalizeJson<PTableColumnId>(getPTableColumnId(spec));\n}\n</script>\n\n<template>\n <Teleport v-if=\"teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost\n :icon=\"hasFilters || hasDefaultFilters ? 'filter-on' : 'filter'\"\n @click.stop=\"showManager = true\"\n >\n Filters\n </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"showManager\" :close-on-outside-click=\"false\">\n <template #title>Manage Filters</template>\n\n <div :class=\"$style.root\">\n <PlAdvancedFilterComponent\n :filters=\"filters as PlAdvancedFilter\"\n :options=\"options\"\n :supported-filters=\"supportedFilters\"\n :get-suggest-options=\"handleSuggestOptions\"\n :is-pinned=\"(_, index) => hasDefaultFilters && index === 0\"\n :is-removable=\"(_, index) => (hasDefaultFilters ? index > 0 : true)\"\n :is-draggable=\"(_, index) => (hasDefaultFilters ? index > 0 : true)\"\n :enable-dnd=\"false\"\n :enable-toggling=\"true\"\n :enable-add-group-button=\"true\"\n @update-filters=\"onUpdateFilters\"\n >\n <template #group-title=\"{ index }\">\n <div v-if=\"hasDefaultFilters && index === 0\" :class=\"$style.defaultGroupTitle\">\n Default Group\n <PlBtnGhost\n v-if=\"isFunction(props.onResetDefaultFilters)\"\n icon=\"restart\"\n :class=\"$style.restartBtn\"\n @click.stop=\"props.onResetDefaultFilters()\"\n />\n </div>\n <div v-else>Custom Group</div>\n </template>\n </PlAdvancedFilterComponent>\n </div>\n </PlSlideModal>\n</template>\n\n<style module>\n.root {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.defaultGroupTitle {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.restartBtn {\n width: 24px;\n height: 24px;\n padding: 4px;\n --button-width: 24px;\n --btn-min-width: 24px;\n --button-height: 24px;\n --btn-min-height: 24x;\n}\n</style>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.
|
|
1
|
+
._root_1da3c_2{flex-direction:column;gap:12px;display:flex}._defaultGroupTitle_1da3c_7{align-items:center;gap:4px;display:flex}._restartBtn_1da3c_12{--button-width:24px;--btn-min-width:24px;--button-height:24px;--btn-min-height:24x;width:24px;height:24px;padding:4px}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import { PTableColumnSpec, PlDataTableFiltersWithMeta, PFrameHandle } from '@platforma-sdk/model';
|
|
2
2
|
import { Nil } from '@milaboratories/helpers';
|
|
3
3
|
type __VLS_Props = {
|
|
4
|
-
pframeHandle: Nil | PFrameHandle;
|
|
5
4
|
columns: PTableColumnSpec[];
|
|
5
|
+
pframeHandle: Nil | PFrameHandle;
|
|
6
|
+
filters: PlDataTableFiltersWithMeta;
|
|
7
|
+
defaultFilters: Nil | PlDataTableFiltersWithMeta;
|
|
8
|
+
onUpdateFilters: (value: PlDataTableFiltersWithMeta) => void;
|
|
9
|
+
onResetDefaultFilters?: () => void;
|
|
10
|
+
onUpdateDefaultFilters?: (value: PlDataTableFiltersWithMeta) => void;
|
|
6
11
|
};
|
|
7
|
-
|
|
8
|
-
modelValue: PlDataTableFiltersWithMeta;
|
|
9
|
-
} & __VLS_Props;
|
|
10
|
-
declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
11
|
-
"update:modelValue": (value: PlDataTableFiltersWithMeta) => any;
|
|
12
|
-
}, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
13
|
-
"onUpdate:modelValue"?: ((value: PlDataTableFiltersWithMeta) => any) | undefined;
|
|
14
|
-
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
12
|
+
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
15
13
|
export default _default;
|
|
16
14
|
//# sourceMappingURL=PlTableFiltersV2.vue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlTableFiltersV2.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PlTableFiltersV2.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"names":[],"mappings":"AA0MA,OAAO,KAAK,EACV,gBAAgB,EAChB,0BAA0B,EAC1B,YAAY,EAGb,MAAM,sBAAsB,CAAC;AAoB9B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAGnD,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,YAAY,EAAE,GAAG,GAAG,YAAY,CAAC;IACjC,OAAO,EAAE,0BAA0B,CAAC;IACpC,cAAc,EAAE,GAAG,GAAG,0BAA0B,CAAC;IACjD,eAAe,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAC7D,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;CACtE,CAAC;;AAqRF,wBAMG"}
|
|
@@ -1,37 +1,38 @@
|
|
|
1
1
|
import e from "../PlAdvancedFilter/PlAdvancedFilter.js";
|
|
2
2
|
import "../PlAdvancedFilter/index.js";
|
|
3
|
-
import { Fragment as t, Teleport as n, computed as r, createBlock as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createTextVNode as c, createVNode as l, defineComponent as u,
|
|
4
|
-
import { Annotation as
|
|
5
|
-
import { PlBtnGhost as
|
|
6
|
-
import { isNil as
|
|
3
|
+
import { Fragment as t, Teleport as n, computed as r, createBlock as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createTextVNode as c, createVNode as l, defineComponent as u, normalizeClass as d, openBlock as f, ref as p, unref as m, withCtx as h, withModifiers as g } from "vue";
|
|
4
|
+
import { Annotation as _, Domain as v, canonicalizeJson as y, getPTableColumnId as b, getUniqueSourceValuesWithLabels as x, parseJson as S, readAnnotation as C, readDomain as w } from "@platforma-sdk/model";
|
|
5
|
+
import { PlBtnGhost as T, PlSlideModal as E, usePlBlockPageTitleTeleportTarget as D } from "@milaboratories/uikit";
|
|
6
|
+
import { isFunction as O, isNil as k } from "es-toolkit";
|
|
7
7
|
//#region src/components/PlTableFilters/PlTableFiltersV2.vue?vue&type=script&setup=true&lang.ts
|
|
8
|
-
var
|
|
8
|
+
var A = { key: 1 }, j = /* @__PURE__ */ u({
|
|
9
9
|
__name: "PlTableFiltersV2",
|
|
10
|
-
props:
|
|
10
|
+
props: {
|
|
11
|
+
columns: {},
|
|
11
12
|
pframeHandle: {},
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
filters: {},
|
|
14
|
+
defaultFilters: {},
|
|
15
|
+
onUpdateFilters: { type: Function },
|
|
16
|
+
onResetDefaultFilters: { type: Function },
|
|
17
|
+
onUpdateDefaultFilters: { type: Function }
|
|
18
|
+
},
|
|
18
19
|
setup(u) {
|
|
19
|
-
let
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
20
|
+
let j = u, M = D("PlTableFiltersV2"), N = p(!1), P = r(() => j.filters.filters.length > 0), F = r(() => !k(j.defaultFilters) && j.defaultFilters.filters.length > 0), I = r(() => k(j.defaultFilters) || j.defaultFilters?.filters.length === 0 ? j.filters : {
|
|
21
|
+
...j.filters,
|
|
22
|
+
filters: [...j.defaultFilters?.filters ?? [], ...j.filters.filters]
|
|
23
|
+
}), L = (e) => {
|
|
24
|
+
let t = e;
|
|
25
|
+
if (k(j.defaultFilters)) return j.onUpdateFilters(t);
|
|
26
|
+
let [n, ...r] = t.filters;
|
|
27
|
+
j.onUpdateFilters({
|
|
28
|
+
...t,
|
|
29
|
+
filters: r
|
|
30
|
+
}), j.onUpdateDefaultFilters?.({
|
|
31
|
+
...j.defaultFilters,
|
|
32
|
+
filters: [n]
|
|
31
33
|
});
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
let n = L(e), r = E(e.spec, b.Label)?.trim() ?? `Unlabeled ${e.type} ${t}`, i = D(e.spec, x.Alphabet) ?? E(e.spec, b.Alphabet);
|
|
34
|
+
}, R = r(() => j.columns.map((e, t) => {
|
|
35
|
+
let n = V(e), r = C(e.spec, _.Label)?.trim() ?? `Unlabeled ${e.type} ${t}`, i = w(e.spec, v.Alphabet) ?? C(e.spec, _.Alphabet);
|
|
35
36
|
return {
|
|
36
37
|
id: n,
|
|
37
38
|
label: r,
|
|
@@ -55,10 +56,10 @@ var M = /* @__PURE__ */ u({
|
|
|
55
56
|
"notEqual"
|
|
56
57
|
];
|
|
57
58
|
function B(e) {
|
|
58
|
-
if (j
|
|
59
|
-
let t = e.columnId, n =
|
|
59
|
+
if (k(j.pframeHandle)) return console.warn("PFrame handle is not available, cannot fetch suggest options"), [];
|
|
60
|
+
let t = e.columnId, n = S(t);
|
|
60
61
|
if (n.type !== "column") throw Error("ColumnId should be of type 'column' for suggest options");
|
|
61
|
-
return
|
|
62
|
+
return x(j.pframeHandle, {
|
|
62
63
|
columnId: n.id,
|
|
63
64
|
axisIdx: e.axisIdx,
|
|
64
65
|
limit: 100,
|
|
@@ -66,35 +67,59 @@ var M = /* @__PURE__ */ u({
|
|
|
66
67
|
searchQueryValue: e.searchType === "value" ? e.searchStr : void 0
|
|
67
68
|
}).then((e) => e.values);
|
|
68
69
|
}
|
|
69
|
-
|
|
70
|
+
function V(e) {
|
|
71
|
+
return y(b(e));
|
|
72
|
+
}
|
|
73
|
+
return (r, u) => (f(), o(t, null, [m(M) ? (f(), i(n, {
|
|
70
74
|
key: 0,
|
|
71
|
-
to:
|
|
72
|
-
}, [l(
|
|
73
|
-
icon:
|
|
74
|
-
onClick: u[0] ||=
|
|
75
|
+
to: m(M)
|
|
76
|
+
}, [l(m(T), {
|
|
77
|
+
icon: P.value || F.value ? "filter-on" : "filter",
|
|
78
|
+
onClick: u[0] ||= g((e) => N.value = !0, ["stop"])
|
|
75
79
|
}, {
|
|
76
|
-
default:
|
|
80
|
+
default: h(() => [...u[3] ||= [c(" Filters ", -1)]]),
|
|
77
81
|
_: 1
|
|
78
|
-
}, 8, ["icon"])], 8, ["to"])) : a("", !0), l(
|
|
79
|
-
modelValue:
|
|
80
|
-
"onUpdate:modelValue": u[2] ||= (e) =>
|
|
82
|
+
}, 8, ["icon"])], 8, ["to"])) : a("", !0), l(m(E), {
|
|
83
|
+
modelValue: N.value,
|
|
84
|
+
"onUpdate:modelValue": u[2] ||= (e) => N.value = e,
|
|
81
85
|
"close-on-outside-click": !1
|
|
82
86
|
}, {
|
|
83
|
-
title:
|
|
84
|
-
default:
|
|
85
|
-
filters:
|
|
86
|
-
|
|
87
|
-
items: R.value,
|
|
87
|
+
title: h(() => [...u[4] ||= [c("Manage Filters", -1)]]),
|
|
88
|
+
default: h(() => [s("div", { class: d(r.$style.root) }, [l(m(e), {
|
|
89
|
+
filters: I.value,
|
|
90
|
+
options: R.value,
|
|
88
91
|
"supported-filters": z,
|
|
89
92
|
"get-suggest-options": B,
|
|
93
|
+
"is-pinned": (e, t) => F.value && t === 0,
|
|
94
|
+
"is-removable": (e, t) => F.value ? t > 0 : !0,
|
|
95
|
+
"is-draggable": (e, t) => F.value ? t > 0 : !0,
|
|
90
96
|
"enable-dnd": !1,
|
|
91
|
-
"enable-
|
|
92
|
-
|
|
97
|
+
"enable-toggling": !0,
|
|
98
|
+
"enable-add-group-button": !0,
|
|
99
|
+
onUpdateFilters: L
|
|
100
|
+
}, {
|
|
101
|
+
"group-title": h(({ index: e }) => [F.value && e === 0 ? (f(), o("div", {
|
|
102
|
+
key: 0,
|
|
103
|
+
class: d(r.$style.defaultGroupTitle)
|
|
104
|
+
}, [u[5] ||= c(" Default Group ", -1), m(O)(j.onResetDefaultFilters) ? (f(), i(m(T), {
|
|
105
|
+
key: 0,
|
|
106
|
+
icon: "restart",
|
|
107
|
+
class: d(r.$style.restartBtn),
|
|
108
|
+
onClick: u[1] ||= g((e) => j.onResetDefaultFilters(), ["stop"])
|
|
109
|
+
}, null, 8, ["class"])) : a("", !0)], 2)) : (f(), o("div", A, "Custom Group"))]),
|
|
110
|
+
_: 1
|
|
111
|
+
}, 8, [
|
|
112
|
+
"filters",
|
|
113
|
+
"options",
|
|
114
|
+
"is-pinned",
|
|
115
|
+
"is-removable",
|
|
116
|
+
"is-draggable"
|
|
117
|
+
])], 2)]),
|
|
93
118
|
_: 1
|
|
94
119
|
}, 8, ["modelValue"])], 64));
|
|
95
120
|
}
|
|
96
121
|
});
|
|
97
122
|
//#endregion
|
|
98
|
-
export {
|
|
123
|
+
export { j as default };
|
|
99
124
|
|
|
100
125
|
//# sourceMappingURL=PlTableFiltersV2.vue2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlTableFiltersV2.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type {\n PTableColumnSpec,\n PlDataTableFiltersWithMeta,\n PFrameHandle,\n PTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\n Annotation,\n Domain,\n readAnnotation,\n readDomain,\n
|
|
1
|
+
{"version":3,"file":"PlTableFiltersV2.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type {\n PTableColumnSpec,\n PlDataTableFiltersWithMeta,\n PFrameHandle,\n PTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\n Annotation,\n Domain,\n readAnnotation,\n readDomain,\n getUniqueSourceValuesWithLabels,\n parseJson,\n getPTableColumnId,\n} from \"@platforma-sdk/model\";\nimport { computed, ref } from \"vue\";\nimport { PlBtnGhost, PlSlideModal, usePlBlockPageTitleTeleportTarget } from \"@milaboratories/uikit\";\nimport {\n PlAdvancedFilter,\n PlAdvancedFilterComponent,\n PlAdvancedFilterSupportedFilters,\n type PlAdvancedFilterItem,\n} from \"../PlAdvancedFilter\";\nimport type { PlAdvancedFilterColumnId } from \"../PlAdvancedFilter/types\";\nimport type { Nil } from \"@milaboratories/helpers\";\nimport { isFunction, isNil } from \"es-toolkit\";\n\nconst props = defineProps<{\n columns: PTableColumnSpec[];\n pframeHandle: Nil | PFrameHandle;\n filters: PlDataTableFiltersWithMeta;\n defaultFilters: Nil | PlDataTableFiltersWithMeta;\n onUpdateFilters: (value: PlDataTableFiltersWithMeta) => void;\n onResetDefaultFilters?: () => void;\n onUpdateDefaultFilters?: (value: PlDataTableFiltersWithMeta) => void;\n}>();\n\nconst teleportTarget = usePlBlockPageTitleTeleportTarget(\"PlTableFiltersV2\");\nconst showManager = ref(false);\nconst hasFilters = computed(() => props.filters.filters.length > 0);\nconst hasDefaultFilters = computed(\n () => !isNil(props.defaultFilters) && props.defaultFilters.filters.length > 0,\n);\nconst filters = computed<PlDataTableFiltersWithMeta>(() => {\n if (isNil(props.defaultFilters) || props.defaultFilters?.filters.length === 0) {\n return props.filters;\n }\n\n return {\n ...props.filters,\n filters: [...(props.defaultFilters?.filters ?? []), ...props.filters.filters],\n };\n});\nconst onUpdateFilters = (_value: PlAdvancedFilter) => {\n const value = _value as PlDataTableFiltersWithMeta;\n\n if (isNil(props.defaultFilters)) {\n return props.onUpdateFilters(value);\n }\n\n const [defaults, ...rest] = value.filters;\n props.onUpdateFilters({ ...value, filters: rest });\n props.onUpdateDefaultFilters?.({ ...props.defaultFilters, filters: [defaults] });\n};\n\nconst options = computed<PlAdvancedFilterItem[]>(() => {\n return props.columns.map((col, idx) => {\n const id = makeFilterColumnId(col);\n const label =\n readAnnotation(col.spec, Annotation.Label)?.trim() ?? `Unlabeled ${col.type} ${idx}`;\n const alphabet =\n readDomain(col.spec, Domain.Alphabet) ?? readAnnotation(col.spec, Annotation.Alphabet);\n return {\n id,\n label,\n spec: col.spec,\n alphabet: alphabet ?? undefined,\n };\n });\n});\n\n// Supported filters (same set as FilterSidebar)\nconst supportedFilters = [\n \"isNA\",\n \"isNotNA\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"patternEquals\",\n \"patternNotEquals\",\n \"patternContainSubsequence\",\n \"patternNotContainSubsequence\",\n \"patternMatchesRegularExpression\",\n \"patternFuzzyContainSubsequence\",\n \"equal\",\n \"notEqual\",\n] as (typeof PlAdvancedFilterSupportedFilters)[number][];\n\n// getSuggestOptions - provide discrete values from column annotations\nfunction handleSuggestOptions(params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchStr: string;\n searchType: \"value\" | \"label\";\n}) {\n if (isNil(props.pframeHandle)) {\n console.warn(\"PFrame handle is not available, cannot fetch suggest options\");\n return [];\n }\n\n const strId = params.columnId as CanonicalizedJson<PTableColumnId>;\n const tableColumnId = parseJson<PTableColumnId>(strId);\n\n if (tableColumnId.type !== \"column\") {\n throw new Error(\"ColumnId should be of type 'column' for suggest options\");\n }\n\n return getUniqueSourceValuesWithLabels(props.pframeHandle, {\n columnId: tableColumnId.id,\n axisIdx: params.axisIdx,\n limit: 100,\n searchQuery: params.searchType === \"label\" ? params.searchStr : undefined,\n searchQueryValue: params.searchType === \"value\" ? params.searchStr : undefined,\n }).then((v) => v.values);\n}\n\nfunction makeFilterColumnId(spec: PTableColumnSpec): CanonicalizedJson<PTableColumnId> {\n return canonicalizeJson<PTableColumnId>(getPTableColumnId(spec));\n}\n</script>\n\n<template>\n <Teleport v-if=\"teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost\n :icon=\"hasFilters || hasDefaultFilters ? 'filter-on' : 'filter'\"\n @click.stop=\"showManager = true\"\n >\n Filters\n </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"showManager\" :close-on-outside-click=\"false\">\n <template #title>Manage Filters</template>\n\n <div :class=\"$style.root\">\n <PlAdvancedFilterComponent\n :filters=\"filters as PlAdvancedFilter\"\n :options=\"options\"\n :supported-filters=\"supportedFilters\"\n :get-suggest-options=\"handleSuggestOptions\"\n :is-pinned=\"(_, index) => hasDefaultFilters && index === 0\"\n :is-removable=\"(_, index) => (hasDefaultFilters ? index > 0 : true)\"\n :is-draggable=\"(_, index) => (hasDefaultFilters ? index > 0 : true)\"\n :enable-dnd=\"false\"\n :enable-toggling=\"true\"\n :enable-add-group-button=\"true\"\n @update-filters=\"onUpdateFilters\"\n >\n <template #group-title=\"{ index }\">\n <div v-if=\"hasDefaultFilters && index === 0\" :class=\"$style.defaultGroupTitle\">\n Default Group\n <PlBtnGhost\n v-if=\"isFunction(props.onResetDefaultFilters)\"\n icon=\"restart\"\n :class=\"$style.restartBtn\"\n @click.stop=\"props.onResetDefaultFilters()\"\n />\n </div>\n <div v-else>Custom Group</div>\n </template>\n </PlAdvancedFilterComponent>\n </div>\n </PlSlideModal>\n</template>\n\n<style module>\n.root {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.defaultGroupTitle {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.restartBtn {\n width: 24px;\n height: 24px;\n padding: 4px;\n --button-width: 24px;\n --btn-min-width: 24px;\n --button-height: 24px;\n --btn-min-height: 24x;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EA8BA,IAAM,IAAQ,GAUR,IAAiB,EAAkC,mBAAmB,EACtE,IAAc,EAAI,GAAM,EACxB,IAAa,QAAe,EAAM,QAAQ,QAAQ,SAAS,EAAE,EAC7D,IAAoB,QAClB,CAAC,EAAM,EAAM,eAAe,IAAI,EAAM,eAAe,QAAQ,SAAS,EAC7E,EACK,IAAU,QACV,EAAM,EAAM,eAAe,IAAI,EAAM,gBAAgB,QAAQ,WAAW,IACnE,EAAM,UAGR;GACL,GAAG,EAAM;GACT,SAAS,CAAC,GAAI,EAAM,gBAAgB,WAAW,EAAE,EAAG,GAAG,EAAM,QAAQ,QAAQ;GAC9E,CACD,EACI,KAAmB,MAA6B;GACpD,IAAM,IAAQ;AAEd,OAAI,EAAM,EAAM,eAAe,CAC7B,QAAO,EAAM,gBAAgB,EAAM;GAGrC,IAAM,CAAC,GAAU,GAAG,KAAQ,EAAM;AAElC,GADA,EAAM,gBAAgB;IAAE,GAAG;IAAO,SAAS;IAAM,CAAC,EAClD,EAAM,yBAAyB;IAAE,GAAG,EAAM;IAAgB,SAAS,CAAC,EAAS;IAAE,CAAC;KAG5E,IAAU,QACP,EAAM,QAAQ,KAAK,GAAK,MAAQ;GACrC,IAAM,IAAK,EAAmB,EAAI,EAC5B,IACJ,EAAe,EAAI,MAAM,EAAW,MAAM,EAAE,MAAM,IAAI,aAAa,EAAI,KAAK,GAAG,KAC3E,IACJ,EAAW,EAAI,MAAM,EAAO,SAAS,IAAI,EAAe,EAAI,MAAM,EAAW,SAAS;AACxF,UAAO;IACL;IACA;IACA,MAAM,EAAI;IACV,UAAU,KAAY,KAAA;IACvB;IACD,CACF,EAGI,IAAmB;GACvB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EAGD,SAAS,EAAqB,GAK3B;AACD,OAAI,EAAM,EAAM,aAAa,CAE3B,QADA,QAAQ,KAAK,+DAA+D,EACrE,EAAE;GAGX,IAAM,IAAQ,EAAO,UACf,IAAgB,EAA0B,EAAM;AAEtD,OAAI,EAAc,SAAS,SACzB,OAAU,MAAM,0DAA0D;AAG5E,UAAO,EAAgC,EAAM,cAAc;IACzD,UAAU,EAAc;IACxB,SAAS,EAAO;IAChB,OAAO;IACP,aAAa,EAAO,eAAe,UAAU,EAAO,YAAY,KAAA;IAChE,kBAAkB,EAAO,eAAe,UAAU,EAAO,YAAY,KAAA;IACtE,CAAC,CAAC,MAAM,MAAM,EAAE,OAAO;;EAG1B,SAAS,EAAmB,GAA2D;AACrF,UAAO,EAAiC,EAAkB,EAAK,CAAC;;qCAKhD,EAAA,EAAc,IAAA,GAAA,EAA9B,EAOW,GAAA;;GAPsB,IAAI,EAAA,EAAc;MACjD,EAKa,EAAA,EAAA,EAAA;GAJV,MAAM,EAAA,SAAc,EAAA,QAAiB,cAAA;GACrC,SAAK,AAAA,EAAA,OAAA,GAAA,MAAO,EAAA,QAAW,IAAA,CAAA,OAAA,CAAA;;oBAG1B,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAFC,aAED,GAAA,CAAA,CAAA,CAAA;;6CAGF,EA+Be,EAAA,EAAA,EAAA;eA/BQ,EAAA;4CAAW,QAAA;GAAG,0BAAwB;;GAChD,OAAK,QAAe,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAd,kBAAc,GAAA,CAAA,CAAA,CAAA;oBA6BzB,CA3BN,EA2BM,OAAA,EA3BA,OAAK,EAAEA,EAAAA,OAAO,KAAI,EAAA,EAAA,CACtB,EAyB4B,EAAA,EAAA,EAAA;IAxBzB,SAAS,EAAA;IACT,SAAS,EAAA;IACT,qBAAmB;IACnB,uBAAqB;IACrB,cAAY,GAAG,MAAU,EAAA,SAAqB,MAAK;IACnD,iBAAe,GAAG,MAAW,EAAA,QAAoB,IAAK,IAAA;IACtD,iBAAe,GAAG,MAAW,EAAA,QAAoB,IAAK,IAAA;IACtD,cAAY;IACZ,mBAAiB;IACjB,2BAAyB;IACT;;IAEN,eAAW,GASd,EATkB,eAAK,CAClB,EAAA,SAAqB,MAAK,KAAA,GAAA,EAArC,EAQM,OAAA;;KARwC,OAAK,EAAEA,EAAAA,OAAO,kBAAiB;mBAAE,mBAE7E,GAAA,EACQ,EAAA,EAAU,CAAC,EAAM,sBAAqB,IAAA,GAAA,EAD9C,EAKE,EAAA,EAAA,EAAA;;KAHA,MAAK;KACJ,OAAK,EAAEA,EAAAA,OAAO,WAAU;KACxB,SAAK,AAAA,EAAA,OAAA,GAAA,MAAO,EAAM,uBAAqB,EAAA,CAAA,OAAA,CAAA;sDAG5C,EAA8B,OAAA,GAAlB,eAAY,EAAA,CAAA"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,OAAO,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -36,7 +36,9 @@ import { objectHash as Q } from "./objectHash.js";
|
|
|
36
36
|
import { computedResult as $ } from "./computedResult.js";
|
|
37
37
|
import { ReactiveFileContent as te } from "./composition/fileContent.js";
|
|
38
38
|
import "./lib.js";
|
|
39
|
+
import { setAutoFreeze as ne } from "immer";
|
|
39
40
|
export * from "@milaboratories/uikit";
|
|
41
|
+
ne(!1);
|
|
40
42
|
//#endregion
|
|
41
43
|
export { j as AgGridTheme, g as BlockLayout, T as DeferredCircular, e as MultiError, S as PlAdvancedFilterComponent, C as PlAdvancedFilterSupportedFilters, I as PlAgCellFile, P as PlAgCellProgress, z as PlAgCellStatusTag, R as PlAgChartHistogramCell, L as PlAgChartStackedBarCell, E as PlAgColumnHeader, _ as PlAgCsvExporter, v as PlAgDataTableRowNumberColId, M as PlAgDataTableV2, x as PlAgGridColumnManager, k as PlAgOverlayLoading, A as PlAgOverlayNoRows, D as PlAgTextAndButtonCell, K as PlAnnotations, q as PlAnnotationsModal, J as PlBtnExportArchive, M as PlDataTableV2, w as PlTableFiltersV2, te as ReactiveFileContent, t as UnresolvedError, Z as activateAgGrid, y as autoSizeRowNumberColumn, $ as computedResult, F as createAgGridColDef, u as createModel, O as defaultMainMenuItems, d as defineApp, f as defineAppV3, X as defineStore, V as deselectAll, n as ensureError, ee as ensureNodeVisible, r as ensureOutputHasStableFlag, i as formatZodError, H as getSelectedRowsCount, U as getTotalRowsCount, a as identity, o as isDefined, W as isSelectionEnabled, s as isZodError, b as makeRowNumberColDef, Q as objectHash, p as pluginDataKey, G as selectAll, c as unwrapOutput, B as useAgGridOptions, m as useFeatureFlags, N as usePlDataTableSettingsV2, Y as usePlugin, h as useSdkPlugin, l as wrapOptionalResult };
|
|
42
44
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { setAutoFreeze } from \"immer\";\n\nsetAutoFreeze(false);\n\nexport * from \"./lib\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,GAAc,GAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functions.js","names":[],"sources":["../../../../../../../lib/util/helpers/src/functions.ts"],"sourcesContent":["import type { AnyFunction } from \"./types\";\n\nexport function isFunction(value: unknown): value is AnyFunction {\n return typeof value === \"function\";\n}\n\n/**\n * A utility class that ensures asynchronous locks, allowing only one task to proceed at a time.\n */\nexport class AwaitLock {\n private acquired = false;\n private resolvers: (() => void)[] = [];\n\n acquireAsync(): Promise<void> {\n if (!this.acquired) {\n this.acquired = true;\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n this.resolvers.push(resolve);\n });\n }\n\n release(): void {\n if (!this.acquired) {\n throw new Error(\"Cannot release not acquired lock\");\n }\n\n if (this.resolvers.length) {\n this.resolvers.shift()?.();\n } else {\n this.acquired = false;\n }\n }\n}\n\n/**\n * A utility to add a timeout to a promise, rejecting the promise if the timeout is exceeded.\n */\nexport function promiseTimeout<T>(prom: PromiseLike<T>, ms: number): Promise<T> {\n return Promise.race<T>([\n prom,\n new Promise((_r, reject) => setTimeout(() => reject(Error(`Timeout exceeded ${ms}`)), ms)),\n ]);\n}\n\n/**\n * Debounce utility: delays the execution of a function until a certain time has passed since the last call.\n * @param callback\n * @param ms\n * @param immediate (if first call is required)\n * @returns\n */\nexport function debounce<F extends AnyFunction>(\n callback: F,\n ms: number,\n immediate?: boolean,\n): (...args: Parameters<F>) => void {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n return function (this: unknown, ...args: Parameters<F>) {\n const i = immediate && !timeout;\n if (i) {\n callback.apply(this, args);\n }\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n timeout = undefined;\n if (!i) {\n callback.apply(this, args);\n }\n }, ms);\n };\n}\n\n/**\n * Throttle utility: ensures a function is called at most once every `ms` milliseconds.\n * @param callback\n * @param ms milliseconds\n * @param trailing (ensure last call)\n * @returns\n */\nexport function throttle<F extends AnyFunction>(\n callback: F,\n ms: number,\n trailing = true,\n): (...args: Parameters<F>) => void {\n let t = 0,\n call: AnyFunction | null;\n return function (this: unknown, ...args: Parameters<F>) {\n call = () => {\n callback.apply(this, args);\n t = new Date().getTime() + ms;\n call = null;\n if (trailing) {\n setTimeout(() => {\n call?.();\n }, ms);\n }\n };\n if (new Date().getTime() > t) call();\n };\n}\n\n/**\n * Memoization utility: caches results of function calls based on their arguments to avoid redundant calculations.\n */\nexport const memoize = <F extends AnyFunction>(fn: F) => {\n const cache = new Map();\n return function (...args: Parameters<F>): ReturnType<F> {\n const key = JSON.stringify(args);\n
|
|
1
|
+
{"version":3,"file":"functions.js","names":[],"sources":["../../../../../../../lib/util/helpers/src/functions.ts"],"sourcesContent":["import type { AnyFunction } from \"./types\";\n\nexport function isFunction(value: unknown): value is AnyFunction {\n return typeof value === \"function\";\n}\n\n/**\n * A utility class that ensures asynchronous locks, allowing only one task to proceed at a time.\n */\nexport class AwaitLock {\n private acquired = false;\n private resolvers: (() => void)[] = [];\n\n acquireAsync(): Promise<void> {\n if (!this.acquired) {\n this.acquired = true;\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n this.resolvers.push(resolve);\n });\n }\n\n release(): void {\n if (!this.acquired) {\n throw new Error(\"Cannot release not acquired lock\");\n }\n\n if (this.resolvers.length) {\n this.resolvers.shift()?.();\n } else {\n this.acquired = false;\n }\n }\n}\n\n/**\n * A utility to add a timeout to a promise, rejecting the promise if the timeout is exceeded.\n */\nexport function promiseTimeout<T>(prom: PromiseLike<T>, ms: number): Promise<T> {\n return Promise.race<T>([\n prom,\n new Promise((_r, reject) => setTimeout(() => reject(Error(`Timeout exceeded ${ms}`)), ms)),\n ]);\n}\n\n/**\n * Debounce utility: delays the execution of a function until a certain time has passed since the last call.\n * @param callback\n * @param ms\n * @param immediate (if first call is required)\n * @returns\n */\nexport function debounce<F extends AnyFunction>(\n callback: F,\n ms: number,\n immediate?: boolean,\n): (...args: Parameters<F>) => void {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n return function (this: unknown, ...args: Parameters<F>) {\n const i = immediate && !timeout;\n if (i) {\n callback.apply(this, args);\n }\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n timeout = undefined;\n if (!i) {\n callback.apply(this, args);\n }\n }, ms);\n };\n}\n\n/**\n * Throttle utility: ensures a function is called at most once every `ms` milliseconds.\n * @param callback\n * @param ms milliseconds\n * @param trailing (ensure last call)\n * @returns\n */\nexport function throttle<F extends AnyFunction>(\n callback: F,\n ms: number,\n trailing = true,\n): (...args: Parameters<F>) => void {\n let t = 0,\n call: AnyFunction | null;\n return function (this: unknown, ...args: Parameters<F>) {\n call = () => {\n callback.apply(this, args);\n t = new Date().getTime() + ms;\n call = null;\n if (trailing) {\n setTimeout(() => {\n call?.();\n }, ms);\n }\n };\n if (new Date().getTime() > t) call();\n };\n}\n\n/**\n * Memoization utility: caches results of function calls based on their arguments to avoid redundant calculations.\n */\nexport const memoize = <F extends AnyFunction>(fn: F) => {\n const cache = new Map();\n return function (...args: Parameters<F>): ReturnType<F> {\n const key = JSON.stringify(args);\n return cache.has(key)\n ? cache.get(key)\n : cache.set(key, fn.call(null, ...args)) && cache.get(key);\n };\n};\n\n/**\n * Function wrapper utility: executes a function before the main function is called.\n */\nexport const wrapFunction = <T extends unknown[], U>(fn: (...args: T) => U, before: () => void) => {\n return (...args: T): U => {\n before();\n return fn(...args);\n };\n};\n\n/**\n * Function piping utility: allows chaining of functions by passing the result of one as input to another\n */\nexport function pipe<A, B>(cb: (a: A) => B) {\n const fn = (a: A) => cb(a);\n\n fn.pipe = <C>(next: (b: B) => C) => pipe((a: A) => next(cb(a)));\n\n return fn;\n}\n\n/**\n * Ensures that only one request can be processed at a time.\n */\nexport function exclusiveRequest<A, R>(request: (...args: A[]) => Promise<R>) {\n let counter = 0n;\n let ongoingOperation: Promise<R> | undefined;\n\n return async function (...params: A[]): Promise<\n | {\n ok: false;\n }\n | {\n ok: true;\n value: R;\n }\n > {\n const myId = ++counter;\n\n try {\n await ongoingOperation;\n } catch {\n // ignoring the error here, original caller will receive any rejections\n }\n\n // checking that this update is still the most recent\n if (counter !== myId) {\n return {\n ok: false,\n };\n }\n\n const promise = request(...params);\n\n ongoingOperation = promise;\n\n const value = await promise;\n\n return {\n ok: true,\n value,\n };\n };\n}\n\nexport function tryDo<R1>(fn: () => R1): R1 | undefined;\nexport function tryDo<R1, R2>(fn: () => R1, fallback: (cause: unknown) => R2): R1 | R2;\nexport function tryDo(fn: () => unknown, fallback?: (cause: unknown) => unknown) {\n try {\n return fn();\n } catch (cause: unknown) {\n return fallback?.(cause);\n }\n}\n"],"mappings":";AAwCA,SAAgB,EAAkB,GAAsB,GAAwB;AAC9E,QAAO,QAAQ,KAAQ,CACrB,GACA,IAAI,SAAS,GAAI,MAAW,iBAAiB,EAAO,MAAM,oBAAoB,IAAK,CAAC,EAAE,EAAG,CAAC,CAC3F,CAAC"}
|