@pega/angular-sdk-overrides 0.24.9 → 0.25.2

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 (256) hide show
  1. package/lib/designSystemExtension/alert/alert.component.scss +3 -3
  2. package/lib/designSystemExtension/alert/alert.component.ts +0 -1
  3. package/lib/designSystemExtension/alert-banner/alert-banner.component.ts +1 -2
  4. package/lib/designSystemExtension/banner/banner.component.scss +12 -2
  5. package/lib/designSystemExtension/banner/banner.component.ts +0 -1
  6. package/lib/designSystemExtension/case-create-stage/case-create-stage.component.ts +1 -2
  7. package/lib/designSystemExtension/field-group/field-group.component.ts +0 -1
  8. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.html +6 -3
  9. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.scss +7 -35
  10. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.ts +0 -2
  11. package/lib/designSystemExtension/material-details/material-details.component.scss +0 -5
  12. package/lib/designSystemExtension/material-details/material-details.component.ts +0 -1
  13. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.html +4 -4
  14. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.scss +4 -3
  15. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.ts +10 -2
  16. package/lib/designSystemExtension/material-summary-item/material-summary-item.component.scss +2 -17
  17. package/lib/designSystemExtension/material-summary-item/material-summary-item.component.ts +0 -1
  18. package/lib/designSystemExtension/material-summary-list/material-summary-list.component.ts +0 -1
  19. package/lib/designSystemExtension/material-utility/material-utility.component.scss +1 -2
  20. package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.scss +1 -1
  21. package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.ts +0 -1
  22. package/lib/designSystemExtension/operator/operator.component.html +2 -2
  23. package/lib/designSystemExtension/operator/operator.component.scss +13 -12
  24. package/lib/designSystemExtension/operator/operator.component.ts +5 -6
  25. package/lib/designSystemExtension/pulse/pulse.component.scss +2 -2
  26. package/lib/designSystemExtension/pulse/pulse.component.ts +7 -8
  27. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.scss +0 -1
  28. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.ts +0 -1
  29. package/lib/designSystemExtension/wss-quick-create/wss-quick-create.component.scss +16 -8
  30. package/lib/designSystemExtension/wss-quick-create/wss-quick-create.component.ts +0 -1
  31. package/lib/field/auto-complete/auto-complete.component.html +0 -2
  32. package/lib/field/auto-complete/auto-complete.component.ts +56 -178
  33. package/lib/field/cancel-alert/cancel-alert.component.html +8 -12
  34. package/lib/field/cancel-alert/cancel-alert.component.scss +2 -3
  35. package/lib/field/cancel-alert/cancel-alert.component.ts +24 -37
  36. package/lib/field/check-box/check-box.component.html +17 -6
  37. package/lib/field/check-box/check-box.component.scss +0 -1
  38. package/lib/field/check-box/check-box.component.ts +32 -157
  39. package/lib/field/currency/currency.component.html +4 -4
  40. package/lib/field/currency/currency.component.ts +65 -175
  41. package/lib/field/date/date.component.html +4 -8
  42. package/lib/field/date/date.component.ts +39 -177
  43. package/lib/field/date-time/date-time.component.html +3 -4
  44. package/lib/field/date-time/date-time.component.ts +46 -146
  45. package/lib/field/decimal/decimal.component.html +4 -3
  46. package/lib/field/decimal/decimal.component.ts +66 -166
  47. package/lib/field/dropdown/dropdown.component.html +1 -0
  48. package/lib/field/dropdown/dropdown.component.ts +158 -153
  49. package/lib/field/email/email.component.ts +28 -148
  50. package/lib/field/field.base.ts +149 -0
  51. package/lib/field/group/group.component.ts +9 -7
  52. package/lib/field/integer/integer.component.ts +30 -152
  53. package/lib/field/list-view-action-buttons/list-view-action-buttons.component.html +1 -1
  54. package/lib/field/list-view-action-buttons/list-view-action-buttons.component.ts +3 -3
  55. package/lib/field/location/config-ext.json +8 -0
  56. package/lib/field/location/location.component.html +45 -0
  57. package/lib/field/location/location.component.scss +18 -0
  58. package/lib/field/location/location.component.spec.ts +22 -0
  59. package/lib/field/location/location.component.ts +385 -0
  60. package/lib/field/multiselect/multiselect.component.ts +56 -151
  61. package/lib/field/multiselect/utils.ts +55 -47
  62. package/lib/field/object-reference/object-reference.component.html +17 -0
  63. package/lib/field/object-reference/object-reference.component.scss +0 -0
  64. package/lib/field/object-reference/object-reference.component.spec.ts +22 -0
  65. package/lib/field/object-reference/object-reference.component.ts +237 -0
  66. package/lib/field/percentage/percentage.component.html +3 -3
  67. package/lib/field/percentage/percentage.component.ts +68 -161
  68. package/lib/field/phone/config-ext.json +1 -1
  69. package/lib/field/phone/phone.component.html +9 -6
  70. package/lib/field/phone/phone.component.scss +9 -0
  71. package/lib/field/phone/phone.component.ts +48 -159
  72. package/lib/field/radio-buttons/radio-buttons.component.html +17 -12
  73. package/lib/field/radio-buttons/radio-buttons.component.scss +4 -2
  74. package/lib/field/radio-buttons/radio-buttons.component.ts +39 -162
  75. package/lib/field/rich-text/rich-text.component.ts +32 -93
  76. package/lib/field/scalar-list/scalar-list.component.ts +20 -77
  77. package/lib/field/selectable-card/selectable-card.component.html +70 -0
  78. package/lib/field/selectable-card/selectable-card.component.scss +11 -0
  79. package/lib/field/selectable-card/selectable-card.component.spec.ts +22 -0
  80. package/lib/field/selectable-card/selectable-card.component.ts +219 -0
  81. package/lib/field/semantic-link/semantic-link.component.html +4 -8
  82. package/lib/field/semantic-link/semantic-link.component.scss +0 -13
  83. package/lib/field/semantic-link/semantic-link.component.ts +165 -6
  84. package/lib/field/text/text.component.scss +0 -1
  85. package/lib/field/text/text.component.ts +8 -5
  86. package/lib/field/text-area/text-area.component.html +4 -1
  87. package/lib/field/text-area/text-area.component.ts +30 -148
  88. package/lib/field/text-content/text-content.component.ts +0 -1
  89. package/lib/field/text-input/text-input.component.ts +28 -150
  90. package/lib/field/time/time.component.html +2 -2
  91. package/lib/field/time/time.component.ts +39 -145
  92. package/lib/field/url/url.component.ts +28 -149
  93. package/lib/field/user-reference/user-reference.component.html +40 -46
  94. package/lib/field/user-reference/user-reference.component.scss +0 -1
  95. package/lib/field/user-reference/user-reference.component.ts +110 -21
  96. package/lib/infra/Containers/flow-container/flow-container.component.html +1 -1
  97. package/lib/infra/Containers/flow-container/flow-container.component.ts +29 -54
  98. package/lib/infra/Containers/flow-container/helpers.ts +2 -2
  99. package/lib/infra/Containers/hybrid-view-container/hybrid-view-container.component.ts +0 -1
  100. package/lib/infra/Containers/modal-view-container/modal-view-container.component.html +1 -11
  101. package/lib/infra/Containers/modal-view-container/modal-view-container.component.ts +6 -19
  102. package/lib/infra/Containers/preview-view-container/preview-view-container.component.ts +1 -1
  103. package/lib/infra/Containers/view-container/helper.ts +55 -0
  104. package/lib/infra/Containers/view-container/view-container.component.ts +6 -19
  105. package/lib/infra/action-buttons/action-buttons.component.html +13 -8
  106. package/lib/infra/action-buttons/action-buttons.component.scss +23 -0
  107. package/lib/infra/action-buttons/action-buttons.component.ts +1 -3
  108. package/lib/infra/assignment/assignment.component.html +1 -1
  109. package/lib/infra/assignment/assignment.component.ts +90 -47
  110. package/lib/infra/assignment-card/assignment-card.component.html +2 -2
  111. package/lib/infra/assignment-card/assignment-card.component.scss +0 -4
  112. package/lib/infra/assignment-card/assignment-card.component.ts +21 -5
  113. package/lib/infra/dashboard-filter/dashboard-filter.component.ts +0 -1
  114. package/lib/infra/defer-load/defer-load.component.html +6 -2
  115. package/lib/infra/defer-load/defer-load.component.ts +24 -16
  116. package/lib/infra/error-boundary/error-boundary.component.ts +0 -1
  117. package/lib/infra/multi-step/multi-step.component.scss +1 -21
  118. package/lib/infra/multi-step/multi-step.component.ts +0 -1
  119. package/lib/infra/navbar/navbar.component.html +25 -28
  120. package/lib/infra/navbar/navbar.component.scss +16 -4
  121. package/lib/infra/navbar/navbar.component.ts +11 -9
  122. package/lib/infra/reference/reference.component.ts +77 -90
  123. package/lib/infra/region/region.component.ts +0 -1
  124. package/lib/infra/root-container/root-container.component.html +2 -15
  125. package/lib/infra/root-container/root-container.component.scss +0 -1
  126. package/lib/infra/root-container/root-container.component.ts +28 -35
  127. package/lib/infra/stages/stages.component.html +2 -2
  128. package/lib/infra/stages/stages.component.scss +9 -37
  129. package/lib/infra/stages/stages.component.ts +4 -3
  130. package/lib/infra/view/view.component.html +7 -20
  131. package/lib/infra/view/view.component.ts +20 -5
  132. package/lib/template/advanced-search/advanced-search.component.html +12 -0
  133. package/lib/template/advanced-search/advanced-search.component.scss +0 -0
  134. package/lib/template/advanced-search/advanced-search.component.spec.ts +0 -0
  135. package/lib/template/advanced-search/advanced-search.component.ts +112 -0
  136. package/lib/template/advanced-search/advanced-search.service.ts +27 -0
  137. package/lib/template/advanced-search/search-group/persist-utils.ts +56 -0
  138. package/lib/template/advanced-search/search-groups/search-groups.component.html +32 -0
  139. package/lib/template/advanced-search/search-groups/search-groups.component.scss +0 -0
  140. package/lib/template/advanced-search/search-groups/search-groups.component.spec.ts +0 -0
  141. package/lib/template/advanced-search/search-groups/search-groups.component.ts +294 -0
  142. package/lib/template/advanced-search/search-groups/utils.ts +29 -0
  143. package/lib/template/app-shell/app-shell.component.html +4 -1
  144. package/lib/template/app-shell/app-shell.component.scss +0 -3
  145. package/lib/template/app-shell/app-shell.component.ts +66 -10
  146. package/lib/template/banner-page/banner-page.component.ts +0 -1
  147. package/lib/template/base/details-template-base.ts +67 -0
  148. package/lib/template/base/form-template-base.ts +16 -0
  149. package/lib/template/case-summary/case-summary.component.scss +0 -2
  150. package/lib/template/case-summary/case-summary.component.ts +7 -23
  151. package/lib/template/case-view/case-view.component.html +7 -7
  152. package/lib/template/case-view/case-view.component.scss +18 -10
  153. package/lib/template/case-view/case-view.component.ts +9 -15
  154. package/lib/template/confirmation/confirmation.component.html +1 -1
  155. package/lib/template/confirmation/confirmation.component.ts +1 -2
  156. package/lib/template/data-reference/data-reference-advanced-search.service.ts +16 -0
  157. package/lib/template/data-reference/data-reference.component.html +11 -8
  158. package/lib/template/data-reference/data-reference.component.ts +377 -148
  159. package/lib/template/data-reference/search-form/search-form.component.html +39 -0
  160. package/lib/template/data-reference/search-form/search-form.component.scss +11 -0
  161. package/lib/template/data-reference/search-form/search-form.component.spec.ts +0 -0
  162. package/lib/template/data-reference/search-form/search-form.component.ts +167 -0
  163. package/lib/template/data-reference/search-form/tabsData.ts +160 -0
  164. package/lib/template/data-reference/utils.ts +92 -0
  165. package/lib/template/default-form/default-form.component.html +0 -4
  166. package/lib/template/default-form/default-form.component.ts +50 -26
  167. package/lib/template/default-page/default-page.component.html +34 -0
  168. package/lib/template/default-page/default-page.component.scss +31 -0
  169. package/lib/template/default-page/default-page.component.spec.ts +24 -0
  170. package/lib/template/default-page/default-page.component.ts +64 -0
  171. package/lib/template/details/details.component.ts +7 -42
  172. package/lib/template/details-narrow-wide/details-narrow-wide.component.ts +6 -40
  173. package/lib/template/details-one-column/details-one-column.component.ts +7 -43
  174. package/lib/template/details-sub-tabs/details-sub-tabs.component.html +1 -2
  175. package/lib/template/details-sub-tabs/details-sub-tabs.component.ts +5 -38
  176. package/lib/template/details-three-column/details-three-column.component.ts +7 -44
  177. package/lib/template/details-two-column/details-two-column.component.ts +8 -45
  178. package/lib/template/details-wide-narrow/details-wide-narrow.component.ts +7 -43
  179. package/lib/template/dynamic-tabs/dynamic-tabs.component.html +3 -0
  180. package/lib/template/dynamic-tabs/dynamic-tabs.component.ts +8 -4
  181. package/lib/template/field-group-list/field-group-list.component.scss +0 -1
  182. package/lib/template/field-group-list/field-group-list.component.ts +0 -1
  183. package/lib/template/field-group-template/field-group-template.component.html +7 -7
  184. package/lib/template/field-group-template/field-group-template.component.scss +8 -0
  185. package/lib/template/field-group-template/field-group-template.component.ts +68 -48
  186. package/lib/template/field-value-list/field-value-list.component.html +2 -2
  187. package/lib/template/field-value-list/field-value-list.component.scss +6 -1
  188. package/lib/template/field-value-list/field-value-list.component.ts +0 -1
  189. package/lib/template/inline-dashboard/inline-dashboard.component.ts +0 -1
  190. package/lib/template/inline-dashboard-page/inline-dashboard-page.component.ts +2 -3
  191. package/lib/template/list-page/list-page.component.ts +0 -1
  192. package/lib/template/list-view/list-view.component.html +14 -4
  193. package/lib/template/list-view/list-view.component.scss +30 -19
  194. package/lib/template/list-view/list-view.component.ts +179 -95
  195. package/lib/template/list-view/listViewHelpers.ts +4 -10
  196. package/lib/template/list-view/utils.ts +27 -7
  197. package/lib/template/multi-reference-readonly/multi-reference-readonly.component.ts +0 -1
  198. package/lib/template/narrow-wide-form/narrow-wide-form.component.ts +1 -2
  199. package/lib/template/object-page/object-page.component.html +1 -0
  200. package/lib/template/object-page/object-page.component.scss +0 -0
  201. package/lib/template/object-page/object-page.component.spec.ts +22 -0
  202. package/lib/template/object-page/object-page.component.ts +14 -0
  203. package/lib/template/one-column/one-column.component.ts +4 -4
  204. package/lib/template/one-column-page/one-column-page.component.ts +0 -1
  205. package/lib/template/one-column-tab/one-column-tab.component.scss +1 -1
  206. package/lib/template/one-column-tab/one-column-tab.component.ts +1 -2
  207. package/lib/template/page/page.component.ts +1 -2
  208. package/lib/template/promoted-filters/promoted-filters.component.ts +1 -2
  209. package/lib/template/repeating-structures/repeating-structures.component.ts +1 -3
  210. package/lib/template/self-service-case-view/self-service-case-view.component.html +80 -0
  211. package/lib/template/self-service-case-view/self-service-case-view.component.scss +124 -0
  212. package/lib/template/self-service-case-view/self-service-case-view.component.spec.ts +24 -0
  213. package/lib/template/self-service-case-view/self-service-case-view.component.ts +216 -0
  214. package/lib/template/simple-table/simple-table.component.ts +0 -2
  215. package/lib/template/simple-table-manual/helpers.ts +127 -11
  216. package/lib/template/simple-table-manual/simple-table-manual.component.html +27 -8
  217. package/lib/template/simple-table-manual/simple-table-manual.component.scss +16 -17
  218. package/lib/template/simple-table-manual/simple-table-manual.component.ts +118 -58
  219. package/lib/template/simple-table-select/simple-table-select.component.ts +3 -4
  220. package/lib/template/single-reference-readonly/single-reference-readonly.component.html +4 -1
  221. package/lib/template/single-reference-readonly/single-reference-readonly.component.scss +21 -0
  222. package/lib/template/single-reference-readonly/single-reference-readonly.component.ts +104 -4
  223. package/lib/template/sub-tabs/sub-tabs.component.ts +0 -1
  224. package/lib/template/three-column/three-column.component.ts +4 -4
  225. package/lib/template/three-column-page/three-column-page.component.ts +0 -1
  226. package/lib/template/two-column/two-column.component.ts +4 -4
  227. package/lib/template/two-column-page/two-column-page.component.ts +0 -1
  228. package/lib/template/two-column-tab/two-column-tab.component.ts +1 -2
  229. package/lib/template/utils.ts +58 -0
  230. package/lib/template/wide-narrow-form/wide-narrow-form.component.ts +4 -4
  231. package/lib/template/wide-narrow-page/wide-narrow-page.component.ts +1 -2
  232. package/lib/template/wss-nav-bar/wss-nav-bar.component.html +5 -4
  233. package/lib/template/wss-nav-bar/wss-nav-bar.component.scss +2 -8
  234. package/lib/template/wss-nav-bar/wss-nav-bar.component.ts +3 -11
  235. package/lib/widget/app-announcement/app-announcement.component.html +1 -2
  236. package/lib/widget/app-announcement/app-announcement.component.scss +2 -2
  237. package/lib/widget/app-announcement/app-announcement.component.ts +0 -1
  238. package/lib/widget/attachment/Attachment.types.ts +92 -0
  239. package/lib/widget/attachment/AttachmentUtils.ts +287 -0
  240. package/lib/widget/attachment/attachment.component.html +3 -3
  241. package/lib/widget/attachment/attachment.component.scss +2 -5
  242. package/lib/widget/attachment/attachment.component.ts +256 -259
  243. package/lib/widget/case-history/case-history.component.ts +0 -1
  244. package/lib/widget/feed-container/feed-container.component.scss +3 -9
  245. package/lib/widget/feed-container/feed-container.component.ts +9 -12
  246. package/lib/widget/file-utility/file-utility.component.html +3 -3
  247. package/lib/widget/file-utility/file-utility.component.scss +5 -16
  248. package/lib/widget/file-utility/file-utility.component.ts +2 -6
  249. package/lib/widget/list-utility/list-utility.component.scss +3 -5
  250. package/lib/widget/list-utility/list-utility.component.ts +0 -1
  251. package/lib/widget/quick-create/quick-create.component.ts +0 -1
  252. package/lib/widget/todo/todo.component.html +13 -11
  253. package/lib/widget/todo/todo.component.scss +19 -11
  254. package/lib/widget/todo/todo.component.ts +101 -87
  255. package/lib/widget/utility/utility.component.ts +0 -1
  256. package/package.json +1 -1
@@ -7,6 +7,22 @@ import { getAllFields } from '@pega/angular-sdk-components';
7
7
  import { ReferenceComponent } from '@pega/angular-sdk-components';
8
8
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
9
9
 
10
+ const NO_HEADER_TEMPLATES = ['SubTabs', 'SimpleTable', 'Confirmation', 'DynamicTabs', 'DetailsSubTabs'];
11
+ const DETAILS_TEMPLATES = [
12
+ 'Details',
13
+ 'DetailsFields',
14
+ 'DetailsOneColumn',
15
+ 'DetailsSubTabs',
16
+ 'DetailsThreeColumn',
17
+ 'DetailsTwoColumn',
18
+ 'NarrowWideDetails',
19
+ 'WideNarrowDetails'
20
+ ];
21
+
22
+ function isDetailsTemplate(template) {
23
+ return DETAILS_TEMPLATES.includes(template);
24
+ }
25
+
10
26
  /**
11
27
  * WARNING: It is not expected that this file should be modified. It is part of infrastructure code that works with
12
28
  * Redux and creation/update of Redux containers and PConnect. Modifying this code could have undesireable results and
@@ -66,7 +82,6 @@ interface ViewProps {
66
82
  selector: 'app-view',
67
83
  templateUrl: './view.component.html',
68
84
  styleUrls: ['./view.component.scss'],
69
- standalone: true,
70
85
  imports: [CommonModule, forwardRef(() => ComponentMapperComponent)]
71
86
  })
72
87
  export class ViewComponent implements OnInit, OnDestroy, OnChanges {
@@ -77,13 +92,15 @@ export class ViewComponent implements OnInit, OnDestroy, OnChanges {
77
92
 
78
93
  angularPConnectData: AngularPConnectData = {};
79
94
 
95
+ noHeaderTemplates = NO_HEADER_TEMPLATES;
96
+
80
97
  configProps$: ViewProps;
81
98
  inheritedProps$: any;
82
99
  arChildren$: any[];
83
100
  templateName$: string;
84
101
  title$ = '';
85
102
  label$ = '';
86
- showLabel$ = true;
103
+ showLabel$ = false;
87
104
  visibility$ = true;
88
105
 
89
106
  constructor(
@@ -142,13 +159,11 @@ export class ViewComponent implements OnInit, OnDestroy, OnChanges {
142
159
  this.templateName$ = this.configProps$.template || '';
143
160
  this.title$ = this.configProps$.title || '';
144
161
  this.label$ = this.configProps$.label || '';
145
- this.showLabel$ = this.configProps$.showLabel || this.showLabel$;
162
+ this.showLabel$ = this.configProps$.showLabel || isDetailsTemplate(this.templateName$) || this.showLabel$;
146
163
  // label & showLabel within inheritedProps takes precedence over configProps
147
164
  this.label$ = this.inheritedProps$.label || this.label$;
148
- this.showLabel$ = this.inheritedProps$.showLabel || this.showLabel$;
149
165
  // children may have a 'reference' so normalize the children array
150
166
  this.arChildren$ = ReferenceComponent.normalizePConnArray(this.pConn$.getChildren());
151
-
152
167
  this.visibility$ = this.configProps$.visibility ?? this.visibility$;
153
168
 
154
169
  /**
@@ -0,0 +1,12 @@
1
+ <div class="advanced-search">
2
+ <!-- Search Groups Component -->
3
+ <component-mapper name="SearchGroups" [props]="{ pConn$, formGroup$, searchGroupsProps }"></component-mapper>
4
+ <!-- Editable Field Component -->
5
+ <ng-container *ngIf="editableFieldComp">
6
+ <component-mapper
7
+ [name]="editableFieldComp.getPConnect().getComponentName()"
8
+ [props]="{ pConn$: editableFieldComp.getPConnect() }"
9
+ errorMsg="View Missing (displayAll): {{ editableFieldComp.getPConnect().getComponentName() }}"
10
+ ></component-mapper>
11
+ </ng-container>
12
+ </div>
@@ -0,0 +1,112 @@
1
+ import { Component, forwardRef, Input, OnInit, OnChanges } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormGroup } from '@angular/forms';
4
+ import { ComponentMapperComponent } from '@pega/angular-sdk-components';
5
+ import { DataReferenceAdvancedSearchService } from '@pega/angular-sdk-components';
6
+ import { getFirstChildConfig } from '@pega/angular-sdk-components';
7
+
8
+ @Component({
9
+ selector: 'app-advanced-search',
10
+ templateUrl: './advanced-search.component.html',
11
+ styleUrls: ['./advanced-search.component.scss'],
12
+ imports: [CommonModule, forwardRef(() => ComponentMapperComponent)]
13
+ })
14
+ export class AdvancedSearchComponent implements OnInit, OnChanges {
15
+ @Input() pConn$: typeof PConnect;
16
+ @Input() formGroup$: FormGroup;
17
+ @Input() searchSelectCacheKey;
18
+
19
+ isInitialized = false;
20
+
21
+ configProps$: any;
22
+ showRecords: any;
23
+ searchGroupsProps: any;
24
+ editableFieldComp: any;
25
+
26
+ constructor(private advancedSearchService: DataReferenceAdvancedSearchService) {}
27
+
28
+ ngOnInit(): void {
29
+ this.isInitialized = true;
30
+ this.updateSelf();
31
+ }
32
+
33
+ ngOnChanges() {
34
+ if (this.isInitialized) {
35
+ this.updateSelf();
36
+ }
37
+ }
38
+
39
+ // updateSelf
40
+ updateSelf(): void {
41
+ this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps());
42
+ const targetObjectClass = this.configProps$.targetObjectClass;
43
+ const localeReference = this.configProps$.localeReference;
44
+ const data: any = this.advancedSearchService.getConfig();
45
+ const { dataReferenceConfigToChild, isCreateNewReferenceEnabled, disableStartingFieldsForReference, pyID, searchSelectCacheKey } = data;
46
+ const { selectionMode, value: singleSelectFieldValue, readonlyContextList: multiSelectField } = dataReferenceConfigToChild;
47
+
48
+ // let isSelectionExist = false;
49
+ const { MULTI } = PCore.getConstants().LIST_SELECTION_MODE;
50
+
51
+ if (selectionMode === MULTI) {
52
+ this.showRecords = this.pConn$.getValue(multiSelectField)?.length || false;
53
+ } else {
54
+ this.showRecords = this.pConn$.getValue(singleSelectFieldValue) || false;
55
+ }
56
+
57
+ const rawViewMetadata = this.pConn$.getRawMetadata() as any;
58
+
59
+ const searchFieldsSet = new Set();
60
+ const searchFields: any = [];
61
+ rawViewMetadata?.config?.searchGroups?.forEach((group: any) => {
62
+ group.children.forEach((child: any) => {
63
+ if (!searchFieldsSet.has(child.config.value) && !child.config.validator) {
64
+ searchFields.push(child);
65
+ searchFieldsSet.add(child.config.value);
66
+ }
67
+ });
68
+ });
69
+
70
+ const firstChildPConnect = this.pConn$.getChildren()[0].getPConnect as any;
71
+ const [firstChildMeta] = rawViewMetadata.children;
72
+
73
+ const localizedVal = PCore.getLocaleUtils().getLocaleValue;
74
+ // @ts-ignore
75
+ const cache = PCore.getNavigationUtils().getComponentCache(searchSelectCacheKey) ?? {};
76
+
77
+ this.editableFieldComp = firstChildPConnect().createComponent({
78
+ type: firstChildMeta.type,
79
+ config: {
80
+ ...getFirstChildConfig({
81
+ firstChildMeta,
82
+ getPConnect: this.pConn$,
83
+ rawViewMetadata,
84
+ contextClass: targetObjectClass,
85
+ dataReferenceConfigToChild,
86
+ isCreateNewReferenceEnabled,
87
+ disableStartingFieldsForReference,
88
+ pyID
89
+ }),
90
+ searchFields,
91
+ showRecords: this.showRecords,
92
+ label: localizedVal('Search results', 'DataReference'),
93
+ searchSelectCacheKey,
94
+ cache
95
+ }
96
+ });
97
+
98
+ const { selectionList, dataRelationshipContext } = this.editableFieldComp.getPConnect().getConfigProps();
99
+ const editableField = selectionMode === MULTI ? selectionList.substring(1) : dataRelationshipContext;
100
+
101
+ this.searchGroupsProps = {
102
+ getPConnect: this.pConn$,
103
+ editableField,
104
+ localeReference,
105
+ setShowRecords: (value: boolean) => {
106
+ this.showRecords = value;
107
+ },
108
+ searchSelectCacheKey: dataReferenceConfigToChild.searchSelectCacheKey,
109
+ cache
110
+ };
111
+ }
112
+ }
@@ -0,0 +1,27 @@
1
+ import { Injectable } from '@angular/core';
2
+
3
+ @Injectable({
4
+ providedIn: 'root'
5
+ })
6
+ export class AdvancedSearchService {
7
+ initializeSearchFields(rawViewMetadata: any): any[] {
8
+ const searchFieldsSet = new Set();
9
+ const searchFields: any[] = [];
10
+
11
+ rawViewMetadata.config.searchGroups.forEach((group: any) => {
12
+ group.children.forEach((child: any) => {
13
+ if (!searchFieldsSet.has(child.config.value) && !child.config.validator) {
14
+ searchFields.push(child);
15
+ searchFieldsSet.add(child.config.value);
16
+ }
17
+ });
18
+ });
19
+
20
+ return searchFields;
21
+ }
22
+
23
+ getLocalizedValue(key: string, context: string): string {
24
+ // Mock implementation for localized value retrieval
25
+ return `${context}: ${key}`;
26
+ }
27
+ }
@@ -0,0 +1,56 @@
1
+ const SKIP_CACHE_KEY = '';
2
+
3
+ export function getMappedKey(key) {
4
+ const mappedKey = PCore.getEnvironmentInfo().getKeyMapping(key);
5
+ if (!mappedKey) {
6
+ return key;
7
+ }
8
+ return mappedKey;
9
+ }
10
+
11
+ const getComponentStateKey = (getPConnect, propertyName: string) => {
12
+ const pConnect = getPConnect;
13
+ const caseID = `.${getMappedKey('pyID')}`; // Enhance this later when use-case arrives for data objects using S&S.
14
+ const resolvedCaseID = pConnect.getValue(caseID);
15
+
16
+ if (!resolvedCaseID) {
17
+ return SKIP_CACHE_KEY;
18
+ }
19
+
20
+ return `Search-${resolvedCaseID}-${pConnect.getPageReference()}-${propertyName}-${pConnect.getCurrentView()}`;
21
+ };
22
+
23
+ const getComponentStateOptions = getPConnect => {
24
+ return { clearOnCancelForContext: getPConnect.getContextName() };
25
+ };
26
+
27
+ interface SearchCategory {
28
+ // tabId of search category selected
29
+ selectedCategory: string;
30
+ }
31
+
32
+ interface SearchGroup {
33
+ // searchFields can be any object based on what fields are authored.
34
+ searchFields: unknown;
35
+ activeGroupId: string;
36
+ }
37
+
38
+ const setComponentCache = ({
39
+ cacheKey,
40
+ state,
41
+ options
42
+ }: {
43
+ cacheKey: string;
44
+ state: SearchCategory | SearchGroup;
45
+ options: ReturnType<typeof getComponentStateOptions>;
46
+ }) => {
47
+ if (cacheKey !== SKIP_CACHE_KEY) {
48
+ (PCore.getNavigationUtils() as any).setComponentCache(cacheKey, state, options);
49
+ }
50
+ };
51
+
52
+ export const componentCachePersistUtils = {
53
+ getComponentStateKey,
54
+ getComponentStateOptions,
55
+ setComponentCache
56
+ };
@@ -0,0 +1,32 @@
1
+ <div class="search-groups-container" fxLayout="column" fxLayoutGap="16px">
2
+ <!-- Dropdown if multiple groups -->
3
+ <div *ngIf="groups && groups.length > 1">
4
+ <mat-form-field appearance="fill" style="width: 100%">
5
+ <mat-label>Search By</mat-label>
6
+ <mat-select [value]="activeGroupId" (selectionChange)="onActiveGroupChange($event.value)">
7
+ <mat-option *ngFor="let group of groups" [value]="group.config.id">
8
+ {{ group.config.label }}
9
+ </mat-option>
10
+ </mat-select>
11
+ </mat-form-field>
12
+ </div>
13
+
14
+ <!-- Search Fields Form -->
15
+ <div *ngIf="transientItemID">
16
+ <component-mapper
17
+ [name]="searchFieldsC11nEnv()?.getPConnect().getComponentName()"
18
+ [props]="{ pConn$: searchFieldsC11nEnv()?.getPConnect(), formGroup$ }"
19
+ errorMsg="View Missing (displayAll): {{ searchFieldsC11nEnv()?.getPConnect().getComponentName() }}"
20
+ ></component-mapper>
21
+ </div>
22
+
23
+ <!-- Action Buttons -->
24
+ <div style="display: flex; gap: 8px; margin-bottom: 10px">
25
+ <button mat-stroked-button type="button" (click)="resetFilterData()">
26
+ {{ localizedVal('Reset', 'SimpleTable') }}
27
+ </button>
28
+ <button mat-raised-button color="primary" type="button" (click)="getFilterData()">
29
+ {{ localizedVal('Search', 'SimpleTable') }}
30
+ </button>
31
+ </div>
32
+ </div>
@@ -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;