@pega/angular-sdk-overrides 0.24.8 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/lib/designSystemExtension/alert/alert.component.ts +0 -1
  2. package/lib/designSystemExtension/alert-banner/alert-banner.component.ts +1 -2
  3. package/lib/designSystemExtension/banner/banner.component.ts +0 -1
  4. package/lib/designSystemExtension/case-create-stage/case-create-stage.component.ts +1 -2
  5. package/lib/designSystemExtension/field-group/field-group.component.ts +0 -1
  6. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.scss +2 -1
  7. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.ts +0 -2
  8. package/lib/designSystemExtension/material-details/material-details.component.ts +0 -1
  9. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.html +2 -2
  10. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.ts +10 -2
  11. package/lib/designSystemExtension/material-summary-item/material-summary-item.component.ts +0 -1
  12. package/lib/designSystemExtension/material-summary-list/material-summary-list.component.ts +0 -1
  13. package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.ts +0 -1
  14. package/lib/designSystemExtension/operator/operator.component.html +1 -1
  15. package/lib/designSystemExtension/operator/operator.component.scss +10 -2
  16. package/lib/designSystemExtension/operator/operator.component.ts +5 -5
  17. package/lib/designSystemExtension/pulse/pulse.component.ts +7 -8
  18. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.ts +0 -1
  19. package/lib/designSystemExtension/wss-quick-create/wss-quick-create.component.ts +0 -1
  20. package/lib/field/auto-complete/auto-complete.component.html +0 -1
  21. package/lib/field/auto-complete/auto-complete.component.ts +31 -16
  22. package/lib/field/cancel-alert/cancel-alert.component.ts +0 -1
  23. package/lib/field/check-box/check-box.component.html +18 -6
  24. package/lib/field/check-box/check-box.component.ts +17 -12
  25. package/lib/field/currency/currency.component.html +4 -4
  26. package/lib/field/currency/currency.component.ts +42 -20
  27. package/lib/field/date/date.component.html +3 -7
  28. package/lib/field/date/date.component.ts +22 -40
  29. package/lib/field/date-time/date-time.component.html +3 -4
  30. package/lib/field/date-time/date-time.component.ts +35 -17
  31. package/lib/field/decimal/decimal.component.html +4 -3
  32. package/lib/field/decimal/decimal.component.ts +47 -22
  33. package/lib/field/dropdown/dropdown.component.html +1 -0
  34. package/lib/field/dropdown/dropdown.component.ts +146 -19
  35. package/lib/field/email/email.component.ts +24 -5
  36. package/lib/field/group/group.component.ts +2 -3
  37. package/lib/field/integer/integer.component.ts +22 -5
  38. package/lib/field/list-view-action-buttons/list-view-action-buttons.component.html +1 -1
  39. package/lib/field/list-view-action-buttons/list-view-action-buttons.component.ts +3 -3
  40. package/lib/field/location/config-ext.json +8 -0
  41. package/lib/field/location/location.component.html +45 -0
  42. package/lib/field/location/location.component.scss +18 -0
  43. package/lib/field/location/location.component.spec.ts +22 -0
  44. package/lib/field/location/location.component.ts +385 -0
  45. package/lib/field/multiselect/multiselect.component.ts +17 -10
  46. package/lib/field/percentage/percentage.component.html +3 -3
  47. package/lib/field/percentage/percentage.component.ts +45 -21
  48. package/lib/field/phone/config-ext.json +1 -1
  49. package/lib/field/phone/phone.component.html +9 -6
  50. package/lib/field/phone/phone.component.scss +9 -0
  51. package/lib/field/phone/phone.component.ts +30 -27
  52. package/lib/field/radio-buttons/radio-buttons.component.html +17 -12
  53. package/lib/field/radio-buttons/radio-buttons.component.ts +13 -10
  54. package/lib/field/rich-text/rich-text.component.ts +19 -9
  55. package/lib/field/scalar-list/scalar-list.component.ts +3 -5
  56. package/lib/field/selectable-card/selectable-card.component.html +40 -0
  57. package/lib/field/selectable-card/selectable-card.component.scss +0 -0
  58. package/lib/field/selectable-card/selectable-card.component.spec.ts +22 -0
  59. package/lib/field/selectable-card/selectable-card.component.ts +255 -0
  60. package/lib/field/semantic-link/semantic-link.component.ts +0 -1
  61. package/lib/field/text/text.component.ts +8 -5
  62. package/lib/field/text-area/text-area.component.html +4 -1
  63. package/lib/field/text-area/text-area.component.ts +22 -6
  64. package/lib/field/text-content/text-content.component.ts +0 -1
  65. package/lib/field/text-input/text-input.component.ts +22 -5
  66. package/lib/field/time/time.component.html +2 -2
  67. package/lib/field/time/time.component.ts +35 -7
  68. package/lib/field/url/url.component.ts +22 -5
  69. package/lib/field/user-reference/user-reference.component.html +40 -46
  70. package/lib/field/user-reference/user-reference.component.ts +111 -21
  71. package/lib/infra/Containers/flow-container/flow-container.component.html +1 -1
  72. package/lib/infra/Containers/flow-container/flow-container.component.ts +25 -48
  73. package/lib/infra/Containers/flow-container/helpers.ts +2 -2
  74. package/lib/infra/Containers/hybrid-view-container/hybrid-view-container.component.ts +0 -1
  75. package/lib/infra/Containers/modal-view-container/modal-view-container.component.html +1 -11
  76. package/lib/infra/Containers/modal-view-container/modal-view-container.component.ts +1 -9
  77. package/lib/infra/Containers/preview-view-container/preview-view-container.component.ts +1 -1
  78. package/lib/infra/Containers/view-container/helper.ts +22 -0
  79. package/lib/infra/Containers/view-container/view-container.component.ts +5 -18
  80. package/lib/infra/action-buttons/action-buttons.component.html +1 -1
  81. package/lib/infra/action-buttons/action-buttons.component.ts +0 -1
  82. package/lib/infra/assignment/assignment.component.html +1 -1
  83. package/lib/infra/assignment/assignment.component.ts +82 -41
  84. package/lib/infra/assignment-card/assignment-card.component.html +1 -0
  85. package/lib/infra/assignment-card/assignment-card.component.ts +0 -1
  86. package/lib/infra/dashboard-filter/dashboard-filter.component.ts +0 -1
  87. package/lib/infra/defer-load/defer-load.component.ts +8 -6
  88. package/lib/infra/error-boundary/error-boundary.component.ts +0 -1
  89. package/lib/infra/multi-step/multi-step.component.ts +0 -1
  90. package/lib/infra/navbar/navbar.component.ts +3 -6
  91. package/lib/infra/reference/reference.component.ts +77 -90
  92. package/lib/infra/region/region.component.ts +0 -1
  93. package/lib/infra/root-container/root-container.component.html +2 -15
  94. package/lib/infra/root-container/root-container.component.ts +27 -33
  95. package/lib/infra/stages/stages.component.scss +2 -2
  96. package/lib/infra/stages/stages.component.ts +0 -1
  97. package/lib/infra/view/view.component.html +7 -20
  98. package/lib/infra/view/view.component.ts +20 -3
  99. package/lib/template/app-shell/app-shell.component.ts +20 -3
  100. package/lib/template/banner-page/banner-page.component.ts +0 -1
  101. package/lib/template/base/details-template-base.ts +67 -0
  102. package/lib/template/base/form-template-base.ts +16 -0
  103. package/lib/template/case-summary/case-summary.component.ts +7 -23
  104. package/lib/template/case-view/case-view.component.html +4 -4
  105. package/lib/template/case-view/case-view.component.ts +8 -14
  106. package/lib/template/confirmation/confirmation.component.html +1 -1
  107. package/lib/template/confirmation/confirmation.component.ts +1 -2
  108. package/lib/template/data-reference/data-reference.component.ts +36 -41
  109. package/lib/template/default-form/default-form.component.html +0 -4
  110. package/lib/template/default-form/default-form.component.ts +41 -25
  111. package/lib/template/details/details.component.ts +7 -42
  112. package/lib/template/details-narrow-wide/details-narrow-wide.component.ts +6 -40
  113. package/lib/template/details-one-column/details-one-column.component.ts +7 -43
  114. package/lib/template/details-sub-tabs/details-sub-tabs.component.html +1 -2
  115. package/lib/template/details-sub-tabs/details-sub-tabs.component.ts +5 -38
  116. package/lib/template/details-three-column/details-three-column.component.ts +7 -44
  117. package/lib/template/details-two-column/details-two-column.component.ts +8 -45
  118. package/lib/template/details-wide-narrow/details-wide-narrow.component.ts +7 -43
  119. package/lib/template/dynamic-tabs/dynamic-tabs.component.html +3 -0
  120. package/lib/template/dynamic-tabs/dynamic-tabs.component.ts +8 -4
  121. package/lib/template/field-group-list/field-group-list.component.ts +0 -1
  122. package/lib/template/field-group-template/field-group-template.component.html +7 -7
  123. package/lib/template/field-group-template/field-group-template.component.scss +8 -0
  124. package/lib/template/field-group-template/field-group-template.component.ts +68 -48
  125. package/lib/template/field-value-list/field-value-list.component.html +2 -2
  126. package/lib/template/field-value-list/field-value-list.component.scss +6 -1
  127. package/lib/template/field-value-list/field-value-list.component.ts +0 -1
  128. package/lib/template/inline-dashboard/inline-dashboard.component.ts +0 -1
  129. package/lib/template/inline-dashboard-page/inline-dashboard-page.component.ts +2 -3
  130. package/lib/template/list-page/list-page.component.ts +0 -1
  131. package/lib/template/list-view/list-view.component.html +6 -1
  132. package/lib/template/list-view/list-view.component.scss +11 -0
  133. package/lib/template/list-view/list-view.component.ts +25 -11
  134. package/lib/template/list-view/listViewHelpers.ts +4 -10
  135. package/lib/template/list-view/utils.ts +2 -5
  136. package/lib/template/multi-reference-readonly/multi-reference-readonly.component.ts +0 -1
  137. package/lib/template/narrow-wide-form/narrow-wide-form.component.ts +1 -2
  138. package/lib/template/one-column/one-column.component.ts +4 -4
  139. package/lib/template/one-column-page/one-column-page.component.ts +0 -1
  140. package/lib/template/one-column-tab/one-column-tab.component.ts +1 -2
  141. package/lib/template/page/page.component.ts +1 -2
  142. package/lib/template/promoted-filters/promoted-filters.component.ts +1 -2
  143. package/lib/template/repeating-structures/repeating-structures.component.ts +1 -2
  144. package/lib/template/simple-table/simple-table.component.ts +0 -1
  145. package/lib/template/simple-table-manual/helpers.ts +126 -10
  146. package/lib/template/simple-table-manual/simple-table-manual.component.html +25 -6
  147. package/lib/template/simple-table-manual/simple-table-manual.component.scss +12 -3
  148. package/lib/template/simple-table-manual/simple-table-manual.component.ts +110 -54
  149. package/lib/template/simple-table-select/simple-table-select.component.ts +3 -4
  150. package/lib/template/single-reference-readonly/single-reference-readonly.component.ts +0 -1
  151. package/lib/template/sub-tabs/sub-tabs.component.ts +0 -1
  152. package/lib/template/three-column/three-column.component.ts +4 -4
  153. package/lib/template/three-column-page/three-column-page.component.ts +0 -1
  154. package/lib/template/two-column/two-column.component.ts +4 -4
  155. package/lib/template/two-column-page/two-column-page.component.ts +0 -1
  156. package/lib/template/two-column-tab/two-column-tab.component.ts +1 -2
  157. package/lib/template/utils.ts +16 -0
  158. package/lib/template/wide-narrow-form/wide-narrow-form.component.ts +4 -4
  159. package/lib/template/wide-narrow-page/wide-narrow-page.component.ts +1 -2
  160. package/lib/template/wss-nav-bar/wss-nav-bar.component.ts +3 -4
  161. package/lib/widget/app-announcement/app-announcement.component.ts +0 -1
  162. package/lib/widget/attachment/attachment.component.ts +9 -13
  163. package/lib/widget/case-history/case-history.component.ts +0 -1
  164. package/lib/widget/feed-container/feed-container.component.ts +7 -10
  165. package/lib/widget/file-utility/file-utility.component.ts +2 -6
  166. package/lib/widget/list-utility/list-utility.component.ts +0 -1
  167. package/lib/widget/quick-create/quick-create.component.ts +0 -1
  168. package/lib/widget/todo/todo.component.html +5 -6
  169. package/lib/widget/todo/todo.component.scss +9 -0
  170. package/lib/widget/todo/todo.component.ts +95 -85
  171. package/lib/widget/utility/utility.component.ts +0 -1
  172. package/package.json +1 -1
@@ -11,6 +11,7 @@ import { Utils } from '@pega/angular-sdk-components';
11
11
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
12
12
  import { PConnFieldProps } from '@pega/angular-sdk-components';
13
13
  import { map, Observable, startWith } from 'rxjs';
14
+ import { handleEvent } from '@pega/angular-sdk-components';
14
15
 
15
16
  const OPERATORS_DP = 'D_pyGetOperatorsForCurrentApplication';
16
17
  const DROPDOWN_LIST = 'Drop-down list';
@@ -22,13 +23,13 @@ interface UserReferenceProps extends Omit<PConnFieldProps, 'value'> {
22
23
  value?: any;
23
24
  showAsFormattedText?: boolean;
24
25
  additionalProps?: object;
26
+ onRecordChange?: any;
25
27
  }
26
28
 
27
29
  @Component({
28
30
  selector: 'app-user-reference',
29
31
  templateUrl: './user-reference.component.html',
30
32
  styleUrls: ['./user-reference.component.scss'],
31
- standalone: true,
32
33
  imports: [
33
34
  CommonModule,
34
35
  ReactiveFormsModule,
@@ -63,6 +64,9 @@ export class UserReferenceComponent implements OnInit, OnDestroy {
63
64
  filterValue = '';
64
65
 
65
66
  fieldControl = new FormControl('', null);
67
+ actionsApi: Object;
68
+ propName: string;
69
+ onRecordChange: any;
66
70
 
67
71
  constructor(
68
72
  private angularPConnect: AngularPConnectService,
@@ -80,11 +84,11 @@ export class UserReferenceComponent implements OnInit, OnDestroy {
80
84
  if (this.formGroup$) {
81
85
  // add control to formGroup
82
86
  this.formGroup$.addControl(this.controlName$, this.fieldControl);
83
- this.fieldControl.setValue(this.value$);
87
+ this.fieldControl.setValue(this.getValue(this.value$));
84
88
  }
85
89
 
86
90
  this.filteredOptions = this.fieldControl.valueChanges.pipe(
87
- startWith(''),
91
+ startWith(this.getValue(this.value$) || ''),
88
92
  map(value => this._filter(value || ''))
89
93
  );
90
94
  }
@@ -123,6 +127,21 @@ export class UserReferenceComponent implements OnInit, OnDestroy {
123
127
  return this.options$?.filter(option => option.value?.toLowerCase().includes(filterVal));
124
128
  }
125
129
 
130
+ isUserNameAvailable = user => {
131
+ return typeof user === 'object' && user !== null && user.userName;
132
+ };
133
+
134
+ getUserName = user => {
135
+ return user.userName;
136
+ };
137
+
138
+ getValue = user => {
139
+ if (this.displayAs$ === DROPDOWN_LIST) {
140
+ return this.utils.getUserId(user) || this.getUserName(user);
141
+ }
142
+ return this.isUserNameAvailable(user) ? this.getUserName(user) : this.utils.getUserId(user);
143
+ };
144
+
126
145
  async checkAndUpdate() {
127
146
  // Should always check the bridge to see if the component should
128
147
  // update itself (re-render)
@@ -137,6 +156,7 @@ export class UserReferenceComponent implements OnInit, OnDestroy {
137
156
  async updateSelf() {
138
157
  const props = this.pConn$.getConfigProps() as UserReferenceProps;
139
158
  this.testId = props.testId;
159
+ this.onRecordChange = props?.onRecordChange;
140
160
 
141
161
  const { label, displayAs, value, showAsFormattedText, helperText, placeholder, displayMode } = props;
142
162
 
@@ -147,34 +167,35 @@ export class UserReferenceComponent implements OnInit, OnDestroy {
147
167
  this.placeholder = placeholder || '';
148
168
  this.displayMode$ = displayMode;
149
169
 
170
+ if (value && typeof value === 'object') {
171
+ this.value$ = value.userName ? value.userName : '';
172
+ } else {
173
+ this.value$ = value || '';
174
+ }
175
+
150
176
  const { readOnly, required } = props;
151
177
  [this.bReadonly$, this.bRequired$] = [readOnly, required].map(prop => prop === true || (typeof prop === 'string' && prop === 'true'));
152
178
 
153
- const isUserNameAvailable = user => {
154
- return typeof user === 'object' && user !== null && user.userName;
155
- };
179
+ this.actionsApi = this.pConn$.getActionsApi();
180
+ this.propName = this.pConn$.getStateProps().value;
156
181
 
157
182
  this.userID$ = this.utils.getUserId(value);
158
183
 
159
184
  if (this.userID$ && this.bReadonly$ && this.showAsFormattedText$) {
160
- if (isUserNameAvailable(value)) {
185
+ if (this.isUserNameAvailable(value)) {
161
186
  this.userName$ = value.userName;
162
187
  } else {
163
188
  // if same user ref field is referred in view as editable & readonly formatted text
164
189
  // referenced users won't be available, so get user details from dx api
165
- const { getOperatorDetails } = PCore.getUserApi();
166
- getOperatorDetails(this.userID$).then((resp: any) => {
167
- if (resp.data && resp.data.pyOperatorInfo && resp.data.pyOperatorInfo.pyUserName) {
168
- this.userName$ = resp.data.pyOperatorInfo.pyUserName;
169
- }
170
- });
190
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
191
+ this.userName$ = await getUserName(this.pConn$, this.userID$);
171
192
  }
172
193
  } else if (displayAs === DROPDOWN_LIST || displayAs === SEARCH_BOX) {
173
194
  const queryPayload = {
174
195
  dataViewName: OPERATORS_DP
175
196
  };
176
197
  try {
177
- const resp: any = await PCore.getRestClient().invokeRestApi('getListData', { queryPayload } as any, ''); // 3rd arg empty string until typedef marked correctly
198
+ const resp = await PCore.getRestClient().invokeRestApi('getListData', { queryPayload }, ''); // 3rd arg empty string until typedef marked correctly
178
199
  if (resp?.data) {
179
200
  const ddDataSource = resp.data.data.map(listItem => ({
180
201
  key: listItem.pyUserIdentifier,
@@ -195,7 +216,13 @@ export class UserReferenceComponent implements OnInit, OnDestroy {
195
216
  if (event?.target) {
196
217
  this.filterValue = (event.target as HTMLInputElement).value;
197
218
  }
198
- this.angularPConnectData.actions?.onChange(this, event);
219
+ const value = event?.value;
220
+ handleEvent(this.actionsApi, 'change', this.propName, value);
221
+ }
222
+
223
+ optionChanged(event: any) {
224
+ const value = event?.option?.value;
225
+ handleEvent(this.actionsApi, 'change', this.propName, value);
199
226
  }
200
227
 
201
228
  fieldOnBlur(event: any) {
@@ -204,12 +231,12 @@ export class UserReferenceComponent implements OnInit, OnDestroy {
204
231
  const index = this.options$?.findIndex(element => element.value === event.target.value);
205
232
  key = index > -1 ? (key = this.options$[index].key) : event.target.value;
206
233
  }
207
-
208
- const eve = {
209
- value: key
210
- };
211
- // PConnect wants to use eventHandler for onBlur
212
- this.angularPConnectData.actions?.onChange(this, eve);
234
+ const value = key;
235
+ handleEvent(this.actionsApi, 'changeNblur', this.propName, value);
236
+ if (this.onRecordChange) {
237
+ event.target.value = value;
238
+ this.onRecordChange(event);
239
+ }
213
240
  }
214
241
 
215
242
  getErrorMessage() {
@@ -229,3 +256,66 @@ export class UserReferenceComponent implements OnInit, OnDestroy {
229
256
  return errMessage;
230
257
  }
231
258
  }
259
+
260
+ const buildColumnForDisplayValue = dataObj => {
261
+ if (dataObj.columns) {
262
+ dataObj.columns = dataObj.columns.map(column => {
263
+ const tempColObj = { ...column };
264
+ if (tempColObj.key === 'true') {
265
+ tempColObj.useForSearch = true;
266
+ } else {
267
+ tempColObj.useForSearch = false;
268
+ }
269
+ return tempColObj;
270
+ });
271
+ }
272
+ };
273
+
274
+ function getUserName(pConn, userId = ''): Promise<string> {
275
+ return new Promise(resolve => {
276
+ const { parameters = {}, referenceList } = pConn.getConfigProps();
277
+ const contextName = pConn.getContextName();
278
+
279
+ // eslint-disable-next-line @typescript-eslint/no-shadow
280
+ const OPERATORS_DP = referenceList || PCore.getEnvironmentInfo().getDefaultOperatorDP() || '';
281
+
282
+ const columns = [
283
+ {
284
+ value: 'pyUserName',
285
+ display: 'true',
286
+ useForSearch: true,
287
+ primary: 'true'
288
+ },
289
+ {
290
+ value: 'pyUserIdentifier',
291
+ setProperty: 'Associated property',
292
+ key: 'true',
293
+ display: 'true',
294
+ secondary: 'true',
295
+ useForSearch: true
296
+ }
297
+ ];
298
+
299
+ const dataConfig: any = {
300
+ dataSource: OPERATORS_DP,
301
+ parameters,
302
+ matchPosition: 'equals',
303
+ listType: 'datapage',
304
+ columns,
305
+ cacheLifeSpan: 'form',
306
+ deferDatasource: false,
307
+ maxResultsDisplay: '1',
308
+ ignoreCase: true
309
+ };
310
+
311
+ PCore.getDataApi()
312
+ .init(dataConfig, contextName)
313
+ .then(dataApiObj => {
314
+ buildColumnForDisplayValue(dataApiObj);
315
+ dataApiObj.registerForBufferedCall({ waitTime: 50 });
316
+ dataApiObj.fetchData(userId).then((response: any) => {
317
+ resolve(response.data?.[0]?.pyUserName || userId);
318
+ });
319
+ });
320
+ });
321
+ }
@@ -38,7 +38,7 @@
38
38
  </div>
39
39
  </mat-card>
40
40
  </div>
41
- <div *ngIf="bShowBanner && bShowConfirm">
41
+ <div *ngIf="bShowBanner && bShowConfirm && confirm_pconn">
42
42
  <component-mapper name="View" [props]="{ formGroup$, pConn$: confirm_pconn }"></component-mapper>
43
43
  </div>
44
44
  </div>
@@ -6,7 +6,7 @@ import { publicConstants } from '@pega/pcore-pconnect-typedefs/constants';
6
6
  import { ProgressSpinnerService } from '@pega/angular-sdk-components';
7
7
  import { ReferenceComponent } from '@pega/angular-sdk-components';
8
8
  import { Utils } from '@pega/angular-sdk-components';
9
- import { getToDoAssignments, showBanner } from './helpers';
9
+ import { getToDoAssignments, hasAssignments, showBanner } from './helpers';
10
10
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
11
11
  import { FlowContainerBaseComponent } from '@pega/angular-sdk-components';
12
12
 
@@ -29,7 +29,6 @@ interface FlowContainerProps {
29
29
  templateUrl: './flow-container.component.html',
30
30
  styleUrls: ['./flow-container.component.scss'],
31
31
  providers: [Utils],
32
- standalone: true,
33
32
  imports: [CommonModule, MatCardModule, forwardRef(() => ComponentMapperComponent)]
34
33
  })
35
34
  export class FlowContainerComponent extends FlowContainerBaseComponent implements OnInit, OnDestroy {
@@ -104,6 +103,8 @@ export class FlowContainerComponent extends FlowContainerBaseComponent implement
104
103
 
105
104
  this.initContainer();
106
105
 
106
+ this.checkAndUpdate();
107
+
107
108
  PCore.getPubSubUtils().subscribe(
108
109
  PCore.getConstants().PUB_SUB_EVENTS.EVENT_CANCEL,
109
110
  () => {
@@ -119,6 +120,14 @@ export class FlowContainerComponent extends FlowContainerBaseComponent implement
119
120
  },
120
121
  'cancelPressed'
121
122
  );
123
+
124
+ PCore.getPubSubUtils().subscribe(
125
+ 'clearBannerMessages',
126
+ () => {
127
+ this.banners = [];
128
+ },
129
+ 'clearBannerMessages'
130
+ );
122
131
  }
123
132
 
124
133
  ngOnDestroy() {
@@ -129,6 +138,8 @@ export class FlowContainerComponent extends FlowContainerBaseComponent implement
129
138
  PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.EVENT_CANCEL, 'cancelAssignment');
130
139
 
131
140
  PCore.getPubSubUtils().unsubscribe('cancelPressed', 'cancelPressed');
141
+
142
+ PCore.getPubSubUtils().unsubscribe('clearBannerMessages', 'clearBannerMessages');
132
143
  }
133
144
 
134
145
  handleCancel() {
@@ -153,13 +164,15 @@ export class FlowContainerComponent extends FlowContainerBaseComponent implement
153
164
  const caseViewModeFromProps = this.angularPConnect.getComponentProp(this, 'caseViewMode');
154
165
  const caseViewModeFromRedux = pConn.getValue('context_data.caseViewMode', '');
155
166
 
167
+ const completeProps = this.angularPConnect.getCurrentCompleteProps(this) as FlowContainerProps;
168
+
156
169
  // ONLY call updateSelf when the component should update
157
170
  // AND removing the "gate" that was put there since shouldComponentUpdate
158
171
  // should be the real "gate"
172
+ // eslint-disable-next-line sonarjs/no-collapsible-if
159
173
  if (bUpdateSelf || caseViewModeFromProps !== caseViewModeFromRedux) {
160
174
  // don't want to redraw the flow container when there are page messages, because
161
175
  // the redraw causes us to loose the errors on the elements
162
- const completeProps = this.angularPConnect.getCurrentCompleteProps(this) as FlowContainerProps;
163
176
  if (!completeProps.pageMessages || completeProps.pageMessages.length == 0) {
164
177
  // with a cancel, need to timeout so todo will update correctly
165
178
  if (this.bHasCancel) {
@@ -170,10 +183,10 @@ export class FlowContainerComponent extends FlowContainerBaseComponent implement
170
183
  } else {
171
184
  this.updateSelf();
172
185
  }
173
- } else {
174
- this.showPageMessages(completeProps);
175
186
  }
176
187
  }
188
+
189
+ this.showPageMessages(completeProps);
177
190
  }
178
191
 
179
192
  showPageMessages(completeProps: FlowContainerProps) {
@@ -198,7 +211,7 @@ export class FlowContainerComponent extends FlowContainerBaseComponent implement
198
211
  }
199
212
 
200
213
  initContainer() {
201
- const containerMgr: any = this.pConn$.getContainerManager();
214
+ const containerMgr = this.pConn$.getContainerManager();
202
215
  const baseContext = this.pConn$.getContextName();
203
216
  const containerName = this.pConn$.getContainerName();
204
217
  const containerType = 'single';
@@ -237,7 +250,7 @@ export class FlowContainerComponent extends FlowContainerBaseComponent implement
237
250
 
238
251
  // when true, update arChildren from pConn, otherwise, arChilren will be updated in updateSelf()
239
252
  if (bLoadChildren) {
240
- this.arChildren$ = this.pConn$.getChildren() as any[];
253
+ this.arChildren$ = this.pConn$.getChildren();
241
254
  }
242
255
 
243
256
  // const oData = this.pConn$.getDataObject();
@@ -275,44 +288,9 @@ export class FlowContainerComponent extends FlowContainerBaseComponent implement
275
288
  this.psService.sendMessage(false);
276
289
  }
277
290
 
278
- hasAssignments() {
279
- let hasAssignments = false;
280
- const assignmentsList: any[] = this.pConn$.getValue(this.pCoreConstants.CASE_INFO.D_CASE_ASSIGNMENTS_RESULTS);
281
- // const thisOperator = PCore.getEnvironmentInfo().getOperatorIdentifier();
282
- // 8.7 includes assignments in Assignments List that may be assigned to
283
- // a different operator. So, see if there are any assignments for
284
- // the current operator
285
- const isEmbedded = window.location.href.includes('embedded');
286
- let bAssignmentsForThisOperator = false;
287
-
288
- if (isEmbedded) {
289
- const thisOperator = PCore.getEnvironmentInfo().getOperatorIdentifier();
290
- for (const assignment of assignmentsList) {
291
- if (assignment.assigneeInfo.ID === thisOperator) {
292
- bAssignmentsForThisOperator = true;
293
- }
294
- }
295
- } else {
296
- bAssignmentsForThisOperator = true;
297
- }
298
-
299
- // Bail if there is no assignmentsList
300
- if (!assignmentsList) {
301
- return hasAssignments;
302
- }
303
-
304
- const hasChildCaseAssignments = this.hasChildCaseAssignments();
305
-
306
- if (bAssignmentsForThisOperator || hasChildCaseAssignments || this.isCaseWideLocalAction()) {
307
- hasAssignments = true;
308
- }
309
-
310
- return hasAssignments;
311
- }
312
-
313
291
  isCaseWideLocalAction() {
314
292
  const actionID = this.pConn$.getValue(this.pCoreConstants.CASE_INFO.ACTIVE_ACTION_ID);
315
- const caseActions = this.pConn$.getValue(this.pCoreConstants.CASE_INFO.AVAILABLEACTIONS) as any[];
293
+ const caseActions = this.pConn$.getValue(this.pCoreConstants.CASE_INFO.AVAILABLEACTIONS);
316
294
  let bCaseWideAction = false;
317
295
  if (caseActions && actionID) {
318
296
  const actionObj = caseActions.find(caseAction => caseAction.ID === actionID);
@@ -457,7 +435,9 @@ export class FlowContainerComponent extends FlowContainerBaseComponent implement
457
435
 
458
436
  showCaseMessages() {
459
437
  this.caseMessages$ = this.localizedVal(this.pConn$.getValue('caseMessages'), this.localeCategory);
460
- if (this.caseMessages$ || !this.hasAssignments()) {
438
+ // caseMessages's behavior has changed in 24.2, and hence it doesn't let Optional Action work.
439
+ // Changing the below condition for now. Was: (theCaseMessages || !hasAssignments())
440
+ if (!hasAssignments(this.pConn$)) {
461
441
  this.bHasCaseMessages$ = true;
462
442
  this.bShowConfirm = true;
463
443
  this.checkSvg$ = this.utils.getImageSrc('check', this.utils.getSDKStaticContentUrl());
@@ -467,9 +447,6 @@ export class FlowContainerComponent extends FlowContainerBaseComponent implement
467
447
  this.caseMessages$ = this.localizedVal('Thank you! The next step in this case has been routed appropriately.', this.localeCategory);
468
448
  }
469
449
 
470
- // publish this "assignmentFinished" for mashup, need to get approved as a standard
471
- PCore.getPubSubUtils().publish('assignmentFinished');
472
-
473
450
  this.psService.sendMessage(false);
474
451
  } else {
475
452
  this.bHasCaseMessages$ = false;
@@ -480,6 +457,7 @@ export class FlowContainerComponent extends FlowContainerBaseComponent implement
480
457
  updateFlowContainerChildren() {
481
458
  // routingInfo was added as component prop in populateAdditionalProps
482
459
  const routingInfo = this.angularPConnect.getComponentProp(this, 'routingInfo');
460
+ this.confirm_pconn = null;
483
461
 
484
462
  let loadingInfo: any;
485
463
  try {
@@ -593,7 +571,6 @@ export class FlowContainerComponent extends FlowContainerBaseComponent implement
593
571
  });
594
572
  }
595
573
 
596
- // eslint-disable-next-line sonarjs/no-identical-functions
597
574
  topViewRefresh(): void {
598
575
  Object.values(this.formGroup$.controls).forEach(control => {
599
576
  control.markAsTouched();
@@ -28,12 +28,12 @@ function getChildCaseAssignments(pConnect) {
28
28
  return allAssignments;
29
29
  }
30
30
 
31
- function hasAssignments(pConnect) {
31
+ export function hasAssignments(pConnect) {
32
32
  const { CASE_INFO } = PCore.getConstants();
33
33
  const assignments = pConnect.getValue(CASE_INFO.D_CASE_ASSIGNMENTS_RESULTS);
34
34
  const childCasesAssignments = getChildCaseAssignments(pConnect);
35
35
 
36
- return assignments || childCasesAssignments || isCaseWideLocalAction(pConnect);
36
+ return assignments || childCasesAssignments?.length || isCaseWideLocalAction(pConnect);
37
37
  }
38
38
 
39
39
  export const showBanner = getPConnect => {
@@ -14,7 +14,6 @@ import { FormGroup } from '@angular/forms';
14
14
  selector: 'app-hybrid-view-container',
15
15
  templateUrl: './hybrid-view-container.component.html',
16
16
  styleUrls: ['./hybrid-view-container.component.scss'],
17
- standalone: true,
18
17
  imports: [CommonModule]
19
18
  })
20
19
  export class HybridViewContainerComponent {
@@ -1,4 +1,4 @@
1
- <div id="dialog" *ngIf="bShowModal$ && bShowAsModal$" class="psdk-dialog-background">
1
+ <div id="dialog" *ngIf="bShowModal$" class="psdk-dialog-background">
2
2
  <div class="psdk-modal-view-container-top" id="{{ buildName$ }}">
3
3
  <h3 *ngIf="title$ != ''">{{ title$ }}</h3>
4
4
  <component-mapper
@@ -15,16 +15,6 @@
15
15
  </div>
16
16
  </div>
17
17
 
18
- <div *ngIf="bShowModal$ && !bShowAsModal$">
19
- <div id="{{ buildName$ }}">
20
- <h3 *ngIf="title$ != ''">{{ title$ }}</h3>
21
- <component-mapper
22
- name="Assignment"
23
- [props]="{ pConn$: createdViewPConn$, formGroup$, arChildren$, itemKey$, isCreateStage$: true, updateToken$ }"
24
- ></component-mapper>
25
- </div>
26
- </div>
27
-
28
18
  <div *ngIf="bShowCancelAlert$">
29
19
  <component-mapper
30
20
  name="CancelAlert"
@@ -18,12 +18,10 @@ import { ReferenceComponent } from '@pega/angular-sdk-components';
18
18
  selector: 'app-modal-view-container',
19
19
  templateUrl: './modal-view-container.component.html',
20
20
  styleUrls: ['./modal-view-container.component.scss'],
21
- standalone: true,
22
21
  imports: [CommonModule, forwardRef(() => ComponentMapperComponent)]
23
22
  })
24
23
  export class ModalViewContainerComponent implements OnInit, OnDestroy {
25
24
  @Input() pConn$: typeof PConnect;
26
- @Input() displayOnlyFA$: boolean;
27
25
 
28
26
  // for when non modal
29
27
  @Output() modalVisibleChange = new EventEmitter<boolean>();
@@ -39,7 +37,6 @@ export class ModalViewContainerComponent implements OnInit, OnDestroy {
39
37
  context$: string;
40
38
  title$ = '';
41
39
  bShowModal$ = false;
42
- bShowAsModal$ = true;
43
40
  itemKey$: string;
44
41
  formGroup$: FormGroup;
45
42
  oCaseInfo: Object = {};
@@ -73,11 +70,6 @@ export class ModalViewContainerComponent implements OnInit, OnDestroy {
73
70
  }
74
71
 
75
72
  ngOnInit(): void {
76
- if (this.displayOnlyFA$) {
77
- // for when non modal
78
- this.bShowAsModal$ = false;
79
- }
80
-
81
73
  // First thing in initialization is registering and subscribing to the AngularPConnect service
82
74
  this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
83
75
 
@@ -89,7 +81,7 @@ export class ModalViewContainerComponent implements OnInit, OnDestroy {
89
81
  this.itemKey$ = baseContext.concat('/').concat(acName);
90
82
  }
91
83
 
92
- const containerMgr: any = this.pConn$.getContainerManager();
84
+ const containerMgr = this.pConn$.getContainerManager();
93
85
 
94
86
  containerMgr.initializeContainers({
95
87
  type: 'multiple'
@@ -18,7 +18,7 @@ export class PreviewViewContainerComponent implements OnInit {
18
18
  @Input() pConn$: typeof PConnect;
19
19
 
20
20
  ngOnInit(): void {
21
- const containerMgr: any = this.pConn$.getContainerManager();
21
+ const containerMgr = this.pConn$.getContainerManager();
22
22
 
23
23
  containerMgr.initializeContainers({
24
24
  type: 'multiple'
@@ -0,0 +1,22 @@
1
+ export const addContainerItem = pConnect => {
2
+ const containerManager = pConnect.getContainerManager();
3
+ const context = pConnect.getContextName();
4
+ containerManager.addContainerItem({
5
+ context,
6
+ semanticURL: ''
7
+ });
8
+ };
9
+
10
+ export const configureBrowserBookmark = pConnect => {
11
+ const context = pConnect.getContextName();
12
+ const containerName = pConnect.getContainerName();
13
+ const navPages = pConnect.getValue('pyPortal.pyPrimaryNavPages');
14
+ const defaultViewLabel = Array.isArray(navPages) && navPages[0] ? navPages[0].pyLabel : '';
15
+ PCore.configureForBrowserBookmark({
16
+ context,
17
+ containerName,
18
+ acName: containerName,
19
+ semanticURL: '',
20
+ defaultViewLabel
21
+ });
22
+ };
@@ -5,6 +5,7 @@ import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-c
5
5
  import { ProgressSpinnerService } from '@pega/angular-sdk-components';
6
6
  import { ReferenceComponent } from '@pega/angular-sdk-components';
7
7
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
8
+ import { configureBrowserBookmark } from './helper';
8
9
 
9
10
  /**
10
11
  * WARNING: It is not expected that this file should be modified. It is part of infrastructure code that works with
@@ -27,7 +28,6 @@ interface ViewContainerProps {
27
28
  selector: 'app-view-container',
28
29
  templateUrl: './view-container.component.html',
29
30
  styleUrls: ['./view-container.component.scss'],
30
- standalone: true,
31
31
  imports: [CommonModule, forwardRef(() => ComponentMapperComponent)]
32
32
  })
33
33
  export class ViewContainerComponent implements OnInit, OnDestroy {
@@ -86,7 +86,7 @@ export class ViewContainerComponent implements OnInit, OnDestroy {
86
86
 
87
87
  this.pConn$.isBoundToState();
88
88
 
89
- const containerMgr: any = this.pConn$.getContainerManager();
89
+ const containerMgr = this.pConn$.getContainerManager();
90
90
 
91
91
  this.prepareDispatchObject = this.prepareDispatchObject.bind(this);
92
92
 
@@ -96,20 +96,10 @@ export class ViewContainerComponent implements OnInit, OnDestroy {
96
96
  // And expose less via ui-bootstrap.js
97
97
  this.state = {
98
98
  dispatchObject: this.dispatchObject,
99
- // PCore is defined in pxBootstrapShell - eventually will be exported in place of constellationCore
100
-
101
99
  visible: !PCore.checkIfSemanticURL()
102
100
  };
103
101
 
104
- // here, to match Nebula/Constellation, the constructor of ViewContainer is only called once, and thus init/add container is only
105
- // called once. Because of Angular creating and destroy components if the parent changes a lot, this component will be
106
- // created and destroyed more than once. So the sessionStore "hasViewContainer" is set to false in rootContainer and then
107
- // after first round is true here. Subsequent ViewContainer creation will not init/add more containers.
108
-
109
102
  if (sessionStorage.getItem('hasViewContainer') == 'false') {
110
- // unlike Nebula/Constellation, have to initializeContainer after we create a dispatcObject and state, otherwise, when calling
111
- // initializeContainer before, code will get executed that needs state that wasn't defined.
112
-
113
103
  containerMgr.initializeContainers({
114
104
  type: mode === CONTAINER_TYPE.MULTIPLE ? CONTAINER_TYPE.MULTIPLE : CONTAINER_TYPE.SINGLE
115
105
  });
@@ -118,12 +108,9 @@ export class ViewContainerComponent implements OnInit, OnDestroy {
118
108
  /* NOTE: setContainerLimit use is temporary. It is a non-public, unsupported API. */
119
109
  PCore.getContainerUtils().setContainerLimit(`${APP.APP}/${name}`, limit);
120
110
  }
121
- }
122
111
 
123
- if (sessionStorage.getItem('hasViewContainer') == 'false') {
124
- if (this.pConn$.getMetadata().children) {
125
- containerMgr.addContainerItem(this.dispatchObject);
126
- }
112
+ if (!PCore.checkIfSemanticURL()) containerMgr.addContainerItem(this.pConn$ as any);
113
+ if (!this.displayOnlyFA$) configureBrowserBookmark(this.pConn$);
127
114
 
128
115
  sessionStorage.setItem('hasViewContainer', 'true');
129
116
  }
@@ -254,7 +241,7 @@ export class ViewContainerComponent implements OnInit, OnDestroy {
254
241
  console.error(`ViewContainer has a newComp that is NOT a reference!`);
255
242
 
256
243
  this.createdViewPConn$ = newComp;
257
- const newConfigProps: any = newComp.getConfigProps();
244
+ const newConfigProps = newComp.getConfigProps();
258
245
  this.templateName$ = newConfigProps.template || '';
259
246
  this.title$ = newConfigProps.title || '';
260
247
  // update children with new view's children
@@ -1,4 +1,4 @@
1
- <mat-grid-list cols="2" rowHeight="6.25rem">
1
+ <mat-grid-list *ngIf="arMainButtons$ && arSecondaryButtons$" cols="2" rowHeight="6.25rem">
2
2
  <mat-grid-tile>
3
3
  <button *ngFor="let aButton of arSecondaryButtons$" mat-raised-button color="secondary" (click)="buttonClick(aButton.jsAction, 'secondary')">
4
4
  {{ localizedVal(aButton.name, localeCategory) }}
@@ -7,7 +7,6 @@ import { MatGridListModule } from '@angular/material/grid-list';
7
7
  selector: 'app-action-buttons',
8
8
  templateUrl: './action-buttons.component.html',
9
9
  styleUrls: ['./action-buttons.component.scss'],
10
- standalone: true,
11
10
  imports: [CommonModule, MatGridListModule, MatButtonModule]
12
11
  })
13
12
  export class ActionButtonsComponent {
@@ -1,5 +1,5 @@
1
1
  <div>
2
- <div><component-mapper name="AlertBanner" [props]="{ banners }" [parent]="this"></component-mapper></div>
2
+ <div><component-mapper name="AlertBanner" [props]="{ banners: bannerService.banners }" [parent]="this"></component-mapper></div>
3
3
  <div *ngIf="bHasNavigation$" class="psdk-stepper">
4
4
  <component-mapper
5
5
  name="MultiStep"