@sakura-ui/sakura-ui 0.0.16 → 0.1.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/README.md +43 -11
- package/package.json +3 -3
- package/packages/{react → core}/package.json +3 -3
- package/packages/{react → core}/src/components/Button.tsx +2 -2
- package/packages/{react → core}/src/components/Card.tsx +2 -2
- package/packages/{react → core}/src/components/Code.tsx +2 -2
- package/packages/{react → core}/src/components/Heading.tsx +18 -18
- package/packages/{react → core}/src/components/Icon.tsx +2 -2
- package/packages/{react → core}/src/components/IconButton.tsx +2 -2
- package/packages/{react → core}/src/components/InfoCard.tsx +4 -4
- package/packages/{react → core}/src/components/Link.tsx +6 -6
- package/packages/{react → core}/src/components/List.tsx +4 -4
- package/packages/{react → core}/src/components/Pre.tsx +2 -2
- package/packages/{react → core}/src/components/Table.tsx +14 -14
- package/packages/core/tsconfig.json +11 -0
- package/packages/forms/coverage/clover.xml +209 -0
- package/packages/forms/coverage/coverage-final.json +18 -0
- package/packages/forms/coverage/lcov-report/base.css +224 -0
- package/packages/forms/coverage/lcov-report/block-navigation.js +87 -0
- package/packages/forms/coverage/lcov-report/favicon.png +0 -0
- package/packages/forms/coverage/lcov-report/index.html +161 -0
- package/packages/forms/coverage/lcov-report/prettify.css +1 -0
- package/packages/forms/coverage/lcov-report/prettify.js +2 -0
- package/packages/forms/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/packages/forms/coverage/lcov-report/sorter.js +196 -0
- package/packages/forms/coverage/lcov-report/src/components/Checkbox.tsx.html +295 -0
- package/packages/forms/coverage/lcov-report/src/components/FieldsetControl.tsx.html +295 -0
- package/packages/forms/coverage/lcov-report/src/components/LabelControl.tsx.html +289 -0
- package/packages/forms/coverage/lcov-report/src/components/Radio.tsx.html +262 -0
- package/packages/forms/coverage/lcov-report/src/components/Select.tsx.html +259 -0
- package/packages/forms/coverage/lcov-report/src/components/Text.tsx.html +220 -0
- package/packages/forms/coverage/lcov-report/src/components/Textarea.tsx.html +229 -0
- package/packages/forms/coverage/lcov-report/src/components/context.ts.html +136 -0
- package/packages/forms/coverage/lcov-report/src/components/controlled/CheckboxGroup.tsx.html +244 -0
- package/packages/forms/coverage/lcov-report/src/components/controlled/RadioGroup.tsx.html +265 -0
- package/packages/forms/coverage/lcov-report/src/components/controlled/SelectControl.tsx.html +205 -0
- package/packages/forms/coverage/lcov-report/src/components/controlled/TextControl.tsx.html +202 -0
- package/packages/forms/coverage/lcov-report/src/components/controlled/TextareaControl.tsx.html +205 -0
- package/packages/forms/coverage/lcov-report/src/components/controlled/index.html +191 -0
- package/packages/forms/coverage/lcov-report/src/components/controlled/index.ts.html +100 -0
- package/packages/forms/coverage/lcov-report/src/components/index.html +236 -0
- package/packages/forms/coverage/lcov-report/src/components/index.ts.html +106 -0
- package/packages/forms/coverage/lcov-report/src/index.html +116 -0
- package/packages/forms/coverage/lcov-report/src/index.ts.html +136 -0
- package/packages/forms/coverage/lcov-report/src/utils/index.html +116 -0
- package/packages/forms/coverage/lcov-report/src/utils/index.ts.html +88 -0
- package/packages/forms/coverage/lcov.info +434 -0
- package/packages/forms/dist/index.cjs.js +20 -24
- package/packages/forms/dist/index.cjs.js.map +1 -1
- package/packages/forms/dist/index.es.js +561 -375
- package/packages/forms/dist/index.es.js.map +1 -1
- package/packages/forms/jest.config.ts +14 -0
- package/packages/forms/node_modules/.bin/autoprefixer +2 -2
- package/packages/forms/node_modules/.bin/browserslist +17 -0
- package/packages/forms/node_modules/.bin/jest +4 -4
- package/packages/forms/node_modules/.bin/npm-run-all +2 -2
- package/packages/forms/node_modules/.bin/run-p +2 -2
- package/packages/forms/node_modules/.bin/run-s +2 -2
- package/packages/forms/node_modules/.bin/tailwind +4 -4
- package/packages/forms/node_modules/.bin/tailwindcss +4 -4
- package/packages/forms/node_modules/.bin/ts-jest +4 -4
- package/packages/forms/node_modules/.bin/ts-node +4 -4
- package/packages/forms/node_modules/.bin/ts-node-cwd +4 -4
- package/packages/forms/node_modules/.bin/ts-node-esm +4 -4
- package/packages/forms/node_modules/.bin/ts-node-script +4 -4
- package/packages/forms/node_modules/.bin/ts-node-transpile-only +4 -4
- package/packages/forms/node_modules/.bin/ts-script +4 -4
- package/packages/forms/node_modules/.bin/tsc +2 -2
- package/packages/forms/node_modules/.bin/tsc-alias +2 -2
- package/packages/forms/node_modules/.bin/tsserver +2 -2
- package/packages/forms/node_modules/.bin/vite +2 -2
- package/packages/forms/package.json +6 -1
- package/packages/forms/src/components/Checkbox.tsx +19 -8
- package/packages/forms/src/components/FieldsetControl.tsx +70 -0
- package/packages/forms/src/components/LabelControl.tsx +68 -0
- package/packages/forms/src/components/Radio.tsx +24 -9
- package/packages/forms/src/components/Select.tsx +22 -7
- package/packages/forms/src/components/Text.tsx +14 -4
- package/packages/forms/src/components/Textarea.tsx +18 -3
- package/packages/forms/src/components/context.ts +17 -0
- package/packages/forms/src/components/controlled/CheckboxGroup.tsx +37 -15
- package/packages/forms/src/components/controlled/RadioGroup.tsx +44 -20
- package/packages/forms/src/components/controlled/SelectControl.tsx +40 -0
- package/packages/forms/src/components/controlled/TextControl.tsx +39 -0
- package/packages/forms/src/components/controlled/TextareaControl.tsx +40 -0
- package/packages/forms/src/components/controlled/index.ts +3 -3
- package/packages/forms/src/components/index.ts +2 -0
- package/packages/forms/src/index.ts +12 -4
- package/packages/forms/tests/FieldsetControl.test.tsx +54 -0
- package/packages/forms/tests/LabelControl.test.tsx +116 -0
- package/packages/forms/tests/Radio.test.tsx +99 -0
- package/packages/forms/tests/Text.test.tsx +96 -0
- package/packages/forms/tsconfig.json +1 -17
- package/packages/forms/dist/components/Checkbox.d.ts +0 -5
- package/packages/forms/dist/components/Checkbox.d.ts.map +0 -1
- package/packages/forms/dist/components/Radio.d.ts +0 -5
- package/packages/forms/dist/components/Radio.d.ts.map +0 -1
- package/packages/forms/dist/components/Select.d.ts +0 -5
- package/packages/forms/dist/components/Select.d.ts.map +0 -1
- package/packages/forms/dist/components/Text.d.ts +0 -5
- package/packages/forms/dist/components/Text.d.ts.map +0 -1
- package/packages/forms/dist/components/Textarea.d.ts +0 -5
- package/packages/forms/dist/components/Textarea.d.ts.map +0 -1
- package/packages/forms/dist/components/controlled/CheckboxGroup.d.ts +0 -9
- package/packages/forms/dist/components/controlled/CheckboxGroup.d.ts.map +0 -1
- package/packages/forms/dist/components/controlled/InputItem.d.ts +0 -5
- package/packages/forms/dist/components/controlled/InputItem.d.ts.map +0 -1
- package/packages/forms/dist/components/controlled/RadioGroup.d.ts +0 -9
- package/packages/forms/dist/components/controlled/RadioGroup.d.ts.map +0 -1
- package/packages/forms/dist/components/controlled/Select.d.ts +0 -6
- package/packages/forms/dist/components/controlled/Select.d.ts.map +0 -1
- package/packages/forms/dist/components/controlled/Text.d.ts +0 -6
- package/packages/forms/dist/components/controlled/Text.d.ts.map +0 -1
- package/packages/forms/dist/components/controlled/Textarea.d.ts +0 -6
- package/packages/forms/dist/components/controlled/Textarea.d.ts.map +0 -1
- package/packages/forms/dist/components/controlled/index.d.ts +0 -6
- package/packages/forms/dist/components/controlled/index.d.ts.map +0 -1
- package/packages/forms/dist/components/index.d.ts +0 -6
- package/packages/forms/dist/components/index.d.ts.map +0 -1
- package/packages/forms/dist/index.d.ts +0 -3
- package/packages/forms/dist/index.d.ts.map +0 -1
- package/packages/forms/dist/utils/index.d.ts +0 -2
- package/packages/forms/dist/utils/index.d.ts.map +0 -1
- package/packages/forms/src/components/controlled/Select.tsx +0 -22
- package/packages/forms/src/components/controlled/Text.tsx +0 -22
- package/packages/forms/src/components/controlled/Textarea.tsx +0 -23
- package/packages/forms/src/vite-env.d.ts +0 -1
- package/packages/react/tsconfig.json +0 -27
- /package/packages/{react → core}/src/components/index.ts +0 -0
- /package/packages/{react → core}/src/index.ts +0 -0
- /package/packages/{react → core}/src/utils/index.ts +0 -0
- /package/packages/{react → core}/tsconfig.node.json +0 -0
- /package/packages/{react → core}/vite.config.ts +0 -0
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import { cx } from '../utils'
|
|
3
|
+
import { ControllerContext } from './context'
|
|
3
4
|
|
|
4
5
|
export interface TextareaProps
|
|
5
6
|
extends React.ComponentPropsWithoutRef<'textarea'> {}
|
|
6
7
|
|
|
7
8
|
export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
|
|
8
9
|
(props, ref) => {
|
|
9
|
-
const { className, children, ...
|
|
10
|
+
const { className, children, ...restProps } = props
|
|
11
|
+
|
|
12
|
+
const ctx = React.useContext(ControllerContext)
|
|
13
|
+
if (ctx.isRequired) {
|
|
14
|
+
restProps.required = true
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const invalidStyle = ctx.isInvalid ? 'border-sun-800' : 'border-sumi-900'
|
|
10
18
|
|
|
11
19
|
const style = `
|
|
12
20
|
p-4
|
|
13
21
|
rounded-lg
|
|
14
22
|
border
|
|
15
23
|
border-solid
|
|
16
|
-
border-sumi-900
|
|
17
24
|
focus:outline
|
|
18
25
|
focus:outline-2
|
|
19
26
|
focus:outline-wood-500
|
|
@@ -25,7 +32,15 @@ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
|
|
|
25
32
|
`
|
|
26
33
|
|
|
27
34
|
return (
|
|
28
|
-
<textarea
|
|
35
|
+
<textarea
|
|
36
|
+
id={restProps.id ?? ctx.id}
|
|
37
|
+
className={cx(style, invalidStyle, className)}
|
|
38
|
+
aria-describedby={ctx.helperTextId}
|
|
39
|
+
aria-errormessage={ctx.errorMessageId}
|
|
40
|
+
aria-invalid={ctx.isInvalid ?? false}
|
|
41
|
+
{...restProps}
|
|
42
|
+
ref={ref}
|
|
43
|
+
>
|
|
29
44
|
{children}
|
|
30
45
|
</textarea>
|
|
31
46
|
)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
export interface ControllerContextType {
|
|
4
|
+
id?: string
|
|
5
|
+
groupName?: string
|
|
6
|
+
helperTextId: string
|
|
7
|
+
errorMessageId: string
|
|
8
|
+
isInvalid: boolean
|
|
9
|
+
isRequired?: boolean
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const ControllerContext = React.createContext<ControllerContextType>({
|
|
13
|
+
helperTextId: '',
|
|
14
|
+
errorMessageId: '',
|
|
15
|
+
isInvalid: false,
|
|
16
|
+
isRequired: false
|
|
17
|
+
})
|
|
@@ -1,31 +1,53 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import { Checkbox } from '../Checkbox'
|
|
3
|
+
import { FieldsetControl } from '../FieldsetControl'
|
|
3
4
|
import { InputItem } from './InputItem'
|
|
4
|
-
import { cx } from '../../utils'
|
|
5
5
|
|
|
6
6
|
export interface CheckboxGroupProps
|
|
7
|
-
extends Omit<React.
|
|
7
|
+
extends Omit<React.ComponentPropsWithoutRef<'fieldset'>, 'onChange'> {
|
|
8
8
|
items: InputItem[]
|
|
9
9
|
onChange: React.ChangeEventHandler<HTMLInputElement>
|
|
10
|
-
|
|
10
|
+
labelText: string
|
|
11
|
+
helperText?: string
|
|
12
|
+
errorMessage?: string
|
|
13
|
+
isInvalid?: boolean
|
|
14
|
+
isRequired?: boolean
|
|
11
15
|
}
|
|
12
16
|
|
|
13
|
-
export const CheckboxGroup =
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
export const CheckboxGroup = React.forwardRef<
|
|
18
|
+
HTMLFieldSetElement,
|
|
19
|
+
CheckboxGroupProps
|
|
20
|
+
>((props, ref) => {
|
|
21
|
+
const {
|
|
22
|
+
items,
|
|
23
|
+
onChange,
|
|
24
|
+
className,
|
|
25
|
+
labelText,
|
|
26
|
+
helperText,
|
|
27
|
+
errorMessage,
|
|
28
|
+
isInvalid,
|
|
29
|
+
isRequired,
|
|
30
|
+
...restProps
|
|
31
|
+
} = props
|
|
16
32
|
|
|
17
33
|
return (
|
|
18
|
-
<
|
|
19
|
-
|
|
34
|
+
<FieldsetControl
|
|
35
|
+
className={className}
|
|
36
|
+
labelText={labelText}
|
|
37
|
+
helperText={helperText}
|
|
38
|
+
errorMessage={errorMessage}
|
|
39
|
+
isInvalid={isInvalid}
|
|
40
|
+
isRequired={isRequired}
|
|
41
|
+
ref={ref}
|
|
42
|
+
{...restProps}
|
|
43
|
+
>
|
|
20
44
|
{items.map(({ label, value }, index) => {
|
|
21
45
|
return (
|
|
22
|
-
<
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
</Checkbox>
|
|
26
|
-
</div>
|
|
46
|
+
<Checkbox key={index} value={value} onChange={onChange}>
|
|
47
|
+
{label}
|
|
48
|
+
</Checkbox>
|
|
27
49
|
)
|
|
28
50
|
})}
|
|
29
|
-
</
|
|
51
|
+
</FieldsetControl>
|
|
30
52
|
)
|
|
31
|
-
}
|
|
53
|
+
})
|
|
@@ -1,36 +1,60 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import { Radio } from '../Radio'
|
|
3
|
+
import { FieldsetControl } from '../FieldsetControl'
|
|
3
4
|
import { InputItem } from './InputItem'
|
|
4
|
-
import { cx } from '../../utils'
|
|
5
5
|
|
|
6
6
|
export interface RadioGroupProps
|
|
7
|
-
extends Omit<React.
|
|
7
|
+
extends Omit<React.ComponentPropsWithoutRef<'fieldset'>, 'onChange'> {
|
|
8
8
|
items: InputItem[]
|
|
9
9
|
onChange: React.ChangeEventHandler<HTMLInputElement>
|
|
10
|
-
|
|
10
|
+
labelText: string
|
|
11
|
+
helperText?: string
|
|
12
|
+
errorMessage?: string
|
|
13
|
+
isInvalid?: boolean
|
|
14
|
+
isRequired?: boolean
|
|
15
|
+
defaultValue?: string
|
|
11
16
|
}
|
|
12
17
|
|
|
13
|
-
export const RadioGroup =
|
|
14
|
-
|
|
15
|
-
|
|
18
|
+
export const RadioGroup = React.forwardRef<
|
|
19
|
+
HTMLFieldSetElement,
|
|
20
|
+
RadioGroupProps
|
|
21
|
+
>((props, ref) => {
|
|
22
|
+
const {
|
|
23
|
+
items,
|
|
24
|
+
onChange,
|
|
25
|
+
className,
|
|
26
|
+
labelText,
|
|
27
|
+
helperText,
|
|
28
|
+
errorMessage,
|
|
29
|
+
isInvalid,
|
|
30
|
+
isRequired,
|
|
31
|
+
defaultValue,
|
|
32
|
+
...restProps
|
|
33
|
+
} = props
|
|
16
34
|
|
|
17
35
|
return (
|
|
18
|
-
<
|
|
19
|
-
|
|
36
|
+
<FieldsetControl
|
|
37
|
+
className={className}
|
|
38
|
+
labelText={labelText}
|
|
39
|
+
helperText={helperText}
|
|
40
|
+
errorMessage={errorMessage}
|
|
41
|
+
isInvalid={isInvalid}
|
|
42
|
+
isRequired={isRequired}
|
|
43
|
+
ref={ref}
|
|
44
|
+
{...restProps}
|
|
45
|
+
>
|
|
20
46
|
{items.map(({ label, value }, index) => {
|
|
21
47
|
return (
|
|
22
|
-
<
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
</Radio>
|
|
31
|
-
</div>
|
|
48
|
+
<Radio
|
|
49
|
+
key={index}
|
|
50
|
+
value={value}
|
|
51
|
+
onChange={onChange}
|
|
52
|
+
defaultChecked={defaultValue === value}
|
|
53
|
+
>
|
|
54
|
+
{label}
|
|
55
|
+
</Radio>
|
|
32
56
|
)
|
|
33
57
|
})}
|
|
34
|
-
</
|
|
58
|
+
</FieldsetControl>
|
|
35
59
|
)
|
|
36
|
-
}
|
|
60
|
+
})
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { LabelControl } from '../LabelControl'
|
|
3
|
+
import { Select } from '../Select'
|
|
4
|
+
|
|
5
|
+
export interface SelectControlProps
|
|
6
|
+
extends React.ComponentPropsWithoutRef<'select'> {
|
|
7
|
+
labelText: string
|
|
8
|
+
helperText?: string
|
|
9
|
+
errorMessage?: string
|
|
10
|
+
isInvalid?: boolean
|
|
11
|
+
isRequired?: boolean
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const SelectControl = React.forwardRef<
|
|
15
|
+
HTMLSelectElement,
|
|
16
|
+
SelectControlProps
|
|
17
|
+
>((props, ref) => {
|
|
18
|
+
const {
|
|
19
|
+
className,
|
|
20
|
+
labelText,
|
|
21
|
+
helperText,
|
|
22
|
+
errorMessage,
|
|
23
|
+
isInvalid,
|
|
24
|
+
isRequired,
|
|
25
|
+
...restProps
|
|
26
|
+
} = props
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<LabelControl
|
|
30
|
+
className={className}
|
|
31
|
+
labelText={labelText}
|
|
32
|
+
helperText={helperText}
|
|
33
|
+
errorMessage={errorMessage}
|
|
34
|
+
isInvalid={isInvalid}
|
|
35
|
+
isRequired={isRequired}
|
|
36
|
+
>
|
|
37
|
+
<Select ref={ref} {...restProps} />
|
|
38
|
+
</LabelControl>
|
|
39
|
+
)
|
|
40
|
+
})
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { LabelControl } from '../LabelControl'
|
|
3
|
+
import { Text } from '../Text'
|
|
4
|
+
|
|
5
|
+
export interface TextControlProps
|
|
6
|
+
extends React.ComponentPropsWithoutRef<'input'> {
|
|
7
|
+
labelText: string
|
|
8
|
+
helperText?: string
|
|
9
|
+
errorMessage?: string
|
|
10
|
+
isInvalid?: boolean
|
|
11
|
+
isRequired?: boolean
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const TextControl = React.forwardRef<HTMLInputElement, TextControlProps>(
|
|
15
|
+
(props, ref) => {
|
|
16
|
+
const {
|
|
17
|
+
className,
|
|
18
|
+
labelText,
|
|
19
|
+
helperText,
|
|
20
|
+
errorMessage,
|
|
21
|
+
isInvalid,
|
|
22
|
+
isRequired,
|
|
23
|
+
...restProps
|
|
24
|
+
} = props
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<LabelControl
|
|
28
|
+
className={className}
|
|
29
|
+
labelText={labelText}
|
|
30
|
+
helperText={helperText}
|
|
31
|
+
errorMessage={errorMessage}
|
|
32
|
+
isInvalid={isInvalid}
|
|
33
|
+
isRequired={isRequired}
|
|
34
|
+
>
|
|
35
|
+
<Text ref={ref} {...restProps} />
|
|
36
|
+
</LabelControl>
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { LabelControl } from '../LabelControl'
|
|
3
|
+
import { Textarea } from '../Textarea'
|
|
4
|
+
|
|
5
|
+
export interface TextareaControlProps
|
|
6
|
+
extends React.ComponentPropsWithoutRef<'textarea'> {
|
|
7
|
+
labelText: string
|
|
8
|
+
helperText?: string
|
|
9
|
+
errorMessage?: string
|
|
10
|
+
isInvalid?: boolean
|
|
11
|
+
isRequired?: boolean
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const TextareaControl = React.forwardRef<
|
|
15
|
+
HTMLTextAreaElement,
|
|
16
|
+
TextareaControlProps
|
|
17
|
+
>((props, ref) => {
|
|
18
|
+
const {
|
|
19
|
+
className,
|
|
20
|
+
labelText,
|
|
21
|
+
helperText,
|
|
22
|
+
errorMessage,
|
|
23
|
+
isInvalid,
|
|
24
|
+
isRequired,
|
|
25
|
+
...restProps
|
|
26
|
+
} = props
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<LabelControl
|
|
30
|
+
className={className}
|
|
31
|
+
labelText={labelText}
|
|
32
|
+
helperText={helperText}
|
|
33
|
+
errorMessage={errorMessage}
|
|
34
|
+
isInvalid={isInvalid}
|
|
35
|
+
isRequired={isRequired}
|
|
36
|
+
>
|
|
37
|
+
<Textarea ref={ref} {...restProps} />
|
|
38
|
+
</LabelControl>
|
|
39
|
+
)
|
|
40
|
+
})
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { CheckboxGroup } from './CheckboxGroup'
|
|
2
2
|
export { RadioGroup } from './RadioGroup'
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
3
|
+
export { SelectControl } from './SelectControl'
|
|
4
|
+
export { TextControl } from './TextControl'
|
|
5
|
+
export { TextareaControl } from './TextareaControl'
|
|
@@ -1,9 +1,17 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {
|
|
2
|
+
Checkbox,
|
|
3
|
+
Radio,
|
|
4
|
+
Select,
|
|
5
|
+
Text,
|
|
6
|
+
Textarea,
|
|
7
|
+
LabelControl,
|
|
8
|
+
FieldsetControl
|
|
9
|
+
} from './components'
|
|
2
10
|
|
|
3
11
|
export {
|
|
4
12
|
CheckboxGroup,
|
|
5
13
|
RadioGroup,
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
14
|
+
SelectControl,
|
|
15
|
+
TextControl,
|
|
16
|
+
TextareaControl
|
|
9
17
|
} from './components/controlled'
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
import { render, screen } from '@testing-library/react'
|
|
3
|
+
import '@testing-library/jest-dom'
|
|
4
|
+
|
|
5
|
+
import { FieldsetControl } from '../src'
|
|
6
|
+
|
|
7
|
+
describe('FieldsetControl', () => {
|
|
8
|
+
test('renders FieldsetControl component vol1', async () => {
|
|
9
|
+
render(<FieldsetControl labelText="test" />)
|
|
10
|
+
|
|
11
|
+
const fieldset = screen.getByRole('group')
|
|
12
|
+
|
|
13
|
+
expect(fieldset).toBeInTheDocument()
|
|
14
|
+
|
|
15
|
+
expect(screen.getByText('test')).toBeInTheDocument()
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
test('renders FieldsetControl component vol2', async () => {
|
|
19
|
+
render(
|
|
20
|
+
<FieldsetControl
|
|
21
|
+
labelText="test"
|
|
22
|
+
helperText="helper"
|
|
23
|
+
errorMessage="error"
|
|
24
|
+
/>
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
expect(screen.getByText('helper')).toBeInTheDocument()
|
|
28
|
+
expect(screen.queryByText('error')).toBeNull()
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
test('renders FieldsetControl component vol3', async () => {
|
|
32
|
+
render(
|
|
33
|
+
<FieldsetControl
|
|
34
|
+
labelText="test"
|
|
35
|
+
helperText="helper"
|
|
36
|
+
errorMessage="error"
|
|
37
|
+
isInvalid
|
|
38
|
+
/>
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
expect(screen.getByText('helper')).toBeInTheDocument()
|
|
42
|
+
expect(screen.getByText('error')).toBeInTheDocument()
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
test('renders FieldsetControl component vol4', async () => {
|
|
46
|
+
render(<FieldsetControl labelText="test" />)
|
|
47
|
+
|
|
48
|
+
expect(screen.queryByText('*')).toBeNull()
|
|
49
|
+
|
|
50
|
+
render(<FieldsetControl labelText="test" isRequired />)
|
|
51
|
+
|
|
52
|
+
expect(screen.getByText('*')).toBeInTheDocument()
|
|
53
|
+
})
|
|
54
|
+
})
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
import { render, screen } from '@testing-library/react'
|
|
3
|
+
import '@testing-library/jest-dom'
|
|
4
|
+
|
|
5
|
+
import { LabelControl, Select, Text, Textarea } from '../src'
|
|
6
|
+
|
|
7
|
+
describe('LabelControl', () => {
|
|
8
|
+
test('renders LabelControl component vol1', async () => {
|
|
9
|
+
render(<LabelControl labelText="test" data-testid="label" />)
|
|
10
|
+
|
|
11
|
+
const elem = screen.getByTestId('label')
|
|
12
|
+
|
|
13
|
+
expect(elem).toBeInTheDocument()
|
|
14
|
+
|
|
15
|
+
expect(screen.getByText('test')).toBeInTheDocument()
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
test('renders LabelControl component vol2', async () => {
|
|
19
|
+
render(
|
|
20
|
+
<LabelControl labelText="test" helperText="helper" errorMessage="error" />
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
expect(screen.getByText('helper')).toBeInTheDocument()
|
|
24
|
+
expect(screen.queryByText('error')).toBeNull()
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
test('renders LabelControl component vol3', async () => {
|
|
28
|
+
render(
|
|
29
|
+
<LabelControl
|
|
30
|
+
labelText="test"
|
|
31
|
+
helperText="helper"
|
|
32
|
+
errorMessage="error"
|
|
33
|
+
isInvalid
|
|
34
|
+
/>
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
expect(screen.getByText('helper')).toBeInTheDocument()
|
|
38
|
+
expect(screen.getByText('error')).toBeInTheDocument()
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
test('renders LabelControl component vol4', async () => {
|
|
42
|
+
render(<LabelControl labelText="test" />)
|
|
43
|
+
|
|
44
|
+
expect(screen.queryByText('*')).toBeNull()
|
|
45
|
+
|
|
46
|
+
render(<LabelControl labelText="test" isRequired />)
|
|
47
|
+
|
|
48
|
+
expect(screen.getByText('*')).toBeInTheDocument()
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
test('Test the relationship between the label and input elements.', async () => {
|
|
52
|
+
render(
|
|
53
|
+
<>
|
|
54
|
+
<LabelControl labelText="test1">
|
|
55
|
+
<Select>
|
|
56
|
+
<option value="1" defaultChecked />
|
|
57
|
+
</Select>
|
|
58
|
+
</LabelControl>
|
|
59
|
+
<LabelControl labelText="test2">
|
|
60
|
+
<Text defaultValue="1" />
|
|
61
|
+
</LabelControl>
|
|
62
|
+
<LabelControl labelText="test3">
|
|
63
|
+
<Textarea defaultValue="1" />
|
|
64
|
+
</LabelControl>
|
|
65
|
+
</>
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
const select = screen.getByLabelText(/test1/)
|
|
69
|
+
expect(select).toBeInTheDocument()
|
|
70
|
+
expect(select).toHaveValue('1')
|
|
71
|
+
expect(select).toHaveAttribute('id')
|
|
72
|
+
|
|
73
|
+
const text = screen.getByLabelText(/test2/)
|
|
74
|
+
expect(text).toBeInTheDocument()
|
|
75
|
+
expect(text).toHaveValue('1')
|
|
76
|
+
expect(text).toHaveAttribute('id')
|
|
77
|
+
|
|
78
|
+
const textarea = screen.getByLabelText(/test3/)
|
|
79
|
+
expect(textarea).toBeInTheDocument()
|
|
80
|
+
expect(textarea).toHaveValue('1')
|
|
81
|
+
expect(textarea).toHaveAttribute('id')
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
test('Test the relationship between the label and input elements.', async () => {
|
|
85
|
+
render(
|
|
86
|
+
<>
|
|
87
|
+
<LabelControl labelText="test1" htmlFor="id1">
|
|
88
|
+
<Select>
|
|
89
|
+
<option value="1" defaultChecked />
|
|
90
|
+
</Select>
|
|
91
|
+
</LabelControl>
|
|
92
|
+
<LabelControl labelText="test2" htmlFor="id2">
|
|
93
|
+
<Text defaultValue="1" />
|
|
94
|
+
</LabelControl>
|
|
95
|
+
<LabelControl labelText="test3" htmlFor="id3">
|
|
96
|
+
<Textarea defaultValue="1" />
|
|
97
|
+
</LabelControl>
|
|
98
|
+
</>
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
const select = screen.getByLabelText(/test1/)
|
|
102
|
+
expect(select).toBeInTheDocument()
|
|
103
|
+
expect(select).toHaveValue('1')
|
|
104
|
+
expect(select).toHaveAttribute('id', 'id1')
|
|
105
|
+
|
|
106
|
+
const text = screen.getByLabelText(/test2/)
|
|
107
|
+
expect(text).toBeInTheDocument()
|
|
108
|
+
expect(text).toHaveValue('1')
|
|
109
|
+
expect(text).toHaveAttribute('id', 'id2')
|
|
110
|
+
|
|
111
|
+
const textarea = screen.getByLabelText(/test3/)
|
|
112
|
+
expect(textarea).toBeInTheDocument()
|
|
113
|
+
expect(textarea).toHaveValue('1')
|
|
114
|
+
expect(textarea).toHaveAttribute('id', 'id3')
|
|
115
|
+
})
|
|
116
|
+
})
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
import { render, screen } from '@testing-library/react'
|
|
3
|
+
import '@testing-library/jest-dom'
|
|
4
|
+
|
|
5
|
+
import { FieldsetControl, Radio } from '../src'
|
|
6
|
+
|
|
7
|
+
describe('should derive values from surrounding FieldsetControl', () => {
|
|
8
|
+
test('renders Text component vol1', async () => {
|
|
9
|
+
render(
|
|
10
|
+
<FieldsetControl labelText="test">
|
|
11
|
+
<Radio />
|
|
12
|
+
</FieldsetControl>
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
const elem = screen.getByRole('radio')
|
|
16
|
+
|
|
17
|
+
expect(elem).toBeInTheDocument()
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
test('renders Text component vol2', async () => {
|
|
21
|
+
render(
|
|
22
|
+
<FieldsetControl
|
|
23
|
+
labelText="test"
|
|
24
|
+
helperText="helper"
|
|
25
|
+
errorMessage="error"
|
|
26
|
+
>
|
|
27
|
+
<Radio />
|
|
28
|
+
</FieldsetControl>
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
const elem = screen.getByRole('radio')
|
|
32
|
+
|
|
33
|
+
expect(elem).toBeInTheDocument()
|
|
34
|
+
|
|
35
|
+
expect(elem).toHaveAttribute('aria-describedby', 'helper-text-:r1:')
|
|
36
|
+
expect(elem).toHaveAttribute('aria-errormessage', 'error-message-:r1:')
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
test('renders Text component vol3', async () => {
|
|
40
|
+
render(
|
|
41
|
+
<FieldsetControl labelText="test">
|
|
42
|
+
<Radio />
|
|
43
|
+
</FieldsetControl>
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
const elem = screen.getByRole('radio')
|
|
47
|
+
|
|
48
|
+
expect(elem).toBeInTheDocument()
|
|
49
|
+
|
|
50
|
+
expect(elem).toBeValid()
|
|
51
|
+
expect(elem).toHaveAttribute('aria-invalid', 'false')
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
test('renders Text component vol4', async () => {
|
|
55
|
+
render(
|
|
56
|
+
<FieldsetControl labelText="test" isInvalid>
|
|
57
|
+
<Radio />
|
|
58
|
+
</FieldsetControl>
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
const elem = screen.getByRole('radio')
|
|
62
|
+
|
|
63
|
+
expect(elem).toBeInTheDocument()
|
|
64
|
+
|
|
65
|
+
expect(elem).toBeInvalid()
|
|
66
|
+
expect(elem).toHaveAttribute('aria-invalid', 'true')
|
|
67
|
+
expect(elem).not.toBeRequired()
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
test('renders Text component vol5', async () => {
|
|
71
|
+
render(
|
|
72
|
+
<FieldsetControl labelText="test" isRequired>
|
|
73
|
+
<Radio defaultChecked={true} />
|
|
74
|
+
</FieldsetControl>
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
const elem = screen.getByRole('radio')
|
|
78
|
+
|
|
79
|
+
expect(elem).toBeInTheDocument()
|
|
80
|
+
|
|
81
|
+
expect(elem).toBeValid()
|
|
82
|
+
expect(elem).toBeRequired()
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
test('renders Text component vol6', async () => {
|
|
86
|
+
render(
|
|
87
|
+
<FieldsetControl labelText="test" isRequired>
|
|
88
|
+
<Radio />
|
|
89
|
+
</FieldsetControl>
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
const elem = screen.getByRole('radio')
|
|
93
|
+
|
|
94
|
+
expect(elem).toBeInTheDocument()
|
|
95
|
+
|
|
96
|
+
expect(elem).toBeInvalid()
|
|
97
|
+
expect(elem).toBeRequired()
|
|
98
|
+
})
|
|
99
|
+
})
|