@navikt/ds-react 7.13.0 → 7.14.0-alpha.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 (291) hide show
  1. package/cjs/date/Date.Dialog.d.ts +18 -0
  2. package/cjs/date/Date.Dialog.js +67 -0
  3. package/cjs/date/Date.Dialog.js.map +1 -0
  4. package/cjs/date/Date.Input.d.ts +50 -0
  5. package/cjs/date/Date.Input.js +96 -0
  6. package/cjs/date/Date.Input.js.map +1 -0
  7. package/cjs/date/Date.locale.d.ts +44 -0
  8. package/cjs/date/Date.locale.js +57 -0
  9. package/cjs/date/Date.locale.js.map +1 -0
  10. package/cjs/date/Date.typeutils.d.ts +14 -0
  11. package/cjs/date/Date.typeutils.js +15 -0
  12. package/cjs/date/Date.typeutils.js.map +1 -0
  13. package/cjs/date/date-utils/calendar-range.d.ts +11 -0
  14. package/cjs/date/date-utils/calendar-range.js +30 -0
  15. package/cjs/date/date-utils/calendar-range.js.map +1 -0
  16. package/cjs/date/date-utils/check-dates.d.ts +8 -0
  17. package/cjs/date/date-utils/check-dates.js +20 -0
  18. package/cjs/date/date-utils/check-dates.js.map +1 -0
  19. package/cjs/date/date-utils/clamp-dates.d.ts +19 -0
  20. package/cjs/date/date-utils/clamp-dates.js +41 -0
  21. package/cjs/date/date-utils/clamp-dates.js.map +1 -0
  22. package/cjs/date/date-utils/dates-disabled.d.ts +1 -0
  23. package/cjs/date/date-utils/dates-disabled.js +29 -0
  24. package/cjs/date/date-utils/dates-disabled.js.map +1 -0
  25. package/cjs/date/date-utils/dropdown-options.d.ts +13 -0
  26. package/cjs/date/date-utils/dropdown-options.js +45 -0
  27. package/cjs/date/date-utils/dropdown-options.js.map +1 -0
  28. package/cjs/date/date-utils/format-date.d.ts +2 -0
  29. package/cjs/date/date-utils/format-date.js +13 -0
  30. package/cjs/date/date-utils/format-date.js.map +1 -0
  31. package/cjs/date/date-utils/index.d.ts +8 -0
  32. package/cjs/date/date-utils/index.js +27 -0
  33. package/cjs/date/date-utils/index.js.map +1 -0
  34. package/cjs/date/date-utils/is-match.d.ts +3 -0
  35. package/cjs/date/date-utils/is-match.js +61 -0
  36. package/cjs/date/date-utils/is-match.js.map +1 -0
  37. package/cjs/date/date-utils/parse-date.d.ts +4 -0
  38. package/cjs/date/date-utils/parse-date.js +87 -0
  39. package/cjs/date/date-utils/parse-date.js.map +1 -0
  40. package/cjs/date/datepicker/DatePicker.d.ts +3 -3
  41. package/cjs/date/datepicker/DatePicker.js +47 -63
  42. package/cjs/date/datepicker/DatePicker.js.map +1 -1
  43. package/cjs/date/datepicker/DatePicker.types.d.ts +108 -0
  44. package/cjs/date/datepicker/DatePicker.types.js +3 -0
  45. package/cjs/date/datepicker/DatePicker.types.js.map +1 -0
  46. package/cjs/date/datepicker/hooks/useDatepicker.d.ts +90 -0
  47. package/cjs/date/datepicker/hooks/useDatepicker.js +164 -0
  48. package/cjs/date/datepicker/hooks/useDatepicker.js.map +1 -0
  49. package/cjs/date/datepicker/hooks/useRangeDatepicker.d.ts +76 -0
  50. package/cjs/date/datepicker/hooks/useRangeDatepicker.js +322 -0
  51. package/cjs/date/datepicker/hooks/useRangeDatepicker.js.map +1 -0
  52. package/cjs/date/datepicker/index.d.ts +4 -3
  53. package/cjs/date/datepicker/index.js +8 -7
  54. package/cjs/date/datepicker/index.js.map +1 -1
  55. package/cjs/date/datepicker/parts/DatePicker.DayButton.d.ts +9 -0
  56. package/cjs/date/datepicker/parts/DatePicker.DayButton.js +70 -0
  57. package/cjs/date/datepicker/parts/DatePicker.DayButton.js.map +1 -0
  58. package/cjs/date/datepicker/parts/DatePicker.Months.d.ts +11 -0
  59. package/cjs/date/datepicker/parts/DatePicker.Months.js +84 -0
  60. package/cjs/date/datepicker/parts/DatePicker.Months.js.map +1 -0
  61. package/cjs/date/datepicker/parts/DatePicker.RDP.d.ts +15 -0
  62. package/cjs/date/datepicker/parts/DatePicker.RDP.js +103 -0
  63. package/cjs/date/datepicker/parts/DatePicker.RDP.js.map +1 -0
  64. package/cjs/date/datepicker/parts/DatePicker.Standalone.d.ts +18 -0
  65. package/cjs/date/datepicker/parts/DatePicker.Standalone.js +60 -0
  66. package/cjs/date/datepicker/parts/DatePicker.Standalone.js.map +1 -0
  67. package/cjs/date/datepicker/parts/DatePicker.WeekNumber.d.ts +9 -0
  68. package/cjs/date/datepicker/parts/DatePicker.WeekNumber.js +64 -0
  69. package/cjs/date/datepicker/parts/DatePicker.WeekNumber.js.map +1 -0
  70. package/cjs/date/datepicker/parts/DatePicker.WeekRow.d.ts +8 -0
  71. package/cjs/date/datepicker/parts/DatePicker.WeekRow.js +28 -0
  72. package/cjs/date/datepicker/parts/DatePicker.WeekRow.js.map +1 -0
  73. package/cjs/date/monthpicker/MonthPicker.context.d.ts +21 -0
  74. package/cjs/date/monthpicker/MonthPicker.context.js +48 -0
  75. package/cjs/date/monthpicker/MonthPicker.context.js.map +1 -0
  76. package/cjs/date/monthpicker/MonthPicker.d.ts +3 -3
  77. package/cjs/date/monthpicker/MonthPicker.js +34 -43
  78. package/cjs/date/monthpicker/MonthPicker.js.map +1 -1
  79. package/cjs/date/monthpicker/MonthPicker.types.d.ts +86 -0
  80. package/cjs/date/monthpicker/MonthPicker.types.js +3 -0
  81. package/cjs/date/monthpicker/MonthPicker.types.js.map +1 -0
  82. package/cjs/date/monthpicker/MonthPicker.util.d.ts +2 -0
  83. package/cjs/date/monthpicker/MonthPicker.util.js +156 -0
  84. package/cjs/date/monthpicker/MonthPicker.util.js.map +1 -0
  85. package/cjs/date/monthpicker/hooks/useMonthPicker.d.ts +85 -0
  86. package/cjs/date/monthpicker/hooks/useMonthPicker.js +179 -0
  87. package/cjs/date/monthpicker/hooks/useMonthPicker.js.map +1 -0
  88. package/cjs/date/monthpicker/index.d.ts +4 -4
  89. package/cjs/date/monthpicker/index.js +6 -6
  90. package/cjs/date/monthpicker/index.js.map +1 -1
  91. package/cjs/date/monthpicker/parts/MonthPicker.Button.d.ts +11 -0
  92. package/cjs/date/monthpicker/parts/MonthPicker.Button.js +82 -0
  93. package/cjs/date/monthpicker/parts/MonthPicker.Button.js.map +1 -0
  94. package/cjs/date/monthpicker/parts/MonthPicker.Caption.d.ts +3 -0
  95. package/cjs/date/monthpicker/parts/MonthPicker.Caption.js +52 -0
  96. package/cjs/date/monthpicker/parts/MonthPicker.Caption.js.map +1 -0
  97. package/cjs/date/monthpicker/parts/MonthPicker.Standalone.d.ts +10 -0
  98. package/cjs/date/monthpicker/parts/MonthPicker.Standalone.js +51 -0
  99. package/cjs/date/monthpicker/parts/MonthPicker.Standalone.js.map +1 -0
  100. package/cjs/date/monthpicker/parts/MonthPicker.Table.d.ts +3 -0
  101. package/cjs/date/monthpicker/parts/MonthPicker.Table.js +79 -0
  102. package/cjs/date/monthpicker/parts/MonthPicker.Table.js.map +1 -0
  103. package/cjs/form/combobox/Combobox.d.ts +1 -1
  104. package/cjs/form/combobox/Input/InputController.d.ts +1 -1
  105. package/cjs/modal/Modal.js +2 -2
  106. package/cjs/modal/Modal.js.map +1 -1
  107. package/cjs/popover/Popover.js +3 -3
  108. package/cjs/popover/Popover.js.map +1 -1
  109. package/cjs/tooltip/Tooltip.js +2 -5
  110. package/cjs/tooltip/Tooltip.js.map +1 -1
  111. package/esm/date/Date.Dialog.d.ts +18 -0
  112. package/esm/date/Date.Dialog.js +38 -0
  113. package/esm/date/Date.Dialog.js.map +1 -0
  114. package/esm/date/Date.Input.d.ts +50 -0
  115. package/esm/date/Date.Input.js +66 -0
  116. package/esm/date/Date.Input.js.map +1 -0
  117. package/esm/date/Date.locale.d.ts +44 -0
  118. package/esm/date/Date.locale.js +47 -0
  119. package/esm/date/Date.locale.js.map +1 -0
  120. package/esm/date/Date.typeutils.d.ts +14 -0
  121. package/esm/date/Date.typeutils.js +10 -0
  122. package/esm/date/Date.typeutils.js.map +1 -0
  123. package/esm/date/date-utils/calendar-range.d.ts +11 -0
  124. package/esm/date/date-utils/calendar-range.js +27 -0
  125. package/esm/date/date-utils/calendar-range.js.map +1 -0
  126. package/esm/date/date-utils/check-dates.d.ts +8 -0
  127. package/esm/date/date-utils/check-dates.js +14 -0
  128. package/esm/date/date-utils/check-dates.js.map +1 -0
  129. package/esm/date/date-utils/clamp-dates.d.ts +19 -0
  130. package/esm/date/date-utils/clamp-dates.js +37 -0
  131. package/esm/date/date-utils/clamp-dates.js.map +1 -0
  132. package/esm/date/date-utils/dates-disabled.d.ts +1 -0
  133. package/esm/date/date-utils/dates-disabled.js +25 -0
  134. package/esm/date/date-utils/dates-disabled.js.map +1 -0
  135. package/esm/date/date-utils/dropdown-options.d.ts +13 -0
  136. package/esm/date/date-utils/dropdown-options.js +41 -0
  137. package/esm/date/date-utils/dropdown-options.js.map +1 -0
  138. package/esm/date/date-utils/format-date.d.ts +2 -0
  139. package/esm/date/date-utils/format-date.js +9 -0
  140. package/esm/date/date-utils/format-date.js.map +1 -0
  141. package/esm/date/date-utils/index.d.ts +8 -0
  142. package/esm/date/date-utils/index.js +9 -0
  143. package/esm/date/date-utils/index.js.map +1 -0
  144. package/esm/date/date-utils/is-match.d.ts +3 -0
  145. package/esm/date/date-utils/is-match.js +57 -0
  146. package/esm/date/date-utils/is-match.js.map +1 -0
  147. package/esm/date/date-utils/parse-date.d.ts +4 -0
  148. package/esm/date/date-utils/parse-date.js +83 -0
  149. package/esm/date/date-utils/parse-date.js.map +1 -0
  150. package/esm/date/datepicker/DatePicker.d.ts +3 -3
  151. package/esm/date/datepicker/DatePicker.js +46 -62
  152. package/esm/date/datepicker/DatePicker.js.map +1 -1
  153. package/esm/date/datepicker/DatePicker.types.d.ts +108 -0
  154. package/esm/date/datepicker/DatePicker.types.js +2 -0
  155. package/esm/date/datepicker/DatePicker.types.js.map +1 -0
  156. package/esm/date/datepicker/hooks/useDatepicker.d.ts +90 -0
  157. package/esm/date/datepicker/hooks/useDatepicker.js +160 -0
  158. package/esm/date/datepicker/hooks/useDatepicker.js.map +1 -0
  159. package/esm/date/datepicker/hooks/useRangeDatepicker.d.ts +76 -0
  160. package/esm/date/datepicker/hooks/useRangeDatepicker.js +318 -0
  161. package/esm/date/datepicker/hooks/useRangeDatepicker.js.map +1 -0
  162. package/esm/date/datepicker/index.d.ts +4 -3
  163. package/esm/date/datepicker/index.js +4 -3
  164. package/esm/date/datepicker/index.js.map +1 -1
  165. package/esm/date/datepicker/parts/DatePicker.DayButton.d.ts +9 -0
  166. package/esm/date/datepicker/parts/DatePicker.DayButton.js +41 -0
  167. package/esm/date/datepicker/parts/DatePicker.DayButton.js.map +1 -0
  168. package/esm/date/datepicker/parts/DatePicker.Months.d.ts +11 -0
  169. package/esm/date/datepicker/parts/DatePicker.Months.js +58 -0
  170. package/esm/date/datepicker/parts/DatePicker.Months.js.map +1 -0
  171. package/esm/date/datepicker/parts/DatePicker.RDP.d.ts +15 -0
  172. package/esm/date/datepicker/parts/DatePicker.RDP.js +74 -0
  173. package/esm/date/datepicker/parts/DatePicker.RDP.js.map +1 -0
  174. package/esm/date/datepicker/parts/DatePicker.Standalone.d.ts +18 -0
  175. package/esm/date/datepicker/parts/DatePicker.Standalone.js +31 -0
  176. package/esm/date/datepicker/parts/DatePicker.Standalone.js.map +1 -0
  177. package/esm/date/datepicker/parts/DatePicker.WeekNumber.d.ts +9 -0
  178. package/esm/date/datepicker/parts/DatePicker.WeekNumber.js +35 -0
  179. package/esm/date/datepicker/parts/DatePicker.WeekNumber.js.map +1 -0
  180. package/esm/date/datepicker/parts/DatePicker.WeekRow.d.ts +8 -0
  181. package/esm/date/datepicker/parts/DatePicker.WeekRow.js +22 -0
  182. package/esm/date/datepicker/parts/DatePicker.WeekRow.js.map +1 -0
  183. package/esm/date/monthpicker/MonthPicker.context.d.ts +21 -0
  184. package/esm/date/monthpicker/MonthPicker.context.js +41 -0
  185. package/esm/date/monthpicker/MonthPicker.context.js.map +1 -0
  186. package/esm/date/monthpicker/MonthPicker.d.ts +3 -3
  187. package/esm/date/monthpicker/MonthPicker.js +31 -40
  188. package/esm/date/monthpicker/MonthPicker.js.map +1 -1
  189. package/esm/date/monthpicker/MonthPicker.types.d.ts +86 -0
  190. package/esm/date/monthpicker/MonthPicker.types.js +2 -0
  191. package/esm/date/monthpicker/MonthPicker.types.js.map +1 -0
  192. package/esm/date/monthpicker/MonthPicker.util.d.ts +2 -0
  193. package/esm/date/monthpicker/MonthPicker.util.js +152 -0
  194. package/esm/date/monthpicker/MonthPicker.util.js.map +1 -0
  195. package/esm/date/monthpicker/hooks/useMonthPicker.d.ts +85 -0
  196. package/esm/date/monthpicker/hooks/useMonthPicker.js +175 -0
  197. package/esm/date/monthpicker/hooks/useMonthPicker.js.map +1 -0
  198. package/esm/date/monthpicker/index.d.ts +4 -4
  199. package/esm/date/monthpicker/index.js +3 -3
  200. package/esm/date/monthpicker/index.js.map +1 -1
  201. package/esm/date/monthpicker/parts/MonthPicker.Button.d.ts +11 -0
  202. package/esm/date/monthpicker/parts/MonthPicker.Button.js +52 -0
  203. package/esm/date/monthpicker/parts/MonthPicker.Button.js.map +1 -0
  204. package/esm/date/monthpicker/parts/MonthPicker.Caption.d.ts +3 -0
  205. package/esm/date/monthpicker/parts/MonthPicker.Caption.js +46 -0
  206. package/esm/date/monthpicker/parts/MonthPicker.Caption.js.map +1 -0
  207. package/esm/date/monthpicker/parts/MonthPicker.Standalone.d.ts +10 -0
  208. package/esm/date/monthpicker/parts/MonthPicker.Standalone.js +22 -0
  209. package/esm/date/monthpicker/parts/MonthPicker.Standalone.js.map +1 -0
  210. package/esm/date/monthpicker/parts/MonthPicker.Table.d.ts +3 -0
  211. package/esm/date/monthpicker/parts/MonthPicker.Table.js +50 -0
  212. package/esm/date/monthpicker/parts/MonthPicker.Table.js.map +1 -0
  213. package/esm/form/combobox/Combobox.d.ts +1 -1
  214. package/esm/form/combobox/Input/InputController.d.ts +1 -1
  215. package/esm/modal/Modal.js +3 -3
  216. package/esm/modal/Modal.js.map +1 -1
  217. package/esm/popover/Popover.js +4 -4
  218. package/esm/popover/Popover.js.map +1 -1
  219. package/esm/tooltip/Tooltip.js +2 -5
  220. package/esm/tooltip/Tooltip.js.map +1 -1
  221. package/package.json +6 -7
  222. package/src/date/{parts/DateWrapper.tsx → Date.Dialog.tsx} +12 -9
  223. package/src/date/{parts/DateInput.tsx → Date.Input.tsx} +30 -5
  224. package/src/date/{utils/locale.ts → Date.locale.ts} +11 -2
  225. package/src/date/Date.typeutils.ts +32 -0
  226. package/src/date/date-utils/calendar-range.test.ts +54 -0
  227. package/src/date/date-utils/calendar-range.ts +46 -0
  228. package/src/date/date-utils/check-dates.test.ts +49 -0
  229. package/src/date/date-utils/check-dates.ts +28 -0
  230. package/src/date/date-utils/clamp-dates.test.ts +156 -0
  231. package/src/date/date-utils/clamp-dates.ts +63 -0
  232. package/src/date/{utils/__tests__ → date-utils}/dates-disabled.test.ts +1 -1
  233. package/src/date/{utils → date-utils}/dates-disabled.ts +1 -2
  234. package/src/date/date-utils/dropdown-options.test.ts +143 -0
  235. package/src/date/date-utils/dropdown-options.ts +79 -0
  236. package/src/date/{utils/__tests__ → date-utils}/format-dates.test.ts +2 -2
  237. package/src/date/date-utils/index.ts +16 -0
  238. package/src/date/{utils/__tests__ → date-utils}/is-match.test.ts +1 -1
  239. package/src/date/{utils → date-utils}/is-match.ts +2 -11
  240. package/src/date/{utils/__tests__ → date-utils}/parse-dates.test.ts +2 -1
  241. package/src/date/datepicker/DatePicker.tsx +67 -92
  242. package/src/date/datepicker/{types.ts → DatePicker.types.ts} +10 -4
  243. package/src/date/{hooks → datepicker/hooks}/useDatepicker.tsx +12 -13
  244. package/src/date/{hooks → datepicker/hooks}/useRangeDatepicker.test.tsx +1 -1
  245. package/src/date/{hooks → datepicker/hooks}/useRangeDatepicker.tsx +19 -19
  246. package/src/date/datepicker/index.ts +4 -5
  247. package/src/date/datepicker/parts/DatePicker.DayButton.tsx +56 -0
  248. package/src/date/datepicker/parts/DatePicker.Months.tsx +149 -0
  249. package/src/date/datepicker/parts/DatePicker.RDP.tsx +170 -0
  250. package/src/date/datepicker/parts/DatePicker.Standalone.tsx +93 -0
  251. package/src/date/datepicker/parts/DatePicker.WeekNumber.tsx +86 -0
  252. package/src/date/datepicker/parts/{WeekRow.tsx → DatePicker.WeekRow.tsx} +20 -21
  253. package/src/date/monthpicker/MonthPicker.context.tsx +103 -0
  254. package/src/date/monthpicker/MonthPicker.tsx +63 -68
  255. package/src/date/monthpicker/{types.ts → MonthPicker.types.ts} +1 -1
  256. package/src/date/{utils/navigation.ts → monthpicker/MonthPicker.util.ts} +2 -1
  257. package/src/date/{hooks → monthpicker/hooks}/useMonthPicker.tsx +14 -13
  258. package/src/date/monthpicker/index.ts +4 -4
  259. package/src/date/monthpicker/{MonthButton.tsx → parts/MonthPicker.Button.tsx} +21 -10
  260. package/src/date/monthpicker/{MonthCaption.tsx → parts/MonthPicker.Caption.tsx} +20 -21
  261. package/src/date/monthpicker/parts/MonthPicker.Standalone.tsx +86 -0
  262. package/src/date/monthpicker/{MonthSelector.tsx → parts/MonthPicker.Table.tsx} +7 -7
  263. package/src/modal/Modal.tsx +3 -3
  264. package/src/popover/Popover.tsx +4 -4
  265. package/src/tooltip/Tooltip.tsx +2 -6
  266. package/src/date/context/index.ts +0 -9
  267. package/src/date/context/useDateInputContext.tsx +0 -34
  268. package/src/date/context/useDateTranslationContext.ts +0 -9
  269. package/src/date/context/useSharedMonthContext.tsx +0 -68
  270. package/src/date/datepicker/DatePickerStandalone.tsx +0 -136
  271. package/src/date/datepicker/datepicker.test.tsx +0 -28
  272. package/src/date/datepicker/parts/Caption.tsx +0 -54
  273. package/src/date/datepicker/parts/DayButton.tsx +0 -32
  274. package/src/date/datepicker/parts/DropdownCaption.tsx +0 -110
  275. package/src/date/datepicker/parts/HeadRow.tsx +0 -56
  276. package/src/date/datepicker/parts/Row.tsx +0 -48
  277. package/src/date/datepicker/parts/TableHead.tsx +0 -17
  278. package/src/date/datepicker/parts/WeekNumber.tsx +0 -75
  279. package/src/date/hooks/index.ts +0 -6
  280. package/src/date/monthpicker/MonthPickerStandalone.tsx +0 -102
  281. package/src/date/utils/__tests__/check-dates.test.ts +0 -22
  282. package/src/date/utils/__tests__/get-dates.test.ts +0 -121
  283. package/src/date/utils/__tests__/get-initial-year.test.ts +0 -83
  284. package/src/date/utils/__tests__/get-month-weeks.test.ts +0 -116
  285. package/src/date/utils/check-dates.ts +0 -13
  286. package/src/date/utils/get-dates.ts +0 -60
  287. package/src/date/utils/get-initial-year.ts +0 -25
  288. package/src/date/utils/get-month-weeks.ts +0 -93
  289. package/src/date/utils/index.ts +0 -18
  290. /package/src/date/{utils → date-utils}/format-date.ts +0 -0
  291. /package/src/date/{utils → date-utils}/parse-date.ts +0 -0
@@ -0,0 +1,49 @@
1
+ import { setYear } from "date-fns";
2
+ import { describe, expect, test } from "vitest";
3
+ import { dateIsInCurrentMonth, isValidDate } from "./check-dates";
4
+
5
+ describe("dateIsInCurrentMonth", () => {
6
+ test("should return true if the date is in the same month and year as the date to compare", () => {
7
+ const date = new Date();
8
+ const dateToCompare = new Date();
9
+ expect(dateIsInCurrentMonth(date, dateToCompare)).toBe(true);
10
+ });
11
+
12
+ test("should return false if the date is not in the same month as the date to compare", () => {
13
+ const date = new Date();
14
+ const dateToCompare = new Date(2023, 9, 1); // October 1, 2023
15
+ expect(dateIsInCurrentMonth(date, dateToCompare)).toBe(false);
16
+ });
17
+
18
+ test("should return false if the date is in the same month but different year as the date to compare", () => {
19
+ const date = new Date();
20
+ const dateToCompare = new Date();
21
+ expect(
22
+ dateIsInCurrentMonth(
23
+ date,
24
+ setYear(dateToCompare, dateToCompare.getFullYear() + 1),
25
+ ),
26
+ ).toBe(false);
27
+ });
28
+ });
29
+
30
+ describe("isValidDate", () => {
31
+ test("should return true for a valid date", () => {
32
+ const date = new Date(2023, 9, 15); // October 15, 2023
33
+ expect(isValidDate(date)).toBe(true);
34
+ });
35
+
36
+ test("should return false for an invalid date", () => {
37
+ const date = new Date("invalid date");
38
+ expect(isValidDate(date)).toBe(false);
39
+ });
40
+
41
+ test("should return false for a date with year less than 1000", () => {
42
+ const date = new Date(999, 9, 15); // October 15, 999
43
+ expect(isValidDate(date)).toBe(false);
44
+ });
45
+
46
+ test("should return false for undefined", () => {
47
+ expect(isValidDate(undefined)).toBe(false);
48
+ });
49
+ });
@@ -0,0 +1,28 @@
1
+ import { differenceInCalendarDays, isThisMonth, setYear } from "date-fns";
2
+
3
+ export const dateIsInCurrentMonth = (
4
+ date: Date,
5
+ dateToCompare: Date,
6
+ ): boolean => {
7
+ return isThisMonth(setYear(date, Number(dateToCompare.getFullYear())));
8
+ };
9
+
10
+ /** @private */
11
+ export function isValidDate(day?: Date): boolean {
12
+ return !!(day && !Number.isNaN(day.getTime()) && day.getFullYear() > 999);
13
+ }
14
+
15
+ export function isDateOutsideRange({
16
+ day,
17
+ fromDate,
18
+ toDate,
19
+ }: {
20
+ day: Date;
21
+ fromDate?: Date;
22
+ toDate?: Date;
23
+ }): boolean {
24
+ const isDateAfter = toDate && differenceInCalendarDays(day, toDate) > 0;
25
+ const isDateBefore = fromDate && differenceInCalendarDays(fromDate, day) > 0;
26
+
27
+ return isDateAfter || isDateBefore || false;
28
+ }
@@ -0,0 +1,156 @@
1
+ import { startOfMonth, startOfYear } from "date-fns";
2
+ import { describe, expect, test } from "vitest";
3
+ import { isDateOutsideRange } from "./check-dates";
4
+ import { clampDisplayMonth, clampDisplayYear } from "./clamp-dates";
5
+
6
+ describe("clampDisplayMonth", () => {
7
+ test("should return undefined if month is not provided", () => {
8
+ expect(
9
+ clampDisplayMonth({ start: new Date(), end: new Date() }),
10
+ ).toBeUndefined();
11
+ });
12
+
13
+ test("should return the start of the month if month is before start", () => {
14
+ const start = new Date(2023, 5, 1);
15
+ const month = new Date(2023, 4, 1);
16
+ expect(clampDisplayMonth({ month, start, end: new Date() })).toEqual(
17
+ startOfMonth(start),
18
+ );
19
+ });
20
+
21
+ test("should return the start of end month if month is after end", () => {
22
+ const end = new Date(2023, 5, 1);
23
+ const month = new Date(2023, 6, 1);
24
+ expect(clampDisplayMonth({ month, start: new Date(), end })).toEqual(
25
+ startOfMonth(end),
26
+ );
27
+ });
28
+
29
+ test("should return the start of the month if month is within range", () => {
30
+ const month = new Date(2023, 5, 1);
31
+ expect(
32
+ clampDisplayMonth({
33
+ month,
34
+ start: new Date(2023, 4, 1),
35
+ end: new Date(2023, 6, 1),
36
+ }),
37
+ ).toEqual(startOfMonth(month));
38
+ });
39
+ });
40
+
41
+ describe("clampDisplayYear", () => {
42
+ test("should return undefined if month is not provided", () => {
43
+ expect(
44
+ clampDisplayYear({ start: new Date(), end: new Date() }),
45
+ ).toBeUndefined();
46
+ });
47
+
48
+ test("should return the start of the year if month is before start year", () => {
49
+ const start = new Date(2023, 0, 1);
50
+ const month = new Date(2022, 11, 1);
51
+ expect(clampDisplayYear({ month, start, end: new Date() })).toEqual(
52
+ startOfYear(start),
53
+ );
54
+ });
55
+
56
+ test("should return the start of the year if month is after end year", () => {
57
+ const end = new Date(2023, 0, 1);
58
+ const month = new Date(2024, 0, 1);
59
+ expect(clampDisplayYear({ month, start: new Date(), end })).toEqual(
60
+ startOfYear(end),
61
+ );
62
+ });
63
+
64
+ test("should return the start of the year if month is within range", () => {
65
+ const month = new Date(2023, 5, 1);
66
+ expect(
67
+ clampDisplayYear({
68
+ month,
69
+ start: new Date(2022, 0, 1),
70
+ end: new Date(2024, 0, 1),
71
+ }),
72
+ ).toEqual(startOfYear(month));
73
+ });
74
+ });
75
+
76
+ describe("isDateOutsideRange", () => {
77
+ test("returns false when day is within range", () => {
78
+ const day = new Date(2023, 5, 15);
79
+ const fromDate = new Date(2023, 0, 1);
80
+ const toDate = new Date(2023, 11, 31);
81
+
82
+ expect(isDateOutsideRange({ day, fromDate, toDate })).toBe(false);
83
+ });
84
+
85
+ test("returns true when day is after toDate", () => {
86
+ const day = new Date(2024, 0, 1);
87
+ const fromDate = new Date(2023, 0, 1);
88
+ const toDate = new Date(2023, 11, 31);
89
+
90
+ expect(isDateOutsideRange({ day, fromDate, toDate })).toBe(true);
91
+ });
92
+
93
+ test("returns true when day is before fromDate", () => {
94
+ const day = new Date(2022, 11, 31);
95
+ const fromDate = new Date(2023, 0, 1);
96
+ const toDate = new Date(2023, 11, 31);
97
+
98
+ expect(isDateOutsideRange({ day, fromDate, toDate })).toBe(true);
99
+ });
100
+
101
+ test("returns false when fromDate and toDate are not provided", () => {
102
+ const day = new Date(2023, 5, 15);
103
+
104
+ expect(isDateOutsideRange({ day })).toBe(false);
105
+ });
106
+
107
+ test("returns true when only toDate is provided and day is after toDate", () => {
108
+ const day = new Date(2024, 0, 1);
109
+ const toDate = new Date(2023, 11, 31);
110
+
111
+ expect(isDateOutsideRange({ day, toDate })).toBe(true);
112
+ });
113
+
114
+ test("returns false when only toDate is provided and day is before toDate", () => {
115
+ const day = new Date(2023, 5, 15);
116
+ const toDate = new Date(2023, 11, 31);
117
+
118
+ expect(isDateOutsideRange({ day, toDate })).toBe(false);
119
+ });
120
+
121
+ test("returns true when only fromDate is provided and day is before fromDate", () => {
122
+ const day = new Date(2022, 11, 31);
123
+ const fromDate = new Date(2023, 0, 1);
124
+
125
+ expect(isDateOutsideRange({ day, fromDate })).toBe(true);
126
+ });
127
+
128
+ test("returns false when only fromDate is provided and day is after fromDate", () => {
129
+ const day = new Date(2023, 5, 15);
130
+ const fromDate = new Date(2023, 0, 1);
131
+
132
+ expect(isDateOutsideRange({ day, fromDate })).toBe(false);
133
+ });
134
+
135
+ test("returns false when day is identical to fromDate", () => {
136
+ const day = new Date(2023, 0, 1);
137
+ const fromDate = new Date(2023, 0, 1);
138
+
139
+ expect(isDateOutsideRange({ day, fromDate })).toBe(false);
140
+ });
141
+
142
+ test("returns false when day is identical to toDate", () => {
143
+ const day = new Date(2023, 11, 31);
144
+ const toDate = new Date(2023, 11, 31);
145
+
146
+ expect(isDateOutsideRange({ day, toDate })).toBe(false);
147
+ });
148
+
149
+ test("returns false when day is identical to both fromDate and toDate", () => {
150
+ const day = new Date(2023, 5, 15);
151
+ const fromDate = new Date(2023, 5, 15);
152
+ const toDate = new Date(2023, 5, 15);
153
+
154
+ expect(isDateOutsideRange({ day, fromDate, toDate })).toBe(false);
155
+ });
156
+ });
@@ -0,0 +1,63 @@
1
+ import { isAfter, isBefore, startOfMonth, startOfYear } from "date-fns";
2
+
3
+ /**
4
+ * Makes sure the month is within the min and max daterange to avoid showing disabled months
5
+ * @note We do not warn the user if start > end now
6
+ */
7
+ const clampDisplayMonth = ({
8
+ month,
9
+ start,
10
+ end,
11
+ }: {
12
+ month?: Date;
13
+ start?: Date;
14
+ end?: Date;
15
+ }): Date | undefined => {
16
+ if (!month) {
17
+ return undefined;
18
+ }
19
+
20
+ let monthToShow = month;
21
+
22
+ if (start && isBefore(monthToShow, start)) {
23
+ monthToShow = start;
24
+ }
25
+
26
+ if (end && isAfter(monthToShow, end)) {
27
+ monthToShow = end;
28
+ }
29
+
30
+ return startOfMonth(monthToShow);
31
+ };
32
+
33
+ /**
34
+ * Makes sure the month is within the min and max daterange to avoid showing disabled months
35
+ * @note We do not warn the user if start > end now
36
+ */
37
+ const clampDisplayYear = ({
38
+ month,
39
+ start,
40
+ end,
41
+ }: {
42
+ month?: Date;
43
+ start?: Date;
44
+ end?: Date;
45
+ }): Date | undefined => {
46
+ if (!month) {
47
+ return undefined;
48
+ }
49
+
50
+ let monthToShow = month;
51
+
52
+ if (start && monthToShow.getFullYear() < start.getFullYear()) {
53
+ monthToShow = start;
54
+ }
55
+
56
+ if (end && monthToShow.getFullYear() > end.getFullYear()) {
57
+ monthToShow = end;
58
+ }
59
+
60
+ return startOfYear(monthToShow);
61
+ };
62
+
63
+ export { clampDisplayYear, clampDisplayMonth };
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, test } from "vitest";
2
- import { disableDate } from "..";
2
+ import { disableDate } from "./dates-disabled";
3
3
 
4
4
  describe("Returns if date should be disabled", () => {
5
5
  test("Should be disabled using Date (true)", () => {
@@ -1,7 +1,6 @@
1
1
  import { isSameDay } from "date-fns";
2
- import { isDateRange } from "react-day-picker";
2
+ import { isDateRange } from "../Date.typeutils";
3
3
 
4
- // TODO: ((date: Date) => boolean)
5
4
  export const disableDate = (
6
5
  disabledSelection: Date | any[],
7
6
  date: Date,
@@ -0,0 +1,143 @@
1
+ import { nb } from "date-fns/locale";
2
+ import { describe, expect, test } from "vitest";
3
+ import { getMonthOptions, getYearOptions } from "./dropdown-options";
4
+
5
+ describe("getYearOptions", () => {
6
+ test("should return undefined if navStart is undefined", () => {
7
+ const result = getYearOptions(undefined, new Date(), nb);
8
+ expect(result).toBeUndefined();
9
+ });
10
+
11
+ test("should return undefined if navEnd is undefined", () => {
12
+ const result = getYearOptions(new Date(), undefined, nb);
13
+ expect(result).toBeUndefined();
14
+ });
15
+
16
+ test("should return the correct year options within the interval", () => {
17
+ const navStart = new Date(2020, 0, 1); // Januar 1, 2020
18
+ const navEnd = new Date(2022, 11, 31); // Desember 31, 2022
19
+ const result = getYearOptions(navStart, navEnd, nb);
20
+
21
+ const expected = [
22
+ { value: 2020, label: "2020", disabled: false },
23
+ { value: 2021, label: "2021", disabled: false },
24
+ { value: 2022, label: "2022", disabled: false },
25
+ ];
26
+
27
+ expect(result).toEqual(expected);
28
+ });
29
+
30
+ test("should return the correct year options for a single year", () => {
31
+ const navStart = new Date(2021, 0, 1); // Januar 1, 2021
32
+ const navEnd = new Date(2021, 11, 31); // Desember 31, 2021
33
+ const result = getYearOptions(navStart, navEnd, nb);
34
+
35
+ const expected = [{ value: 2021, label: "2021", disabled: false }];
36
+
37
+ expect(result).toEqual(expected);
38
+ });
39
+
40
+ test("should return the correct year options when navStart and navEnd are the same date", () => {
41
+ const navStart = new Date(2021, 0, 1); // Januar 1, 2021
42
+ const navEnd = new Date(2021, 0, 1); // Januar 1, 2021
43
+ const result = getYearOptions(navStart, navEnd, nb);
44
+
45
+ const expected = [{ value: 2021, label: "2021", disabled: false }];
46
+
47
+ expect(result).toEqual(expected);
48
+ });
49
+ });
50
+
51
+ describe("getMonthOptions", () => {
52
+ test("should return the correct month options for the given year", () => {
53
+ const displayMonth = new Date(2021, 0, 1); // Januar 1, 2021
54
+ const result = getMonthOptions(displayMonth, undefined, undefined, nb);
55
+
56
+ const expected = [
57
+ { value: 0, label: "januar", disabled: false },
58
+ { value: 1, label: "februar", disabled: false },
59
+ { value: 2, label: "mars", disabled: false },
60
+ { value: 3, label: "april", disabled: false },
61
+ { value: 4, label: "mai", disabled: false },
62
+ { value: 5, label: "juni", disabled: false },
63
+ { value: 6, label: "juli", disabled: false },
64
+ { value: 7, label: "august", disabled: false },
65
+ { value: 8, label: "september", disabled: false },
66
+ { value: 9, label: "oktober", disabled: false },
67
+ { value: 10, label: "november", disabled: false },
68
+ { value: 11, label: "desember", disabled: false },
69
+ ];
70
+
71
+ expect(result).toEqual(expected);
72
+ });
73
+
74
+ test("should disable months before navStart", () => {
75
+ const displayMonth = new Date(2021, 0, 1); // Januar 1, 2021
76
+ const navStart = new Date(2021, 5, 1); // Juni 1, 2021
77
+ const result = getMonthOptions(displayMonth, navStart, undefined, nb);
78
+
79
+ const expected = [
80
+ { value: 0, label: "januar", disabled: true },
81
+ { value: 1, label: "februar", disabled: true },
82
+ { value: 2, label: "mars", disabled: true },
83
+ { value: 3, label: "april", disabled: true },
84
+ { value: 4, label: "mai", disabled: true },
85
+ { value: 5, label: "juni", disabled: false },
86
+ { value: 6, label: "juli", disabled: false },
87
+ { value: 7, label: "august", disabled: false },
88
+ { value: 8, label: "september", disabled: false },
89
+ { value: 9, label: "oktober", disabled: false },
90
+ { value: 10, label: "november", disabled: false },
91
+ { value: 11, label: "desember", disabled: false },
92
+ ];
93
+
94
+ expect(result).toEqual(expected);
95
+ });
96
+
97
+ test("should disable months after navEnd", () => {
98
+ const displayMonth = new Date(2021, 0, 1); // Januar 1, 2021
99
+ const navEnd = new Date(2021, 5, 1); // Juni 1, 2021
100
+ const result = getMonthOptions(displayMonth, undefined, navEnd, nb);
101
+
102
+ const expected = [
103
+ { value: 0, label: "januar", disabled: false },
104
+ { value: 1, label: "februar", disabled: false },
105
+ { value: 2, label: "mars", disabled: false },
106
+ { value: 3, label: "april", disabled: false },
107
+ { value: 4, label: "mai", disabled: false },
108
+ { value: 5, label: "juni", disabled: false },
109
+ { value: 6, label: "juli", disabled: true },
110
+ { value: 7, label: "august", disabled: true },
111
+ { value: 8, label: "september", disabled: true },
112
+ { value: 9, label: "oktober", disabled: true },
113
+ { value: 10, label: "november", disabled: true },
114
+ { value: 11, label: "desember", disabled: true },
115
+ ];
116
+
117
+ expect(result).toEqual(expected);
118
+ });
119
+
120
+ test("should disable months before navStart and after navEnd", () => {
121
+ const displayMonth = new Date(2021, 0, 1); // Januar 1, 2021
122
+ const navStart = new Date(2021, 3, 1); // April 1, 2021
123
+ const navEnd = new Date(2021, 8, 1); // September 1, 2021
124
+ const result = getMonthOptions(displayMonth, navStart, navEnd, nb);
125
+
126
+ const expected = [
127
+ { value: 0, label: "januar", disabled: true },
128
+ { value: 1, label: "februar", disabled: true },
129
+ { value: 2, label: "mars", disabled: true },
130
+ { value: 3, label: "april", disabled: false },
131
+ { value: 4, label: "mai", disabled: false },
132
+ { value: 5, label: "juni", disabled: false },
133
+ { value: 6, label: "juli", disabled: false },
134
+ { value: 7, label: "august", disabled: false },
135
+ { value: 8, label: "september", disabled: false },
136
+ { value: 9, label: "oktober", disabled: true },
137
+ { value: 10, label: "november", disabled: true },
138
+ { value: 11, label: "desember", disabled: true },
139
+ ];
140
+
141
+ expect(result).toEqual(expected);
142
+ });
143
+ });
@@ -0,0 +1,79 @@
1
+ import {
2
+ Locale,
3
+ addYears,
4
+ eachMonthOfInterval,
5
+ endOfYear,
6
+ format,
7
+ getMonth,
8
+ getYear,
9
+ isBefore,
10
+ isSameYear,
11
+ startOfMonth,
12
+ startOfYear,
13
+ } from "date-fns";
14
+
15
+ /** Return the months to show in the dropdown. */
16
+ export function getMonthOptions(
17
+ displayMonth: Date,
18
+ navStart: Date | undefined,
19
+ navEnd: Date | undefined,
20
+ locale: Locale,
21
+ ):
22
+ | {
23
+ value: number;
24
+ label: string;
25
+ disabled: boolean;
26
+ }[]
27
+ | undefined {
28
+ const months = eachMonthOfInterval({
29
+ start: startOfYear(displayMonth),
30
+ end: endOfYear(displayMonth),
31
+ });
32
+
33
+ const options = months.map((month) => {
34
+ const label = format(month, "LLLL", { locale });
35
+ const value = getMonth(month);
36
+ const disabled =
37
+ (navStart && month < startOfMonth(navStart)) ||
38
+ (navEnd && month > startOfMonth(navEnd)) ||
39
+ false;
40
+ return { value, label, disabled };
41
+ });
42
+
43
+ return options;
44
+ }
45
+
46
+ /** Return the years to show in the dropdown. */
47
+ export function getYearOptions(
48
+ navStart: Date | undefined,
49
+ navEnd: Date | undefined,
50
+ locale: Locale,
51
+ ):
52
+ | {
53
+ value: number;
54
+ label: string;
55
+ disabled: boolean;
56
+ }[]
57
+ | undefined {
58
+ if (!navStart) return undefined;
59
+ if (!navEnd) return undefined;
60
+
61
+ const firstNavYear = startOfYear(navStart);
62
+ const lastNavYear = endOfYear(navEnd);
63
+ const years: Date[] = [];
64
+
65
+ let year = firstNavYear;
66
+ while (isBefore(year, lastNavYear) || isSameYear(year, lastNavYear)) {
67
+ years.push(year);
68
+ year = addYears(year, 1);
69
+ }
70
+
71
+ return years.map((_year) => {
72
+ const label = format(_year, "yyyy", { locale });
73
+ return {
74
+ value: getYear(_year),
75
+ label,
76
+ disabled: false,
77
+ };
78
+ });
79
+ }
@@ -1,7 +1,7 @@
1
1
  import { nb } from "date-fns/locale";
2
2
  import { describe, expect, test } from "vitest";
3
- import { formatDateForInput } from "../format-date";
4
- import { parseDate } from "../parse-date";
3
+ import { formatDateForInput } from "./format-date";
4
+ import { parseDate } from "./parse-date";
5
5
 
6
6
  const parse = (inp: string) => parseDate(inp, new Date(), nb, "date", false);
7
7
  const parseTwoDigit = (inp: string) =>
@@ -0,0 +1,16 @@
1
+ export { formatDateForInput } from "./format-date";
2
+ export {
3
+ INPUT_DATE_STRING_FORMAT_DATE,
4
+ INPUT_DATE_STRING_FORMAT_MONTH,
5
+ parseDate,
6
+ } from "./parse-date";
7
+ export { disableDate } from "./dates-disabled";
8
+ export {
9
+ dateIsInCurrentMonth,
10
+ isValidDate,
11
+ isDateOutsideRange,
12
+ } from "./check-dates";
13
+ export { isMatch, isDateInRange } from "./is-match";
14
+ export { clampDisplayMonth, clampDisplayYear } from "./clamp-dates";
15
+ export { getMonthOptions, getYearOptions } from "./dropdown-options";
16
+ export { calendarRange } from "./calendar-range";
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, test } from "vitest";
2
- import { isMatch } from "..";
2
+ import { isMatch } from "./is-match";
3
3
 
4
4
  const disabled = [
5
5
  new Date("Sep 8 2022"),
@@ -5,21 +5,12 @@ import {
5
5
  isSameMonth,
6
6
  } from "date-fns";
7
7
  import {
8
- DateAfter,
9
- DateBefore,
10
8
  DateRange,
9
+ Matcher,
11
10
  isDateAfterType,
12
11
  isDateBeforeType,
13
12
  isDateRange,
14
- } from "react-day-picker";
15
-
16
- export type Matcher =
17
- | ((date: Date) => boolean)
18
- | Date
19
- | Date[]
20
- | DateRange
21
- | DateBefore
22
- | DateAfter;
13
+ } from "../Date.typeutils";
23
14
 
24
15
  function isDateType(value: unknown): value is Date {
25
16
  return isDate(value);
@@ -1,7 +1,8 @@
1
1
  import { getMonth } from "date-fns";
2
2
  import { nb } from "date-fns/locale";
3
3
  import { describe, expect, test } from "vitest";
4
- import { isValidDate, parseDate } from "..";
4
+ import { isValidDate } from "./check-dates";
5
+ import { parseDate } from "./parse-date";
5
6
 
6
7
  const check = (inp: string) =>
7
8
  // eslint-disable-next-line @vitest/valid-expect