@pega/custom-dx-components 2.0.10 → 2.0.12
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/README.md +73 -57
- package/package.json +2 -2
- package/src/cli.js +18 -0
- package/src/tasks/authenticate/index.js +3 -1
- package/src/tasks/build/helper.js +123 -0
- package/src/tasks/build/index.js +54 -0
- package/src/tasks/{publish/bundle → bundle}/builder/index.js +0 -0
- package/src/tasks/{publish/bundle → bundle}/builder/modules.js +0 -0
- package/src/tasks/{publish/bundle → bundle}/builder/paths.js +0 -0
- package/src/tasks/{publish/bundle → bundle}/builder/webpack.config.js +2 -4
- package/src/tasks/{publish/bundle → bundle}/index.js +2 -2
- package/src/tasks/create/index.js +6 -3
- package/src/tasks/create/templates/Constellation/Field/Boolean/boolean-format.js.mustache +1 -1
- package/src/tasks/create/templates/Constellation/Field/Boolean/demo.stories.jsx.mustache +29 -18
- package/src/tasks/create/templates/Constellation/Field/Boolean/index.jsx.mustache +1 -2
- package/src/tasks/create/templates/Constellation/Field/Boolean/mock.stories.js.mustache +21 -0
- package/src/tasks/create/templates/Constellation/Field/Date/DateFormatter.js.mustache +61 -0
- package/src/tasks/create/templates/Constellation/Field/Date/FormattedText.jsx.mustache +41 -0
- package/src/tasks/create/templates/Constellation/Field/Date/date.js.mustache +179 -67
- package/src/tasks/create/templates/Constellation/Field/Date/demo.stories.jsx.mustache +39 -16
- package/src/tasks/create/templates/Constellation/Field/Date/index.jsx.mustache +3 -1
- package/src/tasks/create/templates/Constellation/Field/Date/mock.stories.js.mustache +23 -0
- package/src/tasks/create/templates/Constellation/Field/DateTime/date-time.js.mustache +0 -1
- package/src/tasks/create/templates/Constellation/Field/DateTime/{date-utils.js → date-utils.js.mustache} +1 -0
- package/src/tasks/create/templates/Constellation/Field/DateTime/date.js.mustache +1 -0
- package/src/tasks/create/templates/Constellation/Field/DateTime/demo.stories.jsx.mustache +39 -15
- package/src/tasks/create/templates/Constellation/Field/DateTime/index.jsx.mustache +2 -0
- package/src/tasks/create/templates/Constellation/Field/DateTime/mock.stories.js.mustache +23 -0
- package/src/tasks/create/templates/Constellation/Field/Decimal/demo.stories.jsx.mustache +22 -17
- package/src/tasks/create/templates/Constellation/Field/Decimal/index.jsx.mustache +2 -1
- package/src/tasks/create/templates/Constellation/Field/Decimal/mock.stories.js.mustache +21 -0
- package/src/tasks/create/templates/Constellation/Field/Decimal-Currency/demo.stories.jsx.mustache +25 -17
- package/src/tasks/create/templates/Constellation/Field/Decimal-Currency/index.jsx.mustache +3 -4
- package/src/tasks/create/templates/Constellation/Field/Decimal-Currency/mock.stories.js.mustache +23 -0
- package/src/tasks/create/templates/Constellation/Field/Decimal-Percentage/demo.stories.jsx.mustache +22 -17
- package/src/tasks/create/templates/Constellation/Field/Decimal-Percentage/index.jsx.mustache +8 -2
- package/src/tasks/create/templates/Constellation/Field/Decimal-Percentage/mock.stories.js.mustache +21 -0
- package/src/tasks/create/templates/Constellation/Field/Integer/demo.stories.jsx.mustache +22 -17
- package/src/tasks/create/templates/Constellation/Field/Integer/index.jsx.mustache +2 -1
- package/src/tasks/create/templates/Constellation/Field/Integer/mock.stories.js.mustache +21 -0
- package/src/tasks/create/templates/Constellation/Field/Picklist/demo.stories.jsx.mustache +42 -14
- package/src/tasks/create/templates/Constellation/Field/Picklist/index.jsx.mustache +44 -1
- package/src/tasks/create/templates/Constellation/Field/Picklist/mock.stories.js.mustache +67 -0
- package/src/tasks/create/templates/Constellation/Field/Text/demo.stories.jsx.mustache +21 -16
- package/src/tasks/create/templates/Constellation/Field/Text/mock.stories.js.mustache +13 -0
- package/src/tasks/create/templates/Constellation/Field/Text-Email/demo.stories.jsx.mustache +20 -16
- package/src/tasks/create/templates/Constellation/Field/Text-Email/index.jsx.mustache +44 -2
- package/src/tasks/create/templates/Constellation/Field/Text-Email/mock.stories.js.mustache +22 -0
- package/src/tasks/create/templates/Constellation/Field/Text-Input/{StatusWork.js → StatusWork.jsx} +0 -1
- package/src/tasks/create/templates/Constellation/Field/Text-Input/demo.stories.jsx.mustache +21 -17
- package/src/tasks/create/templates/Constellation/Field/Text-Input/index.jsx.mustache +46 -3
- package/src/tasks/create/templates/Constellation/Field/Text-Input/mock.stories.js.mustache +21 -0
- package/src/tasks/create/templates/Constellation/Field/Text-Paragraph/demo.stories.jsx.mustache +21 -17
- package/src/tasks/create/templates/Constellation/Field/Text-Paragraph/index.jsx.mustache +44 -2
- package/src/tasks/create/templates/Constellation/Field/Text-Paragraph/mock.stories.js.mustache +20 -0
- package/src/tasks/create/templates/Constellation/Field/Text-Phone/demo.stories.jsx.mustache +19 -17
- package/src/tasks/create/templates/Constellation/Field/Text-Phone/index.jsx.mustache +46 -2
- package/src/tasks/create/templates/Constellation/Field/Text-Phone/mock.stories.js.mustache +37 -0
- package/src/tasks/create/templates/Constellation/Field/Text-URL/demo.stories.jsx.mustache +19 -17
- package/src/tasks/create/templates/Constellation/Field/Text-URL/index.jsx.mustache +174 -3
- package/src/tasks/create/templates/Constellation/Field/Text-URL/mock.stories.js.mustache +22 -0
- package/src/tasks/create/templates/Constellation/Field/TimeofDay/demo.stories.jsx.mustache +24 -16
- package/src/tasks/create/templates/Constellation/Field/TimeofDay/mock.stories.js.mustache +20 -0
- package/src/tasks/create/templates/Constellation/Field/TimeofDay/time-of-day.js.mustache +1 -0
- package/src/tasks/create/templates/Constellation/Template/DETAILS/StatusWork.jsx.mustache +26 -0
- package/src/tasks/create/templates/Constellation/Template/DETAILS/demo.stories.jsx.mustache +110 -0
- package/src/tasks/create/templates/Constellation/Template/DETAILS/index.jsx.mustache +14 -29
- package/src/tasks/create/templates/Constellation/Template/DETAILS/mock.stories.js.mustache +179 -0
- package/src/tasks/create/templates/Constellation/Template/DETAILS/utils.js.mustache +3 -77
- package/src/tasks/create/templates/Constellation/Template/DETAILS-region/StatusWork.jsx.mustache +26 -0
- package/src/tasks/create/templates/Constellation/Template/DETAILS-region/demo.stories.jsx.mustache +118 -0
- package/src/tasks/create/templates/Constellation/Template/DETAILS-region/index.jsx.mustache +14 -29
- package/src/tasks/create/templates/Constellation/Template/DETAILS-region/mock.stories.js.mustache +215 -0
- package/src/tasks/create/templates/Constellation/Template/DETAILS-region/utils.js.mustache +3 -74
- package/src/tasks/create/templates/Constellation/Template/FORM/demo.stories.jsx.mustache +89 -0
- package/src/tasks/create/templates/Constellation/Template/FORM/index.jsx.mustache +6 -10
- package/src/tasks/create/templates/Constellation/Template/FORM/mock.stories.js.mustache +125 -0
- package/src/tasks/create/templates/Constellation/Template/FORM-region/demo.stories.jsx.mustache +92 -0
- package/src/tasks/create/templates/Constellation/Template/FORM-region/index.jsx.mustache +10 -8
- package/src/tasks/create/templates/Constellation/Template/FORM-region/mock.stories.js.mustache +125 -0
- package/src/tasks/create/templates/Constellation/Template/PAGE/{GetNextWork.js.mustache → GetNextWork.jsx.mustache} +6 -0
- package/src/tasks/create/templates/Constellation/Template/PAGE/demo.stories.jsx.mustache +102 -0
- package/src/tasks/create/templates/Constellation/Template/PAGE/index.jsx.mustache +9 -7
- package/src/tasks/create/templates/Constellation/Template/PAGE/mock.stories.js.mustache +94 -0
- package/src/tasks/create/templates/Constellation/Template/PAGE/styles.js.mustache +1 -1
- package/src/tasks/create/templates/Constellation/Template/PAGE/utils.js.mustache +4 -1
- package/src/tasks/create/templates/Constellation/Widget/CASE/demo.stories.jsx.mustache +78 -0
- package/src/tasks/create/templates/Constellation/Widget/CASE/index.jsx.mustache +1 -0
- package/src/tasks/create/templates/Constellation/Widget/CASE/mock.stories.js.mustache +389 -0
- package/src/tasks/create/templates/Constellation/Widget/CASE/styles.js.mustache +1 -1
- package/src/tasks/create/templates/Constellation/Widget/PAGE/demo.stories.jsx.mustache +30 -0
- package/src/tasks/create/templates/Constellation/Widget/PAGE/index.jsx.mustache +8 -8
- package/src/tasks/create/templates/Constellation/Widget/PAGE/mock.stories.js.mustache +22 -0
- package/src/tasks/create/templates/Constellation/Widget/PAGE/styles.js.mustache +1 -1
- package/src/tasks/create/templates/Constellation/Widget/PAGE-CASE/{Avatar.js.mustache → Avatar.jsx.mustache} +2 -0
- package/src/tasks/create/templates/Constellation/Widget/PAGE-CASE/{Operator.js.mustache → Operator.jsx.mustache} +2 -1
- package/src/tasks/create/templates/Constellation/Widget/PAGE-CASE/demo.stories.jsx.mustache +68 -0
- package/src/tasks/create/templates/Constellation/Widget/PAGE-CASE/index.jsx.mustache +9 -9
- package/src/tasks/create/templates/Constellation/Widget/PAGE-CASE/mock.stories.js.mustache +51 -0
- package/src/tasks/create/templates/Constellation/Widget/PAGE-CASE/styles.js.mustache +1 -1
- package/src/tasks/delete/helper.js +4 -0
- package/src/tasks/delete/index.js +4 -0
- package/src/tasks/delete-all/helper.js +175 -0
- package/src/tasks/delete-all/index.js +49 -0
- package/src/tasks/index.js +3 -0
- package/src/tasks/init/index.js +1 -1
- package/src/tasks/init/template/.eslintignore +8 -0
- package/src/tasks/init/template/.eslintrc.json +186 -5
- package/src/tasks/init/template/package.json.mustache +19 -4
- package/src/tasks/linter/index.js +46 -0
- package/src/tasks/list/index.js +4 -0
- package/src/tasks/publish/index.js +14 -1
- package/src/tasks/publish-all/helper.js +139 -0
- package/src/tasks/publish-all/index.js +84 -0
- package/src/util.js +10 -0
- package/src/tasks/create/templates/Constellation/Field/Picklist/picklist.js.mustache +0 -43
- package/src/tasks/create/templates/Constellation/Field/Text-Email/text-email.js.mustache +0 -43
- package/src/tasks/create/templates/Constellation/Field/Text-Input/text-input.js.mustache +0 -43
- package/src/tasks/create/templates/Constellation/Field/Text-Paragraph/text-paragraph.js.mustache +0 -43
- package/src/tasks/create/templates/Constellation/Field/Text-Phone/text-phone.js.mustache +0 -43
- package/src/tasks/create/templates/Constellation/Field/Text-URL/text-url.js.mustache +0 -172
|
@@ -4,16 +4,60 @@ import {
|
|
|
4
4
|
getPhoneNumberParts,
|
|
5
5
|
PhoneDisplay,
|
|
6
6
|
FieldValueList,
|
|
7
|
-
Text
|
|
7
|
+
Text,
|
|
8
|
+
EmailDisplay, URLDisplay
|
|
8
9
|
} from '@pega/cosmos-react-core';
|
|
9
10
|
import PropTypes from 'prop-types';
|
|
10
11
|
|
|
11
12
|
// includes in bundle
|
|
12
|
-
import {formatExists,textFormatter} from "./text-phone";
|
|
13
13
|
import handleEvent from "./event-utils";
|
|
14
14
|
import { suggestionsHandler } from './suggestions-handler';
|
|
15
15
|
|
|
16
16
|
import Styled{{COMPONENT_CLASS_NAME}}Wrapper from './styles';
|
|
17
|
+
import { } from "@pega/cosmos-react-core";
|
|
18
|
+
|
|
19
|
+
export const formatExists = (formatterVal) => {
|
|
20
|
+
const formatterValues = [
|
|
21
|
+
"TextInput",
|
|
22
|
+
"WorkStatus",
|
|
23
|
+
"RichText",
|
|
24
|
+
"Email",
|
|
25
|
+
"Phone",
|
|
26
|
+
"URL",
|
|
27
|
+
"Operator"
|
|
28
|
+
];
|
|
29
|
+
let isformatter = false;
|
|
30
|
+
if (formatterValues.includes(formatterVal)) {
|
|
31
|
+
isformatter = true;
|
|
32
|
+
}
|
|
33
|
+
return isformatter;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
export const textFormatter = (formatter,value) => {
|
|
38
|
+
let displayComponent = null;
|
|
39
|
+
switch(formatter){
|
|
40
|
+
case "TextInput" : {
|
|
41
|
+
displayComponent = value;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
case "Email" : {
|
|
45
|
+
displayComponent = (<EmailDisplay value={value} displayText={value} variant="link" />);
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
case "Phone" : {
|
|
49
|
+
displayComponent = (<PhoneDisplay value={value} variant="link" />);
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
case "URL" : {
|
|
53
|
+
displayComponent = (<URLDisplay target="_blank" value={value} displayText={value} variant="link" />);
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
// no default
|
|
57
|
+
}
|
|
58
|
+
return displayComponent;
|
|
59
|
+
};
|
|
60
|
+
|
|
17
61
|
|
|
18
62
|
|
|
19
63
|
// Duplicated runtime code from Constellation Design System Component
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export const configProps = {
|
|
2
|
+
value: '',
|
|
3
|
+
label: 'Phone Sample',
|
|
4
|
+
datasource: {
|
|
5
|
+
source: [
|
|
6
|
+
{
|
|
7
|
+
value: '+1'
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
value: '+91'
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
value: '+48'
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
value: '+44'
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
fields: {}
|
|
20
|
+
},
|
|
21
|
+
showCountryCode: true,
|
|
22
|
+
placeholder: 'Phone Placeholder',
|
|
23
|
+
helperText: 'Phone Helper Text',
|
|
24
|
+
testId: 'phone-12345678',
|
|
25
|
+
hasSuggestions: false
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const stateProps = {
|
|
29
|
+
value: '.PhoneSample',
|
|
30
|
+
datasource: {
|
|
31
|
+
source: 'D_pyCountryCallingCodeList.pxResults',
|
|
32
|
+
fields: {
|
|
33
|
+
value: '.pyCallingCode'
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
hasSuggestions: false
|
|
37
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { withKnobs, text, boolean } from '@storybook/addon-knobs';
|
|
1
|
+
import { withKnobs } from '@storybook/addon-knobs';
|
|
3
2
|
|
|
4
3
|
import {{COMPONENT_CLASS_NAME}} from './index.jsx';
|
|
4
|
+
import { stateProps, configProps } from './mock.stories';
|
|
5
5
|
|
|
6
6
|
export default {
|
|
7
7
|
title: '{{COMPONENT_CLASS_NAME}}',
|
|
@@ -10,30 +10,32 @@ export default {
|
|
|
10
10
|
};
|
|
11
11
|
|
|
12
12
|
export const base{{COMPONENT_CLASS_NAME}} = () => {
|
|
13
|
-
const [value, setValue] = useState('test value');
|
|
14
13
|
|
|
15
14
|
const props = {
|
|
15
|
+
value: configProps.value,
|
|
16
|
+
placeholder: configProps.placeholder,
|
|
17
|
+
label: configProps.label,
|
|
18
|
+
helperText: configProps.helperText,
|
|
19
|
+
testId: configProps.testId,
|
|
20
|
+
hasSuggestions: configProps.hasSuggestions,
|
|
21
|
+
|
|
16
22
|
getPConnect: () => {
|
|
17
23
|
return {
|
|
24
|
+
getStateProps: () => {
|
|
25
|
+
return stateProps;
|
|
26
|
+
},
|
|
18
27
|
getActionsApi: () => {
|
|
19
28
|
return {
|
|
20
|
-
updateFieldValue: (
|
|
21
|
-
|
|
22
|
-
}
|
|
29
|
+
updateFieldValue: () => {},
|
|
30
|
+
triggerFieldChange: () => {}
|
|
23
31
|
};
|
|
24
32
|
},
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
33
|
+
ignoreSuggestion: () => {},
|
|
34
|
+
acceptSuggestion: () => {},
|
|
35
|
+
setInheritedProps: () => {},
|
|
36
|
+
resolveConfigProps: () => {}
|
|
28
37
|
};
|
|
29
|
-
}
|
|
30
|
-
value,
|
|
31
|
-
placeholder: text('Placeholder', 'Test placeholder'),
|
|
32
|
-
disabled: boolean('Disabled', false),
|
|
33
|
-
readOnly: boolean('Disabled', false),
|
|
34
|
-
required: boolean('Disabled', false),
|
|
35
|
-
label: text('Label', 'Sample Label'),
|
|
36
|
-
testId: text('Test id', 'text-12344566')
|
|
38
|
+
}
|
|
37
39
|
};
|
|
38
40
|
|
|
39
41
|
return (
|
|
@@ -1,14 +1,185 @@
|
|
|
1
|
-
import { useState, useEffect, useRef} from "react";
|
|
2
|
-
import { Input, FieldValueList, Text } from "@pega/cosmos-react-core";
|
|
1
|
+
import { useState, useEffect, useRef, React} from "react";
|
|
2
|
+
import { Input, FieldValueList, Text, EmailDisplay, PhoneDisplay, URLDisplay, Button, Lightbox, Image } from "@pega/cosmos-react-core";
|
|
3
3
|
import PropTypes from "prop-types";
|
|
4
4
|
|
|
5
5
|
// includes in bundle
|
|
6
|
-
import {formatExists,textFormatter, urlFormatter, suggestionHandler} from "./text-url";
|
|
7
6
|
import handleEvent from "./event-utils";
|
|
8
7
|
import { suggestionsHandler } from './suggestions-handler';
|
|
9
8
|
|
|
10
9
|
import Styled{{COMPONENT_CLASS_NAME}}Wrapper from './styles';
|
|
11
10
|
|
|
11
|
+
export const formatExists = (formatterVal) => {
|
|
12
|
+
const formatterValues = [
|
|
13
|
+
"TextInput",
|
|
14
|
+
"WorkStatus",
|
|
15
|
+
"RichText",
|
|
16
|
+
"Email",
|
|
17
|
+
"Phone",
|
|
18
|
+
"URL",
|
|
19
|
+
"Operator"
|
|
20
|
+
];
|
|
21
|
+
let isformatter = false;
|
|
22
|
+
if (formatterValues.includes(formatterVal)) {
|
|
23
|
+
isformatter = true;
|
|
24
|
+
}
|
|
25
|
+
return isformatter;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const urlLabelVal = (urlLabelSelection, btnVal, urlLabel, propUrlLabel) => {
|
|
29
|
+
if ((urlLabel !== '' || propUrlLabel !== '') && btnVal !== null) {
|
|
30
|
+
switch (urlLabelSelection) {
|
|
31
|
+
case 'constant': {
|
|
32
|
+
btnVal = urlLabel;
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
case 'propertyRef': {
|
|
36
|
+
btnVal = propUrlLabel;
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
// no default
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return btnVal;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const isImage = (url) => /\.(jpg|jpeg|png|webp|avif|gif|svg)$/.test(url);
|
|
46
|
+
|
|
47
|
+
const TableImage = (imageProps) => {
|
|
48
|
+
const { value, altText, altTextOfImage, propaltTextOfImage, urlLabelSelection, urlLabel, propUrlLabel } = imageProps;
|
|
49
|
+
const demoButtonRef = useRef(null);
|
|
50
|
+
let imageDisplayComp = null;
|
|
51
|
+
const [images, setImages] = useState(null);
|
|
52
|
+
const imgDescription = {
|
|
53
|
+
id: 'url',
|
|
54
|
+
name: urlLabelSelection === 'constant' ? urlLabel : propUrlLabel,
|
|
55
|
+
description: altText === 'constant' ? altTextOfImage : propaltTextOfImage,
|
|
56
|
+
src: value
|
|
57
|
+
};
|
|
58
|
+
const onClick = () => {
|
|
59
|
+
setImages([imgDescription]);
|
|
60
|
+
};
|
|
61
|
+
const onItemDownload = async (id) => {
|
|
62
|
+
const a = document.createElement('a');
|
|
63
|
+
a.href = await fetch(images[0].src)
|
|
64
|
+
.then((response) => {
|
|
65
|
+
return response.blob();
|
|
66
|
+
})
|
|
67
|
+
.then((blob) => {
|
|
68
|
+
return URL.createObjectURL(blob);
|
|
69
|
+
});
|
|
70
|
+
a.download = images?.find((image) => image.id === id)?.name ?? id;
|
|
71
|
+
document.body.appendChild(a);
|
|
72
|
+
a.click();
|
|
73
|
+
document.body.removeChild(a);
|
|
74
|
+
};
|
|
75
|
+
let btnVal = value;
|
|
76
|
+
btnVal = urlLabelVal(urlLabelSelection, btnVal, urlLabel, propUrlLabel);
|
|
77
|
+
imageDisplayComp = (
|
|
78
|
+
<React.Fragment>
|
|
79
|
+
{btnVal !== null && (
|
|
80
|
+
<Button ref={demoButtonRef} variant='link' compact={false} onClick={onClick} autoFocus>
|
|
81
|
+
{btnVal}
|
|
82
|
+
</Button>
|
|
83
|
+
)}
|
|
84
|
+
{images && (
|
|
85
|
+
<Lightbox
|
|
86
|
+
items={images}
|
|
87
|
+
cycle={false}
|
|
88
|
+
onAfterClose={() => {
|
|
89
|
+
setImages(null);
|
|
90
|
+
demoButtonRef.current?.focus();
|
|
91
|
+
}}
|
|
92
|
+
onItemDownload={isImage(images[0].src) ? onItemDownload : undefined}
|
|
93
|
+
/>
|
|
94
|
+
)}
|
|
95
|
+
</React.Fragment>
|
|
96
|
+
);
|
|
97
|
+
return imageDisplayComp;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export const textFormatter = (formatter,value) => {
|
|
101
|
+
let displayComponent = null;
|
|
102
|
+
switch(formatter){
|
|
103
|
+
case "TextInput" : {
|
|
104
|
+
displayComponent = value;
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
case "Email" : {
|
|
108
|
+
displayComponent = (<EmailDisplay value={value} displayText={value} variant="link" />);
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
case "Phone" : {
|
|
112
|
+
displayComponent = (<PhoneDisplay value={value} variant="link" />);
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
case "URL" : {
|
|
116
|
+
displayComponent = (<URLDisplay target="_blank" value={value} displayText={value} variant="link" />);
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
// no default
|
|
120
|
+
}
|
|
121
|
+
return displayComponent;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Returns a URL display component based on the options
|
|
126
|
+
* @function urlFormatter
|
|
127
|
+
* @param {string} value value
|
|
128
|
+
* @param {object} options options for formatting
|
|
129
|
+
* { displayAs,tableDisplayAs,isTableFormatter,altText,altTextOfImage,propaltTextOfImage,urlLabelSelection, urlLabel,propUrlLabel, widthSel, customWidth}
|
|
130
|
+
*/
|
|
131
|
+
export const urlFormatter = (value, options) => {
|
|
132
|
+
const {
|
|
133
|
+
displayAs,
|
|
134
|
+
tableDisplayAs,
|
|
135
|
+
isTableFormatter,
|
|
136
|
+
altText,
|
|
137
|
+
altTextOfImage,
|
|
138
|
+
propaltTextOfImage,
|
|
139
|
+
urlLabelSelection,
|
|
140
|
+
urlLabel,
|
|
141
|
+
propUrlLabel,
|
|
142
|
+
widthSel,
|
|
143
|
+
customWidth
|
|
144
|
+
} = options;
|
|
145
|
+
|
|
146
|
+
let urlFormatComp = null;
|
|
147
|
+
if (
|
|
148
|
+
(displayAs === 'labelText' || (isTableFormatter && tableDisplayAs === 'link')) &&
|
|
149
|
+
(urlLabel !== '' || propUrlLabel !== '')
|
|
150
|
+
) {
|
|
151
|
+
urlFormatComp = (
|
|
152
|
+
<URLDisplay
|
|
153
|
+
target='_blank'
|
|
154
|
+
value={value}
|
|
155
|
+
displayText={urlLabelSelection === 'constant' ? urlLabel : propUrlLabel}
|
|
156
|
+
variant='link'
|
|
157
|
+
/>
|
|
158
|
+
);
|
|
159
|
+
} else if ((displayAs === 'Image' || tableDisplayAs === 'Image') && !!value) {
|
|
160
|
+
if (isTableFormatter) {
|
|
161
|
+
urlFormatComp = TableImage({
|
|
162
|
+
value,
|
|
163
|
+
altText,
|
|
164
|
+
altTextOfImage,
|
|
165
|
+
propaltTextOfImage,
|
|
166
|
+
urlLabelSelection,
|
|
167
|
+
urlLabel,
|
|
168
|
+
propUrlLabel
|
|
169
|
+
});
|
|
170
|
+
} else {
|
|
171
|
+
const width = widthSel === 'widthpx' ? customWidth : null;
|
|
172
|
+
urlFormatComp = (
|
|
173
|
+
<Image src={value} width={width} alt={altText === 'constant' ? altTextOfImage : propaltTextOfImage} />
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
} else {
|
|
177
|
+
urlFormatComp = <URLDisplay target='_blank' value={value} displayText={value} variant='link' />;
|
|
178
|
+
}
|
|
179
|
+
return urlFormatComp;
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
|
|
12
183
|
|
|
13
184
|
// Duplicated runtime code from Constellation Design System Component
|
|
14
185
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const configProps = {
|
|
2
|
+
value: '',
|
|
3
|
+
label: 'URL Sample',
|
|
4
|
+
placeholder: 'URL Placeholder',
|
|
5
|
+
helperText: 'URL Helper Text',
|
|
6
|
+
testId: 'url-12345678',
|
|
7
|
+
hasSuggestions: false
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export const fieldMetadata = {
|
|
11
|
+
classID: 'DIXL-MediaCo-Work-NewService',
|
|
12
|
+
type: 'Text',
|
|
13
|
+
maxLength: 256,
|
|
14
|
+
displayAs: 'pxURL',
|
|
15
|
+
label: 'URL sample',
|
|
16
|
+
validateAs: 'pxIsValidURL'
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const stateProps = {
|
|
20
|
+
value: '.URLSample',
|
|
21
|
+
hasSuggestions: false
|
|
22
|
+
};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { useState } from 'react';
|
|
2
1
|
import { withKnobs, text, boolean } from '@storybook/addon-knobs';
|
|
3
|
-
|
|
2
|
+
import { configProps, stateProps } from './mock.stories';
|
|
4
3
|
import {{COMPONENT_CLASS_NAME}} from './index.jsx';
|
|
5
4
|
|
|
6
5
|
export default {
|
|
@@ -10,30 +9,39 @@ export default {
|
|
|
10
9
|
};
|
|
11
10
|
|
|
12
11
|
export const base{{COMPONENT_CLASS_NAME}} = () => {
|
|
13
|
-
const [value, setValue] = useState('test value');
|
|
14
|
-
|
|
15
12
|
const props = {
|
|
16
13
|
getPConnect: () => {
|
|
17
14
|
return {
|
|
18
15
|
getActionsApi: () => {
|
|
19
16
|
return {
|
|
20
|
-
updateFieldValue: (
|
|
21
|
-
|
|
22
|
-
}
|
|
17
|
+
updateFieldValue: () => {},
|
|
18
|
+
triggerFieldChange: () => {}
|
|
23
19
|
};
|
|
24
20
|
},
|
|
25
21
|
getStateProps: () => {
|
|
26
|
-
return
|
|
27
|
-
}
|
|
22
|
+
return stateProps;
|
|
23
|
+
},
|
|
24
|
+
getConfigProps: () => {
|
|
25
|
+
return configProps;
|
|
26
|
+
},
|
|
27
|
+
ignoreSuggestion: () => {},
|
|
28
|
+
clearErrorMessages: () => {}
|
|
28
29
|
};
|
|
29
30
|
},
|
|
30
|
-
value,
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
testId:
|
|
31
|
+
value: configProps.value,
|
|
32
|
+
validatemessage: configProps.validatemessage,
|
|
33
|
+
label: configProps.label,
|
|
34
|
+
hideLabel: configProps.hideLabel,
|
|
35
|
+
helperText: configProps.helperText,
|
|
36
|
+
withSeconds: configProps.withSeconds,
|
|
37
|
+
testId: configProps.testId,
|
|
38
|
+
additionalProps: configProps.additionalProps,
|
|
39
|
+
displayMode: configProps.displayMode,
|
|
40
|
+
variant: configProps.variant,
|
|
41
|
+
hasSuggestions: configProps.hasSuggestions,
|
|
42
|
+
disabled: configProps.disabled,
|
|
43
|
+
readOnly: configProps.readOnly,
|
|
44
|
+
required: configProps.required
|
|
37
45
|
};
|
|
38
46
|
|
|
39
47
|
return (
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const configProps = {
|
|
2
|
+
value: '13:30',
|
|
3
|
+
validatemessage: '',
|
|
4
|
+
label: 'TimeOfDay Label',
|
|
5
|
+
hideLabel: false,
|
|
6
|
+
helperText: 'TimeOfDay helper text',
|
|
7
|
+
withSeconds: false,
|
|
8
|
+
testId: '12345678',
|
|
9
|
+
additionalProps: {},
|
|
10
|
+
displayMode: '',
|
|
11
|
+
variant: '',
|
|
12
|
+
hasSuggestions: false,
|
|
13
|
+
readOnly: false,
|
|
14
|
+
required: false,
|
|
15
|
+
disabled: false
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export const stateProps = {
|
|
19
|
+
value: '.TimeOfDayLabel'
|
|
20
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Status } from "@pega/cosmos-react-core";
|
|
2
|
+
|
|
3
|
+
export default function StatusWorkRenderer({ value }) {
|
|
4
|
+
let variant = "info";
|
|
5
|
+
|
|
6
|
+
const warnStrings = ["fail", "cancel", "reject", "revoke", "stopped", "warn"];
|
|
7
|
+
const infoStrings = ["open", "hold", "info", "new"];
|
|
8
|
+
const successStrings = ["resolved", "completed", "success"];
|
|
9
|
+
const pendingStrings = ["pending"];
|
|
10
|
+
|
|
11
|
+
if (new RegExp(warnStrings.join("|"), "i").test(value)) {
|
|
12
|
+
variant = "warn";
|
|
13
|
+
} else if (new RegExp(infoStrings.join("|"), "i").test(value)) {
|
|
14
|
+
variant = "info";
|
|
15
|
+
} else if (new RegExp(successStrings.join("|"), "i").test(value)) {
|
|
16
|
+
variant = "success";
|
|
17
|
+
} else if (new RegExp(pendingStrings.join("|"), "i").test(value)) {
|
|
18
|
+
variant = "pending";
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<Status type="rectangle" variant={variant}>
|
|
23
|
+
{value}
|
|
24
|
+
</Status>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Text, FieldValueList, Button, DateTimeDisplay, useTheme } from '@pega/cosmos-react-core';
|
|
2
|
+
import {{COMPONENT_CLASS_NAME}} from './index';
|
|
3
|
+
import { pyReviewRaw, pyReviewResolved, regionChildrenResolved } from './mock.stories';
|
|
4
|
+
import StatusWorkRenderer from './StatusWork.jsx';
|
|
5
|
+
|
|
6
|
+
export default {
|
|
7
|
+
title: '{{COMPONENT_CLASS_NAME}}',
|
|
8
|
+
component: {{COMPONENT_CLASS_NAME}}
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const Template = args => {
|
|
12
|
+
const regionAChildren = pyReviewRaw.children[0].children.map(child => {
|
|
13
|
+
return Primary.args.getPConnect().createComponent(child);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
return <{{COMPONENT_CLASS_NAME}} {...args}>{regionAChildren}</{{COMPONENT_CLASS_NAME}}>;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const Primary = Template.bind({});
|
|
20
|
+
|
|
21
|
+
Primary.args = {
|
|
22
|
+
template: 'MyCo_MyComponents_NewDetailsTemplate',
|
|
23
|
+
showHighlightedData: true,
|
|
24
|
+
label: 'Test Details',
|
|
25
|
+
showLabel: true,
|
|
26
|
+
getPConnect: () => {
|
|
27
|
+
return {
|
|
28
|
+
getChildren: () => {
|
|
29
|
+
return pyReviewRaw.children;
|
|
30
|
+
},
|
|
31
|
+
getRawMetadata: () => {
|
|
32
|
+
return pyReviewRaw;
|
|
33
|
+
},
|
|
34
|
+
getInheritedProps: () => {
|
|
35
|
+
return pyReviewRaw.config.inheritedProps;
|
|
36
|
+
},
|
|
37
|
+
createComponent: config => {
|
|
38
|
+
switch (config.config.value) {
|
|
39
|
+
case '@P .pyStatusWork':
|
|
40
|
+
return renderField(pyReviewResolved.highlightedData[0].config);
|
|
41
|
+
case '@P .pyID':
|
|
42
|
+
return renderField(pyReviewResolved.highlightedData[1].config);
|
|
43
|
+
case '@P .pxCreateDateTime':
|
|
44
|
+
return renderField(pyReviewResolved.highlightedData[2].config);
|
|
45
|
+
case '@USER .pxCreateOperator':
|
|
46
|
+
return renderField(pyReviewResolved.highlightedData[3].config);
|
|
47
|
+
case '@P .pySLADeadline':
|
|
48
|
+
return renderField(regionChildrenResolved[0]);
|
|
49
|
+
case '@P .pySLAGoal':
|
|
50
|
+
return renderField(regionChildrenResolved[1]);
|
|
51
|
+
case '@P .pySLAStartTime':
|
|
52
|
+
return renderField(regionChildrenResolved[2]);
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
setInheritedProp: () => {},
|
|
56
|
+
resolveConfigProps: () => {}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const renderField = resolvedProps => {
|
|
62
|
+
const {
|
|
63
|
+
displayAsStatus = false,
|
|
64
|
+
displayMode,
|
|
65
|
+
value = '',
|
|
66
|
+
label = '',
|
|
67
|
+
theme = useTheme()
|
|
68
|
+
} = resolvedProps;
|
|
69
|
+
|
|
70
|
+
const variant = displayMode === 'LABELS_LEFT' ? 'inline' : 'stacked';
|
|
71
|
+
|
|
72
|
+
let val =
|
|
73
|
+
value != '' ? (
|
|
74
|
+
<Text variant='h1' as='span'>
|
|
75
|
+
{value}
|
|
76
|
+
</Text>
|
|
77
|
+
) : (
|
|
78
|
+
''
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
if (label === 'Create date/time')
|
|
82
|
+
val = <DateTimeDisplay value={value} variant='datetime' format='long' clockFormat={null} />;
|
|
83
|
+
|
|
84
|
+
if (displayAsStatus === true) val = <StatusWorkRenderer value={value} />;
|
|
85
|
+
|
|
86
|
+
if (label === 'Create Operator')
|
|
87
|
+
val = (
|
|
88
|
+
<Button
|
|
89
|
+
variant='link'
|
|
90
|
+
style={
|
|
91
|
+
label !== null
|
|
92
|
+
? { width: 'max-content', height: theme.components.input.height }
|
|
93
|
+
: undefined
|
|
94
|
+
}
|
|
95
|
+
>
|
|
96
|
+
{value.userName}
|
|
97
|
+
</Button>
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
if (variant === 'inline') {
|
|
101
|
+
val = value || <span aria-hidden='true'>––</span>;
|
|
102
|
+
} else {
|
|
103
|
+
val = (
|
|
104
|
+
<Text variant='h1' as='span'>
|
|
105
|
+
{val}
|
|
106
|
+
</Text>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
return <FieldValueList variant={variant} fields={[{ name: label, value: val }]} />;
|
|
110
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Grid
|
|
1
|
+
import { Fragment } from 'react';
|
|
2
|
+
import { Grid, Flex, FieldGroup } from '@pega/cosmos-react-core';
|
|
3
3
|
import PropTypes from 'prop-types';
|
|
4
4
|
|
|
5
5
|
import Styled{{COMPONENT_CLASS_NAME}}Wrapper from './styles';
|
|
@@ -13,13 +13,19 @@ import { getAllFields } from './utils';
|
|
|
13
13
|
// any default values in config.pros should be set in defaultProps at bottom of this file
|
|
14
14
|
export default function {{COMPONENT_CLASS_NAME}}(props) {
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
const { getPConnect, children, template, regionsMetadata = [], label, showLabel, showHighlightedData } = props;
|
|
18
|
-
|
|
16
|
+
const { getPConnect, children, label, showLabel, showHighlightedData } = props;
|
|
19
17
|
const propsToUse = { label, showLabel, ...getPConnect().getInheritedProps() };
|
|
20
18
|
|
|
19
|
+
const numRegions = getAllFields(getPConnect)?.length;
|
|
20
|
+
const gridRepeat = "repeat(".concat(numRegions).concat(", 1fr)");
|
|
21
|
+
const gridContainer = { "colGap": 1};
|
|
22
|
+
gridContainer.cols = gridRepeat;
|
|
23
|
+
gridContainer.alignItems = 'start';
|
|
21
24
|
|
|
22
|
-
const
|
|
25
|
+
const gridHighlightContainer = { "gap": 2};
|
|
26
|
+
gridHighlightContainer.cols = gridRepeat;
|
|
27
|
+
gridHighlightContainer.alignItems = 'start';
|
|
28
|
+
gridHighlightContainer.pad = [0, 0, 2, 0];
|
|
23
29
|
|
|
24
30
|
// Set up highlighted data to pass in return if is set to show, need raw metadata to pass to createComponent
|
|
25
31
|
let highlightedDataArr = [];
|
|
@@ -44,14 +50,14 @@ export default function {{COMPONENT_CLASS_NAME}}(props) {
|
|
|
44
50
|
{{=<% %>=}}
|
|
45
51
|
<FieldGroup name={propsToUse.showLabel ? propsToUse.label : ''}>
|
|
46
52
|
{showHighlightedData && highlightedDataArr.length > 0 && (
|
|
47
|
-
<Grid container={
|
|
53
|
+
<Grid container={gridHighlightContainer}
|
|
48
54
|
data-testid={`highlighted-column-count-${numRegions}`}>
|
|
49
55
|
{highlightedDataArr.map((child, i) => (
|
|
50
56
|
<Fragment key={`hf-${i + 1}`}>{child}</Fragment>
|
|
51
57
|
))}
|
|
52
58
|
</Grid>
|
|
53
59
|
)}
|
|
54
|
-
<Grid container={
|
|
60
|
+
<Grid container={gridContainer} data-testid={`column-count-${numRegions}`} >
|
|
55
61
|
{children.map((child, i) => (
|
|
56
62
|
<Flex container={{ direction: 'column'}} key={`r-${i + 1}`}>
|
|
57
63
|
{child}
|
|
@@ -71,31 +77,10 @@ export default function {{COMPONENT_CLASS_NAME}}(props) {
|
|
|
71
77
|
showHighlightedData: false
|
|
72
78
|
};
|
|
73
79
|
|
|
74
|
-
// Since the fields are not part of the 'config' in Details template metadata, they need to be subscribed with additionalprops
|
|
75
|
-
const mapStateToProps = (_, ownProps) => {
|
|
76
|
-
const { getPConnect, showLabel, label } = ownProps;
|
|
77
|
-
const Allfields = getAllFields(getPConnect);
|
|
78
|
-
|
|
79
|
-
return {
|
|
80
|
-
regionsMetadata: Allfields,
|
|
81
|
-
label,
|
|
82
|
-
showLabel,
|
|
83
|
-
getPConnect
|
|
84
|
-
};
|
|
85
|
-
};
|
|
86
80
|
|
|
87
81
|
{{COMPONENT_CLASS_NAME}}.propTypes = {
|
|
88
|
-
regionsMetadata: PropTypes.arrayOf(
|
|
89
|
-
PropTypes.arrayOf(
|
|
90
|
-
PropTypes.shape({
|
|
91
|
-
value: PropTypes.oneOfType([PropTypes.bool, PropTypes.string, PropTypes.number]),
|
|
92
|
-
label: PropTypes.string
|
|
93
|
-
})
|
|
94
|
-
)
|
|
95
|
-
).isRequired,
|
|
96
82
|
showLabel: PropTypes.bool,
|
|
97
83
|
label: PropTypes.string,
|
|
98
84
|
getPConnect: PropTypes.func.isRequired,
|
|
99
|
-
template: PropTypes.string.isRequired,
|
|
100
85
|
showHighlightedData: PropTypes.bool
|
|
101
86
|
};
|