@pega/angular-sdk-overrides 24.2.10 → 25.1.10

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 (257) 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 +0 -1
  4. package/lib/designSystemExtension/banner/banner.component.html +1 -1
  5. package/lib/designSystemExtension/banner/banner.component.scss +17 -3
  6. package/lib/designSystemExtension/banner/banner.component.ts +0 -1
  7. package/lib/designSystemExtension/case-create-stage/case-create-stage.component.ts +0 -1
  8. package/lib/designSystemExtension/field-group/field-group.component.ts +0 -1
  9. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.html +6 -3
  10. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.scss +5 -34
  11. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.ts +0 -2
  12. package/lib/designSystemExtension/material-details/material-details.component.scss +0 -5
  13. package/lib/designSystemExtension/material-details/material-details.component.ts +0 -1
  14. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.html +3 -3
  15. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.scss +4 -3
  16. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.ts +6 -1
  17. package/lib/designSystemExtension/material-summary-item/material-summary-item.component.scss +4 -17
  18. package/lib/designSystemExtension/material-summary-item/material-summary-item.component.ts +0 -1
  19. package/lib/designSystemExtension/material-summary-list/material-summary-list.component.ts +0 -1
  20. package/lib/designSystemExtension/material-utility/material-utility.component.scss +1 -2
  21. package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.scss +1 -1
  22. package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.ts +0 -1
  23. package/lib/designSystemExtension/operator/operator.component.html +2 -2
  24. package/lib/designSystemExtension/operator/operator.component.scss +13 -12
  25. package/lib/designSystemExtension/operator/operator.component.ts +4 -5
  26. package/lib/designSystemExtension/pulse/pulse.component.scss +2 -2
  27. package/lib/designSystemExtension/pulse/pulse.component.ts +0 -1
  28. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.html +4 -17
  29. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.scss +0 -1
  30. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.ts +30 -1
  31. package/lib/designSystemExtension/wss-quick-create/wss-quick-create.component.scss +16 -9
  32. package/lib/designSystemExtension/wss-quick-create/wss-quick-create.component.ts +0 -1
  33. package/lib/field/auto-complete/auto-complete.component.html +0 -2
  34. package/lib/field/auto-complete/auto-complete.component.ts +48 -173
  35. package/lib/field/cancel-alert/cancel-alert.component.html +8 -12
  36. package/lib/field/cancel-alert/cancel-alert.component.scss +2 -3
  37. package/lib/field/cancel-alert/cancel-alert.component.ts +24 -37
  38. package/lib/field/check-box/check-box.component.html +17 -6
  39. package/lib/field/check-box/check-box.component.scss +0 -1
  40. package/lib/field/check-box/check-box.component.ts +25 -151
  41. package/lib/field/currency/currency.component.ts +54 -181
  42. package/lib/field/date/date.component.html +4 -3
  43. package/lib/field/date/date.component.ts +30 -151
  44. package/lib/field/date-time/date-time.component.html +2 -2
  45. package/lib/field/date-time/date-time.component.ts +47 -148
  46. package/lib/field/decimal/decimal.component.html +1 -0
  47. package/lib/field/decimal/decimal.component.ts +61 -164
  48. package/lib/field/dropdown/dropdown.component.html +1 -0
  49. package/lib/field/dropdown/dropdown.component.ts +43 -152
  50. package/lib/field/email/email.component.ts +28 -158
  51. package/lib/field/field.base.ts +149 -0
  52. package/lib/field/group/group.component.ts +7 -5
  53. package/lib/field/integer/integer.component.html +1 -1
  54. package/lib/field/integer/integer.component.ts +30 -160
  55. package/lib/field/list-view-action-buttons/list-view-action-buttons.component.html +1 -1
  56. package/lib/field/list-view-action-buttons/list-view-action-buttons.component.ts +3 -3
  57. package/lib/field/location/config-ext.json +8 -0
  58. package/lib/field/location/location.component.html +45 -0
  59. package/lib/field/location/location.component.scss +18 -0
  60. package/lib/field/location/location.component.spec.ts +22 -0
  61. package/lib/field/location/location.component.ts +280 -0
  62. package/lib/field/multiselect/multiselect.component.ts +47 -152
  63. package/lib/field/multiselect/utils.ts +55 -47
  64. package/lib/field/object-reference/object-reference.component.html +17 -0
  65. package/lib/field/object-reference/object-reference.component.scss +0 -0
  66. package/lib/field/object-reference/object-reference.component.spec.ts +22 -0
  67. package/lib/field/object-reference/object-reference.component.ts +237 -0
  68. package/lib/field/percentage/percentage.component.html +1 -1
  69. package/lib/field/percentage/percentage.component.ts +62 -170
  70. package/lib/field/phone/config-ext.json +1 -1
  71. package/lib/field/phone/phone.component.html +18 -17
  72. package/lib/field/phone/phone.component.scss +4 -0
  73. package/lib/field/phone/phone.component.ts +47 -156
  74. package/lib/field/radio-buttons/radio-buttons.component.html +17 -12
  75. package/lib/field/radio-buttons/radio-buttons.component.scss +4 -2
  76. package/lib/field/radio-buttons/radio-buttons.component.ts +37 -160
  77. package/lib/field/rich-text/rich-text.component.html +2 -0
  78. package/lib/field/rich-text/rich-text.component.scss +172 -0
  79. package/lib/field/rich-text/rich-text.component.ts +32 -93
  80. package/lib/field/scalar-list/scalar-list.component.ts +17 -73
  81. package/lib/field/selectable-card/selectable-card.component.html +70 -0
  82. package/lib/field/selectable-card/selectable-card.component.scss +11 -0
  83. package/lib/field/selectable-card/selectable-card.component.spec.ts +22 -0
  84. package/lib/field/selectable-card/selectable-card.component.ts +219 -0
  85. package/lib/field/semantic-link/semantic-link.component.html +4 -8
  86. package/lib/field/semantic-link/semantic-link.component.scss +0 -13
  87. package/lib/field/semantic-link/semantic-link.component.ts +165 -6
  88. package/lib/field/text/text.component.scss +0 -1
  89. package/lib/field/text/text.component.ts +6 -5
  90. package/lib/field/text-area/text-area.component.html +4 -2
  91. package/lib/field/text-area/text-area.component.ts +30 -155
  92. package/lib/field/text-content/text-content.component.ts +0 -1
  93. package/lib/field/text-input/text-input.component.html +1 -1
  94. package/lib/field/text-input/text-input.component.ts +28 -158
  95. package/lib/field/time/time.component.html +2 -2
  96. package/lib/field/time/time.component.ts +34 -154
  97. package/lib/field/url/url.component.html +1 -1
  98. package/lib/field/url/url.component.ts +28 -157
  99. package/lib/field/user-reference/user-reference.component.html +40 -38
  100. package/lib/field/user-reference/user-reference.component.scss +0 -1
  101. package/lib/field/user-reference/user-reference.component.ts +70 -9
  102. package/lib/infra/Containers/flow-container/flow-container.component.html +2 -2
  103. package/lib/infra/Containers/flow-container/flow-container.component.ts +24 -51
  104. package/lib/infra/Containers/flow-container/helpers.ts +2 -2
  105. package/lib/infra/Containers/hybrid-view-container/hybrid-view-container.component.ts +0 -1
  106. package/lib/infra/Containers/modal-view-container/modal-view-container.component.html +1 -11
  107. package/lib/infra/Containers/modal-view-container/modal-view-container.component.ts +5 -18
  108. package/lib/infra/Containers/view-container/helper.ts +35 -2
  109. package/lib/infra/Containers/view-container/view-container.component.ts +1 -2
  110. package/lib/infra/action-buttons/action-buttons.component.html +13 -8
  111. package/lib/infra/action-buttons/action-buttons.component.scss +23 -0
  112. package/lib/infra/action-buttons/action-buttons.component.ts +1 -3
  113. package/lib/infra/assignment/assignment.component.html +1 -1
  114. package/lib/infra/assignment/assignment.component.ts +100 -46
  115. package/lib/infra/assignment-card/assignment-card.component.html +2 -2
  116. package/lib/infra/assignment-card/assignment-card.component.scss +0 -4
  117. package/lib/infra/assignment-card/assignment-card.component.ts +21 -5
  118. package/lib/infra/dashboard-filter/dashboard-filter.component.ts +0 -1
  119. package/lib/infra/defer-load/defer-load.component.html +6 -2
  120. package/lib/infra/defer-load/defer-load.component.ts +25 -12
  121. package/lib/infra/error-boundary/error-boundary.component.ts +0 -1
  122. package/lib/infra/multi-step/multi-step.component.html +22 -38
  123. package/lib/infra/multi-step/multi-step.component.scss +14 -27
  124. package/lib/infra/multi-step/multi-step.component.ts +0 -1
  125. package/lib/infra/navbar/navbar.component.html +36 -41
  126. package/lib/infra/navbar/navbar.component.scss +22 -4
  127. package/lib/infra/navbar/navbar.component.ts +8 -6
  128. package/lib/infra/reference/reference.component.ts +82 -90
  129. package/lib/infra/region/region.component.ts +0 -1
  130. package/lib/infra/root-container/root-container.component.html +2 -15
  131. package/lib/infra/root-container/root-container.component.scss +0 -1
  132. package/lib/infra/root-container/root-container.component.ts +25 -32
  133. package/lib/infra/stages/stages.component.html +4 -3
  134. package/lib/infra/stages/stages.component.scss +12 -36
  135. package/lib/infra/stages/stages.component.ts +4 -3
  136. package/lib/infra/view/view.component.html +1 -1
  137. package/lib/infra/view/view.component.ts +3 -7
  138. package/lib/template/advanced-search/advanced-search.component.html +12 -0
  139. package/lib/template/advanced-search/advanced-search.component.scss +0 -0
  140. package/lib/template/advanced-search/advanced-search.component.spec.ts +0 -0
  141. package/lib/template/advanced-search/advanced-search.component.ts +112 -0
  142. package/lib/template/advanced-search/advanced-search.service.ts +27 -0
  143. package/lib/template/advanced-search/search-group/persist-utils.ts +56 -0
  144. package/lib/template/advanced-search/search-groups/search-groups.component.html +32 -0
  145. package/lib/template/advanced-search/search-groups/search-groups.component.scss +0 -0
  146. package/lib/template/advanced-search/search-groups/search-groups.component.spec.ts +0 -0
  147. package/lib/template/advanced-search/search-groups/search-groups.component.ts +294 -0
  148. package/lib/template/advanced-search/search-groups/utils.ts +29 -0
  149. package/lib/template/app-shell/app-shell.component.html +4 -1
  150. package/lib/template/app-shell/app-shell.component.scss +0 -3
  151. package/lib/template/app-shell/app-shell.component.ts +46 -8
  152. package/lib/template/banner-page/banner-page.component.ts +0 -1
  153. package/lib/template/base/form-template-base.ts +6 -0
  154. package/lib/template/case-summary/case-summary.component.scss +0 -2
  155. package/lib/template/case-summary/case-summary.component.ts +6 -22
  156. package/lib/template/case-view/case-view.component.html +4 -4
  157. package/lib/template/case-view/case-view.component.scss +18 -10
  158. package/lib/template/case-view/case-view.component.ts +1 -11
  159. package/lib/template/confirmation/confirmation.component.html +2 -2
  160. package/lib/template/confirmation/confirmation.component.ts +0 -1
  161. package/lib/template/data-reference/data-reference.component.html +11 -8
  162. package/lib/template/data-reference/data-reference.component.ts +346 -113
  163. package/lib/template/data-reference/search-form/search-form.component.html +39 -0
  164. package/lib/template/data-reference/search-form/search-form.component.scss +11 -0
  165. package/lib/template/data-reference/search-form/search-form.component.spec.ts +0 -0
  166. package/lib/template/data-reference/search-form/search-form.component.ts +167 -0
  167. package/lib/template/data-reference/search-form/tabsData.ts +160 -0
  168. package/lib/template/data-reference/utils.ts +92 -0
  169. package/lib/template/default-form/default-form.component.ts +45 -5
  170. package/lib/template/default-page/default-page.component.html +34 -0
  171. package/lib/template/default-page/default-page.component.scss +31 -0
  172. package/lib/template/default-page/default-page.component.spec.ts +24 -0
  173. package/lib/template/default-page/default-page.component.ts +64 -0
  174. package/lib/template/details/details.component.ts +0 -1
  175. package/lib/template/details-narrow-wide/details-narrow-wide.component.ts +0 -1
  176. package/lib/template/details-one-column/details-one-column.component.ts +0 -1
  177. package/lib/template/details-sub-tabs/details-sub-tabs.component.ts +0 -1
  178. package/lib/template/details-three-column/details-three-column.component.ts +0 -1
  179. package/lib/template/details-two-column/details-two-column.component.ts +0 -1
  180. package/lib/template/details-wide-narrow/details-wide-narrow.component.ts +0 -1
  181. package/lib/template/dynamic-tabs/dynamic-tabs.component.ts +0 -1
  182. package/lib/template/field-group-list/field-group-list.component.scss +0 -1
  183. package/lib/template/field-group-list/field-group-list.component.ts +0 -1
  184. package/lib/template/field-group-template/field-group-template.component.html +7 -7
  185. package/lib/template/field-group-template/field-group-template.component.scss +8 -0
  186. package/lib/template/field-group-template/field-group-template.component.ts +64 -55
  187. package/lib/template/field-value-list/field-value-list.component.html +2 -2
  188. package/lib/template/field-value-list/field-value-list.component.scss +4 -0
  189. package/lib/template/field-value-list/field-value-list.component.ts +0 -1
  190. package/lib/template/inline-dashboard/inline-dashboard.component.ts +0 -1
  191. package/lib/template/inline-dashboard-page/inline-dashboard-page.component.ts +1 -2
  192. package/lib/template/list-page/list-page.component.ts +0 -1
  193. package/lib/template/list-view/list-view.component.html +170 -160
  194. package/lib/template/list-view/list-view.component.scss +25 -21
  195. package/lib/template/list-view/list-view.component.ts +208 -122
  196. package/lib/template/list-view/listViewHelpers.ts +3 -9
  197. package/lib/template/list-view/utils.ts +27 -7
  198. package/lib/template/multi-reference-readonly/multi-reference-readonly.component.ts +0 -1
  199. package/lib/template/narrow-wide-form/narrow-wide-form.component.ts +0 -1
  200. package/lib/template/object-page/object-page.component.html +1 -0
  201. package/lib/template/object-page/object-page.component.scss +0 -0
  202. package/lib/template/object-page/object-page.component.spec.ts +22 -0
  203. package/lib/template/object-page/object-page.component.ts +14 -0
  204. package/lib/template/one-column/one-column.component.ts +0 -1
  205. package/lib/template/one-column-page/one-column-page.component.ts +0 -1
  206. package/lib/template/one-column-tab/one-column-tab.component.scss +1 -1
  207. package/lib/template/one-column-tab/one-column-tab.component.ts +0 -1
  208. package/lib/template/page/page.component.ts +0 -1
  209. package/lib/template/promoted-filters/promoted-filters.component.ts +0 -1
  210. package/lib/template/repeating-structures/repeating-structures.component.ts +0 -2
  211. package/lib/template/self-service-case-view/self-service-case-view.component.html +78 -0
  212. package/lib/template/self-service-case-view/self-service-case-view.component.scss +132 -0
  213. package/lib/template/self-service-case-view/self-service-case-view.component.spec.ts +24 -0
  214. package/lib/template/self-service-case-view/self-service-case-view.component.ts +207 -0
  215. package/lib/template/simple-table/simple-table.component.ts +0 -2
  216. package/lib/template/simple-table-manual/helpers.ts +126 -10
  217. package/lib/template/simple-table-manual/simple-table-manual.component.html +27 -8
  218. package/lib/template/simple-table-manual/simple-table-manual.component.scss +15 -17
  219. package/lib/template/simple-table-manual/simple-table-manual.component.ts +103 -45
  220. package/lib/template/simple-table-select/simple-table-select.component.ts +0 -1
  221. package/lib/template/single-reference-readonly/single-reference-readonly.component.html +4 -1
  222. package/lib/template/single-reference-readonly/single-reference-readonly.component.scss +21 -0
  223. package/lib/template/single-reference-readonly/single-reference-readonly.component.ts +104 -4
  224. package/lib/template/sub-tabs/sub-tabs.component.ts +0 -1
  225. package/lib/template/three-column/three-column.component.ts +0 -1
  226. package/lib/template/three-column-page/three-column-page.component.ts +0 -1
  227. package/lib/template/two-column/two-column.component.ts +0 -1
  228. package/lib/template/two-column-page/two-column-page.component.ts +0 -1
  229. package/lib/template/two-column-tab/two-column-tab.component.ts +0 -1
  230. package/lib/template/utils.ts +58 -0
  231. package/lib/template/wide-narrow-form/wide-narrow-form.component.ts +0 -1
  232. package/lib/template/wide-narrow-page/wide-narrow-page.component.ts +0 -1
  233. package/lib/template/wss-nav-bar/wss-nav-bar.component.html +6 -5
  234. package/lib/template/wss-nav-bar/wss-nav-bar.component.scss +8 -17
  235. package/lib/template/wss-nav-bar/wss-nav-bar.component.ts +1 -9
  236. package/lib/widget/app-announcement/app-announcement.component.html +1 -2
  237. package/lib/widget/app-announcement/app-announcement.component.scss +2 -2
  238. package/lib/widget/app-announcement/app-announcement.component.ts +0 -1
  239. package/lib/widget/attachment/Attachment.types.ts +92 -0
  240. package/lib/widget/attachment/AttachmentUtils.ts +287 -0
  241. package/lib/widget/attachment/attachment.component.html +3 -3
  242. package/lib/widget/attachment/attachment.component.scss +9 -12
  243. package/lib/widget/attachment/attachment.component.ts +267 -254
  244. package/lib/widget/case-history/case-history.component.ts +0 -1
  245. package/lib/widget/feed-container/feed-container.component.scss +3 -9
  246. package/lib/widget/feed-container/feed-container.component.ts +2 -5
  247. package/lib/widget/file-utility/file-utility.component.html +3 -3
  248. package/lib/widget/file-utility/file-utility.component.scss +6 -17
  249. package/lib/widget/file-utility/file-utility.component.ts +24 -9
  250. package/lib/widget/list-utility/list-utility.component.scss +4 -5
  251. package/lib/widget/list-utility/list-utility.component.ts +0 -1
  252. package/lib/widget/quick-create/quick-create.component.ts +41 -23
  253. package/lib/widget/todo/todo.component.html +12 -10
  254. package/lib/widget/todo/todo.component.scss +20 -10
  255. package/lib/widget/todo/todo.component.ts +11 -7
  256. package/lib/widget/utility/utility.component.ts +0 -1
  257. package/package.json +1 -1
@@ -1,14 +1,13 @@
1
- import { Component, OnInit, Input, ChangeDetectorRef, forwardRef, OnDestroy } from '@angular/core';
1
+ import { Component, OnInit, forwardRef, OnDestroy } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
- import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
3
+ import { 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';
10
- import { PConnFieldProps } from '@pega/angular-sdk-components';
11
9
  import { handleEvent } from '@pega/angular-sdk-components';
10
+ import { PConnFieldProps } from '@pega/angular-sdk-components';
12
11
 
13
12
  interface EmailProps extends PConnFieldProps {
14
13
  // If any, enter additional props that only exist on Email here
@@ -18,173 +17,44 @@ interface EmailProps extends PConnFieldProps {
18
17
  selector: 'app-email',
19
18
  templateUrl: './email.component.html',
20
19
  styleUrls: ['./email.component.scss'],
21
- standalone: true,
22
20
  imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, forwardRef(() => ComponentMapperComponent)]
23
21
  })
24
- export class EmailComponent implements OnInit, OnDestroy {
25
- @Input() pConn$: typeof PConnect;
26
- @Input() formGroup$: FormGroup;
27
-
28
- // Used with AngularPConnect
29
- angularPConnectData: AngularPConnectData = {};
22
+ export class EmailComponent extends FieldBase implements OnInit, OnDestroy {
30
23
  configProps$: EmailProps;
31
24
 
32
- label$ = '';
33
- value$: string;
34
- bRequired$ = false;
35
- bReadonly$ = false;
36
- bDisabled$ = false;
37
- bVisible$ = true;
38
- displayMode$?: string = '';
39
- controlName$: string;
40
- bHasForm$ = true;
41
- componentReference = '';
42
- testId: string;
43
- helperText: string;
44
- placeholder: string;
45
-
46
- fieldControl = new FormControl('', null);
47
- actionsApi: Object;
48
- propName: string;
49
-
50
- constructor(
51
- private angularPConnect: AngularPConnectService,
52
- private cdRef: ChangeDetectorRef,
53
- private utils: Utils
54
- ) {}
55
-
56
- ngOnInit(): void {
57
- // First thing in initialization is registering and subscribing to the AngularPConnect service
58
- this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
59
- this.controlName$ = this.angularPConnect.getComponentID(this);
60
-
61
- // Then, continue on with other initialization
62
-
63
- // call updateSelf when initializing
64
- // this.updateSelf();
65
- this.checkAndUpdate();
66
-
67
- if (this.formGroup$) {
68
- // add control to formGroup
69
- this.formGroup$.addControl(this.controlName$, this.fieldControl);
70
- this.fieldControl.setValue(this.value$);
71
- this.bHasForm$ = true;
72
- } else {
73
- this.bReadonly$ = true;
74
- this.bHasForm$ = false;
75
- }
76
- }
77
-
78
- ngOnDestroy(): void {
79
- if (this.formGroup$) {
80
- this.formGroup$.removeControl(this.controlName$);
81
- }
82
-
83
- if (this.angularPConnectData.unsubscribeFn) {
84
- this.angularPConnectData.unsubscribeFn();
85
- }
86
- }
87
-
88
- // Callback passed when subscribing to store change
89
- onStateChange() {
90
- this.checkAndUpdate();
91
- }
92
-
93
- checkAndUpdate() {
94
- // Should always check the bridge to see if the component should
95
- // update itself (re-render)
96
- const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
97
-
98
- // ONLY call updateSelf when the component should update
99
- if (bUpdateSelf) {
100
- this.updateSelf();
101
- }
102
- }
103
-
104
- // updateSelf
105
- updateSelf(): void {
106
- // moved this from ngOnInit() and call this from there instead...
25
+ /**
26
+ * Updates the component when there are changes in the state.
27
+ */
28
+ override updateSelf(): void {
29
+ // Resolve configuration properties
107
30
  this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as EmailProps;
108
- this.testId = this.configProps$.testId;
109
- this.label$ = this.configProps$.label;
110
- this.displayMode$ = this.configProps$.displayMode;
111
-
112
- if (this.configProps$.value != undefined) {
113
- this.value$ = this.configProps$.value;
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
-
130
- // disabled
131
- if (this.configProps$.disabled != undefined) {
132
- this.bDisabled$ = this.utils.getBooleanValue(this.configProps$.disabled);
133
- }
134
-
135
- if (this.bDisabled$) {
136
- this.fieldControl.disable();
137
- } else {
138
- this.fieldControl.enable();
139
- }
140
31
 
141
- if (this.configProps$.readOnly != null) {
142
- this.bReadonly$ = this.utils.getBooleanValue(this.configProps$.readOnly);
143
- }
144
-
145
- this.actionsApi = this.pConn$.getActionsApi();
146
- this.propName = this.pConn$.getStateProps().value;
32
+ // Update component common properties
33
+ this.updateComponentCommonProperties(this.configProps$);
147
34
 
148
- this.componentReference = this.pConn$.getStateProps().value;
35
+ // Set component specific properties
36
+ const { value } = this.configProps$;
37
+ this.value$ = value;
38
+ }
149
39
 
150
- // trigger display of error message with field control
151
- if (this.angularPConnectData.validateMessage != null && this.angularPConnectData.validateMessage != '') {
152
- const timer = interval(100).subscribe(() => {
153
- this.fieldControl.setErrors({ message: true });
154
- this.fieldControl.markAsTouched();
40
+ fieldOnChange(event: any) {
41
+ const oldVal = this.value$ ?? '';
42
+ const isValueChanged = event.target.value.toString() !== oldVal.toString();
155
43
 
156
- timer.unsubscribe();
44
+ if (isValueChanged) {
45
+ this.pConn$.clearErrorMessages({
46
+ property: this.propName
157
47
  });
158
48
  }
159
49
  }
160
50
 
161
- fieldOnChange(event: any) {
162
- const value = event?.target?.value;
163
- handleEvent(this.actionsApi, 'changeNblur', this.propName, value);
164
- this.pConn$.clearErrorMessages({
165
- property: this.propName
166
- });
167
- }
168
-
169
51
  fieldOnBlur(event: any) {
170
- const value = event?.target?.value;
171
- handleEvent(this.actionsApi, 'changeNblur', this.propName, value);
172
- }
173
-
174
- getErrorMessage() {
175
- let errMessage = '';
52
+ const oldVal = this.value$ ?? '';
53
+ const isValueChanged = event.target.value.toString() !== oldVal.toString();
176
54
 
177
- // look for validation messages for json, pre-defined or just an error pushed from workitem (400)
178
- if (this.fieldControl.hasError('message')) {
179
- errMessage = this.angularPConnectData.validateMessage ?? '';
180
- return errMessage;
55
+ if (isValueChanged) {
56
+ const value = event?.target?.value;
57
+ handleEvent(this.actionsApi, 'changeNblur', this.propName, value);
181
58
  }
182
- if (this.fieldControl.hasError('required')) {
183
- errMessage = 'You must enter a value';
184
- } else if (this.fieldControl.errors) {
185
- errMessage = this.fieldControl.errors.toString();
186
- }
187
-
188
- return errMessage;
189
59
  }
190
60
  }
@@ -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());
@@ -15,7 +15,7 @@
15
15
  [required]="bRequired$"
16
16
  [formControl]="fieldControl"
17
17
  [attr.data-test-id]="testId"
18
- (change)="fieldOnChange()"
18
+ (change)="fieldOnChange($event)"
19
19
  (blur)="fieldOnBlur($event)"
20
20
  />
21
21
  <mat-error *ngIf="fieldControl.invalid">{{ getErrorMessage() }}</mat-error>
@@ -1,14 +1,13 @@
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';
10
- import { PConnFieldProps } from '@pega/angular-sdk-components';
11
9
  import { handleEvent } from '@pega/angular-sdk-components';
10
+ import { PConnFieldProps } from '@pega/angular-sdk-components';
12
11
 
13
12
  interface IntegerProps extends PConnFieldProps {
14
13
  // If any, enter additional props that only exist on Integer here
@@ -18,176 +17,47 @@ interface IntegerProps extends PConnFieldProps {
18
17
  selector: 'app-integer',
19
18
  templateUrl: './integer.component.html',
20
19
  styleUrls: ['./integer.component.scss'],
21
- standalone: true,
22
20
  imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, forwardRef(() => ComponentMapperComponent)]
23
21
  })
24
- export class IntegerComponent implements OnInit, OnDestroy {
25
- @Input() pConn$: typeof PConnect;
26
- @Input() formGroup$: FormGroup;
27
-
28
- // Used with AngularPConnect
29
- angularPConnectData: AngularPConnectData = {};
22
+ export class IntegerComponent extends FieldBase {
30
23
  configProps$: IntegerProps;
24
+ override fieldControl = new FormControl<number | null>(null, null);
31
25
 
32
- label$ = '';
33
- value$: number;
34
- bRequired$ = false;
35
- bReadonly$ = false;
36
- bDisabled$ = false;
37
- bVisible$ = true;
38
- displayMode$?: string = '';
39
- controlName$: string;
40
- bHasForm$ = true;
41
- componentReference = '';
42
- testId: string;
43
- helperText: string;
44
- placeholder: string;
45
-
46
- fieldControl = new FormControl<number | null>(null, null);
47
- actionsApi: Object;
48
- propName: string;
49
-
50
- constructor(
51
- private angularPConnect: AngularPConnectService,
52
- private cdRef: ChangeDetectorRef,
53
- private utils: Utils
54
- ) {}
55
-
56
- ngOnInit(): void {
57
- // First thing in initialization is registering and subscribing to the AngularPConnect service
58
- this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
59
- this.controlName$ = this.angularPConnect.getComponentID(this);
60
-
61
- // Then, continue on with other initialization
62
-
63
- // call updateSelf when initializing
64
- // this.updateSelf();
65
- this.checkAndUpdate();
66
-
67
- if (this.formGroup$) {
68
- // add control to formGroup
69
- this.formGroup$.addControl(this.controlName$, this.fieldControl);
70
- this.fieldControl.setValue(this.value$);
71
- this.bHasForm$ = true;
72
- } else {
73
- this.bReadonly$ = true;
74
- this.bHasForm$ = false;
75
- }
76
- }
77
-
78
- ngOnDestroy(): void {
79
- if (this.formGroup$) {
80
- this.formGroup$.removeControl(this.controlName$);
81
- }
82
-
83
- if (this.angularPConnectData.unsubscribeFn) {
84
- this.angularPConnectData.unsubscribeFn();
85
- }
86
- }
87
-
88
- // Callback passed when subscribing to store change
89
- onStateChange() {
90
- this.checkAndUpdate();
91
- }
92
-
93
- checkAndUpdate() {
94
- // Should always check the bridge to see if the component should
95
- // update itself (re-render)
96
- const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
97
-
98
- // ONLY call updateSelf when the component should update
99
- if (bUpdateSelf) {
100
- this.updateSelf();
101
- }
102
- }
103
-
104
- // updateSelf
105
- updateSelf(): void {
106
- // 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
107
31
  this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as IntegerProps;
108
- this.testId = this.configProps$.testId;
109
- this.label$ = this.configProps$.label;
110
- this.displayMode$ = this.configProps$.displayMode;
111
- let nValue: any = this.configProps$.value;
112
- if (nValue) {
113
- if (typeof nValue === 'string') {
114
- nValue = parseInt(nValue, 10);
115
- }
116
- this.value$ = nValue;
117
- }
118
- this.helperText = this.configProps$.helperText;
119
- this.placeholder = this.configProps$.placeholder || '';
120
-
121
- this.actionsApi = this.pConn$.getActionsApi();
122
- this.propName = this.pConn$.getStateProps().value;
123
-
124
- // timeout and detectChanges to avoid ExpressionChangedAfterItHasBeenCheckedError
125
- setTimeout(() => {
126
- if (this.configProps$.required != null) {
127
- this.bRequired$ = this.utils.getBooleanValue(this.configProps$.required);
128
- }
129
- this.cdRef.detectChanges();
130
- });
131
-
132
- if (this.configProps$.visibility != null) {
133
- this.bVisible$ = this.utils.getBooleanValue(this.configProps$.visibility);
134
- }
135
-
136
- // disabled
137
- if (this.configProps$.disabled != undefined) {
138
- this.bDisabled$ = this.utils.getBooleanValue(this.configProps$.disabled);
139
- }
140
32
 
141
- if (this.bDisabled$) {
142
- this.fieldControl.disable();
143
- } else {
144
- this.fieldControl.enable();
145
- }
33
+ // Update component common properties
34
+ this.updateComponentCommonProperties(this.configProps$);
146
35
 
147
- if (this.configProps$.readOnly != null) {
148
- this.bReadonly$ = this.utils.getBooleanValue(this.configProps$.readOnly);
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;
149
40
  }
41
+ }
150
42
 
151
- this.componentReference = this.pConn$.getStateProps().value;
152
-
153
- // trigger display of error message with field control
154
- if (this.angularPConnectData.validateMessage != null && this.angularPConnectData.validateMessage != '') {
155
- const timer = interval(100).subscribe(() => {
156
- this.fieldControl.setErrors({ message: true });
157
- this.fieldControl.markAsTouched();
43
+ fieldOnChange(event: any) {
44
+ const oldVal = this.value$ ?? '';
45
+ const isValueChanged = event.target.value.toString() !== oldVal.toString();
158
46
 
159
- timer.unsubscribe();
47
+ if (isValueChanged) {
48
+ this.pConn$.clearErrorMessages({
49
+ property: this.propName
160
50
  });
161
51
  }
162
52
  }
163
53
 
164
- fieldOnChange() {
165
- this.pConn$.clearErrorMessages({
166
- property: this.propName
167
- });
168
- }
169
-
170
54
  fieldOnBlur(event: any) {
171
- const value = event?.target?.value;
172
- handleEvent(this.actionsApi, 'changeNblur', this.propName, value);
173
- }
174
-
175
- getErrorMessage() {
176
- // field control gets error message from here
177
-
178
- let errMessage = '';
55
+ const oldVal = this.value$ ?? '';
56
+ const isValueChanged = event.target.value.toString() !== oldVal.toString();
179
57
 
180
- // look for validation messages for json, pre-defined or just an error pushed from workitem (400)
181
- if (this.fieldControl.hasError('message')) {
182
- errMessage = this.angularPConnectData.validateMessage ?? '';
183
- return errMessage;
58
+ if (isValueChanged) {
59
+ const value = event?.target?.value;
60
+ handleEvent(this.actionsApi, 'changeNblur', this.propName, value);
184
61
  }
185
- if (this.fieldControl.hasError('required')) {
186
- errMessage = 'You must enter a value';
187
- } else if (this.fieldControl.errors) {
188
- errMessage = this.fieldControl.errors.toString();
189
- }
190
-
191
- return errMessage;
192
62
  }
193
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
+ }