@pega/angular-sdk-overrides 24.2.12 → 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 (237) 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 -1
  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 +2 -2
  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 +0 -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 +1 -1
  24. package/lib/designSystemExtension/operator/operator.component.scss +3 -10
  25. package/lib/designSystemExtension/operator/operator.component.ts +0 -2
  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 -1
  34. package/lib/field/auto-complete/auto-complete.component.ts +35 -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 +14 -7
  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 +36 -169
  42. package/lib/field/date/date.component.html +2 -2
  43. package/lib/field/date/date.component.ts +30 -151
  44. package/lib/field/date-time/date-time.component.html +1 -1
  45. package/lib/field/date-time/date-time.component.ts +34 -149
  46. package/lib/field/decimal/decimal.component.ts +38 -164
  47. package/lib/field/dropdown/dropdown.component.ts +29 -152
  48. package/lib/field/email/email.component.ts +16 -156
  49. package/lib/field/field.base.ts +149 -0
  50. package/lib/field/group/group.component.ts +7 -5
  51. package/lib/field/integer/integer.component.ts +18 -158
  52. package/lib/field/list-view-action-buttons/list-view-action-buttons.component.ts +0 -1
  53. package/lib/field/location/config-ext.json +8 -0
  54. package/lib/field/location/location.component.html +45 -0
  55. package/lib/field/location/location.component.scss +18 -0
  56. package/lib/field/location/location.component.spec.ts +22 -0
  57. package/lib/field/location/location.component.ts +280 -0
  58. package/lib/field/multiselect/multiselect.component.ts +47 -152
  59. package/lib/field/multiselect/utils.ts +55 -47
  60. package/lib/field/object-reference/object-reference.component.html +17 -0
  61. package/lib/field/object-reference/object-reference.component.scss +0 -0
  62. package/lib/field/object-reference/object-reference.component.spec.ts +22 -0
  63. package/lib/field/object-reference/object-reference.component.ts +237 -0
  64. package/lib/field/percentage/percentage.component.ts +37 -155
  65. package/lib/field/phone/phone.component.html +18 -19
  66. package/lib/field/phone/phone.component.scss +4 -0
  67. package/lib/field/phone/phone.component.ts +43 -145
  68. package/lib/field/radio-buttons/radio-buttons.component.html +14 -6
  69. package/lib/field/radio-buttons/radio-buttons.component.scss +4 -2
  70. package/lib/field/radio-buttons/radio-buttons.component.ts +37 -160
  71. package/lib/field/rich-text/rich-text.component.html +2 -0
  72. package/lib/field/rich-text/rich-text.component.scss +172 -0
  73. package/lib/field/rich-text/rich-text.component.ts +21 -91
  74. package/lib/field/scalar-list/scalar-list.component.ts +17 -73
  75. package/lib/field/selectable-card/selectable-card.component.html +70 -0
  76. package/lib/field/selectable-card/selectable-card.component.scss +11 -0
  77. package/lib/field/selectable-card/selectable-card.component.spec.ts +22 -0
  78. package/lib/field/selectable-card/selectable-card.component.ts +219 -0
  79. package/lib/field/semantic-link/semantic-link.component.html +4 -8
  80. package/lib/field/semantic-link/semantic-link.component.scss +0 -13
  81. package/lib/field/semantic-link/semantic-link.component.ts +165 -6
  82. package/lib/field/text/text.component.scss +0 -1
  83. package/lib/field/text/text.component.ts +0 -1
  84. package/lib/field/text-area/text-area.component.ts +18 -153
  85. package/lib/field/text-content/text-content.component.ts +0 -1
  86. package/lib/field/text-input/text-input.component.ts +16 -156
  87. package/lib/field/time/time.component.ts +17 -152
  88. package/lib/field/url/url.component.ts +16 -155
  89. package/lib/field/user-reference/user-reference.component.scss +0 -1
  90. package/lib/field/user-reference/user-reference.component.ts +2 -4
  91. package/lib/infra/Containers/flow-container/flow-container.component.html +2 -2
  92. package/lib/infra/Containers/flow-container/flow-container.component.ts +8 -9
  93. package/lib/infra/Containers/hybrid-view-container/hybrid-view-container.component.ts +0 -1
  94. package/lib/infra/Containers/modal-view-container/modal-view-container.component.ts +5 -11
  95. package/lib/infra/Containers/view-container/helper.ts +35 -2
  96. package/lib/infra/Containers/view-container/view-container.component.ts +1 -2
  97. package/lib/infra/action-buttons/action-buttons.component.html +13 -8
  98. package/lib/infra/action-buttons/action-buttons.component.scss +23 -0
  99. package/lib/infra/action-buttons/action-buttons.component.ts +1 -3
  100. package/lib/infra/assignment/assignment.component.ts +21 -10
  101. package/lib/infra/assignment-card/assignment-card.component.html +1 -2
  102. package/lib/infra/assignment-card/assignment-card.component.scss +0 -4
  103. package/lib/infra/assignment-card/assignment-card.component.ts +21 -5
  104. package/lib/infra/dashboard-filter/dashboard-filter.component.ts +0 -1
  105. package/lib/infra/defer-load/defer-load.component.html +6 -2
  106. package/lib/infra/defer-load/defer-load.component.ts +22 -12
  107. package/lib/infra/error-boundary/error-boundary.component.ts +0 -1
  108. package/lib/infra/multi-step/multi-step.component.html +22 -38
  109. package/lib/infra/multi-step/multi-step.component.scss +14 -27
  110. package/lib/infra/multi-step/multi-step.component.ts +0 -1
  111. package/lib/infra/navbar/navbar.component.html +36 -41
  112. package/lib/infra/navbar/navbar.component.scss +22 -4
  113. package/lib/infra/navbar/navbar.component.ts +8 -4
  114. package/lib/infra/reference/reference.component.ts +5 -0
  115. package/lib/infra/region/region.component.ts +0 -1
  116. package/lib/infra/root-container/root-container.component.scss +0 -1
  117. package/lib/infra/root-container/root-container.component.ts +1 -5
  118. package/lib/infra/stages/stages.component.html +4 -3
  119. package/lib/infra/stages/stages.component.scss +12 -36
  120. package/lib/infra/stages/stages.component.ts +4 -3
  121. package/lib/infra/view/view.component.html +1 -1
  122. package/lib/infra/view/view.component.ts +3 -7
  123. package/lib/template/advanced-search/advanced-search.component.html +12 -0
  124. package/lib/template/advanced-search/advanced-search.component.scss +0 -0
  125. package/lib/template/advanced-search/advanced-search.component.spec.ts +0 -0
  126. package/lib/template/advanced-search/advanced-search.component.ts +112 -0
  127. package/lib/template/advanced-search/advanced-search.service.ts +27 -0
  128. package/lib/template/advanced-search/search-group/persist-utils.ts +56 -0
  129. package/lib/template/advanced-search/search-groups/search-groups.component.html +32 -0
  130. package/lib/template/advanced-search/search-groups/search-groups.component.scss +0 -0
  131. package/lib/template/advanced-search/search-groups/search-groups.component.spec.ts +0 -0
  132. package/lib/template/advanced-search/search-groups/search-groups.component.ts +294 -0
  133. package/lib/template/advanced-search/search-groups/utils.ts +29 -0
  134. package/lib/template/app-shell/app-shell.component.html +4 -1
  135. package/lib/template/app-shell/app-shell.component.scss +0 -3
  136. package/lib/template/app-shell/app-shell.component.ts +46 -8
  137. package/lib/template/banner-page/banner-page.component.ts +0 -1
  138. package/lib/template/case-summary/case-summary.component.scss +0 -2
  139. package/lib/template/case-summary/case-summary.component.ts +6 -22
  140. package/lib/template/case-view/case-view.component.html +4 -4
  141. package/lib/template/case-view/case-view.component.scss +18 -10
  142. package/lib/template/case-view/case-view.component.ts +1 -11
  143. package/lib/template/confirmation/confirmation.component.html +1 -1
  144. package/lib/template/confirmation/confirmation.component.ts +0 -1
  145. package/lib/template/data-reference/data-reference.component.html +11 -8
  146. package/lib/template/data-reference/data-reference.component.ts +346 -113
  147. package/lib/template/data-reference/search-form/search-form.component.html +39 -0
  148. package/lib/template/data-reference/search-form/search-form.component.scss +11 -0
  149. package/lib/template/data-reference/search-form/search-form.component.spec.ts +0 -0
  150. package/lib/template/data-reference/search-form/search-form.component.ts +167 -0
  151. package/lib/template/data-reference/search-form/tabsData.ts +160 -0
  152. package/lib/template/data-reference/utils.ts +92 -0
  153. package/lib/template/default-form/default-form.component.ts +10 -3
  154. package/lib/template/default-page/default-page.component.html +34 -0
  155. package/lib/template/default-page/default-page.component.scss +31 -0
  156. package/lib/template/default-page/default-page.component.spec.ts +24 -0
  157. package/lib/template/default-page/default-page.component.ts +64 -0
  158. package/lib/template/details/details.component.ts +0 -1
  159. package/lib/template/details-narrow-wide/details-narrow-wide.component.ts +0 -1
  160. package/lib/template/details-one-column/details-one-column.component.ts +0 -1
  161. package/lib/template/details-sub-tabs/details-sub-tabs.component.ts +0 -1
  162. package/lib/template/details-three-column/details-three-column.component.ts +0 -1
  163. package/lib/template/details-two-column/details-two-column.component.ts +0 -1
  164. package/lib/template/details-wide-narrow/details-wide-narrow.component.ts +0 -1
  165. package/lib/template/dynamic-tabs/dynamic-tabs.component.ts +0 -1
  166. package/lib/template/field-group-list/field-group-list.component.scss +0 -1
  167. package/lib/template/field-group-list/field-group-list.component.ts +0 -1
  168. package/lib/template/field-group-template/field-group-template.component.ts +14 -28
  169. package/lib/template/field-value-list/field-value-list.component.ts +0 -1
  170. package/lib/template/inline-dashboard/inline-dashboard.component.ts +0 -1
  171. package/lib/template/inline-dashboard-page/inline-dashboard-page.component.ts +1 -2
  172. package/lib/template/list-page/list-page.component.ts +0 -1
  173. package/lib/template/list-view/list-view.component.html +170 -162
  174. package/lib/template/list-view/list-view.component.scss +25 -21
  175. package/lib/template/list-view/list-view.component.ts +207 -119
  176. package/lib/template/list-view/listViewHelpers.ts +1 -4
  177. package/lib/template/list-view/utils.ts +25 -2
  178. package/lib/template/multi-reference-readonly/multi-reference-readonly.component.ts +0 -1
  179. package/lib/template/narrow-wide-form/narrow-wide-form.component.ts +0 -1
  180. package/lib/template/object-page/object-page.component.html +1 -0
  181. package/lib/template/object-page/object-page.component.scss +0 -0
  182. package/lib/template/object-page/object-page.component.spec.ts +22 -0
  183. package/lib/template/object-page/object-page.component.ts +14 -0
  184. package/lib/template/one-column/one-column.component.ts +0 -1
  185. package/lib/template/one-column-page/one-column-page.component.ts +0 -1
  186. package/lib/template/one-column-tab/one-column-tab.component.scss +1 -1
  187. package/lib/template/one-column-tab/one-column-tab.component.ts +0 -1
  188. package/lib/template/page/page.component.ts +0 -1
  189. package/lib/template/promoted-filters/promoted-filters.component.ts +0 -1
  190. package/lib/template/repeating-structures/repeating-structures.component.ts +0 -2
  191. package/lib/template/self-service-case-view/self-service-case-view.component.html +78 -0
  192. package/lib/template/self-service-case-view/self-service-case-view.component.scss +132 -0
  193. package/lib/template/self-service-case-view/self-service-case-view.component.spec.ts +24 -0
  194. package/lib/template/self-service-case-view/self-service-case-view.component.ts +207 -0
  195. package/lib/template/simple-table/simple-table.component.ts +0 -2
  196. package/lib/template/simple-table-manual/helpers.ts +117 -3
  197. package/lib/template/simple-table-manual/simple-table-manual.component.html +4 -4
  198. package/lib/template/simple-table-manual/simple-table-manual.component.scss +4 -14
  199. package/lib/template/simple-table-manual/simple-table-manual.component.ts +45 -25
  200. package/lib/template/simple-table-select/simple-table-select.component.ts +0 -1
  201. package/lib/template/single-reference-readonly/single-reference-readonly.component.html +4 -1
  202. package/lib/template/single-reference-readonly/single-reference-readonly.component.scss +21 -0
  203. package/lib/template/single-reference-readonly/single-reference-readonly.component.ts +104 -4
  204. package/lib/template/sub-tabs/sub-tabs.component.ts +0 -1
  205. package/lib/template/three-column/three-column.component.ts +0 -1
  206. package/lib/template/three-column-page/three-column-page.component.ts +0 -1
  207. package/lib/template/two-column/two-column.component.ts +0 -1
  208. package/lib/template/two-column-page/two-column-page.component.ts +0 -1
  209. package/lib/template/two-column-tab/two-column-tab.component.ts +0 -1
  210. package/lib/template/utils.ts +42 -0
  211. package/lib/template/wide-narrow-form/wide-narrow-form.component.ts +0 -1
  212. package/lib/template/wide-narrow-page/wide-narrow-page.component.ts +0 -1
  213. package/lib/template/wss-nav-bar/wss-nav-bar.component.html +6 -5
  214. package/lib/template/wss-nav-bar/wss-nav-bar.component.scss +8 -17
  215. package/lib/template/wss-nav-bar/wss-nav-bar.component.ts +1 -9
  216. package/lib/widget/app-announcement/app-announcement.component.html +1 -2
  217. package/lib/widget/app-announcement/app-announcement.component.scss +2 -2
  218. package/lib/widget/app-announcement/app-announcement.component.ts +0 -1
  219. package/lib/widget/attachment/Attachment.types.ts +92 -0
  220. package/lib/widget/attachment/AttachmentUtils.ts +287 -0
  221. package/lib/widget/attachment/attachment.component.html +3 -3
  222. package/lib/widget/attachment/attachment.component.scss +9 -12
  223. package/lib/widget/attachment/attachment.component.ts +267 -254
  224. package/lib/widget/case-history/case-history.component.ts +0 -1
  225. package/lib/widget/feed-container/feed-container.component.scss +3 -9
  226. package/lib/widget/feed-container/feed-container.component.ts +2 -3
  227. package/lib/widget/file-utility/file-utility.component.html +3 -3
  228. package/lib/widget/file-utility/file-utility.component.scss +6 -17
  229. package/lib/widget/file-utility/file-utility.component.ts +24 -9
  230. package/lib/widget/list-utility/list-utility.component.scss +4 -5
  231. package/lib/widget/list-utility/list-utility.component.ts +0 -1
  232. package/lib/widget/quick-create/quick-create.component.ts +41 -23
  233. package/lib/widget/todo/todo.component.html +8 -5
  234. package/lib/widget/todo/todo.component.scss +11 -10
  235. package/lib/widget/todo/todo.component.ts +7 -4
  236. package/lib/widget/utility/utility.component.ts +0 -1
  237. package/package.json +1 -1
@@ -1,17 +1,16 @@
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, FormsModule, ReactiveFormsModule } from '@angular/forms';
3
+ import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
4
4
  import { MatInputModule } from '@angular/material/input';
5
5
  import { MatFormFieldModule } from '@angular/material/form-field';
6
6
  import { NgxCurrencyDirective, NgxCurrencyInputMode } from 'ngx-currency';
7
- import { interval } from 'rxjs';
8
- import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
9
- import { Utils } from '@pega/angular-sdk-components';
7
+
8
+ import { FieldBase } from '@pega/angular-sdk-components';
10
9
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
11
10
  import { handleEvent } from '@pega/angular-sdk-components';
12
11
  import { getCurrencyCharacters, getCurrencyOptions } from '@pega/angular-sdk-components';
13
- import { PConnFieldProps } from '@pega/angular-sdk-components';
14
12
  import { format } from '@pega/angular-sdk-components';
13
+ import { PConnFieldProps } from '@pega/angular-sdk-components';
15
14
 
16
15
  interface DecimalProps extends PConnFieldProps {
17
16
  // If any, enter additional props that only exist on Decimal here
@@ -25,7 +24,6 @@ interface DecimalProps extends PConnFieldProps {
25
24
  selector: 'app-decimal',
26
25
  templateUrl: './decimal.component.html',
27
26
  styleUrls: ['./decimal.component.scss'],
28
- standalone: true,
29
27
  imports: [
30
28
  CommonModule,
31
29
  ReactiveFormsModule,
@@ -36,176 +34,69 @@ interface DecimalProps extends PConnFieldProps {
36
34
  forwardRef(() => ComponentMapperComponent)
37
35
  ]
38
36
  })
39
- export class DecimalComponent implements OnInit, OnDestroy {
40
- @Input() pConn$: typeof PConnect;
41
- @Input() formGroup$: FormGroup;
42
-
43
- // Used with AngularPConnect
44
- angularPConnectData: AngularPConnectData = {};
37
+ export class DecimalComponent extends FieldBase {
45
38
  configProps$: DecimalProps;
39
+ override fieldControl = new FormControl<number | null>(null, null);
46
40
 
47
- label$ = '';
48
- value$: any;
49
- bRequired$ = false;
50
- bReadonly$ = false;
51
- bDisabled$ = false;
52
- bVisible$ = true;
53
- displayMode$?: string = '';
54
- controlName$: string;
55
- bHasForm$ = true;
56
- componentReference = '';
57
- testId: string;
58
- helperText: string;
59
- placeholder: string;
60
-
61
- fieldControl = new FormControl<number | null>(null, null);
62
41
  decimalSeparator: string;
63
42
  thousandSeparator: string;
64
43
  currencySymbol = '';
65
44
  decimalPrecision: number | undefined;
66
45
  formatter;
67
46
  formattedValue: any;
68
- inputMode: any;
47
+ inputMode: any = NgxCurrencyInputMode.Natural;
69
48
  suffix = '';
70
49
 
71
- constructor(
72
- private angularPConnect: AngularPConnectService,
73
- private cdRef: ChangeDetectorRef,
74
- private utils: Utils
75
- ) {}
76
-
77
- ngOnInit(): void {
78
- // First thing in initialization is registering and subscribing to the AngularPConnect service
79
- this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
80
- this.controlName$ = this.angularPConnect.getComponentID(this);
81
-
82
- // Then, continue on with other initialization
50
+ /**
51
+ * Updates the component when there are changes in the state.
52
+ */
53
+ override updateSelf(): void {
54
+ // Resolve config properties
55
+ this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as DecimalProps;
83
56
 
84
- // call updateSelf when initializing
85
- // this.updateSelf();
86
- this.checkAndUpdate();
57
+ // Update common properties
58
+ this.updateComponentCommonProperties(this.configProps$);
87
59
 
88
- if (this.formGroup$) {
89
- // add control to formGroup
90
- this.formGroup$.addControl(this.controlName$, this.fieldControl);
60
+ // Extract and normalize the value property
61
+ const { value } = this.configProps$;
62
+ if (value) {
63
+ this.value$ = typeof value === 'string' ? parseFloat(value) : value;
91
64
  this.fieldControl.setValue(this.value$);
92
- this.bHasForm$ = true;
93
- } else {
94
- this.bReadonly$ = true;
95
- this.bHasForm$ = false;
96
- }
97
- }
98
-
99
- ngOnDestroy(): void {
100
- if (this.formGroup$) {
101
- this.formGroup$.removeControl(this.controlName$);
102
65
  }
103
66
 
104
- if (this.angularPConnectData.unsubscribeFn) {
105
- this.angularPConnectData.unsubscribeFn();
106
- }
67
+ // updates decimal properties
68
+ this.updateDecimalProperties(this.configProps$);
107
69
  }
108
70
 
109
- // Callback passed when subscribing to store change
110
- onStateChange() {
111
- this.checkAndUpdate();
112
- }
113
-
114
- checkAndUpdate() {
115
- // Should always check the bridge to see if the component should
116
- // update itself (re-render)
117
- const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
118
-
119
- // ONLY call updateSelf when the component should update
120
- if (bUpdateSelf) {
121
- this.updateSelf();
122
- }
123
- }
124
-
125
- // updateSelf
126
- updateSelf(): void {
127
- // starting very simple...
128
-
129
- // moved this from ngOnInit() and call this from there instead...
130
- this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as DecimalProps;
131
- this.testId = this.configProps$.testId;
132
- this.label$ = this.configProps$.label;
133
- this.displayMode$ = this.configProps$.displayMode;
134
- this.inputMode = NgxCurrencyInputMode.Natural;
135
- let nValue: any = this.configProps$.value;
136
- if (nValue) {
137
- if (typeof nValue === 'string') {
138
- nValue = parseFloat(nValue);
139
- }
140
- this.value$ = nValue;
141
- this.fieldControl.setValue(this.value$);
142
- }
143
- this.helperText = this.configProps$.helperText;
144
- this.placeholder = this.configProps$.placeholder || '';
145
- const showGroupSeparators = this.configProps$.showGroupSeparators;
146
- const currencyISOCode = this.configProps$?.currencyISOCode ?? '';
147
-
71
+ /**
72
+ * Updates decimal properties based on the provided configuration.
73
+ *
74
+ * @param {Object} configProps - Configuration properties.
75
+ * @param {string} configProps.currencyISOCode - ISO code of the currency.
76
+ * @param {string} configProps.formatter - Formatter type (e.g., 'decimal', 'currency').
77
+ * @param {boolean} configProps.showGroupSeparators - Whether to show group separators.
78
+ */
79
+ protected updateDecimalProperties(configProps): void {
80
+ const { currencyISOCode = '', formatter, showGroupSeparators } = configProps;
81
+
82
+ // Extract currency symbols and options
148
83
  const theSymbols = getCurrencyCharacters(currencyISOCode);
149
84
  this.decimalSeparator = theSymbols.theDecimalIndicator;
150
85
  this.thousandSeparator = showGroupSeparators ? theSymbols.theDigitGroupSeparator : '';
151
86
 
152
87
  const theCurrencyOptions = getCurrencyOptions(currencyISOCode);
153
- this.formatter = this.configProps$.formatter;
88
+ const formatterLower = formatter?.toLowerCase() || 'decimal';
89
+ this.formattedValue = format(this.value$, formatterLower, theCurrencyOptions);
154
90
 
155
- if (this.formatter) {
156
- this.formattedValue = format(this.value$, this.formatter.toLowerCase(), theCurrencyOptions);
157
- } else {
158
- this.formattedValue = format(this.value$, 'decimal', theCurrencyOptions);
159
- }
160
-
161
- // timeout and detectChanges to avoid ExpressionChangedAfterItHasBeenCheckedError
162
- setTimeout(() => {
163
- if (this.configProps$.required != null) {
164
- this.bRequired$ = this.utils.getBooleanValue(this.configProps$.required);
165
- }
166
- this.cdRef.detectChanges();
167
- });
168
-
169
- if (this.configProps$.visibility != null) {
170
- this.bVisible$ = this.utils.getBooleanValue(this.configProps$.visibility);
171
- }
172
-
173
- if (this.configProps$.readOnly != null) {
174
- this.bReadonly$ = this.utils.getBooleanValue(this.configProps$.readOnly);
175
- }
176
-
177
- // disabled
178
- if (this.configProps$.disabled != undefined) {
179
- this.bDisabled$ = this.utils.getBooleanValue(this.configProps$.disabled);
180
- }
181
-
182
- if (this.bDisabled$) {
183
- this.fieldControl.disable();
184
- } else {
185
- this.fieldControl.enable();
186
- }
187
-
188
- if (this.bReadonly$ && this.formatter === 'Currency') {
91
+ if (this.bReadonly$ && formatter === 'Currency') {
189
92
  this.currencySymbol = theSymbols.theCurrencySymbol;
190
93
  }
191
94
 
192
- if (this.bReadonly$ && this.formatter === 'Percentage') {
95
+ if (this.bReadonly$ && formatter === 'Percentage') {
193
96
  this.suffix = '%';
194
97
  }
195
98
 
196
99
  this.decimalPrecision = this.configProps$?.decimalPrecision ?? 2;
197
-
198
- this.componentReference = this.pConn$.getStateProps().value;
199
-
200
- // trigger display of error message with field control
201
- if (this.angularPConnectData.validateMessage != null && this.angularPConnectData.validateMessage != '') {
202
- const timer = interval(100).subscribe(() => {
203
- this.fieldControl.setErrors({ message: true });
204
- this.fieldControl.markAsTouched();
205
-
206
- timer.unsubscribe();
207
- });
208
- }
209
100
  }
210
101
 
211
102
  fieldOnBlur(event: any) {
@@ -230,21 +121,4 @@ export class DecimalComponent implements OnInit, OnDestroy {
230
121
  handleEvent(actionsApi, 'changeNblur', propName, value);
231
122
  }
232
123
  }
233
-
234
- getErrorMessage() {
235
- let errMessage = '';
236
-
237
- // look for validation messages for json, pre-defined or just an error pushed from workitem (400)
238
- if (this.fieldControl.hasError('message')) {
239
- errMessage = this.angularPConnectData.validateMessage ?? '';
240
- return errMessage;
241
- }
242
- if (this.fieldControl.hasError('required')) {
243
- errMessage = 'You must enter a value';
244
- } else if (this.fieldControl.errors) {
245
- errMessage = this.fieldControl.errors.toString();
246
- }
247
-
248
- return errMessage;
249
- }
250
124
  }
@@ -1,14 +1,12 @@
1
- import { Component, OnInit, Input, ChangeDetectorRef, forwardRef, OnDestroy } from '@angular/core';
1
+ import { Component, OnInit, forwardRef, OnDestroy, Output, EventEmitter } 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 { MatOptionModule } from '@angular/material/core';
5
5
  import { MatSelectModule } from '@angular/material/select';
6
6
  import { MatFormFieldModule } from '@angular/material/form-field';
7
- import { interval } from 'rxjs';
8
7
  import isEqual from 'fast-deep-equal';
9
- import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
10
- import { DatapageService } from '@pega/angular-sdk-components';
11
- import { Utils } from '@pega/angular-sdk-components';
8
+
9
+ import { FieldBase } from '@pega/angular-sdk-components';
12
10
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
13
11
  import { handleEvent } from '@pega/angular-sdk-components';
14
12
  import { PConnFieldProps } from '@pega/angular-sdk-components';
@@ -68,70 +66,20 @@ interface DropdownProps extends PConnFieldProps {
68
66
  selector: 'app-dropdown',
69
67
  templateUrl: './dropdown.component.html',
70
68
  styleUrls: ['./dropdown.component.scss'],
71
- standalone: true,
72
69
  imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatSelectModule, MatOptionModule, forwardRef(() => ComponentMapperComponent)]
73
70
  })
74
- export class DropdownComponent implements OnInit, OnDestroy {
75
- @Input() pConn$: typeof PConnect;
76
- @Input() formGroup$: FormGroup;
71
+ export class DropdownComponent extends FieldBase implements OnInit, OnDestroy {
72
+ @Output() onRecordChange: EventEmitter<any> = new EventEmitter();
77
73
 
78
- // Used with AngularPConnect
79
- angularPConnectData: AngularPConnectData = {};
80
74
  configProps$: DropdownProps;
81
75
 
82
- label$ = '';
83
- value$ = '';
84
- bRequired$ = false;
85
- bReadonly$ = false;
86
- bDisabled$ = false;
87
- bVisible$ = true;
88
- displayMode$?: string = '';
89
- controlName$: string;
90
- bHasForm$ = true;
91
76
  options$: IOption[];
92
- componentReference = '';
93
- testId = '';
94
- helperText: string;
95
- hideLabel: any;
96
77
  theDatasource: any[] | null;
97
- fieldControl = new FormControl('', null);
98
- fieldMetadata: any[];
99
78
  localeContext = '';
100
79
  localeClass = '';
101
80
  localeName = '';
102
81
  localePath = '';
103
82
  localizedValue = '';
104
- actionsApi: Object;
105
- propName: string;
106
-
107
- constructor(
108
- private angularPConnect: AngularPConnectService,
109
- private cdRef: ChangeDetectorRef,
110
- private utils: Utils,
111
- private dataPageService: DatapageService
112
- ) {}
113
-
114
- ngOnInit(): void {
115
- // First thing in initialization is registering and subscribing to the AngularPConnect service
116
- this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
117
- this.controlName$ = this.angularPConnect.getComponentID(this);
118
-
119
- // Then, continue on with other initialization
120
-
121
- // call updateSelf when initializing
122
- this.checkAndUpdate();
123
- // this should get called afer checkAndUpdate
124
-
125
- if (this.formGroup$) {
126
- // add control to formGroup
127
- this.formGroup$.addControl(this.controlName$, this.fieldControl);
128
- this.fieldControl.setValue(this.value$);
129
- this.bHasForm$ = true;
130
- } else {
131
- this.bReadonly$ = true;
132
- this.bHasForm$ = false;
133
- }
134
- }
135
83
 
136
84
  set options(options: IOption[]) {
137
85
  this.options$ = options;
@@ -145,80 +93,34 @@ export class DropdownComponent implements OnInit, OnDestroy {
145
93
  }
146
94
  }
147
95
 
148
- ngOnDestroy(): void {
149
- if (this.formGroup$) {
150
- this.formGroup$.removeControl(this.controlName$);
151
- }
152
-
153
- if (this.angularPConnectData.unsubscribeFn) {
154
- this.angularPConnectData.unsubscribeFn();
155
- }
156
- }
157
-
158
- // Callback passed when subscribing to store change
159
- onStateChange() {
160
- this.checkAndUpdate();
161
- }
96
+ /**
97
+ * Updates the component when there are changes in the state.
98
+ */
99
+ override updateSelf(): void {
100
+ // Resolve configuration properties
101
+ this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as DropdownProps;
162
102
 
163
- checkAndUpdate() {
164
- // Should always check the bridge to see if the component should
165
- // update itself (re-render)
166
- const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
103
+ // Update component common properties
104
+ this.updateComponentCommonProperties(this.configProps$);
167
105
 
168
- // ONLY call updateSelf when the component should update
169
- if (bUpdateSelf) {
170
- this.updateSelf();
171
- }
106
+ // Set component specific properties
107
+ this.updateDropdownProperties(this.configProps$);
172
108
  }
173
109
 
174
- // updateSelf
175
- updateSelf(): void {
176
- // moved this from ngOnInit() and call this from there instead...
177
- this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as DropdownProps;
178
- if (this.configProps$.value != undefined) {
179
- this.value$ = this.configProps$.value;
180
- }
110
+ /**
111
+ * Updates dropdown properties based on the provided configuration.
112
+ * @param configProps - Configuration properties
113
+ */
114
+ updateDropdownProperties(configProps) {
115
+ const { value, fieldMetadata, datasource } = configProps;
181
116
 
182
- this.testId = this.configProps$.testId;
183
- this.displayMode$ = this.configProps$.displayMode;
184
- this.label$ = this.configProps$.label;
185
- this.helperText = this.configProps$.helperText;
186
- this.hideLabel = this.configProps$.hideLabel;
187
- const datasource = this.configProps$.datasource;
188
- // timeout and detectChanges to avoid ExpressionChangedAfterItHasBeenCheckedError
189
- setTimeout(() => {
190
- if (this.configProps$.required != null) {
191
- this.bRequired$ = this.utils.getBooleanValue(this.configProps$.required);
192
- }
193
- this.cdRef.detectChanges();
194
- });
117
+ this.value$ = value;
195
118
 
196
119
  if (!isEqual(datasource, this.theDatasource)) {
197
120
  // inbound datasource is different, so update theDatasource
198
121
  this.theDatasource = datasource || null;
199
122
  }
200
123
 
201
- if (this.configProps$.visibility != null) {
202
- this.bVisible$ = this.utils.getBooleanValue(this.configProps$.visibility);
203
- }
204
-
205
- // disabled
206
- if (this.configProps$.disabled != undefined) {
207
- this.bDisabled$ = this.utils.getBooleanValue(this.configProps$.disabled);
208
- }
209
-
210
- if (this.bDisabled$) {
211
- this.fieldControl.disable();
212
- } else {
213
- this.fieldControl.enable();
214
- }
215
-
216
- if (this.configProps$.readOnly != null) {
217
- this.bReadonly$ = this.utils.getBooleanValue(this.configProps$.readOnly);
218
- }
219
-
220
- this.componentReference = this.pConn$.getStateProps().value;
221
-
222
124
  if (this.value$ === '' && !this.bReadonly$) {
223
125
  this.value$ = 'Select';
224
126
  }
@@ -235,8 +137,7 @@ export class DropdownComponent implements OnInit, OnDestroy {
235
137
  const className = this.pConn$.getCaseInfo().getClassName();
236
138
  const refName = this.propName?.slice(this.propName.lastIndexOf('.') + 1);
237
139
 
238
- this.fieldMetadata = this.configProps$.fieldMetadata;
239
- const metaData = Array.isArray(this.fieldMetadata) ? this.fieldMetadata.filter(field => field?.classID === className)[0] : this.fieldMetadata;
140
+ const metaData = Array.isArray(fieldMetadata) ? fieldMetadata.filter(field => field?.classID === className)[0] : fieldMetadata;
240
141
 
241
142
  let displayName = metaData?.datasource?.propertyForDisplayText;
242
143
  displayName = displayName?.slice(displayName.lastIndexOf('.') + 1);
@@ -252,16 +153,8 @@ export class DropdownComponent implements OnInit, OnDestroy {
252
153
  );
253
154
 
254
155
  this.localizedValue = this.options$?.find(opt => opt.key === this.value$)?.value || this.localizedValue;
255
- this.getDatapageData();
256
- // trigger display of error message with field control
257
- if (this.angularPConnectData.validateMessage != null && this.angularPConnectData.validateMessage != '') {
258
- const timer = interval(100).subscribe(() => {
259
- this.fieldControl.setErrors({ message: true });
260
- this.fieldControl.markAsTouched();
261
156
 
262
- timer.unsubscribe();
263
- });
264
- }
157
+ this.getDatapageData();
265
158
  }
266
159
 
267
160
  getDatapageData() {
@@ -337,12 +230,13 @@ export class DropdownComponent implements OnInit, OnDestroy {
337
230
  event.value = '';
338
231
  }
339
232
  handleEvent(this.actionsApi, 'changeNblur', this.propName, event.value);
340
- if (this.configProps$?.onRecordChange) {
341
- this.configProps$.onRecordChange(event);
342
- }
233
+
343
234
  this.pConn$.clearErrorMessages({
344
235
  property: this.propName
345
236
  });
237
+ if (this.onRecordChange) {
238
+ this.onRecordChange.emit(event.value);
239
+ }
346
240
  }
347
241
 
348
242
  getLocalizedOptionValue(opt: IOption) {
@@ -352,21 +246,4 @@ export class DropdownComponent implements OnInit, OnDestroy {
352
246
  this.pConn$.getLocaleRuleNameFromKeys(this.localeClass, this.localeContext, this.localeName)
353
247
  );
354
248
  }
355
-
356
- getErrorMessage() {
357
- let errMessage = '';
358
-
359
- // look for validation messages for json, pre-defined or just an error pushed from workitem (400)
360
- if (this.fieldControl.hasError('message')) {
361
- errMessage = this.angularPConnectData.validateMessage ?? '';
362
- return errMessage;
363
- }
364
- if (this.fieldControl.hasError('required')) {
365
- errMessage = 'You must enter a value';
366
- } else if (this.fieldControl.errors) {
367
- errMessage = this.fieldControl.errors.toString();
368
- }
369
-
370
- return errMessage;
371
- }
372
249
  }