@react-stately/steplist 3.0.0-nightly.4411 → 3.0.0-nightly.4420
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/dist/import.mjs +9 -7
- package/dist/main.js +9 -7
- package/dist/main.js.map +1 -1
- package/dist/module.js +9 -7
- package/dist/module.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/useStepListState.ts +21 -14
package/dist/import.mjs
CHANGED
|
@@ -27,7 +27,8 @@ import {useControlledState as $1ZKEJ$useControlledState} from "@react-stately/ut
|
|
|
27
27
|
|
|
28
28
|
function $cc8d414d37c075f2$export$a993ed2a771330b(props) {
|
|
29
29
|
let state = (0, $1ZKEJ$useSingleSelectListState)(props);
|
|
30
|
-
|
|
30
|
+
var _props_defaultLastCompletedStep;
|
|
31
|
+
let [lastCompletedStep, setLastCompletedStep] = (0, $1ZKEJ$useControlledState)(props.lastCompletedStep, (_props_defaultLastCompletedStep = props.defaultLastCompletedStep) !== null && _props_defaultLastCompletedStep !== void 0 ? _props_defaultLastCompletedStep : null, props.onLastCompletedStepChange);
|
|
31
32
|
const { setSelectedKey: realSetSelectedKey, selectedKey: selectedKey, collection: collection } = state;
|
|
32
33
|
const { indexMap: indexMap, keysLinkedList: keysLinkedList } = (0, $1ZKEJ$useMemo)(()=>$cc8d414d37c075f2$var$buildKeysMaps(collection), [
|
|
33
34
|
collection
|
|
@@ -35,17 +36,17 @@ function $cc8d414d37c075f2$export$a993ed2a771330b(props) {
|
|
|
35
36
|
const selectedIdx = indexMap.get(selectedKey);
|
|
36
37
|
const isCompleted = (0, $1ZKEJ$useCallback)((step)=>{
|
|
37
38
|
if (step === undefined) return false;
|
|
38
|
-
return indexMap.get(step) <= indexMap.get(lastCompletedStep);
|
|
39
|
+
return step !== null && lastCompletedStep !== null && indexMap.has(step) && indexMap.has(lastCompletedStep) && indexMap.get(step) <= indexMap.get(lastCompletedStep);
|
|
39
40
|
}, [
|
|
40
41
|
indexMap,
|
|
41
42
|
lastCompletedStep
|
|
42
43
|
]);
|
|
43
44
|
const findDefaultSelectedKey = (0, $1ZKEJ$useCallback)((collection, disabledKeys)=>{
|
|
44
45
|
let selectedKey = null;
|
|
45
|
-
if (collection) {
|
|
46
|
+
if (collection && collection.size > 0) {
|
|
46
47
|
selectedKey = collection.getFirstKey();
|
|
47
48
|
// loop over keys until we find one that isn't completed or disabled and select that
|
|
48
|
-
while(selectedKey !== collection.getLastKey() && (disabledKeys.has(selectedKey) || isCompleted(selectedKey)))selectedKey = collection.getKeyAfter(selectedKey);
|
|
49
|
+
while(selectedKey !== collection.getLastKey() && selectedKey && (disabledKeys.has(selectedKey) || isCompleted(selectedKey)))selectedKey = collection.getKeyAfter(selectedKey);
|
|
49
50
|
}
|
|
50
51
|
return selectedKey;
|
|
51
52
|
}, [
|
|
@@ -56,11 +57,12 @@ function $cc8d414d37c075f2$export$a993ed2a771330b(props) {
|
|
|
56
57
|
let selectedKey = state.selectedKey;
|
|
57
58
|
if (state.selectionManager.isEmpty || !state.collection.getItem(selectedKey)) {
|
|
58
59
|
selectedKey = findDefaultSelectedKey(state.collection, state.disabledKeys);
|
|
59
|
-
state.selectionManager.replaceSelection(selectedKey);
|
|
60
|
+
if (selectedKey !== null) state.selectionManager.replaceSelection(selectedKey);
|
|
60
61
|
}
|
|
61
62
|
if (state.selectionManager.focusedKey == null) state.selectionManager.setFocusedKey(selectedKey);
|
|
62
|
-
var
|
|
63
|
-
|
|
63
|
+
var _ref;
|
|
64
|
+
let lcs = (_ref = lastCompletedStep !== null ? indexMap.get(lastCompletedStep) : -1) !== null && _ref !== void 0 ? _ref : -1;
|
|
65
|
+
if (selectedIdx !== undefined && selectedIdx > 0 && selectedIdx > lcs + 1 && selectedKey !== null && keysLinkedList.has(selectedKey)) setLastCompletedStep(keysLinkedList.get(selectedKey));
|
|
64
66
|
});
|
|
65
67
|
function isSelectable(step) {
|
|
66
68
|
if (props.isDisabled || state.disabledKeys.has(step) || props.isReadOnly) return false;
|
package/dist/main.js
CHANGED
|
@@ -33,7 +33,8 @@ $parcel$export(module.exports, "useStepListState", () => $e8f7edc240568f41$expor
|
|
|
33
33
|
|
|
34
34
|
function $e8f7edc240568f41$export$a993ed2a771330b(props) {
|
|
35
35
|
let state = (0, $cNR0n$reactstatelylist.useSingleSelectListState)(props);
|
|
36
|
-
|
|
36
|
+
var _props_defaultLastCompletedStep;
|
|
37
|
+
let [lastCompletedStep, setLastCompletedStep] = (0, $cNR0n$reactstatelyutils.useControlledState)(props.lastCompletedStep, (_props_defaultLastCompletedStep = props.defaultLastCompletedStep) !== null && _props_defaultLastCompletedStep !== void 0 ? _props_defaultLastCompletedStep : null, props.onLastCompletedStepChange);
|
|
37
38
|
const { setSelectedKey: realSetSelectedKey, selectedKey: selectedKey, collection: collection } = state;
|
|
38
39
|
const { indexMap: indexMap, keysLinkedList: keysLinkedList } = (0, $cNR0n$react.useMemo)(()=>$e8f7edc240568f41$var$buildKeysMaps(collection), [
|
|
39
40
|
collection
|
|
@@ -41,17 +42,17 @@ function $e8f7edc240568f41$export$a993ed2a771330b(props) {
|
|
|
41
42
|
const selectedIdx = indexMap.get(selectedKey);
|
|
42
43
|
const isCompleted = (0, $cNR0n$react.useCallback)((step)=>{
|
|
43
44
|
if (step === undefined) return false;
|
|
44
|
-
return indexMap.get(step) <= indexMap.get(lastCompletedStep);
|
|
45
|
+
return step !== null && lastCompletedStep !== null && indexMap.has(step) && indexMap.has(lastCompletedStep) && indexMap.get(step) <= indexMap.get(lastCompletedStep);
|
|
45
46
|
}, [
|
|
46
47
|
indexMap,
|
|
47
48
|
lastCompletedStep
|
|
48
49
|
]);
|
|
49
50
|
const findDefaultSelectedKey = (0, $cNR0n$react.useCallback)((collection, disabledKeys)=>{
|
|
50
51
|
let selectedKey = null;
|
|
51
|
-
if (collection) {
|
|
52
|
+
if (collection && collection.size > 0) {
|
|
52
53
|
selectedKey = collection.getFirstKey();
|
|
53
54
|
// loop over keys until we find one that isn't completed or disabled and select that
|
|
54
|
-
while(selectedKey !== collection.getLastKey() && (disabledKeys.has(selectedKey) || isCompleted(selectedKey)))selectedKey = collection.getKeyAfter(selectedKey);
|
|
55
|
+
while(selectedKey !== collection.getLastKey() && selectedKey && (disabledKeys.has(selectedKey) || isCompleted(selectedKey)))selectedKey = collection.getKeyAfter(selectedKey);
|
|
55
56
|
}
|
|
56
57
|
return selectedKey;
|
|
57
58
|
}, [
|
|
@@ -62,11 +63,12 @@ function $e8f7edc240568f41$export$a993ed2a771330b(props) {
|
|
|
62
63
|
let selectedKey = state.selectedKey;
|
|
63
64
|
if (state.selectionManager.isEmpty || !state.collection.getItem(selectedKey)) {
|
|
64
65
|
selectedKey = findDefaultSelectedKey(state.collection, state.disabledKeys);
|
|
65
|
-
state.selectionManager.replaceSelection(selectedKey);
|
|
66
|
+
if (selectedKey !== null) state.selectionManager.replaceSelection(selectedKey);
|
|
66
67
|
}
|
|
67
68
|
if (state.selectionManager.focusedKey == null) state.selectionManager.setFocusedKey(selectedKey);
|
|
68
|
-
var
|
|
69
|
-
|
|
69
|
+
var _ref;
|
|
70
|
+
let lcs = (_ref = lastCompletedStep !== null ? indexMap.get(lastCompletedStep) : -1) !== null && _ref !== void 0 ? _ref : -1;
|
|
71
|
+
if (selectedIdx !== undefined && selectedIdx > 0 && selectedIdx > lcs + 1 && selectedKey !== null && keysLinkedList.has(selectedKey)) setLastCompletedStep(keysLinkedList.get(selectedKey));
|
|
70
72
|
});
|
|
71
73
|
function isSelectable(step) {
|
|
72
74
|
if (props.isDisabled || state.disabledKeys.has(step) || props.isReadOnly) return false;
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";;;;;;;;;;AAAA;;;;;;;;;;ACAA;;;;;;;;;;CAUC;;;AA2BM,SAAS,yCAAmC,KAAuB;IACxE,IAAI,QAAQ,CAAA,GAAA,gDAAuB,EAAK;
|
|
1
|
+
{"mappings":"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","sources":["packages/@react-stately/steplist/src/index.ts","packages/@react-stately/steplist/src/useStepListState.ts"],"sourcesContent":["/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nexport {useStepListState} from './useStepListState';\nexport type {StepListProps, StepListState} from './useStepListState';\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, CollectionBase, Key, Node, SingleSelection} from '@react-types/shared';\nimport {SingleSelectListState, useSingleSelectListState} from '@react-stately/list';\nimport {useCallback, useEffect, useMemo} from 'react';\nimport {useControlledState} from '@react-stately/utils';\n\nexport interface StepListProps<T> extends CollectionBase<T>, SingleSelection {\n /** The key of the last completed step (controlled). */\n lastCompletedStep?: Key,\n /** The key of the initially last completed step (uncontrolled). */\n defaultLastCompletedStep?: Key,\n /** Callback for when the last completed step changes. */\n onLastCompletedStepChange?: (key: Key | null) => void,\n /** Whether the step list is disabled. Steps will not be focusable or interactive. */\n isDisabled?: boolean,\n /** Whether the step list is read only. Steps will be focusable but non-interactive. */\n isReadOnly?: boolean\n}\n\nexport interface StepListState<T> extends SingleSelectListState<T> {\n readonly lastCompletedStep?: Key,\n setLastCompletedStep(key: Key): void,\n isCompleted(key: Key): boolean,\n isSelectable(key: Key): boolean\n}\n\nexport function useStepListState<T extends object>(props: StepListProps<T>): StepListState<T> {\n let state = useSingleSelectListState<T>(props);\n\n let [lastCompletedStep, setLastCompletedStep] = useControlledState<Key | null>(props.lastCompletedStep, props.defaultLastCompletedStep ?? null, props.onLastCompletedStepChange);\n const {setSelectedKey: realSetSelectedKey, selectedKey, collection} = state;\n const {indexMap, keysLinkedList} = useMemo(() => buildKeysMaps(collection), [collection]);\n const selectedIdx = indexMap.get(selectedKey);\n\n const isCompleted = useCallback((step: Key | null | undefined) => {\n if (step === undefined) {\n return false;\n }\n\n return (step !== null &&\n lastCompletedStep !== null &&\n indexMap.has(step) &&\n indexMap.has(lastCompletedStep) &&\n indexMap.get(step)! <= indexMap.get(lastCompletedStep)!);\n }, [indexMap, lastCompletedStep]);\n\n const findDefaultSelectedKey = useCallback((collection: Collection<Node<T>> | null, disabledKeys: Set<Key>) => {\n let selectedKey: Key | null = null;\n if (collection && collection.size > 0) {\n selectedKey = collection.getFirstKey();\n // loop over keys until we find one that isn't completed or disabled and select that\n while (selectedKey !== collection.getLastKey() && selectedKey && (disabledKeys.has(selectedKey) || isCompleted(selectedKey))) {\n selectedKey = collection.getKeyAfter(selectedKey);\n }\n }\n\n return selectedKey;\n }, [isCompleted]);\n\n useEffect(() => {\n // Ensure a step is always selected (in case no selected key was specified or if selected item was deleted from collection)\n let selectedKey: Key | null = state.selectedKey;\n if (state.selectionManager.isEmpty || !state.collection.getItem(selectedKey)) {\n selectedKey = findDefaultSelectedKey(state.collection, state.disabledKeys);\n if (selectedKey !== null) {\n state.selectionManager.replaceSelection(selectedKey);\n }\n }\n\n if (state.selectionManager.focusedKey == null) {\n state.selectionManager.setFocusedKey(selectedKey);\n }\n\n let lcs = (lastCompletedStep !== null ? indexMap.get(lastCompletedStep) : -1) ?? -1;\n if (selectedIdx !== undefined && selectedIdx > 0 && selectedIdx > lcs + 1 && selectedKey !== null && keysLinkedList.has(selectedKey)) {\n setLastCompletedStep(keysLinkedList.get(selectedKey)!);\n }\n });\n\n function isSelectable(step: Key) {\n if (props.isDisabled || state.disabledKeys.has(step) || props.isReadOnly) {\n return false;\n }\n\n if (isCompleted(step)) {\n return true;\n }\n\n const prevStep = keysLinkedList.get(step);\n return isCompleted(prevStep) || step === state.collection.getFirstKey();\n }\n\n function setSelectedKey(key: Key) {\n const prevKey = keysLinkedList.get(key);\n if (prevKey && !isCompleted(prevKey)) {\n setLastCompletedStep(prevKey);\n }\n realSetSelectedKey(key);\n }\n\n return {\n ...state,\n setSelectedKey,\n setLastCompletedStep,\n isCompleted,\n isSelectable\n };\n}\n\nfunction buildKeysMaps<T>(coll: Collection<Node<T>>) {\n const indexMap = new Map<Key, number>();\n const keysLinkedList = new Map<Key, Key | undefined>();\n let i = 0;\n let prev: Node<T> | undefined = undefined;\n for (const item of coll) {\n indexMap.set(item.key, i);\n keysLinkedList.set(item.key, prev?.key);\n prev = item;\n i++;\n }\n return {\n indexMap,\n keysLinkedList\n };\n}\n"],"names":[],"version":3,"file":"main.js.map"}
|
package/dist/module.js
CHANGED
|
@@ -27,7 +27,8 @@ import {useControlledState as $1ZKEJ$useControlledState} from "@react-stately/ut
|
|
|
27
27
|
|
|
28
28
|
function $cc8d414d37c075f2$export$a993ed2a771330b(props) {
|
|
29
29
|
let state = (0, $1ZKEJ$useSingleSelectListState)(props);
|
|
30
|
-
|
|
30
|
+
var _props_defaultLastCompletedStep;
|
|
31
|
+
let [lastCompletedStep, setLastCompletedStep] = (0, $1ZKEJ$useControlledState)(props.lastCompletedStep, (_props_defaultLastCompletedStep = props.defaultLastCompletedStep) !== null && _props_defaultLastCompletedStep !== void 0 ? _props_defaultLastCompletedStep : null, props.onLastCompletedStepChange);
|
|
31
32
|
const { setSelectedKey: realSetSelectedKey, selectedKey: selectedKey, collection: collection } = state;
|
|
32
33
|
const { indexMap: indexMap, keysLinkedList: keysLinkedList } = (0, $1ZKEJ$useMemo)(()=>$cc8d414d37c075f2$var$buildKeysMaps(collection), [
|
|
33
34
|
collection
|
|
@@ -35,17 +36,17 @@ function $cc8d414d37c075f2$export$a993ed2a771330b(props) {
|
|
|
35
36
|
const selectedIdx = indexMap.get(selectedKey);
|
|
36
37
|
const isCompleted = (0, $1ZKEJ$useCallback)((step)=>{
|
|
37
38
|
if (step === undefined) return false;
|
|
38
|
-
return indexMap.get(step) <= indexMap.get(lastCompletedStep);
|
|
39
|
+
return step !== null && lastCompletedStep !== null && indexMap.has(step) && indexMap.has(lastCompletedStep) && indexMap.get(step) <= indexMap.get(lastCompletedStep);
|
|
39
40
|
}, [
|
|
40
41
|
indexMap,
|
|
41
42
|
lastCompletedStep
|
|
42
43
|
]);
|
|
43
44
|
const findDefaultSelectedKey = (0, $1ZKEJ$useCallback)((collection, disabledKeys)=>{
|
|
44
45
|
let selectedKey = null;
|
|
45
|
-
if (collection) {
|
|
46
|
+
if (collection && collection.size > 0) {
|
|
46
47
|
selectedKey = collection.getFirstKey();
|
|
47
48
|
// loop over keys until we find one that isn't completed or disabled and select that
|
|
48
|
-
while(selectedKey !== collection.getLastKey() && (disabledKeys.has(selectedKey) || isCompleted(selectedKey)))selectedKey = collection.getKeyAfter(selectedKey);
|
|
49
|
+
while(selectedKey !== collection.getLastKey() && selectedKey && (disabledKeys.has(selectedKey) || isCompleted(selectedKey)))selectedKey = collection.getKeyAfter(selectedKey);
|
|
49
50
|
}
|
|
50
51
|
return selectedKey;
|
|
51
52
|
}, [
|
|
@@ -56,11 +57,12 @@ function $cc8d414d37c075f2$export$a993ed2a771330b(props) {
|
|
|
56
57
|
let selectedKey = state.selectedKey;
|
|
57
58
|
if (state.selectionManager.isEmpty || !state.collection.getItem(selectedKey)) {
|
|
58
59
|
selectedKey = findDefaultSelectedKey(state.collection, state.disabledKeys);
|
|
59
|
-
state.selectionManager.replaceSelection(selectedKey);
|
|
60
|
+
if (selectedKey !== null) state.selectionManager.replaceSelection(selectedKey);
|
|
60
61
|
}
|
|
61
62
|
if (state.selectionManager.focusedKey == null) state.selectionManager.setFocusedKey(selectedKey);
|
|
62
|
-
var
|
|
63
|
-
|
|
63
|
+
var _ref;
|
|
64
|
+
let lcs = (_ref = lastCompletedStep !== null ? indexMap.get(lastCompletedStep) : -1) !== null && _ref !== void 0 ? _ref : -1;
|
|
65
|
+
if (selectedIdx !== undefined && selectedIdx > 0 && selectedIdx > lcs + 1 && selectedKey !== null && keysLinkedList.has(selectedKey)) setLastCompletedStep(keysLinkedList.get(selectedKey));
|
|
64
66
|
});
|
|
65
67
|
function isSelectable(step) {
|
|
66
68
|
if (props.isDisabled || state.disabledKeys.has(step) || props.isReadOnly) return false;
|
package/dist/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";;;;AAAA;;;;;;;;;;ACAA;;;;;;;;;;CAUC;;;AA2BM,SAAS,yCAAmC,KAAuB;IACxE,IAAI,QAAQ,CAAA,GAAA,+BAAuB,EAAK;
|
|
1
|
+
{"mappings":"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","sources":["packages/@react-stately/steplist/src/index.ts","packages/@react-stately/steplist/src/useStepListState.ts"],"sourcesContent":["/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nexport {useStepListState} from './useStepListState';\nexport type {StepListProps, StepListState} from './useStepListState';\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, CollectionBase, Key, Node, SingleSelection} from '@react-types/shared';\nimport {SingleSelectListState, useSingleSelectListState} from '@react-stately/list';\nimport {useCallback, useEffect, useMemo} from 'react';\nimport {useControlledState} from '@react-stately/utils';\n\nexport interface StepListProps<T> extends CollectionBase<T>, SingleSelection {\n /** The key of the last completed step (controlled). */\n lastCompletedStep?: Key,\n /** The key of the initially last completed step (uncontrolled). */\n defaultLastCompletedStep?: Key,\n /** Callback for when the last completed step changes. */\n onLastCompletedStepChange?: (key: Key | null) => void,\n /** Whether the step list is disabled. Steps will not be focusable or interactive. */\n isDisabled?: boolean,\n /** Whether the step list is read only. Steps will be focusable but non-interactive. */\n isReadOnly?: boolean\n}\n\nexport interface StepListState<T> extends SingleSelectListState<T> {\n readonly lastCompletedStep?: Key,\n setLastCompletedStep(key: Key): void,\n isCompleted(key: Key): boolean,\n isSelectable(key: Key): boolean\n}\n\nexport function useStepListState<T extends object>(props: StepListProps<T>): StepListState<T> {\n let state = useSingleSelectListState<T>(props);\n\n let [lastCompletedStep, setLastCompletedStep] = useControlledState<Key | null>(props.lastCompletedStep, props.defaultLastCompletedStep ?? null, props.onLastCompletedStepChange);\n const {setSelectedKey: realSetSelectedKey, selectedKey, collection} = state;\n const {indexMap, keysLinkedList} = useMemo(() => buildKeysMaps(collection), [collection]);\n const selectedIdx = indexMap.get(selectedKey);\n\n const isCompleted = useCallback((step: Key | null | undefined) => {\n if (step === undefined) {\n return false;\n }\n\n return (step !== null &&\n lastCompletedStep !== null &&\n indexMap.has(step) &&\n indexMap.has(lastCompletedStep) &&\n indexMap.get(step)! <= indexMap.get(lastCompletedStep)!);\n }, [indexMap, lastCompletedStep]);\n\n const findDefaultSelectedKey = useCallback((collection: Collection<Node<T>> | null, disabledKeys: Set<Key>) => {\n let selectedKey: Key | null = null;\n if (collection && collection.size > 0) {\n selectedKey = collection.getFirstKey();\n // loop over keys until we find one that isn't completed or disabled and select that\n while (selectedKey !== collection.getLastKey() && selectedKey && (disabledKeys.has(selectedKey) || isCompleted(selectedKey))) {\n selectedKey = collection.getKeyAfter(selectedKey);\n }\n }\n\n return selectedKey;\n }, [isCompleted]);\n\n useEffect(() => {\n // Ensure a step is always selected (in case no selected key was specified or if selected item was deleted from collection)\n let selectedKey: Key | null = state.selectedKey;\n if (state.selectionManager.isEmpty || !state.collection.getItem(selectedKey)) {\n selectedKey = findDefaultSelectedKey(state.collection, state.disabledKeys);\n if (selectedKey !== null) {\n state.selectionManager.replaceSelection(selectedKey);\n }\n }\n\n if (state.selectionManager.focusedKey == null) {\n state.selectionManager.setFocusedKey(selectedKey);\n }\n\n let lcs = (lastCompletedStep !== null ? indexMap.get(lastCompletedStep) : -1) ?? -1;\n if (selectedIdx !== undefined && selectedIdx > 0 && selectedIdx > lcs + 1 && selectedKey !== null && keysLinkedList.has(selectedKey)) {\n setLastCompletedStep(keysLinkedList.get(selectedKey)!);\n }\n });\n\n function isSelectable(step: Key) {\n if (props.isDisabled || state.disabledKeys.has(step) || props.isReadOnly) {\n return false;\n }\n\n if (isCompleted(step)) {\n return true;\n }\n\n const prevStep = keysLinkedList.get(step);\n return isCompleted(prevStep) || step === state.collection.getFirstKey();\n }\n\n function setSelectedKey(key: Key) {\n const prevKey = keysLinkedList.get(key);\n if (prevKey && !isCompleted(prevKey)) {\n setLastCompletedStep(prevKey);\n }\n realSetSelectedKey(key);\n }\n\n return {\n ...state,\n setSelectedKey,\n setLastCompletedStep,\n isCompleted,\n isSelectable\n };\n}\n\nfunction buildKeysMaps<T>(coll: Collection<Node<T>>) {\n const indexMap = new Map<Key, number>();\n const keysLinkedList = new Map<Key, Key | undefined>();\n let i = 0;\n let prev: Node<T> | undefined = undefined;\n for (const item of coll) {\n indexMap.set(item.key, i);\n keysLinkedList.set(item.key, prev?.key);\n prev = item;\n i++;\n }\n return {\n indexMap,\n keysLinkedList\n };\n}\n"],"names":[],"version":3,"file":"module.js.map"}
|
package/dist/types.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export interface StepListProps<T> extends CollectionBase<T>, SingleSelection {
|
|
|
6
6
|
/** The key of the initially last completed step (uncontrolled). */
|
|
7
7
|
defaultLastCompletedStep?: Key;
|
|
8
8
|
/** Callback for when the last completed step changes. */
|
|
9
|
-
onLastCompletedStepChange?: (key: Key) => void;
|
|
9
|
+
onLastCompletedStepChange?: (key: Key | null) => void;
|
|
10
10
|
/** Whether the step list is disabled. Steps will not be focusable or interactive. */
|
|
11
11
|
isDisabled?: boolean;
|
|
12
12
|
/** Whether the step list is read only. Steps will be focusable but non-interactive. */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";;AAiBA,+BAA+B,CAAC,CAAE,SAAQ,eAAe,CAAC,CAAC,EAAE,eAAe;IAC1E,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,GAAG,CAAC;IACxB,mEAAmE;IACnE,wBAAwB,CAAC,EAAE,GAAG,CAAC;IAC/B,yDAAyD;IACzD,yBAAyB,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;
|
|
1
|
+
{"mappings":";;AAiBA,+BAA+B,CAAC,CAAE,SAAQ,eAAe,CAAC,CAAC,EAAE,eAAe;IAC1E,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,GAAG,CAAC;IACxB,mEAAmE;IACnE,wBAAwB,CAAC,EAAE,GAAG,CAAC;IAC/B,yDAAyD;IACzD,yBAAyB,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,KAAK,IAAI,CAAC;IACtD,qFAAqF;IACrF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uFAAuF;IACvF,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,+BAA+B,CAAC,CAAE,SAAQ,sBAAsB,CAAC,CAAC;IAChE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,GAAG,CAAC;IACjC,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IACrC,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC;IAC/B,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAA;CAChC;AAED,iCAAiC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAiF5F","sources":["packages/@react-stately/steplist/src/packages/@react-stately/steplist/src/useStepListState.ts","packages/@react-stately/steplist/src/packages/@react-stately/steplist/src/index.ts","packages/@react-stately/steplist/src/index.ts"],"sourcesContent":[null,null,"/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nexport {useStepListState} from './useStepListState';\nexport type {StepListProps, StepListState} from './useStepListState';\n"],"names":[],"version":3,"file":"types.d.ts.map"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-stately/steplist",
|
|
3
|
-
"version": "3.0.0-nightly.
|
|
3
|
+
"version": "3.0.0-nightly.4420+46ae3314a",
|
|
4
4
|
"description": "Spectrum UI components in React",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "dist/main.js",
|
|
@@ -22,9 +22,9 @@
|
|
|
22
22
|
"url": "https://github.com/adobe/react-spectrum"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@react-stately/list": "3.10.3-nightly.
|
|
26
|
-
"@react-stately/utils": "3.0.0-nightly.
|
|
27
|
-
"@react-types/shared": "3.0.0-nightly.
|
|
25
|
+
"@react-stately/list": "3.10.3-nightly.4420+46ae3314a",
|
|
26
|
+
"@react-stately/utils": "3.0.0-nightly.2708+46ae3314a",
|
|
27
|
+
"@react-types/shared": "3.0.0-nightly.2708+46ae3314a",
|
|
28
28
|
"@swc/helpers": "^0.5.0"
|
|
29
29
|
},
|
|
30
30
|
"peerDependencies": {
|
|
@@ -33,5 +33,5 @@
|
|
|
33
33
|
"publishConfig": {
|
|
34
34
|
"access": "public"
|
|
35
35
|
},
|
|
36
|
-
"gitHead": "
|
|
36
|
+
"gitHead": "46ae3314a2e2c1ab856c82c8d9dc941e8c70016e"
|
|
37
37
|
}
|
package/src/useStepListState.ts
CHANGED
|
@@ -21,7 +21,7 @@ export interface StepListProps<T> extends CollectionBase<T>, SingleSelection {
|
|
|
21
21
|
/** The key of the initially last completed step (uncontrolled). */
|
|
22
22
|
defaultLastCompletedStep?: Key,
|
|
23
23
|
/** Callback for when the last completed step changes. */
|
|
24
|
-
onLastCompletedStepChange?: (key: Key) => void,
|
|
24
|
+
onLastCompletedStepChange?: (key: Key | null) => void,
|
|
25
25
|
/** Whether the step list is disabled. Steps will not be focusable or interactive. */
|
|
26
26
|
isDisabled?: boolean,
|
|
27
27
|
/** Whether the step list is read only. Steps will be focusable but non-interactive. */
|
|
@@ -38,25 +38,29 @@ export interface StepListState<T> extends SingleSelectListState<T> {
|
|
|
38
38
|
export function useStepListState<T extends object>(props: StepListProps<T>): StepListState<T> {
|
|
39
39
|
let state = useSingleSelectListState<T>(props);
|
|
40
40
|
|
|
41
|
-
let [lastCompletedStep, setLastCompletedStep] = useControlledState<Key>(props.lastCompletedStep, props.defaultLastCompletedStep, props.onLastCompletedStepChange);
|
|
41
|
+
let [lastCompletedStep, setLastCompletedStep] = useControlledState<Key | null>(props.lastCompletedStep, props.defaultLastCompletedStep ?? null, props.onLastCompletedStepChange);
|
|
42
42
|
const {setSelectedKey: realSetSelectedKey, selectedKey, collection} = state;
|
|
43
43
|
const {indexMap, keysLinkedList} = useMemo(() => buildKeysMaps(collection), [collection]);
|
|
44
44
|
const selectedIdx = indexMap.get(selectedKey);
|
|
45
45
|
|
|
46
|
-
const isCompleted = useCallback((step: Key) => {
|
|
46
|
+
const isCompleted = useCallback((step: Key | null | undefined) => {
|
|
47
47
|
if (step === undefined) {
|
|
48
48
|
return false;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
return
|
|
51
|
+
return (step !== null &&
|
|
52
|
+
lastCompletedStep !== null &&
|
|
53
|
+
indexMap.has(step) &&
|
|
54
|
+
indexMap.has(lastCompletedStep) &&
|
|
55
|
+
indexMap.get(step)! <= indexMap.get(lastCompletedStep)!);
|
|
52
56
|
}, [indexMap, lastCompletedStep]);
|
|
53
57
|
|
|
54
58
|
const findDefaultSelectedKey = useCallback((collection: Collection<Node<T>> | null, disabledKeys: Set<Key>) => {
|
|
55
|
-
let selectedKey = null;
|
|
56
|
-
if (collection) {
|
|
59
|
+
let selectedKey: Key | null = null;
|
|
60
|
+
if (collection && collection.size > 0) {
|
|
57
61
|
selectedKey = collection.getFirstKey();
|
|
58
62
|
// loop over keys until we find one that isn't completed or disabled and select that
|
|
59
|
-
while (selectedKey !== collection.getLastKey() && (disabledKeys.has(selectedKey) || isCompleted(selectedKey))) {
|
|
63
|
+
while (selectedKey !== collection.getLastKey() && selectedKey && (disabledKeys.has(selectedKey) || isCompleted(selectedKey))) {
|
|
60
64
|
selectedKey = collection.getKeyAfter(selectedKey);
|
|
61
65
|
}
|
|
62
66
|
}
|
|
@@ -66,18 +70,21 @@ export function useStepListState<T extends object>(props: StepListProps<T>): Ste
|
|
|
66
70
|
|
|
67
71
|
useEffect(() => {
|
|
68
72
|
// Ensure a step is always selected (in case no selected key was specified or if selected item was deleted from collection)
|
|
69
|
-
let selectedKey = state.selectedKey;
|
|
73
|
+
let selectedKey: Key | null = state.selectedKey;
|
|
70
74
|
if (state.selectionManager.isEmpty || !state.collection.getItem(selectedKey)) {
|
|
71
75
|
selectedKey = findDefaultSelectedKey(state.collection, state.disabledKeys);
|
|
72
|
-
|
|
76
|
+
if (selectedKey !== null) {
|
|
77
|
+
state.selectionManager.replaceSelection(selectedKey);
|
|
78
|
+
}
|
|
73
79
|
}
|
|
74
80
|
|
|
75
81
|
if (state.selectionManager.focusedKey == null) {
|
|
76
82
|
state.selectionManager.setFocusedKey(selectedKey);
|
|
77
83
|
}
|
|
78
84
|
|
|
79
|
-
|
|
80
|
-
|
|
85
|
+
let lcs = (lastCompletedStep !== null ? indexMap.get(lastCompletedStep) : -1) ?? -1;
|
|
86
|
+
if (selectedIdx !== undefined && selectedIdx > 0 && selectedIdx > lcs + 1 && selectedKey !== null && keysLinkedList.has(selectedKey)) {
|
|
87
|
+
setLastCompletedStep(keysLinkedList.get(selectedKey)!);
|
|
81
88
|
}
|
|
82
89
|
});
|
|
83
90
|
|
|
@@ -111,11 +118,11 @@ export function useStepListState<T extends object>(props: StepListProps<T>): Ste
|
|
|
111
118
|
};
|
|
112
119
|
}
|
|
113
120
|
|
|
114
|
-
function buildKeysMaps<T>(coll: Collection<Node<T>>)
|
|
121
|
+
function buildKeysMaps<T>(coll: Collection<Node<T>>) {
|
|
115
122
|
const indexMap = new Map<Key, number>();
|
|
116
|
-
const keysLinkedList = new Map<Key, Key>();
|
|
123
|
+
const keysLinkedList = new Map<Key, Key | undefined>();
|
|
117
124
|
let i = 0;
|
|
118
|
-
let prev: Node<T> = undefined;
|
|
125
|
+
let prev: Node<T> | undefined = undefined;
|
|
119
126
|
for (const item of coll) {
|
|
120
127
|
indexMap.set(item.key, i);
|
|
121
128
|
keysLinkedList.set(item.key, prev?.key);
|