@pega/angular-sdk-overrides 0.24.9 → 0.25.1
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.
- package/lib/designSystemExtension/alert/alert.component.ts +0 -1
- package/lib/designSystemExtension/alert-banner/alert-banner.component.ts +1 -2
- package/lib/designSystemExtension/banner/banner.component.ts +0 -1
- package/lib/designSystemExtension/case-create-stage/case-create-stage.component.ts +1 -2
- package/lib/designSystemExtension/field-group/field-group.component.ts +0 -1
- package/lib/designSystemExtension/material-case-summary/material-case-summary.component.scss +2 -1
- package/lib/designSystemExtension/material-case-summary/material-case-summary.component.ts +0 -2
- package/lib/designSystemExtension/material-details/material-details.component.ts +0 -1
- package/lib/designSystemExtension/material-details-fields/material-details-fields.component.html +2 -2
- package/lib/designSystemExtension/material-details-fields/material-details-fields.component.ts +10 -2
- package/lib/designSystemExtension/material-summary-item/material-summary-item.component.ts +0 -1
- package/lib/designSystemExtension/material-summary-list/material-summary-list.component.ts +0 -1
- package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.ts +0 -1
- package/lib/designSystemExtension/operator/operator.component.html +1 -1
- package/lib/designSystemExtension/operator/operator.component.scss +10 -2
- package/lib/designSystemExtension/operator/operator.component.ts +5 -5
- package/lib/designSystemExtension/pulse/pulse.component.ts +7 -8
- package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.ts +0 -1
- package/lib/designSystemExtension/wss-quick-create/wss-quick-create.component.ts +0 -1
- package/lib/field/auto-complete/auto-complete.component.html +0 -1
- package/lib/field/auto-complete/auto-complete.component.ts +31 -16
- package/lib/field/cancel-alert/cancel-alert.component.ts +0 -1
- package/lib/field/check-box/check-box.component.html +18 -6
- package/lib/field/check-box/check-box.component.ts +17 -12
- package/lib/field/currency/currency.component.html +4 -4
- package/lib/field/currency/currency.component.ts +42 -20
- package/lib/field/date/date.component.html +3 -7
- package/lib/field/date/date.component.ts +22 -40
- package/lib/field/date-time/date-time.component.html +3 -4
- package/lib/field/date-time/date-time.component.ts +35 -17
- package/lib/field/decimal/decimal.component.html +4 -3
- package/lib/field/decimal/decimal.component.ts +47 -22
- package/lib/field/dropdown/dropdown.component.html +1 -0
- package/lib/field/dropdown/dropdown.component.ts +146 -19
- package/lib/field/email/email.component.ts +24 -5
- package/lib/field/group/group.component.ts +2 -3
- package/lib/field/integer/integer.component.ts +22 -5
- package/lib/field/list-view-action-buttons/list-view-action-buttons.component.html +1 -1
- package/lib/field/list-view-action-buttons/list-view-action-buttons.component.ts +3 -3
- package/lib/field/location/config-ext.json +8 -0
- package/lib/field/location/location.component.html +45 -0
- package/lib/field/location/location.component.scss +18 -0
- package/lib/field/location/location.component.spec.ts +22 -0
- package/lib/field/location/location.component.ts +385 -0
- package/lib/field/multiselect/multiselect.component.ts +17 -10
- package/lib/field/percentage/percentage.component.html +3 -3
- package/lib/field/percentage/percentage.component.ts +45 -21
- package/lib/field/phone/config-ext.json +1 -1
- package/lib/field/phone/phone.component.html +9 -6
- package/lib/field/phone/phone.component.scss +9 -0
- package/lib/field/phone/phone.component.ts +30 -27
- package/lib/field/radio-buttons/radio-buttons.component.html +17 -12
- package/lib/field/radio-buttons/radio-buttons.component.ts +13 -10
- package/lib/field/rich-text/rich-text.component.ts +19 -9
- package/lib/field/scalar-list/scalar-list.component.ts +3 -5
- package/lib/field/selectable-card/selectable-card.component.html +40 -0
- package/lib/field/selectable-card/selectable-card.component.scss +0 -0
- package/lib/field/selectable-card/selectable-card.component.spec.ts +22 -0
- package/lib/field/selectable-card/selectable-card.component.ts +255 -0
- package/lib/field/semantic-link/semantic-link.component.ts +0 -1
- package/lib/field/text/text.component.ts +8 -5
- package/lib/field/text-area/text-area.component.html +4 -1
- package/lib/field/text-area/text-area.component.ts +22 -6
- package/lib/field/text-content/text-content.component.ts +0 -1
- package/lib/field/text-input/text-input.component.ts +22 -5
- package/lib/field/time/time.component.html +2 -2
- package/lib/field/time/time.component.ts +35 -7
- package/lib/field/url/url.component.ts +22 -5
- package/lib/field/user-reference/user-reference.component.html +40 -46
- package/lib/field/user-reference/user-reference.component.ts +111 -21
- package/lib/infra/Containers/flow-container/flow-container.component.html +1 -1
- package/lib/infra/Containers/flow-container/flow-container.component.ts +25 -48
- package/lib/infra/Containers/flow-container/helpers.ts +2 -2
- package/lib/infra/Containers/hybrid-view-container/hybrid-view-container.component.ts +0 -1
- package/lib/infra/Containers/modal-view-container/modal-view-container.component.html +1 -11
- package/lib/infra/Containers/modal-view-container/modal-view-container.component.ts +1 -9
- package/lib/infra/Containers/preview-view-container/preview-view-container.component.ts +1 -1
- package/lib/infra/Containers/view-container/helper.ts +22 -0
- package/lib/infra/Containers/view-container/view-container.component.ts +5 -18
- package/lib/infra/action-buttons/action-buttons.component.html +1 -1
- package/lib/infra/action-buttons/action-buttons.component.ts +0 -1
- package/lib/infra/assignment/assignment.component.html +1 -1
- package/lib/infra/assignment/assignment.component.ts +82 -41
- package/lib/infra/assignment-card/assignment-card.component.html +1 -0
- package/lib/infra/assignment-card/assignment-card.component.ts +0 -1
- package/lib/infra/dashboard-filter/dashboard-filter.component.ts +0 -1
- package/lib/infra/defer-load/defer-load.component.ts +8 -6
- package/lib/infra/error-boundary/error-boundary.component.ts +0 -1
- package/lib/infra/multi-step/multi-step.component.ts +0 -1
- package/lib/infra/navbar/navbar.component.ts +3 -6
- package/lib/infra/reference/reference.component.ts +77 -90
- package/lib/infra/region/region.component.ts +0 -1
- package/lib/infra/root-container/root-container.component.html +2 -15
- package/lib/infra/root-container/root-container.component.ts +27 -33
- package/lib/infra/stages/stages.component.scss +2 -2
- package/lib/infra/stages/stages.component.ts +0 -1
- package/lib/infra/view/view.component.html +7 -20
- package/lib/infra/view/view.component.ts +20 -3
- package/lib/template/app-shell/app-shell.component.ts +20 -3
- package/lib/template/banner-page/banner-page.component.ts +0 -1
- package/lib/template/base/details-template-base.ts +67 -0
- package/lib/template/base/form-template-base.ts +16 -0
- package/lib/template/case-summary/case-summary.component.ts +7 -23
- package/lib/template/case-view/case-view.component.html +4 -4
- package/lib/template/case-view/case-view.component.ts +8 -14
- package/lib/template/confirmation/confirmation.component.html +1 -1
- package/lib/template/confirmation/confirmation.component.ts +1 -2
- package/lib/template/data-reference/data-reference.component.ts +36 -41
- package/lib/template/default-form/default-form.component.html +0 -4
- package/lib/template/default-form/default-form.component.ts +41 -25
- package/lib/template/details/details.component.ts +7 -42
- package/lib/template/details-narrow-wide/details-narrow-wide.component.ts +6 -40
- package/lib/template/details-one-column/details-one-column.component.ts +7 -43
- package/lib/template/details-sub-tabs/details-sub-tabs.component.html +1 -2
- package/lib/template/details-sub-tabs/details-sub-tabs.component.ts +5 -38
- package/lib/template/details-three-column/details-three-column.component.ts +7 -44
- package/lib/template/details-two-column/details-two-column.component.ts +8 -45
- package/lib/template/details-wide-narrow/details-wide-narrow.component.ts +7 -43
- package/lib/template/dynamic-tabs/dynamic-tabs.component.html +3 -0
- package/lib/template/dynamic-tabs/dynamic-tabs.component.ts +8 -4
- package/lib/template/field-group-list/field-group-list.component.ts +0 -1
- package/lib/template/field-group-template/field-group-template.component.html +7 -7
- package/lib/template/field-group-template/field-group-template.component.scss +8 -0
- package/lib/template/field-group-template/field-group-template.component.ts +68 -48
- package/lib/template/field-value-list/field-value-list.component.html +2 -2
- package/lib/template/field-value-list/field-value-list.component.scss +6 -1
- package/lib/template/field-value-list/field-value-list.component.ts +0 -1
- package/lib/template/inline-dashboard/inline-dashboard.component.ts +0 -1
- package/lib/template/inline-dashboard-page/inline-dashboard-page.component.ts +2 -3
- package/lib/template/list-page/list-page.component.ts +0 -1
- package/lib/template/list-view/list-view.component.html +6 -1
- package/lib/template/list-view/list-view.component.scss +11 -0
- package/lib/template/list-view/list-view.component.ts +25 -11
- package/lib/template/list-view/listViewHelpers.ts +4 -10
- package/lib/template/list-view/utils.ts +2 -5
- package/lib/template/multi-reference-readonly/multi-reference-readonly.component.ts +0 -1
- package/lib/template/narrow-wide-form/narrow-wide-form.component.ts +1 -2
- package/lib/template/one-column/one-column.component.ts +4 -4
- package/lib/template/one-column-page/one-column-page.component.ts +0 -1
- package/lib/template/one-column-tab/one-column-tab.component.ts +1 -2
- package/lib/template/page/page.component.ts +1 -2
- package/lib/template/promoted-filters/promoted-filters.component.ts +1 -2
- package/lib/template/repeating-structures/repeating-structures.component.ts +1 -2
- package/lib/template/simple-table/simple-table.component.ts +0 -1
- package/lib/template/simple-table-manual/helpers.ts +126 -10
- package/lib/template/simple-table-manual/simple-table-manual.component.html +25 -6
- package/lib/template/simple-table-manual/simple-table-manual.component.scss +12 -3
- package/lib/template/simple-table-manual/simple-table-manual.component.ts +110 -54
- package/lib/template/simple-table-select/simple-table-select.component.ts +3 -4
- package/lib/template/single-reference-readonly/single-reference-readonly.component.ts +0 -1
- package/lib/template/sub-tabs/sub-tabs.component.ts +0 -1
- package/lib/template/three-column/three-column.component.ts +4 -4
- package/lib/template/three-column-page/three-column-page.component.ts +0 -1
- package/lib/template/two-column/two-column.component.ts +4 -4
- package/lib/template/two-column-page/two-column-page.component.ts +0 -1
- package/lib/template/two-column-tab/two-column-tab.component.ts +1 -2
- package/lib/template/utils.ts +16 -0
- package/lib/template/wide-narrow-form/wide-narrow-form.component.ts +4 -4
- package/lib/template/wide-narrow-page/wide-narrow-page.component.ts +1 -2
- package/lib/template/wss-nav-bar/wss-nav-bar.component.ts +3 -4
- package/lib/widget/app-announcement/app-announcement.component.ts +0 -1
- package/lib/widget/attachment/attachment.component.ts +9 -13
- package/lib/widget/case-history/case-history.component.ts +0 -1
- package/lib/widget/feed-container/feed-container.component.ts +7 -10
- package/lib/widget/file-utility/file-utility.component.ts +2 -6
- package/lib/widget/list-utility/list-utility.component.ts +0 -1
- package/lib/widget/quick-create/quick-create.component.ts +0 -1
- package/lib/widget/todo/todo.component.html +5 -6
- package/lib/widget/todo/todo.component.scss +9 -0
- package/lib/widget/todo/todo.component.ts +95 -85
- package/lib/widget/utility/utility.component.ts +0 -1
- package/package.json +1 -1
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/* eslint-disable max-classes-per-file */
|
|
2
1
|
import { Component, OnInit, Input, ViewChild, forwardRef, OnDestroy } from '@angular/core';
|
|
3
2
|
import { CommonModule } from '@angular/common';
|
|
4
3
|
import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
@@ -22,13 +21,13 @@ import { getCurrencyOptions } from '@pega/angular-sdk-components';
|
|
|
22
21
|
import { getLocale, getSeconds } from '@pega/angular-sdk-components';
|
|
23
22
|
import { formatters } from '@pega/angular-sdk-components';
|
|
24
23
|
|
|
25
|
-
import {
|
|
26
|
-
|
|
27
|
-
declare const window: any;
|
|
24
|
+
import { init } from './listViewHelpers';
|
|
28
25
|
|
|
29
26
|
const SELECTION_MODE = { SINGLE: 'single', MULTI: 'multi' };
|
|
30
27
|
|
|
31
28
|
interface ListViewProps {
|
|
29
|
+
inheritedProps: any;
|
|
30
|
+
title: string | undefined;
|
|
32
31
|
// If any, enter additional props that only exist on this component
|
|
33
32
|
globalSearch?: boolean;
|
|
34
33
|
referenceList?: any;
|
|
@@ -42,6 +41,7 @@ interface ListViewProps {
|
|
|
42
41
|
grouping: string | boolean;
|
|
43
42
|
value: any;
|
|
44
43
|
readonlyContextList: any;
|
|
44
|
+
label?: string;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
export class Group {
|
|
@@ -58,7 +58,6 @@ export class Group {
|
|
|
58
58
|
selector: 'app-list-view',
|
|
59
59
|
templateUrl: './list-view.component.html',
|
|
60
60
|
styleUrls: ['./list-view.component.scss'],
|
|
61
|
-
standalone: true,
|
|
62
61
|
imports: [
|
|
63
62
|
CommonModule,
|
|
64
63
|
MatFormFieldModule,
|
|
@@ -156,13 +155,12 @@ export class ListViewComponent implements OnInit, OnDestroy {
|
|
|
156
155
|
query: any = null;
|
|
157
156
|
paging: any;
|
|
158
157
|
fieldDefs: any;
|
|
159
|
-
xRayApis = PCore.getDebugger().getXRayRuntime();
|
|
160
|
-
xRayUid = this.xRayApis.startXRay();
|
|
161
158
|
checkBoxValue: string;
|
|
159
|
+
label?: string = '';
|
|
162
160
|
|
|
163
161
|
constructor(
|
|
164
162
|
private psService: ProgressSpinnerService,
|
|
165
|
-
|
|
163
|
+
public utils: Utils
|
|
166
164
|
) {}
|
|
167
165
|
|
|
168
166
|
ngOnInit(): void {
|
|
@@ -192,6 +190,18 @@ export class ListViewComponent implements OnInit, OnDestroy {
|
|
|
192
190
|
this.arFilterMainButtons$.push({ actionID: 'submit', jsAction: 'submit', name: 'Submit' });
|
|
193
191
|
this.arFilterSecondaryButtons$.push({ actionID: 'cancel', jsAction: 'cancel', name: 'Cancel' });
|
|
194
192
|
|
|
193
|
+
let title = this.configProps$?.title || this.configProps$?.label || 'List';
|
|
194
|
+
const inheritedProps = this.configProps$?.inheritedProps;
|
|
195
|
+
if (title === 'List' && inheritedProps) {
|
|
196
|
+
for (const inheritedProp of inheritedProps) {
|
|
197
|
+
if (inheritedProp?.prop === 'label') {
|
|
198
|
+
title = inheritedProp?.value;
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
this.label = title;
|
|
204
|
+
|
|
195
205
|
this.searchIcon$ = this.utils.getImageSrc('search', this.utils.getSDKStaticContentUrl());
|
|
196
206
|
setTimeout(() => {
|
|
197
207
|
PCore.getPubSubUtils().subscribe(
|
|
@@ -218,14 +228,13 @@ export class ListViewComponent implements OnInit, OnDestroy {
|
|
|
218
228
|
if (!this.payload) {
|
|
219
229
|
this.payload = { referenceList: this.configProps$.referenceList };
|
|
220
230
|
}
|
|
221
|
-
|
|
231
|
+
init({
|
|
222
232
|
pConn$: this.pConn$,
|
|
223
233
|
bInForm$: this.bInForm$,
|
|
224
234
|
...this.payload,
|
|
225
235
|
listContext: this.listContext,
|
|
226
236
|
ref: this.ref,
|
|
227
237
|
showDynamicFields: this.showDynamicFields,
|
|
228
|
-
xRayUid: this.xRayUid,
|
|
229
238
|
cosmosTableRef: this.cosmosTableRef,
|
|
230
239
|
selectionMode: this.selectionMode
|
|
231
240
|
}).then(response => {
|
|
@@ -961,7 +970,7 @@ export class ListViewComponent implements OnInit, OnDestroy {
|
|
|
961
970
|
|
|
962
971
|
filterDataWithDate(item, filterObj, filterValue) {
|
|
963
972
|
let bKeep;
|
|
964
|
-
let value = item[filterObj.ref] != null
|
|
973
|
+
let value = item[filterObj.ref] != null || item[filterObj.ref] != '' ? getSeconds(item[filterObj.ref]) : null;
|
|
965
974
|
filterValue = filterObj.containsFilterValue != null && filterObj.containsFilterValue != '' ? getSeconds(filterObj.containsFilterValue) : null;
|
|
966
975
|
|
|
967
976
|
switch (filterObj.containsFilter) {
|
|
@@ -1380,6 +1389,11 @@ export class ListViewComponent implements OnInit, OnDestroy {
|
|
|
1380
1389
|
return listFields;
|
|
1381
1390
|
}
|
|
1382
1391
|
|
|
1392
|
+
getResultsText() {
|
|
1393
|
+
const recordsCount = this.repeatList$?.paginator?.length || 0;
|
|
1394
|
+
return `${recordsCount || 0} result${recordsCount > 1 ? 's' : ''}`;
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1383
1397
|
getField(fieldDefs, columnId) {
|
|
1384
1398
|
const fieldsMap = this.getFieldsMap(fieldDefs);
|
|
1385
1399
|
return fieldsMap.get(columnId);
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { getContext, readContextResponse } from './utils';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
declare const PCore: any;
|
|
5
|
-
|
|
6
|
-
export function useInit(props) {
|
|
3
|
+
export function init(props) {
|
|
7
4
|
const {
|
|
8
5
|
referenceList,
|
|
9
6
|
pConn$,
|
|
@@ -15,7 +12,6 @@ export function useInit(props) {
|
|
|
15
12
|
ref,
|
|
16
13
|
showDynamicFields,
|
|
17
14
|
isDataObject,
|
|
18
|
-
xRayUid,
|
|
19
15
|
cosmosTableRef
|
|
20
16
|
} = props;
|
|
21
17
|
let { editing, selectionMode } = props;
|
|
@@ -25,9 +21,9 @@ export function useInit(props) {
|
|
|
25
21
|
let selectionCountThreshold;
|
|
26
22
|
|
|
27
23
|
// promise to fetch metadata
|
|
28
|
-
const metaDataPromise = PCore.getAnalyticsUtils().getDataViewMetadata(referenceList, showDynamicFields);
|
|
24
|
+
const metaDataPromise = PCore.getAnalyticsUtils().getDataViewMetadata(referenceList, showDynamicFields, null);
|
|
29
25
|
|
|
30
|
-
const promisesArray = [metaDataPromise];
|
|
26
|
+
const promisesArray: any = [metaDataPromise];
|
|
31
27
|
|
|
32
28
|
// promise to fetch report configured columns
|
|
33
29
|
const reportColumnsPromise = PCore.getAnalyticsUtils()
|
|
@@ -70,8 +66,7 @@ export function useInit(props) {
|
|
|
70
66
|
pConn$,
|
|
71
67
|
compositeKeys,
|
|
72
68
|
isSearchable,
|
|
73
|
-
isCacheable: true
|
|
74
|
-
xRayUid
|
|
69
|
+
isCacheable: true
|
|
75
70
|
}).then(async context => {
|
|
76
71
|
return readContextResponse(context, {
|
|
77
72
|
...props,
|
|
@@ -79,7 +74,6 @@ export function useInit(props) {
|
|
|
79
74
|
selectionCountThreshold,
|
|
80
75
|
ref,
|
|
81
76
|
selectionMode,
|
|
82
|
-
xRayUid,
|
|
83
77
|
cosmosTableRef
|
|
84
78
|
});
|
|
85
79
|
});
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { getDefaultViewMeta } from './DefaultViewMeta';
|
|
2
2
|
|
|
3
|
-
// Remove this and use "real" PCore type once .d.ts is fixed (currently shows 5 errors)
|
|
4
|
-
declare const PCore: any;
|
|
5
|
-
|
|
6
3
|
const USER_REFERENCE = 'UserReference';
|
|
7
4
|
const PAGE = '!P!';
|
|
8
5
|
const PAGELIST = '!PL!';
|
|
@@ -121,7 +118,7 @@ export const isPageListInPath = (propertyName, currentClassID) => {
|
|
|
121
118
|
return false;
|
|
122
119
|
}
|
|
123
120
|
const [first, ...rest] = propertyName.split('.');
|
|
124
|
-
const metadata = PCore.getMetadataUtils().getPropertyMetadata(first, currentClassID);
|
|
121
|
+
const metadata: any = PCore.getMetadataUtils().getPropertyMetadata(first, currentClassID);
|
|
125
122
|
if (metadata?.type === 'Page List') {
|
|
126
123
|
return true;
|
|
127
124
|
}
|
|
@@ -205,7 +202,7 @@ export function getConfigEmbeddedFieldsMeta(configFields, classID) {
|
|
|
205
202
|
if (value.includes('[')) {
|
|
206
203
|
value = value.substring(0, value.indexOf('[')) + value.substring(value.indexOf(']') + 1);
|
|
207
204
|
}
|
|
208
|
-
const meta = PCore.getMetadataUtils().getEmbeddedPropertyMetadata(value, classID);
|
|
205
|
+
const meta: any = PCore.getMetadataUtils().getEmbeddedPropertyMetadata(value, classID);
|
|
209
206
|
meta.fieldID = field;
|
|
210
207
|
configEmbeddedFieldsMeta.push(meta);
|
|
211
208
|
}
|
|
@@ -12,7 +12,6 @@ interface MultiReferenceReadOnlyProps {
|
|
|
12
12
|
selector: 'app-multi-reference-readonly',
|
|
13
13
|
templateUrl: './multi-reference-readonly.component.html',
|
|
14
14
|
styleUrls: ['./multi-reference-readonly.component.scss'],
|
|
15
|
-
standalone: true,
|
|
16
15
|
imports: [forwardRef(() => ComponentMapperComponent)]
|
|
17
16
|
})
|
|
18
17
|
export class MultiReferenceReadonlyComponent implements OnInit, OnDestroy {
|
|
@@ -7,7 +7,6 @@ import { ComponentMapperComponent } from '@pega/angular-sdk-components';
|
|
|
7
7
|
selector: 'app-narrow-wide-form',
|
|
8
8
|
templateUrl: './narrow-wide-form.component.html',
|
|
9
9
|
styleUrls: ['./narrow-wide-form.component.scss'],
|
|
10
|
-
standalone: true,
|
|
11
10
|
imports: [CommonModule, forwardRef(() => ComponentMapperComponent)]
|
|
12
11
|
})
|
|
13
12
|
export class NarrowWideFormComponent implements OnInit, OnChanges {
|
|
@@ -29,6 +28,6 @@ export class NarrowWideFormComponent implements OnInit, OnChanges {
|
|
|
29
28
|
}
|
|
30
29
|
|
|
31
30
|
updateSelf() {
|
|
32
|
-
this.arChildren$ = this.pConn$.getChildren()
|
|
31
|
+
this.arChildren$ = this.pConn$.getChildren();
|
|
33
32
|
}
|
|
34
33
|
}
|
|
@@ -2,16 +2,16 @@ import { Component, OnInit, Input, forwardRef, OnChanges, SimpleChanges } from '
|
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import { FormGroup } from '@angular/forms';
|
|
4
4
|
import { ComponentMapperComponent } from '@pega/angular-sdk-components';
|
|
5
|
+
import { FormTemplateBase } from '@pega/angular-sdk-components';
|
|
5
6
|
|
|
6
7
|
@Component({
|
|
7
8
|
selector: 'app-one-column',
|
|
8
9
|
templateUrl: './one-column.component.html',
|
|
9
10
|
styleUrls: ['./one-column.component.scss'],
|
|
10
|
-
standalone: true,
|
|
11
11
|
imports: [CommonModule, forwardRef(() => ComponentMapperComponent)]
|
|
12
12
|
})
|
|
13
|
-
export class OneColumnComponent implements OnInit, OnChanges {
|
|
14
|
-
@Input() pConn$: typeof PConnect;
|
|
13
|
+
export class OneColumnComponent extends FormTemplateBase implements OnInit, OnChanges {
|
|
14
|
+
@Input() override pConn$: typeof PConnect;
|
|
15
15
|
@Input() formGroup$: FormGroup;
|
|
16
16
|
|
|
17
17
|
arChildren$: any[];
|
|
@@ -29,6 +29,6 @@ export class OneColumnComponent implements OnInit, OnChanges {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
updateSelf() {
|
|
32
|
-
this.arChildren$ = this.pConn$.getChildren()
|
|
32
|
+
this.arChildren$ = this.pConn$.getChildren();
|
|
33
33
|
}
|
|
34
34
|
}
|
|
@@ -6,7 +6,6 @@ import { ComponentMapperComponent } from '@pega/angular-sdk-components';
|
|
|
6
6
|
selector: 'app-one-column-page',
|
|
7
7
|
templateUrl: './one-column-page.component.html',
|
|
8
8
|
styleUrls: ['./one-column-page.component.scss'],
|
|
9
|
-
standalone: true,
|
|
10
9
|
imports: [forwardRef(() => ComponentMapperComponent)]
|
|
11
10
|
})
|
|
12
11
|
export class OneColumnPageComponent {
|
|
@@ -7,7 +7,6 @@ import { ComponentMapperComponent } from '@pega/angular-sdk-components';
|
|
|
7
7
|
selector: 'app-one-column-tab',
|
|
8
8
|
templateUrl: './one-column-tab.component.html',
|
|
9
9
|
styleUrls: ['./one-column-tab.component.scss'],
|
|
10
|
-
standalone: true,
|
|
11
10
|
imports: [CommonModule, forwardRef(() => ComponentMapperComponent)]
|
|
12
11
|
})
|
|
13
12
|
export class OneColumnTabComponent implements OnInit, OnChanges {
|
|
@@ -29,6 +28,6 @@ export class OneColumnTabComponent implements OnInit, OnChanges {
|
|
|
29
28
|
}
|
|
30
29
|
|
|
31
30
|
updateSelf() {
|
|
32
|
-
this.arChildren$ = this.pConn$.getChildren()
|
|
31
|
+
this.arChildren$ = this.pConn$.getChildren();
|
|
33
32
|
}
|
|
34
33
|
}
|
|
@@ -14,7 +14,6 @@ interface PageProps {
|
|
|
14
14
|
selector: 'app-page',
|
|
15
15
|
templateUrl: './page.component.html',
|
|
16
16
|
styleUrls: ['./page.component.scss'],
|
|
17
|
-
standalone: true,
|
|
18
17
|
imports: [CommonModule, forwardRef(() => ComponentMapperComponent)]
|
|
19
18
|
})
|
|
20
19
|
export class PageComponent implements OnInit, OnDestroy {
|
|
@@ -34,7 +33,7 @@ export class PageComponent implements OnInit, OnDestroy {
|
|
|
34
33
|
this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
|
|
35
34
|
|
|
36
35
|
this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as PageProps;
|
|
37
|
-
this.arChildren$ = this.pConn$.getChildren()
|
|
36
|
+
this.arChildren$ = this.pConn$.getChildren();
|
|
38
37
|
|
|
39
38
|
this.title$ = this.configProps$.title;
|
|
40
39
|
const operator = this.configProps$.operator;
|
|
@@ -26,7 +26,6 @@ const SUPPORTED_TYPES_IN_PROMOTED_FILTERS = [
|
|
|
26
26
|
selector: 'app-promoted-filters',
|
|
27
27
|
templateUrl: './promoted-filters.component.html',
|
|
28
28
|
styleUrls: ['./promoted-filters.component.scss'],
|
|
29
|
-
standalone: true,
|
|
30
29
|
imports: [CommonModule, MatButtonModule, forwardRef(() => ComponentMapperComponent)]
|
|
31
30
|
})
|
|
32
31
|
export class PromotedFiltersComponent implements OnInit, OnDestroy {
|
|
@@ -81,7 +80,7 @@ export class PromotedFiltersComponent implements OnInit, OnDestroy {
|
|
|
81
80
|
});
|
|
82
81
|
|
|
83
82
|
const filtersWithClassID = { ...this.filtersProperties, classID: this.pageClass };
|
|
84
|
-
this.transientItemID =
|
|
83
|
+
this.transientItemID = this.pConn$.getContainerManager().addTransientItem({ id: this.viewName, data: filtersWithClassID });
|
|
85
84
|
this.processedFilters = [];
|
|
86
85
|
this.filters.forEach(filter => {
|
|
87
86
|
const filterClone = { ...filter };
|
|
@@ -18,7 +18,6 @@ interface RepeatingStructuresProps {
|
|
|
18
18
|
selector: 'app-repeating-structures',
|
|
19
19
|
templateUrl: './repeating-structures.component.html',
|
|
20
20
|
styleUrls: ['./repeating-structures.component.scss'],
|
|
21
|
-
standalone: true,
|
|
22
21
|
imports: [CommonModule, MatFormFieldModule, MatIconModule, MatInputModule, MatTableModule, MatSortModule, MatPaginatorModule]
|
|
23
22
|
})
|
|
24
23
|
export class RepeatingStructuresComponent implements OnInit, AfterViewInit {
|
|
@@ -107,7 +106,7 @@ export class RepeatingStructuresComponent implements OnInit, AfterViewInit {
|
|
|
107
106
|
openAssignment(row) {
|
|
108
107
|
const { pxRefObjectClass, pzInsKey } = row;
|
|
109
108
|
const sTarget = this.pConn$.getContainerName();
|
|
110
|
-
const options
|
|
109
|
+
const options = { containerName: sTarget };
|
|
111
110
|
this.pConn$
|
|
112
111
|
.getActionsApi()
|
|
113
112
|
.openAssignment(pzInsKey, pxRefObjectClass, options)
|
|
@@ -28,7 +28,6 @@ interface SimpleTableProps {
|
|
|
28
28
|
selector: 'app-simple-table',
|
|
29
29
|
templateUrl: './simple-table.component.html',
|
|
30
30
|
styleUrls: ['./simple-table.component.scss'],
|
|
31
|
-
standalone: true,
|
|
32
31
|
imports: [CommonModule, forwardRef(() => ComponentMapperComponent)]
|
|
33
32
|
})
|
|
34
33
|
export class SimpleTableComponent implements OnInit, OnDestroy {
|
|
@@ -44,18 +44,20 @@ function getFieldWidth(field, label) {
|
|
|
44
44
|
export const getContext = thePConn => {
|
|
45
45
|
const contextName = thePConn.getContextName();
|
|
46
46
|
const pageReference = thePConn.getPageReference();
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
let { referenceList } = thePConn.getStateProps()?.config || thePConn.getStateProps();
|
|
47
|
+
const { readonlyContextList, referenceList = readonlyContextList } = thePConn.getStateProps()?.config || thePConn.getStateProps();
|
|
48
|
+
|
|
50
49
|
const pageReferenceForRows = referenceList.startsWith('.') ? `${pageReference}.${referenceList.substring(1)}` : referenceList;
|
|
50
|
+
const viewName = thePConn.viewName;
|
|
51
51
|
|
|
52
52
|
// removing "caseInfo.content" prefix to avoid setting it as a target while preparing pageInstructions
|
|
53
|
-
|
|
53
|
+
// skipping the removal as StateMachine itself is removing this case info prefix while preparing pageInstructions
|
|
54
|
+
// referenceList = pageReferenceForRows.replace(PCore.getConstants().CASE_INFO.CASE_INFO_CONTENT, '');
|
|
54
55
|
|
|
55
56
|
return {
|
|
56
57
|
contextName,
|
|
57
58
|
referenceListStr: referenceList,
|
|
58
|
-
pageReferenceForRows
|
|
59
|
+
pageReferenceForRows,
|
|
60
|
+
viewName
|
|
59
61
|
};
|
|
60
62
|
};
|
|
61
63
|
|
|
@@ -124,11 +126,125 @@ export const buildMetaForListView = (fieldMetadata, fields, type, ruleClass, nam
|
|
|
124
126
|
};
|
|
125
127
|
};
|
|
126
128
|
|
|
127
|
-
|
|
129
|
+
const PRIMARY_FIELDS = 'pyPrimaryFields';
|
|
130
|
+
const SUPPORTED_FIELD_TYPES = [
|
|
131
|
+
'Address',
|
|
132
|
+
'TextArea',
|
|
133
|
+
'TextInput',
|
|
134
|
+
'Phone',
|
|
135
|
+
'Email',
|
|
136
|
+
'Time',
|
|
137
|
+
'URL',
|
|
138
|
+
'Percentage',
|
|
139
|
+
'Integer',
|
|
140
|
+
'Decimal',
|
|
141
|
+
'Date',
|
|
142
|
+
'DateTime',
|
|
143
|
+
'Currency',
|
|
144
|
+
'Checkbox',
|
|
145
|
+
'Dropdown',
|
|
146
|
+
'AutoComplete',
|
|
147
|
+
'UserReference',
|
|
148
|
+
'RichText'
|
|
149
|
+
];
|
|
150
|
+
|
|
151
|
+
export const getConfigFields = (rawFields, contextClass, primaryFieldsViewIndex) => {
|
|
152
|
+
let primaryFields: any = [];
|
|
153
|
+
let configFields: any = [];
|
|
154
|
+
|
|
155
|
+
if (primaryFieldsViewIndex > -1) {
|
|
156
|
+
let primaryFieldVMD: any = PCore.getMetadataUtils().resolveView(PRIMARY_FIELDS);
|
|
157
|
+
if (Array.isArray(primaryFieldVMD)) {
|
|
158
|
+
primaryFieldVMD = primaryFieldVMD.find(primaryFieldView => primaryFieldView.classID === contextClass);
|
|
159
|
+
primaryFields = primaryFieldVMD?.children?.[0]?.children || [];
|
|
160
|
+
} else if (primaryFieldVMD?.classID === contextClass) {
|
|
161
|
+
primaryFields = primaryFieldVMD?.children?.[0]?.children || [];
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (primaryFields.length) {
|
|
165
|
+
primaryFields = primaryFields.filter(primaryField => SUPPORTED_FIELD_TYPES.includes(primaryField.type));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
configFields = [...rawFields.slice(0, primaryFieldsViewIndex), ...primaryFields, ...rawFields.slice(primaryFieldsViewIndex + 1)];
|
|
170
|
+
// filter duplicate fields after combining raw fields and primary fields
|
|
171
|
+
return configFields.filter((field, index) => configFields.findIndex(_field => field.config?.value === _field.config?.value) === index);
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
export function isFLProperty(label) {
|
|
175
|
+
return label?.startsWith('@FL');
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* [getFieldLabel]
|
|
180
|
+
* Description - A utility that returns resolved field label for "@FL" annotation i.e from data model.
|
|
181
|
+
* @param {Object} fieldConfig
|
|
182
|
+
* @returns {string} resolved label string
|
|
183
|
+
*
|
|
184
|
+
* example:
|
|
185
|
+
* fieldConfig = {label: "@FL .pyID", classID: "TestCase-Work"};
|
|
186
|
+
* return "Case ID"
|
|
187
|
+
*/
|
|
188
|
+
export function getFieldLabel(fieldConfig) {
|
|
189
|
+
const { label, classID, caption } = fieldConfig;
|
|
190
|
+
let fieldLabel = (label ?? caption)?.substring(4);
|
|
191
|
+
const labelSplit = fieldLabel?.split('.');
|
|
192
|
+
const propertyName = labelSplit?.pop();
|
|
193
|
+
const fieldMetaData: any = PCore.getMetadataUtils().getPropertyMetadata(propertyName, classID) ?? {};
|
|
194
|
+
fieldLabel = fieldMetaData.label ?? fieldMetaData.caption ?? propertyName;
|
|
195
|
+
return fieldLabel;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export const updateFieldLabels = (fields, configFields, primaryFieldsViewIndex, pConnect, options) => {
|
|
199
|
+
const labelsOfFields: any = [];
|
|
200
|
+
const { columnsRawConfig = [] } = options;
|
|
201
|
+
fields.forEach((field, idx) => {
|
|
202
|
+
const rawColumnConfig = columnsRawConfig[idx]?.config;
|
|
203
|
+
if (field.config.value === PRIMARY_FIELDS) {
|
|
204
|
+
labelsOfFields.push('');
|
|
205
|
+
} else if (isFLProperty(rawColumnConfig?.label ?? rawColumnConfig?.caption)) {
|
|
206
|
+
labelsOfFields.push(getFieldLabel(rawColumnConfig) || field.config.label || field.config.caption);
|
|
207
|
+
} else {
|
|
208
|
+
labelsOfFields.push(field.config.label || field.config.caption);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
if (primaryFieldsViewIndex > -1) {
|
|
213
|
+
const totalPrimaryFieldsColumns = configFields.length - fields.length + 1;
|
|
214
|
+
if (totalPrimaryFieldsColumns) {
|
|
215
|
+
const primaryFieldLabels: any = [];
|
|
216
|
+
for (let i = primaryFieldsViewIndex; i < primaryFieldsViewIndex + totalPrimaryFieldsColumns; i += 1) {
|
|
217
|
+
let label = configFields[i].config?.label;
|
|
218
|
+
if (isFLProperty(label)) {
|
|
219
|
+
label = getFieldLabel(configFields[i].config);
|
|
220
|
+
} else if (label.startsWith('@')) {
|
|
221
|
+
label = label.substring(3);
|
|
222
|
+
}
|
|
223
|
+
if (pConnect) {
|
|
224
|
+
label = pConnect.getLocalizedValue(label);
|
|
225
|
+
}
|
|
226
|
+
primaryFieldLabels.push(label);
|
|
227
|
+
}
|
|
228
|
+
labelsOfFields.splice(primaryFieldsViewIndex, 1, ...primaryFieldLabels);
|
|
229
|
+
} else {
|
|
230
|
+
labelsOfFields.splice(primaryFieldsViewIndex, 1);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return labelsOfFields;
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
export const buildFieldsForTable = (configFields, pConnect, showDeleteButton, options) => {
|
|
237
|
+
const { primaryFieldsViewIndex, fields } = options;
|
|
238
|
+
|
|
239
|
+
// get resolved field labels for primary fields raw config included in configFields
|
|
240
|
+
const fieldsLabels = updateFieldLabels(fields, configFields, primaryFieldsViewIndex, pConnect, {
|
|
241
|
+
columnsRawConfig: pConnect.getRawConfigProps()?.children.find(item => item?.name === 'Columns')?.children
|
|
242
|
+
});
|
|
243
|
+
|
|
128
244
|
const fieldDefs = configFields?.map((field, index) => {
|
|
129
245
|
return {
|
|
130
246
|
type: 'text',
|
|
131
|
-
label:
|
|
247
|
+
label: fieldsLabels[index],
|
|
132
248
|
fillAvailableSpace: !!field.config.fillAvailableSpace,
|
|
133
249
|
id: `${index}`,
|
|
134
250
|
name: field.config.value.substr(4),
|
|
@@ -189,8 +305,8 @@ export const createMetaForTable = (fields, renderMode) => {
|
|
|
189
305
|
};
|
|
190
306
|
|
|
191
307
|
export const filterDataByDate = (item, filterObj) => {
|
|
192
|
-
let bKeep;
|
|
193
|
-
let value = item[filterObj.ref] != null
|
|
308
|
+
let bKeep = true;
|
|
309
|
+
let value = item[filterObj.ref] != null || item[filterObj.ref] != '' ? getSeconds(item[filterObj.ref]) : null;
|
|
194
310
|
let filterValue = filterObj.containsFilterValue != null && filterObj.containsFilterValue != '' ? getSeconds(filterObj.containsFilterValue) : null;
|
|
195
311
|
|
|
196
312
|
switch (filterObj.containsFilter) {
|
|
@@ -237,7 +353,7 @@ export const filterDataByDate = (item, filterObj) => {
|
|
|
237
353
|
};
|
|
238
354
|
|
|
239
355
|
export const filterDataByCommonFields = (item, filterObj) => {
|
|
240
|
-
let bKeep;
|
|
356
|
+
let bKeep = true;
|
|
241
357
|
const value = item[filterObj.ref].toLowerCase();
|
|
242
358
|
const filterValue = filterObj.containsFilterValue.toLowerCase();
|
|
243
359
|
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
<h3 *ngIf="label" className="label" style="font-weight: bold">
|
|
4
4
|
{{ label }} <span class="results-count">{{ getResultsText() }}</span>
|
|
5
5
|
</h3>
|
|
6
|
-
<table *ngIf="readOnlyMode || allowEditingInModal" mat-table [dataSource]="
|
|
7
|
-
<ng-container *ngFor="let dCol of processedFields" [matColumnDef]="dCol.config.name">
|
|
6
|
+
<table *ngIf="readOnlyMode || allowEditingInModal" mat-table [dataSource]="elementsData" class="mat-elevation-z8" id="readonly-table" matSort>
|
|
7
|
+
<ng-container *ngFor="let dCol of processedFields; let i = index" [matColumnDef]="dCol.config.name">
|
|
8
8
|
<th mat-header-cell *matHeaderCellDef mat-sort-header (click)="_headerSortClick($event, dCol)" arrowPosition="before">
|
|
9
9
|
<div>{{ dCol.config.label }}</div>
|
|
10
10
|
<div class="psdk-mat-header-filter">
|
|
@@ -27,7 +27,16 @@
|
|
|
27
27
|
</mat-menu>
|
|
28
28
|
</div>
|
|
29
29
|
</th>
|
|
30
|
-
<td mat-cell *matCellDef="let element">
|
|
30
|
+
<td mat-cell *matCellDef="let element">
|
|
31
|
+
<component-mapper
|
|
32
|
+
[name]="element[i].getPConnect().getComponentName()"
|
|
33
|
+
[props]="{
|
|
34
|
+
pConn$: element[i].getPConnect(),
|
|
35
|
+
formGroup$: formGroup$
|
|
36
|
+
}"
|
|
37
|
+
errorMsg="Table wants component not yet available: {{ element[i].getPConnect().getComponentName() }}"
|
|
38
|
+
></component-mapper>
|
|
39
|
+
</td>
|
|
31
40
|
</ng-container>
|
|
32
41
|
<ng-container matColumnDef="DeleteIcon">
|
|
33
42
|
<div *ngIf="allowEditingInModal">
|
|
@@ -47,6 +56,11 @@
|
|
|
47
56
|
</ng-container>
|
|
48
57
|
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
|
|
49
58
|
<tr mat-row *matRowDef="let row; columns: displayedColumns"></tr>
|
|
59
|
+
<tr class="mat-row psdk-no-records" *matNoDataRow>
|
|
60
|
+
<td id="no-records" class="mat-cell" [attr.colspan]="displayedColumns.length">
|
|
61
|
+
{{ utils.getGenericFieldsLocalizedValue('CosmosFields.fields.lists', 'No records found.') }}
|
|
62
|
+
</td>
|
|
63
|
+
</tr>
|
|
50
64
|
</table>
|
|
51
65
|
<table *ngIf="editableMode && !allowEditingInModal" mat-table [dataSource]="elementsData" class="mat-elevation-z8" id="editable-table">
|
|
52
66
|
<ng-container *ngFor="let dCol of fieldDefs; let i = index">
|
|
@@ -74,11 +88,16 @@
|
|
|
74
88
|
</ng-container>
|
|
75
89
|
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
|
|
76
90
|
<tr mat-row *matRowDef="let row; columns: displayedColumns"></tr>
|
|
91
|
+
<tr class="mat-row psdk-no-records" *matNoDataRow>
|
|
92
|
+
<td id="no-records" class="mat-cell" [attr.colspan]="displayedColumns.length">
|
|
93
|
+
{{ utils.getGenericFieldsLocalizedValue('CosmosFields.fields.lists', 'No records found.') }}
|
|
94
|
+
</td>
|
|
95
|
+
</tr>
|
|
77
96
|
</table>
|
|
78
|
-
<div class="psdk-no-records" id="no-records" *ngIf="editableMode && referenceList?.length === 0">No Records Found.</div>
|
|
79
|
-
<div class="psdk-no-records" id="no-records" *ngIf="readOnlyMode && rowData?.data?.length === 0">No Records Found.</div>
|
|
80
97
|
</div>
|
|
81
|
-
<button *ngIf="showAddRowButton" mat-button color="primary" style="font-size: 16px" (click)="addRecord()"
|
|
98
|
+
<button *ngIf="showAddRowButton" mat-button color="primary" style="font-size: 16px" (click)="addRecord()">
|
|
99
|
+
+ {{ localizedVal('Add', localeCategory) }}
|
|
100
|
+
</button>
|
|
82
101
|
</ng-container>
|
|
83
102
|
|
|
84
103
|
<!-- pop overs for filters-->
|
|
@@ -4,6 +4,11 @@
|
|
|
4
4
|
width: 100%;
|
|
5
5
|
margin-top: 0.5rem;
|
|
6
6
|
margin-bottom: 0.5rem;
|
|
7
|
+
overflow-y: auto;
|
|
8
|
+
box-shadow:
|
|
9
|
+
0px 2px 1px -1px rgba(0, 0, 0, 0.2),
|
|
10
|
+
0px 1px 1px 0px rgba(0, 0, 0, 0.14),
|
|
11
|
+
0px 1px 3px 0px rgba(0, 0, 0, 0.12);
|
|
7
12
|
}
|
|
8
13
|
|
|
9
14
|
table {
|
|
@@ -23,6 +28,12 @@ td.mat-mdc-cell,
|
|
|
23
28
|
td.mat-mdc-footer-cell {
|
|
24
29
|
border-right: 1px solid var(--app-neutral-light-color);
|
|
25
30
|
padding: 8px !important;
|
|
31
|
+
min-width: 10rem;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
::ng-deep th.mat-mdc-header-cell:last-child,
|
|
35
|
+
td.mat-mdc-cell:last-child {
|
|
36
|
+
min-width: 2rem;
|
|
26
37
|
}
|
|
27
38
|
|
|
28
39
|
::ng-deep .mat-mdc-button {
|
|
@@ -159,9 +170,7 @@ tr.mat-mdc-header-row {
|
|
|
159
170
|
|
|
160
171
|
.psdk-no-records {
|
|
161
172
|
height: 56px;
|
|
162
|
-
|
|
163
|
-
display: flex;
|
|
164
|
-
align-items: center;
|
|
173
|
+
text-align: center;
|
|
165
174
|
border: 1px solid var(--app-neutral-light-color);
|
|
166
175
|
border-top: none;
|
|
167
176
|
background: var(--app-form-color);
|