@unifylib/ui-lib 1.0.3 → 1.1.3

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 (155) hide show
  1. package/ng-package.json +7 -7
  2. package/package.json +14 -12
  3. package/src/lib/base-model/SearchStrConfig.ts +12 -12
  4. package/src/lib/base-model/api-response.ts +23 -23
  5. package/src/lib/base-model/audit-log-entry.ts +7 -7
  6. package/src/lib/base-model/button-action-settings.ts +29 -25
  7. package/src/lib/base-model/column-def.model.ts +34 -34
  8. package/src/lib/base-model/do-action-request.ts +11 -11
  9. package/src/lib/base-model/feature-item.ts +9 -0
  10. package/src/lib/base-model/field-action.ts +7 -7
  11. package/src/lib/base-model/field-filter.model.ts +7 -14
  12. package/src/lib/base-model/field-info.ts +102 -98
  13. package/src/lib/base-model/field-predicate.model.ts +7 -7
  14. package/src/lib/base-model/filter-request.ts +27 -27
  15. package/src/lib/base-model/filter.model.ts +49 -49
  16. package/src/lib/base-model/get-items-list.ts +24 -24
  17. package/src/lib/base-model/index.ts +11 -11
  18. package/src/lib/base-model/items-total.model.ts +12 -0
  19. package/src/lib/base-model/line-item.model.ts +18 -0
  20. package/src/lib/base-model/lookupItem.ts +21 -21
  21. package/src/lib/base-model/null-snackmessage.ts +9 -9
  22. package/src/lib/base-model/page-info.ts +54 -51
  23. package/src/lib/base-model/report-request.model.ts +33 -33
  24. package/src/lib/base-model/response-envelop.model.ts +15 -15
  25. package/src/lib/base-model/snack-message.model.ts +14 -14
  26. package/src/lib/base-model/snackmessage-interface.ts +7 -7
  27. package/src/lib/base-model/table-column.interface.ts +29 -29
  28. package/src/lib/base-model/table-page-user-action.interface.ts +33 -33
  29. package/src/lib/base-model/workflow/workflow-steps.model.ts +9 -9
  30. package/src/lib/base-model/workflow/workflow.model.ts +52 -52
  31. package/src/lib/components/action-comment/action-comment.component.css +52 -0
  32. package/src/lib/components/action-comment/action-comment.component.html +47 -0
  33. package/src/lib/components/{rejection-comment → action-comment}/action-comment.component.spec.ts +23 -23
  34. package/src/lib/components/{rejection-comment → action-comment}/action-comment.component.ts +102 -86
  35. package/src/lib/components/action-confirmation/action-confirmation.component.css +46 -34
  36. package/src/lib/components/action-confirmation/action-confirmation.component.html +32 -18
  37. package/src/lib/components/action-confirmation/action-confirmation.component.spec.ts +23 -23
  38. package/src/lib/components/action-confirmation/action-confirmation.component.ts +58 -58
  39. package/src/lib/components/activity-report-form/activity-report-form.component.html +110 -109
  40. package/src/lib/components/activity-report-form/activity-report-form.component.scss +69 -0
  41. package/src/lib/components/activity-report-form/activity-report-form.component.spec.ts +25 -25
  42. package/src/lib/components/activity-report-form/activity-report-form.component.ts +616 -605
  43. package/src/lib/components/advanced-filter/field-filter/field-filter.component.html +8 -0
  44. package/src/lib/components/advanced-filter/field-filter/field-filter.component.scss +0 -0
  45. package/src/lib/components/advanced-filter/field-filter/field-filter.component.spec.ts +25 -0
  46. package/src/lib/components/advanced-filter/field-filter/field-filter.component.ts +55 -0
  47. package/src/lib/components/advanced-filter/filter-builder/filter-builder.component.html +36 -0
  48. package/src/lib/components/advanced-filter/filter-builder/filter-builder.component.scss +130 -0
  49. package/src/lib/components/advanced-filter/filter-builder/filter-builder.component.spec.ts +25 -0
  50. package/src/lib/components/advanced-filter/filter-builder/filter-builder.component.ts +186 -0
  51. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.css +51 -51
  52. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.html +23 -23
  53. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.spec.ts +23 -23
  54. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.ts +69 -69
  55. package/src/lib/components/audit-log-list/audit-log.component.html +26 -23
  56. package/src/lib/components/audit-log-list/audit-log.component.scss +50 -0
  57. package/src/lib/components/audit-log-list/audit-log.component.spec.ts +25 -25
  58. package/src/lib/components/audit-log-list/audit-log.component.ts +114 -116
  59. package/src/lib/components/auto-complete/auto-complete.component.css +55 -14
  60. package/src/lib/components/auto-complete/auto-complete.component.html +45 -29
  61. package/src/lib/components/auto-complete/auto-complete.component.spec.ts +23 -23
  62. package/src/lib/components/auto-complete/auto-complete.component.ts +331 -330
  63. package/src/lib/components/base-form/base-form.component.html +59 -58
  64. package/src/lib/components/base-form/base-form.component.scss +68 -0
  65. package/src/lib/components/base-form/base-form.component.spec.ts +25 -25
  66. package/src/lib/components/base-form/base-form.component.ts +323 -305
  67. package/src/lib/components/base-form-canvas/base-form-canvas.component.css +196 -22
  68. package/src/lib/components/base-form-canvas/base-form-canvas.component.html +1095 -1006
  69. package/src/lib/components/base-form-canvas/base-form-canvas.component.spec.ts +23 -23
  70. package/src/lib/components/base-form-canvas/base-form-canvas.component.ts +680 -573
  71. package/src/lib/components/base-input-dialog/base-input-dialog.component.css +67 -0
  72. package/src/lib/components/base-input-dialog/base-input-dialog.component.html +47 -42
  73. package/src/lib/components/base-input-dialog/base-input-dialog.component.spec.ts +23 -23
  74. package/src/lib/components/base-input-dialog/base-input-dialog.component.ts +77 -78
  75. package/src/lib/components/base-table/base-table.component.html +268 -242
  76. package/src/lib/components/base-table/base-table.component.scss +140 -31
  77. package/src/lib/components/base-table/base-table.component.spec.ts +25 -25
  78. package/src/lib/components/base-table/base-table.component.ts +621 -568
  79. package/src/lib/components/button-actions/button-actions.component.html +27 -28
  80. package/src/lib/components/button-actions/button-actions.component.scss +101 -6
  81. package/src/lib/components/button-actions/button-actions.component.spec.ts +23 -23
  82. package/src/lib/components/button-actions/button-actions.component.ts +70 -72
  83. package/src/lib/components/editable-base-table/editable-base-table.component.html +337 -372
  84. package/src/lib/components/editable-base-table/editable-base-table.component.scss +126 -44
  85. package/src/lib/components/editable-base-table/editable-base-table.component.spec.ts +25 -25
  86. package/src/lib/components/editable-base-table/editable-base-table.component.ts +579 -570
  87. package/src/lib/components/equation-builder/equation-builder.component.css +39 -0
  88. package/src/lib/components/equation-builder/equation-builder.component.html +31 -31
  89. package/src/lib/components/equation-builder/equation-builder.component.spec.ts +23 -23
  90. package/src/lib/components/equation-builder/equation-builder.component.ts +119 -121
  91. package/src/lib/components/item-line-editor/item-line-editor.component.html +102 -0
  92. package/src/lib/components/item-line-editor/item-line-editor.component.scss +152 -0
  93. package/src/lib/components/item-line-editor/item-line-editor.component.spec.ts +23 -0
  94. package/src/lib/components/item-line-editor/item-line-editor.component.ts +306 -0
  95. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.css +19 -11
  96. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.html +38 -38
  97. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.spec.ts +23 -23
  98. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.ts +315 -317
  99. package/src/lib/components/paginator/paginator.component.css +65 -25
  100. package/src/lib/components/paginator/paginator.component.html +30 -34
  101. package/src/lib/components/paginator/paginator.component.ts +87 -94
  102. package/src/lib/components/report-details-dialog/report-details-dialog.component.css +17 -17
  103. package/src/lib/components/report-details-dialog/report-details-dialog.component.html +16 -16
  104. package/src/lib/components/report-details-dialog/report-details-dialog.component.spec.ts +23 -23
  105. package/src/lib/components/report-details-dialog/report-details-dialog.component.ts +111 -113
  106. package/src/lib/components/report-form/report-form.component.html +92 -94
  107. package/src/lib/components/report-form/report-form.component.scss +51 -0
  108. package/src/lib/components/report-form/report-form.component.spec.ts +25 -25
  109. package/src/lib/components/report-form/report-form.component.ts +599 -588
  110. package/src/lib/components/search-bar/search-bar.component.html +51 -62
  111. package/src/lib/components/search-bar/search-bar.component.scss +63 -8
  112. package/src/lib/components/search-bar/search-bar.component.spec.ts +25 -25
  113. package/src/lib/components/search-bar/search-bar.component.ts +68 -70
  114. package/src/lib/components/section-form-canvas/section-form-canvas.component.html +43 -0
  115. package/src/lib/components/section-form-canvas/section-form-canvas.component.scss +81 -0
  116. package/src/lib/components/section-form-canvas/section-form-canvas.component.spec.ts +23 -0
  117. package/src/lib/components/section-form-canvas/section-form-canvas.component.ts +67 -0
  118. package/src/lib/components/shared/action-button/action-button.component.html +12 -0
  119. package/src/lib/components/shared/action-button/action-button.component.scss +45 -0
  120. package/src/lib/components/shared/action-button/action-button.component.ts +51 -0
  121. package/src/lib/components/shared/action-card/action-card.component.html +78 -0
  122. package/src/lib/components/shared/action-card/action-card.component.scss +238 -0
  123. package/src/lib/components/shared/action-card/action-card.component.ts +56 -0
  124. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.css +135 -54
  125. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.html +36 -22
  126. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.spec.ts +23 -23
  127. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.ts +71 -45
  128. package/src/lib/components/shared-list/shared-list.component.html +17 -17
  129. package/src/lib/components/shared-list/shared-list.component.spec.ts +23 -23
  130. package/src/lib/components/shared-list/shared-list.component.ts +53 -53
  131. package/src/lib/components/snackbar-static/snackbar-static.component.html +20 -0
  132. package/src/lib/components/snackbar-static/snackbar-static.component.scss +135 -0
  133. package/src/lib/components/snackbar-static/snackbar-static.component.ts +26 -0
  134. package/src/lib/components/title-bar/title-bar.component.html +35 -31
  135. package/src/lib/components/title-bar/title-bar.component.scss +126 -23
  136. package/src/lib/components/title-bar/title-bar.component.spec.ts +23 -23
  137. package/src/lib/components/title-bar/title-bar.component.ts +126 -119
  138. package/src/lib/services/backend-service.ts +287 -286
  139. package/src/lib/services/index.ts +3 -3
  140. package/src/lib/services/top-panel.ts +17 -17
  141. package/src/lib/services/trigger-form.service.ts +11 -11
  142. package/src/lib/share-module/shared-module.ts +10 -10
  143. package/src/lib/utils/base-utils.ts +102 -102
  144. package/src/lib/validators/date-range-validator.ts +31 -31
  145. package/src/lib/validators/index.ts +3 -3
  146. package/src/lib/validators/match-list.validator.ts +10 -10
  147. package/src/lib/validators/multi-email-validator.ts +15 -15
  148. package/src/public-api.ts +29 -21
  149. package/tsconfig.lib.json +15 -15
  150. package/tsconfig.lib.prod.json +11 -11
  151. package/tsconfig.spec.json +15 -15
  152. package/src/lib/components/rejection-comment/action-comment.component.css +0 -33
  153. package/src/lib/components/rejection-comment/action-comment.component.html +0 -46
  154. package/src/lib/styles/invoiceq-theme.scss +0 -252
  155. package/src/lib/styles/styles.scss +0 -1723
@@ -1,305 +1,323 @@
1
- import {Component, EventEmitter, Inject, Input, OnChanges, OnInit, Output, SimpleChanges} from '@angular/core';
2
- import {FieldInfo, Filter, FilterRequest, NEW, PageInfo, SAVE_AND_COMPLETE, SnackMessage} from "../../base-model";
3
- import {FieldMessage} from "../../base-model/api-response";
4
- import {TranslateModule} from "@ngx-translate/core";
5
- import {BackendService} from "../../services";
6
- import {FormGroup} from "@angular/forms";
7
- import {Location, NgIf} from "@angular/common";
8
- import {FlexLayoutModule} from "@angular/flex-layout";
9
- import {MatButton, MatButtonModule} from "@angular/material/button";
10
- import {MatIconModule} from "@angular/material/icon";
11
- import {TitleBarComponent} from "../title-bar/title-bar.component";
12
- import {BaseFormCanvasComponent} from "../base-form-canvas/base-form-canvas.component";
13
- import {DoActionRequest, SAVE} from "../../base-model/do-action-request";
14
- import {ActionCommentComponent} from "../rejection-comment/action-comment.component";
15
- import {MatDialog} from "@angular/material/dialog";
16
- import {BaseUtils, getNegativeWfActionKey, getPositiveWfActionKey, getWfActionId} from "../../utils/base-utils";
17
- import {ActivatedRoute, Router} from "@angular/router";
18
- import {AuditLogComponent} from "../audit-log-list/audit-log.component";
19
- import {Directionality} from "@angular/cdk/bidi";
20
-
21
- @Component({
22
- selector: 'app-base-form',
23
- standalone: true,
24
- imports: [
25
- FlexLayoutModule,
26
- TitleBarComponent,
27
- BaseFormCanvasComponent,
28
- MatButtonModule,
29
- TranslateModule,
30
- NgIf,
31
- MatIconModule,
32
- MatButton,
33
- AuditLogComponent
34
- ],
35
- templateUrl: './base-form.component.html',
36
- styleUrl: './base-form.component.scss'
37
- })
38
- export class BaseFormComponent extends BaseUtils implements OnInit, OnChanges {
39
-
40
- @Input()
41
- override pageInfo!: PageInfo;
42
-
43
- @Input()// @ts-ignore
44
- fields: FieldInfo[] = [];
45
-
46
- @Input()// @ts-ignore
47
- errors: FieldMessage[] = [];
48
-
49
- @Input()
50
- editable: boolean = false;
51
-
52
- @Input()
53
- itemId: number;
54
-
55
- @Output()
56
- actionResultEmitter: EventEmitter<any> = new EventEmitter<any>();
57
-
58
- @Output()
59
- formUpdated: EventEmitter<FormGroup> = new EventEmitter<FormGroup>();
60
-
61
- @Output()
62
- itemLoaded: EventEmitter<any> = new EventEmitter<any>();
63
-
64
- @Output()
65
- extraAction: EventEmitter<any> = new EventEmitter<any>();
66
-
67
- item : any = {};
68
- isLoaded : boolean = false;
69
-
70
- @Output()
71
- hyperTextEvent: EventEmitter<boolean> = new EventEmitter();
72
-
73
- currentDirection: 'ltr' | 'rtl';
74
- isSaveDisabled: boolean = true;
75
- isRejectDisabled: boolean = true;
76
-
77
- @Input()
78
- hideBackButton: boolean = true;
79
- protected readonly SAVE = SAVE;
80
- private isPending: boolean;
81
-
82
- constructor(public dialog: MatDialog,
83
- private activatedRoute: ActivatedRoute,
84
- private router:Router,
85
- private directionality: Directionality,
86
- private location:Location,
87
- @Inject('securityManager') private securityManager: any,
88
- public backendService: BackendService) {
89
- super();
90
- }
91
-
92
- ngOnInit(): void {
93
- this.currentDirection = this.directionality.value;
94
- this.directionality.change.subscribe((value) => {
95
- this.currentDirection = value;
96
- })
97
-
98
- // console.log('editable', this.editable)
99
- this.securityManager.loadPermissions().subscribe(x => {
100
- console.log("before edit", this.editable);
101
- this.loadItem();
102
- console.log("after edit", this.editable);
103
- });
104
- }
105
-
106
- ngOnChanges({item, errors, fields}: SimpleChanges): void {
107
- }
108
-
109
- isValid() {
110
- return this.backendService.parentForm?.valid;
111
- }
112
-
113
- isMatchHeight() {
114
- return this.pageInfo.pageHeight === 'match';
115
- }
116
-
117
- private loadItem() {
118
- this.editable = false;
119
- this.isPending = this.backendService.decrypt(this.activatedRoute.snapshot.queryParams['mode']) === 'pending';
120
-
121
- if (this.activatedRoute.snapshot.queryParams['token'] && this.activatedRoute.snapshot.queryParams['mode']) {
122
- this.itemId = this.backendService.decrypt(this.activatedRoute.snapshot.queryParams['token']);
123
- } else {
124
- // console.log(' ****** ****** ****** ****** error in url ')
125
- }
126
- if (this.itemId > 0) {
127
- const filterRequest = new FilterRequest;
128
- filterRequest.columns = this.fields.filter(c => c.type !== 'spacer').map(c => c.property);
129
- filterRequest.pendingPage = this.isPending;
130
- filterRequest.filters = [];
131
- filterRequest.filters.push(new Filter({
132
- key: 0,
133
- fieldType: 'Long',
134
- fieldName: 'id',
135
- valueObject: this.itemId,
136
- filterType: 'FILED_FILTER',
137
- operator: 'EQUALS'
138
- }));
139
- ///audit-log
140
- this.backendService.getItemAuditLog(filterRequest, this.pageInfo!.apiUri).subscribe(resp => {
141
- // console.log('resp', resp);
142
- });
143
- this.backendService.getItemsByFilter(filterRequest, this.pageInfo!.apiUri).subscribe(resp => {
144
- if (resp?.valid && resp.body?.length >= 0) {
145
- this.item = resp.body[0];
146
- this.editable = (!this.pageInfo.draftSupported || !this.isPending) && this.securityManager.hasPagePermission(this.pageInfo.id, 'EDIT')
147
- && (!this.pageInfo.draftSupported ||this.item['stateType'] === 'COMPLETED' );
148
- this.itemLoaded.emit(this.item);
149
- this.isLoaded = true;
150
- }
151
- });
152
- } else {
153
- this.editable = this.securityManager.hasPagePermission(this.pageInfo.id, 'EDIT');
154
- this.item = {};
155
- this.itemLoaded.emit(this.item);
156
- this.isLoaded = true;
157
- }
158
-
159
- }
160
-
161
- buildDoActionSubject(): any {
162
- const newVar = this.editable ? Object.assign(this.item, this.backendService.parentForm.value) : this.item;
163
- if (this.itemId <= 0 && this.editable ) {
164
- //TODO this is like a hack and must be handled from backend
165
- newVar['stateType'] = 'NEW';
166
- }
167
- this.fields.forEach(field => {
168
- if (field.flattenBySubAttribute){
169
- newVar[field.property] = newVar[field.property][field.flattenBySubAttribute]
170
- }
171
- })
172
- if (!this.pageInfo.draftSupported){
173
- newVar['status'] = true;
174
- }
175
- return newVar;
176
- }
177
-
178
-
179
- doSaveApproveAction() {
180
- let actionId = getWfActionId(this.item.stateType);
181
- if (this.itemId <= 0 && this.editable ) {
182
- actionId = NEW
183
- }
184
- if (!this.pageInfo.draftSupported) {
185
- actionId = SAVE_AND_COMPLETE
186
- }
187
- if (this.editable && this.backendService.parentForm.valid !== true) {
188
- this.backendService.topPanelMessage$.next(new SnackMessage('INVALID_INPUT_FORM', true, 'error'));
189
- return;
190
- }
191
- const request = new DoActionRequest();
192
- request.actionId = actionId;
193
- request.subject = this.buildDoActionSubject();
194
-
195
- const dialogRef = this.dialog.open(ActionCommentComponent, {
196
- data: {label: 'save', isTermination: false},
197
- width: '600px',
198
- height: 'auto',
199
- direction: this.currentDirection
200
- });
201
- dialogRef.afterClosed().subscribe(result => {
202
- if (result) {
203
- request.comment = result.comment;
204
- this.backendService.doActionWithAttachments(request, [], this.pageInfo!).subscribe(resp => {
205
- console.log('step',actionId);
206
- this.actionResultEmitter.emit({ valid: resp.valid, actionId: actionId });
207
- if (resp.valid ) {
208
- let message = 'approve_successfully';
209
- switch (actionId) {
210
- case 1:
211
- message = 'saved_successfully';
212
- break;
213
- case 2:
214
- message = 'updated_successfully';
215
- break;
216
- default:
217
- message = 'approve_successfully';
218
- }
219
- this.backendService.topPanelMessage$.next(new SnackMessage(message, true, 'success'));
220
- this.backToParent();
221
- }
222
- else{
223
- request.subject['stateType'] = null;
224
- if (resp.message[0].errorMessage.toLowerCase().includes('duplic'))
225
- this.backendService.topPanelMessage$.next(new SnackMessage(this.pageInfo.labelsSection + '.' + resp.message[0].errorCode, true, 'error'));
226
- }
227
- });
228
- }
229
- });
230
- }
231
-
232
- backToParent() {
233
- const idIdx = this.router.url.lastIndexOf('/');
234
- this.router.navigateByUrl(this.router.url.substring(0, idIdx));
235
- }
236
-
237
-
238
- getTitle() {
239
- return `${this.pageInfo.labelsSection}.${this.pageInfo.id}` ;
240
- }
241
-
242
- updateForm($event: FormGroup) {
243
- this.backendService.parentForm = $event;
244
- this.formUpdated.emit($event);
245
- }
246
-
247
- doCancelRejectAction() {
248
- if (!this.editable){
249
- let actionId = 3;
250
- // console.log('actionId',actionId);
251
- const request = new DoActionRequest();
252
- request.actionId = actionId;
253
- request.subject = this.buildDoActionSubject();
254
-
255
- const dialogRef = this.dialog.open(ActionCommentComponent, {
256
- data: {label: 'reject', acceptActionLabel: 'accept', rejectActionLabel: 'return'},
257
- width: '600px',
258
- height: 'auto',
259
- direction: this.currentDirection
260
- });
261
- dialogRef.afterClosed().subscribe(result => {
262
- if (result) {
263
- request.comment = result.comment;
264
- this.backendService.doActionWithAttachments(request, [], this.pageInfo!).subscribe(resp => {
265
- this.actionResultEmitter.emit({ valid: resp.valid, actionId: actionId });
266
- if (resp.valid) {
267
- this.backendService.topPanelMessage$.next(new SnackMessage('successful_reject_message', true, 'success'));
268
- this.backToParent();
269
- }
270
- });
271
- }
272
- });
273
- }
274
- else {
275
- this.location.back()
276
- }
277
- }
278
-
279
- hasWfPermission() {
280
- return (this.securityManager.hasPagePermission(this.pageInfo.id, 'EDIT')
281
- || this.securityManager.hasPagePermission(this.pageInfo.id, 'COMPLETE')
282
- || this.securityManager.hasPagePermission(this.pageInfo.id, 'TERMINATE'))
283
- }
284
-
285
- protected readonly getPositiveWfActionKey = getPositiveWfActionKey;
286
- protected readonly getNegativeWfActionKey = getNegativeWfActionKey;
287
-
288
- hasWfPositivePermission() {
289
- return (!this.editable && this.securityManager.hasPagePermission(this.pageInfo.id, 'COMPLETE')) ||
290
- (this.editable && this.securityManager.hasPagePermission(this.pageInfo.id, 'EDIT'))
291
- }
292
-
293
- hasWfNegativePermission() {
294
- return (!this.editable && this.securityManager.hasPagePermission(this.pageInfo.id, 'TERMINATE')) ||
295
- (this.editable && this.securityManager.hasPagePermission(this.pageInfo.id, 'EDIT'))
296
- }
297
-
298
- doExtraAction() {
299
- this.extraAction.emit()
300
- }
301
- disabledSaveButton(element) {
302
- return (!this.isPending && element.stateType == 'PENDING') && this.pageInfo.draftSupported ;
303
- }
304
-
305
- }
1
+ import {Component, EventEmitter, Inject, Input, OnChanges, OnInit, Output, SimpleChanges} from '@angular/core';
2
+ import {FieldInfo, Filter, FilterRequest, NEW, PageInfo, SAVE_AND_COMPLETE, SnackMessage} from "../../base-model";
3
+ import {FieldMessage} from "../../base-model/api-response";
4
+ import {TranslateModule} from "@ngx-translate/core";
5
+ import {BackendService} from "../../services";
6
+ import {FormGroup} from "@angular/forms";
7
+ import {Location, NgIf} from "@angular/common";
8
+ import {MatButton, MatButtonModule} from "@angular/material/button";
9
+ import {MatIconModule} from "@angular/material/icon";
10
+ import {TitleBarComponent} from "../title-bar/title-bar.component";
11
+ import {BaseFormCanvasComponent} from "../base-form-canvas/base-form-canvas.component";
12
+ import ClassicEditor from "@ckeditor/ckeditor5-build-classic";
13
+ import {DoActionRequest, SAVE} from "../../base-model/do-action-request";
14
+ import {ActionCommentComponent} from "../action-comment/action-comment.component";
15
+ import {MatDialog} from "@angular/material/dialog";
16
+ import {BaseUtils, getNegativeWfActionKey, getPositiveWfActionKey, getWfActionId} from "../../utils/base-utils";
17
+ import {ActivatedRoute, Router} from "@angular/router";
18
+ import {AuditLogComponent} from "../audit-log-list/audit-log.component";
19
+ import {Directionality} from "@angular/cdk/bidi";
20
+
21
+ @Component({
22
+ selector: 'app-base-form',
23
+ standalone: true,
24
+ imports: [
25
+ TitleBarComponent,
26
+ BaseFormCanvasComponent,
27
+ MatButtonModule,
28
+ TranslateModule,
29
+ NgIf,
30
+ MatIconModule,
31
+ MatButton,
32
+ AuditLogComponent
33
+ ],
34
+ templateUrl: './base-form.component.html',
35
+ styleUrl: './base-form.component.scss'
36
+ })
37
+ export class BaseFormComponent extends BaseUtils implements OnInit, OnChanges {
38
+
39
+ @Input()
40
+ override pageInfo!: PageInfo;
41
+
42
+ @Input()// @ts-ignore
43
+ fields: FieldInfo[] = [];
44
+
45
+ @Input()// @ts-ignore
46
+ errors: FieldMessage[] = [];
47
+
48
+ @Input()
49
+ editable: boolean = false;
50
+
51
+ @Input()
52
+ itemId: number;
53
+
54
+ @Output()
55
+ actionResultEmitter: EventEmitter<any> = new EventEmitter<any>();
56
+
57
+ @Output()
58
+ formUpdated: EventEmitter<FormGroup> = new EventEmitter<FormGroup>();
59
+
60
+ @Output()
61
+ itemLoaded: EventEmitter<any> = new EventEmitter<any>();
62
+
63
+ @Output()
64
+ extraAction: EventEmitter<any> = new EventEmitter<any>();
65
+
66
+ item : any = {};
67
+ isLoaded : boolean = false;
68
+
69
+ @Output()
70
+ hyperTextEvent: EventEmitter<boolean> = new EventEmitter();
71
+
72
+ currentDirection: 'ltr' | 'rtl';
73
+ isSaveDisabled: boolean = true;
74
+ isRejectDisabled: boolean = true;
75
+
76
+ @Input()
77
+ hideBackButton: boolean = true;
78
+ protected readonly SAVE = SAVE;
79
+ private isPending: boolean;
80
+
81
+ constructor(public dialog: MatDialog,
82
+ private activatedRoute: ActivatedRoute,
83
+ private router:Router,
84
+ private directionality: Directionality,
85
+ private location:Location,
86
+ @Inject('securityManager') private securityManager: any,
87
+ public backendService: BackendService) {
88
+ super();
89
+ ClassicEditor.defaultConfig = {
90
+ toolbar: {
91
+ items: ['heading', '|', 'bold', 'italic', '|', 'bulletedList', 'numberedList']
92
+ },
93
+ image: {
94
+ toolbar: ['imageStyle:side', '|', 'imageTextAlternative']
95
+ },
96
+ table: {
97
+ contentToolbar: [ 'tableColumn', 'tableRow', 'mergeTableCells' ]
98
+ },
99
+ language: 'en'
100
+ };
101
+ }
102
+
103
+ ngOnInit(): void {
104
+ this.currentDirection = this.directionality.value;
105
+ this.directionality.change.subscribe((value) => {
106
+ this.currentDirection = value;
107
+ })
108
+
109
+ // console.log('editable', this.editable)
110
+ this.securityManager.loadPermissions().subscribe(x => {
111
+ console.log("before edit", this.editable);
112
+ this.loadItem();
113
+ console.log("after edit", this.editable);
114
+ });
115
+ }
116
+
117
+ ngOnChanges({item, errors, fields}: SimpleChanges): void {
118
+ }
119
+
120
+ isValid() {
121
+ return this.backendService.parentForm?.valid;
122
+ }
123
+
124
+ isMatchHeight() {
125
+ return this.pageInfo.pageHeight === 'match';
126
+ }
127
+
128
+ private loadItem() {
129
+ this.editable = false;
130
+
131
+ const modeEncrypted = this.activatedRoute.snapshot.queryParams['mode'];
132
+ this.isPending = !!modeEncrypted && this.backendService.decrypt(modeEncrypted) === 'pending';
133
+
134
+ if (this.activatedRoute.snapshot.queryParams['token'] && this.activatedRoute.snapshot.queryParams['mode']) {
135
+ this.itemId = this.backendService.decrypt(this.activatedRoute.snapshot.queryParams['token']);
136
+ } else {
137
+ // console.log(' ****** ****** ****** ****** error in url ')
138
+ }
139
+ if (this.itemId > 0) {
140
+ const filterRequest = new FilterRequest;
141
+ filterRequest.columns = this.fields.filter(c => c.type !== 'spacer').map(c => c.property);
142
+ filterRequest.pendingPage = this.isPending;
143
+
144
+ filterRequest.filters = [];
145
+ filterRequest.filters.push(new Filter({
146
+ key: 0,
147
+ fieldType: 'Long',
148
+ fieldName: 'id',
149
+ valueObject: this.itemId,
150
+ filterType: 'FILED_FILTER',
151
+ operator: 'EQUALS'
152
+ }));
153
+ ///audit-log
154
+ this.backendService.getItemAuditLog(filterRequest, this.pageInfo!.apiUri).subscribe(resp => {
155
+ // console.log('resp', resp);
156
+ });
157
+ this.backendService.getItemsByFilter(filterRequest, this.pageInfo!.apiUri).subscribe(resp => {
158
+ if (resp?.valid && resp.body?.length >= 0) {
159
+ this.item = resp.body[0];
160
+ this.editable = (!this.pageInfo.draftSupported || !this.isPending) && this.securityManager.hasPagePermission(this.pageInfo.id, 'EDIT')
161
+ && (!this.pageInfo.draftSupported ||this.item['stateType'] === 'COMPLETED' );
162
+ this.itemLoaded.emit(this.item);
163
+ this.isLoaded = true;
164
+ }
165
+ });
166
+ } else {
167
+ this.editable = this.securityManager.hasPagePermission(this.pageInfo.id, 'EDIT');
168
+ this.item = {};
169
+ this.itemLoaded.emit(this.item);
170
+ this.isLoaded = true;
171
+ }
172
+
173
+ }
174
+
175
+ buildDoActionSubject(): any {
176
+ const newVar = this.editable ? Object.assign(this.item, this.backendService.parentForm.value) : this.item;
177
+ if (this.itemId <= 0 && this.editable ) {
178
+ //TODO this is like a hack and must be handled from backend
179
+ newVar['stateType'] = 'NEW';
180
+ }
181
+ this.fields.forEach(field => {
182
+ if (field.flattenBySubAttribute){
183
+ newVar[field.property] = newVar[field.property][field.flattenBySubAttribute]
184
+ }
185
+ })
186
+ if (!this.pageInfo.draftSupported){
187
+ newVar['status'] = true;
188
+ }
189
+ return newVar;
190
+ }
191
+
192
+
193
+ doSaveApproveAction() {
194
+ let actionId = getWfActionId(this.item.stateType);
195
+ if (this.itemId <= 0 && this.editable ) {
196
+ actionId = NEW
197
+ }
198
+ if (!this.pageInfo.draftSupported) {
199
+ actionId = SAVE_AND_COMPLETE
200
+ }
201
+ if (this.editable && this.backendService.parentForm.valid !== true) {
202
+ this.backendService.topPanelMessage$.next(new SnackMessage('INVALID_INPUT_FORM', true, 'error'));
203
+ return;
204
+ }
205
+ const request = new DoActionRequest();
206
+ request.actionId = actionId;
207
+ request.subject = this.buildDoActionSubject();
208
+
209
+ const dialogRef = this.dialog.open(ActionCommentComponent, {
210
+ data: {label: 'save', isTermination: false},
211
+ width: '600px',
212
+ height: 'auto',
213
+ direction: this.currentDirection
214
+ });
215
+ dialogRef.afterClosed().subscribe(result => {
216
+ if (result) {
217
+ request.comment = result.comment;
218
+ this.backendService.doActionWithAttachments(request, [], this.pageInfo!).subscribe(resp => {
219
+ console.log('step',actionId);
220
+ this.actionResultEmitter.emit({ valid: resp.valid, actionId: actionId });
221
+ if (resp.valid ) {
222
+ let message = 'approve_successfully';
223
+ switch (actionId) {
224
+ case 1:
225
+ message = 'saved_successfully';
226
+ break;
227
+ case 2:
228
+ message = 'updated_successfully';
229
+ break;
230
+ default:
231
+ message = 'approve_successfully';
232
+ }
233
+ this.backendService.topPanelMessage$.next(new SnackMessage(message, true, 'success'));
234
+ if(!this.pageInfo.stayOnPage){
235
+ this.backToParent();
236
+ }
237
+ }
238
+ else{
239
+ request.subject['stateType'] = null;
240
+ if (resp.message[0].errorMessage.toLowerCase().includes('duplic'))
241
+ this.backendService.topPanelMessage$.next(new SnackMessage(this.pageInfo.labelsSection + '.' + resp.message[0].errorCode, true, 'error'));
242
+ }
243
+ });
244
+ }
245
+ });
246
+ }
247
+
248
+ backToParent() {
249
+ const idIdx = this.router.url.lastIndexOf('/');
250
+ this.router.navigateByUrl(this.router.url.substring(0, idIdx));
251
+ }
252
+
253
+
254
+ getTitle() {
255
+ return `${this.pageInfo.labelsSection}.${this.pageInfo.id}` ;
256
+ }
257
+
258
+ updateForm($event: FormGroup) {
259
+ this.backendService.parentForm = $event;
260
+ this.formUpdated.emit($event);
261
+ }
262
+
263
+ doCancelRejectAction() {
264
+ if (!this.editable){
265
+ let actionId = 3;
266
+ // console.log('actionId',actionId);
267
+ const request = new DoActionRequest();
268
+ request.actionId = actionId;
269
+ request.subject = this.buildDoActionSubject();
270
+
271
+ const dialogRef = this.dialog.open(ActionCommentComponent, {
272
+ data: {label: 'reject', acceptActionLabel: 'accept', rejectActionLabel: 'return'},
273
+ width: '600px',
274
+ height: 'auto',
275
+ direction: this.currentDirection
276
+ });
277
+ dialogRef.afterClosed().subscribe(result => {
278
+ if (result) {
279
+ request.comment = result.comment;
280
+ this.backendService.doActionWithAttachments(request, [], this.pageInfo!).subscribe(resp => {
281
+ this.actionResultEmitter.emit({ valid: resp.valid, actionId: actionId });
282
+ if (resp.valid) {
283
+ this.backendService.topPanelMessage$.next(new SnackMessage('successful_reject_message', true, 'success'));
284
+ if(!this.pageInfo.stayOnPage){
285
+ this.backToParent();
286
+ }
287
+ }
288
+ });
289
+ }
290
+ });
291
+ }
292
+ else {
293
+ this.location.back()
294
+ }
295
+ }
296
+
297
+ hasWfPermission() {
298
+ return (this.securityManager.hasPagePermission(this.pageInfo.id, 'EDIT')
299
+ || this.securityManager.hasPagePermission(this.pageInfo.id, 'COMPLETE')
300
+ || this.securityManager.hasPagePermission(this.pageInfo.id, 'TERMINATE'))
301
+ }
302
+
303
+ protected readonly getPositiveWfActionKey = getPositiveWfActionKey;
304
+ protected readonly getNegativeWfActionKey = getNegativeWfActionKey;
305
+
306
+ hasWfPositivePermission() {
307
+ return (!this.editable && this.securityManager.hasPagePermission(this.pageInfo.id, 'COMPLETE')) ||
308
+ (this.editable && this.securityManager.hasPagePermission(this.pageInfo.id, 'EDIT'))
309
+ }
310
+
311
+ hasWfNegativePermission() {
312
+ return (!this.editable && this.securityManager.hasPagePermission(this.pageInfo.id, 'TERMINATE')) ||
313
+ (this.editable && this.securityManager.hasPagePermission(this.pageInfo.id, 'EDIT'))
314
+ }
315
+
316
+ doExtraAction() {
317
+ this.extraAction.emit()
318
+ }
319
+ disabledSaveButton(element) {
320
+ return (!this.isPending && element.stateType == 'PENDING') && this.pageInfo.draftSupported ;
321
+ }
322
+
323
+ }