@zeedhi/teknisa-components-common 1.117.1 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/.package.json +43 -0
  2. package/dist/teknisa-components-common.js +3802 -0
  3. package/dist/teknisa-components-common.min.js +3802 -0
  4. package/dist/types/components/index.d.ts +7 -0
  5. package/{types → dist/types}/components/tek-breadcrumb-header/breadcrumb-header.d.ts +12 -12
  6. package/{types → dist/types}/components/tek-breadcrumb-header/interfaces.d.ts +6 -6
  7. package/dist/types/components/tek-datasource/index.d.ts +3 -0
  8. package/{types → dist/types}/components/tek-datasource/interfaces.d.ts +16 -16
  9. package/{types/components/tek-datasource/memory-datasource.d.ts → dist/types/components/tek-datasource/tek-memory-datasource.d.ts} +93 -100
  10. package/{types/components/tek-datasource/rest-datasource.d.ts → dist/types/components/tek-datasource/tek-rest-datasource.d.ts} +95 -103
  11. package/dist/types/components/tek-grid/columns-searcher.d.ts +5 -0
  12. package/dist/types/components/tek-grid/dynamic-filter-datasource-factory.d.ts +6 -0
  13. package/{types → dist/types}/components/tek-grid/filter-helper.d.ts +7 -7
  14. package/{types → dist/types}/components/tek-grid/grid-filter-button.d.ts +29 -31
  15. package/dist/types/components/tek-grid/grouped-data-manager.d.ts +82 -0
  16. package/dist/types/components/tek-grid/grouped-data-selector.d.ts +7 -0
  17. package/dist/types/components/tek-grid/grouped-view-navigator.d.ts +14 -0
  18. package/dist/types/components/tek-grid/index.d.ts +18 -0
  19. package/dist/types/components/tek-grid/interfaces.d.ts +259 -0
  20. package/dist/types/components/tek-grid/keymap-grouped.d.ts +6 -0
  21. package/{types → dist/types}/components/tek-grid/layout-options.d.ts +39 -31
  22. package/{types/components/tek-grid/grid-column.d.ts → dist/types/components/tek-grid/tek-grid-column.d.ts} +42 -45
  23. package/{types/components/tek-grid/grid-columns-button-controller.d.ts → dist/types/components/tek-grid/tek-grid-columns-button/tek-grid-columns-button-controller.d.ts} +8 -8
  24. package/{types/components/tek-grid/grid-columns-button.d.ts → dist/types/components/tek-grid/tek-grid-columns-button/tek-grid-columns-button.d.ts} +13 -12
  25. package/dist/types/components/tek-grid/tek-grid-controller.d.ts +31 -0
  26. package/dist/types/components/tek-grid/tek-grid-events.d.ts +31 -0
  27. package/{types/utils/grid-base → dist/types/components/tek-grid/tek-grid-toolbar-provider}/export-options/button-option.d.ts +17 -16
  28. package/{types/utils/grid-base → dist/types/components/tek-grid/tek-grid-toolbar-provider}/export-options/index.d.ts +3 -3
  29. package/dist/types/components/tek-grid/tek-grid-toolbar-provider/export-options/interfaces.d.ts +5 -0
  30. package/{types/utils/grid-base → dist/types/components/tek-grid/tek-grid-toolbar-provider}/export-options/multi-option.d.ts +12 -12
  31. package/dist/types/components/tek-grid/tek-grid-toolbar-provider/index.d.ts +2 -0
  32. package/dist/types/components/tek-grid/tek-grid-toolbar-provider/tek-grid-toolbar-provider.d.ts +22 -0
  33. package/dist/types/components/tek-grid/tek-grid.d.ts +216 -0
  34. package/{types → dist/types}/components/tek-user-info/TekUserInfoController.d.ts +22 -21
  35. package/{types → dist/types}/components/tek-user-info/interfaces.d.ts +27 -28
  36. package/{types → dist/types}/components/tek-user-info/tek-user-info-list.d.ts +32 -31
  37. package/{types → dist/types}/components/tek-user-info/tek-user-info.d.ts +37 -38
  38. package/{types → dist/types}/error/delete-rows-error.d.ts +6 -6
  39. package/dist/types/error/tek-grid-delete-rows-error.d.ts +7 -0
  40. package/dist/types/error/teknisa-common-error.d.ts +6 -0
  41. package/dist/types/index.d.ts +2 -0
  42. package/{types → dist/types}/utils/config/config.d.ts +7 -7
  43. package/dist/types/utils/index.d.ts +3 -0
  44. package/dist/types/utils/is-filled-object/is-filled-object.d.ts +2 -0
  45. package/dist/types/utils/is-nil.d.ts +1 -0
  46. package/environments.json +14 -0
  47. package/package.json +26 -18
  48. package/src/components/index.ts +101 -0
  49. package/src/components/tek-breadcrumb-header/breadcrumb-header.ts +29 -0
  50. package/src/components/tek-breadcrumb-header/interfaces.ts +7 -0
  51. package/src/components/tek-datasource/index.ts +3 -0
  52. package/src/components/tek-datasource/interfaces.ts +36 -0
  53. package/src/components/tek-datasource/tek-memory-datasource.ts +314 -0
  54. package/src/components/tek-datasource/tek-rest-datasource.ts +224 -0
  55. package/src/components/tek-grid/columns-searcher.ts +22 -0
  56. package/src/components/tek-grid/dynamic-filter-datasource-factory.ts +20 -0
  57. package/src/components/tek-grid/filter-helper.ts +20 -0
  58. package/src/components/tek-grid/grid-filter-button.ts +419 -0
  59. package/src/components/tek-grid/grouped-data-manager.ts +448 -0
  60. package/src/components/tek-grid/grouped-data-selector.ts +40 -0
  61. package/src/components/tek-grid/grouped-view-navigator.ts +84 -0
  62. package/src/components/tek-grid/index.ts +18 -0
  63. package/src/components/tek-grid/interfaces.ts +329 -0
  64. package/src/components/tek-grid/keymap-grouped.ts +20 -0
  65. package/src/components/tek-grid/layout-options.ts +248 -0
  66. package/src/components/tek-grid/tek-grid-column.ts +193 -0
  67. package/src/components/tek-grid/tek-grid-columns-button/tek-grid-columns-button-controller.ts +28 -0
  68. package/src/components/tek-grid/tek-grid-columns-button/tek-grid-columns-button.ts +38 -0
  69. package/src/components/tek-grid/tek-grid-controller.ts +140 -0
  70. package/src/components/tek-grid/tek-grid-events.ts +105 -0
  71. package/src/components/tek-grid/tek-grid-toolbar-provider/export-options/button-option.ts +26 -0
  72. package/src/components/tek-grid/tek-grid-toolbar-provider/export-options/index.ts +3 -0
  73. package/src/components/tek-grid/tek-grid-toolbar-provider/export-options/interfaces.ts +6 -0
  74. package/src/components/tek-grid/tek-grid-toolbar-provider/export-options/multi-option.ts +85 -0
  75. package/src/components/tek-grid/tek-grid-toolbar-provider/index.ts +2 -0
  76. package/src/components/tek-grid/tek-grid-toolbar-provider/tek-grid-toolbar-provider.ts +365 -0
  77. package/src/components/tek-grid/tek-grid.ts +1118 -0
  78. package/src/components/tek-user-info/TekUserInfoController.ts +87 -0
  79. package/src/components/tek-user-info/interfaces.ts +21 -0
  80. package/src/components/tek-user-info/tek-user-info-list.ts +64 -0
  81. package/src/components/tek-user-info/tek-user-info.ts +337 -0
  82. package/src/error/tek-grid-delete-rows-error.ts +15 -0
  83. package/src/error/teknisa-common-error.ts +8 -0
  84. package/src/index.ts +2 -0
  85. package/src/utils/config/config.ts +8 -0
  86. package/src/utils/index.ts +3 -0
  87. package/src/utils/is-filled-object/is-filled-object.ts +5 -0
  88. package/src/utils/is-nil.ts +3 -0
  89. package/tests/__helpers__/component-event-helper.ts +1 -1
  90. package/tests/__helpers__/get-child-helper.ts +1 -1
  91. package/tests/__helpers__/mock-created-helper.ts +1 -1
  92. package/tests/unit/components/crud/crud-button.spec.ts +1 -1
  93. package/tests/unit/components/tek-datasource/memory-datasource.spec.ts +1 -11
  94. package/tests/unit/components/tek-datasource/rest-datasource.spec.ts +5 -7
  95. package/tests/unit/components/tek-drag-grid/tek-drag-grid.spec.ts +1 -1
  96. package/tests/unit/components/tek-grid/button-option.spec.ts +49 -0
  97. package/tests/unit/components/tek-grid/columns-searcher.spec.ts +112 -0
  98. package/tests/unit/components/tek-grid/dynamic-filter-datasource-factory.spec.ts +90 -0
  99. package/tests/unit/components/tek-grid/filter-helper.spec.ts +34 -130
  100. package/tests/unit/components/tek-grid/grid-filter-button.spec.ts +114 -239
  101. package/tests/unit/components/tek-grid/grouped-data-manager.spec.ts +593 -0
  102. package/tests/unit/components/tek-grid/grouped-data-selector.spec.ts +136 -0
  103. package/tests/unit/components/tek-grid/grouped-view-navigator.spec.ts +244 -0
  104. package/tests/unit/components/tek-grid/keymap-grouped.spec.ts +20 -0
  105. package/tests/unit/components/tek-grid/{layout_options.spec.ts → layout-options.spec.ts} +70 -30
  106. package/tests/unit/components/tek-grid/multi-option.spec.ts +139 -0
  107. package/tests/unit/components/tek-grid/{grid-column.spec.ts → tek-grid-column.spec.ts} +44 -2
  108. package/tests/unit/components/tek-grid/{grid-columns-button.spec.ts → tek-grid-columns-button.spec.ts} +42 -9
  109. package/tests/unit/components/tek-grid/tek-grid-controller.spec.ts +253 -0
  110. package/tests/unit/components/tek-grid/tek-grid-events.spec.ts +186 -0
  111. package/tests/unit/components/tek-grid/tek-grid-toolbar-provider.spec.ts +34 -0
  112. package/tests/unit/components/tek-grid/tek-grid.spec.ts +895 -0
  113. package/tests/unit/components/tek-grid/tek-memory-datasource.spec.ts +482 -0
  114. package/tests/unit/components/tek-grid/tek-rest-datasource.spec.ts +422 -0
  115. package/tests/unit/components/tek-user-info/tek-user-info-list.spec.ts +1 -1
  116. package/tests/unit/components/tek-user-info/tek-user-info.spec.ts +10 -14
  117. package/tests/unit/components/tree-grid/tree-grid.spec.ts +4 -28
  118. package/tests/unit/utils/grid-base/export-options/multi-option.spec.ts +2 -2
  119. package/tests/unit/utils/grid-base/grid-controller.spec.ts +17 -152
  120. package/tsconfig.build.json +7 -0
  121. package/coverage/clover.xml +0 -2007
  122. package/coverage/coverage-final.json +0 -48
  123. package/coverage/lcov-report/base.css +0 -224
  124. package/coverage/lcov-report/block-navigation.js +0 -87
  125. package/coverage/lcov-report/favicon.png +0 -0
  126. package/coverage/lcov-report/index.html +0 -431
  127. package/coverage/lcov-report/prettify.css +0 -1
  128. package/coverage/lcov-report/prettify.js +0 -2
  129. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  130. package/coverage/lcov-report/sorter.js +0 -210
  131. package/coverage/lcov-report/tests/__helpers__/component-event-helper.ts.html +0 -100
  132. package/coverage/lcov-report/tests/__helpers__/flush-promises-helper.ts.html +0 -94
  133. package/coverage/lcov-report/tests/__helpers__/get-child-helper.ts.html +0 -166
  134. package/coverage/lcov-report/tests/__helpers__/index.html +0 -176
  135. package/coverage/lcov-report/tests/__helpers__/index.ts.html +0 -94
  136. package/coverage/lcov-report/tests/__helpers__/mock-created-helper.ts.html +0 -121
  137. package/coverage/lcov.info +0 -3885
  138. package/dist/tek-components-common.esm.js +0 -4833
  139. package/dist/tek-components-common.umd.js +0 -4870
  140. package/tests/unit/components/tek-grid/grid.spec.ts +0 -3377
  141. package/tests/unit/utils/grid-base/delete-rows-error.spec.ts +0 -24
  142. package/types/components/crud/crud-add-button.d.ts +0 -38
  143. package/types/components/crud/crud-button.d.ts +0 -27
  144. package/types/components/crud/crud-cancel-button.d.ts +0 -28
  145. package/types/components/crud/crud-delete-button.d.ts +0 -42
  146. package/types/components/crud/crud-form.d.ts +0 -46
  147. package/types/components/crud/crud-save-button.d.ts +0 -24
  148. package/types/components/crud/interfaces.d.ts +0 -15
  149. package/types/components/index.d.ts +0 -41
  150. package/types/components/tek-card-title/card-title.d.ts +0 -14
  151. package/types/components/tek-card-title/interfaces.d.ts +0 -9
  152. package/types/components/tek-drag-grid/interfaces.d.ts +0 -7
  153. package/types/components/tek-drag-grid/tek-drag-grid.d.ts +0 -36
  154. package/types/components/tek-grid/grid.d.ts +0 -267
  155. package/types/components/tek-grid/interfaces.d.ts +0 -203
  156. package/types/components/tek-image/image.d.ts +0 -55
  157. package/types/components/tek-image/interfaces.d.ts +0 -12
  158. package/types/components/tek-iterable-carousel/interfaces.d.ts +0 -5
  159. package/types/components/tek-iterable-carousel/iterable-carousel.d.ts +0 -13
  160. package/types/components/tek-iterable-component-render/interfaces.d.ts +0 -3
  161. package/types/components/tek-iterable-component-render/iterable-component-render.d.ts +0 -10
  162. package/types/components/tek-loading/interfaces.d.ts +0 -6
  163. package/types/components/tek-loading/loading.d.ts +0 -24
  164. package/types/components/tek-notifications/interfaces.d.ts +0 -22
  165. package/types/components/tek-notifications/notifications.d.ts +0 -35
  166. package/types/components/tek-product-card/interfaces.d.ts +0 -19
  167. package/types/components/tek-product-card/product-card.d.ts +0 -66
  168. package/types/components/tek-tree-grid/interfaces.d.ts +0 -30
  169. package/types/components/tek-tree-grid/tree-grid.d.ts +0 -102
  170. package/types/error/incomplete-groups-error.d.ts +0 -8
  171. package/types/index.d.ts +0 -2
  172. package/types/utils/extract-properties.d.ts +0 -7
  173. package/types/utils/grid-base/export-options/interfaces.d.ts +0 -5
  174. package/types/utils/grid-base/grid-base.d.ts +0 -59
  175. package/types/utils/grid-base/grid-controller.d.ts +0 -27
  176. package/types/utils/index.d.ts +0 -6
  177. package/types/utils/report-filter/report-filter.d.ts +0 -12
@@ -0,0 +1,482 @@
1
+ import {
2
+ init,
3
+ Router,
4
+ URL,
5
+ } from '@zeedhi/core';
6
+ import {
7
+ TekMemoryDatasource, ITekMemoryDatasource,
8
+ } from '../../../../src';
9
+ import { flushPromises } from '../../__helpers__';
10
+
11
+ describe('TekMemoryDatasource', () => {
12
+ init({
13
+ controllers: {
14
+ AppController: class AppController {
15
+ public value = '1';
16
+ },
17
+ },
18
+ });
19
+
20
+ let datasource: ITekMemoryDatasource;
21
+ let router: any;
22
+
23
+ beforeEach(() => {
24
+ datasource = {
25
+ uniqueKey: 'id',
26
+ data: [
27
+ { name: 'name 1', id: 1 }, { name: 'name 2', id: 2 }, { name: 'name 3', id: 3 },
28
+ { name: 'name 4', id: 4 }, { name: 'name 5', id: 5 }, { name: 'name 6', id: 6 },
29
+ ],
30
+ };
31
+ router = {
32
+ push: () => jest.fn,
33
+ replace: (route: any) => {
34
+ window.history.replaceState(null, '', `${window.location.pathname}?${URL.getFormattedQueryString(route.query)}`);
35
+ },
36
+ back: () => jest.fn,
37
+ getCurrentRoute: () => ({
38
+ path: '',
39
+ hash: '',
40
+ query: {},
41
+ params: {},
42
+ fullPath: '',
43
+ }),
44
+ getPath: () => '',
45
+ getHash: () => '',
46
+ getQuery: () => ({}),
47
+ getParams: () => ({}),
48
+ getFullPath: () => '',
49
+ };
50
+ Router.setInstance(router);
51
+ });
52
+
53
+ describe('constuctor()', () => {
54
+ it('should assign all properties', async () => {
55
+ const instance = new TekMemoryDatasource({
56
+ ...datasource,
57
+ dynamicFilter: {
58
+ name: [{ operation: 'EQUALS', relation: 'AND', value: '1' }],
59
+ },
60
+ searchJoin: { col1: ['1', '2'], col2: [2], col3: [] },
61
+ });
62
+ await flushPromises();
63
+
64
+ expect(instance.dynamicFilter).toEqual({ name: [{ operation: 'EQUALS', relation: 'AND', value: '1' }] });
65
+ expect(instance.searchJoin).toEqual({ col1: ['1', '2'], col2: [2], col3: [] });
66
+ });
67
+
68
+ it('should assign all properties with accessor', async () => {
69
+ const instance = new TekMemoryDatasource({
70
+ ...datasource,
71
+ dynamicFilter: {
72
+ name: [{ operation: 'EQUALS', relation: 'AND', value: '{{AppController.value}}' }],
73
+ },
74
+ searchJoin: { col1: ['1', '2'], col2: [2], col3: [] },
75
+ });
76
+ await flushPromises();
77
+
78
+ expect(instance.dynamicFilter).toEqual({ name: [{ operation: 'EQUALS', relation: 'AND', value: '1' }] });
79
+ expect(instance.searchJoin).toEqual({ col1: ['1', '2'], col2: [2], col3: [] });
80
+ });
81
+
82
+ it('should create using default parameters', async () => {
83
+ const instance = new TekMemoryDatasource({});
84
+
85
+ expect(instance.dynamicFilter).toEqual({});
86
+ expect(instance.searchJoin).toEqual({});
87
+ });
88
+
89
+ it('should set values from url', () => {
90
+ router.getFullPath = () => 'localhost/?page=2&limit=10&order=id.asc&search=2&id=1';
91
+ const instance = new TekMemoryDatasource({
92
+ ...datasource,
93
+ watchUrl: true,
94
+ });
95
+ expect(instance.filter).toEqual({ id: '1' });
96
+ expect(instance.limit).toBe(10);
97
+ expect(instance.order).toEqual(['id.asc']);
98
+ expect(instance.page).toBe(2);
99
+ expect(instance.search).toBe('2');
100
+ });
101
+
102
+ it('should set dynamicFilter from url', () => {
103
+ router.getFullPath = () => 'localhost/?dynamic_filter=eyJuYW1lIjpbeyJvcGVyYXRpb24iOiJFUVVBTFMiLCJyZWxhdGlvbiI6IkFORCIsInZhbHVlIjoiMSJ9XX0='; // eslint-disable-line max-len
104
+ datasource.watchUrl = true;
105
+ const instance = new TekMemoryDatasource(datasource);
106
+ instance.initialize();
107
+ expect(instance.dynamicFilter).toEqual({ name: [{ operation: 'EQUALS', relation: 'AND', value: '1' }] });
108
+ });
109
+
110
+ it('should set searchJoin from url', () => {
111
+ router.getFullPath = () => 'localhost/?search_join=eyAiY29sMSI6IFsiMSIsICIyIl0sICJjb2wyIjogWzJdLCAiY29sMyI6IFtdIH0='; // eslint-disable-line max-len
112
+ datasource.watchUrl = true;
113
+ const instance = new TekMemoryDatasource(datasource);
114
+ instance.initialize();
115
+ expect(instance.searchJoin).toEqual({ col1: ['1', '2'], col2: [2], col3: [] });
116
+ });
117
+ });
118
+
119
+ describe('dynamicFilter', () => {
120
+ it('should retrieve data using dynamic filter', async () => {
121
+ datasource.watchUrl = false;
122
+ const instance = new TekMemoryDatasource(datasource);
123
+ instance.initialize();
124
+
125
+ await flushPromises();
126
+ expect(instance.data.length).toBe(6);
127
+
128
+ instance.dynamicFilter = {
129
+ name: [
130
+ { operation: 'CONTAINS', relation: 'AND', value: '1' },
131
+ ],
132
+ };
133
+ await instance.get();
134
+ expect(instance.data.length).toBe(1);
135
+
136
+ instance.dynamicFilter = {
137
+ name: [
138
+ { operation: 'CONTAINS', relation: 'AND', value: 'name' },
139
+ ],
140
+ };
141
+ await instance.get();
142
+ expect(instance.data.length).toBe(6);
143
+
144
+ instance.dynamicFilter = {
145
+ name: [
146
+ { operation: 'CONTAINS', relation: 'AND', value: '1' },
147
+ { operation: 'CONTAINS', relation: 'OR', value: '2' },
148
+ ],
149
+ };
150
+ await instance.get();
151
+ expect(instance.data.length).toBe(2);
152
+
153
+ instance.dynamicFilter = {
154
+ name: [
155
+ { operation: 'CONTAINS', relation: 'AND', value: '1' },
156
+ { operation: 'CONTAINS', relation: 'AND', value: '2' },
157
+ ],
158
+ };
159
+ await instance.get();
160
+ expect(instance.data.length).toBe(0);
161
+
162
+ instance.dynamicFilter = {
163
+ name: [
164
+ { operation: 'CONTAINS', relation: 'AND', value: '1' },
165
+ ],
166
+ id: [
167
+ { operation: 'CONTAINS', relation: 'OR', value: '2' },
168
+ ],
169
+ };
170
+ await instance.get();
171
+ expect(instance.data.length).toBe(2);
172
+
173
+ instance.dynamicFilter = {
174
+ name: [
175
+ { operation: 'NOT_CONTAINS', relation: 'AND', value: '1' },
176
+ ],
177
+ };
178
+ await instance.get();
179
+ expect(instance.data.length).toBe(5);
180
+
181
+ instance.dynamicFilter = {
182
+ name: [
183
+ { operation: 'EQUALS', relation: 'AND', value: '1' },
184
+ ],
185
+ };
186
+ await instance.get();
187
+ expect(instance.data.length).toBe(0);
188
+
189
+ instance.dynamicFilter = {
190
+ name: [
191
+ { operation: 'EQUALS', relation: 'AND', value: 'name 1' },
192
+ ],
193
+ };
194
+ await instance.get();
195
+ expect(instance.data.length).toBe(1);
196
+
197
+ instance.dynamicFilter = {
198
+ name: [
199
+ { operation: 'NOT_EQUALS', relation: 'AND', value: 'name 1' },
200
+ ],
201
+ };
202
+ await instance.get();
203
+ expect(instance.data.length).toBe(5);
204
+
205
+ instance.dynamicFilter = {
206
+ id: [
207
+ { operation: 'GREATER_THAN', relation: 'AND', value: '2' },
208
+ ],
209
+ };
210
+ await instance.get();
211
+ expect(instance.data.length).toBe(4);
212
+
213
+ instance.dynamicFilter = {
214
+ id: [
215
+ { operation: 'LESS_THAN', relation: 'AND', value: '2' },
216
+ ],
217
+ };
218
+ await instance.get();
219
+ expect(instance.data.length).toBe(1);
220
+
221
+ instance.dynamicFilter = {
222
+ id: [
223
+ { operation: 'GREATER_THAN_EQUALS', relation: 'AND', value: '2' },
224
+ ],
225
+ };
226
+ await instance.get();
227
+ expect(instance.data.length).toBe(5);
228
+
229
+ instance.dynamicFilter = {
230
+ id: [
231
+ { operation: 'LESS_THAN_EQUALS', relation: 'AND', value: '2' },
232
+ ],
233
+ };
234
+ await instance.get();
235
+ expect(instance.data.length).toBe(2);
236
+
237
+ instance.dynamicFilter = {
238
+ name: [
239
+ { operation: 'GREATER_THAN', relation: 'AND', value: 'name 2' },
240
+ ],
241
+ };
242
+ await instance.get();
243
+ expect(instance.data.length).toBe(4);
244
+
245
+ instance.dynamicFilter = {
246
+ name: [
247
+ { operation: 'LESS_THAN', relation: 'AND', value: 'name 2' },
248
+ ],
249
+ };
250
+ await instance.get();
251
+ expect(instance.data.length).toBe(1);
252
+
253
+ instance.dynamicFilter = {
254
+ name: [
255
+ { operation: 'GREATER_THAN_EQUALS', relation: 'AND', value: 'name 2' },
256
+ ],
257
+ };
258
+ await instance.get();
259
+ expect(instance.data.length).toBe(5);
260
+
261
+ instance.dynamicFilter = {
262
+ name: [
263
+ { operation: 'LESS_THAN_EQUALS', relation: 'AND', value: 'name 2' },
264
+ ],
265
+ };
266
+ await instance.get();
267
+ expect(instance.data.length).toBe(2);
268
+
269
+ instance.dynamicFilter = {
270
+ id: [
271
+ { operation: 'IN', relation: 'AND', value: ['1', '2'] },
272
+ ],
273
+ };
274
+ await instance.get();
275
+ expect(instance.data.length).toBe(2);
276
+
277
+ instance.dynamicFilter = {
278
+ id: [
279
+ { operation: 'NOT_IN', relation: 'AND', value: ['1', '2'] },
280
+ ],
281
+ };
282
+ await instance.get();
283
+ expect(instance.data.length).toBe(4);
284
+
285
+ instance.dynamicFilter = {
286
+ id: [
287
+ { operation: 'BETWEEN', relation: 'AND', value: ['2', '5'] },
288
+ ],
289
+ };
290
+ await instance.get();
291
+ expect(instance.data.length).toBe(4);
292
+
293
+ instance.dynamicFilter = {
294
+ name: [
295
+ { operation: 'BETWEEN', relation: 'AND', value: ['name 2', 'name 5'] },
296
+ ],
297
+ };
298
+ await instance.get();
299
+ expect(instance.data.length).toBe(4);
300
+
301
+ instance.dynamicFilter = {
302
+ name: [
303
+ { operation: '', relation: 'AND', value: ['1', '2'] },
304
+ ],
305
+ };
306
+ await instance.get();
307
+ expect(instance.data.length).toBe(0);
308
+
309
+ instance.dynamicFilter = {
310
+ name: [
311
+ { operation: '', relation: 'AND', value: '1' },
312
+ ],
313
+ };
314
+ await instance.get();
315
+ expect(instance.data.length).toBe(0);
316
+ });
317
+
318
+ it('should not retrieve data with wrong operator', async () => {
319
+ const instance = new TekMemoryDatasource(datasource);
320
+
321
+ await flushPromises();
322
+ expect(instance.data.length).toBe(6);
323
+
324
+ instance.dynamicFilter = {
325
+ name: [
326
+ { operation: 'TEST', relation: 'AND', value: '1' },
327
+ ],
328
+ };
329
+ await instance.get();
330
+ expect(instance.data.length).toBe(0);
331
+ });
332
+ });
333
+
334
+ describe('searchJoin', () => {
335
+ it('should retrieve data using search join', async () => {
336
+ const instance = new TekMemoryDatasource(datasource);
337
+ instance.initialize();
338
+
339
+ await flushPromises();
340
+ expect(instance.data.length).toBe(6);
341
+
342
+ instance.searchJoin = {
343
+ name: ['name 1', 'name 2'],
344
+ };
345
+ instance.search = 'aaa';
346
+ await instance.get();
347
+ expect(instance.data.length).toBe(2);
348
+ });
349
+ });
350
+
351
+ describe('addDynamicFilter()', () => {
352
+ it('should add/remove dynamic filter value', () => {
353
+ const instance = new TekMemoryDatasource(datasource);
354
+ instance.addDynamicFilter('name', [{ operation: 'EQUALS', relation: 'AND', value: '1' }]);
355
+ expect(instance.dynamicFilter).toEqual({ name: [{ operation: 'EQUALS', relation: 'AND', value: '1' }] });
356
+ instance.addDynamicFilter('name', [{ operation: 'foo', relation: 'AND', value: '1' }]);
357
+ expect(instance.dynamicFilter).toEqual({});
358
+ });
359
+ });
360
+
361
+ describe('setDynamicFilter()', () => {
362
+ it('should add/remove dynamic filter value', () => {
363
+ const instance = new TekMemoryDatasource(datasource);
364
+ instance.setDynamicFilter({ name: [{ operation: 'EQUALS', relation: 'AND', value: '1' }] });
365
+ expect(instance.dynamicFilter).toEqual({ name: [{ operation: 'EQUALS', relation: 'AND', value: '1' }] });
366
+
367
+ instance.setDynamicFilter({ name: [{ operation: 'foo', relation: 'AND', value: '1' }] });
368
+ expect(instance.dynamicFilter).toEqual({});
369
+
370
+ instance.setDynamicFilter({
371
+ name: [], id: [{}],
372
+ });
373
+ expect(instance.dynamicFilter).toEqual({});
374
+ });
375
+
376
+ it('should add dynamic filter value with watchUrl', () => {
377
+ let dynamicFilterValue = 'eyJuYW1lIjpbeyJvcGVyYXRpb24iOiJFUVVBTFMiLCJyZWxhdGlvbiI6IkFORCIsInZhbHVlIjoiMSJ9XX0=';
378
+ router.getFullPath = () => `localhost/?dynamic_filter=${dynamicFilterValue}`;
379
+ const urlSpy = jest.spyOn(URL, 'updateQueryString');
380
+
381
+ datasource.watchUrl = true;
382
+ const instance = new TekMemoryDatasource(datasource);
383
+ instance.initialize();
384
+ expect(instance.dynamicFilter).toEqual({ name: [{ operation: 'EQUALS', relation: 'AND', value: '1' }] });
385
+
386
+ dynamicFilterValue = 'eyJuYW1lIjpbeyJvcGVyYXRpb24iOiJFUVVBTFMiLCJyZWxhdGlvbiI6IkFORCIsInZhbHVlIjoiMiJ9XX0=';
387
+ instance.setDynamicFilter({ name: [{ operation: 'EQUALS', relation: 'AND', value: '2' }] });
388
+ expect(urlSpy).toHaveBeenCalledWith({
389
+ dynamic_filter: dynamicFilterValue,
390
+ });
391
+ expect(instance.dynamicFilter).toEqual({ name: [{ operation: 'EQUALS', relation: 'AND', value: '2' }] });
392
+ urlSpy.mockClear();
393
+ });
394
+ });
395
+
396
+ describe('clearDynamicFilter()', () => {
397
+ it('should clear dynamic filter', () => {
398
+ datasource.watchUrl = false;
399
+ const instance = new TekMemoryDatasource(datasource);
400
+ instance.setDynamicFilter({ name: [{ operation: 'EQUALS', relation: 'AND', value: '1' }] });
401
+ expect(instance.dynamicFilter).toEqual({ name: [{ operation: 'EQUALS', relation: 'AND', value: '1' }] });
402
+ instance.clearDynamicFilter();
403
+ expect(instance.dynamicFilter).toEqual({});
404
+ });
405
+
406
+ it('should clear dynamic filter value with watchUrl', () => {
407
+ let dynamicFilterValue = 'eyJuYW1lIjpbeyJvcGVyYXRpb24iOiJFUVVBTFMiLCJyZWxhdGlvbiI6IkFORCIsInZhbHVlIjoiMSJ9XX0=';
408
+ router.getFullPath = () => `localhost/?dynamic_filter=${dynamicFilterValue}`;
409
+ const urlSpy = jest.spyOn(URL, 'updateQueryString');
410
+
411
+ datasource.watchUrl = true;
412
+ const instance = new TekMemoryDatasource(datasource);
413
+ instance.initialize();
414
+ expect(instance.dynamicFilter).toEqual({ name: [{ operation: 'EQUALS', relation: 'AND', value: '1' }] });
415
+
416
+ dynamicFilterValue = '';
417
+ instance.clearDynamicFilter();
418
+ expect(urlSpy).toHaveBeenCalledWith({
419
+ dynamic_filter: undefined,
420
+ });
421
+ expect(instance.dynamicFilter).toEqual({});
422
+ urlSpy.mockClear();
423
+ });
424
+ });
425
+
426
+ describe('clone', () => {
427
+ it('should return an object with all datasource props', async () => {
428
+ const data = [{ value: 'item 1' }];
429
+ const dynamicFilter = {
430
+ value: { operation: 'EQUALS', relation: 'AND', value: 'item 1' },
431
+ };
432
+ const searchJoin = { col1: ['1', '2'], col2: [2], col3: [] };
433
+ const instance = new TekMemoryDatasource({
434
+ data: [...data],
435
+ dynamicFilter,
436
+ searchJoin,
437
+ });
438
+ instance.initialize();
439
+
440
+ const props = instance.clone();
441
+
442
+ expect(props).toEqual({
443
+ data,
444
+ dynamicFilter,
445
+ searchJoin,
446
+ currentRow: {},
447
+ filter: {},
448
+ limit: 10,
449
+ order: [],
450
+ page: 1,
451
+ search: '',
452
+ searchIn: [],
453
+ uniqueKey: 'id',
454
+ watchUrl: false,
455
+ events: {},
456
+ loadAll: false,
457
+ type: 'tek-memory',
458
+ translate: false,
459
+ });
460
+ });
461
+ });
462
+
463
+ describe('get()', () => {
464
+ it('should retrieve data based on filter', async () => {
465
+ datasource.filter = { name: 'name 1' };
466
+ const instance = new TekMemoryDatasource(datasource);
467
+ instance.initialize();
468
+ const data = await instance.get();
469
+ expect(data).toEqual([{ id: 1, name: 'name 1' }]);
470
+ });
471
+ });
472
+
473
+ describe('hasFilter()', () => {
474
+ it('should return true if there is a filter for the column', () => {
475
+ const instance = new TekMemoryDatasource(datasource);
476
+ instance.initialize();
477
+ expect(instance.hasFilter('name')).toBeFalsy();
478
+ instance.dynamicFilter = { name: [{ value: 'name 1', operation: 'CONTAINS', relation: 'AND' }] };
479
+ expect(instance.hasFilter('name')).toBeTruthy();
480
+ });
481
+ });
482
+ });