UNPKG

7.07 kBTypeScriptView Raw
1import * as React from 'react';
2import {StyletronComponent} from 'styletron-react';
3import {Option} from '../select';
4import {SIZE} from '../input';
5import {Override} from '../overrides';
6import {Locale} from '../locale';
7import {any} from 'prop-types';
8
9export interface STATE_CHANGE_TYPE {
10 change: 'change';
11 moveUp: 'moveUp';
12 moveDown: 'moveDown';
13 moveLeft: 'moveLeft';
14 moveRight: 'moveRight';
15 mouseOver: 'mouseOver';
16 mouseLeave: 'mouseLeave';
17}
18
19export interface ORIENTATION {
20 horizontal: 'horizontal';
21 vertical: 'vertical';
22}
23
24export type onChange = (args: {date: Date | Date[]}) => any;
25export type StateReducer = (
26 stateType: STATE_CHANGE_TYPE[keyof STATE_CHANGE_TYPE],
27 nextState: ContainerState,
28 currentState: ContainerState,
29) => ContainerState;
30
31export interface ContainerState {
32 value?: Date | Date[];
33}
34export interface StatefulContainerProps<T> {
35 children?: (args: T) => React.ReactNode;
36 initialState?: ContainerState;
37 stateReducer?: StateReducer;
38 onChange?: onChange;
39 range?: boolean;
40}
41export class StatefulContainer extends React.Component<
42 StatefulContainerProps<CalendarProps | DatepickerProps>,
43 ContainerState
44> {
45 onChange(data: {date: Date | Date[]}): void;
46 internalSetState(
47 type: STATE_CHANGE_TYPE[keyof STATE_CHANGE_TYPE],
48 changes: ContainerState,
49 ): void;
50}
51
52export interface CalendarProps {
53 autoFocusCalendar?: boolean;
54 excludeDates?: Date[];
55 quickSelect?: boolean;
56 quickSelectOptions?: Array<{id: string; beginDate: Date; endDate?: Date}>;
57 filterDate?: (day: Date) => boolean;
58 highlightedDate?: Date;
59 includeDates?: Date[];
60 range?: boolean;
61 // see https://github.com/date-fns/date-fns/blob/master/src/locale/index.js.flow
62 locale?: any;
63 maxDate?: Date;
64 minDate?: Date;
65 monthsShown?: number;
66 onDayClick?: (args: {date: Date; event: Event}) => any;
67 onDayMouseOver?: (args: {date: Date; event: Event}) => any;
68 onDayMouseLeave?: (args: {date: Date; event: Event}) => any;
69 onMonthChange?: (args: {date: Date}) => any;
70 onYearChange?: (args: {date: Date}) => any;
71 onChange?: onChange;
72 orientation?: ORIENTATION[keyof ORIENTATION];
73 overrides?: DatepickerOverrides<SharedStylePropsT>;
74 peekNextMonth?: boolean;
75 timeSelectStart?: boolean;
76 timeSelectEnd?: boolean;
77 trapTabbing?: boolean;
78 value?: Date | Date[] | null;
79}
80export interface CalendarState {
81 highlightedDate: Date;
82 focused: boolean;
83 date: Date;
84 quickSelectId?: string;
85}
86export class Calendar extends React.Component<CalendarProps, CalendarState> {
87 getSingleDate(value: Date | Date[]): Date | null;
88 getDateInView(): Date;
89 handleMonthChange(date: Date): void;
90 handleYearChange(date: Date): void;
91 changeMonth({date}: {date: Date}): void;
92 changeYear({date}: {date: Date}): void;
93 renderCalendarHeader(date: Date, order: number): React.ReactNode;
94 onKeyDown(event: KeyboardEvent): void;
95 handleArrowKey(key: string): void;
96 focusCalendar(): void;
97 blurCalendar(): void;
98 handleTabbing(event: KeyboardEvent): void;
99 onDayMouseOver(data: {event: Event; date: Date}): void;
100 onDayMouseLeave(data: {event: Event; date: Date}): void;
101 handleDateChange(data: {date: Date | Date[]}): void;
102 handleTimeChange(time: Date, index: number): void;
103 setHighlightedDate(date: Date): void;
104 renderMonths(): React.ReactNode[];
105 renderTimeSelect(
106 value: Date,
107 onChange: (...args: any) => any,
108 ): React.ReactNode;
109 renderQuickSelect(): React.ReactNode;
110}
111
112export const StatefulCalendar: React.FC<StatefulDatepickerProps<CalendarProps>>;
113
114export interface DatepickerOverrides<T> {
115 Root?: Override<T>;
116 QuickSelect?: Override<T>;
117 QuickSelectContainer?: Override<T>;
118 QuickSelectFormControl?: Override<T>;
119 TimeSelect?: Override<T>;
120 TimeSelectContainer?: Override<T>;
121 TimeSelectFormControl?: Override<T>;
122 CalendarContainer?: Override<T>;
123 CalendarHeader?: Override<T>;
124 PrevButton?: Override<T>;
125 PrevButtonIcon?: Override<T>;
126 NextButton?: Override<T>;
127 NextButtonIcon?: Override<T>;
128 MonthContainer?: Override<T>;
129 MonthHeader?: Override<T>;
130 MonthYearSelectButton?: Override<T>;
131 MonthYearSelectIconContainer?: Override<T>;
132 MonthYearSelectPopover?: Override<T>;
133 MonthYearSelectStatefulMenu?: Override<T>;
134 WeekdayHeader?: Override<T>;
135 Month?: Override<T>;
136 Week?: Override<T>;
137 Day?: Override<T>;
138 Input?: Override<T>;
139 InputWrapper?: Override<T>;
140 Popover?: Override<T>;
141}
142export type DatepickerProps = CalendarProps & {
143 'aria-label'?: string;
144 'aria-labelledby'?: string;
145 'aria-describedby'?: string;
146 disabled?: boolean;
147 clearable?: boolean;
148 size?: SIZE[keyof SIZE];
149 error?: boolean;
150 positive?: boolean;
151 placeholder?: string;
152 required?: boolean;
153 displayValueAtRangeIndex?: number;
154 formatDisplayValue?: (date: Date | Date[], formatString: string) => string;
155 formatString?: string;
156 mask?: string | null;
157 mountNode?: HTMLElement;
158 onClose?: () => any;
159};
160export interface DatepickerState {
161 calendarFocused: boolean;
162 isOpen: boolean;
163 isPseudoFocused: boolean;
164 lastActiveElm?: HTMLElement;
165}
166
167declare function formatDate(
168 date: Date | Date[],
169 formatString: string,
170): string | string[];
171
172export {formatDate};
173
174export class Datepicker extends React.Component<
175 DatepickerProps,
176 DatepickerState
177> {
178 onChange(data: {date: Date | Date[]}): void;
179 formatDate(date: Date | Date[], formatString: string): string | string[];
180 formatDisplayValue(date: Date | Date[]): string;
181 open(): void;
182 close(): void;
183 handleEsc(): void;
184 handleInputBlur(): void;
185 handleKeyDown(event: KeyboardEvent): void;
186 focusCalendar(): void;
187}
188export {Datepicker as DatePicker};
189
190export type StatefulDatepickerProps<T> = T &
191 StatefulContainerProps<T> & {children?: (args: T) => React.ReactNode};
192export const StatefulDatepicker: React.FC<
193 StatefulDatepickerProps<DatepickerProps>
194>;
195
196export {StatefulDatepicker as StatefulDatePicker};
197
198export interface TimezonePickerProps {
199 date?: Date;
200 disabled?: boolean;
201 positive?: boolean;
202 error?: boolean;
203 mapLabels?: (args: Option) => React.ReactNode;
204 onChange?: (value: {id: string; label: string; offset: number}) => any;
205 overrides?: {Select?: Override<any>};
206 value?: string;
207}
208export interface TimezonePickerState {
209 timezones: Option[];
210 value?: string;
211}
212export class TimezonePicker extends React.Component<
213 TimezonePickerProps,
214 TimezonePickerState
215> {
216 buildTimezones(compareDate: Date): string[];
217}
218
219export const DISPLAY_FORMAT: 'L';
220export const ISO_FORMAT: 'YYYY-MM-DD';
221export const ISO_MONTH_FORMAT: 'YYYY-MM';
222
223export const STATE_CHANGE_TYPE: STATE_CHANGE_TYPE;
224
225export const ORIENTATION: ORIENTATION;
226
227export const WEEKDAYS: [0, 1, 2, 3, 4, 5, 6];
228
229export type SharedStylePropsT = {
230 $date: Date;
231 $disabled: boolean;
232 $isHeader: boolean;
233 $isHighlighted: boolean;
234 $isHovered: boolean;
235 $outsideMonth: boolean;
236 $pseudoHighlighted: boolean;
237 $pseudoSelected: boolean;
238 $selected: boolean;
239 $startDate: boolean;
240 $range: boolean;
241 $hasRangeHighlighted: boolean;
242 $hasRangeOnRight: boolean;
243 $hasRangeSelected: boolean;
244};