@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
@@ -0,0 +1,149 @@
1
+ import { Directive, inject, Input, OnDestroy, OnInit } from '@angular/core';
2
+ import { FormControl, FormGroup } from '@angular/forms';
3
+
4
+ import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
5
+ import { Utils } from '@pega/angular-sdk-components';
6
+
7
+ @Directive()
8
+ export class FieldBase implements OnInit, OnDestroy {
9
+ @Input() pConn$: typeof PConnect;
10
+ @Input() formGroup$: FormGroup;
11
+
12
+ protected angularPConnect = inject(AngularPConnectService);
13
+ protected utils = inject(Utils);
14
+
15
+ protected angularPConnectData: AngularPConnectData = {};
16
+
17
+ fieldControl: FormControl<any> = new FormControl('', null);
18
+ controlName$: string;
19
+ actionsApi: object;
20
+ propName: string;
21
+
22
+ bHasForm$ = true;
23
+ testId: string;
24
+ helperText: string;
25
+ placeholder: string;
26
+ value$: any = '';
27
+ label$ = '';
28
+ hideLabel = false;
29
+ bRequired$ = false;
30
+ bReadonly$ = false;
31
+ bDisabled$ = false;
32
+ bVisible$ = true;
33
+ displayMode$ = '';
34
+
35
+ /**
36
+ * Initializes the component, registers with AngularPConnect, and sets up form control.
37
+ */
38
+ ngOnInit(): void {
39
+ // First thing in initialization is registering and subscribing to the AngularPConnect service
40
+ this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange.bind(this));
41
+ this.controlName$ = this.angularPConnect.getComponentID(this);
42
+
43
+ // call checkAndUpdate
44
+ this.checkAndUpdate();
45
+
46
+ if (this.formGroup$) {
47
+ this.formGroup$.addControl(this.controlName$, this.fieldControl);
48
+ this.fieldControl.setValue(this.value$);
49
+ this.bHasForm$ = true;
50
+ } else {
51
+ this.bReadonly$ = true;
52
+ this.bHasForm$ = false;
53
+ }
54
+
55
+ this.actionsApi = this.pConn$.getActionsApi();
56
+ this.propName = this.pConn$.getStateProps().value;
57
+ }
58
+
59
+ /**
60
+ * Cleans up the component by removing it from the form group and unsubscribing from any observables.
61
+ */
62
+ ngOnDestroy(): void {
63
+ if (this.formGroup$) {
64
+ this.formGroup$.removeControl(this.controlName$);
65
+ }
66
+
67
+ if (this.angularPConnectData.unsubscribeFn) {
68
+ this.angularPConnectData.unsubscribeFn();
69
+ }
70
+ }
71
+
72
+ // Callback passed when subscribing to store change
73
+ onStateChange() {
74
+ this.checkAndUpdate();
75
+ }
76
+
77
+ // Should always check the bridge to see if the component should update itself (re-render)
78
+ checkAndUpdate() {
79
+ const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
80
+
81
+ // ONLY call updateSelf when the component should update
82
+ if (bUpdateSelf) {
83
+ this.updateSelf();
84
+ }
85
+ }
86
+
87
+ // will be overriden by child components
88
+ updateSelf(): void {}
89
+
90
+ /**
91
+ * Updates the component's common properties based on the provided configuration.
92
+ *
93
+ * @param configProps The configuration properties to update.
94
+ */
95
+ protected updateComponentCommonProperties(configProps) {
96
+ // Extract properties from config
97
+ const { testId, label, hideLabel, displayMode = '', helperText, placeholder, required, visibility = true, disabled, readOnly } = configProps;
98
+
99
+ // Update component properties
100
+ this.testId = testId;
101
+ this.label$ = label;
102
+ this.hideLabel = hideLabel;
103
+ this.displayMode$ = displayMode;
104
+ this.helperText = helperText;
105
+ this.placeholder = placeholder || '';
106
+
107
+ // Convert boolean properties
108
+ this.bVisible$ = this.utils.getBooleanValue(visibility);
109
+ this.bRequired$ = this.utils.getBooleanValue(required);
110
+ this.bDisabled$ = this.utils.getBooleanValue(disabled);
111
+ this.bReadonly$ = this.utils.getBooleanValue(readOnly);
112
+
113
+ // Enable or disable field control
114
+ this.fieldControl[this.bDisabled$ ? 'disable' : 'enable']();
115
+
116
+ // Display error message if validation message exists
117
+ this.displayValidationMessage();
118
+ }
119
+
120
+ /**
121
+ * Displays the validation message if it exists.
122
+ */
123
+ private displayValidationMessage(): void {
124
+ if (this.angularPConnectData.validateMessage) {
125
+ setTimeout(() => {
126
+ this.fieldControl.setErrors({ message: true });
127
+ this.fieldControl.markAsTouched();
128
+ }, 100);
129
+ }
130
+ }
131
+
132
+ /**
133
+ * Retrieves the error message for the current field control.
134
+ *
135
+ * @returns The error message, or an empty string if no error is found.
136
+ */
137
+ getErrorMessage() {
138
+ // look for validation messages for json, pre-defined or just an error pushed from workitem (400)
139
+ if (this.fieldControl.hasError('message')) {
140
+ return this.angularPConnectData.validateMessage ?? '';
141
+ }
142
+
143
+ if (this.fieldControl.hasError('required')) {
144
+ return 'You must enter a value';
145
+ }
146
+
147
+ return this.fieldControl.errors?.toString() ?? '';
148
+ }
149
+ }
@@ -18,13 +18,16 @@ interface GroupProps extends PConnFieldProps {
18
18
  selector: 'app-group',
19
19
  templateUrl: './group.component.html',
20
20
  styleUrls: ['./group.component.scss'],
21
- standalone: true,
22
21
  imports: [CommonModule, forwardRef(() => ComponentMapperComponent)]
23
22
  })
24
23
  export class GroupComponent implements OnInit {
25
24
  @Input() pConn$: typeof PConnect;
26
25
  @Input() formGroup$: FormGroup;
27
26
 
27
+ // Used with AngularPConnect
28
+ angularPConnectData: AngularPConnectData = {};
29
+ configProps$: GroupProps;
30
+
28
31
  arChildren$: any[];
29
32
  visibility$?: boolean;
30
33
  showHeading$?: boolean;
@@ -32,10 +35,6 @@ export class GroupComponent implements OnInit {
32
35
  instructions$: string;
33
36
  collapsible$: boolean;
34
37
 
35
- // Used with AngularPConnect
36
- angularPConnectData: AngularPConnectData = {};
37
- configProps$: GroupProps;
38
-
39
38
  constructor(private angularPConnect: AngularPConnectService) {}
40
39
 
41
40
  ngOnInit(): void {
@@ -60,6 +59,9 @@ export class GroupComponent implements OnInit {
60
59
  }
61
60
  }
62
61
 
62
+ /**
63
+ * Updates the component when there are changes in the state.
64
+ */
63
65
  updateSelf(): void {
64
66
  this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as GroupProps;
65
67
  this.arChildren$ = ReferenceComponent.normalizePConnArray(this.pConn$.getChildren());
@@ -73,12 +75,12 @@ export class GroupComponent implements OnInit {
73
75
  this.visibility$ = this.pConn$.getComputedVisibility();
74
76
  }
75
77
 
76
- if (this.configProps$.displayMode === 'LABELS_LEFT') {
78
+ if (this.configProps$.displayMode === 'DISPLAY_ONLY') {
77
79
  if (this.configProps$.visibility === undefined) this.visibility$ = true;
78
80
 
79
81
  this.arChildren$.forEach(child => {
80
82
  const pConn = child.getPConnect();
81
- pConn.setInheritedProp('displayMode', 'LABELS_LEFT');
83
+ pConn.setInheritedProp('displayMode', 'DISPLAY_ONLY');
82
84
  pConn.setInheritedProp('readOnly', true);
83
85
 
84
86
  return child;
@@ -1,12 +1,12 @@
1
- import { Component, OnInit, Input, ChangeDetectorRef, forwardRef, OnDestroy } from '@angular/core';
1
+ import { Component, forwardRef } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
- import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
3
+ import { FormControl, ReactiveFormsModule } from '@angular/forms';
4
4
  import { MatInputModule } from '@angular/material/input';
5
5
  import { MatFormFieldModule } from '@angular/material/form-field';
6
- import { interval } from 'rxjs';
7
- import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
8
- import { Utils } from '@pega/angular-sdk-components';
6
+
7
+ import { FieldBase } from '@pega/angular-sdk-components';
9
8
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
9
+ import { handleEvent } from '@pega/angular-sdk-components';
10
10
  import { PConnFieldProps } from '@pega/angular-sdk-components';
11
11
 
12
12
  interface IntegerProps extends PConnFieldProps {
@@ -17,169 +17,47 @@ interface IntegerProps extends PConnFieldProps {
17
17
  selector: 'app-integer',
18
18
  templateUrl: './integer.component.html',
19
19
  styleUrls: ['./integer.component.scss'],
20
- standalone: true,
21
20
  imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, forwardRef(() => ComponentMapperComponent)]
22
21
  })
23
- export class IntegerComponent implements OnInit, OnDestroy {
24
- @Input() pConn$: typeof PConnect;
25
- @Input() formGroup$: FormGroup;
26
-
27
- // Used with AngularPConnect
28
- angularPConnectData: AngularPConnectData = {};
22
+ export class IntegerComponent extends FieldBase {
29
23
  configProps$: IntegerProps;
24
+ override fieldControl = new FormControl<number | null>(null, null);
30
25
 
31
- label$ = '';
32
- value$: number;
33
- bRequired$ = false;
34
- bReadonly$ = false;
35
- bDisabled$ = false;
36
- bVisible$ = true;
37
- displayMode$?: string = '';
38
- controlName$: string;
39
- bHasForm$ = true;
40
- componentReference = '';
41
- testId: string;
42
- helperText: string;
43
- placeholder: string;
44
-
45
- fieldControl = new FormControl<number | null>(null, null);
46
-
47
- constructor(
48
- private angularPConnect: AngularPConnectService,
49
- private cdRef: ChangeDetectorRef,
50
- private utils: Utils
51
- ) {}
52
-
53
- ngOnInit(): void {
54
- // First thing in initialization is registering and subscribing to the AngularPConnect service
55
- this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
56
- this.controlName$ = this.angularPConnect.getComponentID(this);
57
-
58
- // Then, continue on with other initialization
59
-
60
- // call updateSelf when initializing
61
- // this.updateSelf();
62
- this.checkAndUpdate();
63
-
64
- if (this.formGroup$) {
65
- // add control to formGroup
66
- this.formGroup$.addControl(this.controlName$, this.fieldControl);
67
- this.fieldControl.setValue(this.value$);
68
- this.bHasForm$ = true;
69
- } else {
70
- this.bReadonly$ = true;
71
- this.bHasForm$ = false;
72
- }
73
- }
74
-
75
- ngOnDestroy(): void {
76
- if (this.formGroup$) {
77
- this.formGroup$.removeControl(this.controlName$);
78
- }
79
-
80
- if (this.angularPConnectData.unsubscribeFn) {
81
- this.angularPConnectData.unsubscribeFn();
82
- }
83
- }
84
-
85
- // Callback passed when subscribing to store change
86
- onStateChange() {
87
- this.checkAndUpdate();
88
- }
89
-
90
- checkAndUpdate() {
91
- // Should always check the bridge to see if the component should
92
- // update itself (re-render)
93
- const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
94
-
95
- // ONLY call updateSelf when the component should update
96
- if (bUpdateSelf) {
97
- this.updateSelf();
98
- }
99
- }
100
-
101
- // updateSelf
102
- updateSelf(): void {
103
- // moved this from ngOnInit() and call this from there instead...
26
+ /**
27
+ * Updates the component when there are changes in the state.
28
+ */
29
+ override updateSelf(): void {
30
+ // Resolve configuration properties
104
31
  this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as IntegerProps;
105
- this.testId = this.configProps$.testId;
106
- this.label$ = this.configProps$.label;
107
- this.displayMode$ = this.configProps$.displayMode;
108
- let nValue: any = this.configProps$.value;
109
- if (nValue) {
110
- if (typeof nValue === 'string') {
111
- nValue = parseInt(nValue, 10);
112
- }
113
- this.value$ = nValue;
114
- }
115
- this.helperText = this.configProps$.helperText;
116
- this.placeholder = this.configProps$.placeholder || '';
117
-
118
- // timeout and detectChanges to avoid ExpressionChangedAfterItHasBeenCheckedError
119
- setTimeout(() => {
120
- if (this.configProps$.required != null) {
121
- this.bRequired$ = this.utils.getBooleanValue(this.configProps$.required);
122
- }
123
- this.cdRef.detectChanges();
124
- });
125
-
126
- if (this.configProps$.visibility != null) {
127
- this.bVisible$ = this.utils.getBooleanValue(this.configProps$.visibility);
128
- }
129
32
 
130
- // disabled
131
- if (this.configProps$.disabled != undefined) {
132
- this.bDisabled$ = this.utils.getBooleanValue(this.configProps$.disabled);
133
- }
33
+ // Update component common properties
34
+ this.updateComponentCommonProperties(this.configProps$);
134
35
 
135
- if (this.bDisabled$) {
136
- this.fieldControl.disable();
137
- } else {
138
- this.fieldControl.enable();
36
+ // Extract and normalize the value property
37
+ const { value } = this.configProps$;
38
+ if (value) {
39
+ this.value$ = typeof value === 'string' ? parseInt(value, 10) : value;
139
40
  }
41
+ }
140
42
 
141
- if (this.configProps$.readOnly != null) {
142
- this.bReadonly$ = this.utils.getBooleanValue(this.configProps$.readOnly);
143
- }
144
-
145
- this.componentReference = (this.pConn$.getStateProps() as any).value;
146
-
147
- // trigger display of error message with field control
148
- if (this.angularPConnectData.validateMessage != null && this.angularPConnectData.validateMessage != '') {
149
- const timer = interval(100).subscribe(() => {
150
- this.fieldControl.setErrors({ message: true });
151
- this.fieldControl.markAsTouched();
43
+ fieldOnChange(event: any) {
44
+ const oldVal = this.value$ ?? '';
45
+ const isValueChanged = event.target.value.toString() !== oldVal.toString();
152
46
 
153
- timer.unsubscribe();
47
+ if (isValueChanged) {
48
+ this.pConn$.clearErrorMessages({
49
+ property: this.propName
154
50
  });
155
51
  }
156
52
  }
157
53
 
158
- fieldOnChange(event: any) {
159
- this.angularPConnectData.actions?.onChange(this, event);
160
- }
161
-
162
54
  fieldOnBlur(event: any) {
163
- // PConnect wants to use eventHandler for onBlur
164
- this.angularPConnectData.actions?.onBlur(this, event);
165
- }
166
-
167
- getErrorMessage() {
168
- // field control gets error message from here
169
-
170
- let errMessage = '';
55
+ const oldVal = this.value$ ?? '';
56
+ const isValueChanged = event.target.value.toString() !== oldVal.toString();
171
57
 
172
- // look for validation messages for json, pre-defined or just an error pushed from workitem (400)
173
- if (this.fieldControl.hasError('message')) {
174
- errMessage = this.angularPConnectData.validateMessage ?? '';
175
- return errMessage;
58
+ if (isValueChanged) {
59
+ const value = event?.target?.value;
60
+ handleEvent(this.actionsApi, 'changeNblur', this.propName, value);
176
61
  }
177
- if (this.fieldControl.hasError('required')) {
178
- errMessage = 'You must enter a value';
179
- } else if (this.fieldControl.errors) {
180
- errMessage = this.fieldControl.errors.toString();
181
- }
182
-
183
- return errMessage;
184
62
  }
185
63
  }
@@ -1,4 +1,4 @@
1
- <mat-grid-list cols="2" rowHeight="6.25rem">
1
+ <mat-grid-list cols="2" rowHeight="4.25rem">
2
2
  <mat-grid-tile>
3
3
  <button mat-raised-button variant="contained" color="secondary" (click)="onCancel()">
4
4
  {{ localizedVal('Cancel', localeCategory) }}
@@ -7,7 +7,6 @@ import { MatGridListModule } from '@angular/material/grid-list';
7
7
  selector: 'app-list-view-action-buttons',
8
8
  templateUrl: './list-view-action-buttons.component.html',
9
9
  styleUrls: ['./list-view-action-buttons.component.scss'],
10
- standalone: true,
11
10
  imports: [CommonModule, MatGridListModule, MatButtonModule]
12
11
  })
13
12
  export class ListViewActionButtonsComponent {
@@ -31,10 +30,11 @@ export class ListViewActionButtonsComponent {
31
30
  this.pConn$
32
31
  .getActionsApi()
33
32
  .submitEmbeddedDataModal(this.context$)
34
- .then(() => {})
33
+ .then(() => {
34
+ this.closeActionsDialog.emit();
35
+ })
35
36
  .finally(() => {
36
37
  this.isDisabled = false;
37
38
  });
38
- this.closeActionsDialog.emit();
39
39
  }
40
40
  }
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "Location",
3
+ "label": "Location",
4
+ "description": "Location",
5
+ "type": "Field",
6
+ "subtype": "Location",
7
+ "properties": []
8
+ }
@@ -0,0 +1,45 @@
1
+ <div *ngIf="mapReady && bVisible$">
2
+ <!-- Google suggestions -->
3
+ <mat-form-field class="psdk-full-width" [hintLabel]="helperText">
4
+ <mat-label>{{ label$ }}</mat-label>
5
+ <input
6
+ matInput
7
+ type="text"
8
+ [placeholder]="placeholder"
9
+ [formControl]="searchControl"
10
+ [required]="bRequired$"
11
+ [matAutocomplete]="auto"
12
+ [attr.data-test-id]="testId"
13
+ (blur)="fieldOnBlur()"
14
+ />
15
+ <mat-error *ngIf="searchControl.invalid">{{ getErrorMessage() }}</mat-error>
16
+ <button
17
+ mat-icon-button
18
+ matSuffix
19
+ type="button"
20
+ (click)="locateMe()"
21
+ [disabled]="isLocating || bDisabled$ || bReadonly$"
22
+ aria-label="Use my location"
23
+ >
24
+ <ng-container *ngIf="!isLocating; else loadingSpinner">
25
+ <mat-icon>location_on</mat-icon>
26
+ </ng-container>
27
+ <ng-template #loadingSpinner>
28
+ <mat-progress-spinner diameter="24" mode="indeterminate" strokeWidth="3"></mat-progress-spinner>
29
+ </ng-template>
30
+ </button>
31
+
32
+ <mat-autocomplete #auto="matAutocomplete" (optionSelected)="onOptionSelected($event)">
33
+ <mat-option *ngFor="let option of filteredOptions" [value]="option">
34
+ {{ option }}
35
+ </mat-option>
36
+ </mat-autocomplete>
37
+ </mat-form-field>
38
+ <!-- Google map -->
39
+ <div *ngIf="showMap" class="map-wrapper">
40
+ <google-map height="400px" width="100%" [center]="center" [zoom]="13" (mapClick)="onMapClick($event)">
41
+ <map-marker *ngIf="markerPosition" [position]="markerPosition" [title]="'Selected Location'"></map-marker>
42
+ </google-map>
43
+ <div class="map-blocker" *ngIf="bDisabled$ || bReadonly$"></div>
44
+ </div>
45
+ </div>
@@ -0,0 +1,18 @@
1
+ .psdk-full-width {
2
+ width: 100%;
3
+ }
4
+
5
+ .map-wrapper {
6
+ position: relative;
7
+ }
8
+
9
+ .map-blocker {
10
+ position: absolute;
11
+ top: 0;
12
+ left: 0;
13
+ width: 100%;
14
+ height: 100%;
15
+ background: transparent;
16
+ z-index: 10;
17
+ cursor: not-allowed;
18
+ }
@@ -0,0 +1,22 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { LocationComponent } from './location.component';
4
+
5
+ describe('LocationComponent', () => {
6
+ let component: LocationComponent;
7
+ let fixture: ComponentFixture<LocationComponent>;
8
+
9
+ beforeEach(async () => {
10
+ await TestBed.configureTestingModule({
11
+ imports: [LocationComponent]
12
+ }).compileComponents();
13
+
14
+ fixture = TestBed.createComponent(LocationComponent);
15
+ component = fixture.componentInstance;
16
+ fixture.detectChanges();
17
+ });
18
+
19
+ it('should create', () => {
20
+ expect(component).toBeTruthy();
21
+ });
22
+ });