Skip to content

Commit d2a4dc2

Browse files
authored
Add isWithinModal option to DateTimePicker (#1305)
1 parent c2aa31d commit d2a4dc2

File tree

2 files changed

+29
-18
lines changed

2 files changed

+29
-18
lines changed

src/DateTimePicker/DateTimePicker.scss

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
@import 'react-datepicker/dist/react-datepicker.css';
22
@import '../../scss/theme.scss';
33

4+
.react-datepicker__popper-container--modal {
5+
z-index: var(--z-index-popover);
6+
}
7+
48
.date-time-picker {
59
align-items: flex-start;
610
display: flex;
@@ -26,13 +30,12 @@
2630
color: var(--ux-gray-300);
2731
}
2832

29-
3033
.date-time-picker {
3134
&__input-group {
3235
background-color: var(--ux-white);
3336
border-radius: var(--ux-border-radius);
3437
border: thin solid var(--ux-gray-400);
35-
padding: .46875rem .75rem;
38+
padding: 0.46875rem 0.75rem;
3639
justify-content: space-between;
3740
width: inherit;
3841
}
@@ -58,10 +61,10 @@
5861
}
5962

6063
.react-datepicker__time-container
61-
.react-datepicker__time
62-
.react-datepicker__time-box
63-
ul.react-datepicker__time-list
64-
li.react-datepicker__time-list-item--selected {
64+
.react-datepicker__time
65+
.react-datepicker__time-box
66+
ul.react-datepicker__time-list
67+
li.react-datepicker__time-list-item--selected {
6568
background: var(--ux-blue-500);
6669
}
6770

@@ -78,7 +81,8 @@
7881
}
7982

8083
// Override form-control's default greying of read only inputs
81-
input:read-only, .form-control[readonly] {
84+
input:read-only,
85+
.form-control[readonly] {
8286
background-color: var(--ux-white);
8387
}
8488

@@ -95,38 +99,36 @@
9599
}
96100

97101
&:not(:first-child) {
98-
margin-top: .5rem;
102+
margin-top: 0.5rem;
99103

100104
@include media-breakpoint-up(sm) {
101105
margin-top: 0;
102-
margin-left: .5rem;
106+
margin-left: 0.5rem;
103107
}
104108
}
105109
}
106110
}
107111

108-
109112
// override some of the form group invalid styles
110-
.FormGroup--is-invalid
111-
.date-time-picker
112-
select {
113+
.FormGroup--is-invalid .date-time-picker select {
113114
border: thin solid var(--ux-gray-400);
114115
border-radius: var(--ux-border-radius);
115116
}
116117

117118
// override some of the form group invalid styles
118119
// inputs need more specificity to override the above styling
119120
.FormGroup--is-invalid
120-
.date-time-picker
121-
.react-datepicker-wrapper
122-
.react-datepicker__input-container
123-
input {
121+
.date-time-picker
122+
.react-datepicker-wrapper
123+
.react-datepicker__input-container
124+
input {
124125
border: thin solid var(--ux-red);
125126
}
126127

127128
// Undoing some styles when this is nested within a bootstrap table
128129
.table .date-time-picker {
129-
td, th {
130+
td,
131+
th {
130132
border-top: 0;
131133
padding: 0;
132134
vertical-align: middle;

src/DateTimePicker/DateTimePicker.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { useCallback, useState, useEffect } from 'react';
2+
import { createPortal } from 'react-dom';
23
import DatePicker, { getDefaultLocale, registerLocale, setDefaultLocale } from 'react-datepicker';
34
import {
45
format,
@@ -32,6 +33,10 @@ const localeMap = {
3233
const STANDARD_TIME_FORMAT_FNS = 'hh:mm aa';
3334
const ISO_DATE_FORMAT_FNS = 'yyyy-MM-dd';
3435

36+
const popperContainerDocumentBody = ({ children }: { children?: React.ReactNode }) => (
37+
createPortal(children, document.body)
38+
);
39+
3540
export type DateTimePickerProps = {
3641
date?: string;
3742
dateFormat?: string;
@@ -46,6 +51,7 @@ export type DateTimePickerProps = {
4651
showTimeSelect?: boolean;
4752
time?: string;
4853
timeFormat?: string;
54+
isWithinModal?: boolean;
4955
onChangeDate?: (...args: unknown[]) => unknown;
5056
onDateParseError?: (...args: unknown[]) => unknown;
5157
};
@@ -64,6 +70,7 @@ function DateTimePicker({
6470
showTimeSelect = false,
6571
time = '',
6672
timeFormat = STANDARD_TIME_FORMAT_FNS,
73+
isWithinModal = false,
6774
onChangeDate,
6875
onDateParseError,
6976
}: DateTimePickerProps) {
@@ -195,6 +202,8 @@ function DateTimePicker({
195202
minDate={minDate}
196203
name={name}
197204
placeholderText={getDateFormat().toUpperCase()}
205+
popperClassName={isWithinModal ? 'react-datepicker__popper-container--modal' : ''}
206+
popperContainer={isWithinModal ? popperContainerDocumentBody : undefined}
198207
selected={dateFromString()}
199208
showMonthDropdown={showMonthAndYearSelects}
200209
showTimeSelect={showTimeSelect}

0 commit comments

Comments
 (0)