@pega/cosmos-react-demos 4.0.0-dev.16.0 → 4.0.0-dev.16.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/jsx/core/AIButton/AIButton.mocks.d.ts +22 -0
- package/jsx/core/AIButton/AIButton.mocks.d.ts.map +1 -0
- package/jsx/core/AIButton/AIButton.mocks.js +136 -0
- package/jsx/core/AIButton/AIButton.mocks.js.map +1 -0
- package/jsx/core/AIButton/AIButton.stories.d.ts +19 -0
- package/jsx/core/AIButton/AIButton.stories.d.ts.map +1 -0
- package/jsx/core/AIButton/AIButton.stories.jsx +279 -0
- package/jsx/core/AIButton/AIButton.stories.jsx.map +1 -0
- package/jsx/core/FieldGroup/FieldGroup.stories.jsx +3 -3
- package/jsx/core/FieldGroup/FieldGroup.stories.jsx.map +1 -1
- package/jsx/core/MenuButton/MenuButton.stories.d.ts +1 -0
- package/jsx/core/MenuButton/MenuButton.stories.d.ts.map +1 -1
- package/jsx/core/MenuButton/MenuButton.stories.jsx +1 -1
- package/jsx/core/MenuButton/MenuButton.stories.jsx.map +1 -1
- package/jsx/core/SummaryList/SummaryList.stories.jsx +2 -2
- package/jsx/core/SummaryList/SummaryList.stories.jsx.map +1 -1
- package/jsx/work/CaseView/Attachments.mocks.d.ts.map +1 -1
- package/jsx/work/CaseView/Attachments.mocks.jsx +9 -1
- package/jsx/work/CaseView/Attachments.mocks.jsx.map +1 -1
- package/jsx/work/CaseView/CaseView.mocks.jsx +1 -1
- package/jsx/work/CaseView/CaseView.mocks.jsx.map +1 -1
- package/lib/core/AIButton/AIButton.mocks.d.ts +22 -0
- package/lib/core/AIButton/AIButton.mocks.d.ts.map +1 -0
- package/lib/core/AIButton/AIButton.mocks.js +139 -0
- package/lib/core/AIButton/AIButton.mocks.js.map +1 -0
- package/lib/core/AIButton/AIButton.stories.d.ts +19 -0
- package/lib/core/AIButton/AIButton.stories.d.ts.map +1 -0
- package/lib/core/AIButton/AIButton.stories.js +195 -0
- package/lib/core/AIButton/AIButton.stories.js.map +1 -0
- package/lib/core/FieldGroup/FieldGroup.stories.js +3 -3
- package/lib/core/FieldGroup/FieldGroup.stories.js.map +1 -1
- package/lib/core/MenuButton/MenuButton.stories.d.ts +1 -0
- package/lib/core/MenuButton/MenuButton.stories.d.ts.map +1 -1
- package/lib/core/MenuButton/MenuButton.stories.js +1 -1
- package/lib/core/MenuButton/MenuButton.stories.js.map +1 -1
- package/lib/core/SummaryList/SummaryList.stories.js +2 -2
- package/lib/core/SummaryList/SummaryList.stories.js.map +1 -1
- package/lib/work/CaseView/Attachments.mocks.d.ts.map +1 -1
- package/lib/work/CaseView/Attachments.mocks.js +9 -1
- package/lib/work/CaseView/Attachments.mocks.js.map +1 -1
- package/lib/work/CaseView/CaseView.mocks.js +1 -1
- package/lib/work/CaseView/CaseView.mocks.js.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { FormControlProps } from '@pega/cosmos-react-core';
|
|
2
|
+
interface Value {
|
|
3
|
+
name: string;
|
|
4
|
+
email: string;
|
|
5
|
+
locations: string;
|
|
6
|
+
meetings: string;
|
|
7
|
+
meals: string;
|
|
8
|
+
notes: string;
|
|
9
|
+
}
|
|
10
|
+
interface Field extends FormControlProps {
|
|
11
|
+
help?: FormControlProps['info'];
|
|
12
|
+
validator?: (this: Field) => string;
|
|
13
|
+
}
|
|
14
|
+
export declare const AIValues: Value[];
|
|
15
|
+
export declare const initFields: () => Field[];
|
|
16
|
+
export declare const fieldReducer: (fields: Field[], { type, name, value }: {
|
|
17
|
+
type: 'blur' | 'change' | 'submit' | 'cancel' | 'ai';
|
|
18
|
+
name?: string | undefined;
|
|
19
|
+
value?: string | undefined;
|
|
20
|
+
}) => Field[];
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=AIButton.mocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIButton.mocks.d.ts","sourceRoot":"","sources":["../../../src/core/AIButton/AIButton.mocks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,UAAU,KAAK;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,KAAM,SAAQ,gBAAgB;IACtC,IAAI,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC;CACrC;AAGD,eAAO,MAAM,QAAQ,EAAE,KAAK,EAyC3B,CAAC;AAGF,eAAO,MAAM,UAAU,QAAO,KAAK,EAqDlC,CAAC;AAGF,eAAO,MAAM,YAAY,WACf,KAAK,EAAE;UAMP,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI;;;aAoCvD,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
export const AIValues = [
|
|
2
|
+
{
|
|
3
|
+
name: 'Cindy Turner',
|
|
4
|
+
email: 'cindy.turner@pega.com',
|
|
5
|
+
locations: 'Waltham',
|
|
6
|
+
meetings: 'No',
|
|
7
|
+
meals: 'Pizza',
|
|
8
|
+
notes: 'If I could have a window seat, that would be much appreciated!'
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
name: 'Seth DeAngelo',
|
|
12
|
+
email: 'seth.deangelo@pega.com',
|
|
13
|
+
locations: 'Waltham,Cambridge',
|
|
14
|
+
meetings: 'Yes',
|
|
15
|
+
meals: 'Salad',
|
|
16
|
+
notes: `I selected salad for my meal, but it that is not available, I'm okay with any sandwich you have.`
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'Janet Moore',
|
|
20
|
+
email: 'janet.moore@pega.com',
|
|
21
|
+
locations: 'Krakow',
|
|
22
|
+
meetings: 'No',
|
|
23
|
+
meals: 'Sandwich',
|
|
24
|
+
notes: `I'm allergic to nuts, so please don't add any peanut butter to my sandwich.`
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'Dean Thomas',
|
|
28
|
+
email: 'dean.thomas@pega.com',
|
|
29
|
+
locations: 'Hyderabad',
|
|
30
|
+
meetings: 'Yes',
|
|
31
|
+
meals: 'Pizza',
|
|
32
|
+
notes: 'I would like to arrange my hours to avoid rush hour.'
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'Kate Mirin',
|
|
36
|
+
email: 'kate.mirin@pega.com',
|
|
37
|
+
locations: 'Waltham,Krakow,Bangalore',
|
|
38
|
+
meetings: 'Yes',
|
|
39
|
+
meals: 'Salad',
|
|
40
|
+
notes: `I'm not too picky!`
|
|
41
|
+
}
|
|
42
|
+
];
|
|
43
|
+
export const initFields = () => {
|
|
44
|
+
const common = { value: undefined, status: undefined };
|
|
45
|
+
return [
|
|
46
|
+
{
|
|
47
|
+
...common,
|
|
48
|
+
name: 'name',
|
|
49
|
+
label: 'Name',
|
|
50
|
+
required: true,
|
|
51
|
+
validator() {
|
|
52
|
+
if (!this.value)
|
|
53
|
+
return 'Please enter a first and last name';
|
|
54
|
+
return /^[a-z]+\s[a-z]+$/i.test(this.value)
|
|
55
|
+
? ''
|
|
56
|
+
: 'You need to enter a first and last name';
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
...common,
|
|
61
|
+
name: 'email',
|
|
62
|
+
label: 'Email',
|
|
63
|
+
required: true,
|
|
64
|
+
validator() {
|
|
65
|
+
if (!this.value)
|
|
66
|
+
return 'Please enter an email address';
|
|
67
|
+
return /^\S+@pega\.com$/.test(this.value) ? '' : 'Please enter an @pega.com address';
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
...common,
|
|
72
|
+
name: 'locations',
|
|
73
|
+
label: 'Which office(s) have you worked in?',
|
|
74
|
+
required: true,
|
|
75
|
+
validator() {
|
|
76
|
+
if (!this.value)
|
|
77
|
+
return 'Select at least one location';
|
|
78
|
+
return '';
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
...common,
|
|
83
|
+
name: 'meetings',
|
|
84
|
+
label: 'Do you enjoy early morning meetings?'
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
...common,
|
|
88
|
+
name: 'meals',
|
|
89
|
+
label: 'What would you like to eat?',
|
|
90
|
+
help: 'Selections will be made on a first-come basis'
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
...common,
|
|
94
|
+
name: 'notes',
|
|
95
|
+
label: 'Special requests',
|
|
96
|
+
help: 'We will take any of your requests into consideration'
|
|
97
|
+
}
|
|
98
|
+
];
|
|
99
|
+
};
|
|
100
|
+
export const fieldReducer = (fields, { type, name, value }) => {
|
|
101
|
+
return fields.map(field => {
|
|
102
|
+
if (field.name === name) {
|
|
103
|
+
if (name === 'locations' && field.value && value && type === 'change') {
|
|
104
|
+
const selectedValues = field.value.split(',');
|
|
105
|
+
const indexOfValue = selectedValues.findIndex(i => i === value);
|
|
106
|
+
if (indexOfValue !== -1) {
|
|
107
|
+
selectedValues.splice(indexOfValue, 1);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
selectedValues.push(value);
|
|
111
|
+
}
|
|
112
|
+
field.value = selectedValues.join(',');
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
field.value = value;
|
|
116
|
+
}
|
|
117
|
+
if (type === 'cancel') {
|
|
118
|
+
field.status = undefined;
|
|
119
|
+
field.info = field.help;
|
|
120
|
+
}
|
|
121
|
+
else if (type === 'blur' || type === 'submit' || field.status === 'error') {
|
|
122
|
+
const error = field.validator?.() || '';
|
|
123
|
+
if ((field.required || field.value) && error) {
|
|
124
|
+
field.status = 'error';
|
|
125
|
+
field.info = error;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
field.status = undefined;
|
|
129
|
+
field.info = field.help;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return field;
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
//# sourceMappingURL=AIButton.mocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIButton.mocks.js","sourceRoot":"","sources":["../../../src/core/AIButton/AIButton.mocks.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormControlProps } from '@pega/cosmos-react-core';\n\ninterface Value {\n name: string;\n email: string;\n locations: string;\n meetings: string;\n meals: string;\n notes: string;\n}\n\ninterface Field extends FormControlProps {\n help?: FormControlProps['info'];\n validator?: (this: Field) => string;\n}\n\n// Value sets used by the mock AI\nexport const AIValues: Value[] = [\n {\n name: 'Cindy Turner',\n email: 'cindy.turner@pega.com',\n locations: 'Waltham',\n meetings: 'No',\n meals: 'Pizza',\n notes: 'If I could have a window seat, that would be much appreciated!'\n },\n {\n name: 'Seth DeAngelo',\n email: 'seth.deangelo@pega.com',\n locations: 'Waltham,Cambridge',\n meetings: 'Yes',\n meals: 'Salad',\n notes: `I selected salad for my meal, but it that is not available, I'm okay with any sandwich you have.`\n },\n {\n name: 'Janet Moore',\n email: 'janet.moore@pega.com',\n locations: 'Krakow',\n meetings: 'No',\n meals: 'Sandwich',\n notes: `I'm allergic to nuts, so please don't add any peanut butter to my sandwich.`\n },\n {\n name: 'Dean Thomas',\n email: 'dean.thomas@pega.com',\n locations: 'Hyderabad',\n meetings: 'Yes',\n meals: 'Pizza',\n notes: 'I would like to arrange my hours to avoid rush hour.'\n },\n {\n name: 'Kate Mirin',\n email: 'kate.mirin@pega.com',\n locations: 'Waltham,Krakow,Bangalore',\n meetings: 'Yes',\n meals: 'Salad',\n notes: `I'm not too picky!`\n }\n];\n\n// Get initial field properties\nexport const initFields = (): Field[] => {\n const common = { value: undefined, status: undefined };\n return [\n {\n ...common,\n name: 'name',\n label: 'Name',\n required: true,\n validator() {\n if (!this.value) return 'Please enter a first and last name';\n return /^[a-z]+\\s[a-z]+$/i.test(this.value)\n ? ''\n : 'You need to enter a first and last name';\n }\n },\n {\n ...common,\n name: 'email',\n label: 'Email',\n required: true,\n validator() {\n if (!this.value) return 'Please enter an email address';\n return /^\\S+@pega\\.com$/.test(this.value) ? '' : 'Please enter an @pega.com address';\n }\n },\n {\n ...common,\n name: 'locations',\n label: 'Which office(s) have you worked in?',\n required: true,\n validator() {\n if (!this.value) return 'Select at least one location';\n return '';\n }\n },\n {\n ...common,\n name: 'meetings',\n label: 'Do you enjoy early morning meetings?'\n },\n {\n ...common,\n name: 'meals',\n label: 'What would you like to eat?',\n help: 'Selections will be made on a first-come basis'\n },\n {\n ...common,\n name: 'notes',\n label: 'Special requests',\n help: 'We will take any of your requests into consideration'\n }\n ];\n};\n\n// Handles setting of state for all fields\nexport const fieldReducer = (\n fields: Field[],\n {\n type,\n name,\n value\n }: {\n type: 'blur' | 'change' | 'submit' | 'cancel' | 'ai';\n name?: string;\n value?: string;\n }\n) => {\n return fields.map(field => {\n if (field.name === name) {\n if (name === 'locations' && field.value && value && type === 'change') {\n const selectedValues = field.value.split(',');\n const indexOfValue = selectedValues.findIndex(i => i === value);\n if (indexOfValue !== -1) {\n selectedValues.splice(indexOfValue, 1);\n } else {\n selectedValues.push(value);\n }\n field.value = selectedValues.join(',');\n } else {\n field.value = value;\n }\n\n if (type === 'cancel') {\n field.status = undefined;\n field.info = field.help;\n } else if (type === 'blur' || type === 'submit' || field.status === 'error') {\n const error = field.validator?.() || '';\n if ((field.required || field.value) && error) {\n field.status = 'error';\n field.info = error;\n } else {\n field.status = undefined;\n field.info = field.help;\n }\n }\n }\n return field;\n });\n};\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Meta, Story } from '@storybook/react';
|
|
2
|
+
import { AIButtonProps } from '@pega/cosmos-react-core';
|
|
3
|
+
declare const _default: Meta;
|
|
4
|
+
export default _default;
|
|
5
|
+
export declare const AIButtonDemo: Story<AIButtonProps>;
|
|
6
|
+
interface AIButtonFormProps {
|
|
7
|
+
throwAIError: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare const AIButtonFormDemo: Story<AIButtonFormProps>;
|
|
10
|
+
export declare const AIButtonFormInModalDemo: Story<AIButtonFormProps>;
|
|
11
|
+
interface ConfigurableButtonProps {
|
|
12
|
+
borderWidth?: string;
|
|
13
|
+
borderRadius?: number;
|
|
14
|
+
color?: string;
|
|
15
|
+
secondaryColor?: string;
|
|
16
|
+
padding?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare const ConfigurableAIButton: Story<ConfigurableButtonProps>;
|
|
19
|
+
//# sourceMappingURL=AIButton.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIButton.stories.d.ts","sourceRoot":"","sources":["../../../src/core/AIButton/AIButton.stories.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAEL,aAAa,EAqBd,MAAM,yBAAyB,CAAC;;AAIjC,wBAOU;AAEV,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,aAAa,CAE7C,CAAC;AAYF,UAAU,iBAAiB;IACzB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,iBAAiB,CA0MrD,CAAC;AAUF,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,iBAAiB,CAiO5D,CAAC;AASF,UAAU,uBAAuB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,uBAAuB,CAuB/D,CAAC"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { useReducer, useState } from 'react';
|
|
2
|
+
import { AIButton, Banner, Button, Checkbox, CheckboxGroup, Configuration, ErrorState, Flex, Form, Grid, Input, Modal, Progress, RadioButton, RadioButtonGroup, Select, Option, TextArea, useModalContext, useModalManager, useToaster } from '@pega/cosmos-react-core';
|
|
3
|
+
import { AIValues, fieldReducer, initFields } from './AIButton.mocks';
|
|
4
|
+
export default {
|
|
5
|
+
title: 'Core/AIButton',
|
|
6
|
+
component: AIButton,
|
|
7
|
+
excludeStories: ['ConfigurableAIButton'],
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: 'centered'
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
export const AIButtonDemo = (args) => {
|
|
13
|
+
return <AIButton label={args.label} disabled={args.disabled}/>;
|
|
14
|
+
};
|
|
15
|
+
AIButtonDemo.args = {
|
|
16
|
+
label: 'Fill form with AI',
|
|
17
|
+
disabled: false
|
|
18
|
+
};
|
|
19
|
+
AIButtonDemo.argTypes = {
|
|
20
|
+
label: { control: { type: 'text' } },
|
|
21
|
+
disabled: { control: { type: 'boolean' } }
|
|
22
|
+
};
|
|
23
|
+
export const AIButtonFormDemo = (args) => {
|
|
24
|
+
const [fields, setField] = useReducer(fieldReducer, undefined, initFields);
|
|
25
|
+
const [bannerMessages, setBannerMessages] = useState([]);
|
|
26
|
+
const [loadingMessage, setLoadingMessage] = useState('');
|
|
27
|
+
const [submitting, setSubmitting] = useState(false);
|
|
28
|
+
const { push } = useToaster();
|
|
29
|
+
const name = fields.find(field => field.name === 'name');
|
|
30
|
+
const email = fields.find(field => field.name === 'email');
|
|
31
|
+
const locations = fields.find(field => field.name === 'locations');
|
|
32
|
+
const meetings = fields.find(field => field.name === 'meetings');
|
|
33
|
+
const meals = fields.find(field => field.name === 'meals');
|
|
34
|
+
const notes = fields.find(field => field.name === 'notes');
|
|
35
|
+
if (!name || !email || !locations || !meetings || !meals || !notes)
|
|
36
|
+
return <ErrorState />;
|
|
37
|
+
const banners = bannerMessages.length > 0 ? <Banner variant='urgent' messages={bannerMessages}/> : undefined;
|
|
38
|
+
const clearForm = () => {
|
|
39
|
+
fields.forEach(field => setField({ type: 'cancel', name: field.name, value: undefined }));
|
|
40
|
+
};
|
|
41
|
+
const fillWithAI = () => {
|
|
42
|
+
setLoadingMessage('AI is filling out the form...');
|
|
43
|
+
setTimeout(() => {
|
|
44
|
+
if (args.throwAIError) {
|
|
45
|
+
setBannerMessages(curr => [
|
|
46
|
+
'An error occurred while generating responses from the AI.',
|
|
47
|
+
...curr
|
|
48
|
+
]);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const values = AIValues[Math.floor(Math.random() * AIValues.length)];
|
|
52
|
+
Object.keys(values).forEach(field => {
|
|
53
|
+
setField({ type: 'ai', name: field, value: values[field] });
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
setLoadingMessage('');
|
|
57
|
+
}, 2000);
|
|
58
|
+
};
|
|
59
|
+
const trySubmit = () => {
|
|
60
|
+
const errors = [];
|
|
61
|
+
fields.forEach(field => {
|
|
62
|
+
setField({ type: 'submit', name: field.name, value: field.value });
|
|
63
|
+
const error = field.validator?.() || '';
|
|
64
|
+
if (error)
|
|
65
|
+
errors.push(error);
|
|
66
|
+
});
|
|
67
|
+
setBannerMessages(errors);
|
|
68
|
+
if (errors.length === 0) {
|
|
69
|
+
setSubmitting(true);
|
|
70
|
+
setLoadingMessage('Submitting form...');
|
|
71
|
+
setTimeout(() => {
|
|
72
|
+
setLoadingMessage('');
|
|
73
|
+
setSubmitting(false);
|
|
74
|
+
push({ content: 'Form submitted!' });
|
|
75
|
+
clearForm();
|
|
76
|
+
}, 1000);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
return (<Form heading='AI Form' description='The AI in this demo is a mock and not a functional AI.' actions={<>
|
|
80
|
+
<Button onClick={clearForm} disabled={submitting}>
|
|
81
|
+
Cancel
|
|
82
|
+
</Button>
|
|
83
|
+
<Flex container={{ alignItems: 'center', gap: 1 }}>
|
|
84
|
+
<AIButton label='Fill form with AI' onClick={fillWithAI} disabled={!!loadingMessage}/>
|
|
85
|
+
<Button variant='primary' disabled={!!loadingMessage} onClick={trySubmit}>
|
|
86
|
+
Submit
|
|
87
|
+
</Button>
|
|
88
|
+
</Flex>
|
|
89
|
+
</>} banners={banners} style={{ margin: 'auto', maxWidth: '37.5rem' }}>
|
|
90
|
+
<Progress visible={!!loadingMessage} focusOnVisible message={loadingMessage}/>
|
|
91
|
+
<Grid container={{ gap: 1, cols: `repeat(2, minmax(0, 1fr))` }}>
|
|
92
|
+
<Input name={name.name} label={name.label} required={name.required} info={name.info || name.help} value={name.value} status={name.status} onChange={(e) => setField({ type: 'change', name: e.target.name, value: e.target.value })} onBlur={(e) => setField({ type: 'blur', name: e.target.name, value: e.target.value })}/>
|
|
93
|
+
|
|
94
|
+
<Input name={email.name} label={email.label} required={email.required} info={email.info || email.help} value={email.value} status={email.status} type='email' onChange={(e) => setField({ type: 'change', name: e.target.name, value: e.target.value })} onBlur={(e) => setField({ type: 'blur', name: e.target.name, value: e.target.value })}/>
|
|
95
|
+
|
|
96
|
+
<Grid item={{ colStartEnd: '1/-1' }}>
|
|
97
|
+
<CheckboxGroup name={locations.name} label={locations.label} required={locations.required} info={locations.info || locations.help} status={locations.status}>
|
|
98
|
+
{['Cambridge', 'Waltham', 'Krakow', 'Hyderabad', 'Bangalore'].map(office => (<Checkbox key={office} label={office} value={office} checked={locations.value?.includes(office)} onChange={(e) => setField({
|
|
99
|
+
type: 'change',
|
|
100
|
+
name: e.target.name,
|
|
101
|
+
value: e.target.value
|
|
102
|
+
})}/>))}
|
|
103
|
+
</CheckboxGroup>
|
|
104
|
+
</Grid>
|
|
105
|
+
|
|
106
|
+
<Grid item={{ colStartEnd: '1/-1' }}>
|
|
107
|
+
<RadioButtonGroup name={meetings.name} label={meetings.label} required={meetings.required} info={meetings.info || meetings.help} status={meetings.status}>
|
|
108
|
+
{['Yes', 'No'].map(option => (<RadioButton key={option} label={option} value={option} checked={meetings.value === option} onChange={(e) => setField({ type: 'change', name: e.target.name, value: e.target.value })}/>))}
|
|
109
|
+
</RadioButtonGroup>
|
|
110
|
+
</Grid>
|
|
111
|
+
|
|
112
|
+
<Select name={meals.name} label={meals.label} required={meals.required} info={meals.info || meals.help} value={meals.value || 'choose meal...'} status={meals.status} onChange={(e) => setField({ type: 'change', name: e.target.name, value: e.target.value })}>
|
|
113
|
+
<Option>choose meal...</Option>
|
|
114
|
+
<Option>Pizza</Option>
|
|
115
|
+
<Option>Sandwich</Option>
|
|
116
|
+
<Option>Salad</Option>
|
|
117
|
+
</Select>
|
|
118
|
+
|
|
119
|
+
<Grid item={{ colStartEnd: '1/-1' }}>
|
|
120
|
+
<TextArea name={notes.name} label={notes.label} required={notes.required} info={notes.info || notes.help} value={notes.value} status={notes.status} maxLength={200} displayCharCount onChange={(e) => setField({ type: 'change', name: e.target.name, value: e.target.value })} onBlur={(e) => setField({ type: 'blur', name: e.target.name, value: e.target.value })}/>
|
|
121
|
+
</Grid>
|
|
122
|
+
</Grid>
|
|
123
|
+
</Form>);
|
|
124
|
+
};
|
|
125
|
+
AIButtonFormDemo.args = {
|
|
126
|
+
throwAIError: false
|
|
127
|
+
};
|
|
128
|
+
AIButtonFormDemo.argTypes = {
|
|
129
|
+
throwAIError: { control: { type: 'boolean' } }
|
|
130
|
+
};
|
|
131
|
+
export const AIButtonFormInModalDemo = (args) => {
|
|
132
|
+
const AIModal = () => {
|
|
133
|
+
const [fields, setField] = useReducer(fieldReducer, undefined, initFields);
|
|
134
|
+
const [bannerMessages, setBannerMessages] = useState([]);
|
|
135
|
+
const [loadingMessage, setLoadingMessage] = useState('');
|
|
136
|
+
const [submitting, setSubmitting] = useState(false);
|
|
137
|
+
const { push } = useToaster();
|
|
138
|
+
const { dismiss } = useModalContext();
|
|
139
|
+
const name = fields.find(field => field.name === 'name');
|
|
140
|
+
const email = fields.find(field => field.name === 'email');
|
|
141
|
+
const locations = fields.find(field => field.name === 'locations');
|
|
142
|
+
const meetings = fields.find(field => field.name === 'meetings');
|
|
143
|
+
const meals = fields.find(field => field.name === 'meals');
|
|
144
|
+
const notes = fields.find(field => field.name === 'notes');
|
|
145
|
+
if (!name || !email || !locations || !meetings || !meals || !notes)
|
|
146
|
+
return <ErrorState />;
|
|
147
|
+
const banners = bannerMessages.length > 0 ? <Banner variant='urgent' messages={bannerMessages}/> : undefined;
|
|
148
|
+
const fillWithAI = () => {
|
|
149
|
+
setLoadingMessage('AI is filling out the form...');
|
|
150
|
+
setTimeout(() => {
|
|
151
|
+
if (args.throwAIError) {
|
|
152
|
+
setBannerMessages(curr => [
|
|
153
|
+
'An error occurred while generating responses from the AI.',
|
|
154
|
+
...curr
|
|
155
|
+
]);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const values = AIValues[Math.floor(Math.random() * AIValues.length)];
|
|
159
|
+
Object.keys(values).forEach(field => {
|
|
160
|
+
setField({ type: 'ai', name: field, value: values[field] });
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
setLoadingMessage('');
|
|
164
|
+
}, 2000);
|
|
165
|
+
};
|
|
166
|
+
const trySubmit = () => {
|
|
167
|
+
const errors = [];
|
|
168
|
+
fields.forEach(field => {
|
|
169
|
+
setField({ type: 'submit', name: field.name, value: field.value });
|
|
170
|
+
const error = field.validator?.() || '';
|
|
171
|
+
if (error)
|
|
172
|
+
errors.push(error);
|
|
173
|
+
});
|
|
174
|
+
setBannerMessages(errors);
|
|
175
|
+
if (errors.length === 0) {
|
|
176
|
+
setSubmitting(true);
|
|
177
|
+
setLoadingMessage('Submitting form...');
|
|
178
|
+
setTimeout(() => {
|
|
179
|
+
setLoadingMessage('');
|
|
180
|
+
setSubmitting(false);
|
|
181
|
+
push({ content: 'Form submitted!' });
|
|
182
|
+
dismiss();
|
|
183
|
+
}, 1000);
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
return (<Modal heading='AI Form in a Modal' progress={loadingMessage ? { message: loadingMessage } : undefined} onRequestDismiss={() => !submitting} actions={<>
|
|
187
|
+
<Button onClick={dismiss} disabled={submitting}>
|
|
188
|
+
Cancel
|
|
189
|
+
</Button>
|
|
190
|
+
<Flex container={{ alignItems: 'center', gap: 1 }}>
|
|
191
|
+
<AIButton label='Fill form with AI' onClick={fillWithAI} disabled={!!loadingMessage}/>
|
|
192
|
+
<Button variant='primary' disabled={!!loadingMessage} onClick={trySubmit}>
|
|
193
|
+
Submit
|
|
194
|
+
</Button>
|
|
195
|
+
</Flex>
|
|
196
|
+
</>}>
|
|
197
|
+
<Form description='The AI in this demo is a mock and not a functional AI.' banners={banners} style={{ margin: 'auto', maxWidth: '37.5rem' }}>
|
|
198
|
+
<Grid container={{ gap: 1, cols: `repeat(2, minmax(0, 1fr))` }}>
|
|
199
|
+
<Input name={name.name} label={name.label} required={name.required} info={name.info || name.help} value={name.value} status={name.status} onChange={(e) => setField({ type: 'change', name: e.target.name, value: e.target.value })} onBlur={(e) => setField({ type: 'blur', name: e.target.name, value: e.target.value })}/>
|
|
200
|
+
|
|
201
|
+
<Input name={email.name} label={email.label} required={email.required} info={email.info || email.help} value={email.value} status={email.status} type='email' onChange={(e) => setField({ type: 'change', name: e.target.name, value: e.target.value })} onBlur={(e) => setField({ type: 'blur', name: e.target.name, value: e.target.value })}/>
|
|
202
|
+
|
|
203
|
+
<Grid item={{ colStartEnd: '1/-1' }}>
|
|
204
|
+
<CheckboxGroup name={locations.name} label={locations.label} required={locations.required} info={locations.info || locations.help} status={locations.status}>
|
|
205
|
+
{['Cambridge', 'Waltham', 'Krakow', 'Hyderabad', 'Bangalore'].map(office => (<Checkbox key={office} label={office} value={office} checked={locations.value?.includes(office)} onChange={(e) => setField({
|
|
206
|
+
type: 'change',
|
|
207
|
+
name: e.target.name,
|
|
208
|
+
value: e.target.value
|
|
209
|
+
})}/>))}
|
|
210
|
+
</CheckboxGroup>
|
|
211
|
+
</Grid>
|
|
212
|
+
|
|
213
|
+
<Grid item={{ colStartEnd: '1/-1' }}>
|
|
214
|
+
<RadioButtonGroup name={meetings.name} label={meetings.label} required={meetings.required} info={meetings.info || meetings.help} status={meetings.status}>
|
|
215
|
+
{['Yes', 'No'].map(option => (<RadioButton key={option} label={option} value={option} checked={meetings.value === option} onChange={(e) => setField({ type: 'change', name: e.target.name, value: e.target.value })}/>))}
|
|
216
|
+
</RadioButtonGroup>
|
|
217
|
+
</Grid>
|
|
218
|
+
|
|
219
|
+
<Select name={meals.name} label={meals.label} required={meals.required} info={meals.info || meals.help} value={meals.value || 'choose meal...'} status={meals.status} onChange={(e) => setField({ type: 'change', name: e.target.name, value: e.target.value })}>
|
|
220
|
+
<Option>choose meal...</Option>
|
|
221
|
+
<Option>Pizza</Option>
|
|
222
|
+
<Option>Sandwich</Option>
|
|
223
|
+
<Option>Salad</Option>
|
|
224
|
+
</Select>
|
|
225
|
+
|
|
226
|
+
<Grid item={{ colStartEnd: '1/-1' }}>
|
|
227
|
+
<TextArea name={notes.name} label={notes.label} required={notes.required} info={notes.info || notes.help} value={notes.value} status={notes.status} maxLength={200} displayCharCount onChange={(e) => setField({ type: 'change', name: e.target.name, value: e.target.value })} onBlur={(e) => setField({ type: 'blur', name: e.target.name, value: e.target.value })}/>
|
|
228
|
+
</Grid>
|
|
229
|
+
</Grid>
|
|
230
|
+
</Form>
|
|
231
|
+
</Modal>);
|
|
232
|
+
};
|
|
233
|
+
const ModalButton = () => {
|
|
234
|
+
const { create } = useModalManager();
|
|
235
|
+
return (<Button onClick={() => {
|
|
236
|
+
create(AIModal);
|
|
237
|
+
}}>
|
|
238
|
+
Open Modal
|
|
239
|
+
</Button>);
|
|
240
|
+
};
|
|
241
|
+
return <ModalButton />;
|
|
242
|
+
};
|
|
243
|
+
AIButtonFormInModalDemo.args = {
|
|
244
|
+
throwAIError: false
|
|
245
|
+
};
|
|
246
|
+
AIButtonFormInModalDemo.argTypes = {
|
|
247
|
+
throwAIError: { control: { type: 'boolean' } }
|
|
248
|
+
};
|
|
249
|
+
export const ConfigurableAIButton = (args) => {
|
|
250
|
+
return (<Configuration theme={{
|
|
251
|
+
base: {
|
|
252
|
+
palette: {
|
|
253
|
+
ai: args.color
|
|
254
|
+
}
|
|
255
|
+
},
|
|
256
|
+
components: {
|
|
257
|
+
button: {
|
|
258
|
+
'border-width': args.borderWidth,
|
|
259
|
+
'border-radius': args.borderRadius,
|
|
260
|
+
padding: args.padding
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}}>
|
|
264
|
+
<AIButton label='Configurable Button'/>
|
|
265
|
+
</Configuration>);
|
|
266
|
+
};
|
|
267
|
+
ConfigurableAIButton.args = {
|
|
268
|
+
borderWidth: '0.0625rem',
|
|
269
|
+
borderRadius: 9999,
|
|
270
|
+
color: '#681fc3',
|
|
271
|
+
padding: '0rem 1rem'
|
|
272
|
+
};
|
|
273
|
+
ConfigurableAIButton.argTypes = {
|
|
274
|
+
borderWidth: { control: { type: 'text' } },
|
|
275
|
+
borderRadius: { control: { type: 'number' } },
|
|
276
|
+
color: { control: { type: 'color' } },
|
|
277
|
+
padding: { control: { type: 'text' } }
|
|
278
|
+
};
|
|
279
|
+
//# sourceMappingURL=AIButton.stories.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIButton.stories.jsx","sourceRoot":"","sources":["../../../src/core/AIButton/AIButton.stories.tsx"],"names":[],"mappings":"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","sourcesContent":["import { ChangeEvent, FocusEvent, useReducer, useState } from 'react';\nimport { Meta, Story } from '@storybook/react';\n\nimport {\n AIButton,\n AIButtonProps,\n Banner,\n Button,\n Checkbox,\n CheckboxGroup,\n Configuration,\n ErrorState,\n Flex,\n Form,\n Grid,\n Input,\n Modal,\n Progress,\n RadioButton,\n RadioButtonGroup,\n Select,\n Option,\n TextArea,\n useModalContext,\n useModalManager,\n useToaster\n} from '@pega/cosmos-react-core';\n\nimport { AIValues, fieldReducer, initFields } from './AIButton.mocks';\n\nexport default {\n title: 'Core/AIButton',\n component: AIButton,\n excludeStories: ['ConfigurableAIButton'],\n parameters: {\n layout: 'centered'\n }\n} as Meta;\n\nexport const AIButtonDemo: Story<AIButtonProps> = (args: AIButtonProps) => {\n return <AIButton label={args.label} disabled={args.disabled} />;\n};\n\nAIButtonDemo.args = {\n label: 'Fill form with AI',\n disabled: false\n};\n\nAIButtonDemo.argTypes = {\n label: { control: { type: 'text' } },\n disabled: { control: { type: 'boolean' } }\n};\n\ninterface AIButtonFormProps {\n throwAIError: boolean;\n}\n\nexport const AIButtonFormDemo: Story<AIButtonFormProps> = (args: AIButtonFormProps) => {\n const [fields, setField] = useReducer(fieldReducer, undefined, initFields);\n const [bannerMessages, setBannerMessages] = useState<string[]>([]);\n const [loadingMessage, setLoadingMessage] = useState('');\n const [submitting, setSubmitting] = useState(false);\n\n const { push } = useToaster();\n\n const name = fields.find(field => field.name === 'name');\n const email = fields.find(field => field.name === 'email');\n const locations = fields.find(field => field.name === 'locations');\n const meetings = fields.find(field => field.name === 'meetings');\n const meals = fields.find(field => field.name === 'meals');\n const notes = fields.find(field => field.name === 'notes');\n\n if (!name || !email || !locations || !meetings || !meals || !notes) return <ErrorState />;\n\n const banners =\n bannerMessages.length > 0 ? <Banner variant='urgent' messages={bannerMessages} /> : undefined;\n\n const clearForm = () => {\n fields.forEach(field => setField({ type: 'cancel', name: field.name, value: undefined }));\n };\n\n const fillWithAI = () => {\n setLoadingMessage('AI is filling out the form...');\n setTimeout(() => {\n if (args.throwAIError) {\n setBannerMessages(curr => [\n 'An error occurred while generating responses from the AI.',\n ...curr\n ]);\n } else {\n const values = AIValues[Math.floor(Math.random() * AIValues.length)];\n Object.keys(values).forEach(field => {\n setField({ type: 'ai', name: field, value: values[field as keyof typeof values] });\n });\n }\n setLoadingMessage('');\n }, 2000);\n };\n\n const trySubmit = () => {\n const errors: string[] = [];\n fields.forEach(field => {\n setField({ type: 'submit', name: field.name, value: field.value });\n const error = field.validator?.() || '';\n if (error) errors.push(error);\n });\n setBannerMessages(errors);\n\n if (errors.length === 0) {\n setSubmitting(true);\n setLoadingMessage('Submitting form...');\n setTimeout(() => {\n setLoadingMessage('');\n setSubmitting(false);\n push({ content: 'Form submitted!' });\n clearForm();\n }, 1000);\n }\n };\n\n return (\n <Form\n heading='AI Form'\n description='The AI in this demo is a mock and not a functional AI.'\n actions={\n <>\n <Button onClick={clearForm} disabled={submitting}>\n Cancel\n </Button>\n <Flex container={{ alignItems: 'center', gap: 1 }}>\n <AIButton label='Fill form with AI' onClick={fillWithAI} disabled={!!loadingMessage} />\n <Button variant='primary' disabled={!!loadingMessage} onClick={trySubmit}>\n Submit\n </Button>\n </Flex>\n </>\n }\n banners={banners}\n style={{ margin: 'auto', maxWidth: '37.5rem' }}\n >\n <Progress visible={!!loadingMessage} focusOnVisible message={loadingMessage} />\n <Grid container={{ gap: 1, cols: `repeat(2, minmax(0, 1fr))` }}>\n <Input\n name={name.name}\n label={name.label}\n required={name.required}\n info={name.info || name.help}\n value={name.value}\n status={name.status}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n setField({ type: 'change', name: e.target.name, value: e.target.value })\n }\n onBlur={(e: FocusEvent<HTMLInputElement>) =>\n setField({ type: 'blur', name: e.target.name, value: e.target.value })\n }\n />\n\n <Input\n name={email.name}\n label={email.label}\n required={email.required}\n info={email.info || email.help}\n value={email.value}\n status={email.status}\n type='email'\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n setField({ type: 'change', name: e.target.name, value: e.target.value })\n }\n onBlur={(e: FocusEvent<HTMLInputElement>) =>\n setField({ type: 'blur', name: e.target.name, value: e.target.value })\n }\n />\n\n <Grid item={{ colStartEnd: '1/-1' }}>\n <CheckboxGroup\n name={locations.name}\n label={locations.label}\n required={locations.required}\n info={locations.info || locations.help}\n status={locations.status}\n >\n {['Cambridge', 'Waltham', 'Krakow', 'Hyderabad', 'Bangalore'].map(office => (\n <Checkbox\n key={office}\n label={office}\n value={office}\n checked={locations.value?.includes(office)}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n setField({\n type: 'change',\n name: e.target.name,\n value: e.target.value\n })\n }\n />\n ))}\n </CheckboxGroup>\n </Grid>\n\n <Grid item={{ colStartEnd: '1/-1' }}>\n <RadioButtonGroup\n name={meetings.name}\n label={meetings.label}\n required={meetings.required}\n info={meetings.info || meetings.help}\n status={meetings.status}\n >\n {['Yes', 'No'].map(option => (\n <RadioButton\n key={option}\n label={option}\n value={option}\n checked={meetings.value === option}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n setField({ type: 'change', name: e.target.name, value: e.target.value })\n }\n />\n ))}\n </RadioButtonGroup>\n </Grid>\n\n <Select\n name={meals.name}\n label={meals.label}\n required={meals.required}\n info={meals.info || meals.help}\n value={meals.value || 'choose meal...'}\n status={meals.status}\n onChange={(e: ChangeEvent<HTMLSelectElement>) =>\n setField({ type: 'change', name: e.target.name, value: e.target.value })\n }\n >\n <Option>choose meal...</Option>\n <Option>Pizza</Option>\n <Option>Sandwich</Option>\n <Option>Salad</Option>\n </Select>\n\n <Grid item={{ colStartEnd: '1/-1' }}>\n <TextArea\n name={notes.name}\n label={notes.label}\n required={notes.required}\n info={notes.info || notes.help}\n value={notes.value}\n status={notes.status}\n maxLength={200}\n displayCharCount\n onChange={(e: ChangeEvent<HTMLTextAreaElement>) =>\n setField({ type: 'change', name: e.target.name, value: e.target.value })\n }\n onBlur={(e: FocusEvent<HTMLInputElement>) =>\n setField({ type: 'blur', name: e.target.name, value: e.target.value })\n }\n />\n </Grid>\n </Grid>\n </Form>\n );\n};\n\nAIButtonFormDemo.args = {\n throwAIError: false\n};\n\nAIButtonFormDemo.argTypes = {\n throwAIError: { control: { type: 'boolean' } }\n};\n\nexport const AIButtonFormInModalDemo: Story<AIButtonFormProps> = (args: AIButtonFormProps) => {\n const AIModal = () => {\n const [fields, setField] = useReducer(fieldReducer, undefined, initFields);\n const [bannerMessages, setBannerMessages] = useState<string[]>([]);\n const [loadingMessage, setLoadingMessage] = useState('');\n const [submitting, setSubmitting] = useState(false);\n\n const { push } = useToaster();\n const { dismiss } = useModalContext();\n\n const name = fields.find(field => field.name === 'name');\n const email = fields.find(field => field.name === 'email');\n const locations = fields.find(field => field.name === 'locations');\n const meetings = fields.find(field => field.name === 'meetings');\n const meals = fields.find(field => field.name === 'meals');\n const notes = fields.find(field => field.name === 'notes');\n\n if (!name || !email || !locations || !meetings || !meals || !notes) return <ErrorState />;\n\n const banners =\n bannerMessages.length > 0 ? <Banner variant='urgent' messages={bannerMessages} /> : undefined;\n\n const fillWithAI = () => {\n setLoadingMessage('AI is filling out the form...');\n setTimeout(() => {\n if (args.throwAIError) {\n setBannerMessages(curr => [\n 'An error occurred while generating responses from the AI.',\n ...curr\n ]);\n } else {\n const values = AIValues[Math.floor(Math.random() * AIValues.length)];\n Object.keys(values).forEach(field => {\n setField({ type: 'ai', name: field, value: values[field as keyof typeof values] });\n });\n }\n setLoadingMessage('');\n }, 2000);\n };\n\n const trySubmit = () => {\n const errors: string[] = [];\n fields.forEach(field => {\n setField({ type: 'submit', name: field.name, value: field.value });\n const error = field.validator?.() || '';\n if (error) errors.push(error);\n });\n setBannerMessages(errors);\n\n if (errors.length === 0) {\n setSubmitting(true);\n setLoadingMessage('Submitting form...');\n setTimeout(() => {\n setLoadingMessage('');\n setSubmitting(false);\n push({ content: 'Form submitted!' });\n dismiss();\n }, 1000);\n }\n };\n\n return (\n <Modal\n heading='AI Form in a Modal'\n progress={loadingMessage ? { message: loadingMessage } : undefined}\n onRequestDismiss={() => !submitting}\n actions={\n <>\n <Button onClick={dismiss} disabled={submitting}>\n Cancel\n </Button>\n <Flex container={{ alignItems: 'center', gap: 1 }}>\n <AIButton\n label='Fill form with AI'\n onClick={fillWithAI}\n disabled={!!loadingMessage}\n />\n <Button variant='primary' disabled={!!loadingMessage} onClick={trySubmit}>\n Submit\n </Button>\n </Flex>\n </>\n }\n >\n <Form\n description='The AI in this demo is a mock and not a functional AI.'\n banners={banners}\n style={{ margin: 'auto', maxWidth: '37.5rem' }}\n >\n <Grid container={{ gap: 1, cols: `repeat(2, minmax(0, 1fr))` }}>\n <Input\n name={name.name}\n label={name.label}\n required={name.required}\n info={name.info || name.help}\n value={name.value}\n status={name.status}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n setField({ type: 'change', name: e.target.name, value: e.target.value })\n }\n onBlur={(e: FocusEvent<HTMLInputElement>) =>\n setField({ type: 'blur', name: e.target.name, value: e.target.value })\n }\n />\n\n <Input\n name={email.name}\n label={email.label}\n required={email.required}\n info={email.info || email.help}\n value={email.value}\n status={email.status}\n type='email'\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n setField({ type: 'change', name: e.target.name, value: e.target.value })\n }\n onBlur={(e: FocusEvent<HTMLInputElement>) =>\n setField({ type: 'blur', name: e.target.name, value: e.target.value })\n }\n />\n\n <Grid item={{ colStartEnd: '1/-1' }}>\n <CheckboxGroup\n name={locations.name}\n label={locations.label}\n required={locations.required}\n info={locations.info || locations.help}\n status={locations.status}\n >\n {['Cambridge', 'Waltham', 'Krakow', 'Hyderabad', 'Bangalore'].map(office => (\n <Checkbox\n key={office}\n label={office}\n value={office}\n checked={locations.value?.includes(office)}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n setField({\n type: 'change',\n name: e.target.name,\n value: e.target.value\n })\n }\n />\n ))}\n </CheckboxGroup>\n </Grid>\n\n <Grid item={{ colStartEnd: '1/-1' }}>\n <RadioButtonGroup\n name={meetings.name}\n label={meetings.label}\n required={meetings.required}\n info={meetings.info || meetings.help}\n status={meetings.status}\n >\n {['Yes', 'No'].map(option => (\n <RadioButton\n key={option}\n label={option}\n value={option}\n checked={meetings.value === option}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n setField({ type: 'change', name: e.target.name, value: e.target.value })\n }\n />\n ))}\n </RadioButtonGroup>\n </Grid>\n\n <Select\n name={meals.name}\n label={meals.label}\n required={meals.required}\n info={meals.info || meals.help}\n value={meals.value || 'choose meal...'}\n status={meals.status}\n onChange={(e: ChangeEvent<HTMLSelectElement>) =>\n setField({ type: 'change', name: e.target.name, value: e.target.value })\n }\n >\n <Option>choose meal...</Option>\n <Option>Pizza</Option>\n <Option>Sandwich</Option>\n <Option>Salad</Option>\n </Select>\n\n <Grid item={{ colStartEnd: '1/-1' }}>\n <TextArea\n name={notes.name}\n label={notes.label}\n required={notes.required}\n info={notes.info || notes.help}\n value={notes.value}\n status={notes.status}\n maxLength={200}\n displayCharCount\n onChange={(e: ChangeEvent<HTMLTextAreaElement>) =>\n setField({ type: 'change', name: e.target.name, value: e.target.value })\n }\n onBlur={(e: FocusEvent<HTMLInputElement>) =>\n setField({ type: 'blur', name: e.target.name, value: e.target.value })\n }\n />\n </Grid>\n </Grid>\n </Form>\n </Modal>\n );\n };\n\n const ModalButton = () => {\n const { create } = useModalManager();\n\n return (\n <Button\n onClick={() => {\n create(AIModal);\n }}\n >\n Open Modal\n </Button>\n );\n };\n\n return <ModalButton />;\n};\n\nAIButtonFormInModalDemo.args = {\n throwAIError: false\n};\n\nAIButtonFormInModalDemo.argTypes = {\n throwAIError: { control: { type: 'boolean' } }\n};\ninterface ConfigurableButtonProps {\n borderWidth?: string;\n borderRadius?: number;\n color?: string;\n secondaryColor?: string;\n padding?: string;\n}\n\nexport const ConfigurableAIButton: Story<ConfigurableButtonProps> = (\n args: ConfigurableButtonProps\n) => {\n return (\n <Configuration\n theme={{\n base: {\n palette: {\n ai: args.color\n }\n },\n components: {\n button: {\n 'border-width': args.borderWidth,\n 'border-radius': args.borderRadius,\n padding: args.padding\n }\n }\n }}\n >\n <AIButton label='Configurable Button' />\n </Configuration>\n );\n};\n\nConfigurableAIButton.args = {\n borderWidth: '0.0625rem',\n borderRadius: 9999,\n color: '#681fc3',\n padding: '0rem 1rem'\n};\n\nConfigurableAIButton.argTypes = {\n borderWidth: { control: { type: 'text' } },\n borderRadius: { control: { type: 'number' } },\n color: { control: { type: 'color' } },\n padding: { control: { type: 'text' } }\n};\n"]}
|
|
@@ -7,7 +7,7 @@ export default {
|
|
|
7
7
|
export const FieldGroupDemo = (args) => {
|
|
8
8
|
const [firstGroupCollapsed, setFirstGroupCollapsed] = useState(false);
|
|
9
9
|
const [secondGroupCollapsed, setSecondGroupCollapsed] = useState(false);
|
|
10
|
-
return (<Grid container={{ rowGap:
|
|
10
|
+
return (<Grid container={{ rowGap: 2 }}>
|
|
11
11
|
<FieldGroup name={args.firstGroupName} headingTag={args.showfirstGroupHeadingTag ? args.firstGroupHeadingTag : undefined} description={args.firstGroupDescription} collapsed={args.firstGroupCollapsible ? firstGroupCollapsed : undefined} onToggleCollapsed={args.firstGroupCollapsible
|
|
12
12
|
? () => {
|
|
13
13
|
setFirstGroupCollapsed(state => !state);
|
|
@@ -54,13 +54,13 @@ export const FieldGroupDemo = (args) => {
|
|
|
54
54
|
};
|
|
55
55
|
FieldGroupDemo.args = {
|
|
56
56
|
firstGroupName: 'Field group 1',
|
|
57
|
-
firstGroupHeadingTag:
|
|
57
|
+
firstGroupHeadingTag: undefined,
|
|
58
58
|
showfirstGroupHeadingTag: true,
|
|
59
59
|
firstGroupCollapsible: true,
|
|
60
60
|
firstGroupDescription: '',
|
|
61
61
|
showFirstAdditionalInfo: true,
|
|
62
62
|
secondGroupName: 'Field group 2',
|
|
63
|
-
secondGroupHeadingTag:
|
|
63
|
+
secondGroupHeadingTag: undefined,
|
|
64
64
|
showsecondGroupHeadingTag: true,
|
|
65
65
|
secondGroupCollapsible: true,
|
|
66
66
|
secondGroupDescription: '',
|