misc zone search fixes & improvements
This commit is contained in:
parent
0088c3f193
commit
10563629ef
2 changed files with 29 additions and 11 deletions
|
@ -4,6 +4,9 @@ import { Box, Flex } from "@chakra-ui/core";
|
||||||
import ItemsPanel from "./ItemsPanel";
|
import ItemsPanel from "./ItemsPanel";
|
||||||
import SearchToolbar from "./SearchToolbar";
|
import SearchToolbar from "./SearchToolbar";
|
||||||
import SearchPanel from "./SearchPanel";
|
import SearchPanel from "./SearchPanel";
|
||||||
|
import { isNullableType } from "graphql";
|
||||||
|
|
||||||
|
const emptyQuery = { value: "", filterToZoneLabel: null };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ItemsAndSearchPanels manages the shared layout and state for:
|
* ItemsAndSearchPanels manages the shared layout and state for:
|
||||||
|
@ -19,11 +22,16 @@ import SearchPanel from "./SearchPanel";
|
||||||
* state and refs.
|
* state and refs.
|
||||||
*/
|
*/
|
||||||
function ItemsAndSearchPanels({ loading, outfitState, dispatchToOutfit }) {
|
function ItemsAndSearchPanels({ loading, outfitState, dispatchToOutfit }) {
|
||||||
const [searchQuery, setSearchQuery] = React.useState(null);
|
const [searchQuery, setSearchQuery] = React.useState(emptyQuery);
|
||||||
const scrollContainerRef = React.useRef();
|
const scrollContainerRef = React.useRef();
|
||||||
const searchQueryRef = React.useRef();
|
const searchQueryRef = React.useRef();
|
||||||
const firstSearchResultRef = React.useRef();
|
const firstSearchResultRef = React.useRef();
|
||||||
|
|
||||||
|
const onChange = React.useCallback(
|
||||||
|
(newQuery) => setSearchQuery(newQuery || emptyQuery),
|
||||||
|
[setSearchQuery]
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Flex direction="column" height="100%">
|
<Flex direction="column" height="100%">
|
||||||
<Box px="5" py="3" boxShadow="sm">
|
<Box px="5" py="3" boxShadow="sm">
|
||||||
|
@ -34,7 +42,7 @@ function ItemsAndSearchPanels({ loading, outfitState, dispatchToOutfit }) {
|
||||||
onChange={setSearchQuery}
|
onChange={setSearchQuery}
|
||||||
/>
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
{searchQuery ? (
|
{searchQuery.value || searchQuery.filterToZoneLabel ? (
|
||||||
<Box
|
<Box
|
||||||
key="search-panel"
|
key="search-panel"
|
||||||
gridArea="items"
|
gridArea="items"
|
||||||
|
|
|
@ -12,6 +12,7 @@ import {
|
||||||
useColorModeValue,
|
useColorModeValue,
|
||||||
} from "@chakra-ui/core";
|
} from "@chakra-ui/core";
|
||||||
import { CloseIcon, SearchIcon } from "@chakra-ui/icons";
|
import { CloseIcon, SearchIcon } from "@chakra-ui/icons";
|
||||||
|
import { css } from "emotion";
|
||||||
import Autosuggest from "react-autosuggest";
|
import Autosuggest from "react-autosuggest";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -81,11 +82,11 @@ function SearchToolbar({
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
getSuggestionValue={(zl) => zl}
|
getSuggestionValue={(zl) => zl}
|
||||||
shouldRenderSuggestions={() => query?.filterToZoneLabel == null}
|
shouldRenderSuggestions={() => query.filterToZoneLabel == null}
|
||||||
renderSuggestion={renderSuggestion}
|
renderSuggestion={renderSuggestion}
|
||||||
renderInputComponent={(props) => (
|
renderInputComponent={(props) => (
|
||||||
<InputGroup>
|
<InputGroup>
|
||||||
{query?.filterToZoneLabel ? (
|
{query.filterToZoneLabel ? (
|
||||||
<InputLeftAddon>
|
<InputLeftAddon>
|
||||||
<SearchIcon color="gray.400" marginRight="3" />
|
<SearchIcon color="gray.400" marginRight="3" />
|
||||||
<Box fontSize="sm">{query.filterToZoneLabel}</Box>
|
<Box fontSize="sm">{query.filterToZoneLabel}</Box>
|
||||||
|
@ -119,12 +120,23 @@ function SearchToolbar({
|
||||||
// placeholder: "Search for items to add…",
|
// placeholder: "Search for items to add…",
|
||||||
"aria-label": "Search for items to add…",
|
"aria-label": "Search for items to add…",
|
||||||
focusBorderColor: focusBorderColor,
|
focusBorderColor: focusBorderColor,
|
||||||
value: query?.value || "",
|
value: query.value || "",
|
||||||
ref: searchQueryRef,
|
ref: searchQueryRef,
|
||||||
minWidth: 0,
|
minWidth: 0,
|
||||||
// HACK: Chakra isn't noticing the InputLeftElement swapping out
|
// HACK: Chakra isn't noticing the InputLeftElement swapping out
|
||||||
// for the InputLeftAddon, so the padding isn't updating.
|
// for the InputLeftAddon, so the styles aren't updating...
|
||||||
paddingLeft: query?.filterToZoneLabel ? "1rem" : "2.5rem",
|
// Hard override!
|
||||||
|
className: css`
|
||||||
|
padding-left: ${query.filterToZoneLabel
|
||||||
|
? "1rem"
|
||||||
|
: "2.5rem"} !important;
|
||||||
|
border-bottom-left-radius: ${query.filterToZoneLabel
|
||||||
|
? "0"
|
||||||
|
: "0.25rem"} !important;
|
||||||
|
border-top-left-radius: ${query.filterToZoneLabel
|
||||||
|
? "0"
|
||||||
|
: "0.25rem"} !important;
|
||||||
|
`,
|
||||||
onChange: (e, { newValue, method }) => {
|
onChange: (e, { newValue, method }) => {
|
||||||
// The Autosuggest tries to change the _entire_ value of the element
|
// The Autosuggest tries to change the _entire_ value of the element
|
||||||
// when navigating suggestions, which isn't actually what we want.
|
// when navigating suggestions, which isn't actually what we want.
|
||||||
|
@ -146,11 +158,9 @@ function SearchToolbar({
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
onMoveFocusDownToResults(e);
|
onMoveFocusDownToResults(e);
|
||||||
} else if (e.key === "Backspace") {
|
} else if (e.key === "Backspace" && e.target.selectionStart === 0) {
|
||||||
if (query.value === "") {
|
|
||||||
onChange({ ...query, filterToZoneLabel: null });
|
onChange({ ...query, filterToZoneLabel: null });
|
||||||
}
|
}
|
||||||
}
|
|
||||||
},
|
},
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
Loading…
Reference in a new issue