From f21b79786ac09e95fdd6105a6fda2ec4bb155f70 Mon Sep 17 00:00:00 2001 From: Luke Date: Sat, 14 Jan 2023 14:15:38 +0100 Subject: [PATCH] feat(web/input): date range picker --- web/src/features/dialog/InputDialog.tsx | 7 +- .../dialog/components/fields/date.tsx | 65 +++++++++++++------ web/src/interfaces/dialog.ts | 4 +- 3 files changed, 53 insertions(+), 23 deletions(-) diff --git a/web/src/features/dialog/InputDialog.tsx b/web/src/features/dialog/InputDialog.tsx index 72ce1bd..8666faf 100644 --- a/web/src/features/dialog/InputDialog.tsx +++ b/web/src/features/dialog/InputDialog.tsx @@ -59,10 +59,12 @@ const InputDialog: React.FC = () => { { value: row.type !== 'checkbox' - ? row.type === 'date' + ? row.type === 'date' || row.type === 'date-range' ? // Set date to current one if default is set to true row.default === true ? new Date() + : Array.isArray(row.default) + ? row.default.map((date) => new Date(date)) : row.default && new Date(row.default) : row.default : row.checked, @@ -140,7 +142,8 @@ const InputDialog: React.FC = () => { {row.type === 'number' && } {row.type === 'slider' && } {row.type === 'color' && } - {row.type === 'date' && } + {row.type === 'date' || + (row.type === 'date-range' && )} ); })} diff --git a/web/src/features/dialog/components/fields/date.tsx b/web/src/features/dialog/components/fields/date.tsx index c323046..0a3ea74 100644 --- a/web/src/features/dialog/components/fields/date.tsx +++ b/web/src/features/dialog/components/fields/date.tsx @@ -1,7 +1,7 @@ import { IDateInput } from '../../../../interfaces/dialog'; import { Control, useController } from 'react-hook-form'; import { FormValues } from '../../InputDialog'; -import { DatePicker } from '@mantine/dates'; +import { DatePicker, DateRangePicker } from '@mantine/dates'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; interface Props { @@ -14,28 +14,55 @@ const DateField: React.FC = (props) => { const controller = useController({ name: `test.${props.index}.value`, control: props.control, - defaultValue: props.row.default === true ? new Date() : props.row.default ? new Date(props.row.default) : undefined, + defaultValue: + props.row.default === true + ? new Date() + : Array.isArray(props.row.default) + ? props.row.default.map((date) => new Date(date)) + : props.row.default && new Date(props.row.default), rules: { required: props.row.required }, }); return ( - } - minDate={props.row.min ? new Date(props.row.min) : undefined} - maxDate={props.row.max ? new Date(props.row.max) : undefined} - /> + <> + {props.row.type === 'date' ? ( + } + minDate={props.row.min ? new Date(props.row.min) : undefined} + maxDate={props.row.max ? new Date(props.row.max) : undefined} + /> + ) : ( + } + minDate={props.row.min ? new Date(props.row.min) : undefined} + maxDate={props.row.max ? new Date(props.row.max) : undefined} + /> + )} + ); }; diff --git a/web/src/interfaces/dialog.ts b/web/src/interfaces/dialog.ts index 46175f0..2978934 100644 --- a/web/src/interfaces/dialog.ts +++ b/web/src/interfaces/dialog.ts @@ -69,9 +69,9 @@ export interface IColorInput { } export interface IDateInput { - type: 'date'; + type: 'date' | 'date-range'; label: string; - default?: string | true; + default?: string | [string, string] | true; disabled?: boolean; description?: string; required?: boolean;