@react-stately/combobox 3.3.1-nightly.3611 → 3.3.1-nightly.3617

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/main.js CHANGED
@@ -33,12 +33,12 @@ $parcel$export(module.exports, "useComboBoxState", () => $e563f9c9469ad14c$expor
33
33
 
34
34
 
35
35
  function $e563f9c9469ad14c$export$b453a3bfd4a5fa9e(props) {
36
- var ref;
36
+ var _collection_getItem;
37
37
  let { defaultFilter: defaultFilter , menuTrigger: menuTrigger = "input" , allowsEmptyCollection: allowsEmptyCollection = false , allowsCustomValue: allowsCustomValue , shouldCloseOnBlur: shouldCloseOnBlur = true } = props;
38
38
  let [showAllItems, setShowAllItems] = (0, $5XAuq$react.useState)(false);
39
39
  let [isFocused, setFocusedState] = (0, $5XAuq$react.useState)(false);
40
- var _defaultInputValue;
41
- let [inputValue, setInputValue] = (0, $5XAuq$reactstatelyutils.useControlledState)(props.inputValue, (_defaultInputValue = props.defaultInputValue) !== null && _defaultInputValue !== void 0 ? _defaultInputValue : "", props.onInputChange);
40
+ var _props_defaultInputValue;
41
+ let [inputValue, setInputValue] = (0, $5XAuq$reactstatelyutils.useControlledState)(props.inputValue, (_props_defaultInputValue = props.defaultInputValue) !== null && _props_defaultInputValue !== void 0 ? _props_defaultInputValue : "", props.onInputChange);
42
42
  let onSelectionChange = (key)=>{
43
43
  if (props.onSelectionChange) props.onSelectionChange(key);
44
44
  // If key is the same, reset the inputValue and close the menu
@@ -48,11 +48,11 @@ function $e563f9c9469ad14c$export$b453a3bfd4a5fa9e(props) {
48
48
  triggerState.close();
49
49
  }
50
50
  };
51
- var _items;
51
+ var _props_items;
52
52
  let { collection: collection , selectionManager: selectionManager , selectedKey: selectedKey , setSelectedKey: setSelectedKey , selectedItem: selectedItem , disabledKeys: disabledKeys } = (0, $5XAuq$reactstatelylist.useSingleSelectListState)({
53
53
  ...props,
54
54
  onSelectionChange: onSelectionChange,
55
- items: (_items = props.items) !== null && _items !== void 0 ? _items : props.defaultItems
55
+ items: (_props_items = props.items) !== null && _props_items !== void 0 ? _props_items : props.defaultItems
56
56
  });
57
57
  // Preserve original collection so we can show all items on demand
58
58
  let originalCollection = collection;
@@ -98,21 +98,21 @@ function $e563f9c9469ad14c$export$b453a3bfd4a5fa9e(props) {
98
98
  };
99
99
  let lastValue = (0, $5XAuq$react.useRef)(inputValue);
100
100
  let resetInputValue = ()=>{
101
- var ref;
102
- var ref1;
103
- let itemText = (ref1 = (ref = collection.getItem(selectedKey)) === null || ref === void 0 ? void 0 : ref.textValue) !== null && ref1 !== void 0 ? ref1 : "";
101
+ var _collection_getItem;
102
+ var _collection_getItem_textValue;
103
+ let itemText = (_collection_getItem_textValue = (_collection_getItem = collection.getItem(selectedKey)) === null || _collection_getItem === void 0 ? void 0 : _collection_getItem.textValue) !== null && _collection_getItem_textValue !== void 0 ? _collection_getItem_textValue : "";
104
104
  lastValue.current = itemText;
105
105
  setInputValue(itemText);
106
106
  };
107
107
  let isInitialRender = (0, $5XAuq$react.useRef)(true);
108
- var _selectedKey, ref1;
109
- let lastSelectedKey = (0, $5XAuq$react.useRef)((ref1 = (_selectedKey = props.selectedKey) !== null && _selectedKey !== void 0 ? _selectedKey : props.defaultSelectedKey) !== null && ref1 !== void 0 ? ref1 : null);
110
- var ref2;
111
- let lastSelectedKeyText = (0, $5XAuq$react.useRef)((ref2 = (ref = collection.getItem(selectedKey)) === null || ref === void 0 ? void 0 : ref.textValue) !== null && ref2 !== void 0 ? ref2 : "");
108
+ var _props_selectedKey, _ref;
109
+ let lastSelectedKey = (0, $5XAuq$react.useRef)((_ref = (_props_selectedKey = props.selectedKey) !== null && _props_selectedKey !== void 0 ? _props_selectedKey : props.defaultSelectedKey) !== null && _ref !== void 0 ? _ref : null);
110
+ var _collection_getItem_textValue;
111
+ let lastSelectedKeyText = (0, $5XAuq$react.useRef)((_collection_getItem_textValue = (_collection_getItem = collection.getItem(selectedKey)) === null || _collection_getItem === void 0 ? void 0 : _collection_getItem.textValue) !== null && _collection_getItem_textValue !== void 0 ? _collection_getItem_textValue : "");
112
112
  // intentional omit dependency array, want this to happen on every render
113
113
  // eslint-disable-next-line react-hooks/exhaustive-deps
114
114
  (0, $5XAuq$react.useEffect)(()=>{
115
- var ref;
115
+ var _collection_getItem;
116
116
  // Open and close menu automatically when the input value changes if the input is focused,
117
117
  // and there are items in the collection or allowEmptyCollection is true.
118
118
  if (isFocused && (filteredCollection.size > 0 || allowsEmptyCollection) && !triggerState.isOpen && inputValue !== lastValue.current && menuTrigger !== "manual") open(null, "input");
@@ -136,12 +136,12 @@ function $e563f9c9469ad14c$export$b453a3bfd4a5fa9e(props) {
136
136
  // In this case, it's the user's responsibility to update inputValue in onSelectionChange.
137
137
  if (selectedKey !== lastSelectedKey.current && (props.inputValue === undefined || props.selectedKey === undefined)) resetInputValue();
138
138
  else lastValue.current = inputValue;
139
- var ref1;
139
+ var _collection_getItem_textValue;
140
140
  // Update the inputValue if the selected item's text changes from its last tracked value.
141
141
  // This is to handle cases where a selectedKey is specified but the items aren't available (async loading) or the selected item's text value updates.
142
142
  // Only reset if the user isn't currently within the field so we don't erroneously modify user input.
143
143
  // If inputValue is controlled, it is the user's responsibility to update the inputValue when items change.
144
- let selectedItemText = (ref1 = (ref = collection.getItem(selectedKey)) === null || ref === void 0 ? void 0 : ref.textValue) !== null && ref1 !== void 0 ? ref1 : "";
144
+ let selectedItemText = (_collection_getItem_textValue = (_collection_getItem = collection.getItem(selectedKey)) === null || _collection_getItem === void 0 ? void 0 : _collection_getItem.textValue) !== null && _collection_getItem_textValue !== void 0 ? _collection_getItem_textValue : "";
145
145
  if (!isFocused && selectedKey != null && props.inputValue === undefined && selectedKey === lastSelectedKey.current) {
146
146
  if (lastSelectedKeyText.current !== selectedItemText) {
147
147
  lastValue.current = selectedItemText;
@@ -172,11 +172,11 @@ function $e563f9c9469ad14c$export$b453a3bfd4a5fa9e(props) {
172
172
  let commitSelection = ()=>{
173
173
  // If multiple things are controlled, call onSelectionChange
174
174
  if (props.selectedKey !== undefined && props.inputValue !== undefined) {
175
- var ref;
175
+ var _collection_getItem;
176
176
  props.onSelectionChange(selectedKey);
177
- var ref1;
177
+ var _collection_getItem_textValue;
178
178
  // Stop menu from reopening from useEffect
179
- let itemText = (ref1 = (ref = collection.getItem(selectedKey)) === null || ref === void 0 ? void 0 : ref.textValue) !== null && ref1 !== void 0 ? ref1 : "";
179
+ let itemText = (_collection_getItem_textValue = (_collection_getItem = collection.getItem(selectedKey)) === null || _collection_getItem === void 0 ? void 0 : _collection_getItem.textValue) !== null && _collection_getItem_textValue !== void 0 ? _collection_getItem_textValue : "";
180
180
  lastValue.current = itemText;
181
181
  triggerState.close();
182
182
  } else {
@@ -199,9 +199,9 @@ function $e563f9c9469ad14c$export$b453a3bfd4a5fa9e(props) {
199
199
  if (isFocused) {
200
200
  if (menuTrigger === "focus") open(null, "focus");
201
201
  } else if (shouldCloseOnBlur) {
202
- var ref;
203
- var ref1;
204
- let itemText = (ref1 = (ref = collection.getItem(selectedKey)) === null || ref === void 0 ? void 0 : ref.textValue) !== null && ref1 !== void 0 ? ref1 : "";
202
+ var _collection_getItem;
203
+ var _collection_getItem_textValue;
204
+ let itemText = (_collection_getItem_textValue = (_collection_getItem = collection.getItem(selectedKey)) === null || _collection_getItem === void 0 ? void 0 : _collection_getItem.textValue) !== null && _collection_getItem_textValue !== void 0 ? _collection_getItem_textValue : "";
205
205
  if (allowsCustomValue && inputValue !== itemText) commitCustomValue();
206
206
  else commitSelection();
207
207
  }
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"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","sources":["packages/@react-stately/combobox/src/index.ts","packages/@react-stately/combobox/src/useComboBoxState.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {useComboBoxState} from './useComboBoxState';\n\nexport type {ComboBoxStateOptions, ComboBoxState} from './useComboBoxState';\n","/*\n * Copyright 2020 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, FocusStrategy, Node} from '@react-types/shared';\nimport {ComboBoxProps, MenuTriggerAction} from '@react-types/combobox';\nimport {ListCollection, useSingleSelectListState} from '@react-stately/list';\nimport {SelectState} from '@react-stately/select';\nimport {useControlledState} from '@react-stately/utils';\nimport {useEffect, useMemo, useRef, useState} from 'react';\nimport {useMenuTriggerState} from '@react-stately/menu';\n\nexport interface ComboBoxState<T> extends SelectState<T> {\n /** The current value of the combo box input. */\n inputValue: string,\n /** Sets the value of the combo box input. */\n setInputValue(value: string): void,\n /** Selects the currently focused item and updates the input value. */\n commit(): void,\n /** Opens the menu. */\n open(focusStrategy?: FocusStrategy | null, trigger?: MenuTriggerAction): void,\n /** Toggles the menu. */\n toggle(focusStrategy?: FocusStrategy | null, trigger?: MenuTriggerAction): void,\n /** Resets the input value to the previously selected item's text if any and closes the menu. */\n revert(): void\n}\n\ntype FilterFn = (textValue: string, inputValue: string) => boolean;\n\nexport interface ComboBoxStateOptions<T> extends ComboBoxProps<T> {\n /** The filter function used to determine if a option should be included in the combo box list. */\n defaultFilter?: FilterFn,\n /** Whether the combo box allows the menu to be open when the collection is empty. */\n allowsEmptyCollection?: boolean,\n /** Whether the combo box menu should close on blur. */\n shouldCloseOnBlur?: boolean\n}\n\n/**\n * Provides state management for a combo box component. Handles building a collection\n * of items from props and manages the option selection state of the combo box. In addition, it tracks the input value,\n * focus state, and other properties of the combo box.\n */\nexport function useComboBoxState<T extends object>(props: ComboBoxStateOptions<T>): ComboBoxState<T> {\n let {\n defaultFilter,\n menuTrigger = 'input',\n allowsEmptyCollection = false,\n allowsCustomValue,\n shouldCloseOnBlur = true\n } = props;\n\n let [showAllItems, setShowAllItems] = useState(false);\n let [isFocused, setFocusedState] = useState(false);\n let [inputValue, setInputValue] = useControlledState(\n props.inputValue,\n props.defaultInputValue ?? '',\n props.onInputChange\n );\n\n let onSelectionChange = (key) => {\n if (props.onSelectionChange) {\n props.onSelectionChange(key);\n }\n\n // If key is the same, reset the inputValue and close the menu\n // (scenario: user clicks on already selected option)\n if (key === selectedKey) {\n resetInputValue();\n triggerState.close();\n }\n };\n\n let {collection, selectionManager, selectedKey, setSelectedKey, selectedItem, disabledKeys} = useSingleSelectListState({\n ...props,\n onSelectionChange,\n items: props.items ?? props.defaultItems\n });\n\n // Preserve original collection so we can show all items on demand\n let originalCollection = collection;\n let filteredCollection = useMemo(() => (\n // No default filter if items are controlled.\n props.items != null || !defaultFilter\n ? collection\n : filterCollection(collection, inputValue, defaultFilter)\n ), [collection, inputValue, defaultFilter, props.items]);\n\n // Track what action is attempting to open the menu\n let menuOpenTrigger = useRef('focus' as MenuTriggerAction);\n let onOpenChange = (open: boolean) => {\n if (props.onOpenChange) {\n props.onOpenChange(open, open ? menuOpenTrigger.current : undefined);\n }\n };\n\n let triggerState = useMenuTriggerState({...props, onOpenChange, isOpen: undefined, defaultOpen: undefined});\n let open = (focusStrategy?: FocusStrategy, trigger?: MenuTriggerAction) => {\n let displayAllItems = (trigger === 'manual' || (trigger === 'focus' && menuTrigger === 'focus'));\n // Prevent open operations from triggering if there is nothing to display\n // Also prevent open operations from triggering if items are uncontrolled but defaultItems is empty, even if displayAllItems is true.\n // This is to prevent comboboxes with empty defaultItems from opening but allow controlled items comboboxes to open even if the inital list is empty (assumption is user will provide swap the empty list with a base list via onOpenChange returning `menuTrigger` manual)\n if (allowsEmptyCollection || filteredCollection.size > 0 || (displayAllItems && originalCollection.size > 0) || props.items) {\n if (displayAllItems && !triggerState.isOpen && props.items === undefined) {\n // Show all items if menu is manually opened. Only care about this if items are undefined\n setShowAllItems(true);\n }\n\n menuOpenTrigger.current = trigger;\n triggerState.open(focusStrategy);\n }\n };\n\n let toggle = (focusStrategy?: FocusStrategy, trigger?: MenuTriggerAction) => {\n let displayAllItems = (trigger === 'manual' || (trigger === 'focus' && menuTrigger === 'focus'));\n // If the menu is closed and there is nothing to display, early return so toggle isn't called to prevent extraneous onOpenChange\n if (!(allowsEmptyCollection || filteredCollection.size > 0 || (displayAllItems && originalCollection.size > 0) || props.items) && !triggerState.isOpen) {\n return;\n }\n\n if (displayAllItems && !triggerState.isOpen && props.items === undefined) {\n // Show all items if menu is toggled open. Only care about this if items are undefined\n setShowAllItems(true);\n }\n\n // Only update the menuOpenTrigger if menu is currently closed\n if (!triggerState.isOpen) {\n menuOpenTrigger.current = trigger;\n }\n\n triggerState.toggle(focusStrategy);\n };\n\n let lastValue = useRef(inputValue);\n let resetInputValue = () => {\n let itemText = collection.getItem(selectedKey)?.textValue ?? '';\n lastValue.current = itemText;\n setInputValue(itemText);\n };\n\n let isInitialRender = useRef(true);\n let lastSelectedKey = useRef(props.selectedKey ?? props.defaultSelectedKey ?? null);\n let lastSelectedKeyText = useRef(collection.getItem(selectedKey)?.textValue ?? '');\n // intentional omit dependency array, want this to happen on every render\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n // Open and close menu automatically when the input value changes if the input is focused,\n // and there are items in the collection or allowEmptyCollection is true.\n if (\n isFocused &&\n (filteredCollection.size > 0 || allowsEmptyCollection) &&\n !triggerState.isOpen &&\n inputValue !== lastValue.current &&\n menuTrigger !== 'manual'\n ) {\n open(null, 'input');\n }\n\n // Close the menu if the collection is empty. Don't close menu if filtered collection size is 0\n // but we are currently showing all items via button press\n if (\n !showAllItems &&\n !allowsEmptyCollection &&\n triggerState.isOpen &&\n filteredCollection.size === 0\n ) {\n triggerState.close();\n }\n\n // Close when an item is selected.\n if (\n selectedKey != null &&\n selectedKey !== lastSelectedKey.current\n ) {\n triggerState.close();\n }\n\n // Clear focused key when input value changes and display filtered collection again.\n if (inputValue !== lastValue.current) {\n selectionManager.setFocusedKey(null);\n setShowAllItems(false);\n\n // Set selectedKey to null when the user clears the input.\n // If controlled, this is the application developer's responsibility.\n if (inputValue === '' && (props.inputValue === undefined || props.selectedKey === undefined)) {\n setSelectedKey(null);\n }\n }\n\n // If it is the intial render and inputValue isn't controlled nor has an intial value, set input to match current selected key if any\n if (isInitialRender.current && (props.inputValue === undefined && props.defaultInputValue === undefined)) {\n resetInputValue();\n }\n\n // If the selectedKey changed, update the input value.\n // Do nothing if both inputValue and selectedKey are controlled.\n // In this case, it's the user's responsibility to update inputValue in onSelectionChange.\n if (\n selectedKey !== lastSelectedKey.current &&\n (props.inputValue === undefined || props.selectedKey === undefined)\n ) {\n resetInputValue();\n } else {\n lastValue.current = inputValue;\n }\n\n // Update the inputValue if the selected item's text changes from its last tracked value.\n // This is to handle cases where a selectedKey is specified but the items aren't available (async loading) or the selected item's text value updates.\n // Only reset if the user isn't currently within the field so we don't erroneously modify user input.\n // If inputValue is controlled, it is the user's responsibility to update the inputValue when items change.\n let selectedItemText = collection.getItem(selectedKey)?.textValue ?? '';\n if (!isFocused && selectedKey != null && props.inputValue === undefined && selectedKey === lastSelectedKey.current) {\n if (lastSelectedKeyText.current !== selectedItemText) {\n lastValue.current = selectedItemText;\n setInputValue(selectedItemText);\n }\n }\n\n isInitialRender.current = false;\n lastSelectedKey.current = selectedKey;\n lastSelectedKeyText.current = selectedItemText;\n });\n\n useEffect(() => {\n // Reset focused key when the menu closes\n if (!triggerState.isOpen) {\n selectionManager.setFocusedKey(null);\n }\n }, [triggerState.isOpen, selectionManager]);\n\n // Revert input value and close menu\n let revert = () => {\n if (allowsCustomValue && selectedKey == null) {\n commitCustomValue();\n } else {\n commitSelection();\n }\n };\n\n let commitCustomValue = () => {\n lastSelectedKey.current = null;\n setSelectedKey(null);\n triggerState.close();\n };\n\n let commitSelection = () => {\n // If multiple things are controlled, call onSelectionChange\n if (props.selectedKey !== undefined && props.inputValue !== undefined) {\n props.onSelectionChange(selectedKey);\n\n // Stop menu from reopening from useEffect\n let itemText = collection.getItem(selectedKey)?.textValue ?? '';\n lastValue.current = itemText;\n triggerState.close();\n } else {\n // If only a single aspect of combobox is controlled, reset input value and close menu for the user\n resetInputValue();\n triggerState.close();\n }\n };\n\n let commit = () => {\n if (triggerState.isOpen && selectionManager.focusedKey != null) {\n // Reset inputValue and close menu here if the selected key is already the focused key. Otherwise\n // fire onSelectionChange to allow the application to control the closing.\n if (selectedKey === selectionManager.focusedKey) {\n commitSelection();\n } else {\n setSelectedKey(selectionManager.focusedKey);\n }\n } else if (allowsCustomValue) {\n commitCustomValue();\n } else {\n // Reset inputValue and close menu if no item is focused but user triggers a commit\n commitSelection();\n }\n };\n\n let setFocused = (isFocused: boolean) => {\n if (isFocused) {\n if (menuTrigger === 'focus') {\n open(null, 'focus');\n }\n } else if (shouldCloseOnBlur) {\n let itemText = collection.getItem(selectedKey)?.textValue ?? '';\n if (allowsCustomValue && inputValue !== itemText) {\n commitCustomValue();\n } else {\n commitSelection();\n }\n }\n\n setFocusedState(isFocused);\n };\n\n return {\n ...triggerState,\n toggle,\n open,\n close: commit,\n selectionManager,\n selectedKey,\n setSelectedKey,\n disabledKeys,\n isFocused,\n setFocused,\n selectedItem,\n collection: showAllItems ? originalCollection : filteredCollection,\n inputValue,\n setInputValue,\n commit,\n revert\n };\n}\n\nfunction filterCollection<T extends object>(collection: Collection<Node<T>>, inputValue: string, filter: FilterFn): Collection<Node<T>> {\n return new ListCollection(filterNodes(collection, inputValue, filter));\n}\n\nfunction filterNodes<T>(nodes: Iterable<Node<T>>, inputValue: string, filter: FilterFn): Iterable<Node<T>> {\n let filteredNode = [];\n for (let node of nodes) {\n if (node.type === 'section' && node.hasChildNodes) {\n let filtered = filterNodes(node.childNodes, inputValue, filter);\n if ([...filtered].length > 0) {\n filteredNode.push({...node, childNodes: filtered});\n }\n } else if (node.type !== 'section' && filter(node.textValue, inputValue)) {\n filteredNode.push({...node});\n }\n }\n return filteredNode;\n}\n"],"names":[],"version":3,"file":"main.js.map"}
1
+ {"mappings":"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","sources":["packages/@react-stately/combobox/src/index.ts","packages/@react-stately/combobox/src/useComboBoxState.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {useComboBoxState} from './useComboBoxState';\n\nexport type {ComboBoxStateOptions, ComboBoxState} from './useComboBoxState';\n","/*\n * Copyright 2020 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, FocusStrategy, Node} from '@react-types/shared';\nimport {ComboBoxProps, MenuTriggerAction} from '@react-types/combobox';\nimport {ListCollection, useSingleSelectListState} from '@react-stately/list';\nimport {SelectState} from '@react-stately/select';\nimport {useControlledState} from '@react-stately/utils';\nimport {useEffect, useMemo, useRef, useState} from 'react';\nimport {useMenuTriggerState} from '@react-stately/menu';\n\nexport interface ComboBoxState<T> extends SelectState<T> {\n /** The current value of the combo box input. */\n inputValue: string,\n /** Sets the value of the combo box input. */\n setInputValue(value: string): void,\n /** Selects the currently focused item and updates the input value. */\n commit(): void,\n /** Opens the menu. */\n open(focusStrategy?: FocusStrategy | null, trigger?: MenuTriggerAction): void,\n /** Toggles the menu. */\n toggle(focusStrategy?: FocusStrategy | null, trigger?: MenuTriggerAction): void,\n /** Resets the input value to the previously selected item's text if any and closes the menu. */\n revert(): void\n}\n\ntype FilterFn = (textValue: string, inputValue: string) => boolean;\n\nexport interface ComboBoxStateOptions<T> extends ComboBoxProps<T> {\n /** The filter function used to determine if a option should be included in the combo box list. */\n defaultFilter?: FilterFn,\n /** Whether the combo box allows the menu to be open when the collection is empty. */\n allowsEmptyCollection?: boolean,\n /** Whether the combo box menu should close on blur. */\n shouldCloseOnBlur?: boolean\n}\n\n/**\n * Provides state management for a combo box component. Handles building a collection\n * of items from props and manages the option selection state of the combo box. In addition, it tracks the input value,\n * focus state, and other properties of the combo box.\n */\nexport function useComboBoxState<T extends object>(props: ComboBoxStateOptions<T>): ComboBoxState<T> {\n let {\n defaultFilter,\n menuTrigger = 'input',\n allowsEmptyCollection = false,\n allowsCustomValue,\n shouldCloseOnBlur = true\n } = props;\n\n let [showAllItems, setShowAllItems] = useState(false);\n let [isFocused, setFocusedState] = useState(false);\n let [inputValue, setInputValue] = useControlledState(\n props.inputValue,\n props.defaultInputValue ?? '',\n props.onInputChange\n );\n\n let onSelectionChange = (key) => {\n if (props.onSelectionChange) {\n props.onSelectionChange(key);\n }\n\n // If key is the same, reset the inputValue and close the menu\n // (scenario: user clicks on already selected option)\n if (key === selectedKey) {\n resetInputValue();\n triggerState.close();\n }\n };\n\n let {collection, selectionManager, selectedKey, setSelectedKey, selectedItem, disabledKeys} = useSingleSelectListState({\n ...props,\n onSelectionChange,\n items: props.items ?? props.defaultItems\n });\n\n // Preserve original collection so we can show all items on demand\n let originalCollection = collection;\n let filteredCollection = useMemo(() => (\n // No default filter if items are controlled.\n props.items != null || !defaultFilter\n ? collection\n : filterCollection(collection, inputValue, defaultFilter)\n ), [collection, inputValue, defaultFilter, props.items]);\n\n // Track what action is attempting to open the menu\n let menuOpenTrigger = useRef('focus' as MenuTriggerAction);\n let onOpenChange = (open: boolean) => {\n if (props.onOpenChange) {\n props.onOpenChange(open, open ? menuOpenTrigger.current : undefined);\n }\n };\n\n let triggerState = useMenuTriggerState({...props, onOpenChange, isOpen: undefined, defaultOpen: undefined});\n let open = (focusStrategy?: FocusStrategy, trigger?: MenuTriggerAction) => {\n let displayAllItems = (trigger === 'manual' || (trigger === 'focus' && menuTrigger === 'focus'));\n // Prevent open operations from triggering if there is nothing to display\n // Also prevent open operations from triggering if items are uncontrolled but defaultItems is empty, even if displayAllItems is true.\n // This is to prevent comboboxes with empty defaultItems from opening but allow controlled items comboboxes to open even if the inital list is empty (assumption is user will provide swap the empty list with a base list via onOpenChange returning `menuTrigger` manual)\n if (allowsEmptyCollection || filteredCollection.size > 0 || (displayAllItems && originalCollection.size > 0) || props.items) {\n if (displayAllItems && !triggerState.isOpen && props.items === undefined) {\n // Show all items if menu is manually opened. Only care about this if items are undefined\n setShowAllItems(true);\n }\n\n menuOpenTrigger.current = trigger;\n triggerState.open(focusStrategy);\n }\n };\n\n let toggle = (focusStrategy?: FocusStrategy, trigger?: MenuTriggerAction) => {\n let displayAllItems = (trigger === 'manual' || (trigger === 'focus' && menuTrigger === 'focus'));\n // If the menu is closed and there is nothing to display, early return so toggle isn't called to prevent extraneous onOpenChange\n if (!(allowsEmptyCollection || filteredCollection.size > 0 || (displayAllItems && originalCollection.size > 0) || props.items) && !triggerState.isOpen) {\n return;\n }\n\n if (displayAllItems && !triggerState.isOpen && props.items === undefined) {\n // Show all items if menu is toggled open. Only care about this if items are undefined\n setShowAllItems(true);\n }\n\n // Only update the menuOpenTrigger if menu is currently closed\n if (!triggerState.isOpen) {\n menuOpenTrigger.current = trigger;\n }\n\n triggerState.toggle(focusStrategy);\n };\n\n let lastValue = useRef(inputValue);\n let resetInputValue = () => {\n let itemText = collection.getItem(selectedKey)?.textValue ?? '';\n lastValue.current = itemText;\n setInputValue(itemText);\n };\n\n let isInitialRender = useRef(true);\n let lastSelectedKey = useRef(props.selectedKey ?? props.defaultSelectedKey ?? null);\n let lastSelectedKeyText = useRef(collection.getItem(selectedKey)?.textValue ?? '');\n // intentional omit dependency array, want this to happen on every render\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n // Open and close menu automatically when the input value changes if the input is focused,\n // and there are items in the collection or allowEmptyCollection is true.\n if (\n isFocused &&\n (filteredCollection.size > 0 || allowsEmptyCollection) &&\n !triggerState.isOpen &&\n inputValue !== lastValue.current &&\n menuTrigger !== 'manual'\n ) {\n open(null, 'input');\n }\n\n // Close the menu if the collection is empty. Don't close menu if filtered collection size is 0\n // but we are currently showing all items via button press\n if (\n !showAllItems &&\n !allowsEmptyCollection &&\n triggerState.isOpen &&\n filteredCollection.size === 0\n ) {\n triggerState.close();\n }\n\n // Close when an item is selected.\n if (\n selectedKey != null &&\n selectedKey !== lastSelectedKey.current\n ) {\n triggerState.close();\n }\n\n // Clear focused key when input value changes and display filtered collection again.\n if (inputValue !== lastValue.current) {\n selectionManager.setFocusedKey(null);\n setShowAllItems(false);\n\n // Set selectedKey to null when the user clears the input.\n // If controlled, this is the application developer's responsibility.\n if (inputValue === '' && (props.inputValue === undefined || props.selectedKey === undefined)) {\n setSelectedKey(null);\n }\n }\n\n // If it is the intial render and inputValue isn't controlled nor has an intial value, set input to match current selected key if any\n if (isInitialRender.current && (props.inputValue === undefined && props.defaultInputValue === undefined)) {\n resetInputValue();\n }\n\n // If the selectedKey changed, update the input value.\n // Do nothing if both inputValue and selectedKey are controlled.\n // In this case, it's the user's responsibility to update inputValue in onSelectionChange.\n if (\n selectedKey !== lastSelectedKey.current &&\n (props.inputValue === undefined || props.selectedKey === undefined)\n ) {\n resetInputValue();\n } else {\n lastValue.current = inputValue;\n }\n\n // Update the inputValue if the selected item's text changes from its last tracked value.\n // This is to handle cases where a selectedKey is specified but the items aren't available (async loading) or the selected item's text value updates.\n // Only reset if the user isn't currently within the field so we don't erroneously modify user input.\n // If inputValue is controlled, it is the user's responsibility to update the inputValue when items change.\n let selectedItemText = collection.getItem(selectedKey)?.textValue ?? '';\n if (!isFocused && selectedKey != null && props.inputValue === undefined && selectedKey === lastSelectedKey.current) {\n if (lastSelectedKeyText.current !== selectedItemText) {\n lastValue.current = selectedItemText;\n setInputValue(selectedItemText);\n }\n }\n\n isInitialRender.current = false;\n lastSelectedKey.current = selectedKey;\n lastSelectedKeyText.current = selectedItemText;\n });\n\n useEffect(() => {\n // Reset focused key when the menu closes\n if (!triggerState.isOpen) {\n selectionManager.setFocusedKey(null);\n }\n }, [triggerState.isOpen, selectionManager]);\n\n // Revert input value and close menu\n let revert = () => {\n if (allowsCustomValue && selectedKey == null) {\n commitCustomValue();\n } else {\n commitSelection();\n }\n };\n\n let commitCustomValue = () => {\n lastSelectedKey.current = null;\n setSelectedKey(null);\n triggerState.close();\n };\n\n let commitSelection = () => {\n // If multiple things are controlled, call onSelectionChange\n if (props.selectedKey !== undefined && props.inputValue !== undefined) {\n props.onSelectionChange(selectedKey);\n\n // Stop menu from reopening from useEffect\n let itemText = collection.getItem(selectedKey)?.textValue ?? '';\n lastValue.current = itemText;\n triggerState.close();\n } else {\n // If only a single aspect of combobox is controlled, reset input value and close menu for the user\n resetInputValue();\n triggerState.close();\n }\n };\n\n let commit = () => {\n if (triggerState.isOpen && selectionManager.focusedKey != null) {\n // Reset inputValue and close menu here if the selected key is already the focused key. Otherwise\n // fire onSelectionChange to allow the application to control the closing.\n if (selectedKey === selectionManager.focusedKey) {\n commitSelection();\n } else {\n setSelectedKey(selectionManager.focusedKey);\n }\n } else if (allowsCustomValue) {\n commitCustomValue();\n } else {\n // Reset inputValue and close menu if no item is focused but user triggers a commit\n commitSelection();\n }\n };\n\n let setFocused = (isFocused: boolean) => {\n if (isFocused) {\n if (menuTrigger === 'focus') {\n open(null, 'focus');\n }\n } else if (shouldCloseOnBlur) {\n let itemText = collection.getItem(selectedKey)?.textValue ?? '';\n if (allowsCustomValue && inputValue !== itemText) {\n commitCustomValue();\n } else {\n commitSelection();\n }\n }\n\n setFocusedState(isFocused);\n };\n\n return {\n ...triggerState,\n toggle,\n open,\n close: commit,\n selectionManager,\n selectedKey,\n setSelectedKey,\n disabledKeys,\n isFocused,\n setFocused,\n selectedItem,\n collection: showAllItems ? originalCollection : filteredCollection,\n inputValue,\n setInputValue,\n commit,\n revert\n };\n}\n\nfunction filterCollection<T extends object>(collection: Collection<Node<T>>, inputValue: string, filter: FilterFn): Collection<Node<T>> {\n return new ListCollection(filterNodes(collection, inputValue, filter));\n}\n\nfunction filterNodes<T>(nodes: Iterable<Node<T>>, inputValue: string, filter: FilterFn): Iterable<Node<T>> {\n let filteredNode = [];\n for (let node of nodes) {\n if (node.type === 'section' && node.hasChildNodes) {\n let filtered = filterNodes(node.childNodes, inputValue, filter);\n if ([...filtered].length > 0) {\n filteredNode.push({...node, childNodes: filtered});\n }\n } else if (node.type !== 'section' && filter(node.textValue, inputValue)) {\n filteredNode.push({...node});\n }\n }\n return filteredNode;\n}\n"],"names":[],"version":3,"file":"main.js.map"}
package/dist/module.js CHANGED
@@ -28,12 +28,12 @@ import {useMenuTriggerState as $k6Ppu$useMenuTriggerState} from "@react-stately/
28
28
 
29
29
 
30
30
  function $a9e7382a7d111cb5$export$b453a3bfd4a5fa9e(props) {
31
- var ref;
31
+ var _collection_getItem;
32
32
  let { defaultFilter: defaultFilter , menuTrigger: menuTrigger = "input" , allowsEmptyCollection: allowsEmptyCollection = false , allowsCustomValue: allowsCustomValue , shouldCloseOnBlur: shouldCloseOnBlur = true } = props;
33
33
  let [showAllItems, setShowAllItems] = (0, $k6Ppu$useState)(false);
34
34
  let [isFocused, setFocusedState] = (0, $k6Ppu$useState)(false);
35
- var _defaultInputValue;
36
- let [inputValue, setInputValue] = (0, $k6Ppu$useControlledState)(props.inputValue, (_defaultInputValue = props.defaultInputValue) !== null && _defaultInputValue !== void 0 ? _defaultInputValue : "", props.onInputChange);
35
+ var _props_defaultInputValue;
36
+ let [inputValue, setInputValue] = (0, $k6Ppu$useControlledState)(props.inputValue, (_props_defaultInputValue = props.defaultInputValue) !== null && _props_defaultInputValue !== void 0 ? _props_defaultInputValue : "", props.onInputChange);
37
37
  let onSelectionChange = (key)=>{
38
38
  if (props.onSelectionChange) props.onSelectionChange(key);
39
39
  // If key is the same, reset the inputValue and close the menu
@@ -43,11 +43,11 @@ function $a9e7382a7d111cb5$export$b453a3bfd4a5fa9e(props) {
43
43
  triggerState.close();
44
44
  }
45
45
  };
46
- var _items;
46
+ var _props_items;
47
47
  let { collection: collection , selectionManager: selectionManager , selectedKey: selectedKey , setSelectedKey: setSelectedKey , selectedItem: selectedItem , disabledKeys: disabledKeys } = (0, $k6Ppu$useSingleSelectListState)({
48
48
  ...props,
49
49
  onSelectionChange: onSelectionChange,
50
- items: (_items = props.items) !== null && _items !== void 0 ? _items : props.defaultItems
50
+ items: (_props_items = props.items) !== null && _props_items !== void 0 ? _props_items : props.defaultItems
51
51
  });
52
52
  // Preserve original collection so we can show all items on demand
53
53
  let originalCollection = collection;
@@ -93,21 +93,21 @@ function $a9e7382a7d111cb5$export$b453a3bfd4a5fa9e(props) {
93
93
  };
94
94
  let lastValue = (0, $k6Ppu$useRef)(inputValue);
95
95
  let resetInputValue = ()=>{
96
- var ref;
97
- var ref1;
98
- let itemText = (ref1 = (ref = collection.getItem(selectedKey)) === null || ref === void 0 ? void 0 : ref.textValue) !== null && ref1 !== void 0 ? ref1 : "";
96
+ var _collection_getItem;
97
+ var _collection_getItem_textValue;
98
+ let itemText = (_collection_getItem_textValue = (_collection_getItem = collection.getItem(selectedKey)) === null || _collection_getItem === void 0 ? void 0 : _collection_getItem.textValue) !== null && _collection_getItem_textValue !== void 0 ? _collection_getItem_textValue : "";
99
99
  lastValue.current = itemText;
100
100
  setInputValue(itemText);
101
101
  };
102
102
  let isInitialRender = (0, $k6Ppu$useRef)(true);
103
- var _selectedKey, ref1;
104
- let lastSelectedKey = (0, $k6Ppu$useRef)((ref1 = (_selectedKey = props.selectedKey) !== null && _selectedKey !== void 0 ? _selectedKey : props.defaultSelectedKey) !== null && ref1 !== void 0 ? ref1 : null);
105
- var ref2;
106
- let lastSelectedKeyText = (0, $k6Ppu$useRef)((ref2 = (ref = collection.getItem(selectedKey)) === null || ref === void 0 ? void 0 : ref.textValue) !== null && ref2 !== void 0 ? ref2 : "");
103
+ var _props_selectedKey, _ref;
104
+ let lastSelectedKey = (0, $k6Ppu$useRef)((_ref = (_props_selectedKey = props.selectedKey) !== null && _props_selectedKey !== void 0 ? _props_selectedKey : props.defaultSelectedKey) !== null && _ref !== void 0 ? _ref : null);
105
+ var _collection_getItem_textValue;
106
+ let lastSelectedKeyText = (0, $k6Ppu$useRef)((_collection_getItem_textValue = (_collection_getItem = collection.getItem(selectedKey)) === null || _collection_getItem === void 0 ? void 0 : _collection_getItem.textValue) !== null && _collection_getItem_textValue !== void 0 ? _collection_getItem_textValue : "");
107
107
  // intentional omit dependency array, want this to happen on every render
108
108
  // eslint-disable-next-line react-hooks/exhaustive-deps
109
109
  (0, $k6Ppu$useEffect)(()=>{
110
- var ref;
110
+ var _collection_getItem;
111
111
  // Open and close menu automatically when the input value changes if the input is focused,
112
112
  // and there are items in the collection or allowEmptyCollection is true.
113
113
  if (isFocused && (filteredCollection.size > 0 || allowsEmptyCollection) && !triggerState.isOpen && inputValue !== lastValue.current && menuTrigger !== "manual") open(null, "input");
@@ -131,12 +131,12 @@ function $a9e7382a7d111cb5$export$b453a3bfd4a5fa9e(props) {
131
131
  // In this case, it's the user's responsibility to update inputValue in onSelectionChange.
132
132
  if (selectedKey !== lastSelectedKey.current && (props.inputValue === undefined || props.selectedKey === undefined)) resetInputValue();
133
133
  else lastValue.current = inputValue;
134
- var ref1;
134
+ var _collection_getItem_textValue;
135
135
  // Update the inputValue if the selected item's text changes from its last tracked value.
136
136
  // This is to handle cases where a selectedKey is specified but the items aren't available (async loading) or the selected item's text value updates.
137
137
  // Only reset if the user isn't currently within the field so we don't erroneously modify user input.
138
138
  // If inputValue is controlled, it is the user's responsibility to update the inputValue when items change.
139
- let selectedItemText = (ref1 = (ref = collection.getItem(selectedKey)) === null || ref === void 0 ? void 0 : ref.textValue) !== null && ref1 !== void 0 ? ref1 : "";
139
+ let selectedItemText = (_collection_getItem_textValue = (_collection_getItem = collection.getItem(selectedKey)) === null || _collection_getItem === void 0 ? void 0 : _collection_getItem.textValue) !== null && _collection_getItem_textValue !== void 0 ? _collection_getItem_textValue : "";
140
140
  if (!isFocused && selectedKey != null && props.inputValue === undefined && selectedKey === lastSelectedKey.current) {
141
141
  if (lastSelectedKeyText.current !== selectedItemText) {
142
142
  lastValue.current = selectedItemText;
@@ -167,11 +167,11 @@ function $a9e7382a7d111cb5$export$b453a3bfd4a5fa9e(props) {
167
167
  let commitSelection = ()=>{
168
168
  // If multiple things are controlled, call onSelectionChange
169
169
  if (props.selectedKey !== undefined && props.inputValue !== undefined) {
170
- var ref;
170
+ var _collection_getItem;
171
171
  props.onSelectionChange(selectedKey);
172
- var ref1;
172
+ var _collection_getItem_textValue;
173
173
  // Stop menu from reopening from useEffect
174
- let itemText = (ref1 = (ref = collection.getItem(selectedKey)) === null || ref === void 0 ? void 0 : ref.textValue) !== null && ref1 !== void 0 ? ref1 : "";
174
+ let itemText = (_collection_getItem_textValue = (_collection_getItem = collection.getItem(selectedKey)) === null || _collection_getItem === void 0 ? void 0 : _collection_getItem.textValue) !== null && _collection_getItem_textValue !== void 0 ? _collection_getItem_textValue : "";
175
175
  lastValue.current = itemText;
176
176
  triggerState.close();
177
177
  } else {
@@ -194,9 +194,9 @@ function $a9e7382a7d111cb5$export$b453a3bfd4a5fa9e(props) {
194
194
  if (isFocused) {
195
195
  if (menuTrigger === "focus") open(null, "focus");
196
196
  } else if (shouldCloseOnBlur) {
197
- var ref;
198
- var ref1;
199
- let itemText = (ref1 = (ref = collection.getItem(selectedKey)) === null || ref === void 0 ? void 0 : ref.textValue) !== null && ref1 !== void 0 ? ref1 : "";
197
+ var _collection_getItem;
198
+ var _collection_getItem_textValue;
199
+ let itemText = (_collection_getItem_textValue = (_collection_getItem = collection.getItem(selectedKey)) === null || _collection_getItem === void 0 ? void 0 : _collection_getItem.textValue) !== null && _collection_getItem_textValue !== void 0 ? _collection_getItem_textValue : "";
200
200
  if (allowsCustomValue && inputValue !== itemText) commitCustomValue();
201
201
  else commitSelection();
202
202
  }
@@ -1 +1 @@
1
- {"mappings":"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","sources":["packages/@react-stately/combobox/src/index.ts","packages/@react-stately/combobox/src/useComboBoxState.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {useComboBoxState} from './useComboBoxState';\n\nexport type {ComboBoxStateOptions, ComboBoxState} from './useComboBoxState';\n","/*\n * Copyright 2020 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, FocusStrategy, Node} from '@react-types/shared';\nimport {ComboBoxProps, MenuTriggerAction} from '@react-types/combobox';\nimport {ListCollection, useSingleSelectListState} from '@react-stately/list';\nimport {SelectState} from '@react-stately/select';\nimport {useControlledState} from '@react-stately/utils';\nimport {useEffect, useMemo, useRef, useState} from 'react';\nimport {useMenuTriggerState} from '@react-stately/menu';\n\nexport interface ComboBoxState<T> extends SelectState<T> {\n /** The current value of the combo box input. */\n inputValue: string,\n /** Sets the value of the combo box input. */\n setInputValue(value: string): void,\n /** Selects the currently focused item and updates the input value. */\n commit(): void,\n /** Opens the menu. */\n open(focusStrategy?: FocusStrategy | null, trigger?: MenuTriggerAction): void,\n /** Toggles the menu. */\n toggle(focusStrategy?: FocusStrategy | null, trigger?: MenuTriggerAction): void,\n /** Resets the input value to the previously selected item's text if any and closes the menu. */\n revert(): void\n}\n\ntype FilterFn = (textValue: string, inputValue: string) => boolean;\n\nexport interface ComboBoxStateOptions<T> extends ComboBoxProps<T> {\n /** The filter function used to determine if a option should be included in the combo box list. */\n defaultFilter?: FilterFn,\n /** Whether the combo box allows the menu to be open when the collection is empty. */\n allowsEmptyCollection?: boolean,\n /** Whether the combo box menu should close on blur. */\n shouldCloseOnBlur?: boolean\n}\n\n/**\n * Provides state management for a combo box component. Handles building a collection\n * of items from props and manages the option selection state of the combo box. In addition, it tracks the input value,\n * focus state, and other properties of the combo box.\n */\nexport function useComboBoxState<T extends object>(props: ComboBoxStateOptions<T>): ComboBoxState<T> {\n let {\n defaultFilter,\n menuTrigger = 'input',\n allowsEmptyCollection = false,\n allowsCustomValue,\n shouldCloseOnBlur = true\n } = props;\n\n let [showAllItems, setShowAllItems] = useState(false);\n let [isFocused, setFocusedState] = useState(false);\n let [inputValue, setInputValue] = useControlledState(\n props.inputValue,\n props.defaultInputValue ?? '',\n props.onInputChange\n );\n\n let onSelectionChange = (key) => {\n if (props.onSelectionChange) {\n props.onSelectionChange(key);\n }\n\n // If key is the same, reset the inputValue and close the menu\n // (scenario: user clicks on already selected option)\n if (key === selectedKey) {\n resetInputValue();\n triggerState.close();\n }\n };\n\n let {collection, selectionManager, selectedKey, setSelectedKey, selectedItem, disabledKeys} = useSingleSelectListState({\n ...props,\n onSelectionChange,\n items: props.items ?? props.defaultItems\n });\n\n // Preserve original collection so we can show all items on demand\n let originalCollection = collection;\n let filteredCollection = useMemo(() => (\n // No default filter if items are controlled.\n props.items != null || !defaultFilter\n ? collection\n : filterCollection(collection, inputValue, defaultFilter)\n ), [collection, inputValue, defaultFilter, props.items]);\n\n // Track what action is attempting to open the menu\n let menuOpenTrigger = useRef('focus' as MenuTriggerAction);\n let onOpenChange = (open: boolean) => {\n if (props.onOpenChange) {\n props.onOpenChange(open, open ? menuOpenTrigger.current : undefined);\n }\n };\n\n let triggerState = useMenuTriggerState({...props, onOpenChange, isOpen: undefined, defaultOpen: undefined});\n let open = (focusStrategy?: FocusStrategy, trigger?: MenuTriggerAction) => {\n let displayAllItems = (trigger === 'manual' || (trigger === 'focus' && menuTrigger === 'focus'));\n // Prevent open operations from triggering if there is nothing to display\n // Also prevent open operations from triggering if items are uncontrolled but defaultItems is empty, even if displayAllItems is true.\n // This is to prevent comboboxes with empty defaultItems from opening but allow controlled items comboboxes to open even if the inital list is empty (assumption is user will provide swap the empty list with a base list via onOpenChange returning `menuTrigger` manual)\n if (allowsEmptyCollection || filteredCollection.size > 0 || (displayAllItems && originalCollection.size > 0) || props.items) {\n if (displayAllItems && !triggerState.isOpen && props.items === undefined) {\n // Show all items if menu is manually opened. Only care about this if items are undefined\n setShowAllItems(true);\n }\n\n menuOpenTrigger.current = trigger;\n triggerState.open(focusStrategy);\n }\n };\n\n let toggle = (focusStrategy?: FocusStrategy, trigger?: MenuTriggerAction) => {\n let displayAllItems = (trigger === 'manual' || (trigger === 'focus' && menuTrigger === 'focus'));\n // If the menu is closed and there is nothing to display, early return so toggle isn't called to prevent extraneous onOpenChange\n if (!(allowsEmptyCollection || filteredCollection.size > 0 || (displayAllItems && originalCollection.size > 0) || props.items) && !triggerState.isOpen) {\n return;\n }\n\n if (displayAllItems && !triggerState.isOpen && props.items === undefined) {\n // Show all items if menu is toggled open. Only care about this if items are undefined\n setShowAllItems(true);\n }\n\n // Only update the menuOpenTrigger if menu is currently closed\n if (!triggerState.isOpen) {\n menuOpenTrigger.current = trigger;\n }\n\n triggerState.toggle(focusStrategy);\n };\n\n let lastValue = useRef(inputValue);\n let resetInputValue = () => {\n let itemText = collection.getItem(selectedKey)?.textValue ?? '';\n lastValue.current = itemText;\n setInputValue(itemText);\n };\n\n let isInitialRender = useRef(true);\n let lastSelectedKey = useRef(props.selectedKey ?? props.defaultSelectedKey ?? null);\n let lastSelectedKeyText = useRef(collection.getItem(selectedKey)?.textValue ?? '');\n // intentional omit dependency array, want this to happen on every render\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n // Open and close menu automatically when the input value changes if the input is focused,\n // and there are items in the collection or allowEmptyCollection is true.\n if (\n isFocused &&\n (filteredCollection.size > 0 || allowsEmptyCollection) &&\n !triggerState.isOpen &&\n inputValue !== lastValue.current &&\n menuTrigger !== 'manual'\n ) {\n open(null, 'input');\n }\n\n // Close the menu if the collection is empty. Don't close menu if filtered collection size is 0\n // but we are currently showing all items via button press\n if (\n !showAllItems &&\n !allowsEmptyCollection &&\n triggerState.isOpen &&\n filteredCollection.size === 0\n ) {\n triggerState.close();\n }\n\n // Close when an item is selected.\n if (\n selectedKey != null &&\n selectedKey !== lastSelectedKey.current\n ) {\n triggerState.close();\n }\n\n // Clear focused key when input value changes and display filtered collection again.\n if (inputValue !== lastValue.current) {\n selectionManager.setFocusedKey(null);\n setShowAllItems(false);\n\n // Set selectedKey to null when the user clears the input.\n // If controlled, this is the application developer's responsibility.\n if (inputValue === '' && (props.inputValue === undefined || props.selectedKey === undefined)) {\n setSelectedKey(null);\n }\n }\n\n // If it is the intial render and inputValue isn't controlled nor has an intial value, set input to match current selected key if any\n if (isInitialRender.current && (props.inputValue === undefined && props.defaultInputValue === undefined)) {\n resetInputValue();\n }\n\n // If the selectedKey changed, update the input value.\n // Do nothing if both inputValue and selectedKey are controlled.\n // In this case, it's the user's responsibility to update inputValue in onSelectionChange.\n if (\n selectedKey !== lastSelectedKey.current &&\n (props.inputValue === undefined || props.selectedKey === undefined)\n ) {\n resetInputValue();\n } else {\n lastValue.current = inputValue;\n }\n\n // Update the inputValue if the selected item's text changes from its last tracked value.\n // This is to handle cases where a selectedKey is specified but the items aren't available (async loading) or the selected item's text value updates.\n // Only reset if the user isn't currently within the field so we don't erroneously modify user input.\n // If inputValue is controlled, it is the user's responsibility to update the inputValue when items change.\n let selectedItemText = collection.getItem(selectedKey)?.textValue ?? '';\n if (!isFocused && selectedKey != null && props.inputValue === undefined && selectedKey === lastSelectedKey.current) {\n if (lastSelectedKeyText.current !== selectedItemText) {\n lastValue.current = selectedItemText;\n setInputValue(selectedItemText);\n }\n }\n\n isInitialRender.current = false;\n lastSelectedKey.current = selectedKey;\n lastSelectedKeyText.current = selectedItemText;\n });\n\n useEffect(() => {\n // Reset focused key when the menu closes\n if (!triggerState.isOpen) {\n selectionManager.setFocusedKey(null);\n }\n }, [triggerState.isOpen, selectionManager]);\n\n // Revert input value and close menu\n let revert = () => {\n if (allowsCustomValue && selectedKey == null) {\n commitCustomValue();\n } else {\n commitSelection();\n }\n };\n\n let commitCustomValue = () => {\n lastSelectedKey.current = null;\n setSelectedKey(null);\n triggerState.close();\n };\n\n let commitSelection = () => {\n // If multiple things are controlled, call onSelectionChange\n if (props.selectedKey !== undefined && props.inputValue !== undefined) {\n props.onSelectionChange(selectedKey);\n\n // Stop menu from reopening from useEffect\n let itemText = collection.getItem(selectedKey)?.textValue ?? '';\n lastValue.current = itemText;\n triggerState.close();\n } else {\n // If only a single aspect of combobox is controlled, reset input value and close menu for the user\n resetInputValue();\n triggerState.close();\n }\n };\n\n let commit = () => {\n if (triggerState.isOpen && selectionManager.focusedKey != null) {\n // Reset inputValue and close menu here if the selected key is already the focused key. Otherwise\n // fire onSelectionChange to allow the application to control the closing.\n if (selectedKey === selectionManager.focusedKey) {\n commitSelection();\n } else {\n setSelectedKey(selectionManager.focusedKey);\n }\n } else if (allowsCustomValue) {\n commitCustomValue();\n } else {\n // Reset inputValue and close menu if no item is focused but user triggers a commit\n commitSelection();\n }\n };\n\n let setFocused = (isFocused: boolean) => {\n if (isFocused) {\n if (menuTrigger === 'focus') {\n open(null, 'focus');\n }\n } else if (shouldCloseOnBlur) {\n let itemText = collection.getItem(selectedKey)?.textValue ?? '';\n if (allowsCustomValue && inputValue !== itemText) {\n commitCustomValue();\n } else {\n commitSelection();\n }\n }\n\n setFocusedState(isFocused);\n };\n\n return {\n ...triggerState,\n toggle,\n open,\n close: commit,\n selectionManager,\n selectedKey,\n setSelectedKey,\n disabledKeys,\n isFocused,\n setFocused,\n selectedItem,\n collection: showAllItems ? originalCollection : filteredCollection,\n inputValue,\n setInputValue,\n commit,\n revert\n };\n}\n\nfunction filterCollection<T extends object>(collection: Collection<Node<T>>, inputValue: string, filter: FilterFn): Collection<Node<T>> {\n return new ListCollection(filterNodes(collection, inputValue, filter));\n}\n\nfunction filterNodes<T>(nodes: Iterable<Node<T>>, inputValue: string, filter: FilterFn): Iterable<Node<T>> {\n let filteredNode = [];\n for (let node of nodes) {\n if (node.type === 'section' && node.hasChildNodes) {\n let filtered = filterNodes(node.childNodes, inputValue, filter);\n if ([...filtered].length > 0) {\n filteredNode.push({...node, childNodes: filtered});\n }\n } else if (node.type !== 'section' && filter(node.textValue, inputValue)) {\n filteredNode.push({...node});\n }\n }\n return filteredNode;\n}\n"],"names":[],"version":3,"file":"module.js.map"}
1
+ {"mappings":"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","sources":["packages/@react-stately/combobox/src/index.ts","packages/@react-stately/combobox/src/useComboBoxState.ts"],"sourcesContent":["/*\n * Copyright 2020 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 {useComboBoxState} from './useComboBoxState';\n\nexport type {ComboBoxStateOptions, ComboBoxState} from './useComboBoxState';\n","/*\n * Copyright 2020 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, FocusStrategy, Node} from '@react-types/shared';\nimport {ComboBoxProps, MenuTriggerAction} from '@react-types/combobox';\nimport {ListCollection, useSingleSelectListState} from '@react-stately/list';\nimport {SelectState} from '@react-stately/select';\nimport {useControlledState} from '@react-stately/utils';\nimport {useEffect, useMemo, useRef, useState} from 'react';\nimport {useMenuTriggerState} from '@react-stately/menu';\n\nexport interface ComboBoxState<T> extends SelectState<T> {\n /** The current value of the combo box input. */\n inputValue: string,\n /** Sets the value of the combo box input. */\n setInputValue(value: string): void,\n /** Selects the currently focused item and updates the input value. */\n commit(): void,\n /** Opens the menu. */\n open(focusStrategy?: FocusStrategy | null, trigger?: MenuTriggerAction): void,\n /** Toggles the menu. */\n toggle(focusStrategy?: FocusStrategy | null, trigger?: MenuTriggerAction): void,\n /** Resets the input value to the previously selected item's text if any and closes the menu. */\n revert(): void\n}\n\ntype FilterFn = (textValue: string, inputValue: string) => boolean;\n\nexport interface ComboBoxStateOptions<T> extends ComboBoxProps<T> {\n /** The filter function used to determine if a option should be included in the combo box list. */\n defaultFilter?: FilterFn,\n /** Whether the combo box allows the menu to be open when the collection is empty. */\n allowsEmptyCollection?: boolean,\n /** Whether the combo box menu should close on blur. */\n shouldCloseOnBlur?: boolean\n}\n\n/**\n * Provides state management for a combo box component. Handles building a collection\n * of items from props and manages the option selection state of the combo box. In addition, it tracks the input value,\n * focus state, and other properties of the combo box.\n */\nexport function useComboBoxState<T extends object>(props: ComboBoxStateOptions<T>): ComboBoxState<T> {\n let {\n defaultFilter,\n menuTrigger = 'input',\n allowsEmptyCollection = false,\n allowsCustomValue,\n shouldCloseOnBlur = true\n } = props;\n\n let [showAllItems, setShowAllItems] = useState(false);\n let [isFocused, setFocusedState] = useState(false);\n let [inputValue, setInputValue] = useControlledState(\n props.inputValue,\n props.defaultInputValue ?? '',\n props.onInputChange\n );\n\n let onSelectionChange = (key) => {\n if (props.onSelectionChange) {\n props.onSelectionChange(key);\n }\n\n // If key is the same, reset the inputValue and close the menu\n // (scenario: user clicks on already selected option)\n if (key === selectedKey) {\n resetInputValue();\n triggerState.close();\n }\n };\n\n let {collection, selectionManager, selectedKey, setSelectedKey, selectedItem, disabledKeys} = useSingleSelectListState({\n ...props,\n onSelectionChange,\n items: props.items ?? props.defaultItems\n });\n\n // Preserve original collection so we can show all items on demand\n let originalCollection = collection;\n let filteredCollection = useMemo(() => (\n // No default filter if items are controlled.\n props.items != null || !defaultFilter\n ? collection\n : filterCollection(collection, inputValue, defaultFilter)\n ), [collection, inputValue, defaultFilter, props.items]);\n\n // Track what action is attempting to open the menu\n let menuOpenTrigger = useRef('focus' as MenuTriggerAction);\n let onOpenChange = (open: boolean) => {\n if (props.onOpenChange) {\n props.onOpenChange(open, open ? menuOpenTrigger.current : undefined);\n }\n };\n\n let triggerState = useMenuTriggerState({...props, onOpenChange, isOpen: undefined, defaultOpen: undefined});\n let open = (focusStrategy?: FocusStrategy, trigger?: MenuTriggerAction) => {\n let displayAllItems = (trigger === 'manual' || (trigger === 'focus' && menuTrigger === 'focus'));\n // Prevent open operations from triggering if there is nothing to display\n // Also prevent open operations from triggering if items are uncontrolled but defaultItems is empty, even if displayAllItems is true.\n // This is to prevent comboboxes with empty defaultItems from opening but allow controlled items comboboxes to open even if the inital list is empty (assumption is user will provide swap the empty list with a base list via onOpenChange returning `menuTrigger` manual)\n if (allowsEmptyCollection || filteredCollection.size > 0 || (displayAllItems && originalCollection.size > 0) || props.items) {\n if (displayAllItems && !triggerState.isOpen && props.items === undefined) {\n // Show all items if menu is manually opened. Only care about this if items are undefined\n setShowAllItems(true);\n }\n\n menuOpenTrigger.current = trigger;\n triggerState.open(focusStrategy);\n }\n };\n\n let toggle = (focusStrategy?: FocusStrategy, trigger?: MenuTriggerAction) => {\n let displayAllItems = (trigger === 'manual' || (trigger === 'focus' && menuTrigger === 'focus'));\n // If the menu is closed and there is nothing to display, early return so toggle isn't called to prevent extraneous onOpenChange\n if (!(allowsEmptyCollection || filteredCollection.size > 0 || (displayAllItems && originalCollection.size > 0) || props.items) && !triggerState.isOpen) {\n return;\n }\n\n if (displayAllItems && !triggerState.isOpen && props.items === undefined) {\n // Show all items if menu is toggled open. Only care about this if items are undefined\n setShowAllItems(true);\n }\n\n // Only update the menuOpenTrigger if menu is currently closed\n if (!triggerState.isOpen) {\n menuOpenTrigger.current = trigger;\n }\n\n triggerState.toggle(focusStrategy);\n };\n\n let lastValue = useRef(inputValue);\n let resetInputValue = () => {\n let itemText = collection.getItem(selectedKey)?.textValue ?? '';\n lastValue.current = itemText;\n setInputValue(itemText);\n };\n\n let isInitialRender = useRef(true);\n let lastSelectedKey = useRef(props.selectedKey ?? props.defaultSelectedKey ?? null);\n let lastSelectedKeyText = useRef(collection.getItem(selectedKey)?.textValue ?? '');\n // intentional omit dependency array, want this to happen on every render\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n // Open and close menu automatically when the input value changes if the input is focused,\n // and there are items in the collection or allowEmptyCollection is true.\n if (\n isFocused &&\n (filteredCollection.size > 0 || allowsEmptyCollection) &&\n !triggerState.isOpen &&\n inputValue !== lastValue.current &&\n menuTrigger !== 'manual'\n ) {\n open(null, 'input');\n }\n\n // Close the menu if the collection is empty. Don't close menu if filtered collection size is 0\n // but we are currently showing all items via button press\n if (\n !showAllItems &&\n !allowsEmptyCollection &&\n triggerState.isOpen &&\n filteredCollection.size === 0\n ) {\n triggerState.close();\n }\n\n // Close when an item is selected.\n if (\n selectedKey != null &&\n selectedKey !== lastSelectedKey.current\n ) {\n triggerState.close();\n }\n\n // Clear focused key when input value changes and display filtered collection again.\n if (inputValue !== lastValue.current) {\n selectionManager.setFocusedKey(null);\n setShowAllItems(false);\n\n // Set selectedKey to null when the user clears the input.\n // If controlled, this is the application developer's responsibility.\n if (inputValue === '' && (props.inputValue === undefined || props.selectedKey === undefined)) {\n setSelectedKey(null);\n }\n }\n\n // If it is the intial render and inputValue isn't controlled nor has an intial value, set input to match current selected key if any\n if (isInitialRender.current && (props.inputValue === undefined && props.defaultInputValue === undefined)) {\n resetInputValue();\n }\n\n // If the selectedKey changed, update the input value.\n // Do nothing if both inputValue and selectedKey are controlled.\n // In this case, it's the user's responsibility to update inputValue in onSelectionChange.\n if (\n selectedKey !== lastSelectedKey.current &&\n (props.inputValue === undefined || props.selectedKey === undefined)\n ) {\n resetInputValue();\n } else {\n lastValue.current = inputValue;\n }\n\n // Update the inputValue if the selected item's text changes from its last tracked value.\n // This is to handle cases where a selectedKey is specified but the items aren't available (async loading) or the selected item's text value updates.\n // Only reset if the user isn't currently within the field so we don't erroneously modify user input.\n // If inputValue is controlled, it is the user's responsibility to update the inputValue when items change.\n let selectedItemText = collection.getItem(selectedKey)?.textValue ?? '';\n if (!isFocused && selectedKey != null && props.inputValue === undefined && selectedKey === lastSelectedKey.current) {\n if (lastSelectedKeyText.current !== selectedItemText) {\n lastValue.current = selectedItemText;\n setInputValue(selectedItemText);\n }\n }\n\n isInitialRender.current = false;\n lastSelectedKey.current = selectedKey;\n lastSelectedKeyText.current = selectedItemText;\n });\n\n useEffect(() => {\n // Reset focused key when the menu closes\n if (!triggerState.isOpen) {\n selectionManager.setFocusedKey(null);\n }\n }, [triggerState.isOpen, selectionManager]);\n\n // Revert input value and close menu\n let revert = () => {\n if (allowsCustomValue && selectedKey == null) {\n commitCustomValue();\n } else {\n commitSelection();\n }\n };\n\n let commitCustomValue = () => {\n lastSelectedKey.current = null;\n setSelectedKey(null);\n triggerState.close();\n };\n\n let commitSelection = () => {\n // If multiple things are controlled, call onSelectionChange\n if (props.selectedKey !== undefined && props.inputValue !== undefined) {\n props.onSelectionChange(selectedKey);\n\n // Stop menu from reopening from useEffect\n let itemText = collection.getItem(selectedKey)?.textValue ?? '';\n lastValue.current = itemText;\n triggerState.close();\n } else {\n // If only a single aspect of combobox is controlled, reset input value and close menu for the user\n resetInputValue();\n triggerState.close();\n }\n };\n\n let commit = () => {\n if (triggerState.isOpen && selectionManager.focusedKey != null) {\n // Reset inputValue and close menu here if the selected key is already the focused key. Otherwise\n // fire onSelectionChange to allow the application to control the closing.\n if (selectedKey === selectionManager.focusedKey) {\n commitSelection();\n } else {\n setSelectedKey(selectionManager.focusedKey);\n }\n } else if (allowsCustomValue) {\n commitCustomValue();\n } else {\n // Reset inputValue and close menu if no item is focused but user triggers a commit\n commitSelection();\n }\n };\n\n let setFocused = (isFocused: boolean) => {\n if (isFocused) {\n if (menuTrigger === 'focus') {\n open(null, 'focus');\n }\n } else if (shouldCloseOnBlur) {\n let itemText = collection.getItem(selectedKey)?.textValue ?? '';\n if (allowsCustomValue && inputValue !== itemText) {\n commitCustomValue();\n } else {\n commitSelection();\n }\n }\n\n setFocusedState(isFocused);\n };\n\n return {\n ...triggerState,\n toggle,\n open,\n close: commit,\n selectionManager,\n selectedKey,\n setSelectedKey,\n disabledKeys,\n isFocused,\n setFocused,\n selectedItem,\n collection: showAllItems ? originalCollection : filteredCollection,\n inputValue,\n setInputValue,\n commit,\n revert\n };\n}\n\nfunction filterCollection<T extends object>(collection: Collection<Node<T>>, inputValue: string, filter: FilterFn): Collection<Node<T>> {\n return new ListCollection(filterNodes(collection, inputValue, filter));\n}\n\nfunction filterNodes<T>(nodes: Iterable<Node<T>>, inputValue: string, filter: FilterFn): Iterable<Node<T>> {\n let filteredNode = [];\n for (let node of nodes) {\n if (node.type === 'section' && node.hasChildNodes) {\n let filtered = filterNodes(node.childNodes, inputValue, filter);\n if ([...filtered].length > 0) {\n filteredNode.push({...node, childNodes: filtered});\n }\n } else if (node.type !== 'section' && filter(node.textValue, inputValue)) {\n filteredNode.push({...node});\n }\n }\n return filteredNode;\n}\n"],"names":[],"version":3,"file":"module.js.map"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-stately/combobox",
3
- "version": "3.3.1-nightly.3611+e6808d1b5",
3
+ "version": "3.3.1-nightly.3617+6b51339cc",
4
4
  "description": "Spectrum UI components in React",
5
5
  "license": "Apache-2.0",
6
6
  "main": "dist/main.js",
@@ -17,12 +17,12 @@
17
17
  "url": "https://github.com/adobe/react-spectrum"
18
18
  },
19
19
  "dependencies": {
20
- "@react-stately/list": "3.6.1-nightly.3611+e6808d1b5",
21
- "@react-stately/menu": "3.4.4-nightly.3611+e6808d1b5",
22
- "@react-stately/select": "3.3.4-nightly.3611+e6808d1b5",
23
- "@react-stately/utils": "3.0.0-nightly.1911+e6808d1b5",
24
- "@react-types/combobox": "3.5.6-nightly.3611+e6808d1b5",
25
- "@react-types/shared": "3.0.0-nightly.1911+e6808d1b5",
20
+ "@react-stately/list": "3.6.1-nightly.3617+6b51339cc",
21
+ "@react-stately/menu": "3.4.4-nightly.3617+6b51339cc",
22
+ "@react-stately/select": "3.3.4-nightly.3617+6b51339cc",
23
+ "@react-stately/utils": "3.0.0-nightly.1917+6b51339cc",
24
+ "@react-types/combobox": "3.5.6-nightly.3617+6b51339cc",
25
+ "@react-types/shared": "3.0.0-nightly.1917+6b51339cc",
26
26
  "@swc/helpers": "^0.4.14"
27
27
  },
28
28
  "peerDependencies": {
@@ -31,5 +31,5 @@
31
31
  "publishConfig": {
32
32
  "access": "public"
33
33
  },
34
- "gitHead": "e6808d1b5e80cef7af7e63974f658043593b2e1e"
34
+ "gitHead": "6b51339cca0b8344507d3c8e81e7ad05d6e75f9b"
35
35
  }