@platforma-sdk/ui-vue 1.45.34 → 1.45.36

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 (150) hide show
  1. package/.turbo/turbo-build.log +216 -222
  2. package/.turbo/turbo-type-check.log +1 -1
  3. package/CHANGELOG.md +16 -0
  4. package/dist/AgGridVue/useAgGridOptions.js +2 -3
  5. package/dist/AgGridVue/useAgGridOptions.js.map +1 -1
  6. package/dist/components/{PlMultiSequenceAlignment/Legend.vue.d.ts → PlAdvancedFilter/OperandButton.vue.d.ts} +4 -2
  7. package/dist/components/{PlMultiSequenceAlignment/Toolbar.vue.js → PlAdvancedFilter/OperandButton.vue.js} +3 -3
  8. package/dist/components/PlAdvancedFilter/OperandButton.vue.js.map +1 -0
  9. package/dist/components/PlAdvancedFilter/OperandButton.vue2.js +25 -0
  10. package/dist/components/PlAdvancedFilter/OperandButton.vue2.js.map +1 -0
  11. package/dist/components/PlAdvancedFilter/OperandButton.vue3.js +13 -0
  12. package/dist/components/PlAdvancedFilter/OperandButton.vue3.js.map +1 -0
  13. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue.d.ts +39 -0
  14. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue.js +10 -0
  15. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue.js.map +1 -0
  16. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue2.js +199 -0
  17. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue2.js.map +1 -0
  18. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue3.js +17 -0
  19. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue3.js.map +1 -0
  20. package/dist/components/PlAdvancedFilter/SingleFilter.vue.d.ts +37 -0
  21. package/dist/components/{PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.js → PlAdvancedFilter/SingleFilter.vue.js} +3 -3
  22. package/dist/components/PlAdvancedFilter/SingleFilter.vue.js.map +1 -0
  23. package/dist/components/PlAdvancedFilter/SingleFilter.vue2.js +306 -0
  24. package/dist/components/PlAdvancedFilter/SingleFilter.vue2.js.map +1 -0
  25. package/dist/components/PlAdvancedFilter/SingleFilter.vue3.js +35 -0
  26. package/dist/components/PlAdvancedFilter/SingleFilter.vue3.js.map +1 -0
  27. package/dist/components/PlAdvancedFilter/constants.d.ts +4 -0
  28. package/dist/components/PlAdvancedFilter/constants.js +41 -0
  29. package/dist/components/PlAdvancedFilter/constants.js.map +1 -0
  30. package/dist/components/PlAdvancedFilter/index.d.ts +1 -0
  31. package/dist/components/PlAdvancedFilter/types.d.ts +57 -0
  32. package/dist/components/PlAdvancedFilter/types.js +8 -0
  33. package/dist/components/PlAdvancedFilter/types.js.map +1 -0
  34. package/dist/components/PlAdvancedFilter/utils.js +150 -0
  35. package/dist/components/PlAdvancedFilter/utils.js.map +1 -0
  36. package/dist/components/PlAgDataTable/PlAgRowCount.vue.js +7 -8
  37. package/dist/components/PlAgDataTable/PlAgRowCount.vue.js.map +1 -1
  38. package/dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue.js +9 -10
  39. package/dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue.js.map +1 -1
  40. package/dist/components/PlAgRowNumHeader.vue.js +2 -3
  41. package/dist/components/PlAgRowNumHeader.vue.js.map +1 -1
  42. package/dist/index.js +32 -32
  43. package/dist/lib.d.ts +1 -1
  44. package/package.json +6 -7
  45. package/src/components/PlAdvancedFilter/OperandButton.vue +53 -0
  46. package/src/components/PlAdvancedFilter/PlAdvancedFilter.vue +209 -0
  47. package/src/components/PlAdvancedFilter/SingleFilter.vue +425 -0
  48. package/src/components/PlAdvancedFilter/constants.ts +42 -0
  49. package/src/components/PlAdvancedFilter/index.ts +1 -0
  50. package/src/components/PlAdvancedFilter/types.ts +77 -0
  51. package/src/components/PlAdvancedFilter/utils.ts +215 -0
  52. package/src/lib.ts +2 -2
  53. package/dist/assets/multi-sequence-alignment.worker-Cm0gZp19.js +0 -6
  54. package/dist/assets/multi-sequence-alignment.worker-Cm0gZp19.js.map +0 -1
  55. package/dist/assets/phylogenetic-tree.worker-4CrExYEo.js +0 -5
  56. package/dist/assets/phylogenetic-tree.worker-4CrExYEo.js.map +0 -1
  57. package/dist/components/PlMultiSequenceAlignment/Consensus.vue.d.ts +0 -9
  58. package/dist/components/PlMultiSequenceAlignment/Consensus.vue.js +0 -10
  59. package/dist/components/PlMultiSequenceAlignment/Consensus.vue.js.map +0 -1
  60. package/dist/components/PlMultiSequenceAlignment/Consensus.vue2.js +0 -122
  61. package/dist/components/PlMultiSequenceAlignment/Consensus.vue2.js.map +0 -1
  62. package/dist/components/PlMultiSequenceAlignment/Consensus.vue3.js +0 -9
  63. package/dist/components/PlMultiSequenceAlignment/Consensus.vue3.js.map +0 -1
  64. package/dist/components/PlMultiSequenceAlignment/Legend.vue.js +0 -10
  65. package/dist/components/PlMultiSequenceAlignment/Legend.vue.js.map +0 -1
  66. package/dist/components/PlMultiSequenceAlignment/Legend.vue2.js +0 -28
  67. package/dist/components/PlMultiSequenceAlignment/Legend.vue2.js.map +0 -1
  68. package/dist/components/PlMultiSequenceAlignment/Legend.vue3.js +0 -13
  69. package/dist/components/PlMultiSequenceAlignment/Legend.vue3.js.map +0 -1
  70. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.d.ts +0 -25
  71. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.js +0 -10
  72. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.js.map +0 -1
  73. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js +0 -138
  74. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js.map +0 -1
  75. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js +0 -31
  76. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js.map +0 -1
  77. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue.d.ts +0 -8
  78. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue.js +0 -10
  79. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue.js.map +0 -1
  80. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue2.js +0 -77
  81. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue2.js.map +0 -1
  82. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue3.js +0 -9
  83. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue3.js.map +0 -1
  84. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.d.ts +0 -71
  85. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.js.map +0 -1
  86. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js +0 -224
  87. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js.map +0 -1
  88. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue3.js +0 -9
  89. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue3.js.map +0 -1
  90. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue.d.ts +0 -8
  91. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue.js +0 -10
  92. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue.js.map +0 -1
  93. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue2.js +0 -127
  94. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue2.js.map +0 -1
  95. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue3.js +0 -9
  96. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue3.js.map +0 -1
  97. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue.d.ts +0 -16
  98. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue.js.map +0 -1
  99. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue2.js +0 -228
  100. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue2.js.map +0 -1
  101. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue3.js +0 -19
  102. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue3.js.map +0 -1
  103. package/dist/components/PlMultiSequenceAlignment/cell-size.d.ts +0 -4
  104. package/dist/components/PlMultiSequenceAlignment/cell-size.js +0 -8
  105. package/dist/components/PlMultiSequenceAlignment/cell-size.js.map +0 -1
  106. package/dist/components/PlMultiSequenceAlignment/chemical-properties.d.ts +0 -44
  107. package/dist/components/PlMultiSequenceAlignment/chemical-properties.js +0 -132
  108. package/dist/components/PlMultiSequenceAlignment/chemical-properties.js.map +0 -1
  109. package/dist/components/PlMultiSequenceAlignment/data.d.ts +0 -61
  110. package/dist/components/PlMultiSequenceAlignment/data.js +0 -370
  111. package/dist/components/PlMultiSequenceAlignment/data.js.map +0 -1
  112. package/dist/components/PlMultiSequenceAlignment/index.d.ts +0 -1
  113. package/dist/components/PlMultiSequenceAlignment/markup.d.ts +0 -16
  114. package/dist/components/PlMultiSequenceAlignment/markup.js +0 -84
  115. package/dist/components/PlMultiSequenceAlignment/markup.js.map +0 -1
  116. package/dist/components/PlMultiSequenceAlignment/migrations.d.ts +0 -3
  117. package/dist/components/PlMultiSequenceAlignment/migrations.js +0 -24
  118. package/dist/components/PlMultiSequenceAlignment/migrations.js.map +0 -1
  119. package/dist/components/PlMultiSequenceAlignment/multi-sequence-alignment.worker.d.ts +0 -6
  120. package/dist/components/PlMultiSequenceAlignment/phylogenetic-tree.worker.d.ts +0 -7
  121. package/dist/components/PlMultiSequenceAlignment/residue-counts.d.ts +0 -2
  122. package/dist/components/PlMultiSequenceAlignment/residue-counts.js +0 -13
  123. package/dist/components/PlMultiSequenceAlignment/residue-counts.js.map +0 -1
  124. package/dist/components/PlMultiSequenceAlignment/settings.d.ts +0 -2
  125. package/dist/components/PlMultiSequenceAlignment/settings.js +0 -9
  126. package/dist/components/PlMultiSequenceAlignment/settings.js.map +0 -1
  127. package/dist/components/PlMultiSequenceAlignment/types.d.ts +0 -5
  128. package/dist/components/PlMultiSequenceAlignment/useMiPlots.d.ts +0 -4
  129. package/dist/components/PlMultiSequenceAlignment/useMiPlots.js +0 -19
  130. package/dist/components/PlMultiSequenceAlignment/useMiPlots.js.map +0 -1
  131. package/src/components/PlMultiSequenceAlignment/Consensus.vue +0 -165
  132. package/src/components/PlMultiSequenceAlignment/Legend.vue +0 -44
  133. package/src/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue +0 -299
  134. package/src/components/PlMultiSequenceAlignment/PhylogeneticTree.vue +0 -110
  135. package/src/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue +0 -314
  136. package/src/components/PlMultiSequenceAlignment/README.md +0 -216
  137. package/src/components/PlMultiSequenceAlignment/SeqLogo.vue +0 -166
  138. package/src/components/PlMultiSequenceAlignment/Toolbar.vue +0 -228
  139. package/src/components/PlMultiSequenceAlignment/cell-size.ts +0 -4
  140. package/src/components/PlMultiSequenceAlignment/chemical-properties.ts +0 -199
  141. package/src/components/PlMultiSequenceAlignment/data.ts +0 -661
  142. package/src/components/PlMultiSequenceAlignment/index.ts +0 -1
  143. package/src/components/PlMultiSequenceAlignment/markup.ts +0 -141
  144. package/src/components/PlMultiSequenceAlignment/migrations.ts +0 -46
  145. package/src/components/PlMultiSequenceAlignment/multi-sequence-alignment.worker.ts +0 -54
  146. package/src/components/PlMultiSequenceAlignment/phylogenetic-tree.worker.ts +0 -89
  147. package/src/components/PlMultiSequenceAlignment/residue-counts.ts +0 -124
  148. package/src/components/PlMultiSequenceAlignment/settings.ts +0 -7
  149. package/src/components/PlMultiSequenceAlignment/types.ts +0 -3
  150. package/src/components/PlMultiSequenceAlignment/useMiPlots.ts +0 -23
@@ -0,0 +1,77 @@
1
+ import type { AxisSpec, FilterSpec, FilterSpecLeaf, FilterSpecType, ListOptionBase, PColumnSpec, SUniversalPColumnId } from '@platforma-sdk/model';
2
+ import { SUPPORTED_FILTER_TYPES } from './constants';
3
+ import type { CanonicalizedJson } from '@platforma-sdk/model';
4
+ import type { AxisId } from '@platforma-sdk/model';
5
+
6
+ export type PlAdvancedFilterColumnId = SUniversalPColumnId | CanonicalizedJson<AxisId>;
7
+ export type CommonFilterSpec = FilterSpec<FilterSpecLeaf<PlAdvancedFilterColumnId>, { expanded?: boolean }>;
8
+
9
+ // Not supported: topN, bottomN, lessThanColumn, lessThanColumnOrEqual
10
+ // or, and, not - in groups
11
+ export type SupportedFilterTypes = FilterSpecType &
12
+ 'isNA' | 'isNotNA' |
13
+ 'patternEquals' | 'patternNotEquals' |
14
+ 'patternContainSubsequence' | 'patternNotContainSubsequence' |
15
+ 'patternMatchesRegularExpression' |
16
+ 'patternFuzzyContainSubsequence' |
17
+ 'inSet' | 'notInSet' |
18
+ 'equal' | 'notEqual' |
19
+ 'lessThan' | 'lessThanOrEqual' |
20
+ 'greaterThan' | 'greaterThanOrEqual';
21
+
22
+ export type FilterType = SupportedFilterTypes;
23
+
24
+ export function isSupportedFilterType(type: FilterSpecType | undefined): type is SupportedFilterTypes {
25
+ if (!type) {
26
+ return false;
27
+ }
28
+ return SUPPORTED_FILTER_TYPES.has(type as SupportedFilterTypes);
29
+ }
30
+
31
+ export type Operand = 'or' | 'and';
32
+
33
+ type FilterUiBase = FilterSpecLeaf<PlAdvancedFilterColumnId> & {
34
+ type: SupportedFilterTypes;
35
+ column: PlAdvancedFilterColumnId;
36
+ };
37
+
38
+ type RequireFields<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
39
+ type OptionalFields<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
40
+
41
+ type NumericalWithOptionalX = 'lessThan' | 'lessThanOrEqual' | 'greaterThan' | 'greaterThanOrEqual' | 'equal' | 'notEqual';
42
+ type StringWithOptionalValue = 'patternEquals' | 'patternNotEquals';
43
+ type EditedTypes = SupportedFilterTypes & ('patternFuzzyContainSubsequence' | NumericalWithOptionalX | StringWithOptionalValue); // types from ui with some changed by optionality fields
44
+ export type Filter = Exclude<FilterUiBase, { type: EditedTypes }> |
45
+ RequireFields<Extract<FilterUiBase, { type: 'patternFuzzyContainSubsequence' }>, 'maxEdits' | 'substitutionsOnly'> |
46
+ OptionalFields<Extract<FilterUiBase, { type: NumericalWithOptionalX }>, 'x'> |
47
+ OptionalFields<Extract<FilterUiBase, { type: StringWithOptionalValue }>, 'value'>
48
+ ;
49
+
50
+ export type Group = {
51
+ id: string;
52
+ not: boolean;
53
+ filters: Filter[];
54
+ operand: Operand;
55
+ expanded: boolean;
56
+ };
57
+
58
+ export type PlAdvancedFilterUI = {
59
+ groups: Group[];
60
+ operand: Operand;
61
+ };
62
+
63
+ export type UniqueValuesList = ListOptionBase<string | number>[];
64
+ export type OptionInfo = { error: boolean; label: string; spec: PColumnSpec | AxisSpec };
65
+ export type FixedAxisInfo = {
66
+ idx: number;
67
+ label: string;
68
+ };
69
+
70
+ export type SourceOptionInfo = {
71
+ id: PlAdvancedFilterColumnId;
72
+ label: string;
73
+ error: boolean;
74
+ spec: PColumnSpec | AxisSpec;
75
+ axesToBeFixed?: FixedAxisInfo[];
76
+ alphabet?: 'nucleotide' | 'aminoacid' | string;
77
+ };
@@ -0,0 +1,215 @@
1
+ import type { AnchoredPColumnId, AxisId, CanonicalizedJson, FilteredPColumnId, ValueType } from '@platforma-sdk/model';
2
+ import { assertNever, getTypeFromPColumnOrAxisSpec, isAnchoredPColumnId, isFilteredPColumn, parseJson, type AxisSpec, type PColumnSpec, type SUniversalPColumnId } from '@platforma-sdk/model';
3
+ import { type CommonFilterSpec, isSupportedFilterType, type Filter, type FilterType, type Group, type PlAdvancedFilterUI, type SupportedFilterTypes, type PlAdvancedFilterColumnId } from './types';
4
+ import { DEFAULT_FILTER_TYPE, DEFAULT_FILTERS, SUPPORTED_FILTER_TYPES } from './constants';
5
+ import { filterUiMetadata } from '@milaboratories/uikit';
6
+ import { ref, watch, type ModelRef } from 'vue';
7
+ import { isAxisId } from '@platforma-sdk/model';
8
+
9
+ function toInnerFilter(outerFilter: CommonFilterSpec): Filter | null {
10
+ if (!('column' in outerFilter) || outerFilter.type === undefined || !isSupportedFilterType(outerFilter.type)) {
11
+ return null;
12
+ }
13
+ if (outerFilter.type === 'patternFuzzyContainSubsequence') {
14
+ return {
15
+ ...outerFilter,
16
+ value: outerFilter.value,
17
+ wildcard: outerFilter.wildcard,
18
+ maxEdits: outerFilter.maxEdits ?? 2,
19
+ substitutionsOnly: outerFilter.substitutionsOnly ?? false,
20
+ };
21
+ }
22
+
23
+ return { ...outerFilter } as Filter;
24
+ }
25
+
26
+ let groupIdCounter = 0;
27
+ function getNewGroupId() {
28
+ groupIdCounter++;
29
+ return String(groupIdCounter);
30
+ }
31
+
32
+ function toInnerFiltersGroup(f: CommonFilterSpec): Group | null {
33
+ if (f.type === 'not') {
34
+ const group = toInnerFiltersGroup(f.filter);
35
+ return group
36
+ ? {
37
+ not: !group.not,
38
+ operand: group.operand,
39
+ filters: group.filters,
40
+ id: getNewGroupId(),
41
+ expanded: group.expanded,
42
+ }
43
+ : null;
44
+ }
45
+ if (f.type === 'and' || f.type === 'or') {
46
+ return {
47
+ operand: f.type,
48
+ not: false,
49
+ filters: f.filters.map((f) => toInnerFilter(f)).filter((v) => v !== null) as Filter[],
50
+ id: getNewGroupId(),
51
+ expanded: f.expanded ?? true,
52
+ };
53
+ }
54
+ if (SUPPORTED_FILTER_TYPES.has(f.type as SupportedFilterTypes)) {
55
+ const filter = toInnerFilter(f);
56
+ return {
57
+ operand: 'or',
58
+ not: false,
59
+ filters: filter ? [filter] : [],
60
+ id: getNewGroupId(),
61
+ expanded: f.expanded ?? true,
62
+ };
63
+ }
64
+ return null;
65
+ }
66
+
67
+ export function toInnerModel(m: CommonFilterSpec): PlAdvancedFilterUI {
68
+ const res: PlAdvancedFilterUI = {
69
+ operand: 'or',
70
+ groups: [],
71
+ };
72
+ if (m.type === 'not') {
73
+ return res; // not supported 'not' for all the groups in ui
74
+ }
75
+ if (m.type === 'and' || m.type === 'or') {
76
+ // group
77
+ res.operand = m.type;
78
+ res.groups = m.filters.map(toInnerFiltersGroup).filter((v) => v !== null) as Group[];
79
+ } else if (SUPPORTED_FILTER_TYPES.has(m.type as SupportedFilterTypes)) {
80
+ // single filter
81
+ const group = toInnerFiltersGroup(m);
82
+ res.groups = group ? [group] : [];
83
+ }
84
+ res.groups = res.groups.filter((gr) => gr.filters.length > 0);
85
+ return res;
86
+ }
87
+
88
+ function toOuterFilter(filter: Filter): CommonFilterSpec | null {
89
+ if (
90
+ filter.type === 'isNA' || filter.type === 'isNotNA'
91
+ || filter.type === 'inSet' || filter.type === 'notInSet'
92
+ ) {
93
+ return filter;
94
+ }
95
+ if (
96
+ filter.type === 'greaterThanOrEqual' || filter.type === 'lessThanOrEqual'
97
+ || filter.type === 'greaterThan' || filter.type === 'lessThan'
98
+ || filter.type === 'equal' || filter.type === 'notEqual'
99
+ ) {
100
+ return filter.x !== undefined ? { ...filter, x: filter.x } : null;
101
+ }
102
+ if (
103
+ filter.type === 'patternEquals' || filter.type === 'patternNotEquals'
104
+ || filter.type === 'patternContainSubsequence' || filter.type === 'patternNotContainSubsequence'
105
+ || filter.type === 'patternMatchesRegularExpression'
106
+ || filter.type === 'patternFuzzyContainSubsequence'
107
+ ) {
108
+ return filter.value !== undefined ? { ...filter, value: filter.value } : null;
109
+ }
110
+ assertNever(filter.type);
111
+ }
112
+
113
+ function toOuterFilterGroup(m: Group): CommonFilterSpec {
114
+ const res: CommonFilterSpec = {
115
+ type: m.operand,
116
+ expanded: m.expanded,
117
+ filters: m.filters.map(toOuterFilter).filter((v): v is CommonFilterSpec => v !== null),
118
+ };
119
+ if (m.not) {
120
+ return {
121
+ type: 'not',
122
+ filter: res,
123
+ } as CommonFilterSpec;
124
+ }
125
+ return res;
126
+ }
127
+ export function toOuterModel(m: PlAdvancedFilterUI): CommonFilterSpec {
128
+ return {
129
+ type: m.operand,
130
+ filters: m.groups.map(toOuterFilterGroup),
131
+ };
132
+ }
133
+
134
+ export function createNewGroup(selectedSourceId: string) {
135
+ return {
136
+ id: getNewGroupId(),
137
+ not: false,
138
+ operand: 'and' as const,
139
+ expanded: true,
140
+ filters: [{
141
+ ...DEFAULT_FILTERS[DEFAULT_FILTER_TYPE],
142
+ column: selectedSourceId as SUniversalPColumnId,
143
+ }],
144
+ };
145
+ }
146
+
147
+ export type NormalizedSpecData = {
148
+ valueType: ValueType;
149
+ annotations: PColumnSpec['annotations'];
150
+ domain: PColumnSpec['domain'];
151
+ };
152
+ export function getNormalizedSpec(spec: PColumnSpec | AxisSpec): NormalizedSpecData {
153
+ return { valueType: getTypeFromPColumnOrAxisSpec(spec), annotations: spec.annotations, domain: spec.domain };
154
+ }
155
+
156
+ export function isNumericValueType(spec?: PColumnSpec | AxisSpec): boolean {
157
+ if (!spec) {
158
+ return false;
159
+ }
160
+ const valueType = getNormalizedSpec(spec).valueType;
161
+ return valueType === 'Int' || valueType === 'Long' || valueType === 'Float' || valueType === 'Double';
162
+ }
163
+
164
+ export function isStringValueType(spec?: PColumnSpec | AxisSpec): boolean {
165
+ if (!spec) {
166
+ return false;
167
+ }
168
+ const valueType = getNormalizedSpec(spec).valueType;
169
+ return valueType === 'String';
170
+ }
171
+
172
+ export function isNumericFilter(filter: Filter): filter is Filter & { type: 'equal' | 'notEqual' | 'lessThan' | 'lessThanOrEqual' | 'greaterThan' | 'greaterThanOrEqual' } {
173
+ return filter.type === 'equal' || filter.type === 'notEqual' || filter.type === 'lessThan' || filter.type === 'lessThanOrEqual' || filter.type === 'greaterThan' || filter.type === 'greaterThanOrEqual';
174
+ }
175
+ export function isStringFilter(filter: Filter): filter is Filter & { type: 'patternEquals' | 'patternNotEquals' | 'patternContainSubsequence' | 'patternNotContainSubsequence' | 'patternMatchesRegularExpression' | 'patternFuzzyContainSubsequence' } {
176
+ return filter.type === 'patternEquals' || filter.type === 'patternNotEquals' || filter.type === 'patternContainSubsequence' || filter.type === 'patternNotContainSubsequence' || filter.type === 'patternMatchesRegularExpression' || filter.type === 'patternFuzzyContainSubsequence';
177
+ }
178
+
179
+ export function getFilterInfo(filterType: FilterType): { label: string; supportedFor: (spec: NormalizedSpecData) => boolean } {
180
+ return filterUiMetadata[filterType as keyof typeof filterUiMetadata];
181
+ }
182
+
183
+ export function useInnerModel<T, V>(
184
+ toInnerModel: (v: T) => V,
185
+ toOuterModel: (v: V) => T,
186
+ model: ModelRef<T>,
187
+ ) {
188
+ const innerModel = ref<V>(toInnerModel(model.value));
189
+ function updateOuterModelValue(v: V) {
190
+ model.value = toOuterModel(v);
191
+ }
192
+ function updateInnerModelValue(v: T) {
193
+ innerModel.value = toInnerModel(v);
194
+ }
195
+ watch(() => model.value, (v: T) => {
196
+ updateInnerModelValue(v);
197
+ }, { deep: true });
198
+ watch(() => innerModel.value, (v: V) => {
199
+ updateOuterModelValue(v);
200
+ }, { deep: true });
201
+
202
+ return innerModel;
203
+ }
204
+
205
+ export function isValidColumnId(id: unknown): id is PlAdvancedFilterColumnId {
206
+ if (typeof id !== 'string') {
207
+ return false;
208
+ }
209
+ try {
210
+ const parsedId = parseJson<FilteredPColumnId | AnchoredPColumnId | AxisId>(id as CanonicalizedJson<FilteredPColumnId | AnchoredPColumnId | AxisId>);
211
+ return isFilteredPColumn(parsedId) || isAnchoredPColumnId(parsedId) || isAxisId(parsedId);
212
+ } catch {
213
+ return false;
214
+ }
215
+ }
package/src/lib.ts CHANGED
@@ -28,12 +28,12 @@ export * from './components/PlAgGridColumnManager';
28
28
 
29
29
  export * from './components/PlTableFilters';
30
30
 
31
- export * from './components/PlMultiSequenceAlignment';
32
-
33
31
  export * from './components/PlAnnotations';
34
32
 
35
33
  export * from './components/PlBtnExportArchive';
36
34
 
35
+ export * from './components/PlAdvancedFilter';
36
+
37
37
  export * from './defineApp';
38
38
 
39
39
  export * from './createModel';