@pega/angular-sdk-overrides 0.25.1 → 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 (160) hide show
  1. package/lib/designSystemExtension/alert/alert.component.scss +3 -3
  2. package/lib/designSystemExtension/banner/banner.component.scss +12 -2
  3. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.html +6 -3
  4. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.scss +5 -34
  5. package/lib/designSystemExtension/material-details/material-details.component.scss +0 -5
  6. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.html +2 -2
  7. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.scss +4 -3
  8. package/lib/designSystemExtension/material-summary-item/material-summary-item.component.scss +2 -17
  9. package/lib/designSystemExtension/material-utility/material-utility.component.scss +1 -2
  10. package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.scss +1 -1
  11. package/lib/designSystemExtension/operator/operator.component.html +1 -1
  12. package/lib/designSystemExtension/operator/operator.component.scss +3 -10
  13. package/lib/designSystemExtension/operator/operator.component.ts +0 -1
  14. package/lib/designSystemExtension/pulse/pulse.component.scss +2 -2
  15. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.scss +0 -1
  16. package/lib/designSystemExtension/wss-quick-create/wss-quick-create.component.scss +16 -8
  17. package/lib/field/auto-complete/auto-complete.component.html +0 -1
  18. package/lib/field/auto-complete/auto-complete.component.ts +35 -172
  19. package/lib/field/cancel-alert/cancel-alert.component.html +8 -12
  20. package/lib/field/cancel-alert/cancel-alert.component.scss +2 -3
  21. package/lib/field/cancel-alert/cancel-alert.component.ts +24 -36
  22. package/lib/field/check-box/check-box.component.html +0 -1
  23. package/lib/field/check-box/check-box.component.scss +0 -1
  24. package/lib/field/check-box/check-box.component.ts +19 -149
  25. package/lib/field/currency/currency.component.ts +36 -168
  26. package/lib/field/date/date.component.html +1 -1
  27. package/lib/field/date/date.component.ts +30 -150
  28. package/lib/field/date-time/date-time.component.ts +31 -149
  29. package/lib/field/decimal/decimal.component.ts +38 -163
  30. package/lib/field/dropdown/dropdown.component.ts +29 -151
  31. package/lib/field/email/email.component.ts +16 -155
  32. package/lib/field/field.base.ts +149 -0
  33. package/lib/field/group/group.component.ts +7 -4
  34. package/lib/field/integer/integer.component.ts +18 -157
  35. package/lib/field/location/location.component.ts +1 -1
  36. package/lib/field/multiselect/multiselect.component.ts +46 -148
  37. package/lib/field/multiselect/utils.ts +55 -47
  38. package/lib/field/object-reference/object-reference.component.html +17 -0
  39. package/lib/field/object-reference/object-reference.component.scss +0 -0
  40. package/lib/field/object-reference/object-reference.component.spec.ts +22 -0
  41. package/lib/field/object-reference/object-reference.component.ts +237 -0
  42. package/lib/field/percentage/percentage.component.ts +37 -154
  43. package/lib/field/phone/phone.component.ts +28 -142
  44. package/lib/field/radio-buttons/radio-buttons.component.scss +4 -2
  45. package/lib/field/radio-buttons/radio-buttons.component.ts +35 -161
  46. package/lib/field/rich-text/rich-text.component.ts +19 -90
  47. package/lib/field/scalar-list/scalar-list.component.ts +17 -72
  48. package/lib/field/selectable-card/selectable-card.component.html +54 -24
  49. package/lib/field/selectable-card/selectable-card.component.scss +11 -0
  50. package/lib/field/selectable-card/selectable-card.component.ts +16 -52
  51. package/lib/field/semantic-link/semantic-link.component.html +4 -8
  52. package/lib/field/semantic-link/semantic-link.component.scss +0 -13
  53. package/lib/field/semantic-link/semantic-link.component.ts +165 -5
  54. package/lib/field/text/text.component.scss +0 -1
  55. package/lib/field/text-area/text-area.component.ts +18 -152
  56. package/lib/field/text-input/text-input.component.ts +16 -155
  57. package/lib/field/time/time.component.ts +17 -151
  58. package/lib/field/url/url.component.ts +16 -154
  59. package/lib/field/user-reference/user-reference.component.scss +0 -1
  60. package/lib/field/user-reference/user-reference.component.ts +2 -3
  61. package/lib/infra/Containers/flow-container/flow-container.component.ts +5 -7
  62. package/lib/infra/Containers/modal-view-container/modal-view-container.component.ts +5 -10
  63. package/lib/infra/Containers/view-container/helper.ts +35 -2
  64. package/lib/infra/Containers/view-container/view-container.component.ts +1 -1
  65. package/lib/infra/action-buttons/action-buttons.component.html +13 -8
  66. package/lib/infra/action-buttons/action-buttons.component.scss +23 -0
  67. package/lib/infra/action-buttons/action-buttons.component.ts +1 -2
  68. package/lib/infra/assignment/assignment.component.ts +8 -6
  69. package/lib/infra/assignment-card/assignment-card.component.html +1 -2
  70. package/lib/infra/assignment-card/assignment-card.component.scss +0 -4
  71. package/lib/infra/assignment-card/assignment-card.component.ts +21 -4
  72. package/lib/infra/defer-load/defer-load.component.html +6 -2
  73. package/lib/infra/defer-load/defer-load.component.ts +16 -10
  74. package/lib/infra/multi-step/multi-step.component.scss +1 -21
  75. package/lib/infra/navbar/navbar.component.html +25 -28
  76. package/lib/infra/navbar/navbar.component.scss +16 -4
  77. package/lib/infra/navbar/navbar.component.ts +8 -3
  78. package/lib/infra/root-container/root-container.component.scss +0 -1
  79. package/lib/infra/root-container/root-container.component.ts +1 -2
  80. package/lib/infra/stages/stages.component.html +2 -2
  81. package/lib/infra/stages/stages.component.scss +7 -35
  82. package/lib/infra/stages/stages.component.ts +4 -2
  83. package/lib/infra/view/view.component.html +1 -1
  84. package/lib/infra/view/view.component.ts +0 -2
  85. package/lib/template/advanced-search/advanced-search.component.html +12 -0
  86. package/lib/template/advanced-search/advanced-search.component.scss +0 -0
  87. package/lib/template/advanced-search/advanced-search.component.spec.ts +0 -0
  88. package/lib/template/advanced-search/advanced-search.component.ts +112 -0
  89. package/lib/template/advanced-search/advanced-search.service.ts +27 -0
  90. package/lib/template/advanced-search/search-group/persist-utils.ts +56 -0
  91. package/lib/template/advanced-search/search-groups/search-groups.component.html +32 -0
  92. package/lib/template/advanced-search/search-groups/search-groups.component.scss +0 -0
  93. package/lib/template/advanced-search/search-groups/search-groups.component.spec.ts +0 -0
  94. package/lib/template/advanced-search/search-groups/search-groups.component.ts +294 -0
  95. package/lib/template/advanced-search/search-groups/utils.ts +29 -0
  96. package/lib/template/app-shell/app-shell.component.html +4 -1
  97. package/lib/template/app-shell/app-shell.component.scss +0 -3
  98. package/lib/template/app-shell/app-shell.component.ts +46 -7
  99. package/lib/template/case-summary/case-summary.component.scss +0 -2
  100. package/lib/template/case-view/case-view.component.html +3 -3
  101. package/lib/template/case-view/case-view.component.scss +18 -10
  102. package/lib/template/case-view/case-view.component.ts +1 -1
  103. package/lib/template/data-reference/data-reference-advanced-search.service.ts +16 -0
  104. package/lib/template/data-reference/data-reference.component.html +11 -8
  105. package/lib/template/data-reference/data-reference.component.ts +346 -112
  106. package/lib/template/data-reference/search-form/search-form.component.html +39 -0
  107. package/lib/template/data-reference/search-form/search-form.component.scss +11 -0
  108. package/lib/template/data-reference/search-form/search-form.component.spec.ts +0 -0
  109. package/lib/template/data-reference/search-form/search-form.component.ts +167 -0
  110. package/lib/template/data-reference/search-form/tabsData.ts +160 -0
  111. package/lib/template/data-reference/utils.ts +92 -0
  112. package/lib/template/default-form/default-form.component.ts +10 -2
  113. package/lib/template/default-page/default-page.component.html +34 -0
  114. package/lib/template/default-page/default-page.component.scss +31 -0
  115. package/lib/template/default-page/default-page.component.spec.ts +24 -0
  116. package/lib/template/default-page/default-page.component.ts +64 -0
  117. package/lib/template/field-group-list/field-group-list.component.scss +0 -1
  118. package/lib/template/inline-dashboard-page/inline-dashboard-page.component.ts +1 -1
  119. package/lib/template/list-view/list-view.component.html +9 -4
  120. package/lib/template/list-view/list-view.component.scss +21 -21
  121. package/lib/template/list-view/list-view.component.ts +154 -84
  122. package/lib/template/list-view/utils.ts +25 -2
  123. package/lib/template/object-page/object-page.component.html +1 -0
  124. package/lib/template/object-page/object-page.component.scss +0 -0
  125. package/lib/template/object-page/object-page.component.spec.ts +22 -0
  126. package/lib/template/object-page/object-page.component.ts +14 -0
  127. package/lib/template/one-column-tab/one-column-tab.component.scss +1 -1
  128. package/lib/template/repeating-structures/repeating-structures.component.ts +0 -1
  129. package/lib/template/self-service-case-view/self-service-case-view.component.html +80 -0
  130. package/lib/template/self-service-case-view/self-service-case-view.component.scss +124 -0
  131. package/lib/template/self-service-case-view/self-service-case-view.component.spec.ts +24 -0
  132. package/lib/template/self-service-case-view/self-service-case-view.component.ts +216 -0
  133. package/lib/template/simple-table/simple-table.component.ts +0 -1
  134. package/lib/template/simple-table-manual/helpers.ts +2 -2
  135. package/lib/template/simple-table-manual/simple-table-manual.component.html +4 -4
  136. package/lib/template/simple-table-manual/simple-table-manual.component.scss +4 -14
  137. package/lib/template/simple-table-manual/simple-table-manual.component.ts +8 -4
  138. package/lib/template/single-reference-readonly/single-reference-readonly.component.html +4 -1
  139. package/lib/template/single-reference-readonly/single-reference-readonly.component.scss +21 -0
  140. package/lib/template/single-reference-readonly/single-reference-readonly.component.ts +104 -3
  141. package/lib/template/utils.ts +42 -0
  142. package/lib/template/wss-nav-bar/wss-nav-bar.component.html +5 -4
  143. package/lib/template/wss-nav-bar/wss-nav-bar.component.scss +2 -8
  144. package/lib/template/wss-nav-bar/wss-nav-bar.component.ts +1 -8
  145. package/lib/widget/app-announcement/app-announcement.component.html +1 -2
  146. package/lib/widget/app-announcement/app-announcement.component.scss +2 -2
  147. package/lib/widget/attachment/Attachment.types.ts +92 -0
  148. package/lib/widget/attachment/AttachmentUtils.ts +287 -0
  149. package/lib/widget/attachment/attachment.component.html +3 -3
  150. package/lib/widget/attachment/attachment.component.scss +2 -5
  151. package/lib/widget/attachment/attachment.component.ts +255 -254
  152. package/lib/widget/feed-container/feed-container.component.scss +3 -9
  153. package/lib/widget/feed-container/feed-container.component.ts +2 -2
  154. package/lib/widget/file-utility/file-utility.component.html +3 -3
  155. package/lib/widget/file-utility/file-utility.component.scss +5 -16
  156. package/lib/widget/list-utility/list-utility.component.scss +3 -5
  157. package/lib/widget/todo/todo.component.html +8 -5
  158. package/lib/widget/todo/todo.component.scss +10 -11
  159. package/lib/widget/todo/todo.component.ts +6 -2
  160. package/package.json +1 -1
@@ -3,6 +3,10 @@ import { CommonModule } from '@angular/common';
3
3
  import { FormGroup } from '@angular/forms';
4
4
  import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
5
5
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
6
+ import { getMappedKey } from '@pega/angular-sdk-components';
7
+ import { componentCachePersistUtils } from '@pega/angular-sdk-components';
8
+ import { getFirstChildConfig } from '@pega/angular-sdk-components';
9
+ import { DataReferenceAdvancedSearchService } from './data-reference-advanced-search.service';
6
10
 
7
11
  const SELECTION_MODE = { SINGLE: 'single', MULTI: 'multi' };
8
12
 
@@ -38,46 +42,71 @@ export class DataReferenceComponent implements OnInit, OnDestroy {
38
42
  displaySingleRef: boolean;
39
43
  displayMultiRef: boolean;
40
44
  refList: any;
45
+ displayAs: any;
46
+ isDDSourceDeferred: any;
47
+ showPromotedFilters: any;
48
+ displayMode: any;
49
+ refFieldMetadata: any;
50
+ contextClass: any;
51
+ selectionList: any;
52
+ inline: any;
53
+ isCreationOfNewRecordAllowedForReference: any;
54
+ showAdvancedSearch: boolean;
55
+ pyID: any;
56
+ allowImplicitRefresh: any;
57
+ displayChild = false;
58
+ dataRelationshipContext: any;
59
+ imagePosition: any;
60
+ showImageDescription: any;
41
61
 
42
- constructor(private angularPConnect: AngularPConnectService) {}
62
+ constructor(
63
+ private angularPConnect: AngularPConnectService,
64
+ private advancedSearchService: DataReferenceAdvancedSearchService
65
+ ) {}
43
66
 
44
67
  ngOnInit(): void {
45
68
  // First thing in initialization is registering and subscribing to the AngularPConnect service
46
69
  this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
47
70
  this.children = this.pConn$.getChildren();
48
71
  this.updateSelf();
49
- if (this.firstChildMeta?.type === 'Dropdown' && this.rawViewMetadata.config?.parameters) {
72
+
73
+ if (
74
+ this.rawViewMetadata.config?.parameters &&
75
+ !this.isDDSourceDeferred &&
76
+ ['Checkbox', 'Dropdown', 'RadioButtons'].includes(this.firstChildMeta?.type)
77
+ ) {
50
78
  const { value, key, text } = this.firstChildMeta.config.datasource.fields;
51
- PCore.getDataApiUtils()
52
- .getData(
53
- this.refList,
54
- {
79
+
80
+ if (this.firstChildMeta.config.variant !== 'card' || this.firstChildMeta.config.variant === 'card') {
81
+ PCore.getDataApiUtils()
82
+ .getData(this.refList, {
55
83
  dataViewParameters: this.parameters
56
- },
57
- ''
58
- )
59
- .then(res => {
60
- if (res.data.data !== null) {
61
- const ddDataSource = res.data.data
62
- .map(listItem => ({
63
- key: listItem[key.split(' .', 2)[1]],
64
- text: listItem[text.split(' .', 2)[1]],
65
- value: listItem[value.split(' .', 2)[1]]
66
- }))
67
- .filter(item => item.key);
68
- // Filtering out undefined entries that will break preview
69
- this.dropDownDataSource = ddDataSource;
70
- this.updateSelf();
71
- } else {
72
- const ddDataSource: any = [];
73
- this.dropDownDataSource = ddDataSource;
74
- }
75
- })
76
- .catch(() => {
77
- return Promise.resolve({
78
- data: { data: [] }
84
+ })
85
+ .then(res => {
86
+ if (res.data.data !== null) {
87
+ const ddDataSource = this.firstChildMeta.config.datasource.filterDownloadedFields
88
+ ? res.data.data
89
+ : res.data.data
90
+ .map(listItem => ({
91
+ key: listItem[key.split(' .', 2)[1]],
92
+ text: listItem[text.split(' .', 2)[1]],
93
+ value: listItem[value.split(' .', 2)[1]]
94
+ }))
95
+ .filter(item => item.key); // Filtering out undefined entries
96
+ this.dropDownDataSource = ddDataSource;
97
+ this.updateSelf();
98
+ } else {
99
+ const ddDataSource: any = [];
100
+ this.dropDownDataSource = ddDataSource;
101
+ }
102
+ })
103
+ .catch(err => {
104
+ console.error(err?.stack);
105
+ return Promise.resolve({
106
+ data: { data: [] }
107
+ });
79
108
  });
80
- });
109
+ }
81
110
  }
82
111
  }
83
112
 
@@ -104,47 +133,59 @@ export class DataReferenceComponent implements OnInit, OnDestroy {
104
133
  const theConfigProps = this.pConn$.getConfigProps();
105
134
  this.updatePropertiesFromProps(theConfigProps);
106
135
 
107
- const displayAs = theConfigProps.displayAs;
108
- const displayMode = theConfigProps.displayMode;
136
+ const { displayAs, displayMode } = theConfigProps;
109
137
  this.rawViewMetadata = this.pConn$.getRawMetadata();
110
138
  this.viewName = this.rawViewMetadata.name;
111
139
  this.firstChildMeta = this.rawViewMetadata.children[0];
112
140
  this.refList = this.rawViewMetadata.config.referenceList;
113
- this.canBeChangedInReviewMode = theConfigProps.allowAndPersistChangesInReviewMode && (displayAs === 'autocomplete' || displayAs === 'dropdown');
114
- // this.childrenToRender = this.children;
141
+ this.dataRelationshipContext =
142
+ this.rawViewMetadata.config.contextClass && this.rawViewMetadata.config.name ? this.rawViewMetadata.config.name : null;
143
+ this.canBeChangedInReviewMode = theConfigProps.allowAndPersistChangesInReviewMode && ['autocomplete', 'dropdown'].includes(displayAs);
115
144
  this.isDisplayModeEnabled = ['DISPLAY_ONLY', 'STACKED_LARGE_VAL'].includes(displayMode);
145
+ this.refFieldMetadata = this.pConn$.getFieldMetadata(this.rawViewMetadata?.config?.authorContext);
146
+ this.pyID = getMappedKey('pyID');
147
+ // @ts-ignore
148
+ const { allowImplicitRefresh } = PCore.getFieldDefaultUtils().fieldDefaults?.DataReference || {};
116
149
 
117
- if (this.firstChildMeta?.type !== 'Region') {
118
- this.firstChildPConnect = this.pConn$.getChildren()[0].getPConnect;
150
+ this.allowImplicitRefresh = allowImplicitRefresh;
151
+ this.isDDSourceDeferred =
152
+ (this.firstChildMeta?.type === 'Dropdown' && this.selectionMode === SELECTION_MODE.SINGLE && this.refFieldMetadata?.descriptors) ||
153
+ this.firstChildMeta.config.deferDatasource;
119
154
 
120
- /* remove refresh When condition from those old view so that it will not be used for runtime */
121
- if (this.firstChildMeta.config?.readOnly) {
122
- delete this.firstChildMeta.config.readOnly;
123
- }
124
- if (this.firstChildMeta?.type === 'Dropdown') {
125
- this.firstChildMeta.config.datasource.source = this.rawViewMetadata.config?.parameters
126
- ? this.dropDownDataSource
127
- : '@DATASOURCE '.concat(this.refList).concat('.pxResults');
128
- } else if (this.firstChildMeta?.type === 'AutoComplete') {
129
- this.firstChildMeta.config.datasource = this.refList;
130
-
131
- /* Insert the parameters to the component only if present */
132
- if (this.rawViewMetadata.config?.parameters) {
133
- this.firstChildMeta.config.parameters = this.parameters;
134
- }
135
- }
136
- // set displayMode conditionally
137
- if (!this.canBeChangedInReviewMode) {
138
- this.firstChildMeta.config.displayMode = displayMode;
139
- }
140
- if (this.firstChildMeta.type === 'SimpleTableSelect' && this.selectionMode === SELECTION_MODE.MULTI) {
141
- this.propName = PCore.getAnnotationUtils().getPropertyName(this.firstChildMeta.config.selectionList);
142
- } else {
143
- this.propName = PCore.getAnnotationUtils().getPropertyName(this.firstChildMeta.config.value);
144
- }
155
+ if (this.firstChildMeta?.type === 'Region') {
156
+ return;
157
+ }
158
+
159
+ this.firstChildPConnect = this.pConn$.getChildren()[0].getPConnect;
145
160
 
146
- this.generateChildrenToRender();
161
+ /* remove refresh When condition from those old view so that it will not be used for runtime */
162
+ if (this.firstChildMeta.config?.readOnly) {
163
+ delete this.firstChildMeta.config.readOnly;
164
+ }
165
+ if (this.firstChildMeta?.type === 'Dropdown') {
166
+ this.firstChildMeta.config.datasource.source = this.rawViewMetadata.config?.parameters
167
+ ? this.dropDownDataSource
168
+ : '@DATASOURCE '.concat(this.refList).concat('.pxResults');
169
+ } else if (this.firstChildMeta?.type === 'AutoComplete') {
170
+ this.firstChildMeta.config.datasource = this.refList;
171
+
172
+ /* Insert the parameters to the component only if present */
173
+ if (this.rawViewMetadata.config?.parameters) {
174
+ this.firstChildMeta.config.parameters = this.parameters;
175
+ }
176
+ }
177
+ // set displayMode conditionally
178
+ if (!this.canBeChangedInReviewMode) {
179
+ this.firstChildMeta.config.displayMode = displayMode;
180
+ }
181
+ if (this.firstChildMeta.type === 'SimpleTableSelect' && this.selectionMode === SELECTION_MODE.MULTI) {
182
+ this.propName = PCore.getAnnotationUtils().getPropertyName(this.firstChildMeta.config.selectionList);
183
+ } else {
184
+ this.propName = PCore.getAnnotationUtils().getPropertyName(this.firstChildMeta.config.value);
147
185
  }
186
+
187
+ this.generateChildrenToRender();
188
+ this.displayChild = !(this.displaySingleRef || this.displayMultiRef);
148
189
  }
149
190
 
150
191
  updatePropertiesFromProps(theConfigProps) {
@@ -154,38 +195,81 @@ export class DataReferenceComponent implements OnInit, OnDestroy {
154
195
  this.selectionMode = theConfigProps.selectionMode;
155
196
  this.parameters = theConfigProps.parameters;
156
197
  this.hideLabel = theConfigProps.hideLabel;
157
-
198
+ this.displayAs = theConfigProps.displayAs;
199
+ this.showPromotedFilters = theConfigProps.showPromotedFilters;
200
+ this.displayMode = theConfigProps.displayMode;
158
201
  this.propsToUse = { label, showLabel, ...this.pConn$.getInheritedProps() };
202
+ this.contextClass = theConfigProps.contextClass;
203
+ this.selectionList = theConfigProps.selectionList;
204
+ this.inline = theConfigProps.inline;
205
+ this.isCreationOfNewRecordAllowedForReference = theConfigProps.isCreationOfNewRecordAllowedForReference;
159
206
  if (this.propsToUse.showLabel === false) {
160
207
  this.propsToUse.label = '';
161
208
  }
209
+ this.imagePosition = theConfigProps.imagePosition;
210
+ this.showImageDescription = theConfigProps.showImageDescription;
162
211
  }
163
212
 
164
213
  generateChildrenToRender() {
165
214
  const theRecreatedFirstChild = this.recreatedFirstChild();
166
- const viewsRegion = this.rawViewMetadata.children[1];
167
- if (viewsRegion?.name === 'Views' && viewsRegion.children.length) {
168
- this.childrenToRender = [theRecreatedFirstChild, ...this.children.slice(1)];
169
- } else {
215
+ if (this.firstChildMeta?.type !== 'Region') {
216
+ const viewsRegion = this.rawViewMetadata.children[1];
217
+
218
+ if (viewsRegion?.name === 'Views' && viewsRegion.children.length) {
219
+ viewsRegion.children.map(child => {
220
+ child.config.isEmbeddedInDataReference = true;
221
+ return child;
222
+ });
223
+ this.childrenToRender = [theRecreatedFirstChild, ...this.children.slice(1)];
224
+ } else {
225
+ this.childrenToRender = [theRecreatedFirstChild];
226
+ }
227
+ } else if (this.displayAs === 'advancedSearch') {
170
228
  this.childrenToRender = [theRecreatedFirstChild];
171
229
  }
230
+
231
+ // Render
232
+ if (this.childrenToRender.length === 1) {
233
+ return this.childrenToRender[0] ?? null;
234
+ }
172
235
  }
173
236
 
174
237
  handleSelection(event) {
175
238
  const caseKey = this.pConn$.getCaseInfo().getKey();
176
- const refreshOptions = { autoDetectRefresh: true };
177
- if (this.canBeChangedInReviewMode && this.pConn$.getValue('__currentPageTabViewName')) {
178
- this.pConn$.getActionsApi().refreshCaseView(caseKey, this.pConn$.getValue('__currentPageTabViewName'), '', refreshOptions);
179
- PCore.getDeferLoadManager().refreshActiveComponents(this.pConn$.getContextName());
180
- } else {
181
- const pgRef = this.pConn$.getPageReference().replace('caseInfo.content', '');
182
- this.pConn$.getActionsApi().refreshCaseView(caseKey, this.viewName, pgRef, refreshOptions);
239
+ const refreshOptions: any = { autoDetectRefresh: true, propertyName: '' };
240
+
241
+ if ((this.pConn$?.getRawMetadata()?.children as Array<any>)?.length > 0 && this.pConn$?.getRawMetadata()?.children?.[0].config?.value) {
242
+ refreshOptions.propertyName = this.pConn$?.getRawMetadata()?.children?.[0].config.value;
243
+ refreshOptions.classID = (this.pConn$.getRawMetadata() as any).classID;
183
244
  }
184
245
 
185
- // AutoComplete sets value on event.id whereas Dropdown sets it on event.target.value
246
+ // AutoComplete sets value on event.id whereas Dropdown sets it on event.target.value if event.id is unset
247
+ // When value is empty propValue will be undefined here and no value will be set for the reference
186
248
  const propValue = event?.id || event?.target?.value;
187
- if (propValue && this.canBeChangedInReviewMode && this.isDisplayModeEnabled) {
188
- PCore.getDataApiUtils()
249
+ const propName =
250
+ this.firstChildMeta.type === 'SimpleTableSelect' && this.selectionMode === SELECTION_MODE.MULTI
251
+ ? PCore.getAnnotationUtils().getPropertyName(this.firstChildMeta.config.selectionList)
252
+ : PCore.getAnnotationUtils().getPropertyName(this.firstChildMeta.config.value);
253
+
254
+ const hasAssociatedViewConfigured = this.rawViewMetadata.children[1].children?.length;
255
+
256
+ if (this.pConn$.getContextName().includes('modal') || this.pConn$.getContextName().includes('workarea')) {
257
+ if (hasAssociatedViewConfigured || this.allowImplicitRefresh) {
258
+ const pageReference = this.pConn$.getPageReference();
259
+ let pgRef: any = null;
260
+ if (pageReference.startsWith('objectInfo')) {
261
+ pgRef = pageReference.replace('objectInfo.content', '');
262
+ } else {
263
+ pgRef = pageReference.replace('caseInfo.content', '');
264
+ }
265
+ const viewName = this.rawViewMetadata.name;
266
+ this.pConn$
267
+ .getActionsApi()
268
+ .refreshCaseView(caseKey, viewName, pgRef, refreshOptions)
269
+ .catch(() => {});
270
+ }
271
+ } else if (propValue && this.canBeChangedInReviewMode && this.isDisplayModeEnabled) {
272
+ PCore.getCaseUtils()
189
273
  .getCaseEditLock(caseKey, '')
190
274
  .then(caseResponse => {
191
275
  const pageTokens = this.pConn$.getPageReference().replace('caseInfo.content', '').split('.');
@@ -200,7 +284,7 @@ export class DataReferenceComponent implements OnInit, OnDestroy {
200
284
  });
201
285
 
202
286
  // expecting format like {Customer: {pyID:"C-100"}}
203
- const propArr = this.propName.split('.');
287
+ const propArr = propName.split('.');
204
288
  propArr.forEach((element, idx) => {
205
289
  if (idx + 1 === propArr.length) {
206
290
  curr[element] = propValue;
@@ -220,49 +304,199 @@ export class DataReferenceComponent implements OnInit, OnDestroy {
220
304
  }
221
305
  }
222
306
 
223
- // Re-create first child with overridden props
224
- // Memoized child in order to stop unmount and remount of the child component when data reference
225
- // rerenders without any actual change
226
307
  recreatedFirstChild() {
227
- const { type, config } = this.firstChildMeta;
228
- if (this.firstChildMeta?.type !== 'Region') {
229
- this.pConn$.clearErrorMessages({
230
- property: this.propName,
231
- category: '',
232
- context: ''
308
+ if (this.firstChildMeta?.type === 'Region' && this.displayAs !== 'advancedSearch') {
309
+ return;
310
+ }
311
+ const { type } = this.firstChildMeta;
312
+ this.firstChildPConnect = this.pConn$.getChildren()[0].getPConnect;
313
+
314
+ this.setReadOnlyDisplayFlags();
315
+
316
+ if (type === 'Dropdown' && this.dropDownDataSource === null && !this.isDDSourceDeferred && this.rawViewMetadata.config?.parameters) {
317
+ return null;
318
+ }
319
+
320
+ this.prepareFirstChildMeta();
321
+
322
+ const dataReferenceConfigToChild = this.buildDataReferenceConfig();
323
+ const { disableStartingFieldsForReference = false } = PCore.getEnvironmentInfo().environmentInfoObject?.features?.form || ({} as any);
324
+
325
+ if (this.displayAs === 'advancedSearch') {
326
+ this.showAdvancedSearch = true;
327
+ const searchSelectCacheKey = componentCachePersistUtils.getComponentStateKey(this.pConn$, this.rawViewMetadata.config.name);
328
+ this.advancedSearchService.setConfig({
329
+ dataReferenceConfigToChild,
330
+ isCreateNewReferenceEnabled: !!dataReferenceConfigToChild.createNewRecord,
331
+ disableStartingFieldsForReference,
332
+ pyID: this.pyID,
333
+ searchSelectCacheKey
233
334
  });
234
- if (!this.canBeChangedInReviewMode && this.isDisplayModeEnabled && this.selectionMode === SELECTION_MODE.SINGLE) {
235
- this.displaySingleRef = true;
335
+ return;
336
+ }
337
+
338
+ return this.firstChildPConnect().createComponent({
339
+ type,
340
+ config: {
341
+ ...getFirstChildConfig({
342
+ firstChildMeta: this.firstChildMeta,
343
+ getPConnect: this.pConn$,
344
+ rawViewMetadata: this.rawViewMetadata,
345
+ contextClass: this.contextClass,
346
+ dataReferenceConfigToChild,
347
+ isCreateNewReferenceEnabled: !!dataReferenceConfigToChild.createNewRecord,
348
+ disableStartingFieldsForReference,
349
+ pyID: this.pyID
350
+ })
236
351
  }
352
+ });
353
+ }
354
+
355
+ private setReadOnlyDisplayFlags() {
356
+ const isSingleMode = this.selectionMode === SELECTION_MODE.SINGLE;
357
+ const isMultiMode = this.selectionMode === SELECTION_MODE.MULTI;
358
+
359
+ if (isSingleMode && (this.displayAs === 'readonly' || this.isDisplayModeEnabled) && !this.canBeChangedInReviewMode) {
360
+ this.displaySingleRef = true;
361
+ }
362
+
363
+ if (isMultiMode && (['readonly', 'readonlyMulti', 'map'].includes(this.displayAs) || this.isDisplayModeEnabled)) {
364
+ this.displayMultiRef = true;
365
+ }
366
+ }
367
+
368
+ private prepareFirstChildMeta() {
369
+ // Cleanup
370
+ if (this.firstChildMeta.config?.readOnly) {
371
+ delete this.firstChildMeta.config.readOnly;
372
+ }
373
+
374
+ // Set datasource
375
+ this.setChildDatasource();
237
376
 
238
- if (this.isDisplayModeEnabled && this.selectionMode === SELECTION_MODE.MULTI) {
239
- this.displayMultiRef = true;
377
+ // Pass through configs
378
+ if (this.firstChildMeta.config) {
379
+ this.firstChildMeta.config.showPromotedFilters = this.showPromotedFilters;
380
+ if (!this.canBeChangedInReviewMode) {
381
+ this.firstChildMeta.config.displayMode = this.displayMode;
240
382
  }
383
+ }
384
+ }
385
+
386
+ private setChildDatasource() {
387
+ const { type, config } = this.firstChildMeta;
388
+
389
+ if (['Dropdown', 'Checkbox', 'RadioButtons'].includes(type) && !config.deferDatasource && config.datasource) {
390
+ const isCardVariant = config.variant === 'card';
391
+ const hasParameters = this.rawViewMetadata.config?.parameters;
392
+ // @ts-ignore
393
+ const isDeferDataPageCallEnabled = isCardVariant && hasParameters && !this.firstChildPConnect()?.getSharedDataPageForReferenceList();
394
+
395
+ const useDropDownDataSource = (isCardVariant && (this.dropDownDataSource || isDeferDataPageCallEnabled)) || (!isCardVariant && hasParameters);
241
396
 
242
- // In the case of a datasource with parameters you cannot load the dropdown before the parameters
243
- if (type === 'Dropdown' && this.rawViewMetadata.config?.parameters && this.dropDownDataSource === null) {
244
- return null;
397
+ config.datasource.source = useDropDownDataSource ? this.dropDownDataSource : `@DATASOURCE ${this.refList}.pxResults`;
398
+ if (isCardVariant) {
399
+ config.imagePosition = this.imagePosition;
400
+ config.showImageDescription = this.showImageDescription;
245
401
  }
402
+ } else if (type === 'AutoComplete') {
403
+ config.datasource = this.refList;
404
+ if (this.rawViewMetadata.config?.parameters) {
405
+ config.parameters = this.parameters;
406
+ }
407
+ }
408
+ }
246
409
 
247
- return this.firstChildPConnect().createComponent({
248
- type,
249
- config: {
250
- ...config,
251
- required: this.propsToUse.required,
252
- visibility: this.propsToUse.visibility,
253
- disabled: this.propsToUse.disabled,
254
- label: this.propsToUse.label,
255
- viewName: this.pConn$.getCurrentView(),
256
- parameters: this.rawViewMetadata.config.parameters,
257
- readOnly: false,
258
- localeReference: this.rawViewMetadata.config.localeReference,
259
- ...(this.selectionMode === SELECTION_MODE.SINGLE ? { referenceType: this.referenceType } : ''),
260
- dataRelationshipContext:
261
- this.rawViewMetadata.config.contextClass && this.rawViewMetadata.config.name ? this.rawViewMetadata.config.name : null,
262
- hideLabel: this.hideLabel,
263
- onRecordChange: this.handleSelection.bind(this)
410
+ private buildDataReferenceConfig() {
411
+ const fieldMetaData = this.buildFieldMetaData();
412
+ const isCreateNewReferenceEnabled = this.isCreateNewRecordEnabled();
413
+
414
+ const config: any = {
415
+ selectionMode: this.selectionMode,
416
+ additionalInfo: this.refFieldMetadata?.additionalInformation ? { content: this.refFieldMetadata.additionalInformation } : undefined,
417
+ descriptors: this.selectionMode === SELECTION_MODE.SINGLE ? this.refFieldMetadata?.descriptors : null,
418
+ datasourceMetadata: fieldMetaData?.datasourceMetadata,
419
+ required: this.propsToUse.required,
420
+ visibility: this.propsToUse.visibility,
421
+ disabled: this.propsToUse.disabled,
422
+ label: this.propsToUse.label,
423
+ displayAs: this.displayAs,
424
+ readOnly: false,
425
+ dataRelationshipContext: this.dataRelationshipContext,
426
+ hideLabel: this.hideLabel,
427
+ onRecordChange: this.handleSelection.bind(this),
428
+ createNewRecord: isCreateNewReferenceEnabled ? this.getCreateNewRecordFn() : undefined,
429
+ inline: this.inline
430
+ };
431
+
432
+ if (this.selectionMode === SELECTION_MODE.SINGLE) {
433
+ config.referenceType = this.referenceType;
434
+ if (this.displayAs === 'advancedSearch') {
435
+ config.value = this.rawViewMetadata.config.value;
436
+ config.contextPage = this.rawViewMetadata.config.contextPage;
437
+ }
438
+ } else if (this.displayAs === 'advancedSearch') {
439
+ config.selectionList = this.selectionList;
440
+ config.readonlyContextList = this.rawViewMetadata.config.readonlyContextList;
441
+ }
442
+
443
+ return config;
444
+ }
445
+
446
+ private buildFieldMetaData() {
447
+ if (!this.isDDSourceDeferred || this.firstChildMeta.config.deferDatasource) {
448
+ return null;
449
+ }
450
+
451
+ const { text, value } = this.firstChildMeta?.config?.datasource?.fields || {};
452
+ const getProp = (prop: string) => (prop?.startsWith('@P') ? prop.substring(3) : prop);
453
+
454
+ const fieldMetaData = {
455
+ datasourceMetadata: {
456
+ ...this.refFieldMetadata,
457
+ datasource: {
458
+ name: this.rawViewMetadata.config?.referenceList,
459
+ propertyForDisplayText: getProp(text),
460
+ propertyForValue: getProp(value)
264
461
  }
265
- });
462
+ }
463
+ };
464
+
465
+ if (this.rawViewMetadata.config?.parameters) {
466
+ fieldMetaData.datasourceMetadata.datasource['parameters'] = this.parameters;
266
467
  }
468
+
469
+ return fieldMetaData;
470
+ }
471
+
472
+ private isCreateNewRecordEnabled() {
473
+ const { features } = (PCore.getEnvironmentInfo().environmentInfoObject || {}) as any;
474
+ const isEnvLP = features?.form;
475
+ const isCreateNewRefEnabledInAuthoring = this.isCreationOfNewRecordAllowedForReference ?? isEnvLP?.isCreateNewReferenceEnabled;
476
+ const isCaseRef = this.referenceType === 'Case' || this.firstChildMeta?.config?.referenceType === 'Case';
477
+ const hasAccess = PCore.getAccessPrivilege().hasCreateAccess(this.contextClass);
478
+ const isCreateNewRefEnabledForUser = isEnvLP ? isEnvLP.isCreateNewReferenceEnabled && hasAccess : isCaseRef;
479
+
480
+ return isCreateNewRefEnabledInAuthoring && isCreateNewRefEnabledForUser;
481
+ }
482
+
483
+ private getCreateNewRecordFn() {
484
+ const { disableStartingFieldsForReference = false } = PCore.getEnvironmentInfo().environmentInfoObject?.features?.form || ({} as any);
485
+ const isCaseRef = this.referenceType === 'Case' || this.firstChildMeta?.config?.referenceType === 'Case';
486
+
487
+ return () => {
488
+ if (isCaseRef) {
489
+ const startingFields: any = {};
490
+ if (!disableStartingFieldsForReference) {
491
+ startingFields.pyAddCaseContextPage = { pyID: this.pConn$.getCaseInfo().getKey()?.split(' ')?.pop() };
492
+ }
493
+ return this.pConn$.getActionsApi().createWork(this.contextClass, {
494
+ openCaseViewAfterCreate: false,
495
+ startingFields
496
+ });
497
+ }
498
+ // Assumes Data reference type otherwise
499
+ return getPConnect().getActionsApi().showDataObjectCreateView(this.contextClass);
500
+ };
267
501
  }
268
502
  }
@@ -0,0 +1,39 @@
1
+ <div class="search-form" style="display: flex; flex-direction: column">
2
+ <h5>{{ propsToUse.label }}</h5>
3
+ <div *ngIf="searchCategoriesComp === 'dropdown'">
4
+ <mat-form-field class="psdk-full-width">
5
+ <mat-select [value]="currentTabId" (selectionChange)="handleTabClick($event.value)">
6
+ <mat-option *ngFor="let tab of tabItems" [value]="tab.id">{{ tab.name }}</mat-option>
7
+ </mat-select>
8
+ </mat-form-field>
9
+ </div>
10
+ <div *ngIf="searchCategoriesComp === 'radio'">
11
+ <mat-radio-group [value]="currentTabId">
12
+ <mat-radio-button *ngFor="let tab of tabItems" [value]="tab.id" (click)="handleTabClick($event)">{{ tab.name }}</mat-radio-button>
13
+ </mat-radio-group>
14
+ </div>
15
+
16
+ <!-- Tab Content -->
17
+ <div>
18
+ <div *ngFor="let tab of tabItems; let index = index">
19
+ <div *ngIf="tab.id === currentTabId" class="psdk-sub-tabs">
20
+ <component-mapper
21
+ *ngIf="tab.content?.getPConnect() as tabPConn"
22
+ [name]="tabPConn.getComponentName()"
23
+ [props]="{ pConn$: tabPConn, formGroup$ }"
24
+ ></component-mapper>
25
+ </div>
26
+ </div>
27
+ </div>
28
+ <!-- Dialog -->
29
+ <ng-template #dialogTemplate>
30
+ <h2 mat-dialog-title>Discard selections?</h2>
31
+ <mat-dialog-content>
32
+ <p>When changing search categories, any previous selections will be lost.</p>
33
+ </mat-dialog-content>
34
+ <mat-dialog-actions>
35
+ <button mat-stroked-button type="button" (click)="onDialogClose()">Go back</button>
36
+ <button mat-raised-button color="primary" (click)="clearSelectionAndSwitchTab()">Discard</button>
37
+ </mat-dialog-actions>
38
+ </ng-template>
39
+ </div>
@@ -0,0 +1,11 @@
1
+ .psdk-full-width {
2
+ width: 100%;
3
+ }
4
+
5
+ ::ng-deep {
6
+ mat-tab-group {
7
+ .mat-mdc-tab-header .mat-mdc-tab-label-container .mat-mdc-tab-list {
8
+ display: none;
9
+ }
10
+ }
11
+ }