Skip to content

Commit 34a9b3e

Browse files
authored
fix: preserve DatePickerInput invalid state (#22005)
1 parent 253316e commit 34a9b3e

2 files changed

Lines changed: 33 additions & 9 deletions

File tree

packages/react/src/components/DatePicker/DatePicker-test.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,26 @@ describe('DatePicker', () => {
451451
document.querySelector(`.${prefix}--date-picker__icon--warn`)
452452
).not.toBeInTheDocument();
453453
});
454+
455+
it('should preserve invalid state from DatePickerInput when DatePicker is not invalid', () => {
456+
render(
457+
<DatePicker datePickerType="single">
458+
<DatePickerInput
459+
id="date-picker-input-id-start"
460+
placeholder="mm/dd/yyyy"
461+
labelText="Date Picker label"
462+
invalid
463+
invalidText="Invalid date"
464+
/>
465+
</DatePicker>
466+
);
467+
468+
expect(screen.getByText('Invalid date')).toBeInTheDocument();
469+
expect(screen.getByLabelText('Date Picker label')).toHaveAttribute(
470+
'data-invalid',
471+
'true'
472+
);
473+
});
454474
});
455475
});
456476

packages/react/src/components/DatePicker/DatePicker.tsx

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,6 @@ const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>((props, ref) => {
440440

441441
const savedOnOpen = useSavedCallback(onOpen);
442442

443-
const effectiveWarn = warn && !invalid;
444443
const wrapperRef = useRef<HTMLDivElement>(null);
445444

446445
const datePickerClasses = cx(`${prefix}--date-picker`, {
@@ -460,38 +459,43 @@ const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>((props, ref) => {
460459
const childrenWithProps = React.Children.toArray(children as any).map(
461460
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20452
462461
(child: any, index) => {
462+
const childInvalid = child.props?.invalid;
463+
const childWarn = child.props?.warn;
464+
const mergedInvalid = invalid ?? childInvalid;
465+
const mergedWarn = mergedInvalid ? false : (warn ?? childWarn);
466+
463467
if (index === 0 && isComponentElement(child, DatePickerInput)) {
464468
return React.cloneElement(child, {
465469
datePickerType,
466470
ref: startInputField,
467471
readOnly,
468-
invalid,
469-
warn: effectiveWarn,
472+
invalid: mergedInvalid,
473+
warn: mergedWarn,
470474
});
471475
}
472476
if (index === 1 && isComponentElement(child, DatePickerInput)) {
473477
return React.cloneElement(child, {
474478
datePickerType,
475479
ref: endInputField,
476480
readOnly,
477-
invalid,
478-
warn: effectiveWarn,
481+
invalid: mergedInvalid,
482+
warn: mergedWarn,
479483
});
480484
}
481485
if (index === 0) {
482486
return React.cloneElement(child, {
483487
ref: startInputField,
484488
readOnly,
485-
invalid,
486-
warn: effectiveWarn,
489+
invalid: mergedInvalid,
490+
warn: mergedWarn,
487491
});
488492
}
489493
if (index === 1) {
490494
return React.cloneElement(child, {
491495
ref: endInputField,
492496
readOnly,
493-
invalid,
494-
warn: effectiveWarn,
497+
invalid: mergedInvalid,
498+
warn: mergedWarn,
495499
});
496500
}
497501
}

0 commit comments

Comments
 (0)