@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.
Files changed (278) hide show
  1. package/LICENSE +201 -0
  2. package/dist/accordion/accordion-item.d.ts +24 -0
  3. package/dist/accordion/accordion-item.d.ts.map +1 -0
  4. package/dist/accordion/accordion-item.js +92 -0
  5. package/dist/accordion/accordion-item.js.map +1 -0
  6. package/dist/accordion/accordion.d.ts +32 -0
  7. package/dist/accordion/accordion.d.ts.map +1 -0
  8. package/dist/accordion/accordion.js +87 -0
  9. package/dist/accordion/accordion.js.map +1 -0
  10. package/dist/badge/badge.d.ts +20 -0
  11. package/dist/badge/badge.d.ts.map +1 -0
  12. package/dist/badge/badge.js +42 -0
  13. package/dist/badge/badge.js.map +1 -0
  14. package/dist/button/button.d.ts +35 -0
  15. package/dist/button/button.d.ts.map +1 -0
  16. package/dist/button/button.js +169 -0
  17. package/dist/button/button.js.map +1 -0
  18. package/dist/button-bar/button-bar.d.ts +19 -0
  19. package/dist/button-bar/button-bar.d.ts.map +1 -0
  20. package/dist/button-bar/button-bar.js +124 -0
  21. package/dist/button-bar/button-bar.js.map +1 -0
  22. package/dist/carousel/carousel.d.ts +23 -0
  23. package/dist/carousel/carousel.d.ts.map +1 -0
  24. package/dist/carousel/carousel.js +178 -0
  25. package/dist/carousel/carousel.js.map +1 -0
  26. package/dist/chat/chat.d.ts +28 -0
  27. package/dist/chat/chat.d.ts.map +1 -0
  28. package/dist/chat/chat.js +182 -0
  29. package/dist/chat/chat.js.map +1 -0
  30. package/dist/chat/message.d.ts +28 -0
  31. package/dist/chat/message.d.ts.map +1 -0
  32. package/dist/chat/message.js +220 -0
  33. package/dist/chat/message.js.map +1 -0
  34. package/dist/checkbox/checkbox-group.d.ts +35 -0
  35. package/dist/checkbox/checkbox-group.d.ts.map +1 -0
  36. package/dist/checkbox/checkbox-group.js +116 -0
  37. package/dist/checkbox/checkbox-group.js.map +1 -0
  38. package/dist/checkbox/checkbox.d.ts +27 -0
  39. package/dist/checkbox/checkbox.d.ts.map +1 -0
  40. package/dist/checkbox/checkbox.js +164 -0
  41. package/dist/checkbox/checkbox.js.map +1 -0
  42. package/dist/checkbox/tri-state-checkbox.d.ts +22 -0
  43. package/dist/checkbox/tri-state-checkbox.d.ts.map +1 -0
  44. package/dist/checkbox/tri-state-checkbox.js +87 -0
  45. package/dist/checkbox/tri-state-checkbox.js.map +1 -0
  46. package/dist/code-viewer/code-viewer.d.ts +31 -0
  47. package/dist/code-viewer/code-viewer.d.ts.map +1 -0
  48. package/dist/code-viewer/code-viewer.js +115 -0
  49. package/dist/code-viewer/code-viewer.js.map +1 -0
  50. package/dist/combo-box/combo-box.d.ts +39 -0
  51. package/dist/combo-box/combo-box.d.ts.map +1 -0
  52. package/dist/combo-box/combo-box.js +176 -0
  53. package/dist/combo-box/combo-box.js.map +1 -0
  54. package/dist/component-select-list/component-select-list.d.ts +27 -0
  55. package/dist/component-select-list/component-select-list.d.ts.map +1 -0
  56. package/dist/component-select-list/component-select-list.js +131 -0
  57. package/dist/component-select-list/component-select-list.js.map +1 -0
  58. package/dist/constants.d.ts +33 -0
  59. package/dist/constants.d.ts.map +1 -0
  60. package/dist/constants.js +47 -0
  61. package/dist/constants.js.map +1 -0
  62. package/dist/context-menu/context-menu.d.ts +24 -0
  63. package/dist/context-menu/context-menu.d.ts.map +1 -0
  64. package/dist/context-menu/context-menu.js +116 -0
  65. package/dist/context-menu/context-menu.js.map +1 -0
  66. package/dist/datepicker/datepicker-select.d.ts +48 -0
  67. package/dist/datepicker/datepicker-select.d.ts.map +1 -0
  68. package/dist/datepicker/datepicker-select.js +219 -0
  69. package/dist/datepicker/datepicker-select.js.map +1 -0
  70. package/dist/datepicker/datepicker.d.ts +56 -0
  71. package/dist/datepicker/datepicker.d.ts.map +1 -0
  72. package/dist/datepicker/datepicker.js +669 -0
  73. package/dist/datepicker/datepicker.js.map +1 -0
  74. package/dist/dropzone/dropzone.d.ts +21 -0
  75. package/dist/dropzone/dropzone.d.ts.map +1 -0
  76. package/dist/dropzone/dropzone.js +80 -0
  77. package/dist/dropzone/dropzone.js.map +1 -0
  78. package/dist/error-boundary/error-boundary.d.ts +33 -0
  79. package/dist/error-boundary/error-boundary.d.ts.map +1 -0
  80. package/dist/error-boundary/error-boundary.js +72 -0
  81. package/dist/error-boundary/error-boundary.js.map +1 -0
  82. package/dist/filter/categorical-filter.d.ts +26 -0
  83. package/dist/filter/categorical-filter.d.ts.map +1 -0
  84. package/dist/filter/categorical-filter.js +153 -0
  85. package/dist/filter/categorical-filter.js.map +1 -0
  86. package/dist/filter/datetime-filter.d.ts +28 -0
  87. package/dist/filter/datetime-filter.d.ts.map +1 -0
  88. package/dist/filter/datetime-filter.js +174 -0
  89. package/dist/filter/datetime-filter.js.map +1 -0
  90. package/dist/filter/numeric-filter.d.ts +24 -0
  91. package/dist/filter/numeric-filter.d.ts.map +1 -0
  92. package/dist/filter/numeric-filter.js +148 -0
  93. package/dist/filter/numeric-filter.js.map +1 -0
  94. package/dist/hierarchy-selector/hierarchy-selector.d.ts +31 -0
  95. package/dist/hierarchy-selector/hierarchy-selector.d.ts.map +1 -0
  96. package/dist/hierarchy-selector/hierarchy-selector.js +65 -0
  97. package/dist/hierarchy-selector/hierarchy-selector.js.map +1 -0
  98. package/dist/hierarchy-selector/node/branch.d.ts +47 -0
  99. package/dist/hierarchy-selector/node/branch.d.ts.map +1 -0
  100. package/dist/hierarchy-selector/node/branch.js +132 -0
  101. package/dist/hierarchy-selector/node/branch.js.map +1 -0
  102. package/dist/index.d.ts +57 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +55 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/input/input.d.ts +44 -0
  107. package/dist/input/input.d.ts.map +1 -0
  108. package/dist/input/input.js +91 -0
  109. package/dist/input/input.js.map +1 -0
  110. package/dist/jest-setup.d.ts +18 -0
  111. package/dist/jest-setup.d.ts.map +1 -0
  112. package/dist/jest-setup.js +18 -0
  113. package/dist/jest-setup.js.map +1 -0
  114. package/dist/markdown/markdown.d.ts +18 -0
  115. package/dist/markdown/markdown.d.ts.map +1 -0
  116. package/dist/markdown/markdown.js +356 -0
  117. package/dist/markdown/markdown.js.map +1 -0
  118. package/dist/modal/modal.d.ts +37 -0
  119. package/dist/modal/modal.d.ts.map +1 -0
  120. package/dist/modal/modal.js +121 -0
  121. package/dist/modal/modal.js.map +1 -0
  122. package/dist/multiselect/multiselect.d.ts +31 -0
  123. package/dist/multiselect/multiselect.d.ts.map +1 -0
  124. package/dist/multiselect/multiselect.js +231 -0
  125. package/dist/multiselect/multiselect.js.map +1 -0
  126. package/dist/numeric-input/input-stepper.d.ts +33 -0
  127. package/dist/numeric-input/input-stepper.d.ts.map +1 -0
  128. package/dist/numeric-input/input-stepper.js +54 -0
  129. package/dist/numeric-input/input-stepper.js.map +1 -0
  130. package/dist/numeric-input/numeric-input.d.ts +42 -0
  131. package/dist/numeric-input/numeric-input.d.ts.map +1 -0
  132. package/dist/numeric-input/numeric-input.js +234 -0
  133. package/dist/numeric-input/numeric-input.js.map +1 -0
  134. package/dist/progress-bar/progress-bar.d.ts +23 -0
  135. package/dist/progress-bar/progress-bar.d.ts.map +1 -0
  136. package/dist/progress-bar/progress-bar.js +90 -0
  137. package/dist/progress-bar/progress-bar.js.map +1 -0
  138. package/dist/radio/radio-group.d.ts +19 -0
  139. package/dist/radio/radio-group.d.ts.map +1 -0
  140. package/dist/radio/radio-group.js +160 -0
  141. package/dist/radio/radio-group.js.map +1 -0
  142. package/dist/search-bar/search-bar.d.ts +34 -0
  143. package/dist/search-bar/search-bar.d.ts.map +1 -0
  144. package/dist/search-bar/search-bar.js +39 -0
  145. package/dist/search-bar/search-bar.js.map +1 -0
  146. package/dist/sectioned-list/sectioned-list.d.ts +29 -0
  147. package/dist/sectioned-list/sectioned-list.d.ts.map +1 -0
  148. package/dist/sectioned-list/sectioned-list.js +205 -0
  149. package/dist/sectioned-list/sectioned-list.js.map +1 -0
  150. package/dist/select/select.d.ts +54 -0
  151. package/dist/select/select.d.ts.map +1 -0
  152. package/dist/select/select.js +143 -0
  153. package/dist/select/select.js.map +1 -0
  154. package/dist/shared/chevron-button.d.ts +13 -0
  155. package/dist/shared/chevron-button.d.ts.map +1 -0
  156. package/dist/shared/chevron-button.js +35 -0
  157. package/dist/shared/chevron-button.js.map +1 -0
  158. package/dist/shared/dropdown-list.d.ts +34 -0
  159. package/dist/shared/dropdown-list.d.ts.map +1 -0
  160. package/dist/shared/dropdown-list.js +33 -0
  161. package/dist/shared/dropdown-list.js.map +1 -0
  162. package/dist/shared/list-item.d.ts +35 -0
  163. package/dist/shared/list-item.d.ts.map +1 -0
  164. package/dist/shared/list-item.js +69 -0
  165. package/dist/shared/list-item.js.map +1 -0
  166. package/dist/slider/slider-inputs.d.ts +36 -0
  167. package/dist/slider/slider-inputs.d.ts.map +1 -0
  168. package/dist/slider/slider-inputs.js +88 -0
  169. package/dist/slider/slider-inputs.js.map +1 -0
  170. package/dist/slider/slider.d.ts +53 -0
  171. package/dist/slider/slider.d.ts.map +1 -0
  172. package/dist/slider/slider.js +273 -0
  173. package/dist/slider/slider.js.map +1 -0
  174. package/dist/spinner/spinner.d.ts +19 -0
  175. package/dist/spinner/spinner.d.ts.map +1 -0
  176. package/dist/spinner/spinner.js +144 -0
  177. package/dist/spinner/spinner.js.map +1 -0
  178. package/dist/switch/sun-icon.d.ts +3 -0
  179. package/dist/switch/sun-icon.d.ts.map +1 -0
  180. package/dist/switch/sun-icon.js +24 -0
  181. package/dist/switch/sun-icon.js.map +1 -0
  182. package/dist/switch/switch.d.ts +16 -0
  183. package/dist/switch/switch.d.ts.map +1 -0
  184. package/dist/switch/switch.js +92 -0
  185. package/dist/switch/switch.js.map +1 -0
  186. package/dist/table/cells/action-cell.d.ts +34 -0
  187. package/dist/table/cells/action-cell.d.ts.map +1 -0
  188. package/dist/table/cells/action-cell.js +68 -0
  189. package/dist/table/cells/action-cell.js.map +1 -0
  190. package/dist/table/cells/datetime-cell.d.ts +12 -0
  191. package/dist/table/cells/datetime-cell.d.ts.map +1 -0
  192. package/dist/table/cells/datetime-cell.js +36 -0
  193. package/dist/table/cells/datetime-cell.js.map +1 -0
  194. package/dist/table/cells/edit-cell-utils.d.ts +32 -0
  195. package/dist/table/cells/edit-cell-utils.d.ts.map +1 -0
  196. package/dist/table/cells/edit-cell-utils.js +2 -0
  197. package/dist/table/cells/edit-cell-utils.js.map +1 -0
  198. package/dist/table/cells/edit-input-cell.d.ts +10 -0
  199. package/dist/table/cells/edit-input-cell.d.ts.map +1 -0
  200. package/dist/table/cells/edit-input-cell.js +61 -0
  201. package/dist/table/cells/edit-input-cell.js.map +1 -0
  202. package/dist/table/cells/edit-select-cell.d.ts +12 -0
  203. package/dist/table/cells/edit-select-cell.d.ts.map +1 -0
  204. package/dist/table/cells/edit-select-cell.js +55 -0
  205. package/dist/table/cells/edit-select-cell.js.map +1 -0
  206. package/dist/table/filters.d.ts +46 -0
  207. package/dist/table/filters.d.ts.map +1 -0
  208. package/dist/table/filters.js +226 -0
  209. package/dist/table/filters.js.map +1 -0
  210. package/dist/table/headers/select-header.d.ts +14 -0
  211. package/dist/table/headers/select-header.d.ts.map +1 -0
  212. package/dist/table/headers/select-header.js +41 -0
  213. package/dist/table/headers/select-header.js.map +1 -0
  214. package/dist/table/options-menu.d.ts +25 -0
  215. package/dist/table/options-menu.d.ts.map +1 -0
  216. package/dist/table/options-menu.js +123 -0
  217. package/dist/table/options-menu.js.map +1 -0
  218. package/dist/table/render-row.d.ts +25 -0
  219. package/dist/table/render-row.d.ts.map +1 -0
  220. package/dist/table/render-row.js +163 -0
  221. package/dist/table/render-row.js.map +1 -0
  222. package/dist/table/table.d.ts +95 -0
  223. package/dist/table/table.d.ts.map +1 -0
  224. package/dist/table/table.js +422 -0
  225. package/dist/table/table.js.map +1 -0
  226. package/dist/table/types.d.ts +30 -0
  227. package/dist/table/types.d.ts.map +1 -0
  228. package/dist/table/types.js +2 -0
  229. package/dist/table/types.js.map +1 -0
  230. package/dist/tabs/tabs.d.ts +22 -0
  231. package/dist/tabs/tabs.d.ts.map +1 -0
  232. package/dist/tabs/tabs.js +91 -0
  233. package/dist/tabs/tabs.js.map +1 -0
  234. package/dist/textarea/textarea.d.ts +47 -0
  235. package/dist/textarea/textarea.d.ts.map +1 -0
  236. package/dist/textarea/textarea.js +121 -0
  237. package/dist/textarea/textarea.js.map +1 -0
  238. package/dist/tooltip/tooltip.d.ts +48 -0
  239. package/dist/tooltip/tooltip.d.ts.map +1 -0
  240. package/dist/tooltip/tooltip.js +116 -0
  241. package/dist/tooltip/tooltip.js.map +1 -0
  242. package/dist/types.d.ts +94 -0
  243. package/dist/types.d.ts.map +1 -0
  244. package/dist/types.js +2 -0
  245. package/dist/types.js.map +1 -0
  246. package/dist/utils/chevron.d.ts +34 -0
  247. package/dist/utils/chevron.d.ts.map +1 -0
  248. package/dist/utils/chevron.js +38 -0
  249. package/dist/utils/chevron.js.map +1 -0
  250. package/dist/utils/index.d.ts +22 -0
  251. package/dist/utils/index.d.ts.map +1 -0
  252. package/dist/utils/index.js +22 -0
  253. package/dist/utils/index.js.map +1 -0
  254. package/dist/utils/label.d.ts +3 -0
  255. package/dist/utils/label.d.ts.map +1 -0
  256. package/dist/utils/label.js +24 -0
  257. package/dist/utils/label.js.map +1 -0
  258. package/dist/utils/list-styles.d.ts +8 -0
  259. package/dist/utils/list-styles.d.ts.map +1 -0
  260. package/dist/utils/list-styles.js +43 -0
  261. package/dist/utils/list-styles.js.map +1 -0
  262. package/dist/utils/match-width-to-reference.d.ts +24 -0
  263. package/dist/utils/match-width-to-reference.d.ts.map +1 -0
  264. package/dist/utils/match-width-to-reference.js +30 -0
  265. package/dist/utils/match-width-to-reference.js.map +1 -0
  266. package/dist/utils/syncKbdHighlightIdx.d.ts +23 -0
  267. package/dist/utils/syncKbdHighlightIdx.d.ts.map +1 -0
  268. package/dist/utils/syncKbdHighlightIdx.js +41 -0
  269. package/dist/utils/syncKbdHighlightIdx.js.map +1 -0
  270. package/dist/utils/use-infinite-loader.d.ts +32 -0
  271. package/dist/utils/use-infinite-loader.d.ts.map +1 -0
  272. package/dist/utils/use-infinite-loader.js +119 -0
  273. package/dist/utils/use-infinite-loader.js.map +1 -0
  274. package/dist/utils/use-on-click-outside.d.ts +3 -0
  275. package/dist/utils/use-on-click-outside.d.ts.map +1 -0
  276. package/dist/utils/use-on-click-outside.js +36 -0
  277. package/dist/utils/use-on-click-outside.js.map +1 -0
  278. 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