Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(date): update onChange to handle null value when date input is cleared #1125

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions packages/Form/Input/date/src/Date.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { ChangeEvent, ComponentPropsWithRef, forwardRef } from 'react';
import { getComponentClassName } from '@axa-fr/react-toolkit-core';
import { withInput } from '@axa-fr/react-toolkit-form-core';
import React, { ChangeEvent, ComponentPropsWithRef, forwardRef } from 'react';

type Props = Omit<ComponentPropsWithRef<'input'>, 'value'> & {
/** A modifier for specified className */
Expand Down Expand Up @@ -47,7 +47,6 @@ const handlers = {
(e: ChangeEvent<HTMLInputElement>) => {
const newValue = e.currentTarget.valueAsDate;
onChange &&
newValue &&
onChange({
value: newValue,
name,
Expand Down
86 changes: 86 additions & 0 deletions packages/Form/Input/date/src/__tests__/Date.spec.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import { render } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import React from 'react';
import CustomDate from '../Date';

describe('Date component', () => {
it('renders with initial value', () => {
const initialValue = new Date('2024-03-04');
const { asFragment, getByDisplayValue } = render(
<CustomDate value={initialValue} />
);

getByDisplayValue('2024-03-04');

expect(asFragment()).toMatchSnapshot();
});

it('calls onChange handler when input value changes', () => {
const onChangeMock = jest.fn();
const initialValue = new Date('2024-03-04');
const { getByLabelText, asFragment } = render(
<>
{/* eslint-disable-next-line jsx-a11y/label-has-associated-control */}
<label htmlFor="date">Date:</label>
<CustomDate
onChange={onChangeMock}
name="date"
id="date"
value={initialValue}
/>
</>
);
const inputElement = getByLabelText('Date:') as HTMLInputElement;

userEvent.type(inputElement, '2024-03-05');

expect(onChangeMock).toHaveBeenCalledWith({
value: new Date('2024-03-05'),
name: 'date',
id: 'date',
});

expect(inputElement.value).toBe('2024-03-05');

expect(asFragment()).toMatchSnapshot();
});

it('calls onChange handler when input value changes although target value is null', () => {
const initialValue = new Date('2024-03-04');
const onChangeMock = jest.fn();
const { getByLabelText, asFragment } = render(
<>
{/* eslint-disable-next-line jsx-a11y/label-has-associated-control */}
<label htmlFor="date">Date:</label>
<CustomDate
onChange={onChangeMock}
name="date"
id="date"
value={initialValue}
/>
</>
);
const inputElement = getByLabelText('Date:') as HTMLInputElement;

userEvent.clear(inputElement);

expect(inputElement.value).toBe('');

expect(onChangeMock).toHaveBeenCalledWith({
value: null,
name: 'date',
id: 'date',
});

expect(asFragment()).toMatchSnapshot();
});

it('applies class modifier', () => {
const { container, asFragment } = render(
<CustomDate classModifier="required" />
);
container.querySelector('.af-form__input-date--required');

expect(asFragment()).toMatchSnapshot();
});
});
26 changes: 26 additions & 0 deletions packages/Form/Input/date/src/__tests__/DateInput.spec.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { render } from '@testing-library/react';
import React from 'react';
import DateInput from '../DateInput';

describe('<NumberInput>', () => {
it('renders DateInput correctly', () => {
const { asFragment, getByLabelText } = render(
<DateInput
label="Date début"
id="iddateinput"
name="namedateinput"
value={new Date('2024-03-04')}
onChange={() => {}}
/>
);

expect(asFragment()).toMatchSnapshot();

const inputElement = getByLabelText('Date début');
expect(inputElement).toHaveAttribute('type', 'date');
expect(inputElement).toHaveValue('2024-03-04');
expect(inputElement).toHaveClass('af-form__input-date');

expect(inputElement.id).toBe('iddateinput');
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`Date component applies class modifier 1`] = `
<DocumentFragment>
<input
class="af-form__input-date af-form__input-date--required"
required=""
type="date"
value=""
/>
</DocumentFragment>
`;

exports[`Date component calls onChange handler when input value changes 1`] = `
<DocumentFragment>
<label
for="date"
>
Date:
</label>
<input
class="af-form__input-date"
id="date"
name="date"
type="date"
value="2024-03-04"
/>
</DocumentFragment>
`;

exports[`Date component calls onChange handler when input value changes although target value is null 1`] = `
<DocumentFragment>
<label
for="date"
>
Date:
</label>
<input
class="af-form__input-date"
id="date"
name="date"
type="date"
value="2024-03-04"
/>
</DocumentFragment>
`;

exports[`Date component renders with initial value 1`] = `
<DocumentFragment>
<input
class="af-form__input-date"
type="date"
value="2024-03-04"
/>
</DocumentFragment>
`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`<NumberInput> renders DateInput correctly 1`] = `
<DocumentFragment>
<div
class="row af-form__group"
>
<div
class="col-md-2"
>
<label
class="af-form__group-label"
for="iddateinput"
>
Date début
</label>
</div>
<div
class="col-md-10"
>
<div
class="af-form__date"
>
<input
class="af-form__input-date"
id="iddateinput"
name="namedateinput"
type="date"
value="2024-03-04"
/>
</div>
<small
class="af-form__help"
/>
</div>
</div>
</DocumentFragment>
`;
Loading