@indico-data/design-system 2.36.4 → 2.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.css +40 -408
- package/lib/index.d.ts +122 -84
- package/lib/index.esm.css +40 -408
- package/lib/index.esm.js +15631 -16559
- package/lib/index.esm.js.map +1 -1
- package/lib/index.js +14165 -15092
- package/lib/index.js.map +1 -1
- package/lib/src/components/forms/date/datePicker/DatePicker.d.ts +3 -0
- package/lib/src/components/forms/date/datePicker/DatePicker.stories.d.ts +9 -0
- package/lib/src/components/forms/date/datePicker/contants.d.ts +21 -0
- package/lib/src/components/forms/date/datePicker/types.d.ts +48 -0
- package/lib/src/components/forms/date/iconTriggerDatePicker/IconTriggerDatePicker.d.ts +22 -0
- package/lib/src/components/forms/date/iconTriggerDatePicker/IconTriggerDatePicker.stories.d.ts +6 -0
- package/lib/src/components/forms/date/iconTriggerDatePicker/index.d.ts +1 -0
- package/lib/src/components/forms/date/inputDatePicker/SingleInputDatePicker.d.ts +23 -0
- package/lib/src/components/forms/date/inputDatePicker/SingleInputDatePicker.stories.d.ts +6 -0
- package/lib/src/components/forms/date/inputDatePicker/index.d.ts +1 -0
- package/lib/src/components/forms/date/inputDateRangePicker/InputDateRangePicker.d.ts +23 -0
- package/lib/src/components/forms/date/inputDateRangePicker/InputDateRangePicker.stories.d.ts +6 -0
- package/lib/src/components/forms/date/inputDateRangePicker/index.d.ts +1 -0
- package/lib/src/components/forms/input/Input.d.ts +1 -0
- package/lib/src/components/index.d.ts +3 -0
- package/lib/src/components/skeleton/Skeleton.d.ts +2 -2
- package/lib/src/components/skeleton/Skeleton.stories.d.ts +1 -0
- package/lib/src/index.d.ts +4 -1
- package/lib/src/legacy/components/index.d.ts +1 -1
- package/lib/src/legacy/components/inputs/index.d.ts +0 -2
- package/package.json +2 -2
- package/src/components/forms/date/datePicker/DatePicker.mdx +41 -0
- package/src/components/forms/date/datePicker/DatePicker.stories.tsx +307 -0
- package/src/components/forms/date/datePicker/DatePicker.tsx +68 -0
- package/src/components/forms/date/datePicker/contants.ts +22 -0
- package/src/components/forms/date/datePicker/styles/DatePicker.scss +85 -0
- package/src/components/forms/date/datePicker/types.ts +59 -0
- package/src/components/forms/date/iconTriggerDatePicker/IconTriggerDatePicker.mdx +17 -0
- package/src/components/forms/date/iconTriggerDatePicker/IconTriggerDatePicker.stories.tsx +201 -0
- package/src/components/forms/date/iconTriggerDatePicker/IconTriggerDatePicker.tsx +89 -0
- package/src/components/forms/date/iconTriggerDatePicker/index.ts +1 -0
- package/src/components/forms/date/inputDatePicker/SingleInputDatePicker.mdx +18 -0
- package/src/components/forms/date/inputDatePicker/SingleInputDatePicker.stories.tsx +208 -0
- package/src/components/forms/date/inputDatePicker/SingleInputDatePicker.tsx +117 -0
- package/src/components/forms/date/inputDatePicker/index.ts +1 -0
- package/src/components/forms/date/inputDateRangePicker/InputDateRangePicker.mdx +18 -0
- package/src/components/forms/date/inputDateRangePicker/InputDateRangePicker.stories.tsx +208 -0
- package/src/components/forms/date/inputDateRangePicker/InputDateRangePicker.tsx +117 -0
- package/src/components/forms/date/inputDateRangePicker/index.ts +1 -0
- package/src/components/forms/input/Input.tsx +3 -0
- package/src/components/index.ts +3 -0
- package/src/components/skeleton/Skeleton.stories.tsx +24 -4
- package/src/components/skeleton/Skeleton.tsx +4 -4
- package/src/index.ts +3 -2
- package/src/legacy/components/index.ts +0 -2
- package/src/legacy/components/inputs/index.ts +0 -2
- package/src/styles/index.scss +2 -1
- package/lib/src/legacy/components/inputs/DatePicker/DatePicker.d.ts +0 -15
- package/lib/src/legacy/components/inputs/DatePicker/DatePicker.stories.d.ts +0 -6
- package/lib/src/legacy/components/inputs/DatePicker/DatePicker.styles.d.ts +0 -1
- package/lib/src/legacy/components/inputs/DatePicker/index.d.ts +0 -1
- package/lib/src/legacy/components/inputs/NoInputDatePicker/NoInputDatePicker.d.ts +0 -21
- package/lib/src/legacy/components/inputs/NoInputDatePicker/NoInputDatePicker.stories.d.ts +0 -7
- package/lib/src/legacy/components/inputs/NoInputDatePicker/index.d.ts +0 -1
- package/src/legacy/components/inputs/DatePicker/DatePicker.stories.tsx +0 -30
- package/src/legacy/components/inputs/DatePicker/DatePicker.styles.ts +0 -437
- package/src/legacy/components/inputs/DatePicker/DatePicker.tsx +0 -165
- package/src/legacy/components/inputs/DatePicker/index.ts +0 -1
- package/src/legacy/components/inputs/NoInputDatePicker/NoInputDatePicker.scss +0 -441
- package/src/legacy/components/inputs/NoInputDatePicker/NoInputDatePicker.stories.tsx +0 -52
- package/src/legacy/components/inputs/NoInputDatePicker/NoInputDatePicker.tsx +0 -245
- package/src/legacy/components/inputs/NoInputDatePicker/index.ts +0 -1
- /package/src/{legacy/components/inputs/NoInputDatePicker/__tests__/NoInputDatePicker.test.tsx → components/forms/date/iconTriggerDatePicker/__tests__/IconTriggerDatePicker.test.tsx} +0 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { DateRange, DayPicker, Mode, OnSelectHandler } from 'react-day-picker';
|
|
3
|
+
import { DatePickerProps } from './types';
|
|
4
|
+
import { getCommonProps } from './contants';
|
|
5
|
+
|
|
6
|
+
export const DatePicker = React.forwardRef<HTMLInputElement, DatePickerProps>((props) => {
|
|
7
|
+
const {
|
|
8
|
+
mode = 'single',
|
|
9
|
+
className,
|
|
10
|
+
captionLayout = 'dropdown',
|
|
11
|
+
selected,
|
|
12
|
+
id,
|
|
13
|
+
month,
|
|
14
|
+
defaultMonth,
|
|
15
|
+
startMonth,
|
|
16
|
+
endMonth,
|
|
17
|
+
components,
|
|
18
|
+
numberOfMonths,
|
|
19
|
+
isDisabled,
|
|
20
|
+
formatters,
|
|
21
|
+
weekStartsOn,
|
|
22
|
+
firstWeekContainsDate,
|
|
23
|
+
today,
|
|
24
|
+
isRequired,
|
|
25
|
+
min,
|
|
26
|
+
max,
|
|
27
|
+
onSelect,
|
|
28
|
+
onMonthChange,
|
|
29
|
+
onNextClick,
|
|
30
|
+
onPrevClick,
|
|
31
|
+
onDayClick,
|
|
32
|
+
...rest
|
|
33
|
+
} = props;
|
|
34
|
+
|
|
35
|
+
const commonProps = getCommonProps(props);
|
|
36
|
+
|
|
37
|
+
const modeMap: {
|
|
38
|
+
[key: string]: {
|
|
39
|
+
mode: Mode | undefined;
|
|
40
|
+
selected: any;
|
|
41
|
+
onSelect: any;
|
|
42
|
+
numberOfMonths: number | undefined;
|
|
43
|
+
};
|
|
44
|
+
} = {
|
|
45
|
+
single: {
|
|
46
|
+
mode: 'single',
|
|
47
|
+
numberOfMonths: numberOfMonths ?? 1,
|
|
48
|
+
selected: selected as Date | undefined,
|
|
49
|
+
onSelect: onSelect as OnSelectHandler<Date>,
|
|
50
|
+
},
|
|
51
|
+
multiple: {
|
|
52
|
+
mode: 'multiple',
|
|
53
|
+
numberOfMonths: numberOfMonths ?? 1,
|
|
54
|
+
selected: selected as Date[] | undefined,
|
|
55
|
+
onSelect: onSelect as OnSelectHandler<Date[]> | undefined,
|
|
56
|
+
},
|
|
57
|
+
range: {
|
|
58
|
+
mode: 'range',
|
|
59
|
+
numberOfMonths: numberOfMonths ?? 2,
|
|
60
|
+
selected: selected as DateRange | undefined,
|
|
61
|
+
onSelect: onSelect as OnSelectHandler<DateRange>,
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const modeProps = modeMap[mode];
|
|
66
|
+
|
|
67
|
+
return <DayPicker {...modeProps} {...commonProps} {...rest} />;
|
|
68
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CommonProps } from './types';
|
|
2
|
+
|
|
3
|
+
export const getCommonProps = (props: CommonProps) => ({
|
|
4
|
+
className: props.className,
|
|
5
|
+
id: props.id,
|
|
6
|
+
month: props.month,
|
|
7
|
+
captionLayout: props.captionLayout,
|
|
8
|
+
defaultMonth: props.defaultMonth,
|
|
9
|
+
startMonth: props.startMonth,
|
|
10
|
+
endMonth: props.endMonth,
|
|
11
|
+
components: props.components,
|
|
12
|
+
isDisabled: props.isDisabled,
|
|
13
|
+
formatters: props.formatters,
|
|
14
|
+
weekStartsOn: props.weekStartsOn,
|
|
15
|
+
firstWeekContainsDate: props.firstWeekContainsDate,
|
|
16
|
+
today: props.today,
|
|
17
|
+
required: props.isRequired,
|
|
18
|
+
onMonthChange: props.onMonthChange,
|
|
19
|
+
onNextClick: props.onNextClick,
|
|
20
|
+
onPrevClick: props.onPrevClick,
|
|
21
|
+
onDayClick: props.onDayClick,
|
|
22
|
+
});
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
@import 'react-day-picker/style.css';
|
|
2
|
+
|
|
3
|
+
:root [data-theme='light'] {
|
|
4
|
+
--pf-date-picker-background-color: var(--pf-white-color);
|
|
5
|
+
--pf-date-picker-selected-date-background-color: var(--pf-primary-color);
|
|
6
|
+
--pf-date-picker-selected-date-font-color: var(--pf-white-color);
|
|
7
|
+
|
|
8
|
+
.rdp-root {
|
|
9
|
+
--rdp-accent-color: var(--pf-link-color);
|
|
10
|
+
--rdp-font-family: var(--pf-font-family-base);
|
|
11
|
+
|
|
12
|
+
// range
|
|
13
|
+
--rdp-range_middle-background-color: var(--pf-primary-color-300);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
:root [data-theme='dark'] {
|
|
18
|
+
// months
|
|
19
|
+
--pf-date-picker-background-color: var(--pf-primary-color-400);
|
|
20
|
+
|
|
21
|
+
// day
|
|
22
|
+
--pf-date-picker-selected-date-background-color: var(--pf-secondary-color-300);
|
|
23
|
+
--pf-date-picker-selected-date-font-color: var(--pf-white-color);
|
|
24
|
+
|
|
25
|
+
.rdp-root {
|
|
26
|
+
--rdp-accent-color: var(--pf-link-color);
|
|
27
|
+
--rdp-accent-background-color: var(--pf-primary-color-200);
|
|
28
|
+
--rdp-font-family: var(--pf-font-family-base);
|
|
29
|
+
|
|
30
|
+
// range
|
|
31
|
+
--rdp-range_middle-background-color: var(--pf-primary-color-600);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Navigation
|
|
36
|
+
|
|
37
|
+
.rdp-chevron {
|
|
38
|
+
margin-left: var(--pf-margin-1);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Calendar
|
|
42
|
+
|
|
43
|
+
.rdp-months {
|
|
44
|
+
background-color: var(--pf-date-picker-background-color);
|
|
45
|
+
padding: var(--pf-padding-3);
|
|
46
|
+
border-radius: var(--pf-rounded);
|
|
47
|
+
border: solid var(--pf-border-thin) var(--pf-border-color);
|
|
48
|
+
.rdp-nav {
|
|
49
|
+
margin-top: var(--pf-margin-3);
|
|
50
|
+
margin-right: var(--pf-margin-3);
|
|
51
|
+
}
|
|
52
|
+
.rdp-month_caption {
|
|
53
|
+
padding-left: var(--pf-margin-3);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.rdp-week {
|
|
58
|
+
margin-bottom: var(--pf-margin-4);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.rdp-day {
|
|
62
|
+
.rdp-day_button {
|
|
63
|
+
border: none;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
&.rdp-today {
|
|
67
|
+
.rdp-day_button {
|
|
68
|
+
background-color: var(--pf-primary-color-300);
|
|
69
|
+
color: var(--pf-date-picker-selected-date-font-color);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
&.rdp-selected {
|
|
74
|
+
.rdp-day_button {
|
|
75
|
+
background-color: var(--pf-date-picker-selected-date-background-color);
|
|
76
|
+
color: var(--pf-date-picker-selected-date-font-color);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
&.rdp-range_middle {
|
|
81
|
+
.rdp-day_button {
|
|
82
|
+
background-color: transparent;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CustomComponents,
|
|
3
|
+
DateRange,
|
|
4
|
+
DayEventHandler,
|
|
5
|
+
Formatters,
|
|
6
|
+
Matcher,
|
|
7
|
+
Mode,
|
|
8
|
+
MonthChangeEventHandler,
|
|
9
|
+
OnSelectHandler,
|
|
10
|
+
} from 'react-day-picker';
|
|
11
|
+
|
|
12
|
+
export interface DatePickerProps {
|
|
13
|
+
selected?: Date | DateRange | undefined;
|
|
14
|
+
onSelect?: OnSelectHandler<Date> | OnSelectHandler<DateRange>;
|
|
15
|
+
mode?: Mode;
|
|
16
|
+
className?: string;
|
|
17
|
+
captionLayout?: 'dropdown' | 'dropdown-months' | 'dropdown-years' | 'label';
|
|
18
|
+
id?: string;
|
|
19
|
+
month?: Date;
|
|
20
|
+
defaultMonth?: Date;
|
|
21
|
+
startMonth?: Date | undefined;
|
|
22
|
+
endMonth?: Date;
|
|
23
|
+
components?: Partial<CustomComponents>;
|
|
24
|
+
numberOfMonths?: number;
|
|
25
|
+
isDisabled?: Matcher | Matcher[] | undefined;
|
|
26
|
+
formatters?: Partial<Formatters>;
|
|
27
|
+
weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | undefined;
|
|
28
|
+
firstWeekContainsDate?: 1 | 4;
|
|
29
|
+
today?: Date;
|
|
30
|
+
isRequired?: any;
|
|
31
|
+
min?: number;
|
|
32
|
+
max?: number;
|
|
33
|
+
onMonthChange?: MonthChangeEventHandler;
|
|
34
|
+
onNextClick?: MonthChangeEventHandler;
|
|
35
|
+
onPrevClick?: MonthChangeEventHandler;
|
|
36
|
+
onDayClick?: DayEventHandler<React.MouseEvent>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface CommonProps {
|
|
40
|
+
className?: string;
|
|
41
|
+
id?: string;
|
|
42
|
+
month?: Date;
|
|
43
|
+
captionLayout?: 'dropdown' | 'dropdown-months' | 'dropdown-years' | 'label';
|
|
44
|
+
defaultMonth?: Date;
|
|
45
|
+
startMonth?: Date | undefined;
|
|
46
|
+
endMonth?: Date;
|
|
47
|
+
components?: Partial<CustomComponents>;
|
|
48
|
+
numberOfMonths?: number;
|
|
49
|
+
isDisabled?: Matcher | Matcher[] | undefined;
|
|
50
|
+
formatters?: Partial<Formatters>;
|
|
51
|
+
weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | undefined;
|
|
52
|
+
firstWeekContainsDate?: 1 | 4;
|
|
53
|
+
isRequired?: any;
|
|
54
|
+
today?: Date;
|
|
55
|
+
onMonthChange?: MonthChangeEventHandler;
|
|
56
|
+
onNextClick?: MonthChangeEventHandler;
|
|
57
|
+
onPrevClick?: MonthChangeEventHandler;
|
|
58
|
+
onDayClick?: DayEventHandler<React.MouseEvent>;
|
|
59
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Canvas, Meta, Controls } from '@storybook/blocks';
|
|
2
|
+
import * as IconTriggerDatePicker from './IconTriggerDatePicker.stories';
|
|
3
|
+
import { Row, Col } from '../../../grid/index';
|
|
4
|
+
|
|
5
|
+
<Meta title="Forms/DatePicker/IconTriggerDatePicker" name="IconTriggerDatePicker" />
|
|
6
|
+
|
|
7
|
+
# IconTriggerDatePicker
|
|
8
|
+
The No Input Date Picker is to be used when we need to open the datepicker with a simple icon and dont care about the user typing in a value. It leverages our DatePicker component inside of a popper window.
|
|
9
|
+
<Canvas of={IconTriggerDatePicker.Default} />
|
|
10
|
+
|
|
11
|
+
## Props
|
|
12
|
+
In addition to the props listed below, it also accepts all props listed [here](story=?path=/docs/forms-datepicker--datepicker)
|
|
13
|
+
<Controls of={IconTriggerDatePicker.Default} />
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
## ToDo
|
|
17
|
+
- Create single component for all dropdown date pickers that accept an react element as the trigger, such as an icon, button, component, input, etc.
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { useArgs } from '@storybook/preview-api';
|
|
3
|
+
import { IconTriggerDatePicker } from '@/components/forms/date/iconTriggerDatePicker';
|
|
4
|
+
import { DateRange } from 'react-day-picker';
|
|
5
|
+
|
|
6
|
+
const meta: Meta<typeof IconTriggerDatePicker> = {
|
|
7
|
+
component: IconTriggerDatePicker,
|
|
8
|
+
title: 'Forms/DatePicker/IconTriggerDatePicker',
|
|
9
|
+
decorators: [
|
|
10
|
+
(Story) => (
|
|
11
|
+
<div style={{ height: '400px' }}>
|
|
12
|
+
<Story />
|
|
13
|
+
</div>
|
|
14
|
+
),
|
|
15
|
+
],
|
|
16
|
+
argTypes: {
|
|
17
|
+
ariaLabel: {
|
|
18
|
+
control: 'text',
|
|
19
|
+
description: 'A label for assistive technologies.',
|
|
20
|
+
table: {
|
|
21
|
+
category: 'Props',
|
|
22
|
+
type: {
|
|
23
|
+
summary: 'string',
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
className: {
|
|
28
|
+
control: false,
|
|
29
|
+
description: 'Accepts a CSS class name',
|
|
30
|
+
table: {
|
|
31
|
+
category: 'Props',
|
|
32
|
+
type: {
|
|
33
|
+
summary: 'string',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
id: {
|
|
38
|
+
control: 'text',
|
|
39
|
+
description: 'The id of the input field.',
|
|
40
|
+
table: {
|
|
41
|
+
category: 'Props',
|
|
42
|
+
type: {
|
|
43
|
+
summary: 'string',
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
label: {
|
|
48
|
+
control: 'text',
|
|
49
|
+
description: 'The label for the input field.',
|
|
50
|
+
table: {
|
|
51
|
+
category: 'Props',
|
|
52
|
+
type: {
|
|
53
|
+
summary: 'string',
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
month: {
|
|
58
|
+
control: 'date',
|
|
59
|
+
description: 'The month to display.',
|
|
60
|
+
table: {
|
|
61
|
+
category: 'Props',
|
|
62
|
+
type: {
|
|
63
|
+
summary: 'Date',
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
triggerIcon: {
|
|
68
|
+
control: 'text',
|
|
69
|
+
description: 'The icon to use as a trigger.',
|
|
70
|
+
table: {
|
|
71
|
+
category: 'Props',
|
|
72
|
+
type: {
|
|
73
|
+
summary: 'IconName',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
triggerIconSize: {
|
|
78
|
+
control: 'select',
|
|
79
|
+
options: ['sm', 'md', 'lg'],
|
|
80
|
+
description: 'The size of the trigger icon.',
|
|
81
|
+
table: {
|
|
82
|
+
category: 'Props',
|
|
83
|
+
type: {
|
|
84
|
+
summary: 'IconSizes',
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
isOpen: {
|
|
89
|
+
control: false,
|
|
90
|
+
description: 'Whether the date picker is open.',
|
|
91
|
+
table: {
|
|
92
|
+
category: 'Props',
|
|
93
|
+
type: {
|
|
94
|
+
summary: 'boolean',
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
selected: {
|
|
99
|
+
control: 'date',
|
|
100
|
+
description: 'The selected day(s).',
|
|
101
|
+
table: {
|
|
102
|
+
category: 'Props',
|
|
103
|
+
type: {
|
|
104
|
+
summary: 'Date | Date[] | DateRange | undefined',
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
mode: {
|
|
109
|
+
control: 'select',
|
|
110
|
+
options: ['single', 'range', 'multiple'],
|
|
111
|
+
description: 'Allows you to select a single day, a range of days, or multiple days.',
|
|
112
|
+
table: {
|
|
113
|
+
category: 'Props',
|
|
114
|
+
type: {
|
|
115
|
+
summary: 'single | range | multiple',
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
clearOnClose: {
|
|
120
|
+
control: 'boolean',
|
|
121
|
+
description: 'Clear the selected date(s) when the date picker closes.',
|
|
122
|
+
table: {
|
|
123
|
+
category: 'Props',
|
|
124
|
+
type: {
|
|
125
|
+
summary: 'boolean',
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
disableAfterDate: {
|
|
130
|
+
control: 'date',
|
|
131
|
+
description: 'Disable dates after this date.',
|
|
132
|
+
table: {
|
|
133
|
+
category: 'Props',
|
|
134
|
+
type: {
|
|
135
|
+
summary: 'Date',
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
disableBeforeDate: {
|
|
140
|
+
control: 'date',
|
|
141
|
+
description: 'Disable dates before this date.',
|
|
142
|
+
table: {
|
|
143
|
+
category: 'Props',
|
|
144
|
+
type: {
|
|
145
|
+
summary: 'Date',
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
isDisabled: {
|
|
150
|
+
control: 'boolean',
|
|
151
|
+
description: 'Disable the date picker.',
|
|
152
|
+
table: {
|
|
153
|
+
category: 'Props',
|
|
154
|
+
type: {
|
|
155
|
+
summary: 'boolean',
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
'data-testid': {
|
|
160
|
+
table: {
|
|
161
|
+
disable: true,
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
onSelect: {
|
|
165
|
+
control: false,
|
|
166
|
+
description: 'Event handler when a day is selected.',
|
|
167
|
+
table: {
|
|
168
|
+
category: 'Callbacks',
|
|
169
|
+
type: {
|
|
170
|
+
summary: 'OnSelectHandler<Date> | OnSelectHandler<DateRange>',
|
|
171
|
+
},
|
|
172
|
+
},
|
|
173
|
+
action: 'onSelect',
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
export default meta;
|
|
179
|
+
|
|
180
|
+
type Story = StoryObj<typeof IconTriggerDatePicker>;
|
|
181
|
+
|
|
182
|
+
export const Default: Story = {
|
|
183
|
+
args: {
|
|
184
|
+
id: 'date-picker',
|
|
185
|
+
label: 'Pick a date:',
|
|
186
|
+
ariaLabel: 'Select a date',
|
|
187
|
+
isDisabled: false,
|
|
188
|
+
isOpen: false,
|
|
189
|
+
triggerIcon: 'calendar',
|
|
190
|
+
triggerIconSize: 'lg',
|
|
191
|
+
clearOnClose: true,
|
|
192
|
+
},
|
|
193
|
+
render: (args) => {
|
|
194
|
+
const [{ selected }, updateArgs] = useArgs();
|
|
195
|
+
const handleSelect = (date: Date | DateRange | Date[] | undefined) => {
|
|
196
|
+
updateArgs({ selected: date });
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
return <IconTriggerDatePicker {...args} selected={selected} onSelect={handleSelect} />;
|
|
200
|
+
},
|
|
201
|
+
};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import { DateRange, OnSelectHandler, Mode } from 'react-day-picker';
|
|
3
|
+
import { IconName, IconSizes } from '@/types';
|
|
4
|
+
import { FloatUI, Icon } from '@/components';
|
|
5
|
+
import { DatePicker } from '@/components/forms/date/datePicker/DatePicker';
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
mode?: Mode;
|
|
9
|
+
ariaLabel: string;
|
|
10
|
+
disableBeforeDate?: Date;
|
|
11
|
+
disableAfterDate?: Date;
|
|
12
|
+
isDisabled?: boolean;
|
|
13
|
+
id: string;
|
|
14
|
+
label?: string;
|
|
15
|
+
onSelect?: (selected: Date | DateRange | Date[] | undefined) => void;
|
|
16
|
+
month?: Date;
|
|
17
|
+
selected?: Date | DateRange | Date[] | undefined;
|
|
18
|
+
triggerIcon: IconName;
|
|
19
|
+
triggerIconSize: IconSizes;
|
|
20
|
+
isOpen?: boolean;
|
|
21
|
+
clearOnClose?: boolean;
|
|
22
|
+
className?: string;
|
|
23
|
+
'data-testid'?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const IconTriggerDatePicker = (props: Props) => {
|
|
27
|
+
const {
|
|
28
|
+
ariaLabel,
|
|
29
|
+
className,
|
|
30
|
+
isDisabled,
|
|
31
|
+
disableBeforeDate,
|
|
32
|
+
disableAfterDate,
|
|
33
|
+
month,
|
|
34
|
+
id,
|
|
35
|
+
label,
|
|
36
|
+
onSelect,
|
|
37
|
+
selected,
|
|
38
|
+
triggerIcon,
|
|
39
|
+
triggerIconSize,
|
|
40
|
+
mode,
|
|
41
|
+
isOpen,
|
|
42
|
+
clearOnClose,
|
|
43
|
+
...rest
|
|
44
|
+
} = props;
|
|
45
|
+
|
|
46
|
+
const [localSelected, setLocalSelected] = useState<Date | DateRange | Date[] | undefined>(
|
|
47
|
+
selected || undefined,
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
const handleSelect: OnSelectHandler<Date> = (date) => {
|
|
51
|
+
if (!date) {
|
|
52
|
+
onSelect && onSelect(undefined);
|
|
53
|
+
setLocalSelected(undefined);
|
|
54
|
+
} else {
|
|
55
|
+
onSelect && onSelect(date);
|
|
56
|
+
setLocalSelected(date);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
// clear selection if clear on close is true
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
if (!isOpen && clearOnClose) {
|
|
63
|
+
setLocalSelected(undefined);
|
|
64
|
+
}
|
|
65
|
+
}, [isOpen, clearOnClose]);
|
|
66
|
+
|
|
67
|
+
return (
|
|
68
|
+
<FloatUI isOpen={isOpen} ariaLabel={ariaLabel}>
|
|
69
|
+
<Icon
|
|
70
|
+
aria-label="Open date picker"
|
|
71
|
+
name={triggerIcon}
|
|
72
|
+
size={triggerIconSize}
|
|
73
|
+
className="date__picker__trigger"
|
|
74
|
+
data-testid={`datepicker-trigger-for-${id}`}
|
|
75
|
+
/>
|
|
76
|
+
|
|
77
|
+
<DatePicker
|
|
78
|
+
isDisabled={isDisabled}
|
|
79
|
+
mode={mode}
|
|
80
|
+
month={month}
|
|
81
|
+
selected={localSelected as Date | DateRange | undefined}
|
|
82
|
+
onSelect={handleSelect}
|
|
83
|
+
startMonth={disableBeforeDate}
|
|
84
|
+
endMonth={disableAfterDate}
|
|
85
|
+
{...rest}
|
|
86
|
+
/>
|
|
87
|
+
</FloatUI>
|
|
88
|
+
);
|
|
89
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { IconTriggerDatePicker } from './IconTriggerDatePicker';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Canvas, Meta, Controls } from '@storybook/blocks';
|
|
2
|
+
import * as SingleInputDatePicker from './SingleInputDatePicker.stories';
|
|
3
|
+
import { Row, Col } from '../../../grid/index';
|
|
4
|
+
|
|
5
|
+
<Meta title="Forms/DatePicker/SingleInputDatePicker" name="SingleInputDatePicker" />
|
|
6
|
+
|
|
7
|
+
# Single Input Date Picker
|
|
8
|
+
The Single Input Date Picker is a visual representation of an input field that allows you to enter a date value to the input or select a date from the date picker. It leverages our DatePicker component inside of a FloatingUI window.
|
|
9
|
+
|
|
10
|
+
<Canvas of={SingleInputDatePicker.SingleInput} />
|
|
11
|
+
|
|
12
|
+
## Props
|
|
13
|
+
In addition to the props listed below, it also accepts all props listed [here](story=?path=/docs/forms-datepicker--datepicker)
|
|
14
|
+
<Controls of={SingleInputDatePicker.SingleInput} />
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## ToDo
|
|
18
|
+
- Create single component for all dropdown date pickers that accept an react element as the trigger, such as an icon, button, component, input, etc.
|