@zeedhi/teknisa-components-common 1.45.0 → 1.48.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.
@@ -0,0 +1,395 @@
1
+ import {
2
+ Button, Modal, ModalService,
3
+ } from '@zeedhi/common';
4
+ import { Metadata, Http } from '@zeedhi/core';
5
+ import { ITekUserInfo, TekUserInfo } from '../../../../src';
6
+ import { mockCreated } from '../../../__helpers__/mock-created-helper';
7
+
8
+ function instantiateAndCreate(props: ITekUserInfo) {
9
+ const instance = new TekUserInfo(props);
10
+ mockCreated(instance);
11
+ instance.onCreated();
12
+ return instance;
13
+ }
14
+
15
+ describe('TekUserInfo', () => {
16
+ afterEach(() => jest.clearAllMocks());
17
+
18
+ describe('constructor()', () => {
19
+ it('when called, should assign the default values', () => {
20
+ const instance = new TekUserInfo({
21
+ name: 'TekUserInfo',
22
+ component: 'TekUserInfo',
23
+ });
24
+ expect(instance.bottomSlot).toMatchObject([]);
25
+ expect(instance.aboutImage).toBe('');
26
+ expect(instance.defaultEmail).toBe('');
27
+ expect(instance.versionInfo).toBeNull();
28
+ expect(instance.versionUrl).toBe('');
29
+ });
30
+
31
+ it('when called with props, should assign the defined values', () => {
32
+ const instance = instantiateAndCreate({
33
+ name: 'TekUserInfo',
34
+ component: 'TekUserInfo',
35
+ bottomSlot: [
36
+ { name: 'test', component: 'ZdText' },
37
+ ],
38
+ aboutImage: 'path',
39
+ defaultEmail: 'zeedhi@zd.com',
40
+ versionInfo: {
41
+ name: 'Zeedhi',
42
+ version: '1.0.0',
43
+ frontend: [{ name: 'package 1', version: '1.0.0' }],
44
+ backend: [{ name: 'package 2', version: '2.0.0' }],
45
+ modules: [{ name: 'package 3', version: '3.0.0' }],
46
+ },
47
+ versionUrl: '/version',
48
+ });
49
+
50
+ expect(instance.bottomSlot).toEqual([
51
+ { name: 'test', component: 'ZdText' },
52
+ ]);
53
+ expect(instance.aboutImage).toBe('path');
54
+ expect(instance.defaultEmail).toBe('zeedhi@zd.com');
55
+ expect(instance.versionInfo).toEqual({
56
+ name: 'Zeedhi',
57
+ version: '1.0.0',
58
+ frontend: [{ name: 'package 1', version: '1.0.0' }],
59
+ backend: [{ name: 'package 2', version: '2.0.0' }],
60
+ modules: [{ name: 'package 3', version: '3.0.0' }],
61
+ });
62
+ expect(instance.versionUrl).toBe('/version');
63
+ });
64
+ });
65
+
66
+ describe('About Modal', () => {
67
+ it('when about item is clicked, should open about modal', () => {
68
+ const instance = instantiateAndCreate({
69
+ name: 'TekUserInfo',
70
+ component: 'TekUserInfo',
71
+ aboutImage: 'path',
72
+ versionInfo: {
73
+ name: 'Zeedhi',
74
+ version: '1.0.0',
75
+ frontend: [{ name: 'package 1', version: '1.0.0' }],
76
+ backend: [{ name: 'package 2', version: '2.0.0' }],
77
+ modules: [{ name: 'package 3', version: '3.0.0' }],
78
+ },
79
+ });
80
+ instance.onAboutClick();
81
+
82
+ expect(instance.aboutModal).toMatchObject({
83
+ children: [
84
+ {
85
+ component: 'ZdHeader',
86
+ rightSlot: [{ component: 'ZdModalCloseButton' }],
87
+ },
88
+ {
89
+ component: 'ZdTag',
90
+ children: [{ component: 'ZdImage', src: 'path' }],
91
+ },
92
+ {
93
+ component: 'ZdTabs',
94
+ tabs: [
95
+ {
96
+ tabTitle: 'Frontend',
97
+ children: [
98
+ { component: 'ZdText', text: '{{TekUserInfoController_1.mainVersion}}' },
99
+ { component: 'ZdText', text: '{{TekUserInfoController_1.frontendItems}}' },
100
+ ],
101
+ },
102
+ {
103
+ tabTitle: 'Backend',
104
+ children: [
105
+ { component: 'ZdText', text: '{{TekUserInfoController_1.mainVersion}}' },
106
+ { component: 'ZdText', text: '{{TekUserInfoController_1.backendItems}}' },
107
+ ],
108
+ },
109
+ {
110
+ tabTitle: 'Modules',
111
+ children: [
112
+ { component: 'ZdText', text: '{{TekUserInfoController_1.mainVersion}}' },
113
+ { component: 'ZdText', text: '{{TekUserInfoController_1.modulesItems}}' },
114
+ ],
115
+ },
116
+ ],
117
+ },
118
+ ],
119
+ });
120
+ });
121
+
122
+ it('when about item is clicked twice, should create the modal only once', () => {
123
+ const spy = jest.spyOn(ModalService, 'create');
124
+ const instance = instantiateAndCreate({
125
+ name: 'TekUserInfo',
126
+ component: 'TekUserInfo',
127
+ versionInfo: {
128
+ name: 'Zeedhi',
129
+ version: '1.0.0',
130
+ frontend: [{ name: 'package 1', version: '1.0.0' }],
131
+ backend: [{ name: 'package 2', version: '2.0.0' }],
132
+ modules: [{ name: 'package 3', version: '3.0.0' }],
133
+ },
134
+ });
135
+ instance.onAboutClick();
136
+ instance.onAboutClick();
137
+
138
+ expect(spy).toHaveBeenCalledTimes(1);
139
+ });
140
+
141
+ it('when versionInfo is undefined, should create empty tabs inside the modal', () => {
142
+ const instance = instantiateAndCreate({
143
+ name: 'TekUserInfo',
144
+ component: 'TekUserInfo',
145
+ });
146
+ instance.onAboutClick();
147
+
148
+ expect(instance.aboutModal).toMatchObject({
149
+ children: [
150
+ {
151
+ component: 'ZdHeader',
152
+ rightSlot: [{ component: 'ZdModalCloseButton' }],
153
+ },
154
+ {
155
+ component: 'ZdTag',
156
+ children: [{ component: 'ZdImage', src: '' }],
157
+ },
158
+ {
159
+ component: 'ZdTabs',
160
+ tabs: [
161
+ { tabTitle: 'Frontend', children: [] },
162
+ { tabTitle: 'Backend', children: [] },
163
+ { tabTitle: 'Modules', children: [] },
164
+ ],
165
+ },
166
+ ],
167
+ });
168
+ });
169
+ });
170
+
171
+ describe('Report Modal', () => {
172
+ it('when onReportClick is called, should open report modal', () => {
173
+ const instance = instantiateAndCreate({
174
+ name: 'TekUserInfo',
175
+ component: 'TekUserInfo',
176
+ defaultEmail: 'zeedhi@zd.com',
177
+ });
178
+ instance.onReportClick();
179
+
180
+ expect(instance.reportModal).toMatchObject({
181
+ children: [
182
+ {
183
+ component: 'ZdHeader',
184
+ leftSlot: [{ component: 'ZdText', text: 'TEKUSERINFO_REPORT_ERROR' }],
185
+ rightSlot: [{ component: 'ZdModalCloseButton' }],
186
+ },
187
+ {
188
+ component: 'ZdForm',
189
+ children: [
190
+ {
191
+ name: 'report_email',
192
+ component: 'ZdTextInput',
193
+ label: 'E-mail',
194
+ value: '{{TekUserInfoController_1.defaultEmail}}',
195
+ },
196
+ {
197
+ name: 'report_cc',
198
+ component: 'ZdTextInput',
199
+ label: 'CC',
200
+ placeholder: 'TEKUSERINFO_EMAIL_PLACEHOLDER',
201
+ },
202
+ {
203
+ name: 'report_type',
204
+ component: 'ZdSelect',
205
+ label: 'TEKUSERINFO_TYPE',
206
+ datasource: {
207
+ uniqueKey: 'value',
208
+ translate: true,
209
+ data: [
210
+ { value: '0', text: 'TEKUSERINFO_ERROR' },
211
+ { value: '1', text: 'TEKUSERINFO_IMPROVEMENT' },
212
+ ],
213
+ },
214
+ },
215
+ {
216
+ name: 'report_description',
217
+ component: 'ZdTextarea',
218
+ label: 'TEKUSERINFO_DESCRIPTION',
219
+ },
220
+ ],
221
+ },
222
+ {
223
+ component: 'ZdFooter',
224
+ rightSlot: [
225
+ { component: 'ZdButton', label: 'TEKUSERINFO_CANCEL' },
226
+ { component: 'ZdButton', label: 'TEKUSERINFO_SEND' },
227
+ ],
228
+ },
229
+ ],
230
+ });
231
+ });
232
+
233
+ it('when onReportClick is called twice, should create the modal only once', () => {
234
+ const spy = jest.spyOn(ModalService, 'create');
235
+ const instance = instantiateAndCreate({
236
+ name: 'TekUserInfo',
237
+ component: 'TekUserInfo',
238
+ defaultEmail: 'zeedhi@zd.com',
239
+ });
240
+
241
+ instance.onReportClick();
242
+ instance.onReportClick();
243
+
244
+ expect(spy).toHaveBeenCalledTimes(1);
245
+
246
+ spy.mockClear();
247
+ });
248
+
249
+ it('when send button is clicked, should call onSendReport event', () => {
250
+ const onSendReport = jest.fn();
251
+ const spy = jest.spyOn(Metadata, 'getInstance').mockImplementation(() => ({
252
+ validate: () => true,
253
+ }));
254
+ const instance = instantiateAndCreate({
255
+ name: 'TekUserInfo',
256
+ component: 'TekUserInfo',
257
+ events: {
258
+ onSendReport,
259
+ },
260
+ });
261
+ instance.onReportClick();
262
+ const button = instance.reportModal?.children[2].rightSlot[1];
263
+ const buttonInstance = new Button(button);
264
+
265
+ buttonInstance.click();
266
+
267
+ expect(onSendReport).toHaveBeenCalled();
268
+ spy.mockClear();
269
+ });
270
+
271
+ it('when send button is clicked and form is invalid, should not call onSendReport event', () => {
272
+ const onSendReport = jest.fn();
273
+ const spy = jest.spyOn(Metadata, 'getInstance').mockImplementation(() => ({
274
+ validate: () => false,
275
+ }));
276
+ const instance = instantiateAndCreate({
277
+ name: 'TekUserInfo',
278
+ component: 'TekUserInfo',
279
+ events: {
280
+ onSendReport,
281
+ },
282
+ });
283
+ instance.onReportClick();
284
+ const button = instance.reportModal?.children[2].rightSlot[1];
285
+ const buttonInstance = new Button(button);
286
+
287
+ buttonInstance.click();
288
+
289
+ expect(onSendReport).not.toHaveBeenCalled();
290
+ spy.mockClear();
291
+ });
292
+
293
+ it('when reportModal is undefined, should not call onSendReport event', () => {
294
+ const onSendReport = jest.fn();
295
+ const spy = jest.spyOn(Metadata, 'getInstance').mockImplementation(() => ({
296
+ validate: () => false,
297
+ }));
298
+ const instance = instantiateAndCreate({
299
+ name: 'TekUserInfo',
300
+ component: 'TekUserInfo',
301
+ events: {
302
+ onSendReport,
303
+ },
304
+ });
305
+ instance.onReportClick();
306
+ const button = instance.reportModal?.children[2].rightSlot[1];
307
+ const buttonInstance = new Button(button);
308
+
309
+ instance.reportModal = undefined;
310
+ buttonInstance.click();
311
+
312
+ expect(onSendReport).not.toHaveBeenCalled();
313
+ spy.mockClear();
314
+ });
315
+
316
+ it('when cancel button is clicked, should close the modal', () => {
317
+ const instance = instantiateAndCreate({
318
+ name: 'TekUserInfo',
319
+ component: 'TekUserInfo',
320
+ });
321
+ instance.onReportClick();
322
+ const spy = jest.spyOn(instance.reportModal as Modal, 'hide');
323
+ const button = instance.reportModal?.children[2].rightSlot[0];
324
+ const buttonInstance = new Button(button);
325
+
326
+ buttonInstance.click();
327
+
328
+ expect(spy).toHaveBeenCalled();
329
+ spy.mockClear();
330
+ });
331
+
332
+ it('when cancel button is clicked, should not throw if reportModal is undefined', () => {
333
+ const instance = instantiateAndCreate({
334
+ name: 'TekUserInfo',
335
+ component: 'TekUserInfo',
336
+ });
337
+ instance.onReportClick();
338
+ const button = instance.reportModal?.children[2].rightSlot[0];
339
+ const buttonInstance = new Button(button);
340
+
341
+ instance.reportModal = undefined;
342
+
343
+ expect(() => buttonInstance.click()).not.toThrow();
344
+ });
345
+ });
346
+
347
+ describe('onMounted', () => {
348
+ it('when onMounted is called and versionUrl is defined, should make a GET request to versionUrl', async () => {
349
+ const spy = jest.spyOn(Http, 'get').mockImplementation(() => Promise.resolve({
350
+ data: {
351
+ versionInfo: {
352
+ name: 'Zeedhi',
353
+ version: '1.0.0',
354
+ frontend: [{ name: 'package 1', version: '1.0.0' }],
355
+ backend: [{ name: 'package 2', version: '2.0.0' }],
356
+ modules: [{ name: 'package 3', version: '3.0.0' }],
357
+ },
358
+ },
359
+ }));
360
+ const instance = new TekUserInfo({
361
+ name: 'TekUserInfo',
362
+ component: 'TekUserInfo',
363
+ versionUrl: '/version',
364
+ });
365
+
366
+ await instance.onMounted({});
367
+
368
+ expect(instance.versionInfo).toEqual({
369
+ name: 'Zeedhi',
370
+ version: '1.0.0',
371
+ frontend: [{ name: 'package 1', version: '1.0.0' }],
372
+ backend: [{ name: 'package 2', version: '2.0.0' }],
373
+ modules: [{ name: 'package 3', version: '3.0.0' }],
374
+ });
375
+ spy.mockClear();
376
+ });
377
+ });
378
+
379
+ describe('onCreated', () => {
380
+ it('when onCreated is called and bottomSlot is empty, should assign default value to the latter', () => {
381
+ const instance = instantiateAndCreate({
382
+ name: 'TekUserInfo',
383
+ component: 'TekUserInfo',
384
+ });
385
+
386
+ expect(instance.bottomSlot).toMatchObject([
387
+ {
388
+ name: 'TekUserInfo_bottom_list',
389
+ component: 'TekUserInfoList',
390
+ parentName: 'TekUserInfo',
391
+ },
392
+ ]);
393
+ });
394
+ });
395
+ });
@@ -32,3 +32,6 @@ export * from './tek-datasource/rest-datasource';
32
32
  export * from './tek-datasource/memory-datasource';
33
33
  export * from './tek-tree-grid/interfaces';
34
34
  export * from './tek-tree-grid/tree-grid';
35
+ export * from './tek-user-info/interfaces';
36
+ export * from './tek-user-info/tek-user-info';
37
+ export * from './tek-user-info/tek-user-info-list';
@@ -1,7 +1,5 @@
1
1
  import { TekGridColumn } from '..';
2
2
  export declare class TekFilterHelper {
3
- private static values;
4
- private static formatDate;
5
3
  static getLabel(name: string): string;
6
4
  static getValue(name: string, column: TekGridColumn): string | string[];
7
5
  static register(name: string, label: string, fn: () => Date | [Date, Date]): void;
@@ -1,5 +1,5 @@
1
1
  import { IComponent, IComponentEvents, IComponentRender, IGridColumnEditable, IGridEditable, IIterableColumnsButton } from '@zeedhi/common';
2
- import { IDictionary, IEvent, IEventParam } from '@zeedhi/core';
2
+ import { IDictionary, IEvent, IEventParam, IDateHelperValue, IDateHelperValues } from '@zeedhi/core';
3
3
  import { IDynamicFilterItem, TekGridLayoutOptions } from '..';
4
4
  export interface ITekGridLayoutEventParams extends IEventParam<ITekGrid> {
5
5
  layouts: ITekGridLayoutInfo;
@@ -138,10 +138,7 @@ export interface ITekGridSummary {
138
138
  min: any;
139
139
  max: any;
140
140
  }
141
- export interface ITekFilterHelperValue {
142
- label: string;
143
- fn: () => Date | [Date, Date];
141
+ export interface ITekFilterHelperValue extends IDateHelperValue {
144
142
  }
145
- export interface ITekFilterHelperValues {
146
- [key: string]: ITekFilterHelperValue;
143
+ export interface ITekFilterHelperValues extends IDateHelperValues {
147
144
  }
@@ -0,0 +1,20 @@
1
+ import { TekUserInfo } from './tek-user-info';
2
+ export declare class TekUserInfoController {
3
+ component: TekUserInfo;
4
+ get versionInfo(): import("./interfaces").IVersionInfo | null;
5
+ constructor(component: TekUserInfo);
6
+ get name(): string;
7
+ set name(value: string);
8
+ get version(): string;
9
+ set version(value: string);
10
+ get defaultEmail(): string;
11
+ set defaultEmail(value: string);
12
+ get hasDefaultEmail(): boolean;
13
+ get hasAboutImage(): boolean;
14
+ mergeText(name: string, version: string): string;
15
+ get mainVersion(): string;
16
+ protected getItems(tab: 'frontend' | 'backend' | 'modules'): string[];
17
+ get frontendItems(): string[];
18
+ get backendItems(): string[];
19
+ get modulesItems(): string[];
20
+ }
@@ -0,0 +1,27 @@
1
+ import { IList } from '@zeedhi/common';
2
+ import { IUserInfo } from '@zeedhi/zd-user-info-common';
3
+ export interface IVersionInfo {
4
+ name: string;
5
+ version: string;
6
+ frontend: {
7
+ name: string;
8
+ version: string;
9
+ }[];
10
+ backend: {
11
+ name: string;
12
+ version: string;
13
+ }[];
14
+ modules: {
15
+ name: string;
16
+ version: string;
17
+ }[];
18
+ }
19
+ export interface ITekUserInfo extends IUserInfo {
20
+ aboutImage?: string;
21
+ defaultEmail?: string;
22
+ versionInfo?: IVersionInfo | null;
23
+ versionUrl?: string;
24
+ }
25
+ export interface ITekUserInfoList extends IList {
26
+ parentName?: string;
27
+ }
@@ -0,0 +1,29 @@
1
+ import { List } from '@zeedhi/common';
2
+ import { ITekUserInfo, ITekUserInfoList } from './interfaces';
3
+ export declare class TekUserInfoList extends List implements ITekUserInfoList {
4
+ /**
5
+ * Name of the user info component
6
+ */
7
+ parentName: string;
8
+ dense: boolean;
9
+ constructor(props: ITekUserInfo);
10
+ protected getItems(): ({
11
+ name: string;
12
+ component: string;
13
+ title: string;
14
+ subtitle: string;
15
+ cssClass: string;
16
+ prependIcon?: undefined;
17
+ events?: undefined;
18
+ } | {
19
+ name: string;
20
+ component: string;
21
+ title: string;
22
+ prependIcon: string;
23
+ cssClass: string;
24
+ events: {
25
+ click: () => void;
26
+ };
27
+ subtitle?: undefined;
28
+ })[];
29
+ }
@@ -0,0 +1,37 @@
1
+ import { Button, IComponentRender, Modal } from '@zeedhi/common';
2
+ import { IEventParam } from '@zeedhi/core';
3
+ import { UserInfo } from '@zeedhi/zd-user-info-common';
4
+ import { ITekUserInfo, IVersionInfo } from './interfaces';
5
+ export declare class TekUserInfo extends UserInfo implements ITekUserInfo {
6
+ aboutModal?: Modal;
7
+ reportModal?: Modal;
8
+ /**
9
+ * Data about the application version
10
+ */
11
+ versionInfo: IVersionInfo | null;
12
+ /**
13
+ * Default email address to be defined in the Report Bug form
14
+ */
15
+ defaultEmail: string;
16
+ /**
17
+ * Url from which the version info will be retrieved
18
+ */
19
+ versionUrl: string;
20
+ /**
21
+ * Path to the image to be shown on about modal
22
+ */
23
+ aboutImage: string;
24
+ protected propBottomSlot?: IComponentRender[];
25
+ constructor(props: ITekUserInfo);
26
+ protected getBottomSlot(): IComponentRender[];
27
+ onAboutClick(): void;
28
+ protected getVersionTree(tab: 'frontend' | 'backend' | 'modules'): {
29
+ name: string;
30
+ component: string;
31
+ text: string;
32
+ }[];
33
+ onReportClick(): void;
34
+ onSendReport({ event, element }: IEventParam<Button>): void;
35
+ onCreated(): void;
36
+ onMounted(element: any): Promise<void>;
37
+ }
@@ -252,12 +252,7 @@ export declare class GridBase {
252
252
  hideFilterModal(): void;
253
253
  private sortFilterIndex;
254
254
  private getFilterModalComponents;
255
- private getHelperValueComponent;
256
- private createHelperValueOptions;
257
- private helperValuesOptionClick;
258
- private setFilterPropsHelperValue;
259
- private registerFilterComponentToForm;
260
- private clearFilterHelperValue;
255
+ private changeHelperEvent;
261
256
  private loadFilterValues;
262
257
  private applyFilter;
263
258
  private clearFilter;