@zeedhi/teknisa-components-common 1.37.0 → 1.41.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 (31) hide show
  1. package/coverage/clover.xml +789 -617
  2. package/coverage/coverage-final.json +30 -27
  3. package/coverage/lcov-report/block-navigation.js +8 -0
  4. package/coverage/lcov-report/index.html +55 -19
  5. package/coverage/lcov-report/sorter.js +26 -0
  6. package/coverage/lcov.info +1506 -1181
  7. package/dist/tek-components-common.esm.js +1808 -1347
  8. package/dist/tek-components-common.umd.js +1808 -1344
  9. package/package.json +2 -2
  10. package/tests/unit/components/tek-datasource/memory-datasource.spec.ts +20 -4
  11. package/tests/unit/components/tek-grid/filter-helper.spec.ts +145 -0
  12. package/tests/unit/components/tek-grid/grid.spec.ts +376 -58
  13. package/tests/unit/components/tek-grid/layout_options.spec.ts +58 -0
  14. package/tests/unit/components/tek-loading/Loading.spec.ts +30 -0
  15. package/tests/unit/components/tree-grid/tree-grid.spec.ts +469 -0
  16. package/tests/unit/{components/tek-grid → utils/grid-base}/grid-controller.spec.ts +3 -3
  17. package/types/components/index.d.ts +5 -0
  18. package/types/components/tek-datasource/memory-datasource.d.ts +1 -0
  19. package/types/components/tek-grid/filter-dynamic-values.d.ts +9 -0
  20. package/types/components/tek-grid/filter-helper.d.ts +9 -0
  21. package/types/components/tek-grid/grid-columns-button.d.ts +2 -0
  22. package/types/components/tek-grid/grid.d.ts +12 -19
  23. package/types/components/tek-grid/interfaces.d.ts +15 -1
  24. package/types/components/tek-grid/layout-options.d.ts +3 -2
  25. package/types/components/tek-loading/interfaces.d.ts +6 -0
  26. package/types/components/tek-loading/loading.d.ts +24 -0
  27. package/types/components/tek-tree-grid/interfaces.d.ts +19 -0
  28. package/types/components/tek-tree-grid/tree-grid.d.ts +76 -0
  29. package/types/utils/grid-base/grid-base.d.ts +267 -0
  30. package/types/utils/grid-base/grid-controller.d.ts +20 -0
  31. package/types/utils/index.d.ts +3 -1
@@ -0,0 +1,30 @@
1
+ import { Loading } from '../../../../src';
2
+
3
+ describe('Loading', () => {
4
+ describe('constructor()', () => {
5
+ it('should create new Image with default values', () => {
6
+ // eslint-disable-next-line
7
+ const image = 'data:image/gif;base64,R0lGODlhlgCWAPf/AC1oxPa+ADarUdmsFEB/m0yTcjiMhEafWjFova2SNDZotX10VsOfJDlosFZnge25BnJtXTukVWVmaFh1eIuOZ1x0ZEFopHpyWGFpcS5ow+q2CVNnhmVnZvW9AW5qYUyKXUJnofW+AKWNOV9mcS9owZuGQTporlCGXbWXLmNrazxnqeKyDoGDZVFniFZ6ZNSpGJ+IPoR4Ud+wEURnnmtpYklnlll5YbGUMcagIk5njmhnZWpoZGF0aWBmbkdnmbyaKUtnlEaBfWdmZTNou0WUW5WDRFtmeGZmZ82kHqecTXqIdzRouGJmbPC6BIB2VDxnrGNmakyHYPO8AkxnkUh0qmRpZl9wZVxndmRmaVhnffS9AqmPN09ni96vEUmQWzBowC1ow2FtZVR3gl5ndFGCYEVnnF1mdGR9i1dnf7qZK4l7TnRvXOK1FD6eV8ijIG6Cgl58lF1rfEBnpFVsi1pmeo5+Sk56dz9np5OCRjaqUi5pxNarFndwWmNqZm9sYFx7a098itGnG4d6T7ikPKKLO1Rmg+e1Cr2bKVhme0GbVkpmk5mWW5GBSM+nHLiYLPG7BIp8TUKZWUFsqWJnbltmd0hnmNqtFExtm1tsgaiOOIx9TNuuE6CKPWJmbcqjH1OJb8CdJjFovlpwb+u5CzioU1aFbjdos0qYXJOPXWFwczepUnBsX8qrKuW0DD5nqdmsFUl+kTtnrDdntNKuI+OzDVRnhYuEV52HPzNqvjltuVBqkJeERNirFnVvXKSMOjVsvDmLhEJxsTloss+sJTeqUdyzGkaeWreYLmBqdjmMhDyhVvC8B49/STinVVV+YVp/bEuScq6fRj5tr8CnNUV/lUNnoGZnZkCFgTaqUVeCYTuLgz2Ig02RcUySck+QcTxpr5qQUFCPXjZsullviFh4ZNaxH0KAmEGYXFJ4oFCNcEdsoUicWpmFQkRooEFvsHt5YDepUXBvYzyKhESXWkeeWjxutcWlK250bYp+UFCQcGZoaLyeLtitFaGSR0OYV2ZmZiH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5LmRhYmFjYmIsIDIwMjEvMDQvMTQtMDA6Mzk6NDQgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMy4wIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEMEVGRUY5RjYzRjYxMUVDQkRFNUM0MjQ5M0FFRTY2RSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEMEVGRUZBMDYzRjYxMUVDQkRFNUM0MjQ5M0FFRTY2RSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQwRUZFRjlENjNGNjExRUNCREU1QzQyNDkzQUVFNjZFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQwRUZFRjlFNjNGNjExRUNCREU1QzQyNDkzQUVFNjZFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1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3cr155ExDjZsyDKiK8weU4R9AcAWTCgTLcyulFBrCdu7eAHITSmhEpi8gPeirJEBcGDBJR0UNpwXMUksChgfdhxyg+TJlD/eudw480cmdjnf9fxxDAnRo0l3vII6teqNZhajfs1xBILWemlrlNAAt+6NNXz/zjji9OzhGSu1Rp6RSW/RzDOaicw5esZJrqpbx4iFiynZd0mYgtiuEQuaSndMmJAzhY4E8vDjy59Pv779+/jz69/Pv7///wAGKOCABBZo4IEIJqjgggw26OCDEEYo4YQUVmjhhRhmqOGGHHbo4YcghijiiCSWaOKJKKao4oostujiizDGKOOMNNZo44045qjjjjz26OOPQAYp5JBEFmnkkUgmqSRVAQEAIfkEBQQA/wAsAAAAAJYAlgAACPEA/wkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLmy5cuYM2vezLmz58+gQ4seTbq06dOoU6tezbq169ewY8ueTbu27du4c+vezbu379/AgwsfTry48ePIkytfzry58+fQo0ufbjggACH5BAUEAP8ALAAAAAABAAEAAAgEAP8FBAA7';
8
+ const instance = new Loading({
9
+ name: 'loading',
10
+ component: 'Loading',
11
+ });
12
+ expect(instance.text).toBe('');
13
+ expect(instance.image).toBe(image);
14
+ expect(instance.zIndex).toBe('999');
15
+ });
16
+
17
+ it('should create new loading replacing default values', () => {
18
+ const instance = new Loading({
19
+ name: 'loading',
20
+ component: 'Loading',
21
+ image: '/img/zeedhi.svg',
22
+ text: 'zeedhi',
23
+ zIndex: '99',
24
+ });
25
+ expect(instance.image).toBe('/img/zeedhi.svg');
26
+ expect(instance.text).toBe('zeedhi');
27
+ expect(instance.zIndex).toBe('99');
28
+ });
29
+ });
30
+ });
@@ -0,0 +1,469 @@
1
+ import {
2
+ Button, Form, IButton, IForm, IModal, Modal, ModalService,
3
+ } from '@zeedhi/common';
4
+ import { Http, Metadata } from '@zeedhi/core';
5
+ import {
6
+ ITekTreeGrid, TekGridColumn, TekRestDatasource, TekTreeGrid,
7
+ } from '../../../../src';
8
+
9
+ describe('TekTreeGrid', () => {
10
+ beforeEach(() => {
11
+ // clear all metadata instances before testing
12
+ const { instances } = Metadata as any;
13
+ Object.keys(instances).forEach((key) => {
14
+ Metadata.clearInstance(key, instances[key].componentId);
15
+ });
16
+ });
17
+
18
+ describe('constructor()', () => {
19
+ it('should create new grid with default values', () => {
20
+ const instance = new TekTreeGrid({ name: 'TreeGrid', component: 'TekTreeGrid' });
21
+ expect(instance.title).toBe('');
22
+ expect(instance.addButton).toBeFalsy();
23
+ expect(instance.deleteButton).toBe('none');
24
+ expect(instance.filterButton).toBeFalsy();
25
+ expect(instance.columnFilterButton).toBeFalsy();
26
+ expect(instance.dragColumns).toBeTruthy();
27
+ expect(instance.resizeColumns).toBeTruthy();
28
+ expect(instance.showLayoutOptions).toBeTruthy();
29
+ expect(instance.showReload).toBeTruthy();
30
+ expect(instance.columnsButton).toBeFalsy();
31
+ expect(instance.columnsButtonIgnore).toEqual([]);
32
+ });
33
+
34
+ it('should create new Grid replacing default values', () => {
35
+ const instance = new TekTreeGrid({
36
+ name: 'grid',
37
+ component: 'TekTreeGrid',
38
+ title: 'title',
39
+ addButton: true,
40
+ deleteButton: 'selection',
41
+ filterButton: true,
42
+ columnFilterButton: true,
43
+ dragColumns: false,
44
+ resizeColumns: false,
45
+ showLayoutOptions: false,
46
+ showReload: false,
47
+ columns: [
48
+ { name: 'id' },
49
+ ],
50
+ columnsButton: true,
51
+ columnsButtonIgnore: ['id'],
52
+ });
53
+ expect(instance.title).toBe('title');
54
+ expect(instance.addButton).toBeTruthy();
55
+ expect(instance.deleteButton).toBe('selection');
56
+ expect(instance.filterButton).toBeTruthy();
57
+ expect(instance.columnFilterButton).toBeTruthy();
58
+ expect(instance.dragColumns).toBeFalsy();
59
+ expect(instance.resizeColumns).toBeFalsy();
60
+ expect(instance.showLayoutOptions).toBeFalsy();
61
+ expect(instance.showReload).toBeFalsy();
62
+ expect(instance.columns[0]).toBeInstanceOf(TekGridColumn);
63
+ expect(instance.columnsButton).toBeTruthy();
64
+ expect(instance.columnsButtonIgnore).toEqual(['id']);
65
+ });
66
+
67
+ it('should create toolbar and footer', () => {
68
+ const instance = new TekTreeGrid({
69
+ name: 'grid',
70
+ component: 'TekGrid',
71
+ title: 'title',
72
+ addButton: true,
73
+ deleteButton: 'selection',
74
+ filterButton: true,
75
+ columnFilterButton: true,
76
+ dragColumns: false,
77
+ resizeColumns: false,
78
+ showLayoutOptions: false,
79
+ });
80
+ instance.onCreated();
81
+ expect(instance.toolbarSlot.length).toBe(7);
82
+ });
83
+
84
+ it('should overwrite toolbar', () => {
85
+ const instance = new TekTreeGrid({
86
+ name: 'grid',
87
+ component: 'TekGrid',
88
+ title: 'title',
89
+ addButton: true,
90
+ deleteButton: 'selection',
91
+ filterButton: true,
92
+ columnFilterButton: true,
93
+ dragColumns: false,
94
+ resizeColumns: false,
95
+ showLayoutOptions: false,
96
+ toolbarSlot: [],
97
+ });
98
+ instance.onCreated();
99
+ expect(instance.toolbarSlot.length).toBe(0);
100
+ });
101
+ });
102
+
103
+ describe('filterClick()', () => {
104
+ it('should apply filter from form to tekdatasource', () => {
105
+ const instance = new TekTreeGrid({
106
+ name: 'grid_filterClick11',
107
+ component: 'TekTreeGrid',
108
+ datasource: {
109
+ type: 'tek-rest',
110
+ },
111
+ columns: [
112
+ {
113
+ name: 'id',
114
+ filterProps: [{ name: 'id_edit', operation: 'IN', relation: 'AND' }],
115
+ },
116
+ {
117
+ name: 'name',
118
+ componentProps: { name: 'name_edit', component: 'ZdSelect' },
119
+ filterProps: [{
120
+ name: 'name_edit', label: 'name', operation: 'NOT_EQUALS', relation: 'OR',
121
+ }],
122
+ },
123
+ ],
124
+ });
125
+
126
+ let form: IForm = { name: 'form', component: 'ZdForm' };
127
+ let applyButton: IButton = { name: 'apply', component: 'ZdButton' };
128
+ const spyModalService = jest.spyOn(ModalService, 'create').mockImplementation((modal: IModal) => {
129
+ if (modal.children && modal.children.length > 2) {
130
+ form = modal.children[1] as IForm;
131
+ const modalFooter = modal.children[2];
132
+ if (modalFooter.rightSlot && modalFooter.rightSlot.length > 1) {
133
+ applyButton = modalFooter.rightSlot[1] as IButton;
134
+ }
135
+ }
136
+
137
+ return new Modal(modal);
138
+ });
139
+
140
+ instance.onCreated();
141
+
142
+ const filterTooltip = instance.toolbarSlot[6];
143
+ if (filterTooltip && filterTooltip.children && filterTooltip.children.length > 0) {
144
+ const button = new Button(filterTooltip.children[0]);
145
+ const event = new Event('click');
146
+ button.click(event, {} as HTMLElement);
147
+ const formObject = new Form(form);
148
+ const spyMetadata = jest.spyOn(Metadata, 'getInstance').mockImplementation(() => formObject);
149
+ const spyDatasourceGet = jest.spyOn(instance.datasource, 'get');
150
+ formObject.value = {
151
+ 'grid_filterClick11-filter-AND-IN-id-0': ['1', '2', '3'],
152
+ 'grid_filterClick11-filter-OR-NOT_EQUALS-name-0': 'teste',
153
+ };
154
+ const applyButtonObject = new Button(applyButton);
155
+ formObject.validate = () => false;
156
+ applyButtonObject.click(event, {} as HTMLElement);
157
+ expect((instance.datasource as TekRestDatasource).dynamicFilter).toEqual({});
158
+
159
+ formObject.validate = () => true;
160
+ applyButtonObject.click(event, {} as HTMLElement);
161
+ expect((instance.datasource as TekRestDatasource).dynamicFilter).toEqual({
162
+ id: [
163
+ {
164
+ operation: 'IN',
165
+ relation: 'AND',
166
+ value: ['1', '2', '3'],
167
+ },
168
+ ],
169
+ name: [
170
+ {
171
+ operation: 'NOT_EQUALS',
172
+ relation: 'OR',
173
+ value: 'teste',
174
+ },
175
+ ],
176
+ });
177
+ expect(instance.columnHasFilterData({ name: 'name' } as TekGridColumn)).toBeTruthy();
178
+ expect(spyDatasourceGet).toBeCalled();
179
+ spyMetadata.mockClear();
180
+ spyDatasourceGet.mockClear();
181
+ }
182
+ spyModalService.mockClear();
183
+ });
184
+
185
+ it('should apply filter from form to datasource', () => {
186
+ let beforeApplyFilterCalled = false;
187
+ let changeLayoutCalled = false;
188
+ const instance = new TekTreeGrid({
189
+ name: 'grid_filterClick12',
190
+ component: 'TekTreeGrid',
191
+ columns: [
192
+ {
193
+ name: 'id',
194
+ },
195
+ {
196
+ name: 'name',
197
+ },
198
+ ],
199
+ events: {
200
+ beforeApplyFilter: () => { beforeApplyFilterCalled = true; },
201
+ changeLayout: () => { changeLayoutCalled = true; },
202
+ },
203
+ });
204
+
205
+ let form: IForm = { name: 'form', component: 'ZdForm' };
206
+ let applyButton: IButton = { name: 'apply', component: 'ZdButton' };
207
+ const spyModalService = jest.spyOn(ModalService, 'create').mockImplementation((modal: IModal) => {
208
+ if (modal.children && modal.children.length > 2) {
209
+ form = modal.children[1] as IForm;
210
+ const modalFooter = modal.children[2];
211
+ if (modalFooter.rightSlot && modalFooter.rightSlot.length > 1) {
212
+ applyButton = modalFooter.rightSlot[1] as IButton;
213
+ }
214
+ }
215
+
216
+ return new Modal(modal);
217
+ });
218
+
219
+ instance.onCreated();
220
+
221
+ const filterTooltip = instance.toolbarSlot[6];
222
+ if (filterTooltip && filterTooltip.children && filterTooltip.children.length > 0) {
223
+ const button = new Button(filterTooltip.children[0]);
224
+ const event = new Event('click');
225
+ button.click(event, {} as HTMLElement);
226
+ const formObject = new Form(form);
227
+ const spyMetadata = jest.spyOn(Metadata, 'getInstance').mockImplementation(() => formObject);
228
+ const spyDatasourceGet = jest.spyOn(instance.datasource, 'get');
229
+ formObject.value = {
230
+ 'grid_filterClick12-filter-AND-CONTAINS-id-0': '1;2;3',
231
+ 'grid_filterClick12-filter-AND-CONTAINS-name-0': 'teste',
232
+ };
233
+ const applyButtonObject = new Button(applyButton);
234
+ applyButtonObject.click({ defaultPrevented: true } as Event, {} as HTMLElement);
235
+ expect((instance.datasource as TekRestDatasource).filter).toEqual({
236
+ id: '1;2;3',
237
+ name: 'teste',
238
+ });
239
+ expect(beforeApplyFilterCalled).toBeTruthy();
240
+ expect(changeLayoutCalled).toBeTruthy();
241
+ expect(instance.columnHasFilterData({ name: 'name' } as TekGridColumn)).toBeTruthy();
242
+ expect(spyDatasourceGet).not.toBeCalled();
243
+ spyMetadata.mockClear();
244
+ spyDatasourceGet.mockClear();
245
+ }
246
+ spyModalService.mockClear();
247
+ });
248
+ });
249
+
250
+ describe('setSearch()', () => {
251
+ let baseProps: ITekTreeGrid;
252
+ let httpSpy: jest.SpyInstance;
253
+
254
+ beforeEach(() => {
255
+ httpSpy = jest.spyOn(Http, 'get').mockImplementation(() => Promise.resolve({
256
+ data: {
257
+ data: [
258
+ { id: 1, name: 'task 1' },
259
+ { id: 11, name: 'task 1.1', parent: 1 },
260
+ { id: 12, name: 'task 1.2', parent: 1 },
261
+ { id: 2, name: 'task 2' },
262
+ { id: 3, name: 'task 3' },
263
+ ],
264
+ pagination: {
265
+ page: 1,
266
+ total: 5,
267
+ limit: 15,
268
+ },
269
+ },
270
+ }));
271
+
272
+ baseProps = {
273
+ name: 'grid_search',
274
+ component: 'TekTreeGrid',
275
+ columns: [
276
+ {
277
+ name: 'id',
278
+ },
279
+ {
280
+ name: 'name',
281
+ },
282
+ ],
283
+ datasource: {
284
+ type: 'tek-rest',
285
+ lazyLoad: false,
286
+ route: '/grid',
287
+ },
288
+ };
289
+
290
+ httpSpy.mockClear();
291
+ });
292
+
293
+ afterAll(() => {
294
+ httpSpy.mockClear();
295
+ });
296
+
297
+ it('should set datasource search_join based on columns that have datasource', async () => {
298
+ const instance = new TekTreeGrid(baseProps);
299
+
300
+ await instance.setSearch('1');
301
+ expect(instance.datasource).toBeInstanceOf(TekRestDatasource);
302
+ expect((instance.datasource as TekRestDatasource).searchJoin).toEqual({});
303
+ expect(httpSpy).toHaveBeenCalledTimes(1);
304
+ });
305
+ });
306
+
307
+ describe('getReport()', () => {
308
+ let httpReportSpy: jest.SpyInstance;
309
+
310
+ beforeEach(() => {
311
+ httpReportSpy = jest.spyOn(Http, 'post').mockImplementation((url) => {
312
+ if (url === 'https://zhreport.teknisa.com/generateReport') {
313
+ return Promise.resolve({
314
+ data: { messages: [{ message: 'pdf-report.html' }] },
315
+ });
316
+ }
317
+
318
+ return Promise.reject();
319
+ });
320
+ });
321
+
322
+ afterEach(() => {
323
+ httpReportSpy.mockClear();
324
+ });
325
+
326
+ it('should call getReport on export button click', () => {
327
+ (window as any).open = jest.fn();
328
+
329
+ const instance = new TekTreeGrid({
330
+ name: 'grid_getReport',
331
+ component: 'TekTreeGrid',
332
+ });
333
+
334
+ const spy = jest.spyOn(instance, 'getReport');
335
+ instance.onCreated();
336
+
337
+ const buttonProps = (instance as any).gridBase.exportConfigButtons[0] as IButton;
338
+ const button = new Button(buttonProps);
339
+
340
+ const event = new Event('click');
341
+ button.click(event, {} as HTMLElement);
342
+
343
+ expect(spy).toBeCalledTimes(1);
344
+ spy.mockClear();
345
+
346
+ (window as any).open.mockClear();
347
+ });
348
+
349
+ it('should call window open on getReport method', async () => {
350
+ (window as any).open = jest.fn();
351
+ const httpSpy = jest.spyOn(Http, 'get').mockImplementation(() => Promise.resolve({
352
+ data: {
353
+ data: [],
354
+ pagination: {
355
+ page: 1,
356
+ total: 0,
357
+ limit: 10,
358
+ },
359
+ },
360
+ }));
361
+
362
+ const instance = new TekTreeGrid({
363
+ name: 'grid',
364
+ component: 'TekTreeGrid',
365
+ datasource: {
366
+ type: 'tek-rest',
367
+ uniqueKey: 'id',
368
+ route: '/zeedhi',
369
+ lazyLoad: false,
370
+ data: [
371
+ { id: '1', department_id: '1' },
372
+ ],
373
+ },
374
+ columns: [
375
+ {
376
+ name: 'id',
377
+ label: 'ID',
378
+ },
379
+ {
380
+ name: 'department_id',
381
+ label: 'Department ID',
382
+ },
383
+ ],
384
+ });
385
+
386
+ const spy = jest.spyOn(window, 'open');
387
+ await instance.getReport('pdf');
388
+
389
+ expect(spy).toHaveBeenCalledTimes(1);
390
+
391
+ (window as any).open.mockClear();
392
+ spy.mockClear();
393
+ httpSpy.mockClear();
394
+ });
395
+ });
396
+
397
+ describe('rowClick', () => {
398
+ it('rowClick method should call events.rowClick', () => {
399
+ const rowClick = jest.fn();
400
+
401
+ const data = [
402
+ { id: '1', name: 'First' },
403
+ { id: '2', name: 'Second' },
404
+ { id: '3', name: 'Third' },
405
+ ];
406
+ const grid = new TekTreeGrid({
407
+ name: 'grid',
408
+ component: 'TekGrid',
409
+ columns: [
410
+ { name: 'id' },
411
+ { name: 'name' },
412
+ ],
413
+ datasource: {
414
+ data,
415
+ },
416
+ events: {
417
+ rowClick,
418
+ },
419
+ });
420
+
421
+ const event = new Event('click');
422
+ const element = document.createElement('div');
423
+ grid.rowClick(data[0], event, element);
424
+
425
+ expect(rowClick).toHaveBeenCalledWith({
426
+ event,
427
+ element,
428
+ row: data[0],
429
+ component: grid,
430
+ });
431
+ expect(grid.datasource.currentRow).toEqual(data[0]);
432
+ });
433
+
434
+ it('should not call events.rowClick if cellClick prevents it', async () => {
435
+ const flushPromises = () => new Promise(setImmediate);
436
+ const rowClick = jest.fn();
437
+
438
+ const data = [
439
+ { id: '1', name: 'First' },
440
+ { id: '2', name: 'Second' },
441
+ { id: '3', name: 'Third' },
442
+ ];
443
+ const grid = new TekTreeGrid({
444
+ name: 'grid',
445
+ component: 'TekGrid',
446
+ columns: [
447
+ { name: 'id' },
448
+ { name: 'name' },
449
+ ],
450
+ datasource: {
451
+ data,
452
+ },
453
+ events: {
454
+ rowClick,
455
+ cellClick: () => true,
456
+ },
457
+ });
458
+ await flushPromises();
459
+
460
+ const event = new Event('click');
461
+ const element = document.createElement('div');
462
+ grid.cellClick(data[0], grid.getColumn('id') as any, event, element);
463
+ grid.rowClick(data[0], event, element);
464
+
465
+ expect(rowClick).not.toHaveBeenCalled();
466
+ expect(grid.datasource.currentRow).toEqual({});
467
+ });
468
+ });
469
+ });
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  TekGrid,
3
3
  } from '../../../../src';
4
- import { TekGridController } from '../../../../src/components/tek-grid/grid-controller';
4
+ import { GridController } from '../../../../src/utils/grid-base/grid-controller';
5
5
 
6
- describe('TekGridController', () => {
6
+ describe('GridController', () => {
7
7
  describe('constructor()', () => {
8
8
  it('should create controller and get info from grid', () => {
9
9
  const grid = new TekGrid({
@@ -18,7 +18,7 @@ describe('TekGridController', () => {
18
18
  showLayoutOptions: true,
19
19
  actions: [{ name: 'button', component: 'ZdButton' }],
20
20
  });
21
- const instance = new TekGridController(grid);
21
+ const instance = new GridController(grid);
22
22
 
23
23
  expect(instance.gridTitle).toBe('title');
24
24
  expect(instance.showAddButton).toBeFalsy();
@@ -17,6 +17,8 @@ export * from './tek-iterable-component-render/iterable-component-render';
17
17
  export * from './tek-iterable-component-render/interfaces';
18
18
  export * from './tek-iterable-carousel/iterable-carousel';
19
19
  export * from './tek-iterable-carousel/interfaces';
20
+ export * from './tek-loading/loading';
21
+ export * from './tek-loading/interfaces';
20
22
  export * from './tek-notifications/notifications';
21
23
  export * from './tek-notifications/interfaces';
22
24
  export * from './tek-grid/interfaces';
@@ -24,6 +26,9 @@ export * from './tek-grid/grid';
24
26
  export * from './tek-grid/grid-column';
25
27
  export * from './tek-grid/grid-columns-button';
26
28
  export * from './tek-grid/layout-options';
29
+ export * from './tek-grid/filter-helper';
27
30
  export * from './tek-datasource/interfaces';
28
31
  export * from './tek-datasource/rest-datasource';
29
32
  export * from './tek-datasource/memory-datasource';
33
+ export * from './tek-tree-grid/interfaces';
34
+ export * from './tek-tree-grid/tree-grid';
@@ -68,6 +68,7 @@ export declare class TekMemoryDatasource extends MemoryDatasource implements ITe
68
68
  type: string;
69
69
  translate?: boolean | string[] | undefined;
70
70
  sortFunction?: ((value1: any, value2: any, columnName: string) => boolean) | undefined;
71
+ sortParams?: IDictionary<any> | undefined;
71
72
  currentRow?: IDictionary<any> | undefined;
72
73
  data?: IDictionary<any>[] | undefined;
73
74
  filter?: IDictionary<any> | undefined;
@@ -0,0 +1,9 @@
1
+ import { TekGridColumn } from '..';
2
+ export declare class TekFilterDynamicValues {
3
+ private static values;
4
+ private static formatDate;
5
+ static getLabel(name: string): string;
6
+ static getValue(name: string, column: TekGridColumn): string | string[];
7
+ static register(name: string, label: string, fn: () => Date | [Date, Date]): void;
8
+ static unregister(name: string): void;
9
+ }
@@ -0,0 +1,9 @@
1
+ import { TekGridColumn } from '..';
2
+ export declare class TekFilterHelper {
3
+ private static values;
4
+ private static formatDate;
5
+ static getLabel(name: string): string;
6
+ static getValue(name: string, column: TekGridColumn): string | string[];
7
+ static register(name: string, label: string, fn: () => Date | [Date, Date]): void;
8
+ static unregister(name: string): void;
9
+ }
@@ -4,6 +4,8 @@ import { ITekGridColumnsButton } from './interfaces';
4
4
  * Base class for TekGrid Columns Button component
5
5
  */
6
6
  export declare class TekGridColumnsButton extends IterableColumnsButton implements ITekGridColumnsButton {
7
+ hideGroups: boolean;
8
+ constructor(props: ITekGridColumnsButton);
7
9
  onCreated(): void;
8
10
  private aggregationDataSet;
9
11
  getAggregationSelectData(): any[];