Skip to content

Commit c7533a8

Browse files
authored
fix: default scheduled changes (#5141)
1 parent 7b4a1a5 commit c7533a8

File tree

9 files changed

+418
-391
lines changed

9 files changed

+418
-391
lines changed

frontend/common/types/responses.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,10 @@ export type EdgePagedResponse<T> = PagedResponse<T> & {
44
last_evaluated_key?: string
55
pages?: (string | undefined)[]
66
}
7-
export type Approval =
8-
| {
9-
user: number
10-
}
11-
| {
12-
group: number
13-
}
7+
export type Approval = {
8+
user?: number
9+
group?: number
10+
}
1411
export type PagedResponse<T> = {
1512
count?: number
1613
next?: string

frontend/package-lock.json

Lines changed: 44 additions & 66 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@
111111
"react": "16.14.0",
112112
"react-async-script": "1.2.0",
113113
"react-click-outside": "3.0.1",
114-
"react-datepicker": "6.2.0",
114+
"react-datepicker": "^8.1.0",
115115
"react-device-detect": "1.9.9",
116116
"react-diff-viewer-continued": "^3.3.1",
117117
"react-dom": "16.14.0",

frontend/web/components/AdminAPIKeys.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ export class CreateAPIKey extends PureComponent {
273273
<DateSelect
274274
onChange={(e) => {
275275
this.setState({
276-
expiry_date: e.toISOString(),
276+
expiry_date: e?.toISOString(),
277277
})
278278
}}
279279
selected={expiry_date ? moment(expiry_date)._d : null}

frontend/web/components/DateSelect.js renamed to frontend/web/components/DateSelect.tsx

Lines changed: 61 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,39 @@
1-
import DatePicker from 'react-datepicker'
1+
import DatePicker, { DatePickerProps } from 'react-datepicker'
22
import Icon from './Icon'
3-
import { useState } from 'react'
3+
import { useState, FC } from 'react'
4+
5+
export interface DateSelectProps
6+
extends Pick<DatePickerProps, 'dateFormat' | 'selected'> {
7+
value?: DatePickerProps['value']
8+
className?: string
9+
isValid?: boolean
10+
onChange?: (
11+
date: Date | null,
12+
event?: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>,
13+
) => void
14+
}
15+
16+
const DateSelect: FC<DateSelectProps> = ({
17+
className,
18+
dateFormat,
19+
isValid,
20+
onChange,
21+
selected,
22+
value,
23+
}) => {
24+
const [isMonthPicker, setIsMonthPicker] = useState(false)
25+
const [isYearPicker, setIsYearPicker] = useState(false)
26+
const [touched, setTouched] = useState(false)
27+
const [isOpen, setIsOpen] = useState(false)
428

5-
const DateSelect = ({ dateFormat, onChange, onSelect, selected, value }) => {
6-
const [isMonthPicker, setMonthPicker] = useState(false)
7-
const [isYearPicker, setYearPicker] = useState(false)
8-
const [isOpen, setOpen] = useState(false)
929
return (
1030
<Flex style={{ position: 'relative' }}>
1131
<DatePicker
32+
className={`input-lg ${className} ${
33+
!isValid && touched ? 'invalid' : ''
34+
}`}
1235
dateFormat={dateFormat}
36+
onFocus={() => setTouched(true)}
1337
renderCustomHeader={({
1438
date,
1539
decreaseMonth,
@@ -32,9 +56,9 @@ const DateSelect = ({ dateFormat, onChange, onSelect, selected, value }) => {
3256
</span>
3357
<div
3458
onClick={() => {
35-
setMonthPicker(true)
59+
setIsMonthPicker(true)
3660
if (isMonthPicker) {
37-
setYearPicker(true)
61+
setIsYearPicker(true)
3862
}
3963
}}
4064
className='react-datepicker-header-title'
@@ -64,25 +88,33 @@ const DateSelect = ({ dateFormat, onChange, onSelect, selected, value }) => {
6488
</Row>
6589
)}
6690
minDate={new Date()}
67-
onChange={(date, e) => {
68-
if (date < new Date()) {
69-
setMonthPicker(false)
70-
setYearPicker(false)
71-
onChange(new Date())
72-
} else {
73-
onChange(date)
74-
if (!e) {
75-
setOpen(false)
76-
}
77-
if (isMonthPicker) {
78-
setMonthPicker(false)
79-
}
80-
if (isYearPicker) {
81-
setYearPicker(false)
82-
}
91+
onChange={(date, e): DatePickerProps['onChange'] => {
92+
if (date === null) {
93+
setIsMonthPicker(false)
94+
setIsYearPicker(false)
95+
onChange?.(null)
96+
return
97+
}
98+
99+
const today = new Date()
100+
if (date < today) {
101+
setIsMonthPicker(false)
102+
setIsYearPicker(false)
103+
onChange?.(new Date())
104+
return
105+
}
106+
107+
onChange?.(date)
108+
if (!e) {
109+
setIsOpen(false)
110+
}
111+
if (isMonthPicker) {
112+
setIsMonthPicker(false)
113+
}
114+
if (isYearPicker) {
115+
setIsYearPicker(false)
83116
}
84117
}}
85-
className='input-lg'
86118
formatWeekDay={(nameOfDay) => nameOfDay.substr(0, 1)}
87119
showTimeSelect={!isMonthPicker && !isYearPicker}
88120
showMonthYearPicker={isMonthPicker}
@@ -92,12 +124,12 @@ const DateSelect = ({ dateFormat, onChange, onSelect, selected, value }) => {
92124
selected={selected}
93125
value={value}
94126
timeFormat='HH:mm'
95-
onInputClick={() => setOpen(true)}
127+
onInputClick={() => setIsOpen(true)}
96128
onClickOutside={(e) => {
97129
if (e) {
98-
setOpen(false)
99-
setMonthPicker(false)
100-
setYearPicker(false)
130+
setIsOpen(false)
131+
setIsMonthPicker(false)
132+
setIsYearPicker(false)
101133
}
102134
}}
103135
open={isOpen}

0 commit comments

Comments
 (0)