@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,16 +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 { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
8
- import { Utils } from '@pega/angular-sdk-components';
7
+
8
+ import { FieldBase } from '@pega/angular-sdk-components';
9
9
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
10
10
  import { handleEvent } from '@pega/angular-sdk-components';
11
11
  import { getCurrencyCharacters, getCurrencyOptions } from '@pega/angular-sdk-components';
12
- import { PConnFieldProps } from '@pega/angular-sdk-components';
13
12
  import { format } from '@pega/angular-sdk-components';
13
+ import { PConnFieldProps } from '@pega/angular-sdk-components';
14
14
 
15
15
  interface DecimalProps extends PConnFieldProps {
16
16
  // If any, enter additional props that only exist on Decimal here
@@ -24,7 +24,6 @@ interface DecimalProps extends PConnFieldProps {
24
24
  selector: 'app-decimal',
25
25
  templateUrl: './decimal.component.html',
26
26
  styleUrls: ['./decimal.component.scss'],
27
- standalone: true,
28
27
  imports: [
29
28
  CommonModule,
30
29
  ReactiveFormsModule,
@@ -35,193 +34,91 @@ interface DecimalProps extends PConnFieldProps {
35
34
  forwardRef(() => ComponentMapperComponent)
36
35
  ]
37
36
  })
38
- export class DecimalComponent implements OnInit, OnDestroy {
39
- @Input() pConn$: typeof PConnect;
40
- @Input() formGroup$: FormGroup;
41
-
42
- // Used with AngularPConnect
43
- angularPConnectData: AngularPConnectData = {};
37
+ export class DecimalComponent extends FieldBase {
44
38
  configProps$: DecimalProps;
39
+ override fieldControl = new FormControl<number | null>(null, null);
45
40
 
46
- label$ = '';
47
- value$: any;
48
- bRequired$ = false;
49
- bReadonly$ = false;
50
- bDisabled$ = false;
51
- bVisible$ = true;
52
- displayMode$?: string = '';
53
- controlName$: string;
54
- bHasForm$ = true;
55
- componentReference = '';
56
- testId: string;
57
- helperText: string;
58
- placeholder: string;
59
-
60
- fieldControl = new FormControl<number | null>(null, null);
61
41
  decimalSeparator: string;
62
42
  thousandSeparator: string;
63
43
  currencySymbol = '';
64
44
  decimalPrecision: number | undefined;
65
45
  formatter;
66
46
  formattedValue: any;
67
- inputMode: any;
68
-
69
- constructor(
70
- private angularPConnect: AngularPConnectService,
71
- private cdRef: ChangeDetectorRef,
72
- private utils: Utils
73
- ) {}
74
-
75
- ngOnInit(): void {
76
- // First thing in initialization is registering and subscribing to the AngularPConnect service
77
- this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
78
- this.controlName$ = this.angularPConnect.getComponentID(this);
79
-
80
- // Then, continue on with other initialization
47
+ inputMode: any = NgxCurrencyInputMode.Natural;
48
+ suffix = '';
49
+
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;
81
56
 
82
- // call updateSelf when initializing
83
- // this.updateSelf();
84
- this.checkAndUpdate();
57
+ // Update common properties
58
+ this.updateComponentCommonProperties(this.configProps$);
85
59
 
86
- if (this.formGroup$) {
87
- // add control to formGroup
88
- 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;
89
64
  this.fieldControl.setValue(this.value$);
90
- this.bHasForm$ = true;
91
- } else {
92
- this.bReadonly$ = true;
93
- this.bHasForm$ = false;
94
- }
95
- }
96
-
97
- ngOnDestroy(): void {
98
- if (this.formGroup$) {
99
- this.formGroup$.removeControl(this.controlName$);
100
65
  }
101
66
 
102
- if (this.angularPConnectData.unsubscribeFn) {
103
- this.angularPConnectData.unsubscribeFn();
104
- }
105
- }
106
-
107
- // Callback passed when subscribing to store change
108
- onStateChange() {
109
- this.checkAndUpdate();
67
+ // updates decimal properties
68
+ this.updateDecimalProperties(this.configProps$);
110
69
  }
111
70
 
112
- checkAndUpdate() {
113
- // Should always check the bridge to see if the component should
114
- // update itself (re-render)
115
- const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
116
-
117
- // ONLY call updateSelf when the component should update
118
- if (bUpdateSelf) {
119
- this.updateSelf();
120
- }
121
- }
122
-
123
- // updateSelf
124
- updateSelf(): void {
125
- // starting very simple...
126
-
127
- // moved this from ngOnInit() and call this from there instead...
128
- this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as DecimalProps;
129
- this.testId = this.configProps$.testId;
130
- this.label$ = this.configProps$.label;
131
- this.displayMode$ = this.configProps$.displayMode;
132
- this.inputMode = NgxCurrencyInputMode.Natural;
133
- let nValue: any = this.configProps$.value;
134
- if (nValue) {
135
- if (typeof nValue === 'string') {
136
- nValue = parseFloat(nValue);
137
- }
138
- this.value$ = nValue;
139
- }
140
- this.helperText = this.configProps$.helperText;
141
- this.placeholder = this.configProps$.placeholder || '';
142
- const showGroupSeparators = this.configProps$.showGroupSeparators;
143
- const currencyISOCode = this.configProps$?.currencyISOCode ?? '';
144
-
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
145
83
  const theSymbols = getCurrencyCharacters(currencyISOCode);
146
84
  this.decimalSeparator = theSymbols.theDecimalIndicator;
147
85
  this.thousandSeparator = showGroupSeparators ? theSymbols.theDigitGroupSeparator : '';
148
86
 
149
87
  const theCurrencyOptions = getCurrencyOptions(currencyISOCode);
150
- this.formatter = this.configProps$.formatter;
151
-
152
- if (this.formatter) {
153
- this.formattedValue = format(this.value$, this.formatter.toLowerCase(), theCurrencyOptions);
154
- } else {
155
- this.formattedValue = format(this.value$, 'decimal', theCurrencyOptions);
156
- }
88
+ const formatterLower = formatter?.toLowerCase() || 'decimal';
89
+ this.formattedValue = format(this.value$, formatterLower, theCurrencyOptions);
157
90
 
158
- // timeout and detectChanges to avoid ExpressionChangedAfterItHasBeenCheckedError
159
- setTimeout(() => {
160
- if (this.configProps$.required != null) {
161
- this.bRequired$ = this.utils.getBooleanValue(this.configProps$.required);
162
- }
163
- this.cdRef.detectChanges();
164
- });
165
-
166
- if (this.configProps$.visibility != null) {
167
- this.bVisible$ = this.utils.getBooleanValue(this.configProps$.visibility);
168
- }
169
-
170
- if (this.configProps$.readOnly != null) {
171
- this.bReadonly$ = this.utils.getBooleanValue(this.configProps$.readOnly);
172
- }
173
-
174
- // disabled
175
- if (this.configProps$.disabled != undefined) {
176
- this.bDisabled$ = this.utils.getBooleanValue(this.configProps$.disabled);
91
+ if (this.bReadonly$ && formatter === 'Currency') {
92
+ this.currencySymbol = theSymbols.theCurrencySymbol;
177
93
  }
178
94
 
179
- if (this.bDisabled$) {
180
- this.fieldControl.disable();
181
- } else {
182
- this.fieldControl.enable();
95
+ if (this.bReadonly$ && formatter === 'Percentage') {
96
+ this.suffix = '%';
183
97
  }
184
98
 
185
- if (this.bReadonly$ && this.formatter === 'Currency') {
186
- this.currencySymbol = theSymbols.theCurrencySymbol;
187
- }
188
99
  this.decimalPrecision = this.configProps$?.decimalPrecision ?? 2;
189
-
190
- this.componentReference = this.pConn$.getStateProps().value;
191
100
  }
192
101
 
193
102
  fieldOnBlur(event: any) {
194
- const actionsApi = this.pConn$?.getActionsApi();
195
- const propName = this.pConn$?.getStateProps().value;
196
- let value = event?.target?.value;
197
- // replacing thousand separator with empty string as not required in api call
198
- if (this.configProps$.showGroupSeparators) {
199
- const thousandSep = this.thousandSeparator === '.' ? '\\.' : this.thousandSeparator;
200
- const regExp = new RegExp(String.raw`${thousandSep}`, 'g');
201
- value = value?.replace(regExp, '');
202
- }
203
- // replacing decimal separator with '.'
204
- if (this.decimalSeparator !== '.') {
205
- const regExp = new RegExp(String.raw`${this.decimalSeparator}`, 'g');
206
- value = value.replace(regExp, '.');
207
- }
208
- handleEvent(actionsApi, 'changeNblur', propName, value);
209
- }
210
-
211
- getErrorMessage() {
212
- let errMessage = '';
213
-
214
- // look for validation messages for json, pre-defined or just an error pushed from workitem (400)
215
- if (this.fieldControl.hasError('message')) {
216
- errMessage = this.angularPConnectData.validateMessage ?? '';
217
- return errMessage;
218
- }
219
- if (this.fieldControl.hasError('required')) {
220
- errMessage = 'You must enter a value';
221
- } else if (this.fieldControl.errors) {
222
- errMessage = this.fieldControl.errors.toString();
103
+ const oldVal = this.value$ ?? '';
104
+ const isValueChanged = event.target.value.toString() !== oldVal.toString();
105
+
106
+ if (isValueChanged) {
107
+ const actionsApi = this.pConn$?.getActionsApi();
108
+ const propName = this.pConn$?.getStateProps().value;
109
+ let value = event?.target?.value;
110
+ // replacing thousand separator with empty string as not required in api call
111
+ if (this.configProps$.showGroupSeparators) {
112
+ const thousandSep = this.thousandSeparator === '.' ? '\\.' : this.thousandSeparator;
113
+ const regExp = new RegExp(String.raw`${thousandSep}`, 'g');
114
+ value = value?.replace(regExp, '');
115
+ }
116
+ // replacing decimal separator with '.'
117
+ if (this.decimalSeparator !== '.') {
118
+ const regExp = new RegExp(String.raw`${this.decimalSeparator}`, 'g');
119
+ value = value.replace(regExp, '.');
120
+ }
121
+ handleEvent(actionsApi, 'changeNblur', propName, value);
223
122
  }
224
-
225
- return errMessage;
226
123
  }
227
124
  }
@@ -12,6 +12,7 @@
12
12
  <mat-select
13
13
  [value]="value$"
14
14
  [required]="bRequired$"
15
+ [disabled]="bDisabled$"
15
16
  [attr.data-test-id]="testId"
16
17
  (selectionChange)="fieldOnChange($event)"
17
18
  [formControl]="fieldControl"
@@ -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,146 +66,61 @@ 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
- this.getDatapageData();
125
83
 
126
- if (this.formGroup$) {
127
- // add control to formGroup
128
- this.formGroup$.addControl(this.controlName$, this.fieldControl);
129
- this.fieldControl.setValue(this.value$);
130
- this.bHasForm$ = true;
131
- } else {
132
- this.bReadonly$ = true;
133
- this.bHasForm$ = false;
84
+ set options(options: IOption[]) {
85
+ this.options$ = options;
86
+ if (this.displayMode$) {
87
+ this.value$ = this.options$?.find(option => option.key === this.value$)?.value || this.value$;
88
+ this.localizedValue = this.pConn$.getLocalizedValue(
89
+ this.value$ === 'Select...' ? '' : this.value$,
90
+ this.localePath,
91
+ this.pConn$.getLocaleRuleNameFromKeys(this.localeClass, this.localeContext, this.localeName)
92
+ );
134
93
  }
135
94
  }
136
95
 
137
- ngOnDestroy(): void {
138
- if (this.formGroup$) {
139
- this.formGroup$.removeControl(this.controlName$);
140
- }
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;
141
102
 
142
- if (this.angularPConnectData.unsubscribeFn) {
143
- this.angularPConnectData.unsubscribeFn();
144
- }
145
- }
103
+ // Update component common properties
104
+ this.updateComponentCommonProperties(this.configProps$);
146
105
 
147
- // Callback passed when subscribing to store change
148
- onStateChange() {
149
- this.checkAndUpdate();
106
+ // Set component specific properties
107
+ this.updateDropdownProperties(this.configProps$);
150
108
  }
151
109
 
152
- checkAndUpdate() {
153
- // Should always check the bridge to see if the component should
154
- // update itself (re-render)
155
- const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
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;
156
116
 
157
- // ONLY call updateSelf when the component should update
158
- if (bUpdateSelf) {
159
- this.updateSelf();
160
- }
161
- }
162
-
163
- // updateSelf
164
- updateSelf(): void {
165
- // moved this from ngOnInit() and call this from there instead...
166
- this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as DropdownProps;
167
- if (this.configProps$.value != undefined) {
168
- this.value$ = this.configProps$.value;
169
- }
170
-
171
- this.testId = this.configProps$.testId;
172
- this.displayMode$ = this.configProps$.displayMode;
173
- this.label$ = this.configProps$.label;
174
- this.helperText = this.configProps$.helperText;
175
- this.hideLabel = this.configProps$.hideLabel;
176
- const datasource = this.configProps$.datasource;
177
- // timeout and detectChanges to avoid ExpressionChangedAfterItHasBeenCheckedError
178
- setTimeout(() => {
179
- if (this.configProps$.required != null) {
180
- this.bRequired$ = this.utils.getBooleanValue(this.configProps$.required);
181
- }
182
- this.cdRef.detectChanges();
183
- });
117
+ this.value$ = value;
184
118
 
185
119
  if (!isEqual(datasource, this.theDatasource)) {
186
120
  // inbound datasource is different, so update theDatasource
187
121
  this.theDatasource = datasource || null;
188
122
  }
189
123
 
190
- if (this.configProps$.visibility != null) {
191
- this.bVisible$ = this.utils.getBooleanValue(this.configProps$.visibility);
192
- }
193
-
194
- // disabled
195
- if (this.configProps$.disabled != undefined) {
196
- this.bDisabled$ = this.utils.getBooleanValue(this.configProps$.disabled);
197
- }
198
-
199
- if (this.bDisabled$) {
200
- this.fieldControl.disable();
201
- } else {
202
- this.fieldControl.enable();
203
- }
204
-
205
- if (this.configProps$.readOnly != null) {
206
- this.bReadonly$ = this.utils.getBooleanValue(this.configProps$.readOnly);
207
- }
208
-
209
- this.componentReference = this.pConn$.getStateProps().value;
210
-
211
124
  if (this.value$ === '' && !this.bReadonly$) {
212
125
  this.value$ = 'Select';
213
126
  }
@@ -215,7 +128,7 @@ export class DropdownComponent implements OnInit, OnDestroy {
215
128
  if (this.theDatasource) {
216
129
  const optionsList = [...this.utils.getOptionList(this.configProps$, this.pConn$.getDataObject())];
217
130
  optionsList?.unshift({ key: 'Select', value: this.pConn$.getLocalizedValue('Select...', '', '') });
218
- this.options$ = optionsList;
131
+ this.options = optionsList;
219
132
  }
220
133
 
221
134
  this.actionsApi = this.pConn$.getActionsApi();
@@ -224,8 +137,7 @@ export class DropdownComponent implements OnInit, OnDestroy {
224
137
  const className = this.pConn$.getCaseInfo().getClassName();
225
138
  const refName = this.propName?.slice(this.propName.lastIndexOf('.') + 1);
226
139
 
227
- this.fieldMetadata = this.configProps$.fieldMetadata;
228
- 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;
229
141
 
230
142
  let displayName = metaData?.datasource?.propertyForDisplayText;
231
143
  displayName = displayName?.slice(displayName.lastIndexOf('.') + 1);
@@ -239,15 +151,10 @@ export class DropdownComponent implements OnInit, OnDestroy {
239
151
  this.localePath,
240
152
  this.pConn$.getLocaleRuleNameFromKeys(this.localeClass, this.localeContext, this.localeName)
241
153
  );
242
- // trigger display of error message with field control
243
- if (this.angularPConnectData.validateMessage != null && this.angularPConnectData.validateMessage != '') {
244
- const timer = interval(100).subscribe(() => {
245
- this.fieldControl.setErrors({ message: true });
246
- this.fieldControl.markAsTouched();
247
154
 
248
- timer.unsubscribe();
249
- });
250
- }
155
+ this.localizedValue = this.options$?.find(opt => opt.key === this.value$)?.value || this.localizedValue;
156
+
157
+ this.getDatapageData();
251
158
  }
252
159
 
253
160
  getDatapageData() {
@@ -278,7 +185,7 @@ export class DropdownComponent implements OnInit, OnDestroy {
278
185
  }
279
186
 
280
187
  columns = preProcessColumns(columns) || [];
281
- if (!this.displayMode$ && listType !== 'associated' && typeof datasource === 'string') {
188
+ if (listType !== 'associated' && typeof datasource === 'string') {
282
189
  this.getData(datasource, parameters, columns, context, listType);
283
190
  }
284
191
  }
@@ -309,7 +216,7 @@ export class DropdownComponent implements OnInit, OnDestroy {
309
216
  optionsData.push(obj);
310
217
  });
311
218
  optionsData?.unshift({ key: 'Select', value: this.pConn$.getLocalizedValue('Select...', '', '') });
312
- this.options$ = optionsData;
219
+ this.options = optionsData;
313
220
  });
314
221
  });
315
222
  }
@@ -323,12 +230,13 @@ export class DropdownComponent implements OnInit, OnDestroy {
323
230
  event.value = '';
324
231
  }
325
232
  handleEvent(this.actionsApi, 'changeNblur', this.propName, event.value);
326
- if (this.configProps$?.onRecordChange) {
327
- this.configProps$.onRecordChange(event);
328
- }
233
+
329
234
  this.pConn$.clearErrorMessages({
330
235
  property: this.propName
331
236
  });
237
+ if (this.onRecordChange) {
238
+ this.onRecordChange.emit(event.value);
239
+ }
332
240
  }
333
241
 
334
242
  getLocalizedOptionValue(opt: IOption) {
@@ -338,21 +246,4 @@ export class DropdownComponent implements OnInit, OnDestroy {
338
246
  this.pConn$.getLocaleRuleNameFromKeys(this.localeClass, this.localeContext, this.localeName)
339
247
  );
340
248
  }
341
-
342
- getErrorMessage() {
343
- let errMessage = '';
344
-
345
- // look for validation messages for json, pre-defined or just an error pushed from workitem (400)
346
- if (this.fieldControl.hasError('message')) {
347
- errMessage = this.angularPConnectData.validateMessage ?? '';
348
- return errMessage;
349
- }
350
- if (this.fieldControl.hasError('required')) {
351
- errMessage = 'You must enter a value';
352
- } else if (this.fieldControl.errors) {
353
- errMessage = this.fieldControl.errors.toString();
354
- }
355
-
356
- return errMessage;
357
- }
358
249
  }