@navikt/ds-react 2.8.8 → 2.8.10

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 (86) hide show
  1. package/_docs.json +62 -62
  2. package/cjs/date/DateInput.js +2 -2
  3. package/cjs/date/context/index.js +9 -0
  4. package/cjs/date/context/package.json +6 -0
  5. package/cjs/date/datepicker/DatePicker.js +4 -4
  6. package/cjs/date/datepicker/DatePickerStandalone.js +2 -2
  7. package/cjs/date/datepicker/{Head.js → TableHead.js} +3 -3
  8. package/cjs/date/hooks/index.js +1 -7
  9. package/cjs/date/hooks/useDatepicker.js +12 -42
  10. package/cjs/date/hooks/useEscape.js +18 -0
  11. package/cjs/date/hooks/useMonthPicker.js +12 -42
  12. package/cjs/date/hooks/useOutsideClickHandler.js +26 -0
  13. package/cjs/date/hooks/useRangeDatepicker.js +13 -45
  14. package/cjs/date/monthpicker/MonthButton.js +2 -2
  15. package/cjs/date/monthpicker/MonthCaption.js +2 -2
  16. package/cjs/date/monthpicker/MonthPicker.js +3 -3
  17. package/cjs/date/monthpicker/MonthPickerStandalone.js +2 -2
  18. package/cjs/date/monthpicker/MonthSelector.js +2 -2
  19. package/esm/date/DateInput.js +1 -1
  20. package/esm/date/DateInput.js.map +1 -1
  21. package/esm/date/context/index.d.ts +2 -0
  22. package/esm/date/context/index.js +3 -0
  23. package/esm/date/context/index.js.map +1 -0
  24. package/esm/date/context/useDateInputContext.js.map +1 -0
  25. package/esm/date/context/useSharedMonthContext.js.map +1 -0
  26. package/esm/date/datepicker/DatePicker.js +3 -3
  27. package/esm/date/datepicker/DatePicker.js.map +1 -1
  28. package/esm/date/datepicker/DatePickerStandalone.js +2 -2
  29. package/esm/date/datepicker/DatePickerStandalone.js.map +1 -1
  30. package/esm/date/datepicker/{Head.d.ts → TableHead.d.ts} +1 -1
  31. package/esm/date/datepicker/{Head.js → TableHead.js} +2 -2
  32. package/esm/date/datepicker/TableHead.js.map +1 -0
  33. package/esm/date/hooks/index.d.ts +0 -2
  34. package/esm/date/hooks/index.js +0 -2
  35. package/esm/date/hooks/index.js.map +1 -1
  36. package/esm/date/hooks/useDatepicker.js +13 -43
  37. package/esm/date/hooks/useDatepicker.js.map +1 -1
  38. package/esm/date/hooks/useEscape.d.ts +2 -0
  39. package/esm/date/hooks/useEscape.js +15 -0
  40. package/esm/date/hooks/useEscape.js.map +1 -0
  41. package/esm/date/hooks/useMonthPicker.js +13 -43
  42. package/esm/date/hooks/useMonthPicker.js.map +1 -1
  43. package/esm/date/hooks/useOutsideClickHandler.d.ts +2 -0
  44. package/esm/date/hooks/useOutsideClickHandler.js +23 -0
  45. package/esm/date/hooks/useOutsideClickHandler.js.map +1 -0
  46. package/esm/date/hooks/useRangeDatepicker.js +14 -46
  47. package/esm/date/hooks/useRangeDatepicker.js.map +1 -1
  48. package/esm/date/monthpicker/MonthButton.js +1 -1
  49. package/esm/date/monthpicker/MonthButton.js.map +1 -1
  50. package/esm/date/monthpicker/MonthCaption.js +1 -1
  51. package/esm/date/monthpicker/MonthCaption.js.map +1 -1
  52. package/esm/date/monthpicker/MonthPicker.js +1 -1
  53. package/esm/date/monthpicker/MonthPicker.js.map +1 -1
  54. package/esm/date/monthpicker/MonthPickerStandalone.js +1 -1
  55. package/esm/date/monthpicker/MonthPickerStandalone.js.map +1 -1
  56. package/esm/date/monthpicker/MonthSelector.js +1 -1
  57. package/esm/date/monthpicker/MonthSelector.js.map +1 -1
  58. package/package.json +3 -3
  59. package/src/date/DateInput.tsx +1 -1
  60. package/src/date/context/index.ts +5 -0
  61. package/src/date/datepicker/DatePicker.tsx +3 -3
  62. package/src/date/datepicker/DatePickerStandalone.tsx +2 -2
  63. package/src/date/datepicker/{Head.tsx → TableHead.tsx} +1 -1
  64. package/src/date/datepicker/datepicker.stories.tsx +21 -21
  65. package/src/date/hooks/index.ts +0 -5
  66. package/src/date/hooks/useDatepicker.tsx +15 -55
  67. package/src/date/hooks/useEscape.tsx +25 -0
  68. package/src/date/hooks/useMonthPicker.tsx +15 -54
  69. package/src/date/hooks/useOutsideClickHandler.tsx +34 -0
  70. package/src/date/hooks/useRangeDatepicker.tsx +19 -56
  71. package/src/date/monthpicker/MonthButton.tsx +1 -1
  72. package/src/date/monthpicker/MonthCaption.tsx +1 -1
  73. package/src/date/monthpicker/MonthPicker.tsx +1 -1
  74. package/src/date/monthpicker/MonthPickerStandalone.tsx +1 -1
  75. package/src/date/monthpicker/MonthSelector.tsx +1 -1
  76. package/esm/date/datepicker/Head.js.map +0 -1
  77. package/esm/date/hooks/useDateInputContext.js.map +0 -1
  78. package/esm/date/hooks/useSharedMonthContext.js.map +0 -1
  79. /package/cjs/date/{hooks → context}/useDateInputContext.js +0 -0
  80. /package/cjs/date/{hooks → context}/useSharedMonthContext.js +0 -0
  81. /package/esm/date/{hooks → context}/useDateInputContext.d.ts +0 -0
  82. /package/esm/date/{hooks → context}/useDateInputContext.js +0 -0
  83. /package/esm/date/{hooks → context}/useSharedMonthContext.d.ts +0 -0
  84. /package/esm/date/{hooks → context}/useSharedMonthContext.js +0 -0
  85. /package/src/date/{hooks → context}/useDateInputContext.tsx +0 -0
  86. /package/src/date/{hooks → context}/useSharedMonthContext.tsx +0 -0
package/_docs.json CHANGED
@@ -8793,6 +8793,66 @@
8793
8793
  "displayName": "mergeRefs",
8794
8794
  "props": {}
8795
8795
  },
8796
+ {
8797
+ "filePath": "src/date/context/useSharedMonthContext.tsx",
8798
+ "displayName": "SharedMonthProvider",
8799
+ "props": {
8800
+ "dropdownCaption": {
8801
+ "defaultValue": null,
8802
+ "description": "",
8803
+ "name": "dropdownCaption",
8804
+ "required": true,
8805
+ "type": {
8806
+ "name": "any"
8807
+ }
8808
+ },
8809
+ "disabled": {
8810
+ "defaultValue": null,
8811
+ "description": "",
8812
+ "name": "disabled",
8813
+ "required": true,
8814
+ "type": {
8815
+ "name": "any"
8816
+ }
8817
+ },
8818
+ "selected": {
8819
+ "defaultValue": null,
8820
+ "description": "",
8821
+ "name": "selected",
8822
+ "required": true,
8823
+ "type": {
8824
+ "name": "any"
8825
+ }
8826
+ },
8827
+ "onSelect": {
8828
+ "defaultValue": null,
8829
+ "description": "",
8830
+ "name": "onSelect",
8831
+ "required": true,
8832
+ "type": {
8833
+ "name": "any"
8834
+ }
8835
+ },
8836
+ "year": {
8837
+ "defaultValue": null,
8838
+ "description": "",
8839
+ "name": "year",
8840
+ "required": true,
8841
+ "type": {
8842
+ "name": "any"
8843
+ }
8844
+ },
8845
+ "onYearChange": {
8846
+ "defaultValue": null,
8847
+ "description": "",
8848
+ "name": "onYearChange",
8849
+ "required": true,
8850
+ "type": {
8851
+ "name": "any"
8852
+ }
8853
+ }
8854
+ }
8855
+ },
8796
8856
  {
8797
8857
  "filePath": "src/date/datepicker/DatePicker.tsx",
8798
8858
  "displayName": "DatePicker",
@@ -9568,8 +9628,8 @@
9568
9628
  "props": {}
9569
9629
  },
9570
9630
  {
9571
- "filePath": "src/date/datepicker/Head.tsx",
9572
- "displayName": "Head",
9631
+ "filePath": "src/date/datepicker/TableHead.tsx",
9632
+ "displayName": "TableHead",
9573
9633
  "props": {}
9574
9634
  },
9575
9635
  {
@@ -10340,66 +10400,6 @@
10340
10400
  }
10341
10401
  }
10342
10402
  },
10343
- {
10344
- "filePath": "src/date/hooks/useSharedMonthContext.tsx",
10345
- "displayName": "SharedMonthProvider",
10346
- "props": {
10347
- "dropdownCaption": {
10348
- "defaultValue": null,
10349
- "description": "",
10350
- "name": "dropdownCaption",
10351
- "required": true,
10352
- "type": {
10353
- "name": "any"
10354
- }
10355
- },
10356
- "disabled": {
10357
- "defaultValue": null,
10358
- "description": "",
10359
- "name": "disabled",
10360
- "required": true,
10361
- "type": {
10362
- "name": "any"
10363
- }
10364
- },
10365
- "selected": {
10366
- "defaultValue": null,
10367
- "description": "",
10368
- "name": "selected",
10369
- "required": true,
10370
- "type": {
10371
- "name": "any"
10372
- }
10373
- },
10374
- "onSelect": {
10375
- "defaultValue": null,
10376
- "description": "",
10377
- "name": "onSelect",
10378
- "required": true,
10379
- "type": {
10380
- "name": "any"
10381
- }
10382
- },
10383
- "year": {
10384
- "defaultValue": null,
10385
- "description": "",
10386
- "name": "year",
10387
- "required": true,
10388
- "type": {
10389
- "name": "any"
10390
- }
10391
- },
10392
- "onYearChange": {
10393
- "defaultValue": null,
10394
- "description": "",
10395
- "name": "onYearChange",
10396
- "required": true,
10397
- "type": {
10398
- "name": "any"
10399
- }
10400
- }
10401
- }
10402
- },
10403
10403
  {
10404
10404
  "filePath": "src/date/monthpicker/MonthButton.tsx",
10405
10405
  "displayName": "MonthButton",
@@ -43,7 +43,7 @@ const clsx_1 = __importDefault(require("clsx"));
43
43
  const react_1 = __importStar(require("react"));
44
44
  const __1 = require("..");
45
45
  const useFormField_1 = require("../form/useFormField");
46
- const hooks_1 = require("./hooks");
46
+ const context_1 = require("./context");
47
47
  const DateInput = (0, react_1.forwardRef)((props, ref) => {
48
48
  const { className, hideLabel = false, label, description, variant = "datepicker" } = props, rest = __rest(props, ["className", "hideLabel", "label", "description", "variant"]);
49
49
  const isDatepickerVariant = variant === "datepicker";
@@ -54,7 +54,7 @@ const DateInput = (0, react_1.forwardRef)((props, ref) => {
54
54
  close: isDatepickerVariant ? "Lukk datovelger" : "Lukk månedsvelger",
55
55
  },
56
56
  };
57
- const { onOpen, ariaId, open } = (0, hooks_1.useDateInputContext)();
57
+ const { onOpen, ariaId, open } = (0, context_1.useDateInputContext)();
58
58
  const { inputProps, size = "medium", inputDescriptionId, errorId, showErrorMsg, hasError, } = (0, useFormField_1.useFormField)(props, conditionalVariables.prefix);
59
59
  return (react_1.default.createElement("div", { className: (0, clsx_1.default)(className, "navds-form-field", `navds-form-field--${size}`, "navds-date__field", {
60
60
  "navds-text-field--error": hasError,
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SharedMonthProvider = exports.useSharedMonthContext = exports.DateContext = exports.useDateInputContext = void 0;
4
+ var useDateInputContext_1 = require("./useDateInputContext");
5
+ Object.defineProperty(exports, "useDateInputContext", { enumerable: true, get: function () { return useDateInputContext_1.useDateInputContext; } });
6
+ Object.defineProperty(exports, "DateContext", { enumerable: true, get: function () { return useDateInputContext_1.DateContext; } });
7
+ var useSharedMonthContext_1 = require("./useSharedMonthContext");
8
+ Object.defineProperty(exports, "useSharedMonthContext", { enumerable: true, get: function () { return useSharedMonthContext_1.useSharedMonthContext; } });
9
+ Object.defineProperty(exports, "SharedMonthProvider", { enumerable: true, get: function () { return useSharedMonthContext_1.SharedMonthProvider; } });
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "main": "./index.js",
4
+ "module": "../../../esm/date/context/index.js",
5
+ "types": "../../../esm/date/context/index.d.ts"
6
+ }
@@ -44,12 +44,12 @@ const react_1 = __importStar(require("react"));
44
44
  const react_day_picker_1 = require("react-day-picker");
45
45
  const __1 = require("../..");
46
46
  const DateInput_1 = require("../DateInput");
47
- const hooks_1 = require("../hooks");
47
+ const context_1 = require("../context");
48
48
  const utils_1 = require("../utils");
49
49
  const caption_1 = require("./caption");
50
50
  const DatePickerStandalone_1 = __importDefault(require("./DatePickerStandalone"));
51
51
  const DayButton_1 = require("./DayButton");
52
- const Head_1 = require("./Head");
52
+ const TableHead_1 = require("./TableHead");
53
53
  exports.DatePicker = (0, react_1.forwardRef)((_a, ref) => {
54
54
  var _b;
55
55
  var { children, locale = "nb", dropdownCaption, disabled = [], disableWeekends = false, showWeekNumber = false, selected, id, defaultSelected, className, wrapperClassName, open: _open, onClose, onOpenToggle, strategy = "absolute" } = _a, rest = __rest(_a, ["children", "locale", "dropdownCaption", "disabled", "disableWeekends", "showWeekNumber", "selected", "id", "defaultSelected", "className", "wrapperClassName", "open", "onClose", "onOpenToggle", "strategy"]);
@@ -83,7 +83,7 @@ exports.DatePicker = (0, react_1.forwardRef)((_a, ref) => {
83
83
  ? handleMultipleSelect
84
84
  : handleRangeSelect,
85
85
  };
86
- return (react_1.default.createElement(hooks_1.DateContext.Provider, { value: {
86
+ return (react_1.default.createElement(context_1.DateContext.Provider, { value: {
87
87
  open: _open !== null && _open !== void 0 ? _open : open,
88
88
  onOpen: () => {
89
89
  setOpen((x) => !x);
@@ -100,7 +100,7 @@ exports.DatePicker = (0, react_1.forwardRef)((_a, ref) => {
100
100
  react_1.default.createElement(react_day_picker_1.DayPicker, Object.assign({ locale: (0, utils_1.getLocaleFromString)(locale) }, overrideProps, { selected: selected !== null && selected !== void 0 ? selected : selectedDates, components: {
101
101
  Caption: dropdownCaption ? caption_1.DropdownCaption : caption_1.Caption,
102
102
  Day: DayButton_1.DayButton,
103
- Head: Head_1.Head,
103
+ Head: TableHead_1.TableHead,
104
104
  }, className: (0, clsx_1.default)("navds-date", className), classNames: {
105
105
  vhidden: "navds-sr-only",
106
106
  }, disabled: (day) => {
@@ -45,7 +45,7 @@ const react_day_picker_1 = require("react-day-picker");
45
45
  const __1 = require("../..");
46
46
  const utils_1 = require("../utils");
47
47
  const caption_1 = require("./caption");
48
- const Head_1 = require("./Head");
48
+ const TableHead_1 = require("./TableHead");
49
49
  exports.DatePickerStandalone = (0, react_1.forwardRef)((_a, ref) => {
50
50
  var _b;
51
51
  var { children, className, locale = "nb", dropdownCaption, disabled = [], disableWeekends = false, showWeekNumber = false, selected, id, defaultSelected, onSelect, fixedWeeks = true } = _a, rest = __rest(_a, ["children", "className", "locale", "dropdownCaption", "disabled", "disableWeekends", "showWeekNumber", "selected", "id", "defaultSelected", "onSelect", "fixedWeeks"]);
@@ -73,7 +73,7 @@ exports.DatePickerStandalone = (0, react_1.forwardRef)((_a, ref) => {
73
73
  return (react_1.default.createElement("div", { ref: ref, className: (0, clsx_1.default)("navds-date__standalone-wrapper", className) },
74
74
  react_1.default.createElement(react_day_picker_1.DayPicker, Object.assign({ locale: (0, utils_1.getLocaleFromString)(locale) }, overrideProps, { selected: selected !== null && selected !== void 0 ? selected : selectedDates, components: {
75
75
  Caption: dropdownCaption ? caption_1.DropdownCaption : caption_1.Caption,
76
- Head: Head_1.Head,
76
+ Head: TableHead_1.TableHead,
77
77
  }, className: "navds-date", classNames: { vhidden: "navds-sr-only" }, disabled: (day) => {
78
78
  return ((disableWeekends && (0, isWeekend_1.default)(day)) || (0, react_day_picker_1.isMatch)(day, disabled));
79
79
  }, weekStartsOn: 1, initialFocus: false, labels: utils_1.labels, modifiers: {
@@ -3,15 +3,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.Head = void 0;
6
+ exports.TableHead = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const react_day_picker_1 = require("react-day-picker");
9
9
  /** Render the table head. */
10
- function Head() {
10
+ function TableHead() {
11
11
  var _a;
12
12
  const { classNames, styles, components } = (0, react_day_picker_1.useDayPicker)();
13
13
  const HeadRowComponent = (_a = components === null || components === void 0 ? void 0 : components.HeadRow) !== null && _a !== void 0 ? _a : react_day_picker_1.HeadRow;
14
14
  return (react_1.default.createElement("thead", { style: styles.head, className: classNames.head, "aria-hidden": true },
15
15
  react_1.default.createElement(HeadRowComponent, null)));
16
16
  }
17
- exports.Head = Head;
17
+ exports.TableHead = TableHead;
@@ -1,15 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SharedMonthProvider = exports.useSharedMonthContext = exports.DateContext = exports.useDateInputContext = exports.UNSAFE_useMonthpicker = exports.UNSAFE_useRangeDatepicker = exports.UNSAFE_useDatepicker = void 0;
3
+ exports.UNSAFE_useMonthpicker = exports.UNSAFE_useRangeDatepicker = exports.UNSAFE_useDatepicker = void 0;
4
4
  var useDatepicker_1 = require("./useDatepicker");
5
5
  Object.defineProperty(exports, "UNSAFE_useDatepicker", { enumerable: true, get: function () { return useDatepicker_1.useDatepicker; } });
6
6
  var useRangeDatepicker_1 = require("./useRangeDatepicker");
7
7
  Object.defineProperty(exports, "UNSAFE_useRangeDatepicker", { enumerable: true, get: function () { return useRangeDatepicker_1.useRangeDatepicker; } });
8
8
  var useMonthPicker_1 = require("./useMonthPicker");
9
9
  Object.defineProperty(exports, "UNSAFE_useMonthpicker", { enumerable: true, get: function () { return useMonthPicker_1.useMonthpicker; } });
10
- var useDateInputContext_1 = require("./useDateInputContext");
11
- Object.defineProperty(exports, "useDateInputContext", { enumerable: true, get: function () { return useDateInputContext_1.useDateInputContext; } });
12
- Object.defineProperty(exports, "DateContext", { enumerable: true, get: function () { return useDateInputContext_1.DateContext; } });
13
- var useSharedMonthContext_1 = require("./useSharedMonthContext");
14
- Object.defineProperty(exports, "useSharedMonthContext", { enumerable: true, get: function () { return useSharedMonthContext_1.useSharedMonthContext; } });
15
- Object.defineProperty(exports, "SharedMonthProvider", { enumerable: true, get: function () { return useSharedMonthContext_1.SharedMonthProvider; } });
@@ -9,13 +9,15 @@ const isWeekend_1 = __importDefault(require("date-fns/isWeekend"));
9
9
  const react_1 = require("react");
10
10
  const react_day_picker_1 = require("react-day-picker");
11
11
  const utils_1 = require("../utils");
12
+ const useEscape_1 = require("./useEscape");
13
+ const useOutsideClickHandler_1 = require("./useOutsideClickHandler");
12
14
  const getValidationMessage = (val = {}) => (Object.assign({ isDisabled: false, isWeekend: false, isEmpty: false, isInvalid: false, isBefore: false, isAfter: false, isValidDate: true }, val));
13
15
  const useDatepicker = (opt = {}) => {
14
- var _a;
16
+ var _a, _b;
15
17
  const { locale: _locale = "nb", required, defaultSelected: _defaultSelected, today = new Date(), fromDate, toDate, disabled, disableWeekends, onDateChange, inputFormat, onValidate, defaultMonth, allowTwoDigitYear = true, openOnFocus = true, } = opt;
16
18
  const locale = (0, utils_1.getLocaleFromString)(_locale);
17
19
  const inputRef = (0, react_1.useRef)(null);
18
- const daypickerRef = (0, react_1.useRef)(null);
20
+ const [daypickerRef, setDaypickerRef] = (0, react_1.useState)();
19
21
  const [defaultSelected, setDefaultSelected] = (0, react_1.useState)(_defaultSelected);
20
22
  // Initialize states
21
23
  const [month, setMonth] = (0, react_1.useState)((_a = defaultSelected !== null && defaultSelected !== void 0 ? defaultSelected : defaultMonth) !== null && _a !== void 0 ? _a : today);
@@ -25,38 +27,17 @@ const useDatepicker = (opt = {}) => {
25
27
  ? (0, utils_1.formatDateForInput)(defaultSelected, locale, "date", inputFormat)
26
28
  : "";
27
29
  const [inputValue, setInputValue] = (0, react_1.useState)(defaultInputValue);
30
+ (0, useOutsideClickHandler_1.useOutsideClickHandler)(open, setOpen, [
31
+ daypickerRef,
32
+ inputRef.current,
33
+ (_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.nextSibling,
34
+ ]);
35
+ (0, useEscape_1.useEscape)(open, setOpen, inputRef);
28
36
  const updateDate = (date) => {
29
37
  onDateChange === null || onDateChange === void 0 ? void 0 : onDateChange(date);
30
38
  setSelectedDay(date);
31
39
  };
32
- const updateValidation = (val = {}) => {
33
- const msg = getValidationMessage(val);
34
- onValidate === null || onValidate === void 0 ? void 0 : onValidate(msg);
35
- };
36
- const handleFocusIn = (0, react_1.useCallback)((e) => {
37
- var _a, _b, _c, _d;
38
- /* Workaround for shadow-dom users (open) */
39
- const composed = (_b = (_a = e.composedPath) === null || _a === void 0 ? void 0 : _a.call(e)) === null || _b === void 0 ? void 0 : _b[0];
40
- if (!(e === null || e === void 0 ? void 0 : e.target) || !((_c = e === null || e === void 0 ? void 0 : e.target) === null || _c === void 0 ? void 0 : _c.nodeType) || !composed) {
41
- return;
42
- }
43
- ![
44
- daypickerRef.current,
45
- inputRef.current,
46
- (_d = inputRef.current) === null || _d === void 0 ? void 0 : _d.nextSibling,
47
- ].some((element) => (element === null || element === void 0 ? void 0 : element.contains(e.target)) || (element === null || element === void 0 ? void 0 : element.contains(composed))) &&
48
- open &&
49
- setOpen(false);
50
- }, [open]);
51
- (0, react_1.useEffect)(() => {
52
- window.addEventListener("focusin", handleFocusIn);
53
- window.addEventListener("pointerdown", handleFocusIn);
54
- return () => {
55
- var _a, _b;
56
- (_a = window === null || window === void 0 ? void 0 : window.removeEventListener) === null || _a === void 0 ? void 0 : _a.call(window, "focusin", handleFocusIn);
57
- (_b = window === null || window === void 0 ? void 0 : window.removeEventListener) === null || _b === void 0 ? void 0 : _b.call(window, "pointerdown", handleFocusIn);
58
- };
59
- }, [handleFocusIn]);
40
+ const updateValidation = (val = {}) => onValidate === null || onValidate === void 0 ? void 0 : onValidate(getValidationMessage(val));
60
41
  const reset = () => {
61
42
  var _a;
62
43
  updateDate(defaultSelected);
@@ -136,17 +117,6 @@ const useDatepicker = (opt = {}) => {
136
117
  updateValidation();
137
118
  setMonth(defaultMonth !== null && defaultMonth !== void 0 ? defaultMonth : day);
138
119
  };
139
- const handleClose = (0, react_1.useCallback)(() => {
140
- setOpen(false);
141
- inputRef.current && inputRef.current.focus();
142
- }, []);
143
- const escape = (0, react_1.useCallback)((e) => open && e.key === "Escape" && handleClose(), [handleClose, open]);
144
- (0, react_1.useEffect)(() => {
145
- window.addEventListener("keydown", escape, false);
146
- return () => {
147
- window.removeEventListener("keydown", escape, false);
148
- };
149
- }, [escape]);
150
120
  const datepickerProps = {
151
121
  month,
152
122
  onMonthChange: (month) => setMonth(month),
@@ -160,7 +130,7 @@ const useDatepicker = (opt = {}) => {
160
130
  onOpenToggle: () => setOpen((x) => !x),
161
131
  disabled,
162
132
  disableWeekends,
163
- ref: daypickerRef,
133
+ ref: setDaypickerRef,
164
134
  };
165
135
  const inputProps = {
166
136
  onChange: handleChange,
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useEscape = void 0;
4
+ const react_1 = require("react");
5
+ const useEscape = (open, setOpen, focusRef) => {
6
+ const handleClose = (0, react_1.useCallback)(() => {
7
+ setOpen(false);
8
+ (focusRef === null || focusRef === void 0 ? void 0 : focusRef.current) && focusRef.current.focus();
9
+ }, [focusRef, setOpen]);
10
+ const escape = (0, react_1.useCallback)((e) => open && e.key === "Escape" && handleClose(), [handleClose, open]);
11
+ (0, react_1.useEffect)(() => {
12
+ window.addEventListener("keydown", escape, false);
13
+ return () => {
14
+ window.removeEventListener("keydown", escape, false);
15
+ };
16
+ }, [escape]);
17
+ };
18
+ exports.useEscape = useEscape;
@@ -3,15 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useMonthpicker = void 0;
4
4
  const react_1 = require("react");
5
5
  const utils_1 = require("../utils");
6
+ const useEscape_1 = require("./useEscape");
7
+ const useOutsideClickHandler_1 = require("./useOutsideClickHandler");
6
8
  const getValidationMessage = (val = {}) => (Object.assign({ isDisabled: false, isEmpty: false, isInvalid: false, isBefore: false, isAfter: false, isValidMonth: true }, val));
7
9
  const useMonthpicker = (opt = {}) => {
8
- var _a;
10
+ var _a, _b;
9
11
  const { locale: _locale = "nb", defaultSelected: _defaultSelected, fromDate, toDate, disabled, required, onMonthChange, inputFormat, onValidate, defaultYear, allowTwoDigitYear = true, openOnFocus = true, } = opt;
10
12
  const [defaultSelected, setDefaultSelected] = (0, react_1.useState)(_defaultSelected);
11
13
  const today = new Date();
12
14
  const locale = (0, utils_1.getLocaleFromString)(_locale);
13
15
  const inputRef = (0, react_1.useRef)(null);
14
- const monthpickerRef = (0, react_1.useRef)(null);
16
+ const [monthpickerRef, setMonthpickerRef] = (0, react_1.useState)();
15
17
  // Initialize states
16
18
  const [year, setYear] = (0, react_1.useState)((_a = defaultSelected !== null && defaultSelected !== void 0 ? defaultSelected : defaultYear) !== null && _a !== void 0 ? _a : today);
17
19
  const [selectedMonth, setSelectedMonth] = (0, react_1.useState)(defaultSelected);
@@ -20,38 +22,17 @@ const useMonthpicker = (opt = {}) => {
20
22
  ? (0, utils_1.formatDateForInput)(defaultSelected, locale, "month", inputFormat)
21
23
  : "";
22
24
  const [inputValue, setInputValue] = (0, react_1.useState)(defaultInputValue);
25
+ (0, useOutsideClickHandler_1.useOutsideClickHandler)(open, setOpen, [
26
+ monthpickerRef,
27
+ inputRef.current,
28
+ (_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.nextSibling,
29
+ ]);
30
+ (0, useEscape_1.useEscape)(open, setOpen, inputRef);
23
31
  const updateMonth = (date) => {
24
32
  onMonthChange === null || onMonthChange === void 0 ? void 0 : onMonthChange(date);
25
33
  setSelectedMonth(date);
26
34
  };
27
- const updateValidation = (val = {}) => {
28
- const msg = getValidationMessage(val);
29
- onValidate === null || onValidate === void 0 ? void 0 : onValidate(msg);
30
- };
31
- const handleFocusIn = (0, react_1.useCallback)((e) => {
32
- var _a, _b, _c, _d;
33
- /* Workaround for shadow-dom users (open) */
34
- const composed = (_b = (_a = e.composedPath) === null || _a === void 0 ? void 0 : _a.call(e)) === null || _b === void 0 ? void 0 : _b[0];
35
- if (!(e === null || e === void 0 ? void 0 : e.target) || !((_c = e === null || e === void 0 ? void 0 : e.target) === null || _c === void 0 ? void 0 : _c.nodeType) || !composed) {
36
- return;
37
- }
38
- ![
39
- monthpickerRef.current,
40
- inputRef.current,
41
- (_d = inputRef.current) === null || _d === void 0 ? void 0 : _d.nextSibling,
42
- ].some((element) => (element === null || element === void 0 ? void 0 : element.contains(e.target)) || (element === null || element === void 0 ? void 0 : element.contains(composed))) &&
43
- open &&
44
- setOpen(false);
45
- }, [open]);
46
- (0, react_1.useEffect)(() => {
47
- window.addEventListener("focusin", handleFocusIn);
48
- window.addEventListener("pointerdown", handleFocusIn);
49
- return () => {
50
- var _a, _b;
51
- (_a = window === null || window === void 0 ? void 0 : window.removeEventListener) === null || _a === void 0 ? void 0 : _a.call(window, "focusin", handleFocusIn);
52
- (_b = window === null || window === void 0 ? void 0 : window.removeEventListener) === null || _b === void 0 ? void 0 : _b.call(window, "pointerdown", handleFocusIn);
53
- };
54
- }, [handleFocusIn]);
35
+ const updateValidation = (val = {}) => onValidate === null || onValidate === void 0 ? void 0 : onValidate(getValidationMessage(val));
55
36
  const reset = () => {
56
37
  var _a;
57
38
  updateMonth(defaultSelected);
@@ -143,17 +124,6 @@ const useMonthpicker = (opt = {}) => {
143
124
  updateValidation();
144
125
  setYear(month);
145
126
  };
146
- const handleClose = (0, react_1.useCallback)(() => {
147
- setOpen(false);
148
- inputRef.current && inputRef.current.focus();
149
- }, []);
150
- const escape = (0, react_1.useCallback)((e) => open && e.key === "Escape" && handleClose(), [handleClose, open]);
151
- (0, react_1.useEffect)(() => {
152
- window.addEventListener("keydown", escape, false);
153
- return () => {
154
- window.removeEventListener("keydown", escape, false);
155
- };
156
- }, [escape]);
157
127
  const monthpickerProps = {
158
128
  year,
159
129
  onYearChange: (y) => setYear(y !== null && y !== void 0 ? y : today),
@@ -165,7 +135,7 @@ const useMonthpicker = (opt = {}) => {
165
135
  open,
166
136
  onOpenToggle: () => setOpen((x) => !x),
167
137
  disabled,
168
- ref: monthpickerRef,
138
+ ref: setMonthpickerRef,
169
139
  };
170
140
  const inputProps = {
171
141
  onChange: handleChange,
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useOutsideClickHandler = void 0;
4
+ const react_1 = require("react");
5
+ const useOutsideClickHandler = (open, setOpen, refs) => {
6
+ const handleFocusIn = (0, react_1.useCallback)((e) => {
7
+ var _a, _b, _c;
8
+ const composed = (_b = (_a = e.composedPath) === null || _a === void 0 ? void 0 : _a.call(e)) === null || _b === void 0 ? void 0 : _b[0];
9
+ if (!(e === null || e === void 0 ? void 0 : e.target) || !((_c = e === null || e === void 0 ? void 0 : e.target) === null || _c === void 0 ? void 0 : _c.nodeType) || !composed) {
10
+ return;
11
+ }
12
+ if (!refs.some((element) => (element === null || element === void 0 ? void 0 : element.contains(e.target)) || (element === null || element === void 0 ? void 0 : element.contains(composed)))) {
13
+ open && setOpen(false);
14
+ }
15
+ }, [open, refs, setOpen]);
16
+ (0, react_1.useEffect)(() => {
17
+ window.addEventListener("focusin", handleFocusIn);
18
+ window.addEventListener("pointerdown", handleFocusIn);
19
+ return () => {
20
+ var _a, _b;
21
+ (_a = window === null || window === void 0 ? void 0 : window.removeEventListener) === null || _a === void 0 ? void 0 : _a.call(window, "focusin", handleFocusIn);
22
+ (_b = window === null || window === void 0 ? void 0 : window.removeEventListener) === null || _b === void 0 ? void 0 : _b.call(window, "pointerdown", handleFocusIn);
23
+ };
24
+ }, [handleFocusIn]);
25
+ };
26
+ exports.useOutsideClickHandler = useOutsideClickHandler;
@@ -10,6 +10,8 @@ const isWeekend_1 = __importDefault(require("date-fns/isWeekend"));
10
10
  const react_1 = require("react");
11
11
  const react_day_picker_1 = require("react-day-picker");
12
12
  const utils_1 = require("../utils");
13
+ const useEscape_1 = require("./useEscape");
14
+ const useOutsideClickHandler_1 = require("./useOutsideClickHandler");
13
15
  const getValidationMessage = (from = {}, to = {}) => ({
14
16
  from: Object.assign({ isDisabled: false, isWeekend: false, isEmpty: false, isInvalid: false, isBefore: false, isAfter: false, isValidDate: true }, from),
15
17
  to: Object.assign({ isDisabled: false, isWeekend: false, isEmpty: false, isInvalid: false, isBefore: false, isAfter: false, isBeforeFrom: false, isValidDate: true }, to),
@@ -79,11 +81,12 @@ const initialValidation = (range, opt) => {
79
81
  return getValidationMessage(Object.assign({}, fromVal), Object.assign({}, toVal));
80
82
  };
81
83
  const useRangeDatepicker = (opt = {}) => {
84
+ var _a, _b;
82
85
  const { locale: _locale = "nb", defaultSelected: _defaultSelected, today = new Date(), fromDate, toDate, disabled, disableWeekends, onRangeChange, inputFormat, onValidate, defaultMonth, allowTwoDigitYear = true, openOnFocus = true, } = opt;
83
86
  const locale = (0, utils_1.getLocaleFromString)(_locale);
84
87
  const inputRefTo = (0, react_1.useRef)(null);
85
88
  const inputRefFrom = (0, react_1.useRef)(null);
86
- const datePickerRef = (0, react_1.useRef)(null);
89
+ const [daypickerRef, setDaypickerRef] = (0, react_1.useState)();
87
90
  const [defaultSelected, setDefaultSelected] = (0, react_1.useState)(_defaultSelected);
88
91
  // Initialize states
89
92
  const [month, setMonth] = (0, react_1.useState)(defaultSelected ? defaultSelected === null || defaultSelected === void 0 ? void 0 : defaultSelected.from : defaultMonth !== null && defaultMonth !== void 0 ? defaultMonth : today);
@@ -96,6 +99,14 @@ const useRangeDatepicker = (opt = {}) => {
96
99
  : "");
97
100
  const [validation, setValidation] = (0, react_1.useState)(initialValidation(selectedRange, opt));
98
101
  const [open, setOpen] = (0, react_1.useState)(false);
102
+ (0, useOutsideClickHandler_1.useOutsideClickHandler)(open, setOpen, [
103
+ daypickerRef,
104
+ inputRefTo.current,
105
+ inputRefFrom.current,
106
+ (_a = inputRefTo.current) === null || _a === void 0 ? void 0 : _a.nextSibling,
107
+ (_b = inputRefFrom.current) === null || _b === void 0 ? void 0 : _b.nextSibling,
108
+ ]);
109
+ (0, useEscape_1.useEscape)(open, setOpen, (selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.from) && !(selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.to) ? inputRefTo : inputRefFrom);
99
110
  const updateRange = (range) => {
100
111
  onRangeChange === null || onRangeChange === void 0 ? void 0 : onRangeChange(range);
101
112
  setSelectedRange(range);
@@ -105,32 +116,6 @@ const useRangeDatepicker = (opt = {}) => {
105
116
  setValidation(msg);
106
117
  onValidate === null || onValidate === void 0 ? void 0 : onValidate(msg);
107
118
  };
108
- const handleFocusIn = (0, react_1.useCallback)((e) => {
109
- var _a, _b, _c, _d, _e;
110
- /* Workaround for shadow-dom users (open) */
111
- const composed = (_b = (_a = e.composedPath) === null || _a === void 0 ? void 0 : _a.call(e)) === null || _b === void 0 ? void 0 : _b[0];
112
- if (!(e === null || e === void 0 ? void 0 : e.target) || !((_c = e === null || e === void 0 ? void 0 : e.target) === null || _c === void 0 ? void 0 : _c.nodeType) || !composed) {
113
- return;
114
- }
115
- ![
116
- datePickerRef.current,
117
- inputRefTo.current,
118
- inputRefFrom.current,
119
- (_d = inputRefTo.current) === null || _d === void 0 ? void 0 : _d.nextSibling,
120
- (_e = inputRefFrom.current) === null || _e === void 0 ? void 0 : _e.nextSibling,
121
- ].some((element) => (element === null || element === void 0 ? void 0 : element.contains(e.target)) || (element === null || element === void 0 ? void 0 : element.contains(composed))) &&
122
- open &&
123
- setOpen(false);
124
- }, [open]);
125
- (0, react_1.useEffect)(() => {
126
- window.addEventListener("focusin", handleFocusIn);
127
- window.addEventListener("pointerdown", handleFocusIn);
128
- return () => {
129
- var _a, _b;
130
- (_a = window === null || window === void 0 ? void 0 : window.removeEventListener) === null || _a === void 0 ? void 0 : _a.call(window, "focusin", handleFocusIn);
131
- (_b = window === null || window === void 0 ? void 0 : window.removeEventListener) === null || _b === void 0 ? void 0 : _b.call(window, "pointerdown", handleFocusIn);
132
- };
133
- }, [handleFocusIn]);
134
119
  const reset = () => {
135
120
  updateRange(defaultSelected !== null && defaultSelected !== void 0 ? defaultSelected : { from: undefined, to: undefined });
136
121
  setMonth(defaultSelected ? defaultSelected === null || defaultSelected === void 0 ? void 0 : defaultSelected.from : defaultMonth !== null && defaultMonth !== void 0 ? defaultMonth : today);
@@ -287,23 +272,6 @@ const useRangeDatepicker = (opt = {}) => {
287
272
  ? fromChange(e.target.value, day, isBefore, isAfter)
288
273
  : toChange(e.target.value, day, isBefore, isAfter);
289
274
  };
290
- const handleClose = (0, react_1.useCallback)(() => {
291
- var _a, _b;
292
- setOpen(false);
293
- if ((selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.from) && !(selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.to)) {
294
- (_a = inputRefTo === null || inputRefTo === void 0 ? void 0 : inputRefTo.current) === null || _a === void 0 ? void 0 : _a.focus();
295
- }
296
- else {
297
- (_b = inputRefFrom === null || inputRefFrom === void 0 ? void 0 : inputRefFrom.current) === null || _b === void 0 ? void 0 : _b.focus();
298
- }
299
- }, [selectedRange]);
300
- const escape = (0, react_1.useCallback)((e) => open && e.key === "Escape" && handleClose(), [handleClose, open]);
301
- (0, react_1.useEffect)(() => {
302
- window.addEventListener("keydown", escape, false);
303
- return () => {
304
- window.removeEventListener("keydown", escape, false);
305
- };
306
- }, [escape]);
307
275
  const datepickerProps = {
308
276
  month: month,
309
277
  onMonthChange: (month) => setMonth(month),
@@ -318,7 +286,7 @@ const useRangeDatepicker = (opt = {}) => {
318
286
  onOpenToggle: () => setOpen((x) => !x),
319
287
  disabled,
320
288
  disableWeekends,
321
- ref: datePickerRef,
289
+ ref: setDaypickerRef,
322
290
  };
323
291
  const fromInputProps = {
324
292
  onChange: (e) => handleChange(e, RANGE.FROM),
@@ -35,7 +35,7 @@ const isSameMonth_1 = __importDefault(require("date-fns/isSameMonth"));
35
35
  const setYear_1 = __importDefault(require("date-fns/setYear"));
36
36
  const react_1 = __importStar(require("react"));
37
37
  const react_day_picker_1 = require("react-day-picker");
38
- const hooks_1 = require("../hooks");
38
+ const context_1 = require("../context");
39
39
  const utils_1 = require("../utils");
40
40
  const disableMonth = (month, fromDate, toDate) => {
41
41
  if (fromDate && toDate) {
@@ -51,7 +51,7 @@ const disableMonth = (month, fromDate, toDate) => {
51
51
  };
52
52
  const MonthButton = ({ month, months, focus, setFocus, tabRoot, setTabRoot, }) => {
53
53
  const ref = (0, react_1.useRef)(null);
54
- const { hasDropdown, selected, onSelect, year, toYear, disabled } = (0, hooks_1.useSharedMonthContext)();
54
+ const { hasDropdown, selected, onSelect, year, toYear, disabled } = (0, context_1.useSharedMonthContext)();
55
55
  const { fromDate, toDate, locale } = (0, react_day_picker_1.useDayPicker)();
56
56
  const isSelected = selected && (0, isSameMonth_1.default)(month, selected);
57
57
  (0, react_1.useEffect)(() => {
@@ -12,11 +12,11 @@ const startOfYear_1 = __importDefault(require("date-fns/startOfYear"));
12
12
  const react_1 = __importDefault(require("react"));
13
13
  const react_day_picker_1 = require("react-day-picker");
14
14
  const __1 = require("../..");
15
- const hooks_1 = require("../hooks");
15
+ const context_1 = require("../context");
16
16
  const utils_1 = require("../utils");
17
17
  const MonthCaption = () => {
18
18
  const { fromDate, toDate, formatters: { formatYearCaption }, locale, } = (0, react_day_picker_1.useDayPicker)();
19
- const { hasDropdown, year, toYear } = (0, hooks_1.useSharedMonthContext)();
19
+ const { hasDropdown, year, toYear } = (0, context_1.useSharedMonthContext)();
20
20
  const years = [];
21
21
  if (hasDropdown && fromDate && toDate) {
22
22
  const fromYear = fromDate.getFullYear();