@pega/angular-sdk-overrides 0.24.9 → 0.25.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. package/lib/designSystemExtension/alert/alert.component.scss +3 -3
  2. package/lib/designSystemExtension/alert/alert.component.ts +0 -1
  3. package/lib/designSystemExtension/alert-banner/alert-banner.component.ts +1 -2
  4. package/lib/designSystemExtension/banner/banner.component.scss +12 -2
  5. package/lib/designSystemExtension/banner/banner.component.ts +0 -1
  6. package/lib/designSystemExtension/case-create-stage/case-create-stage.component.ts +1 -2
  7. package/lib/designSystemExtension/field-group/field-group.component.ts +0 -1
  8. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.html +6 -3
  9. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.scss +7 -35
  10. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.ts +0 -2
  11. package/lib/designSystemExtension/material-details/material-details.component.scss +0 -5
  12. package/lib/designSystemExtension/material-details/material-details.component.ts +0 -1
  13. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.html +4 -4
  14. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.scss +4 -3
  15. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.ts +10 -2
  16. package/lib/designSystemExtension/material-summary-item/material-summary-item.component.scss +2 -17
  17. package/lib/designSystemExtension/material-summary-item/material-summary-item.component.ts +0 -1
  18. package/lib/designSystemExtension/material-summary-list/material-summary-list.component.ts +0 -1
  19. package/lib/designSystemExtension/material-utility/material-utility.component.scss +1 -2
  20. package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.scss +1 -1
  21. package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.ts +0 -1
  22. package/lib/designSystemExtension/operator/operator.component.html +2 -2
  23. package/lib/designSystemExtension/operator/operator.component.scss +13 -12
  24. package/lib/designSystemExtension/operator/operator.component.ts +5 -6
  25. package/lib/designSystemExtension/pulse/pulse.component.scss +2 -2
  26. package/lib/designSystemExtension/pulse/pulse.component.ts +7 -8
  27. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.scss +0 -1
  28. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.ts +0 -1
  29. package/lib/designSystemExtension/wss-quick-create/wss-quick-create.component.scss +16 -8
  30. package/lib/designSystemExtension/wss-quick-create/wss-quick-create.component.ts +0 -1
  31. package/lib/field/auto-complete/auto-complete.component.html +0 -2
  32. package/lib/field/auto-complete/auto-complete.component.ts +56 -178
  33. package/lib/field/cancel-alert/cancel-alert.component.html +8 -12
  34. package/lib/field/cancel-alert/cancel-alert.component.scss +2 -3
  35. package/lib/field/cancel-alert/cancel-alert.component.ts +24 -37
  36. package/lib/field/check-box/check-box.component.html +17 -6
  37. package/lib/field/check-box/check-box.component.scss +0 -1
  38. package/lib/field/check-box/check-box.component.ts +32 -157
  39. package/lib/field/currency/currency.component.html +4 -4
  40. package/lib/field/currency/currency.component.ts +65 -175
  41. package/lib/field/date/date.component.html +4 -8
  42. package/lib/field/date/date.component.ts +39 -177
  43. package/lib/field/date-time/date-time.component.html +3 -4
  44. package/lib/field/date-time/date-time.component.ts +46 -146
  45. package/lib/field/decimal/decimal.component.html +4 -3
  46. package/lib/field/decimal/decimal.component.ts +66 -166
  47. package/lib/field/dropdown/dropdown.component.html +1 -0
  48. package/lib/field/dropdown/dropdown.component.ts +158 -153
  49. package/lib/field/email/email.component.ts +28 -148
  50. package/lib/field/field.base.ts +149 -0
  51. package/lib/field/group/group.component.ts +9 -7
  52. package/lib/field/integer/integer.component.ts +30 -152
  53. package/lib/field/list-view-action-buttons/list-view-action-buttons.component.html +1 -1
  54. package/lib/field/list-view-action-buttons/list-view-action-buttons.component.ts +3 -3
  55. package/lib/field/location/config-ext.json +8 -0
  56. package/lib/field/location/location.component.html +45 -0
  57. package/lib/field/location/location.component.scss +18 -0
  58. package/lib/field/location/location.component.spec.ts +22 -0
  59. package/lib/field/location/location.component.ts +385 -0
  60. package/lib/field/multiselect/multiselect.component.ts +56 -151
  61. package/lib/field/multiselect/utils.ts +55 -47
  62. package/lib/field/object-reference/object-reference.component.html +17 -0
  63. package/lib/field/object-reference/object-reference.component.scss +0 -0
  64. package/lib/field/object-reference/object-reference.component.spec.ts +22 -0
  65. package/lib/field/object-reference/object-reference.component.ts +237 -0
  66. package/lib/field/percentage/percentage.component.html +3 -3
  67. package/lib/field/percentage/percentage.component.ts +68 -161
  68. package/lib/field/phone/config-ext.json +1 -1
  69. package/lib/field/phone/phone.component.html +9 -6
  70. package/lib/field/phone/phone.component.scss +9 -0
  71. package/lib/field/phone/phone.component.ts +48 -159
  72. package/lib/field/radio-buttons/radio-buttons.component.html +17 -12
  73. package/lib/field/radio-buttons/radio-buttons.component.scss +4 -2
  74. package/lib/field/radio-buttons/radio-buttons.component.ts +39 -162
  75. package/lib/field/rich-text/rich-text.component.ts +32 -93
  76. package/lib/field/scalar-list/scalar-list.component.ts +20 -77
  77. package/lib/field/selectable-card/selectable-card.component.html +70 -0
  78. package/lib/field/selectable-card/selectable-card.component.scss +11 -0
  79. package/lib/field/selectable-card/selectable-card.component.spec.ts +22 -0
  80. package/lib/field/selectable-card/selectable-card.component.ts +219 -0
  81. package/lib/field/semantic-link/semantic-link.component.html +4 -8
  82. package/lib/field/semantic-link/semantic-link.component.scss +0 -13
  83. package/lib/field/semantic-link/semantic-link.component.ts +165 -6
  84. package/lib/field/text/text.component.scss +0 -1
  85. package/lib/field/text/text.component.ts +8 -5
  86. package/lib/field/text-area/text-area.component.html +4 -1
  87. package/lib/field/text-area/text-area.component.ts +30 -148
  88. package/lib/field/text-content/text-content.component.ts +0 -1
  89. package/lib/field/text-input/text-input.component.ts +28 -150
  90. package/lib/field/time/time.component.html +2 -2
  91. package/lib/field/time/time.component.ts +39 -145
  92. package/lib/field/url/url.component.ts +28 -149
  93. package/lib/field/user-reference/user-reference.component.html +40 -46
  94. package/lib/field/user-reference/user-reference.component.scss +0 -1
  95. package/lib/field/user-reference/user-reference.component.ts +110 -21
  96. package/lib/infra/Containers/flow-container/flow-container.component.html +1 -1
  97. package/lib/infra/Containers/flow-container/flow-container.component.ts +29 -54
  98. package/lib/infra/Containers/flow-container/helpers.ts +2 -2
  99. package/lib/infra/Containers/hybrid-view-container/hybrid-view-container.component.ts +0 -1
  100. package/lib/infra/Containers/modal-view-container/modal-view-container.component.html +1 -11
  101. package/lib/infra/Containers/modal-view-container/modal-view-container.component.ts +6 -19
  102. package/lib/infra/Containers/preview-view-container/preview-view-container.component.ts +1 -1
  103. package/lib/infra/Containers/view-container/helper.ts +55 -0
  104. package/lib/infra/Containers/view-container/view-container.component.ts +6 -19
  105. package/lib/infra/action-buttons/action-buttons.component.html +13 -8
  106. package/lib/infra/action-buttons/action-buttons.component.scss +23 -0
  107. package/lib/infra/action-buttons/action-buttons.component.ts +1 -3
  108. package/lib/infra/assignment/assignment.component.html +1 -1
  109. package/lib/infra/assignment/assignment.component.ts +90 -47
  110. package/lib/infra/assignment-card/assignment-card.component.html +2 -2
  111. package/lib/infra/assignment-card/assignment-card.component.scss +0 -4
  112. package/lib/infra/assignment-card/assignment-card.component.ts +21 -5
  113. package/lib/infra/dashboard-filter/dashboard-filter.component.ts +0 -1
  114. package/lib/infra/defer-load/defer-load.component.html +6 -2
  115. package/lib/infra/defer-load/defer-load.component.ts +24 -16
  116. package/lib/infra/error-boundary/error-boundary.component.ts +0 -1
  117. package/lib/infra/multi-step/multi-step.component.scss +1 -21
  118. package/lib/infra/multi-step/multi-step.component.ts +0 -1
  119. package/lib/infra/navbar/navbar.component.html +25 -28
  120. package/lib/infra/navbar/navbar.component.scss +16 -4
  121. package/lib/infra/navbar/navbar.component.ts +11 -9
  122. package/lib/infra/reference/reference.component.ts +77 -90
  123. package/lib/infra/region/region.component.ts +0 -1
  124. package/lib/infra/root-container/root-container.component.html +2 -15
  125. package/lib/infra/root-container/root-container.component.scss +0 -1
  126. package/lib/infra/root-container/root-container.component.ts +28 -35
  127. package/lib/infra/stages/stages.component.html +2 -2
  128. package/lib/infra/stages/stages.component.scss +9 -37
  129. package/lib/infra/stages/stages.component.ts +4 -3
  130. package/lib/infra/view/view.component.html +7 -20
  131. package/lib/infra/view/view.component.ts +20 -5
  132. package/lib/template/advanced-search/advanced-search.component.html +12 -0
  133. package/lib/template/advanced-search/advanced-search.component.scss +0 -0
  134. package/lib/template/advanced-search/advanced-search.component.spec.ts +0 -0
  135. package/lib/template/advanced-search/advanced-search.component.ts +112 -0
  136. package/lib/template/advanced-search/advanced-search.service.ts +27 -0
  137. package/lib/template/advanced-search/search-group/persist-utils.ts +56 -0
  138. package/lib/template/advanced-search/search-groups/search-groups.component.html +32 -0
  139. package/lib/template/advanced-search/search-groups/search-groups.component.scss +0 -0
  140. package/lib/template/advanced-search/search-groups/search-groups.component.spec.ts +0 -0
  141. package/lib/template/advanced-search/search-groups/search-groups.component.ts +294 -0
  142. package/lib/template/advanced-search/search-groups/utils.ts +29 -0
  143. package/lib/template/app-shell/app-shell.component.html +4 -1
  144. package/lib/template/app-shell/app-shell.component.scss +0 -3
  145. package/lib/template/app-shell/app-shell.component.ts +66 -10
  146. package/lib/template/banner-page/banner-page.component.ts +0 -1
  147. package/lib/template/base/details-template-base.ts +67 -0
  148. package/lib/template/base/form-template-base.ts +16 -0
  149. package/lib/template/case-summary/case-summary.component.scss +0 -2
  150. package/lib/template/case-summary/case-summary.component.ts +7 -23
  151. package/lib/template/case-view/case-view.component.html +7 -7
  152. package/lib/template/case-view/case-view.component.scss +18 -10
  153. package/lib/template/case-view/case-view.component.ts +9 -15
  154. package/lib/template/confirmation/confirmation.component.html +1 -1
  155. package/lib/template/confirmation/confirmation.component.ts +1 -2
  156. package/lib/template/data-reference/data-reference-advanced-search.service.ts +16 -0
  157. package/lib/template/data-reference/data-reference.component.html +11 -8
  158. package/lib/template/data-reference/data-reference.component.ts +377 -148
  159. package/lib/template/data-reference/search-form/search-form.component.html +39 -0
  160. package/lib/template/data-reference/search-form/search-form.component.scss +11 -0
  161. package/lib/template/data-reference/search-form/search-form.component.spec.ts +0 -0
  162. package/lib/template/data-reference/search-form/search-form.component.ts +167 -0
  163. package/lib/template/data-reference/search-form/tabsData.ts +160 -0
  164. package/lib/template/data-reference/utils.ts +92 -0
  165. package/lib/template/default-form/default-form.component.html +0 -4
  166. package/lib/template/default-form/default-form.component.ts +50 -26
  167. package/lib/template/default-page/default-page.component.html +34 -0
  168. package/lib/template/default-page/default-page.component.scss +31 -0
  169. package/lib/template/default-page/default-page.component.spec.ts +24 -0
  170. package/lib/template/default-page/default-page.component.ts +64 -0
  171. package/lib/template/details/details.component.ts +7 -42
  172. package/lib/template/details-narrow-wide/details-narrow-wide.component.ts +6 -40
  173. package/lib/template/details-one-column/details-one-column.component.ts +7 -43
  174. package/lib/template/details-sub-tabs/details-sub-tabs.component.html +1 -2
  175. package/lib/template/details-sub-tabs/details-sub-tabs.component.ts +5 -38
  176. package/lib/template/details-three-column/details-three-column.component.ts +7 -44
  177. package/lib/template/details-two-column/details-two-column.component.ts +8 -45
  178. package/lib/template/details-wide-narrow/details-wide-narrow.component.ts +7 -43
  179. package/lib/template/dynamic-tabs/dynamic-tabs.component.html +3 -0
  180. package/lib/template/dynamic-tabs/dynamic-tabs.component.ts +8 -4
  181. package/lib/template/field-group-list/field-group-list.component.scss +0 -1
  182. package/lib/template/field-group-list/field-group-list.component.ts +0 -1
  183. package/lib/template/field-group-template/field-group-template.component.html +7 -7
  184. package/lib/template/field-group-template/field-group-template.component.scss +8 -0
  185. package/lib/template/field-group-template/field-group-template.component.ts +68 -48
  186. package/lib/template/field-value-list/field-value-list.component.html +2 -2
  187. package/lib/template/field-value-list/field-value-list.component.scss +6 -1
  188. package/lib/template/field-value-list/field-value-list.component.ts +0 -1
  189. package/lib/template/inline-dashboard/inline-dashboard.component.ts +0 -1
  190. package/lib/template/inline-dashboard-page/inline-dashboard-page.component.ts +2 -3
  191. package/lib/template/list-page/list-page.component.ts +0 -1
  192. package/lib/template/list-view/list-view.component.html +14 -4
  193. package/lib/template/list-view/list-view.component.scss +30 -19
  194. package/lib/template/list-view/list-view.component.ts +179 -95
  195. package/lib/template/list-view/listViewHelpers.ts +4 -10
  196. package/lib/template/list-view/utils.ts +27 -7
  197. package/lib/template/multi-reference-readonly/multi-reference-readonly.component.ts +0 -1
  198. package/lib/template/narrow-wide-form/narrow-wide-form.component.ts +1 -2
  199. package/lib/template/object-page/object-page.component.html +1 -0
  200. package/lib/template/object-page/object-page.component.scss +0 -0
  201. package/lib/template/object-page/object-page.component.spec.ts +22 -0
  202. package/lib/template/object-page/object-page.component.ts +14 -0
  203. package/lib/template/one-column/one-column.component.ts +4 -4
  204. package/lib/template/one-column-page/one-column-page.component.ts +0 -1
  205. package/lib/template/one-column-tab/one-column-tab.component.scss +1 -1
  206. package/lib/template/one-column-tab/one-column-tab.component.ts +1 -2
  207. package/lib/template/page/page.component.ts +1 -2
  208. package/lib/template/promoted-filters/promoted-filters.component.ts +1 -2
  209. package/lib/template/repeating-structures/repeating-structures.component.ts +1 -3
  210. package/lib/template/self-service-case-view/self-service-case-view.component.html +80 -0
  211. package/lib/template/self-service-case-view/self-service-case-view.component.scss +124 -0
  212. package/lib/template/self-service-case-view/self-service-case-view.component.spec.ts +24 -0
  213. package/lib/template/self-service-case-view/self-service-case-view.component.ts +216 -0
  214. package/lib/template/simple-table/simple-table.component.ts +0 -2
  215. package/lib/template/simple-table-manual/helpers.ts +127 -11
  216. package/lib/template/simple-table-manual/simple-table-manual.component.html +27 -8
  217. package/lib/template/simple-table-manual/simple-table-manual.component.scss +16 -17
  218. package/lib/template/simple-table-manual/simple-table-manual.component.ts +118 -58
  219. package/lib/template/simple-table-select/simple-table-select.component.ts +3 -4
  220. package/lib/template/single-reference-readonly/single-reference-readonly.component.html +4 -1
  221. package/lib/template/single-reference-readonly/single-reference-readonly.component.scss +21 -0
  222. package/lib/template/single-reference-readonly/single-reference-readonly.component.ts +104 -4
  223. package/lib/template/sub-tabs/sub-tabs.component.ts +0 -1
  224. package/lib/template/three-column/three-column.component.ts +4 -4
  225. package/lib/template/three-column-page/three-column-page.component.ts +0 -1
  226. package/lib/template/two-column/two-column.component.ts +4 -4
  227. package/lib/template/two-column-page/two-column-page.component.ts +0 -1
  228. package/lib/template/two-column-tab/two-column-tab.component.ts +1 -2
  229. package/lib/template/utils.ts +58 -0
  230. package/lib/template/wide-narrow-form/wide-narrow-form.component.ts +4 -4
  231. package/lib/template/wide-narrow-page/wide-narrow-page.component.ts +1 -2
  232. package/lib/template/wss-nav-bar/wss-nav-bar.component.html +5 -4
  233. package/lib/template/wss-nav-bar/wss-nav-bar.component.scss +2 -8
  234. package/lib/template/wss-nav-bar/wss-nav-bar.component.ts +3 -11
  235. package/lib/widget/app-announcement/app-announcement.component.html +1 -2
  236. package/lib/widget/app-announcement/app-announcement.component.scss +2 -2
  237. package/lib/widget/app-announcement/app-announcement.component.ts +0 -1
  238. package/lib/widget/attachment/Attachment.types.ts +92 -0
  239. package/lib/widget/attachment/AttachmentUtils.ts +287 -0
  240. package/lib/widget/attachment/attachment.component.html +3 -3
  241. package/lib/widget/attachment/attachment.component.scss +2 -5
  242. package/lib/widget/attachment/attachment.component.ts +256 -259
  243. package/lib/widget/case-history/case-history.component.ts +0 -1
  244. package/lib/widget/feed-container/feed-container.component.scss +3 -9
  245. package/lib/widget/feed-container/feed-container.component.ts +9 -12
  246. package/lib/widget/file-utility/file-utility.component.html +3 -3
  247. package/lib/widget/file-utility/file-utility.component.scss +5 -16
  248. package/lib/widget/file-utility/file-utility.component.ts +2 -6
  249. package/lib/widget/list-utility/list-utility.component.scss +3 -5
  250. package/lib/widget/list-utility/list-utility.component.ts +0 -1
  251. package/lib/widget/quick-create/quick-create.component.ts +0 -1
  252. package/lib/widget/todo/todo.component.html +13 -11
  253. package/lib/widget/todo/todo.component.scss +19 -11
  254. package/lib/widget/todo/todo.component.ts +101 -87
  255. package/lib/widget/utility/utility.component.ts +0 -1
  256. package/package.json +1 -1
@@ -0,0 +1,237 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, Input, OnInit, forwardRef, OnDestroy } from '@angular/core';
3
+ import { FormGroup } from '@angular/forms';
4
+ import { ComponentMetadataConfig } from '@pega/pcore-pconnect-typedefs/interpreter/types';
5
+ import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
6
+ import { ComponentMapperComponent } from '@pega/angular-sdk-components';
7
+ import { generateColumns, getDataRelationshipContextFromKey } from '@pega/angular-sdk-components';
8
+ import { PConnFieldProps } from '@pega/angular-sdk-components';
9
+
10
+ interface ObjectReferenceProps extends PConnFieldProps {
11
+ showPromotedFilters: boolean;
12
+ inline: boolean;
13
+ parameters: object;
14
+ mode: string;
15
+ targetObjectType: any;
16
+ allowAndPersistChangesInReviewMode: boolean;
17
+ }
18
+
19
+ @Component({
20
+ selector: 'app-object-reference',
21
+ imports: [CommonModule, forwardRef(() => ComponentMapperComponent)],
22
+ templateUrl: './object-reference.component.html',
23
+ styleUrl: './object-reference.component.scss'
24
+ })
25
+ export class ObjectReferenceComponent implements OnInit, OnDestroy {
26
+ @Input() pConn$: typeof PConnect;
27
+ @Input() formGroup$: FormGroup;
28
+
29
+ angularPConnectData: AngularPConnectData = {};
30
+ configProps: ObjectReferenceProps;
31
+ value: { [key: string]: any };
32
+ readOnly: boolean;
33
+ isForm: boolean;
34
+ type: string;
35
+ isDisplayModeEnabled: boolean;
36
+ canBeChangedInReviewMode: boolean;
37
+ newComponentName: string;
38
+ newPconn: typeof PConnect;
39
+ rawViewMetadata: ComponentMetadataConfig | undefined;
40
+
41
+ constructor(private angularPConnect: AngularPConnectService) {}
42
+
43
+ ngOnInit() {
44
+ this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
45
+ this.checkAndUpdate();
46
+ }
47
+
48
+ onStateChange() {
49
+ this.checkAndUpdate();
50
+ }
51
+
52
+ ngOnDestroy() {
53
+ if (this.angularPConnectData.unsubscribeFn) {
54
+ this.angularPConnectData.unsubscribeFn();
55
+ }
56
+ }
57
+
58
+ checkAndUpdate() {
59
+ const shouldUpdate = this.angularPConnect.shouldComponentUpdate(this);
60
+ if (shouldUpdate) {
61
+ this.updateSelf();
62
+ }
63
+ }
64
+
65
+ updateSelf() {
66
+ this.configProps = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as ObjectReferenceProps;
67
+ const {
68
+ displayMode,
69
+ allowAndPersistChangesInReviewMode: editableInReview = false,
70
+ targetObjectType,
71
+ mode,
72
+ parameters,
73
+ hideLabel,
74
+ inline,
75
+ showPromotedFilters
76
+ } = this.configProps;
77
+
78
+ const referenceType: string = targetObjectType === 'case' ? 'Case' : 'Data';
79
+ this.rawViewMetadata = this.pConn$.getRawMetadata();
80
+ const refFieldMetadata = this.pConn$.getFieldMetadata(this.rawViewMetadata?.config?.value?.split('.', 2)[1] ?? '');
81
+ const propsToUse = { ...this.pConn$.getInheritedProps(), ...this.configProps };
82
+
83
+ this.isDisplayModeEnabled = displayMode === 'DISPLAY_ONLY';
84
+ this.type = this.getComponentType();
85
+ this.canBeChangedInReviewMode = editableInReview && ['Autocomplete', 'Dropdown'].includes(this.type);
86
+
87
+ if (this.type === 'SemanticLink' && !this.canBeChangedInReviewMode) {
88
+ const config: any = {
89
+ ...this.rawViewMetadata?.config,
90
+ primaryField: (this.rawViewMetadata?.config as any).displayField,
91
+ caseClass: (this.rawViewMetadata?.config as any).targetObjectClass,
92
+ text: (this.rawViewMetadata?.config as any).displayField,
93
+ caseID: (this.rawViewMetadata?.config as any).value,
94
+ contextPage: `@P .${(this.rawViewMetadata?.config as any).displayField ? getDataRelationshipContextFromKey((this.rawViewMetadata?.config as any).displayField) : null}`,
95
+ resourceParams: { workID: (this.rawViewMetadata?.config as any).value },
96
+ resourcePayload: { caseClassName: (this.rawViewMetadata?.config as any).targetObjectClass }
97
+ };
98
+ this.createSemanticLinkPConnect(config, displayMode ?? '', referenceType, hideLabel);
99
+ return;
100
+ }
101
+
102
+ if (this.type !== 'SemanticLink' && !this.isDisplayModeEnabled) {
103
+ const config: any = { ...this.rawViewMetadata?.config };
104
+ generateColumns(config, this.pConn$, referenceType);
105
+ config.deferDatasource = true;
106
+ config.listType = 'datapage';
107
+ if (['Dropdown', 'AutoComplete'].includes(this.type) && !config.placeholder) {
108
+ config.placeholder = '@L Select...';
109
+ }
110
+ config.showPromotedFilters = showPromotedFilters;
111
+ if (!this.canBeChangedInReviewMode) {
112
+ config.displayMode = displayMode;
113
+ }
114
+ config.parameters = parameters;
115
+
116
+ this.createOtherComponentPConnect(config, propsToUse, mode, refFieldMetadata, referenceType, hideLabel, inline);
117
+ }
118
+ }
119
+
120
+ onRecordChange(value) {
121
+ const caseKey = this.pConn$.getCaseInfo().getKey() ?? '';
122
+ const refreshOptions = { autoDetectRefresh: true, propertyName: '' };
123
+ refreshOptions.propertyName = this.rawViewMetadata?.config?.value ?? '';
124
+
125
+ if (!this.canBeChangedInReviewMode || !this.pConn$.getValue('__currentPageTabViewName')) {
126
+ const pgRef = this.pConn$.getPageReference().replace('caseInfo.content', '') ?? '';
127
+ const viewName = this.rawViewMetadata?.name;
128
+ if (viewName && viewName.length > 0) {
129
+ getPConnect().getActionsApi().refreshCaseView(caseKey, viewName, pgRef, refreshOptions);
130
+ }
131
+ }
132
+
133
+ const propValue = value;
134
+ const propName =
135
+ this.rawViewMetadata?.type === 'SimpleTableSelect' && this.configProps.mode === 'multi'
136
+ ? PCore.getAnnotationUtils().getPropertyName(this.rawViewMetadata?.config?.selectionList ?? '')
137
+ : PCore.getAnnotationUtils().getPropertyName(this.rawViewMetadata?.config?.value ?? '');
138
+
139
+ if (propValue && this.canBeChangedInReviewMode && this.isDisplayModeEnabled) {
140
+ PCore.getCaseUtils()
141
+ .getCaseEditLock(caseKey, '')
142
+ .then(caseResponse => {
143
+ const pageTokens = this.pConn$.getPageReference().replace('caseInfo.content', '').split('.');
144
+ let curr = {};
145
+ const commitData = curr;
146
+
147
+ pageTokens?.forEach(el => {
148
+ if (el !== '') {
149
+ curr[el] = {};
150
+ curr = curr[el];
151
+ }
152
+ });
153
+
154
+ // expecting format like {Customer: {pyID:"C-100"}}
155
+ const propArr = propName.split('.');
156
+ propArr.forEach((element, idx) => {
157
+ if (idx + 1 === propArr.length) {
158
+ curr[element] = propValue;
159
+ } else {
160
+ curr[element] = {};
161
+ curr = curr[element];
162
+ }
163
+ });
164
+
165
+ PCore.getCaseUtils()
166
+ .updateCaseEditFieldsData(caseKey, { [caseKey]: commitData }, caseResponse.headers.etag, this.pConn$?.getContextName() ?? '')
167
+ .then(response => {
168
+ PCore.getContainerUtils().updateParentLastUpdateTime(this.pConn$.getContextName() ?? '', response.data.data.caseInfo.lastUpdateTime);
169
+ PCore.getContainerUtils().updateRelatedContextEtag(this.pConn$.getContextName() ?? '', response.headers.etag);
170
+ });
171
+ });
172
+ }
173
+ }
174
+
175
+ private getComponentType(): string {
176
+ // componentType is not defined in ComponentMetadataConfig type so using any
177
+ return (this.rawViewMetadata?.config as any)?.componentType;
178
+ }
179
+
180
+ private createSemanticLinkPConnect(config: any, displayMode: string, referenceType: string, hideLabel: boolean) {
181
+ const semanticLinkConfig = {
182
+ ...config,
183
+ displayMode,
184
+ referenceType,
185
+ hideLabel,
186
+ dataRelationshipContext: config.displayField ? getDataRelationshipContextFromKey(config.displayField) : null
187
+ };
188
+
189
+ const component = this.pConn$.createComponent({ type: 'SemanticLink', config: semanticLinkConfig }, '', 0, {});
190
+ this.newPconn = component?.getPConnect();
191
+ }
192
+
193
+ private createOtherComponentPConnect(
194
+ config: any,
195
+ propsToUse: any,
196
+ mode: string,
197
+ refFieldMetadata: any,
198
+ referenceType: string,
199
+ hideLabel: boolean,
200
+ inline: boolean
201
+ ) {
202
+ const fieldMetaData = {
203
+ datasourceMetadata: {
204
+ datasource: {
205
+ parameters: config.parameters ?? {},
206
+ propertyForDisplayText: config.datasource?.fields?.text?.substring(3) ?? config.datasource?.fields?.text,
207
+ propertyForValue: config.datasource?.fields?.value?.substring(3) ?? config.datasource?.fields?.value,
208
+ name: config.referenceList ?? ''
209
+ }
210
+ }
211
+ };
212
+
213
+ const componentConfig = {
214
+ ...config,
215
+ descriptors: mode === 'single' ? refFieldMetadata?.descriptors : null,
216
+ datasourceMetadata: fieldMetaData.datasourceMetadata,
217
+ required: propsToUse.required,
218
+ visibility: propsToUse.visibility,
219
+ disabled: propsToUse.disabled,
220
+ label: propsToUse.label,
221
+ readOnly: false,
222
+ ...(mode === 'single' && { referenceType }),
223
+ contextClass: config.targetObjectClass,
224
+ primaryField: config.displayField,
225
+ dataRelationshipContext: config.displayField ? getDataRelationshipContextFromKey(config.displayField) : null,
226
+ hideLabel,
227
+ inline
228
+ };
229
+
230
+ const component = this.pConn$.createComponent({ type: this.type, config: componentConfig }, '', 0, {});
231
+ this.newComponentName = component?.getPConnect().getComponentName();
232
+ this.newPconn = component?.getPConnect();
233
+ if (this.rawViewMetadata?.config) {
234
+ this.rawViewMetadata.config = { ...config };
235
+ }
236
+ }
237
+ }
@@ -1,5 +1,5 @@
1
1
  <div *ngIf="displayMode$; else noDisplayMode">
2
- <component-mapper *ngIf="bVisible$ !== false" name="FieldValueList" [props]="{ label$, value$, displayMode$ }"></component-mapper>
2
+ <component-mapper *ngIf="bVisible$ !== false" name="FieldValueList" [props]="{ label$, value$: formattedValue, displayMode$ }"></component-mapper>
3
3
  </div>
4
4
  <ng-template #noDisplayMode>
5
5
  <div *ngIf="bHasForm$; else noEdit">
@@ -13,8 +13,8 @@
13
13
  [options]="{
14
14
  prefix: '',
15
15
  suffix: '%',
16
- thousands: currSep,
17
- decimal: currDec,
16
+ thousands: thousandSeparator,
17
+ decimal: decimalSeparator,
18
18
  align: 'left',
19
19
  nullable: true,
20
20
  precision: decimalPrecision,
@@ -1,20 +1,22 @@
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
6
  import { NgxCurrencyDirective, NgxCurrencyInputMode } from 'ngx-currency';
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 } from '@pega/angular-sdk-components';
12
+ import { format } from '@pega/angular-sdk-components';
13
13
  import { PConnFieldProps } from '@pega/angular-sdk-components';
14
14
 
15
- interface PercentageProps extends PConnFieldProps {
15
+ interface PercentageProps extends Omit<PConnFieldProps, 'value'> {
16
+ value?: number;
16
17
  showGroupSeparators?: string;
17
18
  decimalPrecision?: number;
19
+ currencyISOCode?: string;
18
20
  // If any, enter additional props that only exist on Percentage here
19
21
  }
20
22
 
@@ -22,184 +24,89 @@ interface PercentageProps extends PConnFieldProps {
22
24
  selector: 'app-percentage',
23
25
  templateUrl: './percentage.component.html',
24
26
  styleUrls: ['./percentage.component.scss'],
25
- standalone: true,
26
27
  imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, NgxCurrencyDirective, forwardRef(() => ComponentMapperComponent)]
27
28
  })
28
- export class PercentageComponent implements OnInit, OnDestroy {
29
- @Input() pConn$: typeof PConnect;
30
- @Input() formGroup$: FormGroup;
31
-
32
- // Used with AngularPConnect
33
- angularPConnectData: AngularPConnectData = {};
29
+ export class PercentageComponent extends FieldBase {
34
30
  configProps$: PercentageProps;
31
+ override fieldControl = new FormControl<number | null>(null, null);
35
32
 
36
- label$ = '';
37
- value$: number;
38
- bRequired$ = false;
39
- bReadonly$ = false;
40
- bDisabled$ = false;
41
- bVisible$ = true;
42
- displayMode$?: string = '';
43
- controlName$: string;
44
- bHasForm$ = true;
45
- componentReference = '';
46
- testId: string;
47
- helperText: string;
48
- placeholder: string;
49
- currDec: string;
50
- currSep: string;
51
- inputMode: any;
33
+ decimalSeparator: string;
34
+ thousandSeparator: string;
35
+ inputMode: any = NgxCurrencyInputMode.Natural;
52
36
  decimalPrecision: number | undefined;
53
- fieldControl = new FormControl<number | null>(null, null);
54
-
55
- constructor(
56
- private angularPConnect: AngularPConnectService,
57
- private cdRef: ChangeDetectorRef,
58
- private utils: Utils
59
- ) {}
60
-
61
- ngOnInit(): void {
62
- // First thing in initialization is registering and subscribing to the AngularPConnect service
63
- this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
64
- this.controlName$ = this.angularPConnect.getComponentID(this);
65
-
66
- // Then, continue on with other initialization
67
- // call updateSelf when initializing
68
- // this.updateSelf();
69
- this.checkAndUpdate();
37
+ formattedValue: string;
70
38
 
71
- if (this.formGroup$) {
72
- // add control to formGroup
73
- this.formGroup$.addControl(this.controlName$, this.fieldControl);
74
- this.fieldControl.setValue(this.value$);
75
- this.bHasForm$ = true;
76
- } else {
77
- this.bReadonly$ = true;
78
- this.bHasForm$ = false;
79
- }
80
- }
39
+ /**
40
+ * Updates the component when there are changes in the state.
41
+ */
42
+ override updateSelf(): void {
43
+ // Resolve configuration properties
44
+ this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as PercentageProps;
81
45
 
82
- ngOnDestroy(): void {
83
- if (this.formGroup$) {
84
- this.formGroup$.removeControl(this.controlName$);
85
- }
46
+ // Update component common properties
47
+ this.updateComponentCommonProperties(this.configProps$);
86
48
 
87
- if (this.angularPConnectData.unsubscribeFn) {
88
- this.angularPConnectData.unsubscribeFn();
49
+ // Set component specific properties
50
+ const { value } = this.configProps$;
51
+ if (value) {
52
+ this.value$ = value;
53
+ this.fieldControl.setValue(value);
89
54
  }
90
- }
91
55
 
92
- // Callback passed when subscribing to store change
93
- onStateChange() {
94
- this.checkAndUpdate();
56
+ // update percentage properties
57
+ this.updatePercentageProperties(this.configProps$);
95
58
  }
96
59
 
97
- checkAndUpdate() {
98
- // Should always check the bridge to see if the component should
99
- // update itself (re-render)
100
- const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
101
-
102
- // ONLY call updateSelf when the component should update
103
- if (bUpdateSelf) {
104
- this.updateSelf();
105
- }
106
- }
107
-
108
- // updateSelf
109
- updateSelf(): void {
110
- // moved this from ngOnInit() and call this from there instead...
111
- this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as PercentageProps;
112
- this.testId = this.configProps$.testId;
113
- this.label$ = this.configProps$.label;
114
- this.displayMode$ = this.configProps$.displayMode;
115
- this.inputMode = NgxCurrencyInputMode.Natural;
116
- let nValue: any = this.configProps$.value;
117
- if (nValue) {
118
- if (typeof nValue === 'string') {
119
- nValue = parseInt(nValue, 10);
120
- }
121
- this.value$ = nValue;
122
- }
123
- this.helperText = this.configProps$.helperText;
124
- this.placeholder = this.configProps$.placeholder || '';
125
- const showGroupSeparators = this.configProps$.showGroupSeparators;
60
+ /**
61
+ * Updates the percentage properties
62
+ *
63
+ * @param {Object} configProps - Configuration properties.
64
+ * @param {boolean} configProps.showGroupSeparators - Whether to show group separators.
65
+ * @param {number} configProps.decimalPrecision - The number of decimal places to display.
66
+ */
67
+ updatePercentageProperties(configProps): void {
68
+ const { showGroupSeparators, decimalPrecision } = configProps;
126
69
 
127
70
  const theSymbols = getCurrencyCharacters('');
128
- this.currDec = theSymbols.theDecimalIndicator || '2';
129
- this.currSep = showGroupSeparators ? theSymbols.theDigitGroupSeparator : '';
130
-
131
- // timeout and detectChanges to avoid ExpressionChangedAfterItHasBeenCheckedError
132
- setTimeout(() => {
133
- if (this.configProps$.required != null) {
134
- this.bRequired$ = this.utils.getBooleanValue(this.configProps$.required);
135
- }
136
- this.cdRef.detectChanges();
137
- });
71
+ this.decimalSeparator = theSymbols.theDecimalIndicator;
72
+ this.thousandSeparator = showGroupSeparators ? theSymbols.theDigitGroupSeparator : '';
73
+ this.decimalPrecision = decimalPrecision ?? 2;
138
74
 
139
- if (this.configProps$.visibility != null) {
140
- this.bVisible$ = this.utils.getBooleanValue(this.configProps$.visibility);
141
- }
142
-
143
- // disabled
144
- if (this.configProps$.disabled != undefined) {
145
- this.bDisabled$ = this.utils.getBooleanValue(this.configProps$.disabled);
146
- }
147
-
148
- if (this.bDisabled$) {
149
- this.fieldControl.disable();
150
- } else {
151
- this.fieldControl.enable();
152
- }
153
-
154
- if (this.configProps$.readOnly != null) {
155
- this.bReadonly$ = this.utils.getBooleanValue(this.configProps$.readOnly);
156
- }
157
-
158
- this.decimalPrecision = this.configProps$?.decimalPrecision ?? 2;
159
-
160
- this.componentReference = (this.pConn$.getStateProps() as any).value;
161
-
162
- // trigger display of error message with field control
163
- if (this.angularPConnectData.validateMessage != null && this.angularPConnectData.validateMessage != '') {
164
- const timer = interval(100).subscribe(() => {
165
- this.fieldControl.setErrors({ message: true });
166
- this.fieldControl.markAsTouched();
167
- timer.unsubscribe();
168
- });
75
+ if (['DISPLAY_ONLY', 'STACKED_LARGE_VAL'].includes(this.displayMode$)) {
76
+ this.formattedValue = this.value$ ? format(this.value$, 'percentage') : '';
169
77
  }
170
78
  }
171
79
 
172
80
  fieldOnChange(event: any) {
173
- this.angularPConnectData.actions?.onChange(this, event);
174
- }
81
+ const oldVal = this.value$ ?? '';
82
+ const isValueChanged = event.target.value.toString() !== oldVal.toString();
175
83
 
176
- fieldOnBlur(event: any) {
177
- const actionsApi = this.pConn$?.getActionsApi();
178
- const propName = (this.pConn$?.getStateProps() as any).value;
179
- let value = event?.target?.value;
180
- value = value ? value.replace(/%/g, '') : '';
181
- if (this.currSep === ',') {
182
- value = value.replace(/,/g, '');
183
- } else {
184
- value = value?.replace(/\./g, '');
185
- value = value?.replace(/,/g, '.');
84
+ if (isValueChanged) {
85
+ this.pConn$.clearErrorMessages({
86
+ property: this.propName
87
+ });
186
88
  }
187
- handleEvent(actionsApi, 'changeNblur', propName, value);
188
89
  }
189
90
 
190
- getErrorMessage() {
191
- // field control gets error message from here
192
- let errMessage = '';
193
- // look for validation messages for json, pre-defined or just an error pushed from workitem (400)
194
- if (this.fieldControl.hasError('message')) {
195
- errMessage = this.angularPConnectData.validateMessage ?? '';
196
- return errMessage;
197
- }
198
- if (this.fieldControl.hasError('required')) {
199
- errMessage = 'You must enter a value';
200
- } else if (this.fieldControl.errors) {
201
- errMessage = this.fieldControl.errors.toString();
91
+ fieldOnBlur(event: any) {
92
+ const oldVal = this.value$ ?? '';
93
+ const isValueChanged = event.target.value.toString() !== oldVal.toString();
94
+
95
+ if (isValueChanged) {
96
+ let value = event?.target?.value;
97
+ value = value ? value.replace(/%/g, '') : '';
98
+ // replacing thousand separator with empty string as not required in api call
99
+ if (this.configProps$.showGroupSeparators) {
100
+ const thousandSep = this.thousandSeparator === '.' ? '\\.' : this.thousandSeparator;
101
+ const regExp = new RegExp(String.raw`${thousandSep}`, 'g');
102
+ value = value?.replace(regExp, '');
103
+ }
104
+ // replacing decimal separator with '.'
105
+ if (this.decimalSeparator !== '.') {
106
+ const regExp = new RegExp(String.raw`${this.decimalSeparator}`, 'g');
107
+ value = value.replace(regExp, '.');
108
+ }
109
+ handleEvent(this.actionsApi, 'changeNblur', this.propName, value);
202
110
  }
203
- return errMessage;
204
111
  }
205
112
  }
@@ -3,6 +3,6 @@
3
3
  "label": "Phone",
4
4
  "description": "Phone",
5
5
  "type": "Field",
6
- "subtype": "DATA_CAPTURE",
6
+ "subtype": "Text-Phone",
7
7
  "properties": []
8
8
  }
@@ -2,19 +2,22 @@
2
2
  <component-mapper *ngIf="bVisible$ !== false" name="FieldValueList" [props]="{ label$, value$, displayMode$ }"></component-mapper>
3
3
  </div>
4
4
  <ng-template #noDisplayMode>
5
- <div *ngIf="!bReadonly$ && bHasForm$; else noEdit">
5
+ <div *ngIf="bHasForm$; else noEdit">
6
6
  <div #f="ngForm" [formGroup]="formGroup$" *ngIf="bVisible$">
7
- <mat-form-field class="psdk-full-width" subscriptSizing="dynamic" [hintLabel]="helperText">
8
- <ngx-mat-intl-tel-input
7
+ <mat-form-field class="psdk-full-width" subscriptSizing="dynamic" [hintLabel]="helperText" floatLabel="always">
8
+ <mat-tel-input
9
9
  [attr.data-test-id]="testId"
10
10
  [formControl]="fieldControl"
11
- [preferredCountries]="['us']"
11
+ [preferredCountries]="preferredCountries"
12
12
  [enablePlaceholder]="true"
13
13
  [enableSearch]="true"
14
+ [placeholder]="placeholder"
15
+ [required]="bRequired$"
16
+ [disabled]="bDisabled$ || bReadonly$"
14
17
  (change)="fieldOnChange()"
15
- (blur)="fieldOnBlur($event)"
18
+ (blur)="fieldOnBlur()"
16
19
  >
17
- </ngx-mat-intl-tel-input>
20
+ </mat-tel-input>
18
21
  <mat-label>{{ label$ }}</mat-label>
19
22
  <mat-error *ngIf="fieldControl.invalid">{{ getErrorMessage() }}</mat-error>
20
23
  </mat-form-field>
@@ -24,6 +24,15 @@
24
24
  font-size: 0.7rem;
25
25
  }
26
26
 
27
+ ::ng-deep .cdk-overlay-pane {
28
+ left: 32rem !important;
29
+ top: 20rem !important;
30
+ }
31
+
32
+ ::ng-deep .mat-mdc-menu-panel {
33
+ max-width: 20rem;
34
+ }
35
+
27
36
  // ::ng-deep .iti {
28
37
  // display: block !important;
29
38
  // margin-bottom: 20px;