Skip to content

Commit

Permalink
feat: Added required marker (#2524)
Browse files Browse the repository at this point in the history
Co-authored-by: Shauna Keating <59394696+shkeating@users.noreply.github.com>
  • Loading branch information
werdnanoslen and shkeating authored Oct 19, 2023
1 parent eae195e commit c5f2b40
Show file tree
Hide file tree
Showing 9 changed files with 106 additions and 42 deletions.
62 changes: 35 additions & 27 deletions src/components/forms/Fieldset/Fieldset.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { Label } from '../Label/Label'
import { TextInput } from '../TextInput/TextInput'
import { Checkbox } from '../Checkbox/Checkbox'
import { Radio } from '../Radio/Radio'
import { RequiredMarker } from '../Label/RequiredMarker'

export default {
title: 'Components/Form elements/Fieldset',
Expand Down Expand Up @@ -70,33 +71,40 @@ export const checkboxFieldset = (): React.ReactElement => (
)

export const checkboxFieldsetWithDefaultLegend = (): React.ReactElement => (
<Fieldset legend="Historical figures 1">
<Checkbox
id="truth"
name="historical-figures-1"
value="truth"
defaultChecked
label="Sojourner Truth"
/>
<Checkbox
id="douglass"
name="historical-figures-1"
value="douglass"
label="Frederick Douglass"
/>
<Checkbox
id="washington"
name="historical-figures-1"
value="washington"
label="Booker T. Washington"
/>
<Checkbox
id="carver"
name="historical-figures-1"
label="George Washington Carver"
disabled
/>
</Fieldset>
<>
<p>
Required fields are marked with an asterisk (<RequiredMarker />
).
</p>
<Fieldset legend="Historical figures 1" requiredMarker>
<Checkbox
required
id="truth"
name="historical-figures-1"
value="truth"
defaultChecked
label="Sojourner Truth"
/>
<Checkbox
id="douglass"
name="historical-figures-1"
value="douglass"
label="Frederick Douglass"
/>
<Checkbox
id="washington"
name="historical-figures-1"
value="washington"
label="Booker T. Washington"
/>
<Checkbox
id="carver"
name="historical-figures-1"
label="George Washington Carver"
disabled
/>
</Fieldset>
</>
)

export const radioFieldset = (): React.ReactElement => (
Expand Down
11 changes: 11 additions & 0 deletions src/components/forms/Fieldset/Fieldset.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,17 @@ describe('Fieldset component', () => {
expect(myFieldset).toHaveAttribute('aria-live', 'polite')
})

it('renders with required marker', () => {
const { queryByText } = render(
<Fieldset legend="Historical figures 1" requiredMarker>
My Fieldset
</Fieldset>
)
const marker = queryByText('*')
expect(marker).toBeInTheDocument()
expect(marker).toHaveClass('usa-hint--required')
})

describe('renders uswds classes', () => {
it('renders legend with class usa-legend by default', () => {
const { queryByTestId, getByText } = render(
Expand Down
15 changes: 14 additions & 1 deletion src/components/forms/Fieldset/Fieldset.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
import React from 'react'
import classnames from 'classnames'
import { RequiredMarker } from '../Label/RequiredMarker'

type FieldsetProps = {
children: React.ReactNode
legend?: React.ReactNode
legendStyle?: 'default' | 'large' | 'srOnly'
className?: string
requiredMarker?: boolean
}

export const Fieldset = ({
children,
legend,
className,
legendStyle = 'default',
requiredMarker,
...fieldsetProps
}: FieldsetProps & JSX.IntrinsicElements['fieldset']): React.ReactElement => {
const classes = classnames('usa-fieldset', className)
Expand All @@ -25,7 +28,17 @@ export const Fieldset = ({

return (
<fieldset data-testid="fieldset" className={classes} {...fieldsetProps}>
{legend && <legend className={legendClasses}>{legend}</legend>}
{legend && (
<legend className={legendClasses}>
{legend}
{requiredMarker && (
<>
{' '}
<RequiredMarker />
</>
)}
</legend>
)}
{children}
</fieldset>
)
Expand Down
20 changes: 6 additions & 14 deletions src/components/forms/Form/Form.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { ErrorMessage } from '../ErrorMessage/ErrorMessage'
import { Fieldset } from '../Fieldset/Fieldset'
import { FormGroup } from '../FormGroup/FormGroup'
import { Label } from '../Label/Label'
import { RequiredMarker } from '../Label/RequiredMarker'
import { TextInput } from '../TextInput/TextInput'
import { Textarea } from '../Textarea/Textarea'

Expand Down Expand Up @@ -111,10 +112,7 @@ export const addressForm = (): React.ReactElement => (
<Form onSubmit={mockSubmit} large>
<Fieldset legend="Mailing address" legendStyle="large">
<p>
Required fields are marked with an asterisk (
<abbr title="required" className="usa-hint usa-hint--required">
*
</abbr>
Required fields are marked with an asterisk (<RequiredMarker />
).
</p>
<Label htmlFor="mailing-address-1">Street address</Label>
Expand All @@ -123,19 +121,13 @@ export const addressForm = (): React.ReactElement => (
<Label htmlFor="mailing-address-2">Street address line 2</Label>
<TextInput id="mailing-address-2" name="mailing-address-2" type="text" />

<Label htmlFor="city">
City{' '}
<abbr title="required" className="usa-hint usa-hint--required">
*
</abbr>
<Label htmlFor="city" requiredMarker>
City
</Label>
<TextInput id="city" name="city" type="text" required />

<Label htmlFor="state">
State, territory, or military post{' '}
<abbr title="required" className="usa-hint usa-hint--required">
*
</abbr>
<Label htmlFor="state" requiredMarker>
State, territory, or military post
</Label>
<Dropdown id="state" name="state" required>
<option>- Select -</option>
Expand Down
7 changes: 7 additions & 0 deletions src/components/forms/Label/Label.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import React from 'react'
import { Label } from './Label'
import { RequiredMarker } from './RequiredMarker'

Check warning on line 3 in src/components/forms/Label/Label.stories.tsx

View workflow job for this annotation

GitHub Actions / Publish next to Github Packages

'RequiredMarker' is defined but never used

Check warning on line 3 in src/components/forms/Label/Label.stories.tsx

View workflow job for this annotation

GitHub Actions / run-checks

'RequiredMarker' is defined but never used

export default {
title: 'Components/Form elements/Label',
Expand Down Expand Up @@ -32,3 +33,9 @@ export const withHint = (): React.ReactElement => (
Text input
</Label>
)

export const withRequiredMarker = (): React.ReactElement => (
<Label htmlFor="testInputRequired" requiredMarker>
Text input
</Label>
)
14 changes: 14 additions & 0 deletions src/components/forms/Label/Label.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,18 @@ describe('Label component', () => {
expect(hint).toBeInTheDocument()
expect(hint).toHaveClass('usa-hint')
})

it('renders with required marker', () => {
const { queryByText } = render(
<Label htmlFor="testInput" requiredMarker>
My Text Input
</Label>
)

expect(queryByText('My Text Input')).toBeInTheDocument()

const marker = queryByText('*')
expect(marker).toBeInTheDocument()
expect(marker).toHaveClass('usa-hint--required')
})
})
9 changes: 9 additions & 0 deletions src/components/forms/Label/Label.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import React from 'react'
import classnames from 'classnames'
import { RequiredMarker } from './RequiredMarker'

type LabelProps = {
children: React.ReactNode
Expand All @@ -8,6 +9,7 @@ type LabelProps = {
error?: boolean
hint?: React.ReactNode
srOnly?: boolean
requiredMarker?: boolean
}

export const Label = ({
Expand All @@ -17,6 +19,7 @@ export const Label = ({
error,
hint,
srOnly,
requiredMarker,
...labelProps
}: LabelProps & JSX.IntrinsicElements['label']): React.ReactElement => {
const classes = classnames(
Expand All @@ -36,6 +39,12 @@ export const Label = ({
htmlFor={htmlFor}>
{children}
{hint && <span className="usa-hint">{hint}</span>}
{requiredMarker && (
<>
{' '}
<RequiredMarker />
</>
)}
</label>
)
}
Expand Down
9 changes: 9 additions & 0 deletions src/components/forms/Label/RequiredMarker.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import React from 'react'
export const RequiredMarker = (): React.ReactElement => {
return (
<abbr title="required" className="usa-hint usa-hint--required">
*
</abbr>
)
}
export default RequiredMarker
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ export { InputGroup } from './components/forms/InputGroup/InputGroup'
export { InputPrefix } from './components/forms/InputPrefix/InputPrefix'
export { InputSuffix } from './components/forms/InputSuffix/InputSuffix'
export { Label } from './components/forms/Label/Label'
export { RequiredMarker } from './components/forms/Label/RequiredMarker'
export { LanguageSelector } from './components/LanguageSelector/LanguageSelector'
export { LanguageSelectorButton } from './components/LanguageSelector/LanguageSelectorButton'
export type { LanguageDefinition } from './components/LanguageSelector/LanguageSelector'
Expand Down

0 comments on commit c5f2b40

Please sign in to comment.