@darajs/ui-components 1.0.0-a.1
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/LICENSE +201 -0
- package/dist/accordion/accordion-item.d.ts +25 -0
- package/dist/accordion/accordion-item.d.ts.map +1 -0
- package/dist/accordion/accordion-item.js +90 -0
- package/dist/accordion/accordion-item.js.map +1 -0
- package/dist/accordion/accordion.d.ts +33 -0
- package/dist/accordion/accordion.d.ts.map +1 -0
- package/dist/accordion/accordion.js +86 -0
- package/dist/accordion/accordion.js.map +1 -0
- package/dist/badge/badge.d.ts +21 -0
- package/dist/badge/badge.d.ts.map +1 -0
- package/dist/badge/badge.js +42 -0
- package/dist/badge/badge.js.map +1 -0
- package/dist/button/button.d.ts +35 -0
- package/dist/button/button.d.ts.map +1 -0
- package/dist/button/button.js +169 -0
- package/dist/button/button.js.map +1 -0
- package/dist/button-bar/button-bar.d.ts +19 -0
- package/dist/button-bar/button-bar.d.ts.map +1 -0
- package/dist/button-bar/button-bar.js +123 -0
- package/dist/button-bar/button-bar.js.map +1 -0
- package/dist/carousel/carousel.d.ts +24 -0
- package/dist/carousel/carousel.d.ts.map +1 -0
- package/dist/carousel/carousel.js +175 -0
- package/dist/carousel/carousel.js.map +1 -0
- package/dist/checkbox/checkbox-group.d.ts +36 -0
- package/dist/checkbox/checkbox-group.d.ts.map +1 -0
- package/dist/checkbox/checkbox-group.js +116 -0
- package/dist/checkbox/checkbox-group.js.map +1 -0
- package/dist/checkbox/checkbox.d.ts +28 -0
- package/dist/checkbox/checkbox.d.ts.map +1 -0
- package/dist/checkbox/checkbox.js +162 -0
- package/dist/checkbox/checkbox.js.map +1 -0
- package/dist/checkbox/tri-state-checkbox.d.ts +23 -0
- package/dist/checkbox/tri-state-checkbox.d.ts.map +1 -0
- package/dist/checkbox/tri-state-checkbox.js +87 -0
- package/dist/checkbox/tri-state-checkbox.js.map +1 -0
- package/dist/combo-box/combo-box.d.ts +328 -0
- package/dist/combo-box/combo-box.d.ts.map +1 -0
- package/dist/combo-box/combo-box.js +213 -0
- package/dist/combo-box/combo-box.js.map +1 -0
- package/dist/component-select-list/component-select-list.d.ts +27 -0
- package/dist/component-select-list/component-select-list.d.ts.map +1 -0
- package/dist/component-select-list/component-select-list.js +129 -0
- package/dist/component-select-list/component-select-list.js.map +1 -0
- package/dist/constants.d.ts +33 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +47 -0
- package/dist/constants.js.map +1 -0
- package/dist/context-menu/context-menu.d.ts +24 -0
- package/dist/context-menu/context-menu.d.ts.map +1 -0
- package/dist/context-menu/context-menu.js +112 -0
- package/dist/context-menu/context-menu.js.map +1 -0
- package/dist/datepicker/datepicker-select.d.ts +50 -0
- package/dist/datepicker/datepicker-select.d.ts.map +1 -0
- package/dist/datepicker/datepicker-select.js +211 -0
- package/dist/datepicker/datepicker-select.js.map +1 -0
- package/dist/datepicker/datepicker.d.ts +57 -0
- package/dist/datepicker/datepicker.d.ts.map +1 -0
- package/dist/datepicker/datepicker.js +608 -0
- package/dist/datepicker/datepicker.js.map +1 -0
- package/dist/dropzone/dropzone.d.ts +20 -0
- package/dist/dropzone/dropzone.d.ts.map +1 -0
- package/dist/dropzone/dropzone.js +77 -0
- package/dist/dropzone/dropzone.js.map +1 -0
- package/dist/error-boundary/error-boundary.d.ts +33 -0
- package/dist/error-boundary/error-boundary.d.ts.map +1 -0
- package/dist/error-boundary/error-boundary.js +72 -0
- package/dist/error-boundary/error-boundary.js.map +1 -0
- package/dist/filter/categorical-filter.d.ts +27 -0
- package/dist/filter/categorical-filter.d.ts.map +1 -0
- package/dist/filter/categorical-filter.js +150 -0
- package/dist/filter/categorical-filter.js.map +1 -0
- package/dist/filter/datetime-filter.d.ts +29 -0
- package/dist/filter/datetime-filter.d.ts.map +1 -0
- package/dist/filter/datetime-filter.js +196 -0
- package/dist/filter/datetime-filter.js.map +1 -0
- package/dist/filter/numeric-filter.d.ts +25 -0
- package/dist/filter/numeric-filter.d.ts.map +1 -0
- package/dist/filter/numeric-filter.js +146 -0
- package/dist/filter/numeric-filter.js.map +1 -0
- package/dist/hierarchy-selector/hierarchy-selector.d.ts +31 -0
- package/dist/hierarchy-selector/hierarchy-selector.d.ts.map +1 -0
- package/dist/hierarchy-selector/hierarchy-selector.js +65 -0
- package/dist/hierarchy-selector/hierarchy-selector.js.map +1 -0
- package/dist/hierarchy-selector/node/branch.d.ts +47 -0
- package/dist/hierarchy-selector/node/branch.d.ts.map +1 -0
- package/dist/hierarchy-selector/node/branch.js +133 -0
- package/dist/hierarchy-selector/node/branch.js.map +1 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/input/input.d.ts +58 -0
- package/dist/input/input.d.ts.map +1 -0
- package/dist/input/input.js +102 -0
- package/dist/input/input.js.map +1 -0
- package/dist/jest-setup.d.ts +18 -0
- package/dist/jest-setup.d.ts.map +1 -0
- package/dist/jest-setup.js +18 -0
- package/dist/jest-setup.js.map +1 -0
- package/dist/modal/modal.d.ts +37 -0
- package/dist/modal/modal.d.ts.map +1 -0
- package/dist/modal/modal.js +120 -0
- package/dist/modal/modal.js.map +1 -0
- package/dist/multiselect/multiselect.d.ts +31 -0
- package/dist/multiselect/multiselect.d.ts.map +1 -0
- package/dist/multiselect/multiselect.js +282 -0
- package/dist/multiselect/multiselect.js.map +1 -0
- package/dist/numeric-input/input-stepper.d.ts +33 -0
- package/dist/numeric-input/input-stepper.d.ts.map +1 -0
- package/dist/numeric-input/input-stepper.js +54 -0
- package/dist/numeric-input/input-stepper.js.map +1 -0
- package/dist/numeric-input/numeric-input.d.ts +48 -0
- package/dist/numeric-input/numeric-input.d.ts.map +1 -0
- package/dist/numeric-input/numeric-input.js +199 -0
- package/dist/numeric-input/numeric-input.js.map +1 -0
- package/dist/progress-bar/progress-bar.d.ts +23 -0
- package/dist/progress-bar/progress-bar.d.ts.map +1 -0
- package/dist/progress-bar/progress-bar.js +88 -0
- package/dist/progress-bar/progress-bar.js.map +1 -0
- package/dist/radio/radio-group.d.ts +20 -0
- package/dist/radio/radio-group.d.ts.map +1 -0
- package/dist/radio/radio-group.js +158 -0
- package/dist/radio/radio-group.js.map +1 -0
- package/dist/search-bar/search-bar.d.ts +34 -0
- package/dist/search-bar/search-bar.d.ts.map +1 -0
- package/dist/search-bar/search-bar.js +39 -0
- package/dist/search-bar/search-bar.js.map +1 -0
- package/dist/sectioned-list/sectioned-list.d.ts +29 -0
- package/dist/sectioned-list/sectioned-list.d.ts.map +1 -0
- package/dist/sectioned-list/sectioned-list.js +208 -0
- package/dist/sectioned-list/sectioned-list.js.map +1 -0
- package/dist/select/select.d.ts +54 -0
- package/dist/select/select.d.ts.map +1 -0
- package/dist/select/select.js +159 -0
- package/dist/select/select.js.map +1 -0
- package/dist/slider/slider-inputs.d.ts +36 -0
- package/dist/slider/slider-inputs.d.ts.map +1 -0
- package/dist/slider/slider-inputs.js +85 -0
- package/dist/slider/slider-inputs.js.map +1 -0
- package/dist/slider/slider.d.ts +53 -0
- package/dist/slider/slider.d.ts.map +1 -0
- package/dist/slider/slider.js +267 -0
- package/dist/slider/slider.js.map +1 -0
- package/dist/spinner/spinner.d.ts +20 -0
- package/dist/spinner/spinner.d.ts.map +1 -0
- package/dist/spinner/spinner.js +132 -0
- package/dist/spinner/spinner.js.map +1 -0
- package/dist/switch/sun-icon.d.ts +3 -0
- package/dist/switch/sun-icon.d.ts.map +1 -0
- package/dist/switch/sun-icon.js +24 -0
- package/dist/switch/sun-icon.js.map +1 -0
- package/dist/switch/switch.d.ts +17 -0
- package/dist/switch/switch.d.ts.map +1 -0
- package/dist/switch/switch.js +92 -0
- package/dist/switch/switch.js.map +1 -0
- package/dist/table/cells/action-cell.d.ts +34 -0
- package/dist/table/cells/action-cell.d.ts.map +1 -0
- package/dist/table/cells/action-cell.js +68 -0
- package/dist/table/cells/action-cell.js.map +1 -0
- package/dist/table/cells/datetime-cell.d.ts +12 -0
- package/dist/table/cells/datetime-cell.d.ts.map +1 -0
- package/dist/table/cells/datetime-cell.js +36 -0
- package/dist/table/cells/datetime-cell.js.map +1 -0
- package/dist/table/cells/edit-cell-utils.d.ts +32 -0
- package/dist/table/cells/edit-cell-utils.d.ts.map +1 -0
- package/dist/table/cells/edit-cell-utils.js +2 -0
- package/dist/table/cells/edit-cell-utils.js.map +1 -0
- package/dist/table/cells/edit-input-cell.d.ts +10 -0
- package/dist/table/cells/edit-input-cell.d.ts.map +1 -0
- package/dist/table/cells/edit-input-cell.js +61 -0
- package/dist/table/cells/edit-input-cell.js.map +1 -0
- package/dist/table/cells/edit-select-cell.d.ts +12 -0
- package/dist/table/cells/edit-select-cell.d.ts.map +1 -0
- package/dist/table/cells/edit-select-cell.js +55 -0
- package/dist/table/cells/edit-select-cell.js.map +1 -0
- package/dist/table/filters.d.ts +46 -0
- package/dist/table/filters.d.ts.map +1 -0
- package/dist/table/filters.js +223 -0
- package/dist/table/filters.js.map +1 -0
- package/dist/table/headers/select-header.d.ts +14 -0
- package/dist/table/headers/select-header.d.ts.map +1 -0
- package/dist/table/headers/select-header.js +41 -0
- package/dist/table/headers/select-header.js.map +1 -0
- package/dist/table/options-menu.d.ts +25 -0
- package/dist/table/options-menu.d.ts.map +1 -0
- package/dist/table/options-menu.js +120 -0
- package/dist/table/options-menu.js.map +1 -0
- package/dist/table/table.d.ts +95 -0
- package/dist/table/table.d.ts.map +1 -0
- package/dist/table/table.js +524 -0
- package/dist/table/table.js.map +1 -0
- package/dist/table/types.d.ts +30 -0
- package/dist/table/types.d.ts.map +1 -0
- package/dist/table/types.js +2 -0
- package/dist/table/types.js.map +1 -0
- package/dist/tabs/tabs.d.ts +22 -0
- package/dist/tabs/tabs.d.ts.map +1 -0
- package/dist/tabs/tabs.js +88 -0
- package/dist/tabs/tabs.js.map +1 -0
- package/dist/textarea/textarea.d.ts +45 -0
- package/dist/textarea/textarea.d.ts.map +1 -0
- package/dist/textarea/textarea.js +77 -0
- package/dist/textarea/textarea.js.map +1 -0
- package/dist/tooltip/tooltip.d.ts +46 -0
- package/dist/tooltip/tooltip.d.ts.map +1 -0
- package/dist/tooltip/tooltip.js +116 -0
- package/dist/tooltip/tooltip.js.map +1 -0
- package/dist/types.d.ts +66 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/chevron.d.ts +34 -0
- package/dist/utils/chevron.d.ts.map +1 -0
- package/dist/utils/chevron.js +40 -0
- package/dist/utils/chevron.js.map +1 -0
- package/dist/utils/index.d.ts +22 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +22 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/label.d.ts +3 -0
- package/dist/utils/label.d.ts.map +1 -0
- package/dist/utils/label.js +24 -0
- package/dist/utils/label.js.map +1 -0
- package/dist/utils/list-styles.d.ts +12 -0
- package/dist/utils/list-styles.d.ts.map +1 -0
- package/dist/utils/list-styles.js +58 -0
- package/dist/utils/list-styles.js.map +1 -0
- package/dist/utils/same-width-modifier.d.ts +23 -0
- package/dist/utils/same-width-modifier.d.ts.map +1 -0
- package/dist/utils/same-width-modifier.js +17 -0
- package/dist/utils/same-width-modifier.js.map +1 -0
- package/dist/utils/use-infinite-loader.d.ts +32 -0
- package/dist/utils/use-infinite-loader.d.ts.map +1 -0
- package/dist/utils/use-infinite-loader.js +114 -0
- package/dist/utils/use-infinite-loader.js.map +1 -0
- package/dist/utils/use-on-click-outside.d.ts +3 -0
- package/dist/utils/use-on-click-outside.d.ts.map +1 -0
- package/dist/utils/use-on-click-outside.js +36 -0
- package/dist/utils/use-on-click-outside.js.map +1 -0
- package/package.json +105 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import 'react-datepicker/dist/react-datepicker.css';
|
|
3
|
+
import { InteractiveComponentProps } from '../types';
|
|
4
|
+
type DatepickerValue = Date | [Date, Date];
|
|
5
|
+
/**
|
|
6
|
+
* Change type of the value used based on `selectsRange` prop
|
|
7
|
+
*
|
|
8
|
+
* @prop selectsRange - whether the datepicker is in range select mode
|
|
9
|
+
* @prop onChange - an optional onChange handler, will be called whenever the state of the datepicker changes
|
|
10
|
+
* @prop value - the value of the datepicker puts it in controlled mode
|
|
11
|
+
* @prop initialValue - the initial value of the datepicker
|
|
12
|
+
*/
|
|
13
|
+
type ConditionalProps = {
|
|
14
|
+
initialValue?: [Date, Date];
|
|
15
|
+
onChange?: (date: [Date, Date], e?: React.SyntheticEvent<SVGSVGElement, Event>) => void | Promise<void>;
|
|
16
|
+
selectsRange: true;
|
|
17
|
+
value?: [Date, Date];
|
|
18
|
+
} | {
|
|
19
|
+
initialValue?: Date;
|
|
20
|
+
onChange?: (date: Date, e?: React.SyntheticEvent<SVGSVGElement, Event>) => void | Promise<void>;
|
|
21
|
+
selectsRange?: false;
|
|
22
|
+
value?: Date;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Omitting props which are explicitly set in the conditional part of props.
|
|
26
|
+
*/
|
|
27
|
+
interface CommonDatePickerProps extends Omit<InteractiveComponentProps<DatepickerValue>, 'initialValue' | 'value'> {
|
|
28
|
+
/** Dateformat string - how the dateformat will be shown - default dd/MM/yyyy */
|
|
29
|
+
dateFormat?: string;
|
|
30
|
+
/** Optional property to disable the date picker */
|
|
31
|
+
disabled?: boolean;
|
|
32
|
+
/** Whether to show the datepicker inline */
|
|
33
|
+
inline?: boolean;
|
|
34
|
+
/** Maximum date available - default is off */
|
|
35
|
+
maxDate?: Date;
|
|
36
|
+
/** Minimum date available - default is off */
|
|
37
|
+
minDate?: Date;
|
|
38
|
+
/** Controls popper positioning strategy */
|
|
39
|
+
popperStrategy?: 'absolute' | 'fixed';
|
|
40
|
+
/** Accepts ref to be passed to select dropdowns */
|
|
41
|
+
portalsRef?: React.MutableRefObject<HTMLElement[]>;
|
|
42
|
+
/** Optional classname to pass down to items of select components used in datepicker */
|
|
43
|
+
selectItemClass?: string;
|
|
44
|
+
/** Controls if the datepicker will be closed when a date is selected */
|
|
45
|
+
shouldCloseOnSelect: boolean;
|
|
46
|
+
/** Controls if the time input should be enabled - default is off */
|
|
47
|
+
showTimeInput?: boolean;
|
|
48
|
+
}
|
|
49
|
+
export type DatePickerProps = CommonDatePickerProps & ConditionalProps;
|
|
50
|
+
/**
|
|
51
|
+
* A simple datepicker component
|
|
52
|
+
*
|
|
53
|
+
* @param {DatePickerProps} props - the component props
|
|
54
|
+
*/
|
|
55
|
+
declare function DatePicker(props: DatePickerProps): JSX.Element;
|
|
56
|
+
export default DatePicker;
|
|
57
|
+
//# sourceMappingURL=datepicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datepicker.d.ts","sourceRoot":"","sources":["../../src/datepicker/datepicker.tsx"],"names":[],"mappings":";AAwBA,OAAO,4CAA4C,CAAC;AAQpD,OAAO,EAAE,yBAAyB,EAAQ,MAAM,UAAU,CAAC;AA8W3D,KAAK,eAAe,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAG3C;;;;;;;GAOG;AACH,KAAK,gBAAgB,GACf;IACI,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxG,YAAY,EAAE,IAAI,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;CACxB,GACD;IACI,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChG,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,KAAK,CAAC,EAAE,IAAI,CAAC;CAChB,CAAC;AAER;;GAEG;AACH,UAAU,qBAAsB,SAAQ,IAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;IAC9G,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,8CAA8C;IAC9C,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,2CAA2C;IAC3C,cAAc,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;IACtC,mDAAmD;IACnD,UAAU,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC;IACnD,uFAAuF;IACvF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oEAAoE;IACpE,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,MAAM,eAAe,GAAG,qBAAqB,GAAG,gBAAgB,CAAC;AAqJvE;;;;GAIG;AACH,iBAAS,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,GAAG,CAAC,OAAO,CAqOvD;AAED,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,608 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright 2023 Impulse Innovations Limited
|
|
4
|
+
*
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
// eslint-disable-next-line import/no-duplicates
|
|
19
|
+
import { format, parse } from 'date-fns';
|
|
20
|
+
// eslint-disable-next-line import/no-duplicates
|
|
21
|
+
import enGB from 'date-fns/locale/en-GB';
|
|
22
|
+
import { range } from 'lodash';
|
|
23
|
+
import { transparentize } from 'polished';
|
|
24
|
+
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
25
|
+
import ReactDatePicker from 'react-datepicker';
|
|
26
|
+
import 'react-datepicker/dist/react-datepicker.css';
|
|
27
|
+
import styled from '@darajs/styled-components';
|
|
28
|
+
import { ChevronLeft, ChevronRight } from '@darajs/ui-icons';
|
|
29
|
+
import Button from '../button/button';
|
|
30
|
+
import Input from '../input/input';
|
|
31
|
+
import Tooltip from '../tooltip/tooltip';
|
|
32
|
+
import DatepickerSelect from './datepicker-select';
|
|
33
|
+
/**
|
|
34
|
+
* Get all names of months as Items
|
|
35
|
+
*/
|
|
36
|
+
function getMonths() {
|
|
37
|
+
const months = [];
|
|
38
|
+
for (let i = 0; i < 12; i++) {
|
|
39
|
+
months.push({ label: enGB.localize.month(i), value: i });
|
|
40
|
+
}
|
|
41
|
+
return months;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get a range of based on set min/max dates
|
|
45
|
+
*
|
|
46
|
+
* @param minDate minimum date
|
|
47
|
+
* @param maxDate maximum date
|
|
48
|
+
*/
|
|
49
|
+
function getYears(minDate, maxDate) {
|
|
50
|
+
var _a, _b;
|
|
51
|
+
const minYear = (_a = minDate === null || minDate === void 0 ? void 0 : minDate.getFullYear()) !== null && _a !== void 0 ? _a : 1900;
|
|
52
|
+
const maxYear = (_b = maxDate === null || maxDate === void 0 ? void 0 : maxDate.getFullYear()) !== null && _b !== void 0 ? _b : 2100;
|
|
53
|
+
return range(minYear, maxYear, 1).map((val) => ({ label: val.toString(), value: val }));
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* This is taken from react-datepicker codebase - putting it on an element will make clicking on it
|
|
57
|
+
* NOT close the datepicker popper. We need it to make our custom Select work inside the datepicker.
|
|
58
|
+
*/
|
|
59
|
+
const IGNORE_CLASSNAME = 'react-datepicker-ignore-onclickoutside';
|
|
60
|
+
const DatepickerWrapper = styled.div `
|
|
61
|
+
display: flex;
|
|
62
|
+
flex-direction: ${(props) => (props.inline ? 'column' : 'row')};
|
|
63
|
+
align-items: ${(props) => (props.inline ? 'baseline' : 'center')};
|
|
64
|
+
color: ${(props) => props.theme.colors.text};
|
|
65
|
+
|
|
66
|
+
.react-datepicker-popper {
|
|
67
|
+
z-index: 5;
|
|
68
|
+
width: 16.45rem;
|
|
69
|
+
height: 18.5rem;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.react-datepicker-wrapper {
|
|
73
|
+
width: auto;
|
|
74
|
+
margin-top: 1rem;
|
|
75
|
+
margin-left: -8.5rem;
|
|
76
|
+
|
|
77
|
+
${(props) => {
|
|
78
|
+
if (props.showsRange && props.showsTime) {
|
|
79
|
+
return `margin-left: -19.045rem;
|
|
80
|
+
margin-top: 3rem;`;
|
|
81
|
+
}
|
|
82
|
+
if (props.showsRange) {
|
|
83
|
+
return `margin-left: -19.045rem;`;
|
|
84
|
+
}
|
|
85
|
+
if (props.showsTime) {
|
|
86
|
+
return `margin-left: -14rem;`;
|
|
87
|
+
}
|
|
88
|
+
}}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.react-datepicker {
|
|
92
|
+
width: 16.45rem;
|
|
93
|
+
height: 18.5rem;
|
|
94
|
+
|
|
95
|
+
font-family: 'Manrope';
|
|
96
|
+
font-size: 0.75rem;
|
|
97
|
+
|
|
98
|
+
background-color: ${(props) => props.theme.colors.grey1};
|
|
99
|
+
border: 1px solid ${(props) => props.theme.colors.grey1};
|
|
100
|
+
box-shadow: ${(props) => props.theme.shadow.light};
|
|
101
|
+
|
|
102
|
+
svg {
|
|
103
|
+
cursor: pointer;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.react-datepicker__triangle {
|
|
107
|
+
visibility: hidden;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.react-datepicker__input-time-container {
|
|
111
|
+
position: absolute;
|
|
112
|
+
top: -51px;
|
|
113
|
+
left: 150px;
|
|
114
|
+
|
|
115
|
+
float: none;
|
|
116
|
+
|
|
117
|
+
margin: 0px;
|
|
118
|
+
|
|
119
|
+
color: ${(props) => props.theme.colors.text};
|
|
120
|
+
|
|
121
|
+
.react-datepicker-time__caption {
|
|
122
|
+
display: none;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.react-datepicker__month-container {
|
|
127
|
+
.react-datepicker__header {
|
|
128
|
+
margin-right: 3px;
|
|
129
|
+
margin-left: 3px;
|
|
130
|
+
padding: 1.25em 0.75em 0em 0.75em;
|
|
131
|
+
|
|
132
|
+
color: ${(props) => props.theme.colors.text};
|
|
133
|
+
|
|
134
|
+
background-color: ${(props) => props.theme.colors.grey1};
|
|
135
|
+
border: none;
|
|
136
|
+
|
|
137
|
+
.react-datepicker__day-names {
|
|
138
|
+
display: flex;
|
|
139
|
+
gap: 0.125rem;
|
|
140
|
+
justify-content: space-around;
|
|
141
|
+
margin-bottom: 0rem;
|
|
142
|
+
|
|
143
|
+
.react-datepicker__day-name {
|
|
144
|
+
width: 2rem;
|
|
145
|
+
height: 2rem;
|
|
146
|
+
margin: 0rem;
|
|
147
|
+
|
|
148
|
+
line-height: 2rem;
|
|
149
|
+
color: ${(props) => props.theme.colors.text};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.react-datepicker__month {
|
|
155
|
+
display: grid;
|
|
156
|
+
gap: 0.125rem;
|
|
157
|
+
/* Switch default margin to padding so it applies background color completely */
|
|
158
|
+
margin: 0;
|
|
159
|
+
padding: 0.125rem 0.75rem 0rem 0.75rem;
|
|
160
|
+
|
|
161
|
+
color: ${(props) => props.theme.colors.text};
|
|
162
|
+
|
|
163
|
+
background-color: ${(props) => props.theme.colors.grey1};
|
|
164
|
+
|
|
165
|
+
.react-datepicker__week {
|
|
166
|
+
display: flex;
|
|
167
|
+
gap: 0.125rem;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.react-datepicker__day {
|
|
171
|
+
width: 2rem;
|
|
172
|
+
height: 2rem;
|
|
173
|
+
margin: 0rem;
|
|
174
|
+
|
|
175
|
+
line-height: 2rem;
|
|
176
|
+
color: ${(props) => props.theme.colors.text};
|
|
177
|
+
|
|
178
|
+
:hover {
|
|
179
|
+
background-color: ${(props) => props.theme.colors.grey2};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
&.react-datepicker__day--outside-month {
|
|
183
|
+
color: ${(props) => props.theme.colors.grey4};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
&.react-datepicker__day--selected {
|
|
187
|
+
color: ${(props) => props.theme.colors.blue1};
|
|
188
|
+
background-color: ${(props) => props.theme.colors.primary};
|
|
189
|
+
|
|
190
|
+
:hover {
|
|
191
|
+
background-color: ${(props) => props.theme.colors.primaryHover};
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
&.react-datepicker__day--keyboard-selected {
|
|
196
|
+
color: ${(props) => props.theme.colors.text};
|
|
197
|
+
background-color: ${(props) => transparentize(0.8, props.theme.colors.primary)};
|
|
198
|
+
border: 1px solid ${(props) => props.theme.colors.primary}
|
|
199
|
+
|
|
200
|
+
:hover {
|
|
201
|
+
background-color: ${(props) => transparentize(0.6, props.theme.colors.primary)};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
&.react-datepicker__day--in-range {
|
|
206
|
+
color: ${(props) => props.theme.colors.blue1};
|
|
207
|
+
background-color: ${(props) => props.theme.colors.primary};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
&.react-datepicker__day--in-selecting-range {
|
|
211
|
+
color: ${(props) => props.theme.colors.blue1};
|
|
212
|
+
background-color: ${(props) => transparentize(0.2, props.theme.colors.primary)};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
&.react-datepicker__day--disabled {
|
|
216
|
+
color: ${(props) => props.theme.colors.grey3};
|
|
217
|
+
:hover {
|
|
218
|
+
background-color: ${(props) => props.theme.colors.grey1};
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
`;
|
|
226
|
+
const DatepickerInputs = styled.div `
|
|
227
|
+
display: flex;
|
|
228
|
+
gap: 0.5rem;
|
|
229
|
+
`;
|
|
230
|
+
const HeaderWrapper = styled.div `
|
|
231
|
+
display: flex;
|
|
232
|
+
flex-direction: column;
|
|
233
|
+
align-items: center;
|
|
234
|
+
padding-bottom: 0.75rem;
|
|
235
|
+
`;
|
|
236
|
+
const MonthNavigation = styled.div `
|
|
237
|
+
display: flex;
|
|
238
|
+
align-items: center;
|
|
239
|
+
justify-content: space-between;
|
|
240
|
+
`;
|
|
241
|
+
const DropdownsWrapper = styled.div `
|
|
242
|
+
display: flex;
|
|
243
|
+
align-items: center;
|
|
244
|
+
justify-content: center;
|
|
245
|
+
`;
|
|
246
|
+
const MonthButton = styled(Button) `
|
|
247
|
+
min-width: 0rem;
|
|
248
|
+
height: 1.5rem;
|
|
249
|
+
margin: 0px;
|
|
250
|
+
padding: 0.75rem 0.37rem;
|
|
251
|
+
|
|
252
|
+
svg {
|
|
253
|
+
width: 0.75rem;
|
|
254
|
+
height: 0.75rem;
|
|
255
|
+
color: ${(props) => props.theme.colors.grey5};
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
:hover:not(:disabled) {
|
|
259
|
+
svg {
|
|
260
|
+
color: ${(props) => props.theme.colors.text};
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
`;
|
|
264
|
+
const MonthSelect = styled(DatepickerSelect) `
|
|
265
|
+
width: 6.25rem;
|
|
266
|
+
margin-right: 0.55em;
|
|
267
|
+
font-size: 0.875rem;
|
|
268
|
+
`;
|
|
269
|
+
const YearSelect = styled(DatepickerSelect) `
|
|
270
|
+
width: 3.75rem;
|
|
271
|
+
margin-right: 0.8em;
|
|
272
|
+
`;
|
|
273
|
+
const EndDateInputWrapper = styled.div `
|
|
274
|
+
display: flex;
|
|
275
|
+
gap: 0.5rem;
|
|
276
|
+
align-items: center;
|
|
277
|
+
`;
|
|
278
|
+
const DateTimeWrapper = styled.div `
|
|
279
|
+
display: flex;
|
|
280
|
+
flex-direction: ${(props) => (props.isRange ? 'column' : 'row')};
|
|
281
|
+
gap: ${(props) => (props.isRange ? 'none' : '0.5rem')};
|
|
282
|
+
`;
|
|
283
|
+
const DateInput = styled.input `
|
|
284
|
+
display: flex;
|
|
285
|
+
align-items: center;
|
|
286
|
+
|
|
287
|
+
width: 8.5rem;
|
|
288
|
+
height: 2.5rem;
|
|
289
|
+
padding: 0 1rem;
|
|
290
|
+
|
|
291
|
+
font-size: 1rem;
|
|
292
|
+
color: ${(props) => (props.disabled ? props.theme.colors.grey2 : props.theme.colors.text)};
|
|
293
|
+
text-align: center;
|
|
294
|
+
|
|
295
|
+
background-color: ${(props) => props.theme.colors.grey1};
|
|
296
|
+
border: 1px solid ${(props) => props.theme.colors.grey1};
|
|
297
|
+
border-radius: 0.25rem;
|
|
298
|
+
border-radius: ${(props) => (props.isTimeRange ? '0.25rem 0.25rem 0rem 0rem' : '0.25rem')};
|
|
299
|
+
outline: 0;
|
|
300
|
+
|
|
301
|
+
:focus:not(:disabled) {
|
|
302
|
+
border: 1px solid ${(props) => props.theme.colors.grey3};
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
:hover:not(:disabled) {
|
|
306
|
+
background-color: ${(props) => props.theme.colors.grey2};
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
:disabled {
|
|
310
|
+
cursor: not-allowed;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
::placeholder {
|
|
314
|
+
font-style: italic;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
::-webkit-calendar-picker-indicator {
|
|
318
|
+
display: none;
|
|
319
|
+
background: none;
|
|
320
|
+
}
|
|
321
|
+
`;
|
|
322
|
+
const TimeInput = styled(Input) `
|
|
323
|
+
width: ${(props) => (props.isRange ? '8.5rem' : '5rem')};
|
|
324
|
+
input {
|
|
325
|
+
position: relative;
|
|
326
|
+
|
|
327
|
+
display: flex;
|
|
328
|
+
justify-content: center;
|
|
329
|
+
|
|
330
|
+
padding: 0.5rem;
|
|
331
|
+
|
|
332
|
+
font-size: 1rem;
|
|
333
|
+
color: ${(props) => props.theme.colors.text};
|
|
334
|
+
text-align: center;
|
|
335
|
+
|
|
336
|
+
border-radius: ${(props) => (props.isRange ? '0rem 0rem 0.25rem 0.25rem' : '0.25rem')};
|
|
337
|
+
:focus:not(:disabled) {
|
|
338
|
+
border: 1px solid ${(props) => props.theme.colors.grey3};
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
::-webkit-calendar-picker-indicator {
|
|
342
|
+
display: none;
|
|
343
|
+
background: none;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
:after {
|
|
347
|
+
content: '';
|
|
348
|
+
|
|
349
|
+
position: absolute;
|
|
350
|
+
top: 0px;
|
|
351
|
+
left: 1.2rem;
|
|
352
|
+
|
|
353
|
+
display: block;
|
|
354
|
+
|
|
355
|
+
width: 6rem;
|
|
356
|
+
|
|
357
|
+
border-top: ${(props) => (props.isRange ? `1px solid ${props.theme.colors.grey2}` : 'none')};
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
`;
|
|
361
|
+
/**
|
|
362
|
+
* Custom DatePickerHeader component
|
|
363
|
+
*/
|
|
364
|
+
function DatePickerHeader({ date, changeMonth, changeYear, decreaseMonth, increaseMonth, selectItemClass, portalsRef, minDate, maxDate, }) {
|
|
365
|
+
const months = useMemo(() => getMonths(), []);
|
|
366
|
+
const years = useMemo(() => getYears(minDate, maxDate), [minDate, maxDate]);
|
|
367
|
+
const selectedMonth = useMemo(() => {
|
|
368
|
+
return { label: enGB.localize.month(date.getMonth()), value: date.getMonth() };
|
|
369
|
+
}, [date]);
|
|
370
|
+
const selectedYear = useMemo(() => ({ label: date.getFullYear().toString(), value: date.getFullYear() }), [date]);
|
|
371
|
+
return (_jsx(HeaderWrapper, { children: _jsxs(DropdownsWrapper, { children: [_jsx(MonthSelect, { displacement: -1.1, dropdownRef: (element) => {
|
|
372
|
+
if (portalsRef) {
|
|
373
|
+
portalsRef.current[0] = element;
|
|
374
|
+
}
|
|
375
|
+
}, itemClass: `${IGNORE_CLASSNAME} ${selectItemClass}`, items: months, onSelect: (item) => changeMonth(item.value), selectedItem: selectedMonth, size: 0.875 }), _jsx(YearSelect, { displacement: -7.8, dropdownRef: (element) => {
|
|
376
|
+
if (portalsRef) {
|
|
377
|
+
portalsRef.current[1] = element;
|
|
378
|
+
}
|
|
379
|
+
}, itemClass: `${IGNORE_CLASSNAME} ${selectItemClass}`, items: years, onSelect: (item) => changeYear(item.value), selectedItem: selectedYear, size: 0.875 }), _jsxs(MonthNavigation, { children: [_jsx(MonthButton, { onClick: decreaseMonth, styling: "ghost", children: _jsx(ChevronLeft, {}) }), _jsx(MonthButton, { onClick: increaseMonth, styling: "ghost", children: _jsx(ChevronRight, {}) })] })] }) }));
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Turns time number given into a string that is two digits long
|
|
383
|
+
*
|
|
384
|
+
* @param time - the number of hours or minutes to format
|
|
385
|
+
*/
|
|
386
|
+
function getTimeFormatted(time) {
|
|
387
|
+
const timeString = String(time);
|
|
388
|
+
if (timeString.length > 1) {
|
|
389
|
+
return timeString;
|
|
390
|
+
}
|
|
391
|
+
return `0${timeString}`;
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Given an initial Date object gets the initial time set
|
|
395
|
+
*
|
|
396
|
+
* @param initialDate - a Date object
|
|
397
|
+
* @param isRange - whether the datepicker is in range select mode
|
|
398
|
+
*
|
|
399
|
+
* @returns the time set
|
|
400
|
+
*/
|
|
401
|
+
function getInitialTime(initialDate, isRange) {
|
|
402
|
+
if (!initialDate) {
|
|
403
|
+
if (isRange) {
|
|
404
|
+
return ['00:00', '00:00'];
|
|
405
|
+
}
|
|
406
|
+
return '00:00';
|
|
407
|
+
}
|
|
408
|
+
if (Array.isArray(initialDate)) {
|
|
409
|
+
return [
|
|
410
|
+
`${getTimeFormatted(initialDate[0].getHours())}:${getTimeFormatted(initialDate[0].getMinutes())}`,
|
|
411
|
+
`${getTimeFormatted(initialDate[1].getHours())}:${getTimeFormatted(initialDate[1].getMinutes())}`,
|
|
412
|
+
];
|
|
413
|
+
}
|
|
414
|
+
return `${getTimeFormatted(initialDate.getHours())}:${getTimeFormatted(initialDate.getMinutes())}`;
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Gets the initial date string
|
|
418
|
+
*
|
|
419
|
+
* @param initialDate - intial date values
|
|
420
|
+
* @param formatToApply - the date format that the string should obey
|
|
421
|
+
* @param isStart - for the case of range dates whether to get the first date or the second from the initialDate object
|
|
422
|
+
*/
|
|
423
|
+
function getInitialDate(initialDate, formatToApply, isStart) {
|
|
424
|
+
let formattedDate = '';
|
|
425
|
+
if (initialDate) {
|
|
426
|
+
if (Array.isArray(initialDate)) {
|
|
427
|
+
formattedDate = format(initialDate[isStart ? 0 : 1], formatToApply);
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
formattedDate = format(initialDate, formatToApply);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
return formattedDate;
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Combines a given date and time into a Date or [Date, Date] object
|
|
437
|
+
*
|
|
438
|
+
* @param date - the date(s) to have time added to
|
|
439
|
+
* @param time - the time(s) to add to the date(s)
|
|
440
|
+
*/
|
|
441
|
+
function getNewDatetime(date, time) {
|
|
442
|
+
var _a, _b, _c, _d, _e;
|
|
443
|
+
if (!Array.isArray(date) && !Array.isArray(time)) {
|
|
444
|
+
const [hours, minutes] = (_a = time === null || time === void 0 ? void 0 : time.split(':')) !== null && _a !== void 0 ? _a : ['00', '00'];
|
|
445
|
+
const newDate = date ? new Date(date.setHours(Number(hours), Number(minutes))) : null;
|
|
446
|
+
return newDate;
|
|
447
|
+
}
|
|
448
|
+
const [startHours, startMinutes] = (_c = (_b = time[0]) === null || _b === void 0 ? void 0 : _b.split(':')) !== null && _c !== void 0 ? _c : ['00', '00'];
|
|
449
|
+
const [endHours, endMinutes] = (_e = (_d = time[1]) === null || _d === void 0 ? void 0 : _d.split(':')) !== null && _e !== void 0 ? _e : ['00', '00'];
|
|
450
|
+
const dates = date;
|
|
451
|
+
const startDate = dates[0] ? new Date(dates[0].setHours(Number(startHours), Number(startMinutes))) : null;
|
|
452
|
+
const endDate = dates[1] ? new Date(dates[1].setHours(Number(endHours), Number(endMinutes))) : null;
|
|
453
|
+
return [startDate, endDate];
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* A simple datepicker component
|
|
457
|
+
*
|
|
458
|
+
* @param {DatePickerProps} props - the component props
|
|
459
|
+
*/
|
|
460
|
+
function DatePicker(props) {
|
|
461
|
+
var _a, _b, _c;
|
|
462
|
+
const value = (_a = props.value) !== null && _a !== void 0 ? _a : props.initialValue;
|
|
463
|
+
const [selectedDate, setSelectedDate] = useState(value || (props.selectsRange ? [null, null] : null));
|
|
464
|
+
const [selectedTime, setSelectedTime] = useState(() => getInitialTime(value, props.selectsRange));
|
|
465
|
+
const formatToApply = (_b = props.dateFormat) !== null && _b !== void 0 ? _b : 'dd/MM/yyyy';
|
|
466
|
+
const [startDate, setStartDate] = useState(() => getInitialDate(value, formatToApply, true));
|
|
467
|
+
const [endDate, setEndDate] = useState(() => getInitialDate(value, formatToApply, false));
|
|
468
|
+
const datepickerRef = useRef(null);
|
|
469
|
+
const extraProps = useMemo(() => {
|
|
470
|
+
if (props.selectsRange) {
|
|
471
|
+
const selectedDates = (selectedDate !== null && selectedDate !== void 0 ? selectedDate : [null, null]);
|
|
472
|
+
return {
|
|
473
|
+
endDate: selectedDates[1],
|
|
474
|
+
selectsRange: true,
|
|
475
|
+
startDate: selectedDates[0],
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
let date = selectedDate;
|
|
479
|
+
// if datepicker can change between single datepicker and range then we need to adjust the date
|
|
480
|
+
if (Array.isArray(selectedDate)) {
|
|
481
|
+
[date] = selectedDate;
|
|
482
|
+
}
|
|
483
|
+
return {
|
|
484
|
+
selected: date,
|
|
485
|
+
};
|
|
486
|
+
}, [props.selectsRange, selectedDate]);
|
|
487
|
+
const onChangeDate = (date) => {
|
|
488
|
+
setSelectedDate(date);
|
|
489
|
+
if (Array.isArray(date)) {
|
|
490
|
+
setStartDate(date[0] ? format(date[0], formatToApply) : '');
|
|
491
|
+
setEndDate(date[1] ? format(date[1], formatToApply) : '');
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
setStartDate(format(date, formatToApply));
|
|
495
|
+
};
|
|
496
|
+
const onChangeDateInput = (isStartDate, e) => {
|
|
497
|
+
var _a;
|
|
498
|
+
const target = e.target;
|
|
499
|
+
const newDate = parse(target.value, formatToApply, new Date());
|
|
500
|
+
// if newDate is valid and within valid range then update the selected date
|
|
501
|
+
if (newDate instanceof Date &&
|
|
502
|
+
!Number.isNaN(newDate.valueOf()) &&
|
|
503
|
+
!(newDate < props.minDate) &&
|
|
504
|
+
!(newDate > props.maxDate)) {
|
|
505
|
+
// allows so that changes to the input update the datepicker
|
|
506
|
+
(_a = datepickerRef.current) === null || _a === void 0 ? void 0 : _a.setState({
|
|
507
|
+
preSelection: newDate,
|
|
508
|
+
});
|
|
509
|
+
// if it is a range datepicker
|
|
510
|
+
if (Array.isArray(selectedDate)) {
|
|
511
|
+
if (isStartDate) {
|
|
512
|
+
let end = selectedDate[1];
|
|
513
|
+
// is start date is after end date, then adjust end date
|
|
514
|
+
if (newDate > end) {
|
|
515
|
+
end = newDate;
|
|
516
|
+
setEndDate(target.value);
|
|
517
|
+
}
|
|
518
|
+
setSelectedDate([newDate, end]);
|
|
519
|
+
setStartDate(target.value);
|
|
520
|
+
return;
|
|
521
|
+
}
|
|
522
|
+
let start = selectedDate[0];
|
|
523
|
+
// if end date is before start date, then adjust start date
|
|
524
|
+
if (newDate < start) {
|
|
525
|
+
start = newDate;
|
|
526
|
+
setStartDate(target.value);
|
|
527
|
+
}
|
|
528
|
+
setSelectedDate([start, newDate]);
|
|
529
|
+
setEndDate(target.value);
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
setSelectedDate(newDate);
|
|
533
|
+
}
|
|
534
|
+
// if input date is not valid, user might still be inputting -> update input
|
|
535
|
+
if (!isStartDate) {
|
|
536
|
+
setEndDate(target.value);
|
|
537
|
+
return;
|
|
538
|
+
}
|
|
539
|
+
setStartDate(target.value);
|
|
540
|
+
};
|
|
541
|
+
const onChangeTime = (time, isStartTime) => {
|
|
542
|
+
// only change if there is a time set, in the event of erasing does not update
|
|
543
|
+
if (time) {
|
|
544
|
+
if (Array.isArray(selectedTime)) {
|
|
545
|
+
if (isStartTime) {
|
|
546
|
+
setSelectedTime([time, selectedTime[1]]);
|
|
547
|
+
return;
|
|
548
|
+
}
|
|
549
|
+
setSelectedTime([selectedTime[0], time]);
|
|
550
|
+
return;
|
|
551
|
+
}
|
|
552
|
+
setSelectedTime(time);
|
|
553
|
+
}
|
|
554
|
+
};
|
|
555
|
+
// this component is complex and so to make it work with controlled mode we are doing so in the useEffect for simplicity,
|
|
556
|
+
// even if it is not the strictest way as it still keep track of its own state.
|
|
557
|
+
useEffect(() => {
|
|
558
|
+
var _a;
|
|
559
|
+
const newValue = (_a = props.value) !== null && _a !== void 0 ? _a : props.initialValue;
|
|
560
|
+
setSelectedDate(newValue || (props.selectsRange ? [null, null] : null));
|
|
561
|
+
setSelectedTime(getInitialTime(newValue, props.selectsRange));
|
|
562
|
+
setStartDate(getInitialDate(newValue, formatToApply, true));
|
|
563
|
+
setEndDate(getInitialDate(newValue, formatToApply, false));
|
|
564
|
+
}, [props.value]);
|
|
565
|
+
useEffect(() => {
|
|
566
|
+
var _a;
|
|
567
|
+
let time = selectedTime;
|
|
568
|
+
// if datepicker can change between single datepicker and range then we need to adjust the time
|
|
569
|
+
if (props.selectsRange && !Array.isArray(selectedTime)) {
|
|
570
|
+
time = [selectedTime, '00:00'];
|
|
571
|
+
setSelectedTime([selectedTime, '00:00']);
|
|
572
|
+
}
|
|
573
|
+
// We have to typecast to make compiler happy as we don't know which type it is at this point
|
|
574
|
+
const newDateTime = getNewDatetime(selectedDate, time);
|
|
575
|
+
(_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, newDateTime);
|
|
576
|
+
}, [selectedDate, selectedTime]);
|
|
577
|
+
return (_jsx(_Fragment, { children: _jsx(Tooltip, { content: props.errorMsg, disabled: !props.errorMsg, styling: "error", children: _jsxs(DatepickerWrapper, { inline: props.inline, showsRange: props.selectsRange, showsTime: props.showTimeInput, children: [_jsxs(DatepickerInputs, { children: [_jsxs(DateTimeWrapper, { isRange: props.selectsRange, children: [_jsx(DateInput, { isTimeRange: props.selectsRange && props.showTimeInput, onChange: (e) => {
|
|
578
|
+
onChangeDateInput(true, e);
|
|
579
|
+
}, onClick: () => {
|
|
580
|
+
var _a;
|
|
581
|
+
(_a = datepickerRef.current) === null || _a === void 0 ? void 0 : _a.setOpen(true);
|
|
582
|
+
}, onFocus: () => {
|
|
583
|
+
var _a;
|
|
584
|
+
(_a = datepickerRef.current) === null || _a === void 0 ? void 0 : _a.setOpen(true);
|
|
585
|
+
}, onKeyDown: (e) => {
|
|
586
|
+
var _a;
|
|
587
|
+
(_a = datepickerRef.current) === null || _a === void 0 ? void 0 : _a.onInputKeyDown(e);
|
|
588
|
+
}, placeholder: formatToApply, value: startDate }), props.showTimeInput && (_jsx(TimeInput, { isRange: props.selectsRange, onChange: (e) => {
|
|
589
|
+
onChangeTime(e, true);
|
|
590
|
+
}, type: "time", value: Array.isArray(selectedTime) ? selectedTime[0] : selectedTime }))] }), props.selectsRange && (_jsxs(EndDateInputWrapper, { children: ["\u2192", _jsxs(DateTimeWrapper, { isRange: true, children: [_jsx(DateInput, { isTimeRange: props.showTimeInput, onChange: (e) => {
|
|
591
|
+
onChangeDateInput(false, e);
|
|
592
|
+
}, onClick: () => {
|
|
593
|
+
var _a;
|
|
594
|
+
(_a = datepickerRef.current) === null || _a === void 0 ? void 0 : _a.setOpen(true);
|
|
595
|
+
}, onFocus: () => {
|
|
596
|
+
var _a;
|
|
597
|
+
(_a = datepickerRef.current) === null || _a === void 0 ? void 0 : _a.setOpen(true);
|
|
598
|
+
}, onKeyDown: (e) => {
|
|
599
|
+
var _a;
|
|
600
|
+
(_a = datepickerRef.current) === null || _a === void 0 ? void 0 : _a.onInputKeyDown(e);
|
|
601
|
+
}, placeholder: formatToApply, value: endDate }), props.showTimeInput && (_jsx(TimeInput, { isRange: true, onChange: (e) => {
|
|
602
|
+
onChangeTime(e, false);
|
|
603
|
+
}, type: "time", value: selectedTime[1] }))] })] }))] }), _jsx(ReactDatePicker, Object.assign({ className: props.className,
|
|
604
|
+
// if needs to have a customInput otherwise displays its own
|
|
605
|
+
customInput: _jsx("div", {}), disabled: props.disabled, inline: props.inline, maxDate: props.maxDate, minDate: props.minDate, onChange: onChangeDate, ref: datepickerRef, shouldCloseOnSelect: props.shouldCloseOnSelect }, extraProps, { popperProps: { strategy: (_c = props.popperStrategy) !== null && _c !== void 0 ? _c : 'absolute' }, renderCustomHeader: (headerProps) => (_jsx(DatePickerHeader, Object.assign({}, headerProps, { maxDate: props.maxDate, minDate: props.minDate, portalsRef: props.portalsRef, selectItemClass: props.selectItemClass }))) }))] }) }) }));
|
|
606
|
+
}
|
|
607
|
+
export default DatePicker;
|
|
608
|
+
//# sourceMappingURL=datepicker.js.map
|