@salt-ds/lab 1.0.0-alpha.57 → 1.0.0-alpha.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +232 -0
- package/css/salt-lab.css +216 -143
- package/dist-cjs/date-picker/DatePicker.js +3 -2
- package/dist-cjs/date-picker/DatePicker.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerOverlayProvider.js +5 -2
- package/dist-cjs/date-picker/DatePickerOverlayProvider.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerRangeInput.js +1 -1
- package/dist-cjs/date-picker/DatePickerRangeInput.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerSingleInput.js +1 -1
- package/dist-cjs/date-picker/DatePickerSingleInput.js.map +1 -1
- package/dist-cjs/index.js +4 -6
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/skip-link/SkipLink.css.js +1 -1
- package/dist-cjs/skip-link/SkipLink.js +25 -8
- package/dist-cjs/skip-link/SkipLink.js.map +1 -1
- package/dist-cjs/skip-link/internal/useManageFocusOnTarget.js +54 -37
- package/dist-cjs/skip-link/internal/useManageFocusOnTarget.js.map +1 -1
- package/dist-cjs/stepped-tracker/Step.Connector.css.js +6 -0
- package/dist-cjs/stepped-tracker/Step.Connector.css.js.map +1 -0
- package/dist-cjs/stepped-tracker/Step.Connector.js +21 -0
- package/dist-cjs/stepped-tracker/Step.Connector.js.map +1 -0
- package/dist-cjs/stepped-tracker/Step.Description.css.js +6 -0
- package/dist-cjs/stepped-tracker/Step.Description.css.js.map +1 -0
- package/dist-cjs/stepped-tracker/Step.Description.js +35 -0
- package/dist-cjs/stepped-tracker/Step.Description.js.map +1 -0
- package/dist-cjs/stepped-tracker/Step.ExpandTrigger.css.js +6 -0
- package/dist-cjs/stepped-tracker/Step.ExpandTrigger.css.js.map +1 -0
- package/dist-cjs/stepped-tracker/Step.ExpandTrigger.js +38 -0
- package/dist-cjs/stepped-tracker/Step.ExpandTrigger.js.map +1 -0
- package/dist-cjs/stepped-tracker/Step.Icon.css.js +6 -0
- package/dist-cjs/stepped-tracker/Step.Icon.css.js.map +1 -0
- package/dist-cjs/stepped-tracker/Step.Icon.js +57 -0
- package/dist-cjs/stepped-tracker/Step.Icon.js.map +1 -0
- package/dist-cjs/stepped-tracker/Step.Label.css.js +6 -0
- package/dist-cjs/stepped-tracker/Step.Label.css.js.map +1 -0
- package/dist-cjs/stepped-tracker/Step.Label.js +37 -0
- package/dist-cjs/stepped-tracker/Step.Label.js.map +1 -0
- package/dist-cjs/stepped-tracker/Step.SROnly.css.js +6 -0
- package/dist-cjs/stepped-tracker/Step.SROnly.css.js.map +1 -0
- package/dist-cjs/stepped-tracker/Step.SROnly.js +21 -0
- package/dist-cjs/stepped-tracker/Step.SROnly.js.map +1 -0
- package/dist-cjs/stepped-tracker/Step.css.js +6 -0
- package/dist-cjs/stepped-tracker/Step.css.js.map +1 -0
- package/dist-cjs/stepped-tracker/Step.js +161 -0
- package/dist-cjs/stepped-tracker/Step.js.map +1 -0
- package/dist-cjs/stepped-tracker/SteppedTracker.Provider.js +19 -0
- package/dist-cjs/stepped-tracker/SteppedTracker.Provider.js.map +1 -0
- package/dist-cjs/stepped-tracker/SteppedTracker.css.js +1 -1
- package/dist-cjs/stepped-tracker/SteppedTracker.js +10 -33
- package/dist-cjs/stepped-tracker/SteppedTracker.js.map +1 -1
- package/dist-cjs/stepped-tracker/stepReducer.js +109 -0
- package/dist-cjs/stepped-tracker/stepReducer.js.map +1 -0
- package/dist-cjs/stepped-tracker/useStepReducer.js +16 -0
- package/dist-cjs/stepped-tracker/useStepReducer.js.map +1 -0
- package/dist-cjs/stepped-tracker/utils.js +86 -0
- package/dist-cjs/stepped-tracker/utils.js.map +1 -0
- package/dist-es/date-picker/DatePicker.js +3 -2
- package/dist-es/date-picker/DatePicker.js.map +1 -1
- package/dist-es/date-picker/DatePickerOverlayProvider.js +5 -2
- package/dist-es/date-picker/DatePickerOverlayProvider.js.map +1 -1
- package/dist-es/date-picker/DatePickerRangeInput.js +1 -1
- package/dist-es/date-picker/DatePickerRangeInput.js.map +1 -1
- package/dist-es/date-picker/DatePickerSingleInput.js +1 -1
- package/dist-es/date-picker/DatePickerSingleInput.js.map +1 -1
- package/dist-es/index.js +2 -3
- package/dist-es/index.js.map +1 -1
- package/dist-es/skip-link/SkipLink.css.js +1 -1
- package/dist-es/skip-link/SkipLink.js +27 -10
- package/dist-es/skip-link/SkipLink.js.map +1 -1
- package/dist-es/skip-link/internal/useManageFocusOnTarget.js +55 -38
- package/dist-es/skip-link/internal/useManageFocusOnTarget.js.map +1 -1
- package/dist-es/stepped-tracker/Step.Connector.css.js +4 -0
- package/dist-es/stepped-tracker/Step.Connector.css.js.map +1 -0
- package/dist-es/stepped-tracker/Step.Connector.js +19 -0
- package/dist-es/stepped-tracker/Step.Connector.js.map +1 -0
- package/dist-es/stepped-tracker/Step.Description.css.js +4 -0
- package/dist-es/stepped-tracker/Step.Description.css.js.map +1 -0
- package/dist-es/stepped-tracker/Step.Description.js +33 -0
- package/dist-es/stepped-tracker/Step.Description.js.map +1 -0
- package/dist-es/stepped-tracker/Step.ExpandTrigger.css.js +4 -0
- package/dist-es/stepped-tracker/Step.ExpandTrigger.css.js.map +1 -0
- package/dist-es/stepped-tracker/Step.ExpandTrigger.js +36 -0
- package/dist-es/stepped-tracker/Step.ExpandTrigger.js.map +1 -0
- package/dist-es/stepped-tracker/Step.Icon.css.js +4 -0
- package/dist-es/stepped-tracker/Step.Icon.css.js.map +1 -0
- package/dist-es/stepped-tracker/Step.Icon.js +55 -0
- package/dist-es/stepped-tracker/Step.Icon.js.map +1 -0
- package/dist-es/stepped-tracker/Step.Label.css.js +4 -0
- package/dist-es/stepped-tracker/Step.Label.css.js.map +1 -0
- package/dist-es/stepped-tracker/Step.Label.js +35 -0
- package/dist-es/stepped-tracker/Step.Label.js.map +1 -0
- package/dist-es/stepped-tracker/Step.SROnly.css.js +4 -0
- package/dist-es/stepped-tracker/Step.SROnly.css.js.map +1 -0
- package/dist-es/stepped-tracker/Step.SROnly.js +19 -0
- package/dist-es/stepped-tracker/Step.SROnly.js.map +1 -0
- package/dist-es/stepped-tracker/Step.css.js +4 -0
- package/dist-es/stepped-tracker/Step.css.js.map +1 -0
- package/dist-es/stepped-tracker/Step.js +159 -0
- package/dist-es/stepped-tracker/Step.js.map +1 -0
- package/dist-es/stepped-tracker/SteppedTracker.Provider.js +15 -0
- package/dist-es/stepped-tracker/SteppedTracker.Provider.js.map +1 -0
- package/dist-es/stepped-tracker/SteppedTracker.css.js +1 -1
- package/dist-es/stepped-tracker/SteppedTracker.js +11 -34
- package/dist-es/stepped-tracker/SteppedTracker.js.map +1 -1
- package/dist-es/stepped-tracker/stepReducer.js +107 -0
- package/dist-es/stepped-tracker/stepReducer.js.map +1 -0
- package/dist-es/stepped-tracker/useStepReducer.js +14 -0
- package/dist-es/stepped-tracker/useStepReducer.js.map +1 -0
- package/dist-es/stepped-tracker/utils.js +80 -0
- package/dist-es/stepped-tracker/utils.js.map +1 -0
- package/dist-types/date-picker/DatePickerOverlayProvider.d.ts +4 -0
- package/dist-types/skip-link/SkipLink.d.ts +6 -11
- package/dist-types/skip-link/index.d.ts +0 -1
- package/dist-types/skip-link/internal/useManageFocusOnTarget.d.ts +13 -8
- package/dist-types/stepped-tracker/Step.Connector.d.ts +1 -0
- package/dist-types/stepped-tracker/Step.Description.d.ts +4 -0
- package/dist-types/stepped-tracker/Step.ExpandTrigger.d.ts +5 -0
- package/dist-types/stepped-tracker/Step.Icon.d.ts +8 -0
- package/dist-types/stepped-tracker/Step.Label.d.ts +4 -0
- package/dist-types/stepped-tracker/Step.SROnly.d.ts +5 -0
- package/dist-types/stepped-tracker/Step.d.ts +2 -0
- package/dist-types/stepped-tracker/Step.types.d.ts +21 -0
- package/dist-types/stepped-tracker/SteppedTracker.Provider.d.ts +9 -0
- package/dist-types/stepped-tracker/SteppedTracker.d.ts +2 -16
- package/dist-types/stepped-tracker/SteppedTracker.types.d.ts +6 -0
- package/dist-types/stepped-tracker/index.d.ts +5 -2
- package/dist-types/stepped-tracker/stepReducer.d.ts +2 -0
- package/dist-types/stepped-tracker/stepReducer.types.d.ts +25 -0
- package/dist-types/stepped-tracker/useStepReducer.d.ts +3 -0
- package/dist-types/stepped-tracker/utils.d.ts +7 -0
- package/package.json +14 -12
- package/dist-cjs/skip-link/SkipLinks.css.js +0 -6
- package/dist-cjs/skip-link/SkipLinks.css.js.map +0 -1
- package/dist-cjs/skip-link/SkipLinks.js +0 -24
- package/dist-cjs/skip-link/SkipLinks.js.map +0 -1
- package/dist-cjs/stepped-tracker/StepLabel/StepLabel.css.js +0 -6
- package/dist-cjs/stepped-tracker/StepLabel/StepLabel.css.js.map +0 -1
- package/dist-cjs/stepped-tracker/StepLabel/StepLabel.js +0 -25
- package/dist-cjs/stepped-tracker/StepLabel/StepLabel.js.map +0 -1
- package/dist-cjs/stepped-tracker/SteppedTrackerContext.js +0 -43
- package/dist-cjs/stepped-tracker/SteppedTrackerContext.js.map +0 -1
- package/dist-cjs/stepped-tracker/TrackerConnector/TrackerConnector.css.js +0 -6
- package/dist-cjs/stepped-tracker/TrackerConnector/TrackerConnector.css.js.map +0 -1
- package/dist-cjs/stepped-tracker/TrackerConnector/TrackerConnector.js +0 -22
- package/dist-cjs/stepped-tracker/TrackerConnector/TrackerConnector.js.map +0 -1
- package/dist-cjs/stepped-tracker/TrackerStep/TrackerStep.css.js +0 -6
- package/dist-cjs/stepped-tracker/TrackerStep/TrackerStep.css.js.map +0 -1
- package/dist-cjs/stepped-tracker/TrackerStep/TrackerStep.js +0 -96
- package/dist-cjs/stepped-tracker/TrackerStep/TrackerStep.js.map +0 -1
- package/dist-es/skip-link/SkipLinks.css.js +0 -4
- package/dist-es/skip-link/SkipLinks.css.js.map +0 -1
- package/dist-es/skip-link/SkipLinks.js +0 -22
- package/dist-es/skip-link/SkipLinks.js.map +0 -1
- package/dist-es/stepped-tracker/StepLabel/StepLabel.css.js +0 -4
- package/dist-es/stepped-tracker/StepLabel/StepLabel.css.js.map +0 -1
- package/dist-es/stepped-tracker/StepLabel/StepLabel.js +0 -23
- package/dist-es/stepped-tracker/StepLabel/StepLabel.js.map +0 -1
- package/dist-es/stepped-tracker/SteppedTrackerContext.js +0 -38
- package/dist-es/stepped-tracker/SteppedTrackerContext.js.map +0 -1
- package/dist-es/stepped-tracker/TrackerConnector/TrackerConnector.css.js +0 -4
- package/dist-es/stepped-tracker/TrackerConnector/TrackerConnector.css.js.map +0 -1
- package/dist-es/stepped-tracker/TrackerConnector/TrackerConnector.js +0 -20
- package/dist-es/stepped-tracker/TrackerConnector/TrackerConnector.js.map +0 -1
- package/dist-es/stepped-tracker/TrackerStep/TrackerStep.css.js +0 -4
- package/dist-es/stepped-tracker/TrackerStep/TrackerStep.css.js.map +0 -1
- package/dist-es/stepped-tracker/TrackerStep/TrackerStep.js +0 -94
- package/dist-es/stepped-tracker/TrackerStep/TrackerStep.js.map +0 -1
- package/dist-types/skip-link/SkipLinks.d.ts +0 -2
- package/dist-types/stepped-tracker/StepLabel/StepLabel.d.ts +0 -9
- package/dist-types/stepped-tracker/StepLabel/index.d.ts +0 -1
- package/dist-types/stepped-tracker/SteppedTrackerContext.d.ts +0 -18
- package/dist-types/stepped-tracker/TrackerConnector/TrackerConnector.d.ts +0 -9
- package/dist-types/stepped-tracker/TrackerConnector/index.d.ts +0 -1
- package/dist-types/stepped-tracker/TrackerStep/TrackerStep.d.ts +0 -18
- package/dist-types/stepped-tracker/TrackerStep/index.d.ts +0 -2
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utils = require('./utils.js');
|
|
4
|
+
|
|
5
|
+
function stepReducer(state, action) {
|
|
6
|
+
var _a, _b;
|
|
7
|
+
if (action.type === "next") {
|
|
8
|
+
if (((_a = state.activeStep) == null ? void 0 : _a.status) === "error") {
|
|
9
|
+
return state;
|
|
10
|
+
}
|
|
11
|
+
const steps = utils.resetSteps(state.steps);
|
|
12
|
+
const flatSteps = utils.flattenSteps(steps);
|
|
13
|
+
if (state.nextStep) {
|
|
14
|
+
const activeStepIndex2 = state.activeStepIndex + 1;
|
|
15
|
+
const activeStep2 = flatSteps[activeStepIndex2];
|
|
16
|
+
const previousStep2 = flatSteps[activeStepIndex2 - 1] || null;
|
|
17
|
+
const nextStep2 = flatSteps[activeStepIndex2 + 1] || null;
|
|
18
|
+
if (activeStep2) {
|
|
19
|
+
activeStep2.stage = "active";
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
steps: utils.autoStageSteps(steps),
|
|
23
|
+
flatSteps,
|
|
24
|
+
activeStepIndex: activeStepIndex2,
|
|
25
|
+
activeStep: activeStep2,
|
|
26
|
+
previousStep: previousStep2,
|
|
27
|
+
nextStep: nextStep2,
|
|
28
|
+
started: true,
|
|
29
|
+
ended: false
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const activeStepIndex = flatSteps.length;
|
|
33
|
+
const previousStep = flatSteps.at(-1);
|
|
34
|
+
const activeStep = null;
|
|
35
|
+
const nextStep = null;
|
|
36
|
+
return {
|
|
37
|
+
steps: utils.assignSteps(steps, "completed"),
|
|
38
|
+
flatSteps,
|
|
39
|
+
activeStepIndex,
|
|
40
|
+
activeStep,
|
|
41
|
+
previousStep,
|
|
42
|
+
nextStep,
|
|
43
|
+
started: true,
|
|
44
|
+
ended: true
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
if (action.type === "previous") {
|
|
48
|
+
if (((_b = state.activeStep) == null ? void 0 : _b.status) === "error") {
|
|
49
|
+
return state;
|
|
50
|
+
}
|
|
51
|
+
const steps = utils.resetSteps(state.steps);
|
|
52
|
+
const flatSteps = utils.flattenSteps(steps);
|
|
53
|
+
if (state.previousStep) {
|
|
54
|
+
const activeStepIndex2 = state.activeStepIndex - 1;
|
|
55
|
+
const activeStep2 = flatSteps[activeStepIndex2];
|
|
56
|
+
const previousStep2 = flatSteps[activeStepIndex2 - 1] || null;
|
|
57
|
+
const nextStep2 = flatSteps[activeStepIndex2 + 1] || null;
|
|
58
|
+
if (activeStep2) {
|
|
59
|
+
activeStep2.stage = "active";
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
steps: utils.autoStageSteps(steps),
|
|
63
|
+
flatSteps,
|
|
64
|
+
activeStepIndex: activeStepIndex2,
|
|
65
|
+
activeStep: activeStep2,
|
|
66
|
+
previousStep: previousStep2,
|
|
67
|
+
nextStep: nextStep2,
|
|
68
|
+
started: true,
|
|
69
|
+
ended: false
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const activeStepIndex = -1;
|
|
73
|
+
const activeStep = null;
|
|
74
|
+
const previousStep = null;
|
|
75
|
+
const nextStep = flatSteps.at(0);
|
|
76
|
+
return {
|
|
77
|
+
steps: utils.assignSteps(steps, "pending"),
|
|
78
|
+
flatSteps,
|
|
79
|
+
activeStepIndex,
|
|
80
|
+
activeStep,
|
|
81
|
+
previousStep,
|
|
82
|
+
nextStep,
|
|
83
|
+
ended: false,
|
|
84
|
+
started: false
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
if (action.type === "error") {
|
|
88
|
+
if (state.activeStep) {
|
|
89
|
+
state.activeStep.status = "error";
|
|
90
|
+
return { ...state };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (action.type === "warning") {
|
|
94
|
+
if (state.activeStep) {
|
|
95
|
+
state.activeStep.status = "warning";
|
|
96
|
+
return { ...state };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (action.type === "clear") {
|
|
100
|
+
if (state.activeStep) {
|
|
101
|
+
state.activeStep.status = void 0;
|
|
102
|
+
return { ...state };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return state;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
module.exports = stepReducer;
|
|
109
|
+
//# sourceMappingURL=stepReducer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stepReducer.js","sources":["../src/stepped-tracker/stepReducer.ts"],"sourcesContent":["import type { StepReducerAction, StepReducerState } from \"./stepReducer.types\";\nimport { assignSteps, autoStageSteps, flattenSteps, resetSteps } from \"./utils\";\n\nexport default function stepReducer(\n state: StepReducerState,\n action: StepReducerAction,\n) {\n if (action.type === \"next\") {\n if (state.activeStep?.status === \"error\") {\n return state;\n }\n\n const steps = resetSteps(state.steps);\n const flatSteps = flattenSteps(steps);\n\n if (state.nextStep) {\n const activeStepIndex = state.activeStepIndex + 1;\n const activeStep = flatSteps[activeStepIndex];\n const previousStep = flatSteps[activeStepIndex - 1] || null;\n const nextStep = flatSteps[activeStepIndex + 1] || null;\n\n if (activeStep) {\n activeStep.stage = \"active\";\n }\n\n return {\n steps: autoStageSteps(steps),\n flatSteps,\n activeStepIndex,\n activeStep,\n previousStep,\n nextStep,\n started: true,\n ended: false,\n };\n }\n\n const activeStepIndex = flatSteps.length;\n const previousStep = flatSteps.at(-1);\n const activeStep = null;\n const nextStep = null;\n\n return {\n steps: assignSteps(steps, \"completed\"),\n flatSteps,\n activeStepIndex,\n activeStep,\n previousStep,\n nextStep,\n started: true,\n ended: true,\n } as StepReducerState;\n }\n\n if (action.type === \"previous\") {\n if (state.activeStep?.status === \"error\") {\n return state;\n }\n\n const steps = resetSteps(state.steps);\n const flatSteps = flattenSteps(steps);\n\n if (state.previousStep) {\n const activeStepIndex = state.activeStepIndex - 1;\n const activeStep = flatSteps[activeStepIndex];\n const previousStep = flatSteps[activeStepIndex - 1] || null;\n const nextStep = flatSteps[activeStepIndex + 1] || null;\n\n if (activeStep) {\n activeStep.stage = \"active\";\n }\n\n return {\n steps: autoStageSteps(steps),\n flatSteps,\n activeStepIndex,\n activeStep,\n previousStep,\n nextStep,\n started: true,\n ended: false,\n } as StepReducerState;\n }\n\n const activeStepIndex = -1;\n const activeStep = null;\n const previousStep = null;\n const nextStep = flatSteps.at(0);\n\n return {\n steps: assignSteps(steps, \"pending\"),\n flatSteps,\n activeStepIndex,\n activeStep,\n previousStep,\n nextStep,\n ended: false,\n started: false,\n } as StepReducerState;\n }\n\n if (action.type === \"error\") {\n if (state.activeStep) {\n state.activeStep.status = \"error\";\n return { ...state };\n }\n }\n\n if (action.type === \"warning\") {\n if (state.activeStep) {\n state.activeStep.status = \"warning\";\n return { ...state };\n }\n }\n\n if (action.type === \"clear\") {\n if (state.activeStep) {\n state.activeStep.status = undefined;\n return { ...state };\n }\n }\n\n return state;\n}\n"],"names":["resetSteps","flattenSteps","activeStepIndex","activeStep","previousStep","nextStep","autoStageSteps","assignSteps"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var stepReducer = require('./stepReducer.js');
|
|
5
|
+
var utils = require('./utils.js');
|
|
6
|
+
|
|
7
|
+
function useStepReducer(initialSteps, options) {
|
|
8
|
+
const state = react.useMemo(
|
|
9
|
+
() => utils.initStepReducerState(initialSteps, options),
|
|
10
|
+
[initialSteps, options]
|
|
11
|
+
);
|
|
12
|
+
return react.useReducer(stepReducer, state);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
exports.useStepReducer = useStepReducer;
|
|
16
|
+
//# sourceMappingURL=useStepReducer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStepReducer.js","sources":["../src/stepped-tracker/useStepReducer.ts"],"sourcesContent":["import { useMemo, useReducer } from \"react\";\n\nimport stepReducer from \"./stepReducer\";\nimport { initStepReducerState } from \"./utils\";\n\nimport type { StepRecord } from \"./Step.types\";\nimport type { StepReducerOptions } from \"./stepReducer.types\";\n\nexport function useStepReducer(\n initialSteps: StepRecord[],\n options?: StepReducerOptions,\n) {\n const state = useMemo(\n () => initStepReducerState(initialSteps, options),\n [initialSteps, options],\n );\n\n return useReducer(stepReducer, state);\n}\n"],"names":["useMemo","initStepReducerState","useReducer"],"mappings":";;;;;;AAQgB,SAAA,cAAA,CACd,cACA,OACA,EAAA;AACA,EAAA,MAAM,KAAQ,GAAAA,aAAA;AAAA,IACZ,MAAMC,0BAAqB,CAAA,YAAA,EAAc,OAAO,CAAA;AAAA,IAChD,CAAC,cAAc,OAAO;AAAA,GACxB;AAEA,EAAO,OAAAC,gBAAA,CAAW,aAAa,KAAK,CAAA;AACtC;;;;"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function assignSteps(steps, stage) {
|
|
4
|
+
return steps.map((step) => {
|
|
5
|
+
step.stage = stage;
|
|
6
|
+
if (step.substeps) {
|
|
7
|
+
step.substeps = assignSteps(step.substeps, stage);
|
|
8
|
+
}
|
|
9
|
+
return step;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
function resetSteps(steps) {
|
|
13
|
+
return assignSteps(steps, void 0);
|
|
14
|
+
}
|
|
15
|
+
function autoStageSteps(steps, options) {
|
|
16
|
+
function autoStageHelper(steps2) {
|
|
17
|
+
const pivotIndex = steps2.findIndex(
|
|
18
|
+
(step) => (step == null ? void 0 : step.id) && (options == null ? void 0 : options.activeStepId) && step.id === options.activeStepId || step.stage === "active" || step.stage === "inprogress"
|
|
19
|
+
);
|
|
20
|
+
if (pivotIndex !== -1) {
|
|
21
|
+
const activeStep = steps2[pivotIndex];
|
|
22
|
+
activeStep.stage ||= "active";
|
|
23
|
+
const previousSteps = assignSteps(
|
|
24
|
+
steps2.slice(0, pivotIndex),
|
|
25
|
+
"completed"
|
|
26
|
+
);
|
|
27
|
+
const nextSteps = assignSteps(steps2.slice(pivotIndex + 1), "pending");
|
|
28
|
+
return [...previousSteps, activeStep, ...nextSteps];
|
|
29
|
+
}
|
|
30
|
+
return steps2.reduce(
|
|
31
|
+
(acc, step, index) => {
|
|
32
|
+
if (step.substeps) {
|
|
33
|
+
const substeps = autoStageHelper(step.substeps);
|
|
34
|
+
if (substeps) {
|
|
35
|
+
steps2[index].substeps = substeps;
|
|
36
|
+
steps2[index].stage = "inprogress";
|
|
37
|
+
return autoStageHelper(steps2);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return acc;
|
|
41
|
+
},
|
|
42
|
+
null
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
return autoStageHelper(steps) || assignSteps(steps, steps[0].stage || "pending");
|
|
46
|
+
}
|
|
47
|
+
function flattenSteps(steps) {
|
|
48
|
+
return steps.reduce((acc, step) => {
|
|
49
|
+
if (step.substeps) {
|
|
50
|
+
acc.push(...flattenSteps(step.substeps));
|
|
51
|
+
return acc;
|
|
52
|
+
}
|
|
53
|
+
acc.push(step);
|
|
54
|
+
return acc;
|
|
55
|
+
}, []);
|
|
56
|
+
}
|
|
57
|
+
function initStepReducerState(initialSteps, options) {
|
|
58
|
+
const steps = autoStageSteps(initialSteps, options);
|
|
59
|
+
const flatSteps = flattenSteps(steps);
|
|
60
|
+
const started = !flatSteps.every((step) => step.stage === "pending");
|
|
61
|
+
const ended = flatSteps.every((step) => step.stage === "completed");
|
|
62
|
+
let activeStepIndex = flatSteps.findIndex((step) => step.stage === "active");
|
|
63
|
+
if (activeStepIndex === -1 && ended) {
|
|
64
|
+
activeStepIndex = flatSteps.length;
|
|
65
|
+
}
|
|
66
|
+
const activeStep = flatSteps[activeStepIndex] || null;
|
|
67
|
+
const previousStep = flatSteps[activeStepIndex - 1] || null;
|
|
68
|
+
const nextStep = flatSteps[activeStepIndex + 1] || null;
|
|
69
|
+
return {
|
|
70
|
+
steps,
|
|
71
|
+
flatSteps,
|
|
72
|
+
activeStep,
|
|
73
|
+
previousStep,
|
|
74
|
+
nextStep,
|
|
75
|
+
activeStepIndex,
|
|
76
|
+
ended,
|
|
77
|
+
started
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
exports.assignSteps = assignSteps;
|
|
82
|
+
exports.autoStageSteps = autoStageSteps;
|
|
83
|
+
exports.flattenSteps = flattenSteps;
|
|
84
|
+
exports.initStepReducerState = initStepReducerState;
|
|
85
|
+
exports.resetSteps = resetSteps;
|
|
86
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../src/stepped-tracker/utils.ts"],"sourcesContent":["import type { StepRecord, StepStage } from \"./Step.types\";\nimport type { StepReducerOptions, StepReducerState } from \"./stepReducer.types\";\n\nexport function assignSteps(\n steps: StepRecord[],\n stage?: StepStage,\n): StepRecord[] {\n return steps.map((step) => {\n step.stage = stage;\n if (step.substeps) {\n step.substeps = assignSteps(step.substeps, stage);\n }\n\n return step;\n });\n}\n\nexport function resetSteps(steps: StepRecord[]): StepRecord[] {\n return assignSteps(steps, undefined);\n}\n\nexport function autoStageSteps(\n steps: StepRecord[],\n options?: StepReducerOptions,\n): StepRecord[] {\n function autoStageHelper(steps: StepRecord[]): StepRecord[] | null {\n const pivotIndex = steps.findIndex(\n (step) =>\n (step?.id &&\n options?.activeStepId &&\n step.id === options.activeStepId) ||\n step.stage === \"active\" ||\n step.stage === \"inprogress\",\n );\n\n if (pivotIndex !== -1) {\n const activeStep = steps[pivotIndex];\n\n activeStep.stage ||= \"active\";\n\n const previousSteps = assignSteps(\n steps.slice(0, pivotIndex),\n \"completed\",\n );\n const nextSteps = assignSteps(steps.slice(pivotIndex + 1), \"pending\");\n\n return [...previousSteps, activeStep, ...nextSteps] as StepRecord[];\n }\n\n return steps.reduce(\n (acc, step, index) => {\n if (step.substeps) {\n const substeps = autoStageHelper(step.substeps);\n\n if (substeps) {\n steps[index].substeps = substeps;\n steps[index].stage = \"inprogress\";\n\n return autoStageHelper(steps);\n }\n }\n\n return acc;\n },\n null as StepRecord[] | null,\n );\n }\n\n return (\n autoStageHelper(steps) || assignSteps(steps, steps[0].stage || \"pending\")\n );\n}\n\nexport function flattenSteps(steps: StepRecord[]): StepRecord[] {\n return steps.reduce((acc, step) => {\n if (step.substeps) {\n acc.push(...flattenSteps(step.substeps));\n\n return acc;\n }\n\n acc.push(step);\n\n return acc;\n }, [] as StepRecord[]);\n}\n\nexport function initStepReducerState(\n initialSteps: StepRecord[],\n options?: StepReducerOptions,\n) {\n const steps = autoStageSteps(initialSteps, options);\n const flatSteps = flattenSteps(steps);\n const started = !flatSteps.every((step) => step.stage === \"pending\");\n const ended = flatSteps.every((step) => step.stage === \"completed\");\n\n let activeStepIndex = flatSteps.findIndex((step) => step.stage === \"active\");\n\n if (activeStepIndex === -1 && ended) {\n activeStepIndex = flatSteps.length;\n }\n\n const activeStep = flatSteps[activeStepIndex] || null;\n const previousStep = flatSteps[activeStepIndex - 1] || null;\n const nextStep = flatSteps[activeStepIndex + 1] || null;\n\n return {\n steps,\n flatSteps,\n activeStep,\n previousStep,\n nextStep,\n activeStepIndex,\n ended,\n started,\n } as StepReducerState;\n}\n"],"names":["steps"],"mappings":"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"}
|
|
@@ -48,14 +48,15 @@ const DatePickerMain = forwardRef(
|
|
|
48
48
|
}
|
|
49
49
|
);
|
|
50
50
|
const DatePicker = forwardRef(function DatePicker2(props, ref) {
|
|
51
|
-
const { open, defaultOpen, onOpen, ...rest } = props;
|
|
51
|
+
const { open, defaultOpen, onOpen, readOnly, ...rest } = props;
|
|
52
52
|
return /* @__PURE__ */ jsx(
|
|
53
53
|
DatePickerOverlayProvider,
|
|
54
54
|
{
|
|
55
55
|
open,
|
|
56
56
|
defaultOpen,
|
|
57
57
|
onOpen,
|
|
58
|
-
|
|
58
|
+
readOnly,
|
|
59
|
+
children: /* @__PURE__ */ jsx(DatePickerMain, { ...rest, readOnly, ref })
|
|
59
60
|
}
|
|
60
61
|
);
|
|
61
62
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.js","sources":["../src/date-picker/DatePicker.tsx"],"sourcesContent":["import type { DateFrameworkType } from \"@salt-ds/date-adapters\";\nimport { type ReactNode, forwardRef } from \"react\";\nimport {\n DateRangeSelectionContext,\n type RangeDatePickerState,\n type SingleDatePickerState,\n SingleDateSelectionContext,\n} from \"./DatePickerContext\";\nimport { DatePickerOverlayProvider } from \"./DatePickerOverlayProvider\";\nimport {\n type UseDatePickerRangeProps,\n type UseDatePickerSingleProps,\n useDatePicker,\n} from \"./useDatePicker\";\n\n/**\n * Base props for DatePicker.\n */\nexport interface DatePickerBaseProps {\n className?: string;\n children?: ReactNode;\n /** the open/close state of the overlay. The open/close state will be controlled when this prop is provided. */\n open?: boolean;\n /**\n * Handler for when open state changes\n * @param newOpen - true when opened\n */\n onOpen?: (newOpen: boolean) => void;\n /**\n * the initial open/close state of the overlay, when the open/close state is un-controlled.\n */\n defaultOpen?: DatePickerBaseProps[\"open\"];\n}\n\n/**\n * Props for the DatePicker component, when `selectionVariant` is `single`.\n * @template T\n */\nexport interface DatePickerSingleProps<TDate extends DateFrameworkType>\n extends DatePickerBaseProps,\n UseDatePickerSingleProps<TDate> {\n selectionVariant: \"single\";\n}\n\n/**\n * Props for the DatePicker component, when `selectionVariant` is `range`.\n * @template T\n */\nexport interface DatePickerRangeProps<TDate extends DateFrameworkType>\n extends DatePickerBaseProps,\n UseDatePickerRangeProps<TDate> {\n selectionVariant: \"range\";\n}\n\n/**\n * Props for the DatePicker component.\n * @template T\n */\nexport type DatePickerProps<TDate extends DateFrameworkType> =\n | DatePickerSingleProps<TDate>\n | DatePickerRangeProps<TDate>;\n\nexport const DatePickerMain = forwardRef<HTMLDivElement, DatePickerProps<any>>(\n <TDate extends DateFrameworkType>(\n props: DatePickerProps<TDate>,\n ref: React.Ref<HTMLDivElement>,\n ) => {\n const {\n children,\n readOnly,\n disabled,\n selectionVariant,\n defaultSelectedDate,\n selectedDate,\n onSelectionChange,\n onApply,\n minDate,\n maxDate,\n onCancel,\n ...rest\n } = props;\n // biome-ignore lint/suspicious/noExplicitAny: type guard\n const useDatePickerProps: any = {\n readOnly,\n disabled,\n selectionVariant,\n defaultSelectedDate,\n selectedDate,\n onSelectionChange,\n onApply,\n minDate,\n maxDate,\n onCancel,\n };\n\n if (props.selectionVariant === \"range\") {\n const stateAndHelpers = useDatePicker<TDate, \"range\">(\n useDatePickerProps,\n ref,\n ) as RangeDatePickerState<TDate>;\n return (\n <DateRangeSelectionContext.Provider value={stateAndHelpers}>\n <div ref={stateAndHelpers?.state?.containerRef} {...rest}>\n {children}\n </div>\n </DateRangeSelectionContext.Provider>\n );\n }\n const stateAndHelpers = useDatePicker(\n useDatePickerProps,\n ref,\n ) as SingleDatePickerState<TDate>;\n\n return (\n <SingleDateSelectionContext.Provider value={stateAndHelpers}>\n <div ref={stateAndHelpers?.state?.containerRef} {...rest}>\n {children}\n </div>\n </SingleDateSelectionContext.Provider>\n );\n },\n);\n\nexport const DatePicker = forwardRef(function DatePicker<\n TDate extends DateFrameworkType,\n>(props: DatePickerProps<TDate>, ref: React.Ref<HTMLDivElement>) {\n const { open, defaultOpen, onOpen, ...rest } = props;\n\n return (\n <DatePickerOverlayProvider\n open={open}\n defaultOpen={defaultOpen}\n onOpen={onOpen}\n >\n <DatePickerMain {...rest} ref={ref} />\n </DatePickerOverlayProvider>\n );\n});\n"],"names":["stateAndHelpers","DatePicker"],"mappings":";;;;;;AA8DO,MAAM,cAAiB,GAAA,UAAA;AAAA,EAC5B,CACE,OACA,GACG,KAAA;AAlEP,IAAA,IAAA,EAAA,EAAA,EAAA;AAmEI,IAAM,MAAA;AAAA,MACJ,QAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA,YAAA;AAAA,MACA,iBAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAG;AAAA,KACD,GAAA,KAAA;AAEJ,IAAA,MAAM,kBAA0B,GAAA;AAAA,MAC9B,QAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA,YAAA;AAAA,MACA,iBAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAI,IAAA,KAAA,CAAM,qBAAqB,OAAS,EAAA;AACtC,MAAA,MAAMA,gBAAkB,GAAA,aAAA;AAAA,QACtB,kBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,2BACG,yBAA0B,CAAA,QAAA,EAA1B,EAAmC,KAAOA,EAAAA,gBAAAA,EACzC,8BAAC,KAAI,EAAA,EAAA,GAAA,EAAA,CAAK,KAAAA,gBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,iBAAiB,KAAjB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAwB,cAAe,GAAG,IAAA,EACjD,UACH,CACF,EAAA,CAAA;AAAA;AAGJ,IAAA,MAAM,eAAkB,GAAA,aAAA;AAAA,MACtB,kBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,2BACG,0BAA2B,CAAA,QAAA,EAA3B,EAAoC,KAAA,EAAO,iBAC1C,QAAC,kBAAA,GAAA,CAAA,KAAA,EAAA,EAAI,GAAK,EAAA,CAAA,EAAA,GAAA,eAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,eAAA,CAAiB,UAAjB,IAAwB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,YAAA,EAAe,GAAG,IAAA,EACjD,UACH,CACF,EAAA,CAAA;AAAA;AAGN;AAEO,MAAM,UAAa,GAAA,UAAA,CAAW,SAASC,WAAAA,CAE5C,OAA+B,GAAgC,EAAA;AAC/D,EAAA,MAAM,EAAE,IAAM,EAAA,WAAA,EAAa,
|
|
1
|
+
{"version":3,"file":"DatePicker.js","sources":["../src/date-picker/DatePicker.tsx"],"sourcesContent":["import type { DateFrameworkType } from \"@salt-ds/date-adapters\";\nimport { type ReactNode, forwardRef } from \"react\";\nimport {\n DateRangeSelectionContext,\n type RangeDatePickerState,\n type SingleDatePickerState,\n SingleDateSelectionContext,\n} from \"./DatePickerContext\";\nimport { DatePickerOverlayProvider } from \"./DatePickerOverlayProvider\";\nimport {\n type UseDatePickerRangeProps,\n type UseDatePickerSingleProps,\n useDatePicker,\n} from \"./useDatePicker\";\n\n/**\n * Base props for DatePicker.\n */\nexport interface DatePickerBaseProps {\n className?: string;\n children?: ReactNode;\n /** the open/close state of the overlay. The open/close state will be controlled when this prop is provided. */\n open?: boolean;\n /**\n * Handler for when open state changes\n * @param newOpen - true when opened\n */\n onOpen?: (newOpen: boolean) => void;\n /**\n * the initial open/close state of the overlay, when the open/close state is un-controlled.\n */\n defaultOpen?: DatePickerBaseProps[\"open\"];\n}\n\n/**\n * Props for the DatePicker component, when `selectionVariant` is `single`.\n * @template T\n */\nexport interface DatePickerSingleProps<TDate extends DateFrameworkType>\n extends DatePickerBaseProps,\n UseDatePickerSingleProps<TDate> {\n selectionVariant: \"single\";\n}\n\n/**\n * Props for the DatePicker component, when `selectionVariant` is `range`.\n * @template T\n */\nexport interface DatePickerRangeProps<TDate extends DateFrameworkType>\n extends DatePickerBaseProps,\n UseDatePickerRangeProps<TDate> {\n selectionVariant: \"range\";\n}\n\n/**\n * Props for the DatePicker component.\n * @template T\n */\nexport type DatePickerProps<TDate extends DateFrameworkType> =\n | DatePickerSingleProps<TDate>\n | DatePickerRangeProps<TDate>;\n\nexport const DatePickerMain = forwardRef<HTMLDivElement, DatePickerProps<any>>(\n <TDate extends DateFrameworkType>(\n props: DatePickerProps<TDate>,\n ref: React.Ref<HTMLDivElement>,\n ) => {\n const {\n children,\n readOnly,\n disabled,\n selectionVariant,\n defaultSelectedDate,\n selectedDate,\n onSelectionChange,\n onApply,\n minDate,\n maxDate,\n onCancel,\n ...rest\n } = props;\n // biome-ignore lint/suspicious/noExplicitAny: type guard\n const useDatePickerProps: any = {\n readOnly,\n disabled,\n selectionVariant,\n defaultSelectedDate,\n selectedDate,\n onSelectionChange,\n onApply,\n minDate,\n maxDate,\n onCancel,\n };\n\n if (props.selectionVariant === \"range\") {\n const stateAndHelpers = useDatePicker<TDate, \"range\">(\n useDatePickerProps,\n ref,\n ) as RangeDatePickerState<TDate>;\n return (\n <DateRangeSelectionContext.Provider value={stateAndHelpers}>\n <div ref={stateAndHelpers?.state?.containerRef} {...rest}>\n {children}\n </div>\n </DateRangeSelectionContext.Provider>\n );\n }\n const stateAndHelpers = useDatePicker(\n useDatePickerProps,\n ref,\n ) as SingleDatePickerState<TDate>;\n\n return (\n <SingleDateSelectionContext.Provider value={stateAndHelpers}>\n <div ref={stateAndHelpers?.state?.containerRef} {...rest}>\n {children}\n </div>\n </SingleDateSelectionContext.Provider>\n );\n },\n);\n\nexport const DatePicker = forwardRef(function DatePicker<\n TDate extends DateFrameworkType,\n>(props: DatePickerProps<TDate>, ref: React.Ref<HTMLDivElement>) {\n const { open, defaultOpen, onOpen, readOnly, ...rest } = props;\n\n return (\n <DatePickerOverlayProvider\n open={open}\n defaultOpen={defaultOpen}\n onOpen={onOpen}\n readOnly={readOnly}\n >\n <DatePickerMain {...rest} readOnly={readOnly} ref={ref} />\n </DatePickerOverlayProvider>\n );\n});\n"],"names":["stateAndHelpers","DatePicker"],"mappings":";;;;;;AA8DO,MAAM,cAAiB,GAAA,UAAA;AAAA,EAC5B,CACE,OACA,GACG,KAAA;AAlEP,IAAA,IAAA,EAAA,EAAA,EAAA;AAmEI,IAAM,MAAA;AAAA,MACJ,QAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA,YAAA;AAAA,MACA,iBAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAG;AAAA,KACD,GAAA,KAAA;AAEJ,IAAA,MAAM,kBAA0B,GAAA;AAAA,MAC9B,QAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA,YAAA;AAAA,MACA,iBAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAI,IAAA,KAAA,CAAM,qBAAqB,OAAS,EAAA;AACtC,MAAA,MAAMA,gBAAkB,GAAA,aAAA;AAAA,QACtB,kBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,2BACG,yBAA0B,CAAA,QAAA,EAA1B,EAAmC,KAAOA,EAAAA,gBAAAA,EACzC,8BAAC,KAAI,EAAA,EAAA,GAAA,EAAA,CAAK,KAAAA,gBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,iBAAiB,KAAjB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAwB,cAAe,GAAG,IAAA,EACjD,UACH,CACF,EAAA,CAAA;AAAA;AAGJ,IAAA,MAAM,eAAkB,GAAA,aAAA;AAAA,MACtB,kBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,2BACG,0BAA2B,CAAA,QAAA,EAA3B,EAAoC,KAAA,EAAO,iBAC1C,QAAC,kBAAA,GAAA,CAAA,KAAA,EAAA,EAAI,GAAK,EAAA,CAAA,EAAA,GAAA,eAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,eAAA,CAAiB,UAAjB,IAAwB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,YAAA,EAAe,GAAG,IAAA,EACjD,UACH,CACF,EAAA,CAAA;AAAA;AAGN;AAEO,MAAM,UAAa,GAAA,UAAA,CAAW,SAASC,WAAAA,CAE5C,OAA+B,GAAgC,EAAA;AAC/D,EAAA,MAAM,EAAE,IAAM,EAAA,WAAA,EAAa,QAAQ,QAAU,EAAA,GAAG,MAAS,GAAA,KAAA;AAEzD,EACE,uBAAA,GAAA;AAAA,IAAC,yBAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MAEA,QAAC,kBAAA,GAAA,CAAA,cAAA,EAAA,EAAgB,GAAG,IAAA,EAAM,UAAoB,GAAU,EAAA;AAAA;AAAA,GAC1D;AAEJ,CAAC;;;;"}
|
|
@@ -4,7 +4,7 @@ import { createContext, useControlled, useFloatingUI } from '@salt-ds/core';
|
|
|
4
4
|
import { useRef, useEffect, useCallback, useMemo, useContext } from 'react';
|
|
5
5
|
|
|
6
6
|
const DatePickerOverlayContext = createContext("DatePickerOverlayContext", void 0);
|
|
7
|
-
const DatePickerOverlayProvider = ({ open: openProp, defaultOpen, onOpen, children }) => {
|
|
7
|
+
const DatePickerOverlayProvider = ({ open: openProp, defaultOpen, onOpen, children, readOnly }) => {
|
|
8
8
|
const [open, setOpenState] = useControlled({
|
|
9
9
|
controlled: openProp,
|
|
10
10
|
default: Boolean(defaultOpen),
|
|
@@ -31,6 +31,9 @@ const DatePickerOverlayProvider = ({ open: openProp, defaultOpen, onOpen, childr
|
|
|
31
31
|
(newOpen, _event, reason) => {
|
|
32
32
|
var _a;
|
|
33
33
|
if (newOpen) {
|
|
34
|
+
if (readOnly) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
34
37
|
triggeringElement.current = document.activeElement;
|
|
35
38
|
}
|
|
36
39
|
setOpenState(newOpen);
|
|
@@ -39,7 +42,7 @@ const DatePickerOverlayProvider = ({ open: openProp, defaultOpen, onOpen, childr
|
|
|
39
42
|
(_a = onDismissCallback == null ? void 0 : onDismissCallback.current) == null ? void 0 : _a.call(onDismissCallback);
|
|
40
43
|
}
|
|
41
44
|
},
|
|
42
|
-
[onOpen]
|
|
45
|
+
[onOpen, readOnly]
|
|
43
46
|
);
|
|
44
47
|
const floatingUIResult = useFloatingUI({
|
|
45
48
|
open,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePickerOverlayProvider.js","sources":["../src/date-picker/DatePickerOverlayProvider.tsx"],"sourcesContent":["import {\n type OpenChangeReason,\n flip,\n useDismiss,\n useInteractions,\n} from \"@floating-ui/react\";\nimport { createContext, useControlled, useFloatingUI } from \"@salt-ds/core\";\nimport {\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\n\n/**\n * Interface representing the state for a DatePicker overlay.\n */\ninterface DatePickerOverlayState {\n /**\n * If `true`, the overlay is open.\n */\n open: boolean;\n /**\n * The result of the floating UI calculations.\n */\n floatingUIResult: ReturnType<typeof useFloatingUI>;\n}\n\n/**\n * Interface representing the helper functions for a DatePicker overlay.\n */\ninterface DatePickerOverlayHelpers {\n /**\n * Function to get the props for the floating element.\n */\n getFloatingProps: ReturnType<typeof useInteractions>[\"getFloatingProps\"];\n /**\n * Function to get the props for the reference element.\n */\n getReferenceProps: ReturnType<typeof useInteractions>[\"getReferenceProps\"];\n /**\n * Sets the open state of the overlay.\n * @param newOpen - The new value for the open state.\n */\n setOpen: (newOpen: boolean) => void;\n /**~\n * Register a callback for when onDismiss is called\n * @param onDismissCallback\n */\n setOnDismiss: (onDismissCallback: () => void) => void;\n}\n\n/**\n * Interface representing the context type for a DatePicker overlay.\n */\ninterface DatePickerOverlayContextType {\n /**\n * The state of the DatePicker overlay.\n */\n state: DatePickerOverlayState;\n /**\n * The helper functions for the DatePicker overlay.\n */\n helpers: DatePickerOverlayHelpers;\n}\n\n/**\n * Context for the DatePicker overlay.\n */\nconst DatePickerOverlayContext = createContext<\n DatePickerOverlayContextType | undefined\n>(\"DatePickerOverlayContext\", undefined);\n\n/**\n * Props for the DatePickerOverlayProvider component.\n */\ninterface DatePickerOverlayProviderProps {\n /**\n * If `true`, the overlay is open.\n */\n open?: boolean;\n /**\n * Handler for when open state changes\n * @param newOpen - true when opened\n */\n onOpen?: (newOpen: boolean) => void;\n /**\n * The default open state of the overlay.\n */\n defaultOpen?: boolean;\n /**\n * The content to be rendered inside the overlay provider.\n */\n children: ReactNode;\n}\n\nexport const DatePickerOverlayProvider: React.FC<\n DatePickerOverlayProviderProps\n> = ({ open: openProp, defaultOpen, onOpen, children }) => {\n const [open, setOpenState] = useControlled({\n controlled: openProp,\n default: Boolean(defaultOpen),\n name: \"DatePicker\",\n state: \"openDatePickerOverlay\",\n });\n const triggeringElement = useRef<HTMLElement | null>(null);\n const onDismissCallback = useRef<() => void>();\n\n useEffect(() => {\n if (!open) {\n const trigger = triggeringElement.current as HTMLElement;\n if (trigger) {\n trigger.focus();\n }\n if (trigger instanceof HTMLInputElement) {\n setTimeout(() => {\n trigger.setSelectionRange(0, trigger.value.length);\n }, 0);\n }\n triggeringElement.current = null;\n }\n }, [open]);\n\n const setOpen = useCallback(\n (\n newOpen: boolean,\n _event?: Event | undefined,\n reason?: OpenChangeReason | undefined,\n ) => {\n if (newOpen) {\n triggeringElement.current = document.activeElement as HTMLElement;\n }\n setOpenState(newOpen);\n onOpen?.(newOpen);\n if (\n reason === \"escape-key\" ||\n (reason === \"outside-press\" && onDismissCallback.current)\n ) {\n onDismissCallback?.current?.();\n }\n },\n [onOpen],\n );\n\n const floatingUIResult = useFloatingUI({\n open,\n onOpenChange: setOpen,\n placement: \"bottom-start\",\n middleware: [flip({ fallbackStrategy: \"initialPlacement\" })],\n });\n\n const {\n getFloatingProps: _getFloatingPropsCallback,\n getReferenceProps: _getReferenceProps,\n } = useInteractions([useDismiss(floatingUIResult.context)]);\n const getFloatingPropsCallback = useMemo(\n () => _getFloatingPropsCallback,\n [_getFloatingPropsCallback],\n );\n const getReferenceProps = useMemo(\n () => _getReferenceProps,\n [_getReferenceProps],\n );\n\n const getFloatingProps = useCallback(\n (userProps: React.HTMLProps<HTMLElement> | undefined) => {\n const { x, y, strategy, elements } = floatingUIResult;\n return {\n top: y ?? 0,\n left: x ?? 0,\n position: strategy,\n width: elements.floating?.offsetWidth,\n height: elements.floating?.offsetHeight,\n ...getFloatingPropsCallback(userProps),\n };\n },\n [getFloatingPropsCallback, floatingUIResult],\n );\n const setOnDismiss = useCallback((dismissCallback: () => void) => {\n onDismissCallback.current = dismissCallback;\n }, []);\n\n const state: DatePickerOverlayState = useMemo(\n () => ({\n open,\n floatingUIResult,\n }),\n [open, floatingUIResult],\n );\n\n const helpers: DatePickerOverlayHelpers = useMemo(\n () => ({\n getFloatingProps,\n getReferenceProps,\n setOpen,\n setOnDismiss,\n }),\n [getFloatingProps, getReferenceProps, setOpen],\n );\n const contextValue = useMemo(() => ({ state, helpers }), [state, helpers]);\n\n return (\n <DatePickerOverlayContext.Provider value={contextValue}>\n {children}\n </DatePickerOverlayContext.Provider>\n );\n};\n\nexport const useDatePickerOverlay = (): DatePickerOverlayContextType => {\n const context = useContext(DatePickerOverlayContext);\n if (!context) {\n throw new Error(\n \"useDatePickerOverlay must be used within a DatePickerOverlayProvider\",\n );\n }\n return context;\n};\n"],"names":[],"mappings":";;;;;AAuEA,MAAM,wBAAA,GAA2B,aAE/B,CAAA,0BAAA,EAA4B,KAAS,CAAA,CAAA;
|
|
1
|
+
{"version":3,"file":"DatePickerOverlayProvider.js","sources":["../src/date-picker/DatePickerOverlayProvider.tsx"],"sourcesContent":["import {\n type OpenChangeReason,\n flip,\n useDismiss,\n useInteractions,\n} from \"@floating-ui/react\";\nimport { createContext, useControlled, useFloatingUI } from \"@salt-ds/core\";\nimport {\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\n\n/**\n * Interface representing the state for a DatePicker overlay.\n */\ninterface DatePickerOverlayState {\n /**\n * If `true`, the overlay is open.\n */\n open: boolean;\n /**\n * The result of the floating UI calculations.\n */\n floatingUIResult: ReturnType<typeof useFloatingUI>;\n}\n\n/**\n * Interface representing the helper functions for a DatePicker overlay.\n */\ninterface DatePickerOverlayHelpers {\n /**\n * Function to get the props for the floating element.\n */\n getFloatingProps: ReturnType<typeof useInteractions>[\"getFloatingProps\"];\n /**\n * Function to get the props for the reference element.\n */\n getReferenceProps: ReturnType<typeof useInteractions>[\"getReferenceProps\"];\n /**\n * Sets the open state of the overlay.\n * @param newOpen - The new value for the open state.\n */\n setOpen: (newOpen: boolean) => void;\n /**~\n * Register a callback for when onDismiss is called\n * @param onDismissCallback\n */\n setOnDismiss: (onDismissCallback: () => void) => void;\n}\n\n/**\n * Interface representing the context type for a DatePicker overlay.\n */\ninterface DatePickerOverlayContextType {\n /**\n * The state of the DatePicker overlay.\n */\n state: DatePickerOverlayState;\n /**\n * The helper functions for the DatePicker overlay.\n */\n helpers: DatePickerOverlayHelpers;\n}\n\n/**\n * Context for the DatePicker overlay.\n */\nconst DatePickerOverlayContext = createContext<\n DatePickerOverlayContextType | undefined\n>(\"DatePickerOverlayContext\", undefined);\n\n/**\n * Props for the DatePickerOverlayProvider component.\n */\ninterface DatePickerOverlayProviderProps {\n /**\n * If `true`, the overlay is open.\n */\n open?: boolean;\n /**\n * Handler for when open state changes\n * @param newOpen - true when opened\n */\n onOpen?: (newOpen: boolean) => void;\n /**\n * The default open state of the overlay.\n */\n defaultOpen?: boolean;\n /**\n * The content to be rendered inside the overlay provider.\n */\n children: ReactNode;\n /**\n * When true, shouldn't open the overlay.\n */\n readOnly?: boolean;\n}\n\nexport const DatePickerOverlayProvider: React.FC<\n DatePickerOverlayProviderProps\n> = ({ open: openProp, defaultOpen, onOpen, children, readOnly }) => {\n const [open, setOpenState] = useControlled({\n controlled: openProp,\n default: Boolean(defaultOpen),\n name: \"DatePicker\",\n state: \"openDatePickerOverlay\",\n });\n const triggeringElement = useRef<HTMLElement | null>(null);\n const onDismissCallback = useRef<() => void>();\n\n useEffect(() => {\n if (!open) {\n const trigger = triggeringElement.current as HTMLElement;\n if (trigger) {\n trigger.focus();\n }\n if (trigger instanceof HTMLInputElement) {\n setTimeout(() => {\n trigger.setSelectionRange(0, trigger.value.length);\n }, 0);\n }\n triggeringElement.current = null;\n }\n }, [open]);\n\n const setOpen = useCallback(\n (\n newOpen: boolean,\n _event?: Event | undefined,\n reason?: OpenChangeReason | undefined,\n ) => {\n if (newOpen) {\n if (readOnly) {\n // When not open overlay when readOnly\n return;\n }\n triggeringElement.current = document.activeElement as HTMLElement;\n }\n setOpenState(newOpen);\n onOpen?.(newOpen);\n if (\n reason === \"escape-key\" ||\n (reason === \"outside-press\" && onDismissCallback.current)\n ) {\n onDismissCallback?.current?.();\n }\n },\n [onOpen, readOnly],\n );\n\n const floatingUIResult = useFloatingUI({\n open,\n onOpenChange: setOpen,\n placement: \"bottom-start\",\n middleware: [flip({ fallbackStrategy: \"initialPlacement\" })],\n });\n\n const {\n getFloatingProps: _getFloatingPropsCallback,\n getReferenceProps: _getReferenceProps,\n } = useInteractions([useDismiss(floatingUIResult.context)]);\n const getFloatingPropsCallback = useMemo(\n () => _getFloatingPropsCallback,\n [_getFloatingPropsCallback],\n );\n const getReferenceProps = useMemo(\n () => _getReferenceProps,\n [_getReferenceProps],\n );\n\n const getFloatingProps = useCallback(\n (userProps: React.HTMLProps<HTMLElement> | undefined) => {\n const { x, y, strategy, elements } = floatingUIResult;\n return {\n top: y ?? 0,\n left: x ?? 0,\n position: strategy,\n width: elements.floating?.offsetWidth,\n height: elements.floating?.offsetHeight,\n ...getFloatingPropsCallback(userProps),\n };\n },\n [getFloatingPropsCallback, floatingUIResult],\n );\n const setOnDismiss = useCallback((dismissCallback: () => void) => {\n onDismissCallback.current = dismissCallback;\n }, []);\n\n const state: DatePickerOverlayState = useMemo(\n () => ({\n open,\n floatingUIResult,\n }),\n [open, floatingUIResult],\n );\n\n const helpers: DatePickerOverlayHelpers = useMemo(\n () => ({\n getFloatingProps,\n getReferenceProps,\n setOpen,\n setOnDismiss,\n }),\n [getFloatingProps, getReferenceProps, setOpen],\n );\n const contextValue = useMemo(() => ({ state, helpers }), [state, helpers]);\n\n return (\n <DatePickerOverlayContext.Provider value={contextValue}>\n {children}\n </DatePickerOverlayContext.Provider>\n );\n};\n\nexport const useDatePickerOverlay = (): DatePickerOverlayContextType => {\n const context = useContext(DatePickerOverlayContext);\n if (!context) {\n throw new Error(\n \"useDatePickerOverlay must be used within a DatePickerOverlayProvider\",\n );\n }\n return context;\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -148,7 +148,7 @@ const DatePickerRangeInput = forwardRef(function DatePickerRangeInput2(props, re
|
|
|
148
148
|
onDateChange: handleDateChange,
|
|
149
149
|
onDateValueChange: handleDateValueChange,
|
|
150
150
|
onChange,
|
|
151
|
-
endAdornment: /* @__PURE__ */ jsx(
|
|
151
|
+
endAdornment: !readOnly && /* @__PURE__ */ jsx(
|
|
152
152
|
Button,
|
|
153
153
|
{
|
|
154
154
|
appearance: "transparent",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePickerRangeInput.js","sources":["../src/date-picker/DatePickerRangeInput.tsx"],"sourcesContent":["import { Button, makePrefixer, useControlled, useIcon } from \"@salt-ds/core\";\nimport {\n DateDetailErrorEnum,\n type DateFrameworkType,\n type SaltDateAdapter,\n} from \"@salt-ds/date-adapters\";\nimport { clsx } from \"clsx\";\nimport {\n type KeyboardEvent,\n type KeyboardEventHandler,\n type SyntheticEvent,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport type { DateRangeSelection, SingleDateSelection } from \"../calendar\";\nimport {\n DateInputRange,\n type DateInputRangeDetails,\n type DateInputRangeProps,\n type DateInputRangeValue,\n} from \"../date-input\";\nimport { useLocalization } from \"../localization-provider\";\nimport { useDatePickerContext } from \"./DatePickerContext\";\nimport { useDatePickerOverlay } from \"./DatePickerOverlayProvider\";\n\nconst withBaseName = makePrefixer(\"saltDatePickerRangeInput\");\n\n/**\n * Props for the DatePickerRangeInput component.\n */\nexport interface DatePickerRangeInputProps<TDate extends DateFrameworkType>\n extends DateInputRangeProps<TDate> {\n /**\n * Function to validate the entered date\n * @param date - The selected date\n * @param details - The details of date selection, either a valid date or error\n * @returns updated DateInputRangeDetails details\n */\n validate?: (\n date: DateRangeSelection<TDate> | null,\n details: DateInputRangeDetails,\n ) => DateInputRangeDetails;\n}\n\nexport function defaultRangeValidator<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n date: DateRangeSelection<TDate> | null,\n details: DateInputRangeDetails,\n minDate: TDate | undefined,\n maxDate: TDate | undefined,\n): DateInputRangeDetails {\n const { startDate, endDate } = date || {};\n\n if (!startDate) {\n details.startDate = details.startDate || {};\n details.startDate.errors = details.startDate.errors || [];\n details.startDate.errors.push({\n type: DateDetailErrorEnum.UNSET,\n message: \"no start date defined\",\n });\n }\n if (!endDate) {\n details.endDate = details.endDate || {};\n details.endDate.errors = details.endDate.errors || [];\n details.endDate.errors.push({\n type: DateDetailErrorEnum.UNSET,\n message: \"no end date defined\",\n });\n }\n\n // If startDate is after endDate\n if (\n dateAdapter.isValid(startDate) &&\n dateAdapter.isValid(endDate) &&\n dateAdapter.compare(startDate, endDate) > 0\n ) {\n details.startDate = details.startDate || {};\n details.startDate.errors = details.startDate.errors || [];\n details.startDate.errors.push({\n type: \"greater-than-end-date\",\n message: \"start date after end date\",\n });\n }\n // If startDate is before minDate\n if (\n minDate &&\n dateAdapter.isValid(startDate) &&\n dateAdapter.compare(startDate, minDate) < 0\n ) {\n details.startDate = details.startDate || {};\n details.startDate.errors = details.startDate.errors || [];\n details.startDate.errors.push({\n type: \"min-date\",\n message: \"is before min date\",\n });\n }\n // If endDate is after maxDate\n if (\n maxDate &&\n dateAdapter.isValid(endDate) &&\n dateAdapter.compare(endDate, maxDate) > 0\n ) {\n details.endDate = details.endDate || {};\n details.endDate.errors = details.endDate.errors || [];\n details.endDate.errors.push({\n type: \"max-date\",\n message: \"is after max date\",\n });\n }\n return details;\n}\n\nexport const DatePickerRangeInput = forwardRef(function DatePickerRangeInput<\n TDate extends DateFrameworkType,\n>(\n props: DatePickerRangeInputProps<SingleDateSelection<TDate>>,\n ref: React.Ref<HTMLDivElement>,\n) {\n const { dateAdapter } = useLocalization<TDate>();\n const {\n className,\n endInputProps: endInputPropsProp,\n startInputProps: startInputPropsProp,\n onKeyDown,\n defaultValue,\n format,\n value: valueProp,\n validate,\n onChange,\n onDateValueChange,\n ...rest\n } = props;\n\n const { CalendarIcon } = useIcon();\n\n const {\n state: { selectedDate, disabled, readOnly, cancelled, minDate, maxDate },\n helpers: { select },\n } = useDatePickerContext<TDate>({ selectionVariant: \"range\" });\n const {\n state: { open },\n helpers: { setOpen },\n } = useDatePickerOverlay();\n\n const previousValue = useRef<typeof valueProp>();\n\n const [value, setValue] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: \"DatePickerRangeInput\",\n state: \"dateValue\",\n });\n\n const handleCalendarButton = useCallback(() => {\n setOpen(!open);\n }, [open, setOpen]);\n\n const handleDateChange = useCallback(\n (\n event: SyntheticEvent,\n date: DateRangeSelection<TDate> | null,\n details: DateInputRangeDetails,\n ) => {\n const validatedDetails = validate\n ? validate(date, details)\n : defaultRangeValidator(dateAdapter, date, details, minDate, maxDate);\n select(event, date, validatedDetails);\n },\n [select, minDate, maxDate],\n );\n\n const handleDateValueChange = useCallback(\n (event: SyntheticEvent | null, newDateValue: DateInputRangeValue) => {\n setValue(newDateValue);\n onDateValueChange?.(event, newDateValue);\n },\n [onDateValueChange],\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: should run when open changes and not selected date or value\n useEffect(() => {\n if (open) {\n previousValue.current = value;\n }\n }, [open]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: avoid excessive re-rendering\n useEffect(() => {\n if (cancelled) {\n setValue(previousValue.current);\n }\n }, [cancelled]);\n\n const startInputProps: {\n onKeyDown: KeyboardEventHandler<HTMLInputElement>;\n } = {\n onKeyDown: (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"ArrowDown\") {\n setOpen(true);\n }\n startInputPropsProp?.onKeyDown?.(event);\n },\n ...startInputPropsProp,\n };\n const endInputProps: {\n onKeyDown: KeyboardEventHandler<HTMLInputElement>;\n } = {\n onKeyDown: (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"ArrowDown\") {\n setOpen(true);\n }\n endInputPropsProp?.onKeyDown?.(event);\n },\n ...endInputPropsProp,\n };\n\n return (\n <DateInputRange\n value={\n value ?? {\n startDate: dateAdapter.format(value, format),\n endDate: dateAdapter.format(value, format),\n }\n }\n className={clsx(withBaseName(), className)}\n date={selectedDate ?? null}\n startInputProps={startInputProps}\n endInputProps={endInputProps}\n readOnly={readOnly}\n ref={ref}\n onDateChange={handleDateChange}\n onDateValueChange={handleDateValueChange}\n onChange={onChange}\n endAdornment={\n <Button\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleCalendarButton}\n disabled={disabled}\n aria-label=\"Open Calendar\"\n >\n <CalendarIcon />\n </Button>\n }\n format={format}\n {...rest}\n />\n );\n});\n"],"names":["DatePickerRangeInput"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DatePickerRangeInput.js","sources":["../src/date-picker/DatePickerRangeInput.tsx"],"sourcesContent":["import { Button, makePrefixer, useControlled, useIcon } from \"@salt-ds/core\";\nimport {\n DateDetailErrorEnum,\n type DateFrameworkType,\n type SaltDateAdapter,\n} from \"@salt-ds/date-adapters\";\nimport { clsx } from \"clsx\";\nimport {\n type KeyboardEvent,\n type KeyboardEventHandler,\n type SyntheticEvent,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport type { DateRangeSelection, SingleDateSelection } from \"../calendar\";\nimport {\n DateInputRange,\n type DateInputRangeDetails,\n type DateInputRangeProps,\n type DateInputRangeValue,\n} from \"../date-input\";\nimport { useLocalization } from \"../localization-provider\";\nimport { useDatePickerContext } from \"./DatePickerContext\";\nimport { useDatePickerOverlay } from \"./DatePickerOverlayProvider\";\n\nconst withBaseName = makePrefixer(\"saltDatePickerRangeInput\");\n\n/**\n * Props for the DatePickerRangeInput component.\n */\nexport interface DatePickerRangeInputProps<TDate extends DateFrameworkType>\n extends DateInputRangeProps<TDate> {\n /**\n * Function to validate the entered date\n * @param date - The selected date\n * @param details - The details of date selection, either a valid date or error\n * @returns updated DateInputRangeDetails details\n */\n validate?: (\n date: DateRangeSelection<TDate> | null,\n details: DateInputRangeDetails,\n ) => DateInputRangeDetails;\n}\n\nexport function defaultRangeValidator<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n date: DateRangeSelection<TDate> | null,\n details: DateInputRangeDetails,\n minDate: TDate | undefined,\n maxDate: TDate | undefined,\n): DateInputRangeDetails {\n const { startDate, endDate } = date || {};\n\n if (!startDate) {\n details.startDate = details.startDate || {};\n details.startDate.errors = details.startDate.errors || [];\n details.startDate.errors.push({\n type: DateDetailErrorEnum.UNSET,\n message: \"no start date defined\",\n });\n }\n if (!endDate) {\n details.endDate = details.endDate || {};\n details.endDate.errors = details.endDate.errors || [];\n details.endDate.errors.push({\n type: DateDetailErrorEnum.UNSET,\n message: \"no end date defined\",\n });\n }\n\n // If startDate is after endDate\n if (\n dateAdapter.isValid(startDate) &&\n dateAdapter.isValid(endDate) &&\n dateAdapter.compare(startDate, endDate) > 0\n ) {\n details.startDate = details.startDate || {};\n details.startDate.errors = details.startDate.errors || [];\n details.startDate.errors.push({\n type: \"greater-than-end-date\",\n message: \"start date after end date\",\n });\n }\n // If startDate is before minDate\n if (\n minDate &&\n dateAdapter.isValid(startDate) &&\n dateAdapter.compare(startDate, minDate) < 0\n ) {\n details.startDate = details.startDate || {};\n details.startDate.errors = details.startDate.errors || [];\n details.startDate.errors.push({\n type: \"min-date\",\n message: \"is before min date\",\n });\n }\n // If endDate is after maxDate\n if (\n maxDate &&\n dateAdapter.isValid(endDate) &&\n dateAdapter.compare(endDate, maxDate) > 0\n ) {\n details.endDate = details.endDate || {};\n details.endDate.errors = details.endDate.errors || [];\n details.endDate.errors.push({\n type: \"max-date\",\n message: \"is after max date\",\n });\n }\n return details;\n}\n\nexport const DatePickerRangeInput = forwardRef(function DatePickerRangeInput<\n TDate extends DateFrameworkType,\n>(\n props: DatePickerRangeInputProps<SingleDateSelection<TDate>>,\n ref: React.Ref<HTMLDivElement>,\n) {\n const { dateAdapter } = useLocalization<TDate>();\n const {\n className,\n endInputProps: endInputPropsProp,\n startInputProps: startInputPropsProp,\n onKeyDown,\n defaultValue,\n format,\n value: valueProp,\n validate,\n onChange,\n onDateValueChange,\n ...rest\n } = props;\n\n const { CalendarIcon } = useIcon();\n\n const {\n state: { selectedDate, disabled, readOnly, cancelled, minDate, maxDate },\n helpers: { select },\n } = useDatePickerContext<TDate>({ selectionVariant: \"range\" });\n const {\n state: { open },\n helpers: { setOpen },\n } = useDatePickerOverlay();\n\n const previousValue = useRef<typeof valueProp>();\n\n const [value, setValue] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: \"DatePickerRangeInput\",\n state: \"dateValue\",\n });\n\n const handleCalendarButton = useCallback(() => {\n setOpen(!open);\n }, [open, setOpen]);\n\n const handleDateChange = useCallback(\n (\n event: SyntheticEvent,\n date: DateRangeSelection<TDate> | null,\n details: DateInputRangeDetails,\n ) => {\n const validatedDetails = validate\n ? validate(date, details)\n : defaultRangeValidator(dateAdapter, date, details, minDate, maxDate);\n select(event, date, validatedDetails);\n },\n [select, minDate, maxDate],\n );\n\n const handleDateValueChange = useCallback(\n (event: SyntheticEvent | null, newDateValue: DateInputRangeValue) => {\n setValue(newDateValue);\n onDateValueChange?.(event, newDateValue);\n },\n [onDateValueChange],\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: should run when open changes and not selected date or value\n useEffect(() => {\n if (open) {\n previousValue.current = value;\n }\n }, [open]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: avoid excessive re-rendering\n useEffect(() => {\n if (cancelled) {\n setValue(previousValue.current);\n }\n }, [cancelled]);\n\n const startInputProps: {\n onKeyDown: KeyboardEventHandler<HTMLInputElement>;\n } = {\n onKeyDown: (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"ArrowDown\") {\n setOpen(true);\n }\n startInputPropsProp?.onKeyDown?.(event);\n },\n ...startInputPropsProp,\n };\n const endInputProps: {\n onKeyDown: KeyboardEventHandler<HTMLInputElement>;\n } = {\n onKeyDown: (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"ArrowDown\") {\n setOpen(true);\n }\n endInputPropsProp?.onKeyDown?.(event);\n },\n ...endInputPropsProp,\n };\n\n return (\n <DateInputRange\n value={\n value ?? {\n startDate: dateAdapter.format(value, format),\n endDate: dateAdapter.format(value, format),\n }\n }\n className={clsx(withBaseName(), className)}\n date={selectedDate ?? null}\n startInputProps={startInputProps}\n endInputProps={endInputProps}\n readOnly={readOnly}\n ref={ref}\n onDateChange={handleDateChange}\n onDateValueChange={handleDateValueChange}\n onChange={onChange}\n endAdornment={\n !readOnly && (\n <Button\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleCalendarButton}\n disabled={disabled}\n aria-label=\"Open Calendar\"\n >\n <CalendarIcon />\n </Button>\n )\n }\n format={format}\n {...rest}\n />\n );\n});\n"],"names":["DatePickerRangeInput"],"mappings":";;;;;;;;;;;AA2BA,MAAM,YAAA,GAAe,aAAa,0BAA0B,CAAA;AAmBrD,SAAS,qBACd,CAAA,WAAA,EACA,IACA,EAAA,OAAA,EACA,SACA,OACuB,EAAA;AACvB,EAAA,MAAM,EAAE,SAAA,EAAW,OAAQ,EAAA,GAAI,QAAQ,EAAC;AAExC,EAAA,IAAI,CAAC,SAAW,EAAA;AACd,IAAQ,OAAA,CAAA,SAAA,GAAY,OAAQ,CAAA,SAAA,IAAa,EAAC;AAC1C,IAAA,OAAA,CAAQ,SAAU,CAAA,MAAA,GAAS,OAAQ,CAAA,SAAA,CAAU,UAAU,EAAC;AACxD,IAAQ,OAAA,CAAA,SAAA,CAAU,OAAO,IAAK,CAAA;AAAA,MAC5B,MAAM,mBAAoB,CAAA,KAAA;AAAA,MAC1B,OAAS,EAAA;AAAA,KACV,CAAA;AAAA;AAEH,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAQ,OAAA,CAAA,OAAA,GAAU,OAAQ,CAAA,OAAA,IAAW,EAAC;AACtC,IAAA,OAAA,CAAQ,OAAQ,CAAA,MAAA,GAAS,OAAQ,CAAA,OAAA,CAAQ,UAAU,EAAC;AACpD,IAAQ,OAAA,CAAA,OAAA,CAAQ,OAAO,IAAK,CAAA;AAAA,MAC1B,MAAM,mBAAoB,CAAA,KAAA;AAAA,MAC1B,OAAS,EAAA;AAAA,KACV,CAAA;AAAA;AAIH,EAAA,IACE,WAAY,CAAA,OAAA,CAAQ,SAAS,CAAA,IAC7B,WAAY,CAAA,OAAA,CAAQ,OAAO,CAAA,IAC3B,WAAY,CAAA,OAAA,CAAQ,SAAW,EAAA,OAAO,IAAI,CAC1C,EAAA;AACA,IAAQ,OAAA,CAAA,SAAA,GAAY,OAAQ,CAAA,SAAA,IAAa,EAAC;AAC1C,IAAA,OAAA,CAAQ,SAAU,CAAA,MAAA,GAAS,OAAQ,CAAA,SAAA,CAAU,UAAU,EAAC;AACxD,IAAQ,OAAA,CAAA,SAAA,CAAU,OAAO,IAAK,CAAA;AAAA,MAC5B,IAAM,EAAA,uBAAA;AAAA,MACN,OAAS,EAAA;AAAA,KACV,CAAA;AAAA;AAGH,EACE,IAAA,OAAA,IACA,WAAY,CAAA,OAAA,CAAQ,SAAS,CAAA,IAC7B,YAAY,OAAQ,CAAA,SAAA,EAAW,OAAO,CAAA,GAAI,CAC1C,EAAA;AACA,IAAQ,OAAA,CAAA,SAAA,GAAY,OAAQ,CAAA,SAAA,IAAa,EAAC;AAC1C,IAAA,OAAA,CAAQ,SAAU,CAAA,MAAA,GAAS,OAAQ,CAAA,SAAA,CAAU,UAAU,EAAC;AACxD,IAAQ,OAAA,CAAA,SAAA,CAAU,OAAO,IAAK,CAAA;AAAA,MAC5B,IAAM,EAAA,UAAA;AAAA,MACN,OAAS,EAAA;AAAA,KACV,CAAA;AAAA;AAGH,EACE,IAAA,OAAA,IACA,WAAY,CAAA,OAAA,CAAQ,OAAO,CAAA,IAC3B,YAAY,OAAQ,CAAA,OAAA,EAAS,OAAO,CAAA,GAAI,CACxC,EAAA;AACA,IAAQ,OAAA,CAAA,OAAA,GAAU,OAAQ,CAAA,OAAA,IAAW,EAAC;AACtC,IAAA,OAAA,CAAQ,OAAQ,CAAA,MAAA,GAAS,OAAQ,CAAA,OAAA,CAAQ,UAAU,EAAC;AACpD,IAAQ,OAAA,CAAA,OAAA,CAAQ,OAAO,IAAK,CAAA;AAAA,MAC1B,IAAM,EAAA,UAAA;AAAA,MACN,OAAS,EAAA;AAAA,KACV,CAAA;AAAA;AAEH,EAAO,OAAA,OAAA;AACT;AAEO,MAAM,oBAAuB,GAAA,UAAA,CAAW,SAASA,qBAAAA,CAGtD,OACA,GACA,EAAA;AACA,EAAM,MAAA,EAAE,WAAY,EAAA,GAAI,eAAuB,EAAA;AAC/C,EAAM,MAAA;AAAA,IACJ,SAAA;AAAA,IACA,aAAe,EAAA,iBAAA;AAAA,IACf,eAAiB,EAAA,mBAAA;AAAA,IACjB,SAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAO,EAAA,SAAA;AAAA,IACP,QAAA;AAAA,IACA,QAAA;AAAA,IACA,iBAAA;AAAA,IACA,GAAG;AAAA,GACD,GAAA,KAAA;AAEJ,EAAM,MAAA,EAAE,YAAa,EAAA,GAAI,OAAQ,EAAA;AAEjC,EAAM,MAAA;AAAA,IACJ,OAAO,EAAE,YAAA,EAAc,UAAU,QAAU,EAAA,SAAA,EAAW,SAAS,OAAQ,EAAA;AAAA,IACvE,OAAA,EAAS,EAAE,MAAO;AAAA,GAChB,GAAA,oBAAA,CAA4B,EAAE,gBAAA,EAAkB,SAAS,CAAA;AAC7D,EAAM,MAAA;AAAA,IACJ,KAAA,EAAO,EAAE,IAAK,EAAA;AAAA,IACd,OAAA,EAAS,EAAE,OAAQ;AAAA,MACjB,oBAAqB,EAAA;AAEzB,EAAA,MAAM,gBAAgB,MAAyB,EAAA;AAE/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,aAAc,CAAA;AAAA,IACtC,UAAY,EAAA,SAAA;AAAA,IACZ,OAAS,EAAA,YAAA;AAAA,IACT,IAAM,EAAA,sBAAA;AAAA,IACN,KAAO,EAAA;AAAA,GACR,CAAA;AAED,EAAM,MAAA,oBAAA,GAAuB,YAAY,MAAM;AAC7C,IAAA,OAAA,CAAQ,CAAC,IAAI,CAAA;AAAA,GACZ,EAAA,CAAC,IAAM,EAAA,OAAO,CAAC,CAAA;AAElB,EAAA,MAAM,gBAAmB,GAAA,WAAA;AAAA,IACvB,CACE,KACA,EAAA,IAAA,EACA,OACG,KAAA;AACH,MAAM,MAAA,gBAAA,GAAmB,QACrB,GAAA,QAAA,CAAS,IAAM,EAAA,OAAO,CACtB,GAAA,qBAAA,CAAsB,WAAa,EAAA,IAAA,EAAM,OAAS,EAAA,OAAA,EAAS,OAAO,CAAA;AACtE,MAAO,MAAA,CAAA,KAAA,EAAO,MAAM,gBAAgB,CAAA;AAAA,KACtC;AAAA,IACA,CAAC,MAAQ,EAAA,OAAA,EAAS,OAAO;AAAA,GAC3B;AAEA,EAAA,MAAM,qBAAwB,GAAA,WAAA;AAAA,IAC5B,CAAC,OAA8B,YAAsC,KAAA;AACnE,MAAA,QAAA,CAAS,YAAY,CAAA;AACrB,MAAA,iBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,iBAAA,CAAoB,KAAO,EAAA,YAAA,CAAA;AAAA,KAC7B;AAAA,IACA,CAAC,iBAAiB;AAAA,GACpB;AAGA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAM,EAAA;AACR,MAAA,aAAA,CAAc,OAAU,GAAA,KAAA;AAAA;AAC1B,GACF,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAW,EAAA;AACb,MAAA,QAAA,CAAS,cAAc,OAAO,CAAA;AAAA;AAChC,GACF,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,eAEF,GAAA;AAAA,IACF,SAAA,EAAW,CAAC,KAA2C,KAAA;AAtM3D,MAAA,IAAA,EAAA;AAuMM,MAAI,IAAA,KAAA,CAAM,QAAQ,WAAa,EAAA;AAC7B,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA;AAEd,MAAA,CAAA,EAAA,GAAA,mBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,mBAAA,CAAqB,cAArB,IAAiC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,mBAAA,EAAA,KAAA,CAAA;AAAA,KACnC;AAAA,IACA,GAAG;AAAA,GACL;AACA,EAAA,MAAM,aAEF,GAAA;AAAA,IACF,SAAA,EAAW,CAAC,KAA2C,KAAA;AAjN3D,MAAA,IAAA,EAAA;AAkNM,MAAI,IAAA,KAAA,CAAM,QAAQ,WAAa,EAAA;AAC7B,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA;AAEd,MAAA,CAAA,EAAA,GAAA,iBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,iBAAA,CAAmB,cAAnB,IAA+B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,iBAAA,EAAA,KAAA,CAAA;AAAA,KACjC;AAAA,IACA,GAAG;AAAA,GACL;AAEA,EACE,uBAAA,GAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,OACE,KAAS,IAAA;AAAA,QACP,SAAW,EAAA,WAAA,CAAY,MAAO,CAAA,KAAA,EAAO,MAAM,CAAA;AAAA,QAC3C,OAAS,EAAA,WAAA,CAAY,MAAO,CAAA,KAAA,EAAO,MAAM;AAAA,OAC3C;AAAA,MAEF,SAAW,EAAA,IAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,MACzC,MAAM,YAAgB,IAAA,IAAA;AAAA,MACtB,eAAA;AAAA,MACA,aAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAA;AAAA,MACA,YAAc,EAAA,gBAAA;AAAA,MACd,iBAAmB,EAAA,qBAAA;AAAA,MACnB,QAAA;AAAA,MACA,YAAA,EACE,CAAC,QACC,oBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,UAAW,EAAA,aAAA;AAAA,UACX,SAAU,EAAA,SAAA;AAAA,UACV,OAAS,EAAA,oBAAA;AAAA,UACT,QAAA;AAAA,UACA,YAAW,EAAA,eAAA;AAAA,UAEX,8BAAC,YAAa,EAAA,EAAA;AAAA;AAAA,OAChB;AAAA,MAGJ,MAAA;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC;;;;"}
|
|
@@ -117,7 +117,7 @@ const DatePickerSingleInput = forwardRef(
|
|
|
117
117
|
ref,
|
|
118
118
|
onDateChange: handleDateChange,
|
|
119
119
|
onDateValueChange: handleDateValueChange,
|
|
120
|
-
endAdornment: /* @__PURE__ */ jsx(
|
|
120
|
+
endAdornment: !readOnly && /* @__PURE__ */ jsx(
|
|
121
121
|
Button,
|
|
122
122
|
{
|
|
123
123
|
appearance: "transparent",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePickerSingleInput.js","sources":["../src/date-picker/DatePickerSingleInput.tsx"],"sourcesContent":["import { Button, makePrefixer, useControlled } from \"@salt-ds/core\";\nimport {\n DateDetailErrorEnum,\n type DateFrameworkType,\n type SaltDateAdapter,\n} from \"@salt-ds/date-adapters\";\nimport { CalendarIcon } from \"@salt-ds/icons\";\nimport { clsx } from \"clsx\";\nimport {\n type KeyboardEvent,\n type SyntheticEvent,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport type { SingleDateSelection } from \"../calendar\";\nimport {\n DateInputSingle,\n type DateInputSingleDetails,\n type DateInputSingleProps,\n} from \"../date-input\";\nimport { useLocalization } from \"../localization-provider\";\nimport { useDatePickerContext } from \"./DatePickerContext\";\nimport { useDatePickerOverlay } from \"./DatePickerOverlayProvider\";\n\nconst withBaseName = makePrefixer(\"saltDatePickerSingleInput\");\n\n/**\n * Props for the DatePickerSingleInput component.\n */\nexport interface DatePickerSingleInputProps<TDate extends DateFrameworkType>\n extends DateInputSingleProps<TDate> {\n /**\n * Function to validate the entered date\n * @param date - The selected date\n * @param details - The details of date selection, either a valid date or error\n * @returns updated DateInputSingleDetails details\n */\n validate?: (\n date: SingleDateSelection<TDate>,\n details: DateInputSingleDetails,\n ) => DateInputSingleDetails;\n}\n\nfunction defaultSingleValidation<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n date: TDate,\n details: DateInputSingleDetails,\n minDate: TDate | undefined,\n maxDate: TDate | undefined,\n): DateInputSingleDetails {\n if (!date) {\n details.errors = details.errors ?? [];\n details.errors?.push({\n type: DateDetailErrorEnum.UNSET,\n message: \"no date defined\",\n });\n } else {\n if (\n minDate &&\n dateAdapter.isValid(date) &&\n dateAdapter.compare(date, minDate) < 0\n ) {\n details.errors = details.errors ?? [];\n details.errors?.push({\n type: \"min-date\",\n message: \"is before min date\",\n });\n } else if (\n maxDate &&\n dateAdapter.isValid(date) &&\n dateAdapter.compare(date, maxDate) > 0\n ) {\n details.errors = details.errors ?? [];\n details.errors?.push({\n type: \"max-date\",\n message: \"is after max date\",\n });\n }\n }\n return details;\n}\n\nexport const DatePickerSingleInput = forwardRef<\n HTMLDivElement,\n DatePickerSingleInputProps<any>\n>(\n <TDate extends DateFrameworkType>(\n props: DatePickerSingleInputProps<TDate>,\n ref: React.Ref<HTMLDivElement>,\n ) => {\n const { dateAdapter } = useLocalization<TDate>();\n\n const {\n className,\n onFocus,\n onBlur,\n value: valueProp,\n validate,\n defaultValue,\n onDateValueChange,\n onKeyDown,\n ...rest\n } = props;\n\n const {\n state: { selectedDate, disabled, readOnly, cancelled, minDate, maxDate },\n helpers: { select },\n } = useDatePickerContext<TDate>({ selectionVariant: \"single\" });\n const {\n state: { open },\n helpers: { setOpen },\n } = useDatePickerOverlay();\n\n const previousValue = useRef<typeof valueProp>();\n\n const [value, setValue] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: \"DatePickerSingleInput\",\n state: \"value\",\n });\n\n const handleCalendarButton = useCallback(() => {\n setOpen(!open);\n }, [open, setOpen]);\n\n const handleDateChange = useCallback(\n (\n event: SyntheticEvent,\n date: SingleDateSelection<TDate>,\n details: DateInputSingleDetails,\n ) => {\n const validatedDetails = validate\n ? validate(date, details)\n : defaultSingleValidation<TDate>(\n dateAdapter,\n date,\n details,\n minDate,\n maxDate,\n );\n select(event, date, validatedDetails);\n },\n [select, validate],\n );\n\n const handleDateValueChange = useCallback(\n (event: SyntheticEvent | null, newDateValue: string) => {\n setValue(newDateValue);\n onDateValueChange?.(event, newDateValue);\n },\n [onDateValueChange],\n );\n\n const handleOnKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"ArrowDown\") {\n setOpen(true);\n onKeyDown?.(event);\n }\n },\n [onKeyDown],\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: should run when open changes and not selected date or value\n useEffect(() => {\n if (open) {\n previousValue.current = value;\n }\n }, [open]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: avoid excessive re-rendering\n useEffect(() => {\n if (cancelled) {\n setValue(previousValue?.current);\n }\n }, [cancelled]);\n\n return (\n <DateInputSingle\n value={value ?? \"\"}\n className={clsx(withBaseName(), className)}\n date={selectedDate ?? null}\n readOnly={readOnly}\n ref={ref}\n onDateChange={handleDateChange}\n onDateValueChange={handleDateValueChange}\n endAdornment={\n <Button\n
|
|
1
|
+
{"version":3,"file":"DatePickerSingleInput.js","sources":["../src/date-picker/DatePickerSingleInput.tsx"],"sourcesContent":["import { Button, makePrefixer, useControlled } from \"@salt-ds/core\";\nimport {\n DateDetailErrorEnum,\n type DateFrameworkType,\n type SaltDateAdapter,\n} from \"@salt-ds/date-adapters\";\nimport { CalendarIcon } from \"@salt-ds/icons\";\nimport { clsx } from \"clsx\";\nimport {\n type KeyboardEvent,\n type SyntheticEvent,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport type { SingleDateSelection } from \"../calendar\";\nimport {\n DateInputSingle,\n type DateInputSingleDetails,\n type DateInputSingleProps,\n} from \"../date-input\";\nimport { useLocalization } from \"../localization-provider\";\nimport { useDatePickerContext } from \"./DatePickerContext\";\nimport { useDatePickerOverlay } from \"./DatePickerOverlayProvider\";\n\nconst withBaseName = makePrefixer(\"saltDatePickerSingleInput\");\n\n/**\n * Props for the DatePickerSingleInput component.\n */\nexport interface DatePickerSingleInputProps<TDate extends DateFrameworkType>\n extends DateInputSingleProps<TDate> {\n /**\n * Function to validate the entered date\n * @param date - The selected date\n * @param details - The details of date selection, either a valid date or error\n * @returns updated DateInputSingleDetails details\n */\n validate?: (\n date: SingleDateSelection<TDate>,\n details: DateInputSingleDetails,\n ) => DateInputSingleDetails;\n}\n\nfunction defaultSingleValidation<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n date: TDate,\n details: DateInputSingleDetails,\n minDate: TDate | undefined,\n maxDate: TDate | undefined,\n): DateInputSingleDetails {\n if (!date) {\n details.errors = details.errors ?? [];\n details.errors?.push({\n type: DateDetailErrorEnum.UNSET,\n message: \"no date defined\",\n });\n } else {\n if (\n minDate &&\n dateAdapter.isValid(date) &&\n dateAdapter.compare(date, minDate) < 0\n ) {\n details.errors = details.errors ?? [];\n details.errors?.push({\n type: \"min-date\",\n message: \"is before min date\",\n });\n } else if (\n maxDate &&\n dateAdapter.isValid(date) &&\n dateAdapter.compare(date, maxDate) > 0\n ) {\n details.errors = details.errors ?? [];\n details.errors?.push({\n type: \"max-date\",\n message: \"is after max date\",\n });\n }\n }\n return details;\n}\n\nexport const DatePickerSingleInput = forwardRef<\n HTMLDivElement,\n DatePickerSingleInputProps<any>\n>(\n <TDate extends DateFrameworkType>(\n props: DatePickerSingleInputProps<TDate>,\n ref: React.Ref<HTMLDivElement>,\n ) => {\n const { dateAdapter } = useLocalization<TDate>();\n\n const {\n className,\n onFocus,\n onBlur,\n value: valueProp,\n validate,\n defaultValue,\n onDateValueChange,\n onKeyDown,\n ...rest\n } = props;\n\n const {\n state: { selectedDate, disabled, readOnly, cancelled, minDate, maxDate },\n helpers: { select },\n } = useDatePickerContext<TDate>({ selectionVariant: \"single\" });\n const {\n state: { open },\n helpers: { setOpen },\n } = useDatePickerOverlay();\n\n const previousValue = useRef<typeof valueProp>();\n\n const [value, setValue] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: \"DatePickerSingleInput\",\n state: \"value\",\n });\n\n const handleCalendarButton = useCallback(() => {\n setOpen(!open);\n }, [open, setOpen]);\n\n const handleDateChange = useCallback(\n (\n event: SyntheticEvent,\n date: SingleDateSelection<TDate>,\n details: DateInputSingleDetails,\n ) => {\n const validatedDetails = validate\n ? validate(date, details)\n : defaultSingleValidation<TDate>(\n dateAdapter,\n date,\n details,\n minDate,\n maxDate,\n );\n select(event, date, validatedDetails);\n },\n [select, validate],\n );\n\n const handleDateValueChange = useCallback(\n (event: SyntheticEvent | null, newDateValue: string) => {\n setValue(newDateValue);\n onDateValueChange?.(event, newDateValue);\n },\n [onDateValueChange],\n );\n\n const handleOnKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"ArrowDown\") {\n setOpen(true);\n onKeyDown?.(event);\n }\n },\n [onKeyDown],\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: should run when open changes and not selected date or value\n useEffect(() => {\n if (open) {\n previousValue.current = value;\n }\n }, [open]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: avoid excessive re-rendering\n useEffect(() => {\n if (cancelled) {\n setValue(previousValue?.current);\n }\n }, [cancelled]);\n\n return (\n <DateInputSingle\n value={value ?? \"\"}\n className={clsx(withBaseName(), className)}\n date={selectedDate ?? null}\n readOnly={readOnly}\n ref={ref}\n onDateChange={handleDateChange}\n onDateValueChange={handleDateValueChange}\n endAdornment={\n !readOnly && (\n <Button\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleCalendarButton}\n disabled={disabled}\n aria-label=\"Open Calendar\"\n >\n <CalendarIcon />\n </Button>\n )\n }\n onKeyDown={handleOnKeyDown}\n {...rest}\n />\n );\n },\n);\n"],"names":[],"mappings":";;;;;;;;;;;;AA0BA,MAAM,YAAA,GAAe,aAAa,2BAA2B,CAAA;AAmB7D,SAAS,uBACP,CAAA,WAAA,EACA,IACA,EAAA,OAAA,EACA,SACA,OACwB,EAAA;AAnD1B,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAoDE,EAAA,IAAI,CAAC,IAAM,EAAA;AACT,IAAQ,OAAA,CAAA,MAAA,GAAS,OAAQ,CAAA,MAAA,IAAU,EAAC;AACpC,IAAQ,CAAA,EAAA,GAAA,OAAA,CAAA,MAAA,KAAR,mBAAgB,IAAK,CAAA;AAAA,MACnB,MAAM,mBAAoB,CAAA,KAAA;AAAA,MAC1B,OAAS,EAAA;AAAA,KACX,CAAA;AAAA,GACK,MAAA;AACL,IACE,IAAA,OAAA,IACA,WAAY,CAAA,OAAA,CAAQ,IAAI,CAAA,IACxB,YAAY,OAAQ,CAAA,IAAA,EAAM,OAAO,CAAA,GAAI,CACrC,EAAA;AACA,MAAQ,OAAA,CAAA,MAAA,GAAS,OAAQ,CAAA,MAAA,IAAU,EAAC;AACpC,MAAQ,CAAA,EAAA,GAAA,OAAA,CAAA,MAAA,KAAR,mBAAgB,IAAK,CAAA;AAAA,QACnB,IAAM,EAAA,UAAA;AAAA,QACN,OAAS,EAAA;AAAA,OACX,CAAA;AAAA,KACF,MAAA,IACE,OACA,IAAA,WAAA,CAAY,OAAQ,CAAA,IAAI,CACxB,IAAA,WAAA,CAAY,OAAQ,CAAA,IAAA,EAAM,OAAO,CAAA,GAAI,CACrC,EAAA;AACA,MAAQ,OAAA,CAAA,MAAA,GAAS,OAAQ,CAAA,MAAA,IAAU,EAAC;AACpC,MAAQ,CAAA,EAAA,GAAA,OAAA,CAAA,MAAA,KAAR,mBAAgB,IAAK,CAAA;AAAA,QACnB,IAAM,EAAA,UAAA;AAAA,QACN,OAAS,EAAA;AAAA,OACX,CAAA;AAAA;AACF;AAEF,EAAO,OAAA,OAAA;AACT;AAEO,MAAM,qBAAwB,GAAA,UAAA;AAAA,EAInC,CACE,OACA,GACG,KAAA;AACH,IAAM,MAAA,EAAE,WAAY,EAAA,GAAI,eAAuB,EAAA;AAE/C,IAAM,MAAA;AAAA,MACJ,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAO,EAAA,SAAA;AAAA,MACP,QAAA;AAAA,MACA,YAAA;AAAA,MACA,iBAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAG;AAAA,KACD,GAAA,KAAA;AAEJ,IAAM,MAAA;AAAA,MACJ,OAAO,EAAE,YAAA,EAAc,UAAU,QAAU,EAAA,SAAA,EAAW,SAAS,OAAQ,EAAA;AAAA,MACvE,OAAA,EAAS,EAAE,MAAO;AAAA,KAChB,GAAA,oBAAA,CAA4B,EAAE,gBAAA,EAAkB,UAAU,CAAA;AAC9D,IAAM,MAAA;AAAA,MACJ,KAAA,EAAO,EAAE,IAAK,EAAA;AAAA,MACd,OAAA,EAAS,EAAE,OAAQ;AAAA,QACjB,oBAAqB,EAAA;AAEzB,IAAA,MAAM,gBAAgB,MAAyB,EAAA;AAE/C,IAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,aAAc,CAAA;AAAA,MACtC,UAAY,EAAA,SAAA;AAAA,MACZ,OAAS,EAAA,YAAA;AAAA,MACT,IAAM,EAAA,uBAAA;AAAA,MACN,KAAO,EAAA;AAAA,KACR,CAAA;AAED,IAAM,MAAA,oBAAA,GAAuB,YAAY,MAAM;AAC7C,MAAA,OAAA,CAAQ,CAAC,IAAI,CAAA;AAAA,KACZ,EAAA,CAAC,IAAM,EAAA,OAAO,CAAC,CAAA;AAElB,IAAA,MAAM,gBAAmB,GAAA,WAAA;AAAA,MACvB,CACE,KACA,EAAA,IAAA,EACA,OACG,KAAA;AACH,QAAA,MAAM,gBAAmB,GAAA,QAAA,GACrB,QAAS,CAAA,IAAA,EAAM,OAAO,CACtB,GAAA,uBAAA;AAAA,UACE,WAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAA;AAAA,UACA;AAAA,SACF;AACJ,QAAO,MAAA,CAAA,KAAA,EAAO,MAAM,gBAAgB,CAAA;AAAA,OACtC;AAAA,MACA,CAAC,QAAQ,QAAQ;AAAA,KACnB;AAEA,IAAA,MAAM,qBAAwB,GAAA,WAAA;AAAA,MAC5B,CAAC,OAA8B,YAAyB,KAAA;AACtD,QAAA,QAAA,CAAS,YAAY,CAAA;AACrB,QAAA,iBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,iBAAA,CAAoB,KAAO,EAAA,YAAA,CAAA;AAAA,OAC7B;AAAA,MACA,CAAC,iBAAiB;AAAA,KACpB;AAEA,IAAA,MAAM,eAAkB,GAAA,WAAA;AAAA,MACtB,CAAC,KAA2C,KAAA;AAC1C,QAAI,IAAA,KAAA,CAAM,QAAQ,WAAa,EAAA;AAC7B,UAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,UAAY,SAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAA,KAAA,CAAA;AAAA;AACd,OACF;AAAA,MACA,CAAC,SAAS;AAAA,KACZ;AAGA,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,IAAM,EAAA;AACR,QAAA,aAAA,CAAc,OAAU,GAAA,KAAA;AAAA;AAC1B,KACF,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,SAAW,EAAA;AACb,QAAA,QAAA,CAAS,+CAAe,OAAO,CAAA;AAAA;AACjC,KACF,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,IACE,uBAAA,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,OAAO,KAAS,IAAA,EAAA;AAAA,QAChB,SAAW,EAAA,IAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,QACzC,MAAM,YAAgB,IAAA,IAAA;AAAA,QACtB,QAAA;AAAA,QACA,GAAA;AAAA,QACA,YAAc,EAAA,gBAAA;AAAA,QACd,iBAAmB,EAAA,qBAAA;AAAA,QACnB,YAAA,EACE,CAAC,QACC,oBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,UAAW,EAAA,aAAA;AAAA,YACX,SAAU,EAAA,SAAA;AAAA,YACV,OAAS,EAAA,oBAAA;AAAA,YACT,QAAA;AAAA,YACA,YAAW,EAAA,eAAA;AAAA,YAEX,8BAAC,YAAa,EAAA,EAAA;AAAA;AAAA,SAChB;AAAA,QAGJ,SAAW,EAAA,eAAA;AAAA,QACV,GAAG;AAAA;AAAA,KACN;AAAA;AAGN;;;;"}
|
package/dist-es/index.js
CHANGED
|
@@ -118,14 +118,13 @@ export { DropdownPlaceholder, NO_DATA, addAll, allExceptOverflowIndicator, byDes
|
|
|
118
118
|
export { isResponsiveAttribute, liftResponsivePropsToFormField } from './responsive/utils.js';
|
|
119
119
|
export { SearchInput } from './search-input/SearchInput.js';
|
|
120
120
|
export { SkipLink } from './skip-link/SkipLink.js';
|
|
121
|
-
export { SkipLinks } from './skip-link/SkipLinks.js';
|
|
122
121
|
export { Slider } from './slider/Slider.js';
|
|
123
122
|
export { StaticList } from './static-list/StaticList.js';
|
|
124
123
|
export { StaticListItem } from './static-list/StaticListItem.js';
|
|
125
124
|
export { StaticListItemContent } from './static-list/StaticListItemContent.js';
|
|
126
125
|
export { SteppedTracker } from './stepped-tracker/SteppedTracker.js';
|
|
127
|
-
export {
|
|
128
|
-
export {
|
|
126
|
+
export { Step } from './stepped-tracker/Step.js';
|
|
127
|
+
export { useStepReducer } from './stepped-tracker/useStepReducer.js';
|
|
129
128
|
export { useStepperInput } from './stepper-input/useStepperInput.js';
|
|
130
129
|
export { StepperInput } from './stepper-input/StepperInput.js';
|
|
131
130
|
export { SystemStatus } from './system-status/SystemStatus.js';
|
package/dist-es/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var css_248z = "/*
|
|
1
|
+
var css_248z = "/*Styles applied when the link is focused to hide the Skip Link when not in focus*/\n.saltSkipLink {\n top: 0;\n left: 0;\n opacity: 0;\n width: 1px;\n height: 1px;\n margin: 0;\n padding: 0;\n overflow: hidden;\n position: absolute;\n\n color: var(--salt-content-primary-foreground);\n letter-spacing: var(--salt-text-letterSpacing);\n text-decoration: var(--salt-navigable-textDecoration);\n font-family: var(--salt-text-fontFamily);\n white-space: nowrap;\n background: var(--saltSkipLink-background, var(--salt-container-primary-background));\n z-index: calc(var(--salt-zIndex-appHeader) + 1);\n}\n\n/* Styles applied when the link is focused to display the Skip Link only when in focus*/\n.saltSkipLink:focus {\n opacity: 1;\n width: auto;\n height: max(var(--salt-size-base), auto);\n padding: var(--salt-spacing-100) var(--salt-spacing-300);\n outline: var(--salt-focused-outline);\n outline-offset: calc(-1 * var(--salt-focused-outlineWidth));\n box-shadow: var(--salt-overlayable-shadow);\n}\n\n@keyframes fade-out-back-outline {\n /* required animation to apply an opacity fade-out-back to outline */\n 0% {\n outline-color: var(--salt-focused-outlineColor);\n }\n 100% {\n outline-color: transparent;\n }\n}\n\n.saltSkipLink-target {\n animation: fade-out-back-outline var(--salt-duration-notable) var(--salt-animation-timing-function) both;\n outline: var(--salt-focused-outline);\n}\n@media (prefers-reduced-motion: reduce) {\n .saltSkipLink-target {\n animation: none;\n }\n}\n";
|
|
2
2
|
|
|
3
3
|
export { css_248z as default };
|
|
4
4
|
//# sourceMappingURL=SkipLink.css.js.map
|
|
@@ -1,32 +1,49 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { makePrefixer
|
|
2
|
+
import { makePrefixer } from '@salt-ds/core';
|
|
3
3
|
import { useComponentCssInjection } from '@salt-ds/styles';
|
|
4
4
|
import { useWindow } from '@salt-ds/window';
|
|
5
5
|
import { clsx } from 'clsx';
|
|
6
|
-
import { forwardRef } from 'react';
|
|
6
|
+
import { forwardRef, useState, useRef, useEffect } from 'react';
|
|
7
7
|
import { useManageFocusOnTarget } from './internal/useManageFocusOnTarget.js';
|
|
8
8
|
import css_248z from './SkipLink.css.js';
|
|
9
9
|
|
|
10
10
|
const withBaseName = makePrefixer("saltSkipLink");
|
|
11
11
|
const SkipLink = forwardRef(
|
|
12
|
-
function SkipLink2({ className,
|
|
12
|
+
function SkipLink2({ className, targetId, children, onKeyUp, onBlur, onClick, ...rest }, ref) {
|
|
13
|
+
const [isTargetAvailable, setIsTargetAvailable] = useState(false);
|
|
13
14
|
const targetWindow = useWindow();
|
|
14
15
|
useComponentCssInjection({
|
|
15
16
|
testId: "salt-skip-link",
|
|
16
17
|
css: css_248z,
|
|
17
18
|
window: targetWindow
|
|
18
19
|
});
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
const targetRef = useRef(null);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
if (targetWindow) {
|
|
23
|
+
targetRef.current = targetWindow.document.getElementById(targetId);
|
|
24
|
+
}
|
|
25
|
+
setIsTargetAvailable(!!targetRef.current);
|
|
26
|
+
}, [targetId, targetWindow]);
|
|
27
|
+
const eventHandlers = useManageFocusOnTarget({
|
|
28
|
+
onKeyUp,
|
|
29
|
+
onBlur,
|
|
30
|
+
onClick,
|
|
31
|
+
targetRef,
|
|
32
|
+
targetClass: withBaseName("target")
|
|
33
|
+
});
|
|
34
|
+
if (!isTargetAvailable) return null;
|
|
35
|
+
return /* @__PURE__ */ jsx(
|
|
36
|
+
"a",
|
|
23
37
|
{
|
|
38
|
+
className: clsx(withBaseName(), className),
|
|
39
|
+
href: `#${targetId}`,
|
|
40
|
+
ref,
|
|
41
|
+
target: "_self",
|
|
24
42
|
...eventHandlers,
|
|
25
43
|
...rest,
|
|
26
|
-
|
|
27
|
-
ref
|
|
44
|
+
children
|
|
28
45
|
}
|
|
29
|
-
)
|
|
46
|
+
);
|
|
30
47
|
}
|
|
31
48
|
);
|
|
32
49
|
|