@tcn/ui-table 1.0.5 → 2.1.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.
Files changed (143) hide show
  1. package/dist/__stories__/aip_table.stories.js +6 -6
  2. package/dist/__stories__/aip_table.stories.js.map +1 -1
  3. package/dist/__stories__/demo.stories.d.ts +6 -0
  4. package/dist/__stories__/demo.stories.js +95 -0
  5. package/dist/__stories__/demo.stories.js.map +1 -0
  6. package/dist/__stories__/sample_data.d.ts +16 -0
  7. package/dist/__stories__/sample_data.js +231 -1
  8. package/dist/__stories__/sample_data.js.map +1 -1
  9. package/dist/__stories__/table.stories.d.ts +1 -0
  10. package/dist/__stories__/table.stories.js +47 -10
  11. package/dist/__stories__/table.stories.js.map +1 -1
  12. package/dist/components/cells/data_cell.js.map +1 -0
  13. package/dist/components/cells/footer_cell.js.map +1 -0
  14. package/dist/components/cells/header_cell.js +19 -0
  15. package/dist/components/cells/header_cell.js.map +1 -0
  16. package/dist/components/cells/sticky_row_data_cell.js.map +1 -0
  17. package/dist/components/cells/sticky_row_fill_cell.js.map +1 -0
  18. package/dist/components/global_search.d.ts +8 -0
  19. package/dist/components/global_search.js +10 -0
  20. package/dist/components/global_search.js.map +1 -0
  21. package/dist/components/global_search_presenter.d.ts +11 -0
  22. package/dist/components/global_search_presenter.js +19 -0
  23. package/dist/components/global_search_presenter.js.map +1 -0
  24. package/dist/{_components → components}/table/table.d.ts +4 -6
  25. package/dist/{_components → components}/table/table.js +4 -4
  26. package/dist/components/table/table.js.map +1 -0
  27. package/dist/components/table/table_column.js.map +1 -0
  28. package/dist/components/table/table_presenter.js.map +1 -0
  29. package/dist/components/table/table_presenter.test.js.map +1 -0
  30. package/dist/components/table_filter_panel/field_filters/date_field_filter.d.ts +5 -0
  31. package/dist/components/table_filter_panel/field_filters/date_field_filter.js +34 -0
  32. package/dist/components/table_filter_panel/field_filters/date_field_filter.js.map +1 -0
  33. package/dist/components/table_filter_panel/field_filters/date_field_filter_presenter.d.ts +22 -0
  34. package/dist/components/table_filter_panel/field_filters/date_field_filter_presenter.js +93 -0
  35. package/dist/components/table_filter_panel/field_filters/date_field_filter_presenter.js.map +1 -0
  36. package/dist/components/table_filter_panel/field_filters/date_field_filter_presenter.test.d.ts +1 -0
  37. package/dist/components/table_filter_panel/field_filters/date_field_filter_presenter.test.js +434 -0
  38. package/dist/components/table_filter_panel/field_filters/date_field_filter_presenter.test.js.map +1 -0
  39. package/dist/components/table_filter_panel/field_filters/field_filter_props.d.ts +4 -0
  40. package/dist/components/table_filter_panel/field_filters/field_filter_props.js +2 -0
  41. package/dist/components/table_filter_panel/field_filters/field_filter_props.js.map +1 -0
  42. package/dist/components/table_filter_panel/field_filters/field_filter_strategy.d.ts +12 -0
  43. package/dist/components/table_filter_panel/field_filters/field_filter_strategy.js +2 -0
  44. package/dist/components/table_filter_panel/field_filters/field_filter_strategy.js.map +1 -0
  45. package/dist/components/table_filter_panel/field_filters/mulit_select_field_filter.d.ts +9 -0
  46. package/dist/components/table_filter_panel/field_filters/mulit_select_field_filter.js +30 -0
  47. package/dist/components/table_filter_panel/field_filters/mulit_select_field_filter.js.map +1 -0
  48. package/dist/components/table_filter_panel/field_filters/multi_select_field_filter_presenter.d.ts +20 -0
  49. package/dist/components/table_filter_panel/field_filters/multi_select_field_filter_presenter.js +72 -0
  50. package/dist/components/table_filter_panel/field_filters/multi_select_field_filter_presenter.js.map +1 -0
  51. package/dist/components/table_filter_panel/field_filters/multi_select_field_filter_presenter.test.d.ts +1 -0
  52. package/dist/components/table_filter_panel/field_filters/multi_select_field_filter_presenter.test.js +332 -0
  53. package/dist/components/table_filter_panel/field_filters/multi_select_field_filter_presenter.test.js.map +1 -0
  54. package/dist/components/table_filter_panel/field_filters/number_field_filter.d.ts +3 -0
  55. package/dist/components/table_filter_panel/field_filters/number_field_filter.js +24 -0
  56. package/dist/components/table_filter_panel/field_filters/number_field_filter.js.map +1 -0
  57. package/dist/components/table_filter_panel/field_filters/number_field_filter_presenter.d.ts +23 -0
  58. package/dist/components/table_filter_panel/field_filters/number_field_filter_presenter.js +60 -0
  59. package/dist/components/table_filter_panel/field_filters/number_field_filter_presenter.js.map +1 -0
  60. package/dist/components/table_filter_panel/field_filters/number_field_filter_presenter.test.d.ts +1 -0
  61. package/dist/components/table_filter_panel/field_filters/number_field_filter_presenter.test.js +347 -0
  62. package/dist/components/table_filter_panel/field_filters/number_field_filter_presenter.test.js.map +1 -0
  63. package/dist/components/table_filter_panel/field_filters/number_range_field_filter.d.ts +5 -0
  64. package/dist/components/table_filter_panel/field_filters/number_range_field_filter.js +32 -0
  65. package/dist/components/table_filter_panel/field_filters/number_range_field_filter.js.map +1 -0
  66. package/dist/components/table_filter_panel/field_filters/number_range_field_filter_presenter.d.ts +22 -0
  67. package/dist/components/table_filter_panel/field_filters/number_range_field_filter_presenter.js +93 -0
  68. package/dist/components/table_filter_panel/field_filters/number_range_field_filter_presenter.js.map +1 -0
  69. package/dist/components/table_filter_panel/field_filters/number_range_field_filter_presenter.test.d.ts +1 -0
  70. package/dist/components/table_filter_panel/field_filters/number_range_field_filter_presenter.test.js +452 -0
  71. package/dist/components/table_filter_panel/field_filters/number_range_field_filter_presenter.test.js.map +1 -0
  72. package/dist/components/table_filter_panel/field_filters/select_field_filter.d.ts +9 -0
  73. package/dist/components/table_filter_panel/field_filters/select_field_filter.js +25 -0
  74. package/dist/components/table_filter_panel/field_filters/select_field_filter.js.map +1 -0
  75. package/dist/components/table_filter_panel/field_filters/select_field_filter_presenter.d.ts +20 -0
  76. package/dist/components/table_filter_panel/field_filters/select_field_filter_presenter.js +55 -0
  77. package/dist/components/table_filter_panel/field_filters/select_field_filter_presenter.js.map +1 -0
  78. package/dist/components/table_filter_panel/field_filters/select_field_filter_presenter.test.d.ts +1 -0
  79. package/dist/components/table_filter_panel/field_filters/select_field_filter_presenter.test.js +285 -0
  80. package/dist/components/table_filter_panel/field_filters/select_field_filter_presenter.test.js.map +1 -0
  81. package/dist/components/table_filter_panel/field_filters/string_field_filter.d.ts +3 -0
  82. package/dist/components/table_filter_panel/field_filters/string_field_filter.js +29 -0
  83. package/dist/components/table_filter_panel/field_filters/string_field_filter.js.map +1 -0
  84. package/dist/components/table_filter_panel/field_filters/string_field_filter_presenter.d.ts +24 -0
  85. package/dist/components/table_filter_panel/field_filters/string_field_filter_presenter.js +61 -0
  86. package/dist/components/table_filter_panel/field_filters/string_field_filter_presenter.js.map +1 -0
  87. package/dist/components/table_filter_panel/field_filters/string_field_filter_presenter.test.d.ts +1 -0
  88. package/dist/components/table_filter_panel/field_filters/string_field_filter_presenter.test.js +232 -0
  89. package/dist/components/table_filter_panel/field_filters/string_field_filter_presenter.test.js.map +1 -0
  90. package/dist/components/table_filter_panel/field_filters/use_field_filter_strategy.d.ts +4 -0
  91. package/dist/components/table_filter_panel/field_filters/use_field_filter_strategy.js +20 -0
  92. package/dist/components/table_filter_panel/field_filters/use_field_filter_strategy.js.map +1 -0
  93. package/dist/components/table_filter_panel/table_filter_panel.d.ts +10 -0
  94. package/dist/components/table_filter_panel/table_filter_panel.js +12 -0
  95. package/dist/components/table_filter_panel/table_filter_panel.js.map +1 -0
  96. package/dist/components/table_filter_panel/table_filter_panel.stories.d.ts +6 -0
  97. package/dist/components/table_filter_panel/table_filter_panel.stories.js +25 -0
  98. package/dist/components/table_filter_panel/table_filter_panel.stories.js.map +1 -0
  99. package/dist/components/table_filter_panel/table_filter_panel_presenter.d.ts +15 -0
  100. package/dist/components/table_filter_panel/table_filter_panel_presenter.js +63 -0
  101. package/dist/components/table_filter_panel/table_filter_panel_presenter.js.map +1 -0
  102. package/dist/components/table_filter_panel/types.d.ts +2 -0
  103. package/dist/components/table_filter_panel/types.js +2 -0
  104. package/dist/components/table_filter_panel/types.js.map +1 -0
  105. package/dist/{_components → components}/table_pager.js +7 -3
  106. package/dist/components/table_pager.js.map +1 -0
  107. package/dist/index.d.ts +14 -4
  108. package/dist/index.js +12 -4
  109. package/dist/index.js.map +1 -1
  110. package/package.json +12 -9
  111. package/dist/_components/cells/data_cell.js.map +0 -1
  112. package/dist/_components/cells/footer_cell.js.map +0 -1
  113. package/dist/_components/cells/header_cell.js +0 -20
  114. package/dist/_components/cells/header_cell.js.map +0 -1
  115. package/dist/_components/cells/sticky_row_data_cell.js.map +0 -1
  116. package/dist/_components/cells/sticky_row_fill_cell.js.map +0 -1
  117. package/dist/_components/table/table.js.map +0 -1
  118. package/dist/_components/table/table_column.js.map +0 -1
  119. package/dist/_components/table/table_presenter.js.map +0 -1
  120. package/dist/_components/table/table_presenter.test.js.map +0 -1
  121. package/dist/_components/table_pager.js.map +0 -1
  122. package/dist/_components/table_search.d.ts +0 -8
  123. package/dist/_components/table_search.js +0 -8
  124. package/dist/_components/table_search.js.map +0 -1
  125. /package/dist/{_components → components}/cells/cell.module.css +0 -0
  126. /package/dist/{_components → components}/cells/data_cell.d.ts +0 -0
  127. /package/dist/{_components → components}/cells/data_cell.js +0 -0
  128. /package/dist/{_components → components}/cells/footer_cell.d.ts +0 -0
  129. /package/dist/{_components → components}/cells/footer_cell.js +0 -0
  130. /package/dist/{_components → components}/cells/header_cell.d.ts +0 -0
  131. /package/dist/{_components → components}/cells/sticky_row_data_cell.d.ts +0 -0
  132. /package/dist/{_components → components}/cells/sticky_row_data_cell.js +0 -0
  133. /package/dist/{_components → components}/cells/sticky_row_fill_cell.d.ts +0 -0
  134. /package/dist/{_components → components}/cells/sticky_row_fill_cell.js +0 -0
  135. /package/dist/{_components → components}/table/table.module.css +0 -0
  136. /package/dist/{_components → components}/table/table_column.d.ts +0 -0
  137. /package/dist/{_components → components}/table/table_column.js +0 -0
  138. /package/dist/{_components → components}/table/table_presenter.d.ts +0 -0
  139. /package/dist/{_components → components}/table/table_presenter.js +0 -0
  140. /package/dist/{_components → components}/table/table_presenter.test.d.ts +0 -0
  141. /package/dist/{_components → components}/table/table_presenter.test.js +0 -0
  142. /package/dist/{_components → components}/table_pager.d.ts +0 -0
  143. /package/dist/{_components → components}/table_pager.module.css +0 -0
@@ -0,0 +1,347 @@
1
+ import { NumberFieldFilterPresenter } from "./number_field_filter_presenter.js";
2
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
3
+ describe('NumberFieldFilterPresenter', () => {
4
+ let presenter;
5
+ let mockFieldRegistry;
6
+ beforeEach(() => {
7
+ presenter = new NumberFieldFilterPresenter('test_field');
8
+ mockFieldRegistry = {
9
+ registerFieldFilter: vi.fn(),
10
+ unregisterFieldFilter: vi.fn(),
11
+ };
12
+ });
13
+ describe('constructor', () => {
14
+ it('should initialize with the correct field name', () => {
15
+ const presenter = new NumberFieldFilterPresenter('custom_field');
16
+ expect(presenter.getFilterString()).toBe('');
17
+ });
18
+ it('should initialize with default values', () => {
19
+ expect(presenter.getFilterString()).toBe('');
20
+ });
21
+ });
22
+ describe('setValue', () => {
23
+ it('should set the value when setValue is called with a number', () => {
24
+ presenter.setValue(42);
25
+ presenter.setOperator('=');
26
+ expect(presenter.getFilterString()).toBe('test_field = 42');
27
+ });
28
+ it('should set the value when setValue is called with null', () => {
29
+ presenter.setValue(42);
30
+ presenter.setValue(null);
31
+ expect(presenter.getFilterString()).toBe('');
32
+ });
33
+ it('should handle zero values', () => {
34
+ presenter.setValue(0);
35
+ presenter.setOperator('=');
36
+ expect(presenter.getFilterString()).toBe('test_field = 0');
37
+ });
38
+ it('should handle negative values', () => {
39
+ presenter.setValue(-42);
40
+ presenter.setOperator('>');
41
+ expect(presenter.getFilterString()).toBe('test_field > -42');
42
+ });
43
+ it('should handle decimal values', () => {
44
+ presenter.setValue(3.14);
45
+ presenter.setOperator('>=');
46
+ expect(presenter.getFilterString()).toBe('test_field >= 3.14');
47
+ });
48
+ it('should trigger onChange handlers when value is set', () => {
49
+ const onChangeHandler = vi.fn();
50
+ presenter.onChange(onChangeHandler);
51
+ presenter.setValue(42);
52
+ expect(onChangeHandler).toHaveBeenCalledTimes(1);
53
+ });
54
+ });
55
+ describe('setOperator', () => {
56
+ it('should set the operator when setOperator is called', () => {
57
+ presenter.setValue(42);
58
+ presenter.setOperator('>');
59
+ expect(presenter.getFilterString()).toBe('test_field > 42');
60
+ });
61
+ it('should work with all comparison operators', () => {
62
+ const operators = ['>=', '>', '<=', '<', '=', ':', '!='];
63
+ presenter.setValue(42);
64
+ operators.forEach(operator => {
65
+ presenter.setOperator(operator);
66
+ expect(presenter.getFilterString()).toBe(`test_field ${operator} 42`);
67
+ });
68
+ });
69
+ it('should trigger onChange handlers when operator is set', () => {
70
+ const onChangeHandler = vi.fn();
71
+ presenter.onChange(onChangeHandler);
72
+ presenter.setOperator('>');
73
+ expect(onChangeHandler).toHaveBeenCalledTimes(1);
74
+ });
75
+ });
76
+ describe('getFilterString', () => {
77
+ it('should return empty string when value is null', () => {
78
+ expect(presenter.getFilterString()).toBe('');
79
+ });
80
+ it('should return empty string when value is set to null', () => {
81
+ presenter.setValue(42);
82
+ presenter.setValue(null);
83
+ expect(presenter.getFilterString()).toBe('');
84
+ });
85
+ it('should return formatted filter string with value and operator', () => {
86
+ presenter.setValue(42);
87
+ presenter.setOperator('=');
88
+ expect(presenter.getFilterString()).toBe('test_field = 42');
89
+ });
90
+ it('should handle zero values correctly', () => {
91
+ presenter.setValue(0);
92
+ presenter.setOperator('=');
93
+ expect(presenter.getFilterString()).toBe('test_field = 0');
94
+ });
95
+ it('should handle negative values correctly', () => {
96
+ presenter.setValue(-42);
97
+ presenter.setOperator('>');
98
+ expect(presenter.getFilterString()).toBe('test_field > -42');
99
+ });
100
+ it('should handle decimal values correctly', () => {
101
+ presenter.setValue(3.14159);
102
+ presenter.setOperator('>=');
103
+ expect(presenter.getFilterString()).toBe('test_field >= 3.14159');
104
+ });
105
+ it('should handle large numbers', () => {
106
+ presenter.setValue(1000000);
107
+ presenter.setOperator('<');
108
+ expect(presenter.getFilterString()).toBe('test_field < 1000000');
109
+ });
110
+ });
111
+ describe('onChange', () => {
112
+ it('should register onChange handler and return unsubscribe function', () => {
113
+ const onChangeHandler = vi.fn();
114
+ const unsubscribe = presenter.onChange(onChangeHandler);
115
+ presenter.setValue(42);
116
+ expect(onChangeHandler).toHaveBeenCalledTimes(1);
117
+ unsubscribe();
118
+ presenter.setValue(100);
119
+ expect(onChangeHandler).toHaveBeenCalledTimes(1); // Should not be called again
120
+ });
121
+ it('should handle multiple onChange handlers', () => {
122
+ const handler1 = vi.fn();
123
+ const handler2 = vi.fn();
124
+ presenter.onChange(handler1);
125
+ presenter.onChange(handler2);
126
+ presenter.setValue(42);
127
+ expect(handler1).toHaveBeenCalledTimes(1);
128
+ expect(handler2).toHaveBeenCalledTimes(1);
129
+ });
130
+ it('should handle removing onChange handlers', () => {
131
+ const handler1 = vi.fn();
132
+ const handler2 = vi.fn();
133
+ const unsubscribe1 = presenter.onChange(handler1);
134
+ presenter.onChange(handler2);
135
+ unsubscribe1();
136
+ presenter.setValue(42);
137
+ expect(handler1).not.toHaveBeenCalled();
138
+ expect(handler2).toHaveBeenCalledTimes(1);
139
+ });
140
+ });
141
+ describe('setFieldRegistry', () => {
142
+ it('should register the field filter with the registry', () => {
143
+ presenter.setFieldRegistry(mockFieldRegistry);
144
+ expect(mockFieldRegistry.registerFieldFilter).toHaveBeenCalledWith('test_field', presenter);
145
+ });
146
+ it('should store the field registry reference', () => {
147
+ presenter.setFieldRegistry(mockFieldRegistry);
148
+ // Test that dispose can call unregisterFieldFilter
149
+ presenter.dispose();
150
+ expect(mockFieldRegistry.unregisterFieldFilter).toHaveBeenCalledWith('test_field');
151
+ });
152
+ });
153
+ describe('setFilterState', () => {
154
+ it('should parse filter AST and set operator and value', () => {
155
+ // Create a mock AST node structure
156
+ const mockAst = {
157
+ findAll: vi.fn().mockReturnValue([
158
+ {
159
+ name: 'plain-field',
160
+ value: 'test_field',
161
+ parent: {
162
+ name: 'infix-expression',
163
+ children: [
164
+ { name: 'plain-field', value: 'test_field' },
165
+ { name: 'operator', value: '=' },
166
+ { name: 'number', value: '42' },
167
+ ],
168
+ },
169
+ },
170
+ ]),
171
+ };
172
+ presenter.setFilterState(mockAst);
173
+ expect(presenter.getFilterString()).toBe('test_field = 42');
174
+ });
175
+ it('should handle case when field is not found in AST', () => {
176
+ const mockAst = {
177
+ findAll: vi.fn().mockReturnValue([]),
178
+ };
179
+ presenter.setValue(42);
180
+ presenter.setOperator('>');
181
+ presenter.setFilterState(mockAst);
182
+ // Should not change existing state
183
+ expect(presenter.getFilterString()).toBe('test_field > 42');
184
+ });
185
+ it('should handle case when field node has no parent', () => {
186
+ const mockAst = {
187
+ findAll: vi.fn().mockReturnValue([
188
+ {
189
+ name: 'plain-field',
190
+ value: 'test_field',
191
+ parent: null,
192
+ },
193
+ ]),
194
+ };
195
+ presenter.setValue(42);
196
+ presenter.setOperator('>');
197
+ presenter.setFilterState(mockAst);
198
+ // Should not change existing state
199
+ expect(presenter.getFilterString()).toBe('test_field > 42');
200
+ });
201
+ it('should parse numeric values from AST', () => {
202
+ const mockAst = {
203
+ findAll: vi.fn().mockReturnValue([
204
+ {
205
+ name: 'plain-field',
206
+ value: 'test_field',
207
+ parent: {
208
+ name: 'infix-expression',
209
+ children: [
210
+ { name: 'plain-field', value: 'test_field' },
211
+ { name: 'operator', value: '!=' },
212
+ { name: 'number', value: '100' },
213
+ ],
214
+ },
215
+ },
216
+ ]),
217
+ };
218
+ presenter.setFilterState(mockAst);
219
+ expect(presenter.getFilterString()).toBe('test_field != 100');
220
+ });
221
+ it('should handle decimal values from AST', () => {
222
+ const mockAst = {
223
+ findAll: vi.fn().mockReturnValue([
224
+ {
225
+ name: 'plain-field',
226
+ value: 'test_field',
227
+ parent: {
228
+ name: 'infix-expression',
229
+ children: [
230
+ { name: 'plain-field', value: 'test_field' },
231
+ { name: 'operator', value: '>=' },
232
+ { name: 'number', value: '3.14' },
233
+ ],
234
+ },
235
+ },
236
+ ]),
237
+ };
238
+ presenter.setFilterState(mockAst);
239
+ expect(presenter.getFilterString()).toBe('test_field >= 3.14');
240
+ });
241
+ it('should handle negative values from AST', () => {
242
+ const mockAst = {
243
+ findAll: vi.fn().mockReturnValue([
244
+ {
245
+ name: 'plain-field',
246
+ value: 'test_field',
247
+ parent: {
248
+ name: 'infix-expression',
249
+ children: [
250
+ { name: 'plain-field', value: 'test_field' },
251
+ { name: 'operator', value: '<' },
252
+ { name: 'number', value: '-42' },
253
+ ],
254
+ },
255
+ },
256
+ ]),
257
+ };
258
+ presenter.setFilterState(mockAst);
259
+ expect(presenter.getFilterString()).toBe('test_field < -42');
260
+ });
261
+ it('should handle zero values from AST', () => {
262
+ const mockAst = {
263
+ findAll: vi.fn().mockReturnValue([
264
+ {
265
+ name: 'plain-field',
266
+ value: 'test_field',
267
+ parent: {
268
+ name: 'infix-expression',
269
+ children: [
270
+ { name: 'plain-field', value: 'test_field' },
271
+ { name: 'operator', value: '=' },
272
+ { name: 'number', value: '0' },
273
+ ],
274
+ },
275
+ },
276
+ ]),
277
+ };
278
+ presenter.setFilterState(mockAst);
279
+ expect(presenter.getFilterString()).toBe('test_field = 0');
280
+ });
281
+ });
282
+ describe('dispose', () => {
283
+ it('should unregister field filter from registry when registry is set', () => {
284
+ presenter.setFieldRegistry(mockFieldRegistry);
285
+ presenter.dispose();
286
+ expect(mockFieldRegistry.unregisterFieldFilter).toHaveBeenCalledWith('test_field');
287
+ });
288
+ it('should not call unregisterFieldFilter when no registry is set', () => {
289
+ presenter.dispose();
290
+ expect(mockFieldRegistry.unregisterFieldFilter).not.toHaveBeenCalled();
291
+ });
292
+ it('should clear onChange handlers', () => {
293
+ const onChangeHandler = vi.fn();
294
+ presenter.onChange(onChangeHandler);
295
+ presenter.dispose();
296
+ presenter.setValue(42);
297
+ expect(onChangeHandler).not.toHaveBeenCalled();
298
+ });
299
+ });
300
+ describe('edge cases and error handling', () => {
301
+ it('should handle rapid successive value changes', () => {
302
+ const onChangeHandler = vi.fn();
303
+ presenter.onChange(onChangeHandler);
304
+ presenter.setValue(10);
305
+ presenter.setValue(20);
306
+ presenter.setValue(30);
307
+ expect(onChangeHandler).toHaveBeenCalledTimes(3);
308
+ expect(presenter.getFilterString()).toBe('test_field = 30');
309
+ });
310
+ it('should handle rapid successive operator changes', () => {
311
+ const onChangeHandler = vi.fn();
312
+ presenter.onChange(onChangeHandler);
313
+ presenter.setValue(42);
314
+ presenter.setOperator('=');
315
+ presenter.setOperator('>');
316
+ presenter.setOperator('!=');
317
+ expect(onChangeHandler).toHaveBeenCalledTimes(4); // 1 for value + 3 for operators
318
+ expect(presenter.getFilterString()).toBe('test_field != 42');
319
+ });
320
+ it('should handle very large numbers', () => {
321
+ presenter.setValue(Number.MAX_SAFE_INTEGER);
322
+ presenter.setOperator('>');
323
+ expect(presenter.getFilterString()).toBe(`test_field > ${Number.MAX_SAFE_INTEGER}`);
324
+ });
325
+ it('should handle very small numbers', () => {
326
+ presenter.setValue(Number.MIN_SAFE_INTEGER);
327
+ presenter.setOperator('<');
328
+ expect(presenter.getFilterString()).toBe(`test_field < ${Number.MIN_SAFE_INTEGER}`);
329
+ });
330
+ it('should handle NaN values gracefully', () => {
331
+ presenter.setValue(NaN);
332
+ presenter.setOperator('=');
333
+ expect(presenter.getFilterString()).toBe('test_field = NaN');
334
+ });
335
+ it('should handle Infinity values', () => {
336
+ presenter.setValue(Infinity);
337
+ presenter.setOperator('>');
338
+ expect(presenter.getFilterString()).toBe('test_field > Infinity');
339
+ });
340
+ it('should handle negative Infinity values', () => {
341
+ presenter.setValue(-Infinity);
342
+ presenter.setOperator('<');
343
+ expect(presenter.getFilterString()).toBe('test_field < -Infinity');
344
+ });
345
+ });
346
+ });
347
+ //# sourceMappingURL=number_field_filter_presenter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number_field_filter_presenter.test.js","sourceRoot":"","sources":["../../../../src/components/table_filter_panel/field_filters/number_field_filter_presenter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export declare function NumberRangeFieldFilter({ fieldName, label, }: {
3
+ fieldName: string;
4
+ label: string;
5
+ }): React.JSX.Element;
@@ -0,0 +1,32 @@
1
+ import { CrossCircleIcon } from '@tcn/icons/cross_circle_icon';
2
+ import { useSignalValue } from '@tcn/state';
3
+ import { Button } from '@tcn/ui-actions';
4
+ import { Input } from '@tcn/ui-inputs';
5
+ import { Box, HStack, VStack } from '@tcn/ui-layout';
6
+ import { BodyText, Title } from '@tcn/ui-typography';
7
+ import React from 'react';
8
+ import { useFieldFilterStrategy } from "./use_field_filter_strategy.js";
9
+ import { NumberRangeFieldFilterPresenter } from './number_range_field_filter_presenter.js';
10
+ export function NumberRangeFieldFilter({ fieldName, label, }) {
11
+ const presenter = useFieldFilterStrategy(NumberRangeFieldFilterPresenter, fieldName);
12
+ const minValue = useSignalValue(presenter.broadcasts.minValue);
13
+ const maxValue = useSignalValue(presenter.broadcasts.maxValue);
14
+ return (React.createElement(VStack, { gap: "4px" },
15
+ React.createElement(Box, { width: "flex" },
16
+ React.createElement(Title, { size: "md" }, label)),
17
+ React.createElement(HStack, { gap: "4px" },
18
+ React.createElement(Box, { width: "auto" },
19
+ React.createElement(BodyText, { size: "lg" }, "Min")),
20
+ React.createElement(Box, { width: "flex" },
21
+ React.createElement(Input, { type: "number", value: String(minValue ?? ''), onChange: value => presenter.setMinValue(Number(value)) })),
22
+ React.createElement(Button, { onClick: () => presenter.setMinValue(null), hierarchy: "tertiary", disabled: minValue == null },
23
+ React.createElement(CrossCircleIcon, null))),
24
+ React.createElement(HStack, { gap: "4px" },
25
+ React.createElement(Box, { width: "auto" },
26
+ React.createElement(BodyText, { size: "lg" }, "Max")),
27
+ React.createElement(Box, { width: "flex" },
28
+ React.createElement(Input, { type: "number", value: String(maxValue ?? ''), onChange: value => presenter.setMaxValue(Number(value)) })),
29
+ React.createElement(Button, { onClick: () => presenter.setMaxValue(null), hierarchy: "tertiary", disabled: maxValue == null },
30
+ React.createElement(CrossCircleIcon, null)))));
31
+ }
32
+ //# sourceMappingURL=number_range_field_filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number_range_field_filter.js","sourceRoot":"","sources":["../../../../src/components/table_filter_panel/field_filters/number_range_field_filter.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,uCAAqF;AACtH,OAAO,EAAE,+BAA+B,EAAE,MAAM,0CAA0C,CAAC;AAE3F,MAAM,UAAU,sBAAsB,CAAC,EACrC,SAAS,EACT,KAAK,GACgC;IACrC,MAAM,SAAS,GAAG,sBAAsB,CAAC,+BAA+B,EAAE,SAAS,CAAC,CAAC;IAErF,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAE/D,OAAO,CACL,oBAAC,MAAM,IAAC,GAAG,EAAC,KAAK;QACf,oBAAC,GAAG,IAAC,KAAK,EAAC,MAAM;YACf,oBAAC,KAAK,IAAC,IAAI,EAAC,IAAI,IAAE,KAAK,CAAS,CAC5B;QACN,oBAAC,MAAM,IAAC,GAAG,EAAC,KAAK;YACf,oBAAC,GAAG,IAAC,KAAK,EAAC,MAAM;gBACf,oBAAC,QAAQ,IAAC,IAAI,EAAC,IAAI,UAAe,CAC9B;YACN,oBAAC,GAAG,IAAC,KAAK,EAAC,MAAM;gBACf,oBAAC,KAAK,IACJ,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,EAC7B,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GACvD,CACE;YACN,oBAAC,MAAM,IACL,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,EAC1C,SAAS,EAAC,UAAU,EACpB,QAAQ,EAAE,QAAQ,IAAI,IAAI;gBAE1B,oBAAC,eAAe,OAAG,CACZ,CACF;QACT,oBAAC,MAAM,IAAC,GAAG,EAAC,KAAK;YACf,oBAAC,GAAG,IAAC,KAAK,EAAC,MAAM;gBACf,oBAAC,QAAQ,IAAC,IAAI,EAAC,IAAI,UAAe,CAC9B;YACN,oBAAC,GAAG,IAAC,KAAK,EAAC,MAAM;gBACf,oBAAC,KAAK,IACJ,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,EAC7B,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GACvD,CACE;YACN,oBAAC,MAAM,IACL,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,EAC1C,SAAS,EAAC,UAAU,EACpB,QAAQ,EAAE,QAAQ,IAAI,IAAI;gBAE1B,oBAAC,eAAe,OAAG,CACZ,CACF,CACF,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Node } from 'clarity-pattern-parser';
2
+ import { FieldFilterRegistry, FieldFilterStrategy } from "./field_filter_strategy.js";
3
+ export declare class NumberRangeFieldFilterPresenter implements FieldFilterStrategy {
4
+ private _fieldName;
5
+ private _fieldFilterRegistry;
6
+ private _minValue;
7
+ private _maxValue;
8
+ private _onChangeHandlers;
9
+ private _broadcasts;
10
+ constructor(fieldName: string);
11
+ get broadcasts(): {
12
+ minValue: import("@tcn/state").IBroadcast<number | null>;
13
+ maxValue: import("@tcn/state").IBroadcast<number | null>;
14
+ };
15
+ getFilterString(): string;
16
+ onChange(handler: () => void): () => void;
17
+ setMinValue(minValue: number | null): void;
18
+ setMaxValue(maxValue: number | null): void;
19
+ setFieldRegistry(fieldRegistry: FieldFilterRegistry): void;
20
+ setFilterState(filterAst: Node): void;
21
+ dispose(): void;
22
+ }
@@ -0,0 +1,93 @@
1
+ import { Signal } from '@tcn/state';
2
+ export class NumberRangeFieldFilterPresenter {
3
+ _fieldName;
4
+ _fieldFilterRegistry = null;
5
+ _minValue = new Signal(null);
6
+ _maxValue = new Signal(null);
7
+ _onChangeHandlers = new Set();
8
+ _broadcasts = {
9
+ minValue: this._minValue.broadcast,
10
+ maxValue: this._maxValue.broadcast,
11
+ };
12
+ constructor(fieldName) {
13
+ this._fieldName = fieldName;
14
+ }
15
+ get broadcasts() {
16
+ return this._broadcasts;
17
+ }
18
+ getFilterString() {
19
+ const minValue = this._minValue.get();
20
+ const maxValue = this._maxValue.get();
21
+ if (minValue !== null && maxValue !== null) {
22
+ return `(${this._fieldName} >= ${minValue} AND ${this._fieldName} <= ${maxValue})`;
23
+ }
24
+ else if (minValue !== null) {
25
+ return `${this._fieldName} >= ${minValue}`;
26
+ }
27
+ else if (maxValue !== null) {
28
+ return `${this._fieldName} <= ${maxValue}`;
29
+ }
30
+ return '';
31
+ }
32
+ onChange(handler) {
33
+ this._onChangeHandlers.add(handler);
34
+ return () => {
35
+ this._onChangeHandlers.delete(handler);
36
+ };
37
+ }
38
+ setMinValue(minValue) {
39
+ this._minValue.set(minValue);
40
+ this._onChangeHandlers.forEach(handler => handler());
41
+ }
42
+ setMaxValue(maxValue) {
43
+ this._maxValue.set(maxValue);
44
+ this._onChangeHandlers.forEach(handler => handler());
45
+ }
46
+ setFieldRegistry(fieldRegistry) {
47
+ this._fieldFilterRegistry = fieldRegistry;
48
+ fieldRegistry.registerFieldFilter(this._fieldName, this);
49
+ }
50
+ setFilterState(filterAst) {
51
+ const fieldNodes = filterAst.findAll(n => n.name === 'plain-field' && n.value === this._fieldName);
52
+ if (fieldNodes.length === 0) {
53
+ return;
54
+ }
55
+ if (fieldNodes.length === 1) {
56
+ const operatorNode = fieldNodes[0].parent?.children[1];
57
+ const valueNode = fieldNodes[0].parent?.children[2];
58
+ if (operatorNode?.value === '>=' && valueNode != null) {
59
+ this.setMinValue(Number(valueNode?.value));
60
+ }
61
+ else if (operatorNode?.value === '<=' && valueNode != null) {
62
+ this.setMaxValue(Number(valueNode?.value));
63
+ }
64
+ return;
65
+ }
66
+ if (fieldNodes.length === 2) {
67
+ const operatorOneNode = fieldNodes[0].parent?.children[1];
68
+ const operatorTwoNode = fieldNodes[1].parent?.children[1];
69
+ const valueOneNode = fieldNodes[0].parent?.children[2];
70
+ const valueTwoNode = fieldNodes[1].parent?.children[2];
71
+ if (operatorOneNode?.value === '>=' &&
72
+ operatorTwoNode?.value === '<=' &&
73
+ valueOneNode != null &&
74
+ valueTwoNode != null) {
75
+ this.setMinValue(Number(valueOneNode?.value));
76
+ this.setMaxValue(Number(valueTwoNode?.value));
77
+ }
78
+ else if (operatorOneNode?.value === '<=' &&
79
+ operatorTwoNode?.value === '>=' &&
80
+ valueOneNode != null &&
81
+ valueTwoNode != null) {
82
+ this.setMaxValue(Number(valueOneNode?.value));
83
+ this.setMinValue(Number(valueTwoNode?.value));
84
+ }
85
+ }
86
+ }
87
+ dispose() {
88
+ this._fieldFilterRegistry?.unregisterFieldFilter(this._fieldName);
89
+ this._fieldFilterRegistry = null;
90
+ this._onChangeHandlers.clear();
91
+ }
92
+ }
93
+ //# sourceMappingURL=number_range_field_filter_presenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number_range_field_filter_presenter.js","sourceRoot":"","sources":["../../../../src/components/table_filter_panel/field_filters/number_range_field_filter_presenter.ts"],"names":[],"mappings":"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"}