Skip to content

Commit 82efa48

Browse files
committed
RI-6049 separate timezone update from dateFormat update
1 parent f7eae55 commit 82efa48

File tree

6 files changed

+333
-258
lines changed

6 files changed

+333
-258
lines changed

redisinsight/ui/src/pages/settings/components/general-settings/datetime-formatter/DateTimeFormatter.tsx

Lines changed: 11 additions & 220 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,22 @@
1-
import React, { ChangeEvent, useEffect, useMemo, useState } from 'react'
2-
import { useDispatch, useSelector } from 'react-redux'
3-
import { useFormik } from 'formik'
1+
import React, { useEffect, useState } from 'react'
2+
import { useSelector } from 'react-redux'
43
import {
5-
EuiButton,
6-
EuiFieldText,
74
EuiFlexGroup,
85
EuiFlexItem,
9-
EuiForm,
10-
EuiRadioGroup,
11-
EuiRadioGroupOption,
126
EuiSpacer,
13-
EuiSuperSelect,
147
EuiText,
158
EuiTitle,
16-
EuiToolTip
179
} from '@elastic/eui'
18-
import { checkDateTimeFormat, formatTimestamp } from 'uiSrc/utils'
19-
import { DATETIME_FORMATTER_DEFAULT, DatetimeRadioOption, TimezoneOption, dateTimeOptions, timezoneOptions } from 'uiSrc/constants'
20-
import { updateUserConfigSettingsAction, userSettingsConfigSelector } from 'uiSrc/slices/user/user-settings'
21-
import icheck from 'uiSrc/assets/img/icons/check.svg'
22-
import { TelemetryEvent, sendEventTelemetry } from 'uiSrc/telemetry'
10+
import { formatTimestamp } from 'uiSrc/utils'
11+
import { DATETIME_FORMATTER_DEFAULT, TimezoneOption } from 'uiSrc/constants'
12+
import { userSettingsConfigSelector } from 'uiSrc/slices/user/user-settings'
13+
import TimezoneForm from './components/timezone-form/TimezoneForm'
14+
import DatetimeForm from './components/datetime-form/DatetimeForm'
2315
import styles from './styles.module.scss'
2416

25-
interface InitialValuesType {
26-
format: string;
27-
customFormat: string;
28-
commonFormat: string;
29-
selectedRadioOption: DatetimeRadioOption;
30-
timezone: TimezoneOption;
31-
}
32-
3317
const DateTimeFormatter = () => {
34-
const [error, setError] = useState('')
3518
const [preview, setPreview] = useState('')
36-
const [saveFormatSucceed, setSaveFormatSucceed] = useState(false)
3719
const config = useSelector(userSettingsConfigSelector)
38-
const dispatch = useDispatch()
3920

4021
useEffect(() => {
4122
setPreview(formatTimestamp(
@@ -45,184 +26,8 @@ const DateTimeFormatter = () => {
4526
))
4627
}, [config?.dateFormat, config?.timezone])
4728

48-
const getInitialDateTime = (): InitialValuesType => {
49-
const format = config?.dateFormat || DATETIME_FORMATTER_DEFAULT
50-
const selectedRadioOption = dateTimeOptions.some((opt) => opt.value === format)
51-
? DatetimeRadioOption.Common
52-
: DatetimeRadioOption.Custom
53-
54-
return {
55-
selectedRadioOption,
56-
format,
57-
customFormat: selectedRadioOption === DatetimeRadioOption.Custom ? format : '',
58-
commonFormat: selectedRadioOption === DatetimeRadioOption.Common ? format : dateTimeOptions[0].value,
59-
timezone: config?.timezone || TimezoneOption.Local,
60-
}
61-
}
62-
63-
const getInitialValues = useMemo(() => getInitialDateTime(), [config])
64-
65-
const formik = useFormik({
66-
initialValues: getInitialValues,
67-
enableReinitialize: true,
68-
onSubmit: (values) => {
69-
submitForm(values)
70-
}
71-
})
72-
73-
const submitForm = async (values: InitialValuesType) => {
74-
if (checkDateTimeFormat(values.format, values.timezone).valid) {
75-
dispatch(
76-
updateUserConfigSettingsAction(
77-
{ dateFormat: values.format.trim(), timezone: values.timezone.trim() },
78-
() => {
79-
formik.setSubmitting(false)
80-
setSaveFormatSucceed(true)
81-
setTimeout(() => setSaveFormatSucceed(false), 5000)
82-
},
83-
() => {
84-
formik.setSubmitting(false)
85-
}
86-
)
87-
)
88-
} else {
89-
setError('This format is not supported.')
90-
formik.setSubmitting(false)
91-
}
92-
}
93-
94-
const showError = !!error || !formik.values.customFormat
95-
const getBtnIconType = () => (showError ? 'iInCircle' : (saveFormatSucceed ? icheck : undefined))
96-
97-
const handleFormatCheck = (format = formik.values.format, timezone = formik.values.timezone) => {
98-
const { valid, error: errorMsg } = checkDateTimeFormat(format, timezone)
99-
if (!valid) {
100-
setError(errorMsg || 'This format is not supported')
101-
setPreview('Invalid Format')
102-
} else {
103-
setError('')
104-
const newPreview = formatTimestamp(new Date(), format, timezone)
105-
setPreview(newPreview)
106-
}
107-
return valid
108-
}
109-
110-
const onRadioOptionChange = (id: string) => {
111-
formik.setFieldValue('selectedRadioOption', id)
112-
if (id === DatetimeRadioOption.Custom) {
113-
formik.setFieldValue('customFormat', formik.values.format)
114-
} else {
115-
formik.setFieldValue('format', formik.values.commonFormat)
116-
formik.handleSubmit()
117-
}
118-
}
119-
120-
const onTimezoneChange = (value: string) => {
121-
formik.setFieldValue('timezone', value)
122-
123-
sendEventTelemetry({
124-
event: TelemetryEvent.SETTINGS_TIME_ZONE_CHANGED,
125-
eventData: {
126-
currentTimezone: value,
127-
}
128-
})
129-
formik.handleSubmit()
130-
}
131-
132-
const onCustomFormatChange = (e: ChangeEvent<HTMLInputElement>) => {
133-
const { value } = e.target
134-
formik.setFieldValue('customFormat', value)
135-
formik.setFieldValue('format', value)
136-
handleFormatCheck(value)
137-
}
138-
139-
const onCommonFormatChange = (value: string) => {
140-
formik.setFieldValue('commonFormat', value)
141-
formik.setFieldValue('format', value)
142-
143-
sendEventTelemetry({
144-
event: TelemetryEvent.SETTINGS_DATE_TIME_FORMAT_CHANGED,
145-
eventData: {
146-
currentFormat: value,
147-
}
148-
})
149-
formik.handleSubmit()
150-
}
151-
152-
const onCustomFormatSubmit = () => {
153-
sendEventTelemetry({
154-
event: TelemetryEvent.SETTINGS_DATE_TIME_FORMAT_CHANGED,
155-
eventData: {
156-
currentFormat: formik.values.customFormat,
157-
}
158-
})
159-
160-
formik.handleSubmit()
161-
}
162-
163-
const dateTimeFormatOptions: EuiRadioGroupOption[] = [
164-
{
165-
id: DatetimeRadioOption.Common,
166-
label: (
167-
<div className={styles.radioLabelWrapper}>
168-
<div className={styles.radioLabelTextContainer}>
169-
<EuiText color="subdued" className={styles.radioLabelText}>Pre-selected formats</EuiText>
170-
</div>
171-
<EuiSuperSelect
172-
className={styles.datetimeInput}
173-
options={dateTimeOptions}
174-
valueOfSelected={formik.values.commonFormat}
175-
onChange={(option) => onCommonFormatChange(option)}
176-
disabled={formik.values.selectedRadioOption !== DatetimeRadioOption.Common}
177-
data-test-subj="select-datetime"
178-
/>
179-
</div>
180-
),
181-
},
182-
{
183-
id: DatetimeRadioOption.Custom,
184-
label: (
185-
<div className={styles.radioLabelWrapper}>
186-
<div className={styles.radioLabelTextContainer}>
187-
<EuiText color="subdued" className={styles.radioLabelText}>Custom</EuiText>
188-
</div>
189-
{formik.values.selectedRadioOption === DatetimeRadioOption.Custom && (
190-
<>
191-
<EuiFieldText
192-
className={styles.datetimeInput}
193-
id="customFormat"
194-
name="customFormat"
195-
value={formik.values.customFormat}
196-
onChange={(e) => onCustomFormatChange(e)}
197-
data-testid="custom-datetime-input"
198-
/>
199-
<EuiToolTip
200-
position="top"
201-
anchorClassName="euiToolTip__btn-disabled"
202-
content={showError ? (error || 'This format is not supported') : null}
203-
>
204-
<EuiButton
205-
aria-label="Save"
206-
isLoading={formik.isSubmitting}
207-
color="secondary"
208-
fill
209-
size="m"
210-
className={styles.customBtn}
211-
onClick={onCustomFormatSubmit}
212-
data-testid="datetime-custom-btn"
213-
iconType={getBtnIconType()}
214-
disabled={showError}
215-
>Save
216-
</EuiButton>
217-
</EuiToolTip>
218-
</>
219-
)}
220-
</div>)
221-
}
222-
]
223-
22429
return (
225-
<EuiForm component="form" onSubmit={formik.handleSubmit} data-testid="format-timestamp-form">
30+
<>
22631
<EuiTitle size="xs">
22732
<h4>Date and Time Format</h4>
22833
</EuiTitle>
@@ -231,28 +36,14 @@ const DateTimeFormatter = () => {
23136
Specifies the date and time format to be used in Redis Insight:
23237
</EuiText>
23338
<EuiSpacer size="m" />
234-
<EuiRadioGroup
235-
options={dateTimeFormatOptions}
236-
className={styles.radios}
237-
name="radioDateTime"
238-
idSelected={formik.values.selectedRadioOption}
239-
onChange={(id) => onRadioOptionChange(id)}
240-
/>
39+
<DatetimeForm setPreview={setPreview} />
24140
<EuiSpacer size="m" />
24241
<EuiText className={styles.dateTimeSubtitle} color="subdued">Specifies the time zone to be used in Redis Insight:</EuiText>
24342
<EuiSpacer size="s" />
24443
<div>
24544
<EuiFlexGroup alignItems="center">
24645
<EuiFlexItem grow={1}>
247-
<div>
248-
<EuiSuperSelect
249-
className={styles.datetimeInput}
250-
options={timezoneOptions}
251-
valueOfSelected={formik.values.timezone}
252-
onChange={(option) => onTimezoneChange(option)}
253-
data-test-subj="select-timezone"
254-
/>
255-
</div>
46+
<TimezoneForm />
25647
</EuiFlexItem>
25748
<EuiFlexItem grow={2}>
25849
<div className={styles.previewContainer}>
@@ -263,7 +54,7 @@ const DateTimeFormatter = () => {
26354
</EuiFlexGroup>
26455
</div>
26556
<EuiSpacer size="l" />
266-
</EuiForm>
57+
</>
26758
)
26859
}
26960

0 commit comments

Comments
 (0)