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