@darajs/ui-components 0.4.8
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 +24 -0
- package/dist/accordion/accordion-item.d.ts.map +1 -0
- package/dist/accordion/accordion-item.js +92 -0
- package/dist/accordion/accordion-item.js.map +1 -0
- package/dist/accordion/accordion.d.ts +32 -0
- package/dist/accordion/accordion.d.ts.map +1 -0
- package/dist/accordion/accordion.js +87 -0
- package/dist/accordion/accordion.js.map +1 -0
- package/dist/badge/badge.d.ts +20 -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 +124 -0
- package/dist/button-bar/button-bar.js.map +1 -0
- package/dist/carousel/carousel.d.ts +23 -0
- package/dist/carousel/carousel.d.ts.map +1 -0
- package/dist/carousel/carousel.js +178 -0
- package/dist/carousel/carousel.js.map +1 -0
- package/dist/chat/chat.d.ts +28 -0
- package/dist/chat/chat.d.ts.map +1 -0
- package/dist/chat/chat.js +182 -0
- package/dist/chat/chat.js.map +1 -0
- package/dist/chat/message.d.ts +28 -0
- package/dist/chat/message.d.ts.map +1 -0
- package/dist/chat/message.js +220 -0
- package/dist/chat/message.js.map +1 -0
- package/dist/checkbox/checkbox-group.d.ts +35 -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 +27 -0
- package/dist/checkbox/checkbox.d.ts.map +1 -0
- package/dist/checkbox/checkbox.js +164 -0
- package/dist/checkbox/checkbox.js.map +1 -0
- package/dist/checkbox/tri-state-checkbox.d.ts +22 -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/code-viewer/code-viewer.d.ts +31 -0
- package/dist/code-viewer/code-viewer.d.ts.map +1 -0
- package/dist/code-viewer/code-viewer.js +115 -0
- package/dist/code-viewer/code-viewer.js.map +1 -0
- package/dist/combo-box/combo-box.d.ts +39 -0
- package/dist/combo-box/combo-box.d.ts.map +1 -0
- package/dist/combo-box/combo-box.js +176 -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 +131 -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 +116 -0
- package/dist/context-menu/context-menu.js.map +1 -0
- package/dist/datepicker/datepicker-select.d.ts +48 -0
- package/dist/datepicker/datepicker-select.d.ts.map +1 -0
- package/dist/datepicker/datepicker-select.js +219 -0
- package/dist/datepicker/datepicker-select.js.map +1 -0
- package/dist/datepicker/datepicker.d.ts +56 -0
- package/dist/datepicker/datepicker.d.ts.map +1 -0
- package/dist/datepicker/datepicker.js +669 -0
- package/dist/datepicker/datepicker.js.map +1 -0
- package/dist/dropzone/dropzone.d.ts +21 -0
- package/dist/dropzone/dropzone.d.ts.map +1 -0
- package/dist/dropzone/dropzone.js +80 -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 +26 -0
- package/dist/filter/categorical-filter.d.ts.map +1 -0
- package/dist/filter/categorical-filter.js +153 -0
- package/dist/filter/categorical-filter.js.map +1 -0
- package/dist/filter/datetime-filter.d.ts +28 -0
- package/dist/filter/datetime-filter.d.ts.map +1 -0
- package/dist/filter/datetime-filter.js +174 -0
- package/dist/filter/datetime-filter.js.map +1 -0
- package/dist/filter/numeric-filter.d.ts +24 -0
- package/dist/filter/numeric-filter.d.ts.map +1 -0
- package/dist/filter/numeric-filter.js +148 -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 +132 -0
- package/dist/hierarchy-selector/node/branch.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/input/input.d.ts +44 -0
- package/dist/input/input.d.ts.map +1 -0
- package/dist/input/input.js +91 -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/markdown/markdown.d.ts +18 -0
- package/dist/markdown/markdown.d.ts.map +1 -0
- package/dist/markdown/markdown.js +356 -0
- package/dist/markdown/markdown.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 +121 -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 +231 -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 +42 -0
- package/dist/numeric-input/numeric-input.d.ts.map +1 -0
- package/dist/numeric-input/numeric-input.js +234 -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 +90 -0
- package/dist/progress-bar/progress-bar.js.map +1 -0
- package/dist/radio/radio-group.d.ts +19 -0
- package/dist/radio/radio-group.d.ts.map +1 -0
- package/dist/radio/radio-group.js +160 -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 +205 -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 +143 -0
- package/dist/select/select.js.map +1 -0
- package/dist/shared/chevron-button.d.ts +13 -0
- package/dist/shared/chevron-button.d.ts.map +1 -0
- package/dist/shared/chevron-button.js +35 -0
- package/dist/shared/chevron-button.js.map +1 -0
- package/dist/shared/dropdown-list.d.ts +34 -0
- package/dist/shared/dropdown-list.d.ts.map +1 -0
- package/dist/shared/dropdown-list.js +33 -0
- package/dist/shared/dropdown-list.js.map +1 -0
- package/dist/shared/list-item.d.ts +35 -0
- package/dist/shared/list-item.d.ts.map +1 -0
- package/dist/shared/list-item.js +69 -0
- package/dist/shared/list-item.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 +88 -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 +273 -0
- package/dist/slider/slider.js.map +1 -0
- package/dist/spinner/spinner.d.ts +19 -0
- package/dist/spinner/spinner.d.ts.map +1 -0
- package/dist/spinner/spinner.js +144 -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 +16 -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 +226 -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 +123 -0
- package/dist/table/options-menu.js.map +1 -0
- package/dist/table/render-row.d.ts +25 -0
- package/dist/table/render-row.d.ts.map +1 -0
- package/dist/table/render-row.js +163 -0
- package/dist/table/render-row.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 +422 -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 +91 -0
- package/dist/tabs/tabs.js.map +1 -0
- package/dist/textarea/textarea.d.ts +47 -0
- package/dist/textarea/textarea.d.ts.map +1 -0
- package/dist/textarea/textarea.js +121 -0
- package/dist/textarea/textarea.js.map +1 -0
- package/dist/tooltip/tooltip.d.ts +48 -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 +94 -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 +38 -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 +8 -0
- package/dist/utils/list-styles.d.ts.map +1 -0
- package/dist/utils/list-styles.js +43 -0
- package/dist/utils/list-styles.js.map +1 -0
- package/dist/utils/match-width-to-reference.d.ts +24 -0
- package/dist/utils/match-width-to-reference.d.ts.map +1 -0
- package/dist/utils/match-width-to-reference.js +30 -0
- package/dist/utils/match-width-to-reference.js.map +1 -0
- package/dist/utils/syncKbdHighlightIdx.d.ts +23 -0
- package/dist/utils/syncKbdHighlightIdx.d.ts.map +1 -0
- package/dist/utils/syncKbdHighlightIdx.js +41 -0
- package/dist/utils/syncKbdHighlightIdx.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 +119 -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 +106 -0
|
@@ -0,0 +1,669 @@
|
|
|
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, 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
|
+
/* stylelint-disable selector-class-pattern */
|
|
62
|
+
display: flex;
|
|
63
|
+
flex-direction: ${(props) => (props.inline ? 'column' : 'row')};
|
|
64
|
+
align-items: ${(props) => (props.inline ? 'baseline' : 'center')};
|
|
65
|
+
|
|
66
|
+
width: 8.5rem;
|
|
67
|
+
|
|
68
|
+
color: ${(props) => props.theme.colors.text};
|
|
69
|
+
|
|
70
|
+
.react-datepicker-popper {
|
|
71
|
+
z-index: 5;
|
|
72
|
+
width: 16.45rem;
|
|
73
|
+
height: 18.5rem;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.react-datepicker-wrapper {
|
|
77
|
+
width: auto;
|
|
78
|
+
margin-top: 1rem;
|
|
79
|
+
margin-left: -8.5rem;
|
|
80
|
+
|
|
81
|
+
${(props) => {
|
|
82
|
+
if (props.showsRange && props.showsTime) {
|
|
83
|
+
return `margin-left: -19.045rem;
|
|
84
|
+
margin-top: 3rem;`;
|
|
85
|
+
}
|
|
86
|
+
if (props.showsRange) {
|
|
87
|
+
return `margin-left: -19.045rem;`;
|
|
88
|
+
}
|
|
89
|
+
if (props.showsTime) {
|
|
90
|
+
return `margin-left: -14rem;`;
|
|
91
|
+
}
|
|
92
|
+
}}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.react-datepicker {
|
|
96
|
+
width: 16.45rem;
|
|
97
|
+
height: 18.5rem;
|
|
98
|
+
|
|
99
|
+
font-family: Manrope, sans-serif;
|
|
100
|
+
font-size: 0.75rem;
|
|
101
|
+
|
|
102
|
+
background-color: ${(props) => props.theme.colors.grey1};
|
|
103
|
+
border: 1px solid ${(props) => props.theme.colors.grey1};
|
|
104
|
+
box-shadow: ${(props) => props.theme.shadow.light};
|
|
105
|
+
|
|
106
|
+
svg {
|
|
107
|
+
cursor: pointer;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.react-datepicker__triangle {
|
|
111
|
+
visibility: hidden;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.react-datepicker__input-time-container {
|
|
115
|
+
position: absolute;
|
|
116
|
+
top: -51px;
|
|
117
|
+
left: 150px;
|
|
118
|
+
|
|
119
|
+
float: none;
|
|
120
|
+
|
|
121
|
+
margin: 0;
|
|
122
|
+
|
|
123
|
+
color: ${(props) => props.theme.colors.text};
|
|
124
|
+
|
|
125
|
+
.react-datepicker-time__caption {
|
|
126
|
+
display: none;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.react-datepicker__month-container {
|
|
131
|
+
.react-datepicker__header {
|
|
132
|
+
margin-right: 3px;
|
|
133
|
+
margin-left: 3px;
|
|
134
|
+
padding: 1.25em 0.75em 0;
|
|
135
|
+
|
|
136
|
+
color: ${(props) => props.theme.colors.text};
|
|
137
|
+
|
|
138
|
+
background-color: ${(props) => props.theme.colors.grey1};
|
|
139
|
+
border: none;
|
|
140
|
+
|
|
141
|
+
.react-datepicker__day-names {
|
|
142
|
+
display: flex;
|
|
143
|
+
gap: 0.125rem;
|
|
144
|
+
justify-content: space-around;
|
|
145
|
+
margin-bottom: 0;
|
|
146
|
+
|
|
147
|
+
.react-datepicker__day-name {
|
|
148
|
+
width: 2rem;
|
|
149
|
+
height: 2rem;
|
|
150
|
+
margin: 0;
|
|
151
|
+
|
|
152
|
+
line-height: 2rem;
|
|
153
|
+
color: ${(props) => props.theme.colors.text};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.react-datepicker__month {
|
|
159
|
+
display: grid;
|
|
160
|
+
gap: 0.125rem;
|
|
161
|
+
|
|
162
|
+
/* Switch default margin to padding so it applies background color completely */
|
|
163
|
+
margin: 0;
|
|
164
|
+
padding: 0.125rem 0.75rem 0;
|
|
165
|
+
|
|
166
|
+
color: ${(props) => props.theme.colors.text};
|
|
167
|
+
|
|
168
|
+
background-color: ${(props) => props.theme.colors.grey1};
|
|
169
|
+
|
|
170
|
+
.react-datepicker__week {
|
|
171
|
+
display: flex;
|
|
172
|
+
gap: 0.125rem;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.react-datepicker__day {
|
|
176
|
+
width: 2rem;
|
|
177
|
+
height: 2rem;
|
|
178
|
+
margin: 0;
|
|
179
|
+
|
|
180
|
+
line-height: 2rem;
|
|
181
|
+
color: ${(props) => props.theme.colors.text};
|
|
182
|
+
|
|
183
|
+
:hover {
|
|
184
|
+
background-color: ${(props) => props.theme.colors.grey2};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
&.react-datepicker__day--outside-month {
|
|
188
|
+
color: ${(props) => props.theme.colors.grey4};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
&.react-datepicker__day--selected {
|
|
192
|
+
color: ${(props) => props.theme.colors.blue1};
|
|
193
|
+
background-color: ${(props) => props.theme.colors.primary};
|
|
194
|
+
|
|
195
|
+
:hover {
|
|
196
|
+
background-color: ${(props) => props.theme.colors.primaryHover};
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
&.react-datepicker__day--keyboard-selected {
|
|
201
|
+
color: ${(props) => props.theme.colors.text};
|
|
202
|
+
background-color: ${(props) => transparentize(0.8, props.theme.colors.primary)};
|
|
203
|
+
border: 1px solid ${(props) => props.theme.colors.primary}
|
|
204
|
+
|
|
205
|
+
:hover {
|
|
206
|
+
background-color: ${(props) => transparentize(0.6, props.theme.colors.primary)};
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
&.react-datepicker__day--in-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--in-selecting-range {
|
|
216
|
+
color: ${(props) => props.theme.colors.blue1};
|
|
217
|
+
background-color: ${(props) => props.theme.colors.primary};
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
&.react-datepicker__day--selecting-range-end {
|
|
221
|
+
font-weight: normal;
|
|
222
|
+
color: ${(props) => props.theme.colors.blue1};
|
|
223
|
+
background-color: ${(props) => props.theme.colors.primary};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
&.react-datepicker__day--disabled {
|
|
227
|
+
color: ${(props) => props.theme.colors.grey3};
|
|
228
|
+
|
|
229
|
+
:hover {
|
|
230
|
+
background-color: ${(props) => props.theme.colors.grey1};
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/* stylelint-enable selector-class-pattern */
|
|
238
|
+
`;
|
|
239
|
+
const DatepickerInputs = styled.div `
|
|
240
|
+
display: flex;
|
|
241
|
+
gap: 0.5rem;
|
|
242
|
+
`;
|
|
243
|
+
const HeaderWrapper = styled.div `
|
|
244
|
+
display: flex;
|
|
245
|
+
flex-direction: column;
|
|
246
|
+
align-items: center;
|
|
247
|
+
padding-bottom: 0.75rem;
|
|
248
|
+
`;
|
|
249
|
+
const MonthNavigation = styled.div `
|
|
250
|
+
display: flex;
|
|
251
|
+
align-items: center;
|
|
252
|
+
justify-content: space-between;
|
|
253
|
+
`;
|
|
254
|
+
const DropdownsWrapper = styled.div `
|
|
255
|
+
display: flex;
|
|
256
|
+
align-items: center;
|
|
257
|
+
justify-content: center;
|
|
258
|
+
`;
|
|
259
|
+
const MonthButton = styled(Button) `
|
|
260
|
+
min-width: 0;
|
|
261
|
+
height: 1.5rem;
|
|
262
|
+
margin: 0;
|
|
263
|
+
padding: 0.75rem 0.37rem;
|
|
264
|
+
|
|
265
|
+
svg {
|
|
266
|
+
width: 0.75rem;
|
|
267
|
+
height: 0.75rem;
|
|
268
|
+
color: ${(props) => props.theme.colors.grey5};
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
:hover:not(:disabled) {
|
|
272
|
+
svg {
|
|
273
|
+
color: ${(props) => props.theme.colors.text};
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
`;
|
|
277
|
+
const MonthSelect = styled(DatepickerSelect) `
|
|
278
|
+
width: 6.25rem;
|
|
279
|
+
margin-right: 0.55em;
|
|
280
|
+
font-size: 0.875rem;
|
|
281
|
+
`;
|
|
282
|
+
const YearSelect = styled(DatepickerSelect) `
|
|
283
|
+
width: 3.75rem;
|
|
284
|
+
margin-right: 0.8em;
|
|
285
|
+
`;
|
|
286
|
+
const EndDateInputWrapper = styled.div `
|
|
287
|
+
display: flex;
|
|
288
|
+
gap: 0.5rem;
|
|
289
|
+
align-items: center;
|
|
290
|
+
`;
|
|
291
|
+
const DateTimeWrapper = styled.div `
|
|
292
|
+
display: flex;
|
|
293
|
+
flex-direction: ${(props) => (props.isRange ? 'column' : 'row')};
|
|
294
|
+
gap: ${(props) => (props.isRange ? 'none' : '0.5rem')};
|
|
295
|
+
`;
|
|
296
|
+
const DateInput = styled.input `
|
|
297
|
+
display: flex;
|
|
298
|
+
align-items: center;
|
|
299
|
+
|
|
300
|
+
width: 8.5rem;
|
|
301
|
+
height: 2.5rem;
|
|
302
|
+
padding: 0 1rem;
|
|
303
|
+
|
|
304
|
+
font-size: 1rem;
|
|
305
|
+
color: ${(props) => (props.disabled ? props.theme.colors.grey2 : props.theme.colors.text)};
|
|
306
|
+
text-align: center;
|
|
307
|
+
|
|
308
|
+
background-color: ${(props) => props.theme.colors.grey1};
|
|
309
|
+
border: 1px solid ${(props) => props.theme.colors.grey1};
|
|
310
|
+
border-radius: 0.25rem;
|
|
311
|
+
border-radius: ${(props) => (props.isTimeRange ? '0.25rem 0.25rem 0rem 0rem' : '0.25rem')};
|
|
312
|
+
outline: 0;
|
|
313
|
+
|
|
314
|
+
:focus:not(:disabled) {
|
|
315
|
+
border: 1px solid ${(props) => props.theme.colors.grey3};
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
:hover:not(:disabled) {
|
|
319
|
+
background-color: ${(props) => props.theme.colors.grey2};
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
:disabled {
|
|
323
|
+
cursor: not-allowed;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
::placeholder {
|
|
327
|
+
font-style: italic;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
::-webkit-calendar-picker-indicator {
|
|
331
|
+
display: none;
|
|
332
|
+
background: none;
|
|
333
|
+
}
|
|
334
|
+
`;
|
|
335
|
+
const TimeInput = styled(Input) `
|
|
336
|
+
width: ${(props) => (props.isRange ? '8.5rem' : '5rem')};
|
|
337
|
+
|
|
338
|
+
input {
|
|
339
|
+
position: relative;
|
|
340
|
+
|
|
341
|
+
display: flex;
|
|
342
|
+
justify-content: center;
|
|
343
|
+
|
|
344
|
+
padding: 0.5rem;
|
|
345
|
+
|
|
346
|
+
font-size: 1rem;
|
|
347
|
+
color: ${(props) => props.theme.colors.text};
|
|
348
|
+
text-align: center;
|
|
349
|
+
|
|
350
|
+
border-radius: ${(props) => (props.isRange ? '0rem 0rem 0.25rem 0.25rem' : '0.25rem')};
|
|
351
|
+
|
|
352
|
+
:focus:not(:disabled) {
|
|
353
|
+
border: 1px solid ${(props) => props.theme.colors.grey3};
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
::-webkit-calendar-picker-indicator {
|
|
357
|
+
display: none;
|
|
358
|
+
background: none;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
::after {
|
|
362
|
+
content: '';
|
|
363
|
+
|
|
364
|
+
position: absolute;
|
|
365
|
+
top: 0;
|
|
366
|
+
left: 1.2rem;
|
|
367
|
+
|
|
368
|
+
display: block;
|
|
369
|
+
|
|
370
|
+
width: 6rem;
|
|
371
|
+
|
|
372
|
+
border-top: ${(props) => (props.isRange ? `1px solid ${props.theme.colors.grey2}` : 'none')};
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
`;
|
|
376
|
+
/**
|
|
377
|
+
* Custom DatePickerHeader component
|
|
378
|
+
*/
|
|
379
|
+
function DatePickerHeader({ date, changeMonth, changeYear, decreaseMonth, increaseMonth, selectItemClass, portalsRef, minDate, maxDate, }) {
|
|
380
|
+
const months = useMemo(() => getMonths(), []);
|
|
381
|
+
const years = useMemo(() => getYears(minDate, maxDate), [minDate, maxDate]);
|
|
382
|
+
const selectedMonth = useMemo(() => {
|
|
383
|
+
return { label: enGB.localize.month(date.getMonth()), value: date.getMonth() };
|
|
384
|
+
}, [date]);
|
|
385
|
+
const selectedYear = useMemo(() => ({ label: date.getFullYear().toString(), value: date.getFullYear() }), [date]);
|
|
386
|
+
return (_jsx(HeaderWrapper, { children: _jsxs(DropdownsWrapper, { children: [_jsx(MonthSelect, { displacement: -1.1, dropdownRef: (element) => {
|
|
387
|
+
if (portalsRef) {
|
|
388
|
+
portalsRef.current[0] = element;
|
|
389
|
+
}
|
|
390
|
+
}, itemClass: `${IGNORE_CLASSNAME} ${selectItemClass}`, items: months, onSelect: (item) => changeMonth(item.value), selectedItem: selectedMonth, size: 0.875 }), _jsx(YearSelect, { displacement: -7.8, dropdownRef: (element) => {
|
|
391
|
+
if (portalsRef) {
|
|
392
|
+
portalsRef.current[1] = element;
|
|
393
|
+
}
|
|
394
|
+
}, 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, {}) })] })] }) }));
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Turns time number given into a string that is two digits long
|
|
398
|
+
*
|
|
399
|
+
* @param time - the number of hours or minutes to format
|
|
400
|
+
*/
|
|
401
|
+
function getTimeFormatted(time) {
|
|
402
|
+
const timeString = String(time);
|
|
403
|
+
if (timeString.length > 1) {
|
|
404
|
+
return timeString;
|
|
405
|
+
}
|
|
406
|
+
return `0${timeString}`;
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Given an initial Date object gets the initial time set
|
|
410
|
+
*
|
|
411
|
+
* @param initialDate - a Date object
|
|
412
|
+
* @param isRange - whether the datepicker is in range select mode
|
|
413
|
+
*
|
|
414
|
+
* @returns the time set
|
|
415
|
+
*/
|
|
416
|
+
function getInitialTime(initialDate, isRange) {
|
|
417
|
+
if (!initialDate) {
|
|
418
|
+
if (isRange) {
|
|
419
|
+
return ['00:00', '00:00'];
|
|
420
|
+
}
|
|
421
|
+
return '00:00';
|
|
422
|
+
}
|
|
423
|
+
if (Array.isArray(initialDate)) {
|
|
424
|
+
return [
|
|
425
|
+
`${getTimeFormatted(initialDate[0].getHours())}:${getTimeFormatted(initialDate[0].getMinutes())}`,
|
|
426
|
+
`${getTimeFormatted(initialDate[1].getHours())}:${getTimeFormatted(initialDate[1].getMinutes())}`,
|
|
427
|
+
];
|
|
428
|
+
}
|
|
429
|
+
return `${getTimeFormatted(initialDate.getHours())}:${getTimeFormatted(initialDate.getMinutes())}`;
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Gets the initial date string
|
|
433
|
+
*
|
|
434
|
+
* @param initialDate - intial date values
|
|
435
|
+
* @param formatToApply - the date format that the string should obey
|
|
436
|
+
* @param isStart - for the case of range dates whether to get the first date or the second from the initialDate object
|
|
437
|
+
*/
|
|
438
|
+
function getInitialDate(initialDate, formatToApply, isStart) {
|
|
439
|
+
let formattedDate = '';
|
|
440
|
+
if (initialDate) {
|
|
441
|
+
if (Array.isArray(initialDate)) {
|
|
442
|
+
formattedDate = format(initialDate[isStart ? 0 : 1], formatToApply);
|
|
443
|
+
}
|
|
444
|
+
else {
|
|
445
|
+
formattedDate = format(initialDate, formatToApply);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
return formattedDate;
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Combines a given date and time into a Date or [Date, Date] object
|
|
452
|
+
*
|
|
453
|
+
* @param date - the date(s) to have time added to
|
|
454
|
+
* @param time - the time(s) to add to the date(s)
|
|
455
|
+
*/
|
|
456
|
+
function getNewDatetime(date, time) {
|
|
457
|
+
var _a, _b, _c, _d, _e;
|
|
458
|
+
if (!Array.isArray(date) && !Array.isArray(time)) {
|
|
459
|
+
const [hours, minutes] = (_a = time === null || time === void 0 ? void 0 : time.split(':')) !== null && _a !== void 0 ? _a : ['00', '00'];
|
|
460
|
+
const newDate = date ? new Date(date.setHours(Number(hours), Number(minutes))) : null;
|
|
461
|
+
return newDate;
|
|
462
|
+
}
|
|
463
|
+
const [startHours, startMinutes] = (_c = (_b = time[0]) === null || _b === void 0 ? void 0 : _b.split(':')) !== null && _c !== void 0 ? _c : ['00', '00'];
|
|
464
|
+
const [endHours, endMinutes] = (_e = (_d = time[1]) === null || _d === void 0 ? void 0 : _d.split(':')) !== null && _e !== void 0 ? _e : ['00', '00'];
|
|
465
|
+
const dates = date;
|
|
466
|
+
const startDate = dates[0] ? new Date(dates[0].setHours(Number(startHours), Number(startMinutes))) : null;
|
|
467
|
+
const endDate = dates[1] ? new Date(dates[1].setHours(Number(endHours), Number(endMinutes))) : null;
|
|
468
|
+
return [startDate, endDate];
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* A simple datepicker component
|
|
472
|
+
*
|
|
473
|
+
* @param {DatePickerProps} props - the component props
|
|
474
|
+
*/
|
|
475
|
+
function DatePicker(props) {
|
|
476
|
+
var _a, _b, _c;
|
|
477
|
+
const value = (_a = props.value) !== null && _a !== void 0 ? _a : props.initialValue;
|
|
478
|
+
const [selectedDate, setSelectedDate] = useState(value || (props.selectsRange ? [null, null] : null));
|
|
479
|
+
const [selectedTime, setSelectedTime] = useState(() => getInitialTime(value, props.selectsRange));
|
|
480
|
+
const formatToApply = (_b = props.dateFormat) !== null && _b !== void 0 ? _b : 'dd/MM/yyyy';
|
|
481
|
+
const [startDate, setStartDate] = useState(() => getInitialDate(value, formatToApply, true));
|
|
482
|
+
const [endDate, setEndDate] = useState(() => getInitialDate(value, formatToApply, false));
|
|
483
|
+
// state to track which date is being selected based on the input which has been interacted with
|
|
484
|
+
const [isSelectingStart, setIsSelectingStart] = useState(null);
|
|
485
|
+
// Keep state in refs so we can compare it in useEffect without subscribing
|
|
486
|
+
const selectedDateRef = useRef(selectedDate);
|
|
487
|
+
selectedDateRef.current = selectedDate;
|
|
488
|
+
const datepickerRef = useRef(null);
|
|
489
|
+
const extraProps = useMemo(() => {
|
|
490
|
+
if (props.selectsRange) {
|
|
491
|
+
const selectedDates = (selectedDate !== null && selectedDate !== void 0 ? selectedDate : [null, null]);
|
|
492
|
+
let { minDate } = props;
|
|
493
|
+
// If we are selecting the end date minDate becomes whatever the startDate is
|
|
494
|
+
if (!isSelectingStart) {
|
|
495
|
+
const [currentStartDate] = selectedDates;
|
|
496
|
+
minDate = currentStartDate;
|
|
497
|
+
}
|
|
498
|
+
return {
|
|
499
|
+
endDate: selectedDates[1],
|
|
500
|
+
minDate,
|
|
501
|
+
startDate: selectedDates[0],
|
|
502
|
+
};
|
|
503
|
+
}
|
|
504
|
+
let date = selectedDate;
|
|
505
|
+
// if datepicker can change between single datepicker and range then we need to adjust the date
|
|
506
|
+
if (Array.isArray(selectedDate)) {
|
|
507
|
+
[date] = selectedDate;
|
|
508
|
+
}
|
|
509
|
+
return {
|
|
510
|
+
selected: date,
|
|
511
|
+
};
|
|
512
|
+
}, [selectedDate, isSelectingStart, props]);
|
|
513
|
+
const onChangeDate = (date) => {
|
|
514
|
+
var _a;
|
|
515
|
+
// close datepicker when a date is chosen
|
|
516
|
+
if (props.shouldCloseOnSelect) {
|
|
517
|
+
(_a = datepickerRef.current) === null || _a === void 0 ? void 0 : _a.setOpen(false);
|
|
518
|
+
}
|
|
519
|
+
if (props.selectsRange) {
|
|
520
|
+
// if range datepicker then update the correct part of the selected date
|
|
521
|
+
let currentStartDate;
|
|
522
|
+
let currentEndDate;
|
|
523
|
+
if (isSelectingStart) {
|
|
524
|
+
currentStartDate = date;
|
|
525
|
+
currentEndDate = Array.isArray(selectedDate) ? selectedDate[1] : null;
|
|
526
|
+
// if start date happens after end date then end date should become start
|
|
527
|
+
currentEndDate = currentEndDate && currentEndDate > date ? currentEndDate : date;
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
currentStartDate = Array.isArray(selectedDate) ? selectedDate[0] : null;
|
|
531
|
+
currentEndDate = date;
|
|
532
|
+
}
|
|
533
|
+
setStartDate(format(currentStartDate, formatToApply));
|
|
534
|
+
setEndDate(format(currentEndDate, formatToApply));
|
|
535
|
+
setSelectedDate([currentStartDate, currentEndDate]);
|
|
536
|
+
}
|
|
537
|
+
else {
|
|
538
|
+
// if it is a single datepicker just update the selected date and start date
|
|
539
|
+
setSelectedDate(date);
|
|
540
|
+
setStartDate(format(date, formatToApply));
|
|
541
|
+
}
|
|
542
|
+
};
|
|
543
|
+
const onChangeDateInput = (isStartDate, e) => {
|
|
544
|
+
var _a;
|
|
545
|
+
const target = e.target;
|
|
546
|
+
const newDate = parse(target.value, formatToApply, new Date());
|
|
547
|
+
// if newDate is valid and within valid range then update the selected date
|
|
548
|
+
if (newDate instanceof Date &&
|
|
549
|
+
!Number.isNaN(newDate.valueOf()) &&
|
|
550
|
+
!(newDate < props.minDate) &&
|
|
551
|
+
!(newDate > props.maxDate)) {
|
|
552
|
+
// allows so that changes to the input update the datepicker
|
|
553
|
+
(_a = datepickerRef.current) === null || _a === void 0 ? void 0 : _a.setState({
|
|
554
|
+
preSelection: newDate,
|
|
555
|
+
});
|
|
556
|
+
// if it is a range datepicker
|
|
557
|
+
if (Array.isArray(selectedDate)) {
|
|
558
|
+
if (isStartDate) {
|
|
559
|
+
let end = selectedDate[1];
|
|
560
|
+
// is start date is after end date, then adjust end date
|
|
561
|
+
if (newDate > end) {
|
|
562
|
+
end = newDate;
|
|
563
|
+
setEndDate(target.value);
|
|
564
|
+
}
|
|
565
|
+
setSelectedDate([newDate, end]);
|
|
566
|
+
setStartDate(target.value);
|
|
567
|
+
return;
|
|
568
|
+
}
|
|
569
|
+
let start = selectedDate[0];
|
|
570
|
+
// if end date is before start date, then adjust start date
|
|
571
|
+
if (newDate < start) {
|
|
572
|
+
start = newDate;
|
|
573
|
+
setStartDate(target.value);
|
|
574
|
+
}
|
|
575
|
+
setSelectedDate([start, newDate]);
|
|
576
|
+
setEndDate(target.value);
|
|
577
|
+
return;
|
|
578
|
+
}
|
|
579
|
+
setSelectedDate(newDate);
|
|
580
|
+
}
|
|
581
|
+
// if input date is not valid, user might still be inputting -> update input
|
|
582
|
+
if (!isStartDate) {
|
|
583
|
+
setEndDate(target.value);
|
|
584
|
+
return;
|
|
585
|
+
}
|
|
586
|
+
setStartDate(target.value);
|
|
587
|
+
};
|
|
588
|
+
const onChangeTime = (time, isStartTime) => {
|
|
589
|
+
// only change if there is a time set, in the event of erasing does not update
|
|
590
|
+
if (time) {
|
|
591
|
+
if (Array.isArray(selectedTime)) {
|
|
592
|
+
if (isStartTime) {
|
|
593
|
+
setSelectedTime([time, selectedTime[1]]);
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
setSelectedTime([selectedTime[0], time]);
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
599
|
+
setSelectedTime(time);
|
|
600
|
+
}
|
|
601
|
+
};
|
|
602
|
+
// this component is complex and so to make it work with controlled mode we are doing so in the useEffect for simplicity,
|
|
603
|
+
// even if it is not the strictest way as it still keep track of its own state.
|
|
604
|
+
useEffect(() => {
|
|
605
|
+
var _a;
|
|
606
|
+
const newValue = (_a = props.value) !== null && _a !== void 0 ? _a : props.initialValue;
|
|
607
|
+
const newDate = newValue || (props.selectsRange ? [null, null] : null);
|
|
608
|
+
// Skip if the value is the same as the current state, this is necessary to prevent loops
|
|
609
|
+
if (JSON.stringify(newDate) === JSON.stringify(selectedDateRef.current)) {
|
|
610
|
+
return;
|
|
611
|
+
}
|
|
612
|
+
setSelectedDate(newDate);
|
|
613
|
+
const newTime = getInitialTime(newValue, props.selectsRange);
|
|
614
|
+
setSelectedTime(newTime);
|
|
615
|
+
const newStartDate = getInitialDate(newValue, formatToApply, true);
|
|
616
|
+
setStartDate(newStartDate);
|
|
617
|
+
const newEndDate = getInitialDate(newValue, formatToApply, false);
|
|
618
|
+
setEndDate(newEndDate);
|
|
619
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
620
|
+
}, [props.value, props.initialValue]);
|
|
621
|
+
useEffect(() => {
|
|
622
|
+
var _a;
|
|
623
|
+
let time = selectedTime;
|
|
624
|
+
// if datepicker can change between single datepicker and range then we need to adjust the time
|
|
625
|
+
if (props.selectsRange && !Array.isArray(selectedTime)) {
|
|
626
|
+
time = [selectedTime, '00:00'];
|
|
627
|
+
setSelectedTime([selectedTime, '00:00']);
|
|
628
|
+
}
|
|
629
|
+
// We have to typecast to make compiler happy as we don't know which type it is at this point
|
|
630
|
+
const newDateTime = getNewDatetime(selectedDate, time);
|
|
631
|
+
(_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, newDateTime);
|
|
632
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
633
|
+
}, [selectedDate, selectedTime]);
|
|
634
|
+
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) => {
|
|
635
|
+
onChangeDateInput(true, e);
|
|
636
|
+
}, onClick: () => {
|
|
637
|
+
var _a;
|
|
638
|
+
setIsSelectingStart(true);
|
|
639
|
+
(_a = datepickerRef.current) === null || _a === void 0 ? void 0 : _a.setOpen(true);
|
|
640
|
+
}, onFocus: () => {
|
|
641
|
+
var _a;
|
|
642
|
+
setIsSelectingStart(true);
|
|
643
|
+
(_a = datepickerRef.current) === null || _a === void 0 ? void 0 : _a.setOpen(true);
|
|
644
|
+
}, onKeyDown: (e) => {
|
|
645
|
+
var _a;
|
|
646
|
+
(_a = datepickerRef.current) === null || _a === void 0 ? void 0 : _a.onInputKeyDown(e);
|
|
647
|
+
}, placeholder: formatToApply, value: startDate }), props.showTimeInput && (_jsx(TimeInput, { isRange: props.selectsRange, onChange: (e) => {
|
|
648
|
+
onChangeTime(e, true);
|
|
649
|
+
}, 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) => {
|
|
650
|
+
onChangeDateInput(false, e);
|
|
651
|
+
}, onClick: () => {
|
|
652
|
+
var _a;
|
|
653
|
+
setIsSelectingStart(false);
|
|
654
|
+
(_a = datepickerRef.current) === null || _a === void 0 ? void 0 : _a.setOpen(true);
|
|
655
|
+
}, onFocus: () => {
|
|
656
|
+
var _a;
|
|
657
|
+
setIsSelectingStart(false);
|
|
658
|
+
(_a = datepickerRef.current) === null || _a === void 0 ? void 0 : _a.setOpen(true);
|
|
659
|
+
}, onKeyDown: (e) => {
|
|
660
|
+
var _a;
|
|
661
|
+
(_a = datepickerRef.current) === null || _a === void 0 ? void 0 : _a.onInputKeyDown(e);
|
|
662
|
+
}, placeholder: formatToApply, value: endDate }), props.showTimeInput && (_jsx(TimeInput, { isRange: true, onChange: (e) => {
|
|
663
|
+
onChangeTime(e, false);
|
|
664
|
+
}, type: "time", value: selectedTime[1] }))] })] }))] }), _jsx(ReactDatePicker, Object.assign({ className: props.className,
|
|
665
|
+
// if needs to have a customInput otherwise displays its own
|
|
666
|
+
customInput: _jsx("div", {}), disabled: props.disabled, inline: props.inline, maxDate: props.maxDate, onChange: onChangeDate, ref: datepickerRef, selectsEnd: !isSelectingStart, selectsStart: isSelectingStart, 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 }))) }))] }) }) }));
|
|
667
|
+
}
|
|
668
|
+
export default DatePicker;
|
|
669
|
+
//# sourceMappingURL=datepicker.js.map
|