@workday/canvas-kit-docs 7.3.14 → 7.3.16
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/dist/commonjs/lib/specs.js +96 -0
- package/dist/es6/lib/specs.js +96 -0
- package/dist/mdx/preview-react/_examples/SelectWithFormik.mdx +1 -1
- package/dist/mdx/preview-react/_examples/TextInputWithFormik.mdx +1 -1
- package/dist/mdx/preview-react/_examples/TextInputWithReactHookForm.mdx +8 -0
- package/dist/mdx/preview-react/_examples/examples/SelectWithFormik.tsx +22 -14
- package/dist/mdx/preview-react/_examples/examples/TextInputWithFormik.tsx +21 -19
- package/dist/mdx/preview-react/_examples/examples/TextInputWithReactHookForm.tsx +137 -0
- package/package.json +3 -3
|
@@ -2778,6 +2778,102 @@ module.exports = {specifications: [
|
|
|
2778
2778
|
}
|
|
2779
2779
|
]
|
|
2780
2780
|
},
|
|
2781
|
+
{
|
|
2782
|
+
"type": "describe",
|
|
2783
|
+
"name": "given the [Testing/React/Popups/Popup, MixedPopupTypes] story is rendered",
|
|
2784
|
+
"children": [
|
|
2785
|
+
{
|
|
2786
|
+
"type": "describe",
|
|
2787
|
+
"name": "when the \"Open Popup\" is clicked",
|
|
2788
|
+
"children": [
|
|
2789
|
+
{
|
|
2790
|
+
"type": "describe",
|
|
2791
|
+
"name": "when the user clicks outside",
|
|
2792
|
+
"children": [
|
|
2793
|
+
{
|
|
2794
|
+
"type": "it",
|
|
2795
|
+
"name": "should focus the \"Open Popup\" button"
|
|
2796
|
+
}
|
|
2797
|
+
]
|
|
2798
|
+
},
|
|
2799
|
+
{
|
|
2800
|
+
"type": "describe",
|
|
2801
|
+
"name": "when the user clicks the input",
|
|
2802
|
+
"children": [
|
|
2803
|
+
{
|
|
2804
|
+
"type": "it",
|
|
2805
|
+
"name": "should not focus the \"Open Popup\" button"
|
|
2806
|
+
}
|
|
2807
|
+
]
|
|
2808
|
+
},
|
|
2809
|
+
{
|
|
2810
|
+
"type": "describe",
|
|
2811
|
+
"name": "when the user scrolls to the top",
|
|
2812
|
+
"children": [
|
|
2813
|
+
{
|
|
2814
|
+
"type": "describe",
|
|
2815
|
+
"name": "when the user clicks outside",
|
|
2816
|
+
"children": [
|
|
2817
|
+
{
|
|
2818
|
+
"type": "it",
|
|
2819
|
+
"name": "should not focus the \"Open Popup\" button"
|
|
2820
|
+
}
|
|
2821
|
+
]
|
|
2822
|
+
}
|
|
2823
|
+
]
|
|
2824
|
+
},
|
|
2825
|
+
{
|
|
2826
|
+
"type": "describe",
|
|
2827
|
+
"name": "when the user scrolls to the bottom",
|
|
2828
|
+
"children": [
|
|
2829
|
+
{
|
|
2830
|
+
"type": "describe",
|
|
2831
|
+
"name": "when the user clicks outside",
|
|
2832
|
+
"children": [
|
|
2833
|
+
{
|
|
2834
|
+
"type": "it",
|
|
2835
|
+
"name": "should not focus the \"Open Popup\" button"
|
|
2836
|
+
}
|
|
2837
|
+
]
|
|
2838
|
+
}
|
|
2839
|
+
]
|
|
2840
|
+
},
|
|
2841
|
+
{
|
|
2842
|
+
"type": "describe",
|
|
2843
|
+
"name": "when the user scrolls to the right",
|
|
2844
|
+
"children": [
|
|
2845
|
+
{
|
|
2846
|
+
"type": "describe",
|
|
2847
|
+
"name": "when the user clicks outside",
|
|
2848
|
+
"children": [
|
|
2849
|
+
{
|
|
2850
|
+
"type": "it",
|
|
2851
|
+
"name": "should not focus the \"Open Popup\" button"
|
|
2852
|
+
}
|
|
2853
|
+
]
|
|
2854
|
+
}
|
|
2855
|
+
]
|
|
2856
|
+
},
|
|
2857
|
+
{
|
|
2858
|
+
"type": "describe",
|
|
2859
|
+
"name": "when the user scrolls to the left",
|
|
2860
|
+
"children": [
|
|
2861
|
+
{
|
|
2862
|
+
"type": "describe",
|
|
2863
|
+
"name": "when the user clicks outside",
|
|
2864
|
+
"children": [
|
|
2865
|
+
{
|
|
2866
|
+
"type": "it",
|
|
2867
|
+
"name": "should not focus the \"Open Popup\" button"
|
|
2868
|
+
}
|
|
2869
|
+
]
|
|
2870
|
+
}
|
|
2871
|
+
]
|
|
2872
|
+
}
|
|
2873
|
+
]
|
|
2874
|
+
}
|
|
2875
|
+
]
|
|
2876
|
+
},
|
|
2781
2877
|
{
|
|
2782
2878
|
"type": "describe",
|
|
2783
2879
|
"name": "given the [Testing/React/Popups/Popup, TooltipReturnFocus] example is rendered",
|
package/dist/es6/lib/specs.js
CHANGED
|
@@ -2778,6 +2778,102 @@ module.exports = {specifications: [
|
|
|
2778
2778
|
}
|
|
2779
2779
|
]
|
|
2780
2780
|
},
|
|
2781
|
+
{
|
|
2782
|
+
"type": "describe",
|
|
2783
|
+
"name": "given the [Testing/React/Popups/Popup, MixedPopupTypes] story is rendered",
|
|
2784
|
+
"children": [
|
|
2785
|
+
{
|
|
2786
|
+
"type": "describe",
|
|
2787
|
+
"name": "when the \"Open Popup\" is clicked",
|
|
2788
|
+
"children": [
|
|
2789
|
+
{
|
|
2790
|
+
"type": "describe",
|
|
2791
|
+
"name": "when the user clicks outside",
|
|
2792
|
+
"children": [
|
|
2793
|
+
{
|
|
2794
|
+
"type": "it",
|
|
2795
|
+
"name": "should focus the \"Open Popup\" button"
|
|
2796
|
+
}
|
|
2797
|
+
]
|
|
2798
|
+
},
|
|
2799
|
+
{
|
|
2800
|
+
"type": "describe",
|
|
2801
|
+
"name": "when the user clicks the input",
|
|
2802
|
+
"children": [
|
|
2803
|
+
{
|
|
2804
|
+
"type": "it",
|
|
2805
|
+
"name": "should not focus the \"Open Popup\" button"
|
|
2806
|
+
}
|
|
2807
|
+
]
|
|
2808
|
+
},
|
|
2809
|
+
{
|
|
2810
|
+
"type": "describe",
|
|
2811
|
+
"name": "when the user scrolls to the top",
|
|
2812
|
+
"children": [
|
|
2813
|
+
{
|
|
2814
|
+
"type": "describe",
|
|
2815
|
+
"name": "when the user clicks outside",
|
|
2816
|
+
"children": [
|
|
2817
|
+
{
|
|
2818
|
+
"type": "it",
|
|
2819
|
+
"name": "should not focus the \"Open Popup\" button"
|
|
2820
|
+
}
|
|
2821
|
+
]
|
|
2822
|
+
}
|
|
2823
|
+
]
|
|
2824
|
+
},
|
|
2825
|
+
{
|
|
2826
|
+
"type": "describe",
|
|
2827
|
+
"name": "when the user scrolls to the bottom",
|
|
2828
|
+
"children": [
|
|
2829
|
+
{
|
|
2830
|
+
"type": "describe",
|
|
2831
|
+
"name": "when the user clicks outside",
|
|
2832
|
+
"children": [
|
|
2833
|
+
{
|
|
2834
|
+
"type": "it",
|
|
2835
|
+
"name": "should not focus the \"Open Popup\" button"
|
|
2836
|
+
}
|
|
2837
|
+
]
|
|
2838
|
+
}
|
|
2839
|
+
]
|
|
2840
|
+
},
|
|
2841
|
+
{
|
|
2842
|
+
"type": "describe",
|
|
2843
|
+
"name": "when the user scrolls to the right",
|
|
2844
|
+
"children": [
|
|
2845
|
+
{
|
|
2846
|
+
"type": "describe",
|
|
2847
|
+
"name": "when the user clicks outside",
|
|
2848
|
+
"children": [
|
|
2849
|
+
{
|
|
2850
|
+
"type": "it",
|
|
2851
|
+
"name": "should not focus the \"Open Popup\" button"
|
|
2852
|
+
}
|
|
2853
|
+
]
|
|
2854
|
+
}
|
|
2855
|
+
]
|
|
2856
|
+
},
|
|
2857
|
+
{
|
|
2858
|
+
"type": "describe",
|
|
2859
|
+
"name": "when the user scrolls to the left",
|
|
2860
|
+
"children": [
|
|
2861
|
+
{
|
|
2862
|
+
"type": "describe",
|
|
2863
|
+
"name": "when the user clicks outside",
|
|
2864
|
+
"children": [
|
|
2865
|
+
{
|
|
2866
|
+
"type": "it",
|
|
2867
|
+
"name": "should not focus the \"Open Popup\" button"
|
|
2868
|
+
}
|
|
2869
|
+
]
|
|
2870
|
+
}
|
|
2871
|
+
]
|
|
2872
|
+
}
|
|
2873
|
+
]
|
|
2874
|
+
}
|
|
2875
|
+
]
|
|
2876
|
+
},
|
|
2781
2877
|
{
|
|
2782
2878
|
"type": "describe",
|
|
2783
2879
|
"name": "given the [Testing/React/Popups/Popup, TooltipReturnFocus] example is rendered",
|
|
@@ -6,14 +6,19 @@ import {
|
|
|
6
6
|
useFormFieldInput,
|
|
7
7
|
useFormFieldModel,
|
|
8
8
|
} from '@workday/canvas-kit-preview-react/form-field';
|
|
9
|
+
import {VStack} from '@workday/canvas-kit-react/layout';
|
|
10
|
+
import {PrimaryButton} from '@workday/canvas-kit-react/button';
|
|
9
11
|
|
|
10
12
|
export default () => {
|
|
11
13
|
const formik = useFormik({
|
|
12
14
|
initialValues: {
|
|
13
15
|
selectedBook: '',
|
|
14
16
|
},
|
|
15
|
-
onSubmit:
|
|
16
|
-
|
|
17
|
+
onSubmit: values => {
|
|
18
|
+
// Send data to server
|
|
19
|
+
setTimeout(() => {
|
|
20
|
+
alert(JSON.stringify(values, null, 2));
|
|
21
|
+
}, 0);
|
|
17
22
|
},
|
|
18
23
|
});
|
|
19
24
|
|
|
@@ -21,18 +26,21 @@ export default () => {
|
|
|
21
26
|
const formFieldInputProps = useFormFieldInput(model);
|
|
22
27
|
|
|
23
28
|
return (
|
|
24
|
-
<form onSubmit={formik.handleSubmit}>
|
|
25
|
-
<
|
|
26
|
-
<FormField
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
<form onSubmit={formik.handleSubmit} action=".">
|
|
30
|
+
<VStack spacing="xs" alignItems="flex-start">
|
|
31
|
+
<FormField orientation="vertical" alignSelf="stretch" alignItems="normal">
|
|
32
|
+
<FormField.Label>Choose a book</FormField.Label>
|
|
33
|
+
<Select
|
|
34
|
+
name="selectedBook"
|
|
35
|
+
options={bookList}
|
|
36
|
+
onChange={event => formik.setFieldValue('selectedBook', event.currentTarget.value)}
|
|
37
|
+
value={formik.values.selectedBook}
|
|
38
|
+
grow
|
|
39
|
+
{...formFieldInputProps}
|
|
40
|
+
/>
|
|
41
|
+
</FormField>
|
|
42
|
+
<PrimaryButton type="submit">Submit</PrimaryButton>
|
|
43
|
+
</VStack>
|
|
36
44
|
</form>
|
|
37
45
|
);
|
|
38
46
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
|
|
3
3
|
import {useFormik} from 'formik';
|
|
4
|
-
import
|
|
4
|
+
import {object, SchemaOf, string} from 'yup';
|
|
5
5
|
|
|
6
6
|
import {TextInput} from '@workday/canvas-kit-preview-react/text-input';
|
|
7
7
|
import {HStack, VStack} from '@workday/canvas-kit-react/layout';
|
|
@@ -9,23 +9,26 @@ import {TertiaryButton, PrimaryButton} from '@workday/canvas-kit-react/button';
|
|
|
9
9
|
import {visibleIcon, invisibleIcon} from '@workday/canvas-system-icons-web';
|
|
10
10
|
import {useUniqueId} from '@workday/canvas-kit-react/common';
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const passwordRequired = 'Password is required';
|
|
12
|
+
interface LoginSchema {
|
|
13
|
+
email: string;
|
|
14
|
+
password: string;
|
|
15
|
+
}
|
|
17
16
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
17
|
+
const passwordMinimum = 8;
|
|
18
|
+
const passwordHint = `Password should be of minimum ${passwordMinimum} characters length`;
|
|
19
|
+
const emailRequired = 'Email is required';
|
|
20
|
+
const passwordRequired = 'Password is required';
|
|
21
|
+
|
|
22
|
+
const validationSchema: SchemaOf<LoginSchema> = object({
|
|
23
|
+
email: string()
|
|
24
|
+
.email('Enter a valid email')
|
|
25
|
+
.required(emailRequired),
|
|
26
|
+
password: string()
|
|
27
|
+
.min(passwordMinimum, passwordHint)
|
|
28
|
+
.required(passwordRequired),
|
|
29
|
+
});
|
|
28
30
|
|
|
31
|
+
export default () => {
|
|
29
32
|
const passwordRef = React.useRef<HTMLInputElement>(null);
|
|
30
33
|
const [showPassword, setShowPassword] = React.useState(false);
|
|
31
34
|
const passwordId = useUniqueId();
|
|
@@ -37,8 +40,7 @@ export default () => {
|
|
|
37
40
|
},
|
|
38
41
|
validationSchema: validationSchema,
|
|
39
42
|
onSubmit: values => {
|
|
40
|
-
|
|
41
|
-
|
|
43
|
+
setShowPassword(false);
|
|
42
44
|
// Send data to server
|
|
43
45
|
setTimeout(() => {
|
|
44
46
|
alert(JSON.stringify(values, null, 2));
|
|
@@ -90,7 +92,7 @@ export default () => {
|
|
|
90
92
|
aria-controls={`input-${passwordId}`}
|
|
91
93
|
onClick={() => {
|
|
92
94
|
setShowPassword(state => !state);
|
|
93
|
-
passwordRef.current
|
|
95
|
+
passwordRef.current?.focus();
|
|
94
96
|
}}
|
|
95
97
|
/>
|
|
96
98
|
</HStack>
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
import {useForm, FieldErrorsImpl} from 'react-hook-form';
|
|
4
|
+
import {object, SchemaOf, string} from 'yup';
|
|
5
|
+
|
|
6
|
+
import {TextInput} from '@workday/canvas-kit-preview-react/text-input';
|
|
7
|
+
import {HStack, VStack} from '@workday/canvas-kit-react/layout';
|
|
8
|
+
import {TertiaryButton, PrimaryButton} from '@workday/canvas-kit-react/button';
|
|
9
|
+
import {visibleIcon, invisibleIcon} from '@workday/canvas-system-icons-web';
|
|
10
|
+
import {useUniqueId} from '@workday/canvas-kit-react/common';
|
|
11
|
+
|
|
12
|
+
type YupValidationResolver = <T extends {}>(
|
|
13
|
+
validationSchema: SchemaOf<T>
|
|
14
|
+
) => (data: T) => Promise<{values: T; errors: {}} | {values: {}; errors: FieldErrorsImpl<T>}>;
|
|
15
|
+
|
|
16
|
+
const useYupValidationResolver: YupValidationResolver = validationSchema => {
|
|
17
|
+
return React.useCallback(
|
|
18
|
+
async data => {
|
|
19
|
+
try {
|
|
20
|
+
const values = await validationSchema.validate(data, {abortEarly: false});
|
|
21
|
+
return {values, errors: {}};
|
|
22
|
+
} catch (errors) {
|
|
23
|
+
return {
|
|
24
|
+
values: {},
|
|
25
|
+
errors: errors.inner.reduce(
|
|
26
|
+
(allErrors, currentError) => ({
|
|
27
|
+
...allErrors,
|
|
28
|
+
[currentError.path]: {
|
|
29
|
+
type: currentError.type ?? 'validation',
|
|
30
|
+
message: currentError.message,
|
|
31
|
+
},
|
|
32
|
+
}),
|
|
33
|
+
{}
|
|
34
|
+
),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
[validationSchema]
|
|
39
|
+
);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
interface LoginSchema {
|
|
43
|
+
email: string;
|
|
44
|
+
password: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const passwordMinimum = 8;
|
|
48
|
+
const passwordHint = `Password should be of minimum ${passwordMinimum} characters length`;
|
|
49
|
+
const emailRequired = 'Email is required';
|
|
50
|
+
const passwordRequired = 'Password is required';
|
|
51
|
+
|
|
52
|
+
const validationSchema: SchemaOf<LoginSchema> = object({
|
|
53
|
+
email: string()
|
|
54
|
+
.email('Enter a valid email')
|
|
55
|
+
.required(emailRequired),
|
|
56
|
+
password: string()
|
|
57
|
+
.min(passwordMinimum, passwordHint)
|
|
58
|
+
.required(passwordRequired),
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
export default () => {
|
|
62
|
+
const {
|
|
63
|
+
handleSubmit,
|
|
64
|
+
register,
|
|
65
|
+
formState: {errors},
|
|
66
|
+
} = useForm<LoginSchema>({
|
|
67
|
+
defaultValues: {
|
|
68
|
+
email: 'example@baz.com',
|
|
69
|
+
password: 'foobarbaz',
|
|
70
|
+
},
|
|
71
|
+
resolver: useYupValidationResolver(validationSchema),
|
|
72
|
+
mode: 'onTouched',
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const onSubmit = handleSubmit(values => {
|
|
76
|
+
setShowPassword(false);
|
|
77
|
+
// Send data to server
|
|
78
|
+
setTimeout(() => {
|
|
79
|
+
alert(JSON.stringify(values, null, 2));
|
|
80
|
+
}, 0);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
const [showPassword, setShowPassword] = React.useState(false);
|
|
84
|
+
const passwordId = useUniqueId();
|
|
85
|
+
const passwordRef = React.useRef<HTMLInputElement | null>(null);
|
|
86
|
+
const {ref: passwordCallbackRef, ...passwordRegistration} = register('password');
|
|
87
|
+
const combinePasswordRef = (ref: HTMLInputElement | null) => {
|
|
88
|
+
passwordCallbackRef(ref);
|
|
89
|
+
passwordRef.current = ref;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
return (
|
|
93
|
+
<form onSubmit={onSubmit} action=".">
|
|
94
|
+
<VStack spacing="xs" alignItems="flex-start">
|
|
95
|
+
<TextInput orientation="vertical" isRequired={true} hasError={!!errors.email}>
|
|
96
|
+
<TextInput.Label>Email</TextInput.Label>
|
|
97
|
+
<TextInput.Field
|
|
98
|
+
{...register('email')}
|
|
99
|
+
autoComplete="username"
|
|
100
|
+
placeholder="yourName@example.com"
|
|
101
|
+
/>
|
|
102
|
+
<TextInput.Hint>{errors.email?.message}</TextInput.Hint>
|
|
103
|
+
</TextInput>
|
|
104
|
+
<TextInput
|
|
105
|
+
orientation="vertical"
|
|
106
|
+
id={passwordId}
|
|
107
|
+
isRequired={true}
|
|
108
|
+
hasError={!!errors.password}
|
|
109
|
+
>
|
|
110
|
+
<TextInput.Label>Password</TextInput.Label>
|
|
111
|
+
<HStack spacing="xxs">
|
|
112
|
+
<TextInput.Field
|
|
113
|
+
{...passwordRegistration}
|
|
114
|
+
type={showPassword ? 'text' : 'password'}
|
|
115
|
+
autoComplete="current-password"
|
|
116
|
+
spellCheck={false}
|
|
117
|
+
ref={combinePasswordRef}
|
|
118
|
+
/>
|
|
119
|
+
<TertiaryButton
|
|
120
|
+
type="button"
|
|
121
|
+
icon={showPassword ? invisibleIcon : visibleIcon}
|
|
122
|
+
aria-label={showPassword ? 'Hide Password' : 'Show Password'}
|
|
123
|
+
aria-controls={`input-${passwordId}`}
|
|
124
|
+
onClick={() => {
|
|
125
|
+
setShowPassword(state => !state);
|
|
126
|
+
passwordRef.current?.focus();
|
|
127
|
+
}}
|
|
128
|
+
/>
|
|
129
|
+
</HStack>
|
|
130
|
+
<TextInput.Hint>{errors.password?.message || passwordHint}</TextInput.Hint>
|
|
131
|
+
</TextInput>
|
|
132
|
+
|
|
133
|
+
<PrimaryButton type="submit">Submit</PrimaryButton>
|
|
134
|
+
</VStack>
|
|
135
|
+
</form>
|
|
136
|
+
);
|
|
137
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workday/canvas-kit-docs",
|
|
3
|
-
"version": "7.3.
|
|
3
|
+
"version": "7.3.16",
|
|
4
4
|
"description": "Documentation components of Canvas Kit components",
|
|
5
5
|
"author": "Workday, Inc. (https://www.workday.com)",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
],
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@storybook/csf": "0.0.1",
|
|
45
|
-
"@workday/canvas-kit-react": "^7.3.
|
|
45
|
+
"@workday/canvas-kit-react": "^7.3.16"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"fs-extra": "^10.0.0",
|
|
@@ -50,5 +50,5 @@
|
|
|
50
50
|
"mkdirp": "^1.0.3",
|
|
51
51
|
"typescript": "4.1"
|
|
52
52
|
},
|
|
53
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "a5be6896cbc5baaeb6a6b0ba2ea40a7ab3b2315b"
|
|
54
54
|
}
|