@pega/angular-sdk-overrides 0.25.1 → 0.25.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 (160) hide show
  1. package/lib/designSystemExtension/alert/alert.component.scss +3 -3
  2. package/lib/designSystemExtension/banner/banner.component.scss +12 -2
  3. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.html +6 -3
  4. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.scss +5 -34
  5. package/lib/designSystemExtension/material-details/material-details.component.scss +0 -5
  6. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.html +2 -2
  7. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.scss +4 -3
  8. package/lib/designSystemExtension/material-summary-item/material-summary-item.component.scss +2 -17
  9. package/lib/designSystemExtension/material-utility/material-utility.component.scss +1 -2
  10. package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.scss +1 -1
  11. package/lib/designSystemExtension/operator/operator.component.html +1 -1
  12. package/lib/designSystemExtension/operator/operator.component.scss +3 -10
  13. package/lib/designSystemExtension/operator/operator.component.ts +0 -1
  14. package/lib/designSystemExtension/pulse/pulse.component.scss +2 -2
  15. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.scss +0 -1
  16. package/lib/designSystemExtension/wss-quick-create/wss-quick-create.component.scss +16 -8
  17. package/lib/field/auto-complete/auto-complete.component.html +0 -1
  18. package/lib/field/auto-complete/auto-complete.component.ts +35 -172
  19. package/lib/field/cancel-alert/cancel-alert.component.html +8 -12
  20. package/lib/field/cancel-alert/cancel-alert.component.scss +2 -3
  21. package/lib/field/cancel-alert/cancel-alert.component.ts +24 -36
  22. package/lib/field/check-box/check-box.component.html +0 -1
  23. package/lib/field/check-box/check-box.component.scss +0 -1
  24. package/lib/field/check-box/check-box.component.ts +19 -149
  25. package/lib/field/currency/currency.component.ts +36 -168
  26. package/lib/field/date/date.component.html +1 -1
  27. package/lib/field/date/date.component.ts +30 -150
  28. package/lib/field/date-time/date-time.component.ts +31 -149
  29. package/lib/field/decimal/decimal.component.ts +38 -163
  30. package/lib/field/dropdown/dropdown.component.ts +29 -151
  31. package/lib/field/email/email.component.ts +16 -155
  32. package/lib/field/field.base.ts +149 -0
  33. package/lib/field/group/group.component.ts +7 -4
  34. package/lib/field/integer/integer.component.ts +18 -157
  35. package/lib/field/location/location.component.ts +1 -1
  36. package/lib/field/multiselect/multiselect.component.ts +46 -148
  37. package/lib/field/multiselect/utils.ts +55 -47
  38. package/lib/field/object-reference/object-reference.component.html +17 -0
  39. package/lib/field/object-reference/object-reference.component.scss +0 -0
  40. package/lib/field/object-reference/object-reference.component.spec.ts +22 -0
  41. package/lib/field/object-reference/object-reference.component.ts +237 -0
  42. package/lib/field/percentage/percentage.component.ts +37 -154
  43. package/lib/field/phone/phone.component.ts +28 -142
  44. package/lib/field/radio-buttons/radio-buttons.component.scss +4 -2
  45. package/lib/field/radio-buttons/radio-buttons.component.ts +35 -161
  46. package/lib/field/rich-text/rich-text.component.ts +19 -90
  47. package/lib/field/scalar-list/scalar-list.component.ts +17 -72
  48. package/lib/field/selectable-card/selectable-card.component.html +54 -24
  49. package/lib/field/selectable-card/selectable-card.component.scss +11 -0
  50. package/lib/field/selectable-card/selectable-card.component.ts +16 -52
  51. package/lib/field/semantic-link/semantic-link.component.html +4 -8
  52. package/lib/field/semantic-link/semantic-link.component.scss +0 -13
  53. package/lib/field/semantic-link/semantic-link.component.ts +165 -5
  54. package/lib/field/text/text.component.scss +0 -1
  55. package/lib/field/text-area/text-area.component.ts +18 -152
  56. package/lib/field/text-input/text-input.component.ts +16 -155
  57. package/lib/field/time/time.component.ts +17 -151
  58. package/lib/field/url/url.component.ts +16 -154
  59. package/lib/field/user-reference/user-reference.component.scss +0 -1
  60. package/lib/field/user-reference/user-reference.component.ts +2 -3
  61. package/lib/infra/Containers/flow-container/flow-container.component.ts +5 -7
  62. package/lib/infra/Containers/modal-view-container/modal-view-container.component.ts +5 -10
  63. package/lib/infra/Containers/view-container/helper.ts +35 -2
  64. package/lib/infra/Containers/view-container/view-container.component.ts +1 -1
  65. package/lib/infra/action-buttons/action-buttons.component.html +13 -8
  66. package/lib/infra/action-buttons/action-buttons.component.scss +23 -0
  67. package/lib/infra/action-buttons/action-buttons.component.ts +1 -2
  68. package/lib/infra/assignment/assignment.component.ts +8 -6
  69. package/lib/infra/assignment-card/assignment-card.component.html +1 -2
  70. package/lib/infra/assignment-card/assignment-card.component.scss +0 -4
  71. package/lib/infra/assignment-card/assignment-card.component.ts +21 -4
  72. package/lib/infra/defer-load/defer-load.component.html +6 -2
  73. package/lib/infra/defer-load/defer-load.component.ts +16 -10
  74. package/lib/infra/multi-step/multi-step.component.scss +1 -21
  75. package/lib/infra/navbar/navbar.component.html +25 -28
  76. package/lib/infra/navbar/navbar.component.scss +16 -4
  77. package/lib/infra/navbar/navbar.component.ts +8 -3
  78. package/lib/infra/root-container/root-container.component.scss +0 -1
  79. package/lib/infra/root-container/root-container.component.ts +1 -2
  80. package/lib/infra/stages/stages.component.html +2 -2
  81. package/lib/infra/stages/stages.component.scss +7 -35
  82. package/lib/infra/stages/stages.component.ts +4 -2
  83. package/lib/infra/view/view.component.html +1 -1
  84. package/lib/infra/view/view.component.ts +0 -2
  85. package/lib/template/advanced-search/advanced-search.component.html +12 -0
  86. package/lib/template/advanced-search/advanced-search.component.scss +0 -0
  87. package/lib/template/advanced-search/advanced-search.component.spec.ts +0 -0
  88. package/lib/template/advanced-search/advanced-search.component.ts +112 -0
  89. package/lib/template/advanced-search/advanced-search.service.ts +27 -0
  90. package/lib/template/advanced-search/search-group/persist-utils.ts +56 -0
  91. package/lib/template/advanced-search/search-groups/search-groups.component.html +32 -0
  92. package/lib/template/advanced-search/search-groups/search-groups.component.scss +0 -0
  93. package/lib/template/advanced-search/search-groups/search-groups.component.spec.ts +0 -0
  94. package/lib/template/advanced-search/search-groups/search-groups.component.ts +294 -0
  95. package/lib/template/advanced-search/search-groups/utils.ts +29 -0
  96. package/lib/template/app-shell/app-shell.component.html +4 -1
  97. package/lib/template/app-shell/app-shell.component.scss +0 -3
  98. package/lib/template/app-shell/app-shell.component.ts +46 -7
  99. package/lib/template/case-summary/case-summary.component.scss +0 -2
  100. package/lib/template/case-view/case-view.component.html +3 -3
  101. package/lib/template/case-view/case-view.component.scss +18 -10
  102. package/lib/template/case-view/case-view.component.ts +1 -1
  103. package/lib/template/data-reference/data-reference-advanced-search.service.ts +16 -0
  104. package/lib/template/data-reference/data-reference.component.html +11 -8
  105. package/lib/template/data-reference/data-reference.component.ts +346 -112
  106. package/lib/template/data-reference/search-form/search-form.component.html +39 -0
  107. package/lib/template/data-reference/search-form/search-form.component.scss +11 -0
  108. package/lib/template/data-reference/search-form/search-form.component.spec.ts +0 -0
  109. package/lib/template/data-reference/search-form/search-form.component.ts +167 -0
  110. package/lib/template/data-reference/search-form/tabsData.ts +160 -0
  111. package/lib/template/data-reference/utils.ts +92 -0
  112. package/lib/template/default-form/default-form.component.ts +10 -2
  113. package/lib/template/default-page/default-page.component.html +34 -0
  114. package/lib/template/default-page/default-page.component.scss +31 -0
  115. package/lib/template/default-page/default-page.component.spec.ts +24 -0
  116. package/lib/template/default-page/default-page.component.ts +64 -0
  117. package/lib/template/field-group-list/field-group-list.component.scss +0 -1
  118. package/lib/template/inline-dashboard-page/inline-dashboard-page.component.ts +1 -1
  119. package/lib/template/list-view/list-view.component.html +9 -4
  120. package/lib/template/list-view/list-view.component.scss +21 -21
  121. package/lib/template/list-view/list-view.component.ts +154 -84
  122. package/lib/template/list-view/utils.ts +25 -2
  123. package/lib/template/object-page/object-page.component.html +1 -0
  124. package/lib/template/object-page/object-page.component.scss +0 -0
  125. package/lib/template/object-page/object-page.component.spec.ts +22 -0
  126. package/lib/template/object-page/object-page.component.ts +14 -0
  127. package/lib/template/one-column-tab/one-column-tab.component.scss +1 -1
  128. package/lib/template/repeating-structures/repeating-structures.component.ts +0 -1
  129. package/lib/template/self-service-case-view/self-service-case-view.component.html +80 -0
  130. package/lib/template/self-service-case-view/self-service-case-view.component.scss +124 -0
  131. package/lib/template/self-service-case-view/self-service-case-view.component.spec.ts +24 -0
  132. package/lib/template/self-service-case-view/self-service-case-view.component.ts +216 -0
  133. package/lib/template/simple-table/simple-table.component.ts +0 -1
  134. package/lib/template/simple-table-manual/helpers.ts +2 -2
  135. package/lib/template/simple-table-manual/simple-table-manual.component.html +4 -4
  136. package/lib/template/simple-table-manual/simple-table-manual.component.scss +4 -14
  137. package/lib/template/simple-table-manual/simple-table-manual.component.ts +8 -4
  138. package/lib/template/single-reference-readonly/single-reference-readonly.component.html +4 -1
  139. package/lib/template/single-reference-readonly/single-reference-readonly.component.scss +21 -0
  140. package/lib/template/single-reference-readonly/single-reference-readonly.component.ts +104 -3
  141. package/lib/template/utils.ts +42 -0
  142. package/lib/template/wss-nav-bar/wss-nav-bar.component.html +5 -4
  143. package/lib/template/wss-nav-bar/wss-nav-bar.component.scss +2 -8
  144. package/lib/template/wss-nav-bar/wss-nav-bar.component.ts +1 -8
  145. package/lib/widget/app-announcement/app-announcement.component.html +1 -2
  146. package/lib/widget/app-announcement/app-announcement.component.scss +2 -2
  147. package/lib/widget/attachment/Attachment.types.ts +92 -0
  148. package/lib/widget/attachment/AttachmentUtils.ts +287 -0
  149. package/lib/widget/attachment/attachment.component.html +3 -3
  150. package/lib/widget/attachment/attachment.component.scss +2 -5
  151. package/lib/widget/attachment/attachment.component.ts +255 -254
  152. package/lib/widget/feed-container/feed-container.component.scss +3 -9
  153. package/lib/widget/feed-container/feed-container.component.ts +2 -2
  154. package/lib/widget/file-utility/file-utility.component.html +3 -3
  155. package/lib/widget/file-utility/file-utility.component.scss +5 -16
  156. package/lib/widget/list-utility/list-utility.component.scss +3 -5
  157. package/lib/widget/todo/todo.component.html +8 -5
  158. package/lib/widget/todo/todo.component.scss +10 -11
  159. package/lib/widget/todo/todo.component.ts +6 -2
  160. package/package.json +1 -1
@@ -0,0 +1,294 @@
1
+ import { Component, Input, OnInit, OnDestroy, forwardRef, OnChanges, ChangeDetectorRef, signal } from '@angular/core';
2
+ import { FormGroup, ReactiveFormsModule } from '@angular/forms';
3
+ import { componentCachePersistUtils } from '@pega/angular-sdk-components';
4
+ import { MatRadioModule } from '@angular/material/radio';
5
+ import { MatOptionModule } from '@angular/material/core';
6
+ import { MatSelectModule } from '@angular/material/select';
7
+ import { MatButtonModule } from '@angular/material/button';
8
+ import { CommonModule } from '@angular/common';
9
+ import { MatFormFieldModule } from '@angular/material/form-field';
10
+ import { ComponentMapperComponent } from '@pega/angular-sdk-components';
11
+ import { getCacheInfo, isValidInput } from '@pega/angular-sdk-components';
12
+ import { Subscription } from 'rxjs';
13
+
14
+ const listViewConstants = {
15
+ EVENTS: {
16
+ LIST_VIEW_READY: 'LIST_VIEW_READY'
17
+ }
18
+ };
19
+
20
+ export function flattenObj(obj: any): any {
21
+ const result: any = {};
22
+ Object.keys(obj).forEach(key => {
23
+ if (!['context_data', 'pageInstructions'].includes(key)) {
24
+ if (typeof obj[key] === 'object' && !Array.isArray(obj[key])) {
25
+ const temp = flattenObj(obj[key]);
26
+ Object.keys(temp).forEach(nestedKey => {
27
+ result[`${key}.${nestedKey}`] = temp[nestedKey];
28
+ });
29
+ } else {
30
+ result[key] = obj[key];
31
+ }
32
+ }
33
+ });
34
+ return result;
35
+ }
36
+
37
+ export const initializeSearchFields = (searchFields, getPConnect, referenceListClassID, searchFieldRestoreValues = {}) => {
38
+ const filtersProperties = {};
39
+ searchFields?.forEach(field => {
40
+ let val = '';
41
+ const { value, defaultValue = '' } = field.config;
42
+ const propPath = PCore.getAnnotationUtils().getPropertyName(value);
43
+
44
+ if (searchFieldRestoreValues[propPath]) {
45
+ val = searchFieldRestoreValues[propPath];
46
+ } else if (PCore.getAnnotationUtils().isProperty(defaultValue)) {
47
+ val = getPConnect().getValue(defaultValue.split(' ')[1]);
48
+ } else if (defaultValue.startsWith('@L')) {
49
+ val = defaultValue.split(' ')[1];
50
+ } else {
51
+ val = defaultValue;
52
+ }
53
+
54
+ filtersProperties[propPath] = val;
55
+
56
+ const valueSplit = value.split('@P ')[1]?.split('.').filter(Boolean) ?? [];
57
+ valueSplit.pop();
58
+
59
+ if (valueSplit.length) {
60
+ let path = '';
61
+ let currentClassID = referenceListClassID;
62
+ valueSplit.forEach(item => {
63
+ path = path.length ? `${path}.${item}` : item;
64
+ currentClassID = (PCore.getMetadataUtils().getPropertyMetadata(item, currentClassID) as any).pageClass;
65
+ if (currentClassID) {
66
+ filtersProperties[`${path}.classID`] = currentClassID;
67
+ }
68
+ });
69
+ }
70
+ });
71
+ return filtersProperties;
72
+ };
73
+
74
+ @Component({
75
+ selector: 'app-search-groups',
76
+ templateUrl: './search-groups.component.html',
77
+ styleUrls: ['./search-groups.component.scss'],
78
+ imports: [
79
+ CommonModule,
80
+ ReactiveFormsModule,
81
+ MatFormFieldModule,
82
+ MatRadioModule,
83
+ MatOptionModule,
84
+ MatSelectModule,
85
+ MatButtonModule,
86
+ forwardRef(() => ComponentMapperComponent)
87
+ ]
88
+ })
89
+ export class SearchGroupsComponent implements OnInit, OnDestroy, OnChanges {
90
+ @Input() pConn$: typeof PConnect;
91
+ @Input() formGroup$: FormGroup;
92
+ @Input() searchGroupsProps;
93
+
94
+ configProps$: any;
95
+ cache: any;
96
+ previousFormValues: any;
97
+ isValidatorField: any;
98
+ searchSelectCacheKey: any;
99
+ activeGroupId: string;
100
+ getPConnect: any;
101
+ searchFields: any;
102
+ referenceListClassID: any;
103
+ transientItemID: any;
104
+ useCache: boolean;
105
+ searchFieldsC11nEnv: any = signal(null);
106
+ referenceFieldName: any;
107
+ viewName: any;
108
+ subs: Subscription[] = [];
109
+ localizedVal = PCore.getLocaleUtils().getLocaleValue;
110
+ setShowRecords: any;
111
+ groups: any;
112
+ state: any = {};
113
+ rawGroupsConfig: any;
114
+ initialSearchFields: {};
115
+ constructor(private cdRef: ChangeDetectorRef) {}
116
+
117
+ ngOnInit(): void {
118
+ console.log('SearchGroupsComponent - ngOnInit');
119
+ }
120
+
121
+ ngOnChanges() {
122
+ this.updateSelf();
123
+ }
124
+
125
+ // updateSelf
126
+ updateSelf(): void {
127
+ this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps());
128
+ const { searchGroups: groups, referenceList } = this.configProps$;
129
+ const { getPConnect, editableField, searchSelectCacheKey, cache } = this.searchGroupsProps;
130
+ this.searchSelectCacheKey = searchSelectCacheKey;
131
+ this.getPConnect = getPConnect;
132
+ this.cache = cache || {};
133
+ const referenceFieldName = editableField.replaceAll('.', '_');
134
+ const { classID: referenceListClassID } = PCore.getMetadataUtils().getDataPageMetadata(referenceList) as any;
135
+ const { useCache, initialActiveGroupId } = getCacheInfo(cache, groups);
136
+ this.activeGroupId = initialActiveGroupId;
137
+ const rawGroupsConfig = this.pConn$.getRawConfigProps().searchGroups;
138
+ const activeGroupIndex = groups.findIndex(group => group.config.id === this.activeGroupId);
139
+ const { children: searchFieldsChildren = [] } = activeGroupIndex !== -1 ? rawGroupsConfig[activeGroupIndex] : {};
140
+ this.searchFields = searchFieldsChildren.map(field => ({
141
+ ...field,
142
+ config: { ...field.config, isSearchField: true }
143
+ }));
144
+ this.initialSearchFields = initializeSearchFields(
145
+ this.searchFields,
146
+ getPConnect,
147
+ referenceListClassID,
148
+ useCache && cache.activeGroupId === this.activeGroupId ? cache.searchFields : {}
149
+ );
150
+ const filtersWithClassID = {
151
+ ...this.initialSearchFields,
152
+ classID: referenceListClassID
153
+ };
154
+ const viewName = this.pConn$.getCurrentView();
155
+ const transientId = getPConnect.getContainerManager().addTransientItem({ id: `${referenceFieldName}-${viewName}`, data: filtersWithClassID });
156
+ this.transientItemID = transientId;
157
+ this.createSearchFields();
158
+ }
159
+
160
+ createSearchFields() {
161
+ const searchFieldsViewConfig = {
162
+ name: 'SearchFields',
163
+ type: 'View',
164
+ config: {
165
+ template: 'DefaultForm',
166
+ NumCols: '3',
167
+ contextName: this.transientItemID, // can be null initially; will be replaced after transient creation
168
+ readOnly: false,
169
+ context: this.transientItemID,
170
+ localeReference: this.searchGroupsProps.localeReference
171
+ },
172
+ children: [
173
+ {
174
+ name: 'Fields',
175
+ type: 'Region',
176
+ children: this.searchFields
177
+ }
178
+ ]
179
+ };
180
+
181
+ // Create c11n env (Angular will render this via the SDK host component)
182
+ this.searchFieldsC11nEnv.set(
183
+ PCore.createPConnect({
184
+ meta: searchFieldsViewConfig,
185
+ options: {
186
+ hasForm: true,
187
+ contextName: this.transientItemID
188
+ }
189
+ })
190
+ );
191
+
192
+ this.cdRef.detectChanges();
193
+ }
194
+
195
+ getFilterData(): void {
196
+ let changes = PCore.getFormUtils().getSubmitData(this.transientItemID, {
197
+ isTransientContext: true,
198
+ includeDisabledFields: true
199
+ });
200
+
201
+ if (Object.keys(this.cache.searchFields ?? {}).length > 0 && Object.keys(changes).length === 1) {
202
+ changes = this.cache.searchFields;
203
+ }
204
+
205
+ const formValues = flattenObj(changes);
206
+
207
+ if (
208
+ !PCore.isDeepEqual(this.previousFormValues, formValues) &&
209
+ PCore.getFormUtils().isFormValid(this.transientItemID) &&
210
+ isValidInput(formValues)
211
+ ) {
212
+ if (this.isValidatorField) {
213
+ // @ts-ignore
214
+ PCore.getMessageManager().clearContextMessages({ context: transientItemID });
215
+ }
216
+
217
+ this.previousFormValues = formValues;
218
+ // this.setShowRecords(true);
219
+
220
+ PCore.getPubSubUtils().publish(PCore.getEvents().getTransientEvent().UPDATE_PROMOTED_FILTERS, {
221
+ payload: formValues,
222
+ showRecords: true,
223
+ viewName: this.getPConnect.getCurrentView()
224
+ });
225
+ }
226
+
227
+ this.state.activeGroupId = this.activeGroupId;
228
+ this.state.searchFields = changes;
229
+ this.state.selectedCategory = this.getPConnect.getCurrentView();
230
+ const options = componentCachePersistUtils.getComponentStateOptions(this.getPConnect);
231
+ componentCachePersistUtils.setComponentCache({
232
+ cacheKey: this.searchSelectCacheKey,
233
+ state: this.state,
234
+ options
235
+ });
236
+ }
237
+
238
+ resetFilterData(): void {
239
+ PCore.getNavigationUtils().resetComponentCache(this.searchSelectCacheKey);
240
+ const resetPayload = {
241
+ transientItemID: this.transientItemID,
242
+ data: initializeSearchFields(this.searchFields, this.getPConnect, this.referenceListClassID),
243
+ options: { reset: true }
244
+ };
245
+ PCore.getContainerUtils().updateTransientData(resetPayload);
246
+ }
247
+
248
+ /** NEW: update existing transient data when active group changes */
249
+ updateTransientDataForActiveGroup() {
250
+ const filtersWithClassID = {
251
+ ...this.initialSearchFields,
252
+ classID: this.referenceListClassID
253
+ };
254
+
255
+ if (this.transientItemID) {
256
+ // this mirrors the React: PCore.getContainerUtils().replaceTransientData(...)
257
+ PCore.getContainerUtils().replaceTransientData({ transientItemID: this.transientItemID, data: filtersWithClassID });
258
+ }
259
+ }
260
+
261
+ onActiveGroupChange(event: any) {
262
+ this.activeGroupId = event.value;
263
+ // update searchFields for the newly selected group (mirror how React recalculates)
264
+ const activeGroupIndex = this.groups.findIndex(g => g.config.id === this.activeGroupId);
265
+ const searchFieldsChildren = activeGroupIndex !== -1 ? this.rawGroupsConfig[activeGroupIndex]?.children || [] : [];
266
+ this.searchFields = searchFieldsChildren.map(field => ({
267
+ ...field,
268
+ config: { ...field.config, isSearchField: true }
269
+ }));
270
+
271
+ // IMPORTANT: call replaceTransientData to update the transient with the new group's search fields
272
+ this.updateTransientDataForActiveGroup();
273
+ }
274
+
275
+ private setupCacheReplayOnListViewReady(): void {
276
+ if (Object.keys(this.cache?.searchFields ?? {}).length > 0) {
277
+ const sub: any = PCore.getPubSubUtils().subscribe(
278
+ listViewConstants.EVENTS.LIST_VIEW_READY,
279
+ ({ viewName }: { viewName: string }) => {
280
+ if (viewName === this.viewName && this.useCache) {
281
+ this.getFilterData();
282
+ }
283
+ },
284
+ `${this.searchSelectCacheKey}-listview-ready`
285
+ );
286
+ this.subs.push(sub);
287
+ }
288
+ }
289
+
290
+ ngOnDestroy(): void {
291
+ PCore.getPubSubUtils().unsubscribe(listViewConstants.EVENTS.LIST_VIEW_READY, `${this.searchSelectCacheKey}-listview-ready`);
292
+ this.subs.forEach(s => s.unsubscribe());
293
+ }
294
+ }
@@ -0,0 +1,29 @@
1
+ function isEmpty(value: any): boolean {
2
+ return (
3
+ // null or undefined
4
+ value === null ||
5
+ value === undefined ||
6
+ ((Array.isArray(value) || typeof value === 'string') && value.length === 0) ||
7
+ // is an Object and has no keys
8
+ (value.constructor === Object && Object.keys(value).length === 0)
9
+ );
10
+ }
11
+
12
+ export function getCacheInfo(
13
+ cache: { selectedCategory: string; activeGroupId: string; searchFields: unknown },
14
+ groups: { config: { id: string } }[]
15
+ ) {
16
+ let initialActiveGroupId = groups.length ? groups[0].config.id : '';
17
+
18
+ let useCache = false;
19
+ if (cache.activeGroupId && groups?.find(group => group.config.id === cache.activeGroupId)) {
20
+ initialActiveGroupId = cache.activeGroupId;
21
+ useCache = true;
22
+ }
23
+
24
+ return { useCache, initialActiveGroupId };
25
+ }
26
+
27
+ export function isValidInput(input: { [s: string]: unknown }) {
28
+ return Object.values(input).some(value => !isEmpty(value));
29
+ }
@@ -3,7 +3,10 @@
3
3
  <component-mapper name="NavBar" [props]="{ pConn$, appName$, pages$, caseTypes$ }"></component-mapper>
4
4
  </div>
5
5
  <div *ngIf="bShowAppShell$ && portalTemplate === 'wss'">
6
- <component-mapper name="WssNavBar" [props]="{ pConn$, appName$, homePage: pages$[0], pages$: links, caseTypes$ }"></component-mapper>
6
+ <component-mapper
7
+ name="WssNavBar"
8
+ [props]="{ pConn$, appName$, homePage: pages$[0], pages$: links, caseTypes$, portalLogoImage$: imageURL }"
9
+ ></component-mapper>
7
10
  </div>
8
11
  <div [ngClass]="{ 'appshell-main': portalTemplate !== 'wss', 'appshell-main-wss': portalTemplate === 'wss' }">
9
12
  <div *ngFor="let kid of arChildren$">
@@ -1,9 +1,7 @@
1
1
  .appshell-top {
2
- background-color: var(--app-background-color);
3
2
  }
4
3
 
5
4
  .appshell-top-wss {
6
- background-color: var(--app-background-color);
7
5
  }
8
6
 
9
7
  .appshell-main {
@@ -32,7 +30,6 @@
32
30
  align-items: center;
33
31
  height: 100%;
34
32
  width: 100%;
35
- background-color: var(--app-background-color);
36
33
  position: fixed;
37
34
  z-index: 999;
38
35
  top: 0rem;
@@ -5,6 +5,7 @@ import { Subscription } from 'rxjs';
5
5
  import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
6
6
  import { ErrorMessagesService } from '@pega/angular-sdk-components';
7
7
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
8
+ import { Utils } from '@pega/angular-sdk-components';
8
9
 
9
10
  interface IPage {
10
11
  classID: string;
@@ -24,7 +25,7 @@ interface AppShellProps {
24
25
  portalTemplate: string;
25
26
  readOnly?: boolean;
26
27
  showAppHeaderBar: boolean;
27
- showAppName: boolean;
28
+ showAppName: any;
28
29
  }
29
30
 
30
31
  @Component({
@@ -44,19 +45,22 @@ export class AppShellComponent implements OnInit, OnDestroy {
44
45
  caseTypes$?: object[];
45
46
  arChildren$: any[];
46
47
  bShowAppShell$ = false;
47
- appName$ = 'PEGA';
48
+ appName$ = '';
48
49
  errorMessagesSubscription: Subscription;
49
50
  sErrorMessages = '';
50
51
  snackBarRef: any;
51
52
  bOkDisplayError = false;
52
53
  portalTemplate: string;
53
54
  links: any = [];
55
+ imageURL: string | Blob;
56
+ localizedVal = PCore.getLocaleUtils().getLocaleValue;
54
57
 
55
58
  constructor(
56
59
  private angularPConnect: AngularPConnectService,
57
60
  private erService: ErrorMessagesService,
58
61
  private snackBar: MatSnackBar,
59
- private ngZone: NgZone
62
+ private ngZone: NgZone,
63
+ private utils: Utils
60
64
  ) {}
61
65
 
62
66
  ngOnInit() {
@@ -67,6 +71,8 @@ export class AppShellComponent implements OnInit, OnDestroy {
67
71
 
68
72
  this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as AppShellProps;
69
73
 
74
+ this.portalTemplate = this.configProps$.portalTemplate;
75
+
70
76
  // making a copy, so can add info
71
77
  this.pages$ = this.configProps$.pages;
72
78
 
@@ -78,6 +84,11 @@ export class AppShellComponent implements OnInit, OnDestroy {
78
84
  this.bShowAppShell$ = true;
79
85
  }
80
86
 
87
+ /* TODO: We're setting the `pyPortalTemplate` for now, this would be handled by the CoreJS in the future releases */
88
+ if (this.portalTemplate === 'wss') {
89
+ PCore.getEnvironmentInfo().setEnvironmentInfo({ ...PCore.getEnvironmentInfo().environmentInfoObject, pyPortalTemplate: 'wss' } as any);
90
+ }
91
+
81
92
  // @ts-ignore - Property 'pyCaseTypesAvailableToCreateDP' does not exist on type pxApplication
82
93
  const caseTypesAvailableToCreateDP = PCore.getEnvironmentInfo().environmentInfoObject?.pxApplication?.pyCaseTypesAvailableToCreateDP;
83
94
  if (caseTypesAvailableToCreateDP) {
@@ -99,8 +110,6 @@ export class AppShellComponent implements OnInit, OnDestroy {
99
110
 
100
111
  this.arChildren$ = this.pConn$.getChildren();
101
112
 
102
- this.portalTemplate = this.configProps$.portalTemplate;
103
-
104
113
  // handle showing and hiding the progress spinner
105
114
  this.errorMessagesSubscription = this.erService.getMessage().subscribe(message => {
106
115
  this.showDismissErrorMessages(message);
@@ -137,6 +146,12 @@ export class AppShellComponent implements OnInit, OnDestroy {
137
146
  updateSelf() {
138
147
  this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as AppShellProps;
139
148
 
149
+ const showAppName = this.configProps$.showAppName;
150
+ const envInfo = PCore.getEnvironmentInfo();
151
+ const appNameToDisplay = showAppName ? envInfo.getApplicationLabel() : '';
152
+ const portalClass = this.pConn$.getValue('.classID', ''); // 2nd arg empty string until typedef marked correctly
153
+ const envPortalName = envInfo.getPortalName();
154
+
140
155
  this.ngZone.run(() => {
141
156
  // making a copy, so can add info
142
157
  this.pages$ = this.configProps$.pages;
@@ -148,6 +163,30 @@ export class AppShellComponent implements OnInit, OnDestroy {
148
163
  this.caseTypes$ = this.configProps$.caseTypes;
149
164
  this.arChildren$ = this.pConn$.getChildren();
150
165
  });
166
+
167
+ const portalLogo = this.configProps$.portalLogo;
168
+ // using the default icon then fetch it from the static folder (not auth involved)
169
+ if (
170
+ !portalLogo ||
171
+ portalLogo.toLowerCase().includes('pzpega-logo-mark') ||
172
+ portalLogo.toLowerCase().includes('py-logo') ||
173
+ portalLogo.toLowerCase().includes('py-full-logo')
174
+ ) {
175
+ const portalLogoImage = this.utils.getIconPath(this.utils.getSDKStaticContentUrl()).concat('pzpega-logo-mark.svg');
176
+ this.imageURL = portalLogoImage;
177
+ }
178
+ // not using default icon to fetch it using the way which uses authentication
179
+ else {
180
+ PCore.getAssetLoader()
181
+ .getSvcImageUrl(portalLogo)
182
+ .then(data => {
183
+ this.imageURL = data;
184
+ })
185
+ .catch(() => {
186
+ console.error(`${this.localizedVal('Unable to load the image for the portal logo/icon with the insName', 'AppShell')}:${portalLogo}`);
187
+ });
188
+ }
189
+ this.appName$ = this.localizedVal(appNameToDisplay || '', '', `${portalClass}!PORTAL!${envPortalName}`.toUpperCase());
151
190
  }
152
191
 
153
192
  // fpr show/hiding error messages in the SnackBar component
@@ -155,7 +194,7 @@ export class AppShellComponent implements OnInit, OnDestroy {
155
194
  switch (errorMessages.action) {
156
195
  case 'update':
157
196
  // won't show unless publish is turned on
158
- // eslint-disable-next-line @typescript-eslint/prefer-includes
197
+
159
198
  if (this.sErrorMessages.indexOf(errorMessages.actionMessage) < 0) {
160
199
  this.sErrorMessages = this.sErrorMessages.concat(errorMessages.actionMessage).concat('\n');
161
200
 
@@ -168,7 +207,7 @@ export class AppShellComponent implements OnInit, OnDestroy {
168
207
  case 'show':
169
208
  // add error message if not in the list
170
209
  // won't show unless publish is turned on
171
- // eslint-disable-next-line @typescript-eslint/prefer-includes
210
+
172
211
  if (this.sErrorMessages.indexOf(errorMessages.actionMessage) < 0) {
173
212
  this.sErrorMessages = this.sErrorMessages.concat(errorMessages.actionMessage).concat('\n');
174
213
  }
@@ -30,8 +30,6 @@
30
30
  }
31
31
 
32
32
  .psdk-status {
33
- background-color: var(--app-primary-color);
34
- color: var(--app-form-color);
35
33
  padding: 0;
36
34
  margin-top: 0.625rem;
37
35
  width: fit-content;
@@ -1,7 +1,7 @@
1
1
  <div class="psdk-case-view" id="case-view">
2
2
  <div class="psdk-case-view-info">
3
- <mat-toolbar color="primary" class="psdk-case-view-toolbar">
4
- <mat-toolbar-row style="padding-left: 1rem">
3
+ <mat-toolbar class="psdk-case-view-toolbar">
4
+ <mat-toolbar-row class="psdk-case-view-toolbar-row">
5
5
  <div class="psdk-case-icon-div">
6
6
  <img class="psdk-case-svg-icon" src="{{ svgCase$ }}" />
7
7
  </div>
@@ -74,7 +74,7 @@
74
74
  </div>
75
75
 
76
76
  <div>
77
- <component-mapper name="DeferLoad" [props]="{ pConn$, loadData$: tabData$, name: tabData$?.config?.name }"></component-mapper>
77
+ <component-mapper name="DeferLoad" [props]="{ pConn$, name: tabData$?.config?.name }"></component-mapper>
78
78
  </div>
79
79
  </div>
80
80
  <div>
@@ -27,7 +27,7 @@ h1 {
27
27
  }
28
28
 
29
29
  .psdk-case-icon-div {
30
- background-color: var(--app-primary-dark-color);
30
+ background-color: var(--mat-sys-on-primary-fixed);
31
31
  border-radius: 1rem;
32
32
  padding: 0.5rem 0.3rem 0.3rem 0.3rem;
33
33
  }
@@ -47,11 +47,9 @@ h1 {
47
47
  flex: 0 0 auto;
48
48
  width: 25rem;
49
49
  float: left;
50
- padding: 0rem 0.3125rem 0rem 0rem;
51
- margin-left: 0.5rem;
52
- margin-top: 0.5rem;
53
- height: 100%; /* Should be removed. Only for demonstration */
54
- background-color: var(--app-form-color);
50
+ // padding: 0rem 0.3125rem 0rem 0rem;
51
+ background-color: var(--mat-sys-surface-container);
52
+ height: 100%;
55
53
  }
56
54
 
57
55
  .psdk-case-view-main {
@@ -84,24 +82,34 @@ h1 {
84
82
  }
85
83
 
86
84
  .psdk-case-view-utilities {
85
+ background-color: var(--mat-sys-surface-container);
87
86
  width: 21.875rem;
88
87
  float: left;
89
88
  padding: 0rem 0.3125rem;
90
- height: 100%; /* Should be removed. Only for demonstration */
91
89
  }
92
90
 
93
91
  .psdk-case-view-divider {
94
- border-bottom: 0.0625rem solid var(--app-neutral-light-color);
92
+ border-bottom: 0.0625rem solid var(--mat-sys-outline-variant);
95
93
  }
96
94
 
97
95
  .psdk-status {
98
96
  padding: 0.3125rem 0.3125rem;
99
- background-color: var(--app-primary-color);
100
- color: var(--app-form-color);
97
+ background-color: var(--mat-sys-primary);
98
+ color: var(--mat-sys-surface-container);
101
99
  width: fit-content;
102
100
  margin: 0.625rem;
103
101
  }
104
102
 
103
+ .psdk-case-view-toolbar {
104
+ background-color: var(--mat-sys-primary);
105
+ }
106
+
105
107
  button {
106
108
  margin: 0rem 0.3125rem;
107
109
  }
110
+
111
+ .psdk-case-view-toolbar-row {
112
+ padding-left: 1rem;
113
+ white-space: normal;
114
+ height: auto;
115
+ }
@@ -134,7 +134,7 @@ export class CaseViewComponent implements OnInit, OnDestroy {
134
134
  const timer = interval(100).subscribe(() => {
135
135
  timer.unsubscribe();
136
136
 
137
- this.heading$ = PCore.getLocaleUtils().getLocaleValue(this.configProps$.header, '', this.localeKey);
137
+ this.heading$ = this.pConn$.getLocalizationService().getLocalizedText(this.configProps$.header);
138
138
  this.id$ = this.configProps$.subheader;
139
139
  this.status$ = this.pConn$.getValue('.pyStatusWork');
140
140
  });
@@ -0,0 +1,16 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+
4
+ @Injectable({ providedIn: 'root' })
5
+ export class DataReferenceAdvancedSearchService {
6
+ private configSubject = new BehaviorSubject(null);
7
+ config$ = this.configSubject.asObservable();
8
+
9
+ setConfig(config) {
10
+ this.configSubject.next(config);
11
+ }
12
+
13
+ getConfig() {
14
+ return this.configSubject.getValue();
15
+ }
16
+ }
@@ -1,13 +1,16 @@
1
- <div *ngIf="childrenToRender && childrenToRender.length > 0">
2
- <div *ngIf="!displayMultiRef">
3
- <div *ngFor="let kid of childrenToRender">
4
- <component-mapper [name]="kid?.getPConnect().getComponentName()" [props]="{ pConn$: kid.getPConnect(), formGroup$ }"></component-mapper>
5
- </div>
6
- </div>
1
+ <div *ngIf="showAdvancedSearch; else notadvancedSearch">
2
+ <component-mapper name="SearchForm" [props]="{ pConn$: pConn$, formGroup$, searchSelectCacheKey: '' }"></component-mapper>
3
+ </div>
4
+ <ng-template #notadvancedSearch>
7
5
  <div *ngIf="displaySingleRef">
8
- <component-mapper name="SingleReferenceReadOnly" [props]="{ pConn$: firstChildPConnect() }"></component-mapper>
6
+ <component-mapper name="SingleReferenceReadOnly" [props]="{ pConn$: firstChildPConnect(), dataRelationshipContext }"></component-mapper>
9
7
  </div>
10
8
  <div *ngIf="displayMultiRef">
11
9
  <component-mapper name="MultiReferenceReadOnly" [props]="{ pConn$: firstChildPConnect() }"></component-mapper>
12
10
  </div>
13
- </div>
11
+ <div *ngIf="displayChild && childrenToRender && childrenToRender.length > 0">
12
+ <div *ngFor="let kid of childrenToRender">
13
+ <component-mapper [name]="kid?.getPConnect().getComponentName()" [props]="{ pConn$: kid.getPConnect(), formGroup$ }"></component-mapper>
14
+ </div>
15
+ </div>
16
+ </ng-template>