@snapdragonsnursery/react-components 1.19.4 → 1.19.6
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/package.json
CHANGED
package/src/ChildSearchModal.jsx
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, {
|
|
2
|
+
useState,
|
|
3
|
+
useEffect,
|
|
4
|
+
useRef,
|
|
5
|
+
useCallback,
|
|
6
|
+
useMemo,
|
|
7
|
+
} from "react";
|
|
2
8
|
import { useMsal } from "@azure/msal-react";
|
|
3
9
|
import { trackEvent } from "./telemetry";
|
|
4
10
|
|
|
@@ -25,7 +31,7 @@ const ChildSearchModal = ({
|
|
|
25
31
|
showSiteFilter = true, // Whether to show site filter dropdown
|
|
26
32
|
multiSelect = false, // Enable multiple child selection
|
|
27
33
|
maxSelections = null, // Maximum number of children that can be selected (null = unlimited)
|
|
28
|
-
selectedChildren
|
|
34
|
+
selectedChildren, // Array of already selected children (for multi-select mode)
|
|
29
35
|
// Auth options: provide token directly or a function to fetch it
|
|
30
36
|
authToken = null,
|
|
31
37
|
getAccessToken = null,
|
|
@@ -60,8 +66,12 @@ const ChildSearchModal = ({
|
|
|
60
66
|
});
|
|
61
67
|
|
|
62
68
|
// State for multi-select mode
|
|
69
|
+
const initialSelectedChildren = useMemo(
|
|
70
|
+
() => selectedChildren ?? [],
|
|
71
|
+
[selectedChildren]
|
|
72
|
+
);
|
|
63
73
|
const [selectedChildrenState, setSelectedChildrenState] = useState(
|
|
64
|
-
|
|
74
|
+
initialSelectedChildren
|
|
65
75
|
);
|
|
66
76
|
|
|
67
77
|
const { instance, accounts } = useMsal();
|
|
@@ -281,9 +291,9 @@ const ChildSearchModal = ({
|
|
|
281
291
|
// Reset selection when modal opens (for multi-select mode)
|
|
282
292
|
useEffect(() => {
|
|
283
293
|
if (isOpen && multiSelect) {
|
|
284
|
-
setSelectedChildrenState(
|
|
294
|
+
setSelectedChildrenState(initialSelectedChildren);
|
|
285
295
|
}
|
|
286
|
-
}, [isOpen, multiSelect,
|
|
296
|
+
}, [isOpen, multiSelect, initialSelectedChildren]);
|
|
287
297
|
|
|
288
298
|
const handleChildSelect = (child) => {
|
|
289
299
|
if (multiSelect) {
|
|
@@ -92,48 +92,47 @@ export function DateRangePicker({
|
|
|
92
92
|
const hasCompleteCurrentRange = Boolean(
|
|
93
93
|
internalRange?.from && internalRange?.to
|
|
94
94
|
);
|
|
95
|
+
const isInProgressRange = Boolean(
|
|
96
|
+
internalRange?.from && !internalRange?.to
|
|
97
|
+
);
|
|
95
98
|
|
|
96
|
-
let newRange
|
|
97
|
-
|
|
98
|
-
if (normalizedRange.from && normalizedRange.to) {
|
|
99
|
-
if (hasCompleteCurrentRange && !isSelectingRange.current) {
|
|
100
|
-
const sameStart = datesEqual(normalizedRange.from, internalRange.from);
|
|
99
|
+
let newRange;
|
|
101
100
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
to: normalizedRange.to,
|
|
107
|
-
};
|
|
108
|
-
} else {
|
|
109
|
-
// Starting a new range selection cycle
|
|
110
|
-
newRange = {
|
|
111
|
-
from: normalizedSelectedDay ?? normalizedRange.from,
|
|
112
|
-
to: null,
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
} else if (internalRange?.from && !internalRange?.to) {
|
|
116
|
-
// Completing an in-progress range
|
|
101
|
+
// If we're in the middle of selecting a range (start date set, end date not set)
|
|
102
|
+
if (isInProgressRange) {
|
|
103
|
+
// Completing an in-progress range - set the clicked date as the end date
|
|
104
|
+
if (normalizedRange.to) {
|
|
117
105
|
newRange = {
|
|
118
106
|
from: internalRange.from,
|
|
119
107
|
to: normalizedRange.to,
|
|
120
108
|
};
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (hasCompleteCurrentRange && !isSelectingRange.current) {
|
|
124
|
-
// New cycle starting from the selected day
|
|
109
|
+
} else if (normalizedRange.from) {
|
|
110
|
+
// Use the clicked date as end date
|
|
125
111
|
newRange = {
|
|
126
|
-
from:
|
|
127
|
-
to:
|
|
112
|
+
from: internalRange.from,
|
|
113
|
+
to: normalizedSelectedDay ?? normalizedRange.from,
|
|
128
114
|
};
|
|
129
115
|
} else {
|
|
116
|
+
newRange = internalRange; // Keep current state
|
|
117
|
+
}
|
|
118
|
+
} else if (hasCompleteCurrentRange) {
|
|
119
|
+
// We have a complete range - clicking ANY date should start a new range
|
|
120
|
+
// Use the clicked date as the new start date
|
|
121
|
+
newRange = {
|
|
122
|
+
from:
|
|
123
|
+
normalizedSelectedDay ?? normalizedRange.from ?? normalizedRange.to,
|
|
124
|
+
to: null,
|
|
125
|
+
};
|
|
126
|
+
} else {
|
|
127
|
+
// No range selected or only partial - start a new range
|
|
128
|
+
if (normalizedRange.from) {
|
|
130
129
|
newRange = {
|
|
131
130
|
from: normalizedRange.from,
|
|
132
|
-
to: null,
|
|
131
|
+
to: normalizedRange.to || null,
|
|
133
132
|
};
|
|
133
|
+
} else {
|
|
134
|
+
newRange = null;
|
|
134
135
|
}
|
|
135
|
-
} else {
|
|
136
|
-
newRange = null;
|
|
137
136
|
}
|
|
138
137
|
|
|
139
138
|
setInternalRange(newRange);
|