@artsy/palette 18.12.0 → 18.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +61 -0
- package/dist/elements/AutocompleteInput/AutocompleteInput.d.ts +2 -1
- package/dist/elements/AutocompleteInput/AutocompleteInput.js +13 -5
- package/dist/elements/AutocompleteInput/AutocompleteInput.js.map +1 -1
- package/dist/elements/AutocompleteInput/AutocompleteInput.story.js +23 -0
- package/dist/elements/AutocompleteInput/AutocompleteInput.story.js.map +1 -1
- package/dist/elements/FilterSelect/Components/FilterInput.d.ts +4 -0
- package/dist/elements/FilterSelect/Components/FilterInput.js +73 -0
- package/dist/elements/FilterSelect/Components/FilterInput.js.map +1 -0
- package/dist/elements/FilterSelect/Components/FilterSelectContext.d.ts +29 -0
- package/dist/elements/FilterSelect/Components/FilterSelectContext.js +157 -0
- package/dist/elements/FilterSelect/Components/FilterSelectContext.js.map +1 -0
- package/dist/elements/FilterSelect/Components/FilterSelectResultItem.d.ts +3 -0
- package/dist/elements/FilterSelect/Components/FilterSelectResultItem.js +38 -0
- package/dist/elements/FilterSelect/Components/FilterSelectResultItem.js.map +1 -0
- package/dist/elements/FilterSelect/FilterSelect.d.ts +5 -0
- package/dist/elements/FilterSelect/FilterSelect.js +123 -0
- package/dist/elements/FilterSelect/FilterSelect.js.map +1 -0
- package/dist/elements/FilterSelect/FilterSelect.story.d.ts +6 -0
- package/dist/elements/FilterSelect/FilterSelect.story.js +70 -0
- package/dist/elements/FilterSelect/FilterSelect.story.js.map +1 -0
- package/dist/elements/FilterSelect/index.d.ts +1 -0
- package/dist/elements/FilterSelect/index.js +19 -0
- package/dist/elements/FilterSelect/index.js.map +1 -0
- package/dist/elements/ShowMore/ShowMore.d.ts +8 -0
- package/dist/elements/ShowMore/ShowMore.js +65 -0
- package/dist/elements/ShowMore/ShowMore.js.map +1 -0
- package/dist/elements/ShowMore/ShowMore.story.d.ts +6 -0
- package/dist/elements/ShowMore/ShowMore.story.js +45 -0
- package/dist/elements/ShowMore/ShowMore.story.js.map +1 -0
- package/dist/elements/ShowMore/index.d.ts +1 -0
- package/dist/elements/ShowMore/index.js +19 -0
- package/dist/elements/ShowMore/index.js.map +1 -0
- package/dist/elements/index.d.ts +1 -0
- package/dist/elements/index.js +13 -0
- package/dist/elements/index.js.map +1 -1
- package/dist/utils/useFocusLock.js +3 -2
- package/dist/utils/useFocusLock.js.map +1 -1
- package/package.json +6 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,64 @@
|
|
|
1
|
+
# v18.14.0 (Tue Jan 18 2022)
|
|
2
|
+
|
|
3
|
+
#### 🚀 Enhancement
|
|
4
|
+
|
|
5
|
+
- chore(component): export filterselect [#1103](https://github.com/artsy/palette/pull/1103) ([@damassi](https://github.com/damassi))
|
|
6
|
+
|
|
7
|
+
#### 🐛 Bug Fix
|
|
8
|
+
|
|
9
|
+
- chore(component): export filterselect ([@damassi](https://github.com/damassi))
|
|
10
|
+
|
|
11
|
+
#### Authors: 1
|
|
12
|
+
|
|
13
|
+
- Christopher Pappas ([@damassi](https://github.com/damassi))
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# v18.13.0 (Tue Jan 18 2022)
|
|
18
|
+
|
|
19
|
+
#### 🚀 Enhancement
|
|
20
|
+
|
|
21
|
+
- feat(FilterSelect): Adds new <FilterSelect> component [#1099](https://github.com/artsy/palette/pull/1099) ([@damassi](https://github.com/damassi))
|
|
22
|
+
- toolchain(linting): Add rule-of-hooks [#1093](https://github.com/artsy/palette/pull/1093) ([@damassi](https://github.com/damassi))
|
|
23
|
+
|
|
24
|
+
#### 🐛 Bug Fix
|
|
25
|
+
|
|
26
|
+
- feat(FilterSelect): add new component ([@damassi](https://github.com/damassi))
|
|
27
|
+
- toolchain(linting): Add rule-of-hooks ([@damassi](https://github.com/damassi))
|
|
28
|
+
|
|
29
|
+
#### Authors: 1
|
|
30
|
+
|
|
31
|
+
- Christopher Pappas ([@damassi](https://github.com/damassi))
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
# v18.12.2 (Thu Jan 06 2022)
|
|
36
|
+
|
|
37
|
+
#### 🐛 Bug Fix
|
|
38
|
+
|
|
39
|
+
- feat(autocomplete): supports footer [#1087](https://github.com/artsy/palette/pull/1087) ([@dzucconi](https://github.com/dzucconi))
|
|
40
|
+
- feat(autocomplete): adds footer ([@dzucconi](https://github.com/dzucconi))
|
|
41
|
+
- fix(usefocuslock): guards in the event here are no focusable nodes ([@dzucconi](https://github.com/dzucconi))
|
|
42
|
+
|
|
43
|
+
#### Authors: 1
|
|
44
|
+
|
|
45
|
+
- Damon ([@dzucconi](https://github.com/dzucconi))
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
# v18.12.1 (Wed Dec 29 2021)
|
|
50
|
+
|
|
51
|
+
#### 🐛 Bug Fix
|
|
52
|
+
|
|
53
|
+
- fix(SWA): Fix onEnter in AutocompleteInput [#1092](https://github.com/artsy/palette/pull/1092) ([@Serge0n](https://github.com/Serge0n))
|
|
54
|
+
- onEnter fix ([@Serge0n](https://github.com/Serge0n))
|
|
55
|
+
|
|
56
|
+
#### Authors: 1
|
|
57
|
+
|
|
58
|
+
- Sergey Kravchyonok ([@Serge0n](https://github.com/Serge0n))
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
1
62
|
# v18.12.0 (Tue Dec 14 2021)
|
|
2
63
|
|
|
3
64
|
#### 🚀 Enhancement
|
|
@@ -8,6 +8,7 @@ export interface AutocompleteInputOptionType {
|
|
|
8
8
|
export interface AutocompleteInputProps<T extends AutocompleteInputOptionType> extends Omit<InputProps, "onSelect" | "onSubmit"> {
|
|
9
9
|
defaultValue?: string;
|
|
10
10
|
loading?: boolean;
|
|
11
|
+
footer?: React.ReactNode;
|
|
11
12
|
/** on <enter> when no option is selected */
|
|
12
13
|
onSubmit?(query: string): void;
|
|
13
14
|
/** on <click> or <enter> when an option is selected */
|
|
@@ -20,4 +21,4 @@ export interface AutocompleteInputProps<T extends AutocompleteInputOptionType> e
|
|
|
20
21
|
options: T[];
|
|
21
22
|
}
|
|
22
23
|
/** AutocompleteInput */
|
|
23
|
-
export declare const AutocompleteInput: <T extends AutocompleteInputOptionType>({ defaultValue, id, loading, onSubmit, onSelect, onChange, onClear, onClose, onKeyDown, height, renderOption, options, ...rest }: AutocompleteInputProps<T>) => JSX.Element;
|
|
24
|
+
export declare const AutocompleteInput: <T extends AutocompleteInputOptionType>({ defaultValue, id, loading, footer, onSubmit, onSelect, onChange, onClear, onClose, onKeyDown, height, renderOption, options, ...rest }: AutocompleteInputProps<T>) => JSX.Element;
|
|
@@ -106,6 +106,7 @@ var AutocompleteInput = function AutocompleteInput(_ref) {
|
|
|
106
106
|
defaultValue = _ref$defaultValue === void 0 ? "" : _ref$defaultValue,
|
|
107
107
|
id = _ref.id,
|
|
108
108
|
loading = _ref.loading,
|
|
109
|
+
footer = _ref.footer,
|
|
109
110
|
onSubmit = _ref.onSubmit,
|
|
110
111
|
onSelect = _ref.onSelect,
|
|
111
112
|
onChange = _ref.onChange,
|
|
@@ -118,7 +119,7 @@ var AutocompleteInput = function AutocompleteInput(_ref) {
|
|
|
118
119
|
return /*#__PURE__*/_react.default.createElement(_AutocompleteInputOptionLabel.AutocompleteInputOptionLabel, option);
|
|
119
120
|
} : _ref$renderOption,
|
|
120
121
|
options = _ref.options,
|
|
121
|
-
rest = _objectWithoutProperties(_ref, ["defaultValue", "id", "loading", "onSubmit", "onSelect", "onChange", "onClear", "onClose", "onKeyDown", "height", "renderOption", "options"]);
|
|
122
|
+
rest = _objectWithoutProperties(_ref, ["defaultValue", "id", "loading", "footer", "onSubmit", "onSelect", "onChange", "onClear", "onClose", "onKeyDown", "height", "renderOption", "options"]);
|
|
122
123
|
|
|
123
124
|
var inputRef = (0, _react.useRef)(null);
|
|
124
125
|
var containerRef = (0, _react.useRef)(null);
|
|
@@ -176,7 +177,10 @@ var AutocompleteInput = function AutocompleteInput(_ref) {
|
|
|
176
177
|
waitForInteractive: true,
|
|
177
178
|
onEnter: function onEnter(_ref2) {
|
|
178
179
|
var option = _ref2.element,
|
|
179
|
-
i = _ref2.index
|
|
180
|
+
i = _ref2.index,
|
|
181
|
+
event = _ref2.event;
|
|
182
|
+
event.preventDefault();
|
|
183
|
+
event.stopPropagation();
|
|
180
184
|
handleSelect(option, i);
|
|
181
185
|
resetUI();
|
|
182
186
|
}
|
|
@@ -381,7 +385,7 @@ var AutocompleteInput = function AutocompleteInput(_ref) {
|
|
|
381
385
|
ref: tooltipRef,
|
|
382
386
|
role: "listbox",
|
|
383
387
|
width: width
|
|
384
|
-
}, optionsWithRefs.map(function (_ref3, i) {
|
|
388
|
+
}, /*#__PURE__*/_react.default.createElement(AutocompleteInputOptions, null, optionsWithRefs.map(function (_ref3, i) {
|
|
385
389
|
var option = _ref3.option,
|
|
386
390
|
ref = _ref3.ref;
|
|
387
391
|
return /*#__PURE__*/_react.default.createElement(_AutocompleteInputOption.AutocompleteInputOption, {
|
|
@@ -396,7 +400,7 @@ var AutocompleteInput = function AutocompleteInput(_ref) {
|
|
|
396
400
|
selected: i === index,
|
|
397
401
|
tabIndex: -1
|
|
398
402
|
}, renderOption(option, i));
|
|
399
|
-
})), /*#__PURE__*/_react.default.createElement(_VisuallyHidden.VisuallyHidden, id ? {
|
|
403
|
+
})), footer), /*#__PURE__*/_react.default.createElement(_VisuallyHidden.VisuallyHidden, id ? {
|
|
400
404
|
id: "".concat(id, "__assistiveHint")
|
|
401
405
|
} : {}, "When autocomplete results are available use up and down arrows to review and enter to select. Touch device users, explore by touch or with swipe gestures."), isDropdownVisible && /*#__PURE__*/_react.default.createElement(_VisuallyHidden.VisuallyHidden, {
|
|
402
406
|
role: "status",
|
|
@@ -410,5 +414,9 @@ AutocompleteInput.displayName = "AutocompleteInput";
|
|
|
410
414
|
var AutocompleteInputDropdown = (0, _styledComponents.default)(_Box.Box).withConfig({
|
|
411
415
|
displayName: "AutocompleteInput__AutocompleteInputDropdown",
|
|
412
416
|
componentId: "sc-89lyrd-0"
|
|
413
|
-
})(["box-shadow:", ";
|
|
417
|
+
})(["box-shadow:", ";z-index:1;"], _helpers.DROP_SHADOW);
|
|
418
|
+
var AutocompleteInputOptions = (0, _styledComponents.default)(_Box.Box).withConfig({
|
|
419
|
+
displayName: "AutocompleteInput__AutocompleteInputOptions",
|
|
420
|
+
componentId: "sc-89lyrd-1"
|
|
421
|
+
})(["max-height:308px;overflow-y:auto;-webkit-overflow-scrolling:touch;"]);
|
|
414
422
|
//# sourceMappingURL=AutocompleteInput.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/AutocompleteInput/AutocompleteInput.tsx"],"names":["reducer","state","action","type","open","query","payload","AutocompleteInput","defaultValue","id","loading","onSubmit","onSelect","onChange","onClear","onClose","onKeyDown","height","renderOption","option","options","rest","inputRef","containerRef","boxProps","inputProps","dispatch","optionsWithRefs","map","ref","resetUI","setTimeout","current","focus","reset","handleSelect","index","text","list","waitForInteractive","onEnter","element","i","set","isDropdownVisible","length","position","offset","active","anchorRef","tooltipRef","width","handleFocus","handleMouseDown","handleMouseEnter","cursor","interactive","handleChange","event","value","currentTarget","handleClearOrSubmit","handleFocusChange","focused","containsFocusRef","handleInputKeydown","key","preventDefault","stopPropagation","blur","handleContainerKeydown","staged","AutocompleteInputDropdown","Box","DROP_SHADOW"],"mappings":"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","sourcesContent":["import composeRefs from \"@seznam/compose-react-refs\"\nimport React, {\n createRef,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from \"react\"\nimport styled from \"styled-components\"\nimport { useKeyboardListNavigation } from \"use-keyboard-list-navigation\"\nimport { Spinner } from \"..\"\nimport { DROP_SHADOW } from \"../../helpers\"\nimport { CloseIcon, MagnifyingGlassIcon } from \"../../svgs\"\nimport { usePosition, useContainsFocus } from \"../../utils\"\nimport { useWidthOf } from \"../../utils/useWidthOf\"\nimport { Box, splitBoxProps } from \"../Box\"\nimport { Clickable } from \"../Clickable\"\nimport { InputProps } from \"../Input\"\nimport { LabeledInput } from \"../LabeledInput\"\nimport { VisuallyHidden } from \"../VisuallyHidden\"\nimport { AutocompleteInputOption } from \"./AutocompleteInputOption\"\nimport { AutocompleteInputOptionLabel } from \"./AutocompleteInputOptionLabel\"\n\n/** Base option type — can be expanded */\nexport interface AutocompleteInputOptionType {\n text: string\n value: string\n}\n\ninterface State {\n open: boolean\n query: string\n}\n\ntype Action =\n | { type: \"OPEN\" }\n | { type: \"CLOSE\" }\n | { type: \"CLEAR\" }\n | { type: \"CHANGE\"; payload: { query: string } }\n | { type: \"SELECT\"; payload: { query: string } }\n\nconst reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case \"OPEN\":\n return { ...state, open: true }\n case \"CLOSE\":\n return { ...state, open: false }\n case \"CLEAR\":\n return { ...state, query: \"\" }\n case \"CHANGE\":\n return { ...state, query: action.payload.query, open: true }\n case \"SELECT\":\n return { ...state, query: action.payload.query, open: false }\n }\n}\n\nexport interface AutocompleteInputProps<T extends AutocompleteInputOptionType>\n extends Omit<InputProps, \"onSelect\" | \"onSubmit\"> {\n defaultValue?: string\n loading?: boolean\n /** on <enter> when no option is selected */\n onSubmit?(query: string): void\n /** on <click> or <enter> when an option is selected */\n onSelect?(option: T, index: number): void\n /** on <click> of the 'x' (clear) button */\n onClear?(): void\n /** Callback that runs when options are hidden */\n onClose?(): void\n renderOption?(\n option: T,\n i: number\n ): React.ReactElement<any, string | React.JSXElementConstructor<any>>\n options: T[]\n}\n\n/** AutocompleteInput */\nexport const AutocompleteInput = <T extends AutocompleteInputOptionType>({\n defaultValue = \"\",\n id,\n loading,\n onSubmit,\n onSelect,\n onChange,\n onClear,\n onClose,\n onKeyDown,\n height,\n renderOption = (option) => <AutocompleteInputOptionLabel {...option} />,\n options,\n ...rest\n}: AutocompleteInputProps<T>) => {\n const inputRef = useRef<HTMLInputElement | null>(null)\n const containerRef = useRef<HTMLDivElement | null>(null)\n\n const [boxProps, inputProps] = splitBoxProps(rest)\n\n const [state, dispatch] = useReducer(reducer, {\n open: false,\n query: defaultValue,\n })\n\n const optionsWithRefs = useMemo(() => {\n return options.map((option) => ({\n option,\n ref: createRef<HTMLButtonElement>(),\n }))\n }, [options])\n\n const resetUI = () => {\n setTimeout(() => {\n inputRef.current?.focus()\n reset()\n dispatch({ type: \"CLOSE\" })\n }, 100)\n }\n\n const handleSelect = (option: T, index: number) => {\n dispatch({ type: \"SELECT\", payload: { query: option.text } })\n inputRef.current?.focus()\n onSelect?.(option, index)\n }\n\n const { index, reset, set } = useKeyboardListNavigation({\n ref: containerRef,\n list: options,\n waitForInteractive: true,\n onEnter: ({ element: option, index: i }) => {\n handleSelect(option, i)\n resetUI()\n },\n })\n\n const isDropdownVisible = state.open && options.length > 0\n\n // Reset keyboard navigation when options change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(reset, [options])\n\n // Reset keyboard navigation when query is empty\n useEffect(() => {\n if (state.query === \"\") reset()\n }, [reset, state.query])\n\n const { anchorRef, tooltipRef } = usePosition({\n position: \"bottom\",\n offset: 10,\n active: isDropdownVisible,\n })\n\n const { width } = useWidthOf({ ref: anchorRef })\n\n const handleFocus = () => {\n reset()\n dispatch({ type: \"OPEN\" })\n }\n\n const handleMouseDown = (option: T, i: number) => () => {\n handleSelect(option, i)\n resetUI()\n }\n\n const handleMouseEnter = (i: number) => () => {\n set({ cursor: i, interactive: true })\n }\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const {\n currentTarget: { value },\n } = event\n\n dispatch({ type: \"CHANGE\", payload: { query: value } })\n onChange?.(event)\n }\n\n const handleClearOrSubmit = () => {\n if (state.query === \"\") {\n onSubmit?.(state.query)\n return\n }\n\n dispatch({ type: \"CLEAR\" })\n inputRef.current?.focus()\n onClear?.()\n }\n\n // Moves focus to different options when keyboard navigating using up/down\n useEffect(() => {\n const option = optionsWithRefs[index]\n option?.ref?.current?.focus()\n }, [index, optionsWithRefs])\n\n const handleFocusChange = useCallback(\n (focused: boolean) => {\n if (focused || !isDropdownVisible) return\n\n dispatch({ type: \"CLOSE\" })\n reset()\n onClose?.()\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onClose, isDropdownVisible]\n )\n\n // Handle closing the dropdown when clicking outside of the input\n // or when focus leaves the input completely\n const { ref: containsFocusRef } = useContainsFocus({\n onChange: handleFocusChange,\n })\n\n const handleInputKeydown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n switch (event.key) {\n // Handle <Enter> when nothing is selected\n case \"Enter\":\n if (state.query !== \"\" && index === -1) {\n onSubmit?.(state.query)\n resetUI()\n }\n return\n\n // <Esc> to close dropdown\n case \"Escape\":\n event.preventDefault()\n event.stopPropagation()\n\n dispatch({ type: \"CLOSE\" })\n inputRef.current?.blur()\n\n return\n\n default:\n break\n }\n\n onKeyDown?.(event)\n }\n\n // Moves focus back to input when typing\n const handleContainerKeydown = (\n event: React.KeyboardEvent<HTMLDivElement>\n ) => {\n switch (event.key) {\n case \"Alt\":\n case \"ArrowDown\":\n case \"ArrowUp\":\n case \"Control\":\n case \"Enter\":\n case \"Meta\":\n case \"Shift\":\n case \"Tab\":\n // Ignore\n return\n\n case \"Escape\":\n event.preventDefault()\n event.stopPropagation()\n\n dispatch({ type: \"CLOSE\" })\n inputRef.current?.blur()\n reset()\n\n return\n\n default:\n inputRef.current?.focus()\n }\n }\n\n // Option that is being hovered or keyed into\n const staged = options[index]\n\n return (\n <Box\n ref={composeRefs(containerRef, containsFocusRef) as any}\n onKeyDown={handleContainerKeydown}\n {...boxProps}\n >\n <LabeledInput\n ref={composeRefs(inputRef, anchorRef) as any}\n role=\"combobox\"\n aria-expanded={isDropdownVisible}\n aria-autocomplete=\"list\"\n {...(id ? { id, \"aria-describedby\": `${id}__assistiveHint` } : {})}\n label={\n loading ? (\n <Box width={18}>\n <Spinner size=\"small\" />\n </Box>\n ) : state.query ? (\n <Clickable\n onClick={handleClearOrSubmit}\n height=\"100%\"\n display=\"flex\"\n alignItems=\"center\"\n aria-label=\"Clear input\"\n >\n <CloseIcon fill=\"black60\" aria-hidden />\n </Clickable>\n ) : (\n <MagnifyingGlassIcon fill=\"black60\" aria-hidden />\n )\n }\n value={staged?.text ?? state.query}\n onChange={handleChange}\n onFocus={handleFocus}\n onKeyDown={handleInputKeydown}\n autoComplete=\"off\"\n height={height}\n {...inputProps}\n />\n\n {isDropdownVisible && (\n <AutocompleteInputDropdown\n ref={tooltipRef as any}\n role=\"listbox\"\n width={width}\n >\n {optionsWithRefs.map(({ option, ref }, i) => {\n return (\n <AutocompleteInputOption\n key={i}\n ref={ref}\n role=\"option\"\n aria-selected={i === index}\n aria-posinset={i + 1}\n aria-setsize={options.length}\n onMouseDown={handleMouseDown(option, i)}\n onMouseEnter={handleMouseEnter(i)}\n selected={i === index}\n tabIndex={-1}\n >\n {renderOption(option, i)}\n </AutocompleteInputOption>\n )\n })}\n </AutocompleteInputDropdown>\n )}\n\n <VisuallyHidden {...(id ? { id: `${id}__assistiveHint` } : {})}>\n When autocomplete results are available use up and down arrows to review\n and enter to select. Touch device users, explore by touch or with swipe\n gestures.\n </VisuallyHidden>\n\n {isDropdownVisible && (\n <VisuallyHidden role=\"status\" aria-atomic=\"true\" aria-live=\"polite\">\n {options.length === 1\n ? `1 result is available`\n : `${options.length} results are available`}\n </VisuallyHidden>\n )}\n </Box>\n )\n}\n\nconst AutocompleteInputDropdown = styled(Box)`\n box-shadow: ${DROP_SHADOW};\n max-height: 300px;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n z-index: 1;\n`\n"],"file":"AutocompleteInput.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/AutocompleteInput/AutocompleteInput.tsx"],"names":["reducer","state","action","type","open","query","payload","AutocompleteInput","defaultValue","id","loading","footer","onSubmit","onSelect","onChange","onClear","onClose","onKeyDown","height","renderOption","option","options","rest","inputRef","containerRef","boxProps","inputProps","dispatch","optionsWithRefs","map","ref","resetUI","setTimeout","current","focus","reset","handleSelect","index","text","list","waitForInteractive","onEnter","element","i","event","preventDefault","stopPropagation","set","isDropdownVisible","length","position","offset","active","anchorRef","tooltipRef","width","handleFocus","handleMouseDown","handleMouseEnter","cursor","interactive","handleChange","value","currentTarget","handleClearOrSubmit","handleFocusChange","focused","containsFocusRef","handleInputKeydown","key","blur","handleContainerKeydown","staged","AutocompleteInputDropdown","Box","DROP_SHADOW","AutocompleteInputOptions"],"mappings":"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","sourcesContent":["import composeRefs from \"@seznam/compose-react-refs\"\nimport React, {\n createRef,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from \"react\"\nimport styled from \"styled-components\"\nimport { useKeyboardListNavigation } from \"use-keyboard-list-navigation\"\nimport { Spinner } from \"..\"\nimport { DROP_SHADOW } from \"../../helpers\"\nimport { CloseIcon, MagnifyingGlassIcon } from \"../../svgs\"\nimport { usePosition, useContainsFocus } from \"../../utils\"\nimport { useWidthOf } from \"../../utils/useWidthOf\"\nimport { Box, splitBoxProps } from \"../Box\"\nimport { Clickable } from \"../Clickable\"\nimport { InputProps } from \"../Input\"\nimport { LabeledInput } from \"../LabeledInput\"\nimport { VisuallyHidden } from \"../VisuallyHidden\"\nimport { AutocompleteInputOption } from \"./AutocompleteInputOption\"\nimport { AutocompleteInputOptionLabel } from \"./AutocompleteInputOptionLabel\"\n\n/** Base option type — can be expanded */\nexport interface AutocompleteInputOptionType {\n text: string\n value: string\n}\n\ninterface State {\n open: boolean\n query: string\n}\n\ntype Action =\n | { type: \"OPEN\" }\n | { type: \"CLOSE\" }\n | { type: \"CLEAR\" }\n | { type: \"CHANGE\"; payload: { query: string } }\n | { type: \"SELECT\"; payload: { query: string } }\n\nconst reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case \"OPEN\":\n return { ...state, open: true }\n case \"CLOSE\":\n return { ...state, open: false }\n case \"CLEAR\":\n return { ...state, query: \"\" }\n case \"CHANGE\":\n return { ...state, query: action.payload.query, open: true }\n case \"SELECT\":\n return { ...state, query: action.payload.query, open: false }\n }\n}\n\nexport interface AutocompleteInputProps<T extends AutocompleteInputOptionType>\n extends Omit<InputProps, \"onSelect\" | \"onSubmit\"> {\n defaultValue?: string\n loading?: boolean\n footer?: React.ReactNode\n /** on <enter> when no option is selected */\n onSubmit?(query: string): void\n /** on <click> or <enter> when an option is selected */\n onSelect?(option: T, index: number): void\n /** on <click> of the 'x' (clear) button */\n onClear?(): void\n /** Callback that runs when options are hidden */\n onClose?(): void\n renderOption?(\n option: T,\n i: number\n ): React.ReactElement<any, string | React.JSXElementConstructor<any>>\n options: T[]\n}\n\n/** AutocompleteInput */\nexport const AutocompleteInput = <T extends AutocompleteInputOptionType>({\n defaultValue = \"\",\n id,\n loading,\n footer,\n onSubmit,\n onSelect,\n onChange,\n onClear,\n onClose,\n onKeyDown,\n height,\n renderOption = (option) => <AutocompleteInputOptionLabel {...option} />,\n options,\n ...rest\n}: AutocompleteInputProps<T>) => {\n const inputRef = useRef<HTMLInputElement | null>(null)\n const containerRef = useRef<HTMLDivElement | null>(null)\n\n const [boxProps, inputProps] = splitBoxProps(rest)\n\n const [state, dispatch] = useReducer(reducer, {\n open: false,\n query: defaultValue,\n })\n\n const optionsWithRefs = useMemo(() => {\n return options.map((option) => ({\n option,\n ref: createRef<HTMLButtonElement>(),\n }))\n }, [options])\n\n const resetUI = () => {\n setTimeout(() => {\n inputRef.current?.focus()\n reset()\n dispatch({ type: \"CLOSE\" })\n }, 100)\n }\n\n const handleSelect = (option: T, index: number) => {\n dispatch({ type: \"SELECT\", payload: { query: option.text } })\n inputRef.current?.focus()\n onSelect?.(option, index)\n }\n\n const { index, reset, set } = useKeyboardListNavigation({\n ref: containerRef,\n list: options,\n waitForInteractive: true,\n onEnter: ({ element: option, index: i, event }) => {\n event.preventDefault()\n event.stopPropagation()\n handleSelect(option, i)\n resetUI()\n },\n })\n\n const isDropdownVisible = state.open && options.length > 0\n\n // Reset keyboard navigation when options change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(reset, [options])\n\n // Reset keyboard navigation when query is empty\n useEffect(() => {\n if (state.query === \"\") reset()\n }, [reset, state.query])\n\n const { anchorRef, tooltipRef } = usePosition({\n position: \"bottom\",\n offset: 10,\n active: isDropdownVisible,\n })\n\n const { width } = useWidthOf({ ref: anchorRef })\n\n const handleFocus = () => {\n reset()\n dispatch({ type: \"OPEN\" })\n }\n\n const handleMouseDown = (option: T, i: number) => () => {\n handleSelect(option, i)\n resetUI()\n }\n\n const handleMouseEnter = (i: number) => () => {\n set({ cursor: i, interactive: true })\n }\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const {\n currentTarget: { value },\n } = event\n\n dispatch({ type: \"CHANGE\", payload: { query: value } })\n onChange?.(event)\n }\n\n const handleClearOrSubmit = () => {\n if (state.query === \"\") {\n onSubmit?.(state.query)\n return\n }\n\n dispatch({ type: \"CLEAR\" })\n inputRef.current?.focus()\n onClear?.()\n }\n\n // Moves focus to different options when keyboard navigating using up/down\n useEffect(() => {\n const option = optionsWithRefs[index]\n option?.ref?.current?.focus()\n }, [index, optionsWithRefs])\n\n const handleFocusChange = useCallback(\n (focused: boolean) => {\n if (focused || !isDropdownVisible) return\n\n dispatch({ type: \"CLOSE\" })\n reset()\n onClose?.()\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onClose, isDropdownVisible]\n )\n\n // Handle closing the dropdown when clicking outside of the input\n // or when focus leaves the input completely\n const { ref: containsFocusRef } = useContainsFocus({\n onChange: handleFocusChange,\n })\n\n const handleInputKeydown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n switch (event.key) {\n // Handle <Enter> when nothing is selected\n case \"Enter\":\n if (state.query !== \"\" && index === -1) {\n onSubmit?.(state.query)\n resetUI()\n }\n return\n\n // <Esc> to close dropdown\n case \"Escape\":\n event.preventDefault()\n event.stopPropagation()\n\n dispatch({ type: \"CLOSE\" })\n inputRef.current?.blur()\n\n return\n\n default:\n break\n }\n\n onKeyDown?.(event)\n }\n\n // Moves focus back to input when typing\n const handleContainerKeydown = (\n event: React.KeyboardEvent<HTMLDivElement>\n ) => {\n switch (event.key) {\n case \"Alt\":\n case \"ArrowDown\":\n case \"ArrowUp\":\n case \"Control\":\n case \"Enter\":\n case \"Meta\":\n case \"Shift\":\n case \"Tab\":\n // Ignore\n return\n\n case \"Escape\":\n event.preventDefault()\n event.stopPropagation()\n\n dispatch({ type: \"CLOSE\" })\n inputRef.current?.blur()\n reset()\n\n return\n\n default:\n inputRef.current?.focus()\n }\n }\n\n // Option that is being hovered or keyed into\n const staged = options[index]\n\n return (\n <Box\n ref={composeRefs(containerRef, containsFocusRef) as any}\n onKeyDown={handleContainerKeydown}\n {...boxProps}\n >\n <LabeledInput\n ref={composeRefs(inputRef, anchorRef) as any}\n role=\"combobox\"\n aria-expanded={isDropdownVisible}\n aria-autocomplete=\"list\"\n {...(id ? { id, \"aria-describedby\": `${id}__assistiveHint` } : {})}\n label={\n loading ? (\n <Box width={18}>\n <Spinner size=\"small\" />\n </Box>\n ) : state.query ? (\n <Clickable\n onClick={handleClearOrSubmit}\n height=\"100%\"\n display=\"flex\"\n alignItems=\"center\"\n aria-label=\"Clear input\"\n >\n <CloseIcon fill=\"black60\" aria-hidden />\n </Clickable>\n ) : (\n <MagnifyingGlassIcon fill=\"black60\" aria-hidden />\n )\n }\n value={staged?.text ?? state.query}\n onChange={handleChange}\n onFocus={handleFocus}\n onKeyDown={handleInputKeydown}\n autoComplete=\"off\"\n height={height}\n {...inputProps}\n />\n\n {isDropdownVisible && (\n <AutocompleteInputDropdown\n ref={tooltipRef as any}\n role=\"listbox\"\n width={width}\n >\n <AutocompleteInputOptions>\n {optionsWithRefs.map(({ option, ref }, i) => {\n return (\n <AutocompleteInputOption\n key={i}\n ref={ref}\n role=\"option\"\n aria-selected={i === index}\n aria-posinset={i + 1}\n aria-setsize={options.length}\n onMouseDown={handleMouseDown(option, i)}\n onMouseEnter={handleMouseEnter(i)}\n selected={i === index}\n tabIndex={-1}\n >\n {renderOption(option, i)}\n </AutocompleteInputOption>\n )\n })}\n </AutocompleteInputOptions>\n\n {footer}\n </AutocompleteInputDropdown>\n )}\n\n <VisuallyHidden {...(id ? { id: `${id}__assistiveHint` } : {})}>\n When autocomplete results are available use up and down arrows to review\n and enter to select. Touch device users, explore by touch or with swipe\n gestures.\n </VisuallyHidden>\n\n {isDropdownVisible && (\n <VisuallyHidden role=\"status\" aria-atomic=\"true\" aria-live=\"polite\">\n {options.length === 1\n ? `1 result is available`\n : `${options.length} results are available`}\n </VisuallyHidden>\n )}\n </Box>\n )\n}\n\nconst AutocompleteInputDropdown = styled(Box)`\n box-shadow: ${DROP_SHADOW};\n z-index: 1;\n`\n\nconst AutocompleteInputOptions = styled(Box)`\n /* 308 = Roughly, 5.5 default sized options */\n max-height: 308px;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n`\n"],"file":"AutocompleteInput.js"}
|
|
@@ -102,6 +102,29 @@ var Default = function Default() {
|
|
|
102
102
|
color: "black60"
|
|
103
103
|
}, option.subtitle));
|
|
104
104
|
}
|
|
105
|
+
}, {
|
|
106
|
+
options: [].concat(OPTIONS, _toConsumableArray(OPTIONS.map(function (option) {
|
|
107
|
+
return _objectSpread(_objectSpread({}, option), {}, {
|
|
108
|
+
text: "Another ".concat(option.text),
|
|
109
|
+
value: "another-".concat(option.value)
|
|
110
|
+
});
|
|
111
|
+
}))),
|
|
112
|
+
footer: /*#__PURE__*/_react.default.createElement(_Box.Box, {
|
|
113
|
+
px: 2,
|
|
114
|
+
py: 1,
|
|
115
|
+
bg: "black10"
|
|
116
|
+
}, /*#__PURE__*/_react.default.createElement(_Text.Text, {
|
|
117
|
+
variant: "xs"
|
|
118
|
+
}, "Footer"))
|
|
119
|
+
}, {
|
|
120
|
+
options: [OPTIONS[0], OPTIONS[1]],
|
|
121
|
+
footer: /*#__PURE__*/_react.default.createElement(_Box.Box, {
|
|
122
|
+
px: 2,
|
|
123
|
+
py: 1,
|
|
124
|
+
bg: "black10"
|
|
125
|
+
}, /*#__PURE__*/_react.default.createElement(_Text.Text, {
|
|
126
|
+
variant: "xs"
|
|
127
|
+
}, "Footer"))
|
|
105
128
|
}]
|
|
106
129
|
}, /*#__PURE__*/_react.default.createElement(_AutocompleteInput.AutocompleteInput, {
|
|
107
130
|
placeholder: "Search",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/AutocompleteInput/AutocompleteInput.story.tsx"],"names":["title","OPTIONS","text","value","subtitle","Default","loading","options","height","map","option","renderOption","Demo","query","setQuery","handleChange","event","target","i","displayQuery","borderBottom","borderColor"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAEe;AACbA,EAAAA,KAAK,EAAE;AADM,C;;AAIf,IAAMC,OAAO,GAAG,CACd;AACEC,EAAAA,IAAI,EAAE,UADR;AAEEC,EAAAA,KAAK,EAAE,UAFT;AAGEC,EAAAA,QAAQ,EAAE;AAHZ,CADc,EAMd;AAAEF,EAAAA,IAAI,EAAE,OAAR;AAAiBC,EAAAA,KAAK,EAAE,OAAxB;AAAiCC,EAAAA,QAAQ,EAAE;AAA3C,CANc,EAOd;AAAEF,EAAAA,IAAI,EAAE,WAAR;AAAqBC,EAAAA,KAAK,EAAE,WAA5B;AAAyCC,EAAAA,QAAQ,EAAE;AAAnD,CAPc,EAQd;AACEF,EAAAA,IAAI,EAAE,aADR;AAEEC,EAAAA,KAAK,EAAE,aAFT;AAGEC,EAAAA,QAAQ,EAAE;AAHZ,CARc,EAad;AACEF,EAAAA,IAAI,EAAE,aADR;AAEEC,EAAAA,KAAK,EAAE,aAFT;AAGEC,EAAAA,QAAQ,EAAE;AAHZ,CAbc,CAAhB;;AAoBO,IAAMC,OAAO,GAAG,SAAVA,OAAU,GAAM;AAC3B,sBACE,6BAAC,uBAAD;AACE,IAAA,MAAM,EAAE,CACN,EADM,EAEN;AAAEC,MAAAA,OAAO,EAAE;AAAX,KAFM,EAGN;AAAEC,MAAAA,OAAO,EAAE,EAAX;AAAeC,MAAAA,MAAM,EAAE;AAAvB,KAHM,EAIN;AACED,MAAAA,OAAO,YACFN,OADE,qBAEFA,OAAO,CAACQ,GAAR,CAAY,UAACC,MAAD;AAAA,+CACVA,MADU;AAEbR,UAAAA,IAAI,oBAAaQ,MAAM,CAACR,IAApB,CAFS;AAGbC,UAAAA,KAAK,oBAAaO,MAAM,CAACP,KAApB;AAHQ;AAAA,OAAZ,CAFE,EADT;AASEQ,MAAAA,YAAY,EAAE,sBAACD,MAAD;AAAA,4BACZ,6BAAC,QAAD;AAAK,UAAA,EAAE,EAAE,CAAT;AAAY,UAAA,EAAE,EAAE;AAAhB,wBACE,6BAAC,UAAD;AAAM,UAAA,OAAO,EAAC;AAAd,WAAoBA,MAAM,CAACR,IAA3B,CADF,eAEE,6BAAC,UAAD;AAAM,UAAA,OAAO,EAAC,IAAd;AAAmB,UAAA,KAAK,EAAC;AAAzB,WACGQ,MAAM,CAACN,QADV,CAFF,CADY;AAAA;AAThB,KAJM;AADV,
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/AutocompleteInput/AutocompleteInput.story.tsx"],"names":["title","OPTIONS","text","value","subtitle","Default","loading","options","height","map","option","renderOption","footer","Demo","query","setQuery","handleChange","event","target","i","displayQuery","borderBottom","borderColor"],"mappings":"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","sourcesContent":["import { action } from \"@storybook/addon-actions\"\nimport React, { useState } from \"react\"\nimport { States } from \"storybook-states\"\nimport { Box } from \"../Box\"\nimport { Text } from \"../Text\"\nimport { AutocompleteInput, AutocompleteInputProps } from \"./AutocompleteInput\"\n\nexport default {\n title: \"Components/AutocompleteInput\",\n}\n\nconst OPTIONS = [\n {\n text: \"Painting\",\n value: \"painting\",\n subtitle: \"An example subtitle\",\n },\n { text: \"Print\", value: \"print\", subtitle: \"An example subtitle\" },\n { text: \"Sculpture\", value: \"sculpture\", subtitle: \"An example subtitle\" },\n {\n text: \"Photography\",\n value: \"photography\",\n subtitle: \"An example subtitle\",\n },\n {\n text: \"Mixed Media\",\n value: \"mixed-media\",\n subtitle: \"An example subtitle\",\n },\n]\n\nexport const Default = () => {\n return (\n <States<Partial<AutocompleteInputProps<typeof OPTIONS[number]>>>\n states={[\n {},\n { loading: true },\n { options: [], height: 40 },\n {\n options: [\n ...OPTIONS,\n ...OPTIONS.map((option) => ({\n ...option,\n text: `Another ${option.text}`,\n value: `another-${option.value}`,\n })),\n ],\n renderOption: (option) => (\n <Box px={2} py={1}>\n <Text variant=\"md\">{option.text}</Text>\n <Text variant=\"xs\" color=\"black60\">\n {option.subtitle}\n </Text>\n </Box>\n ),\n },\n {\n options: [\n ...OPTIONS,\n ...OPTIONS.map((option) => ({\n ...option,\n text: `Another ${option.text}`,\n value: `another-${option.value}`,\n })),\n ],\n footer: (\n <Box px={2} py={1} bg=\"black10\">\n <Text variant=\"xs\">Footer</Text>\n </Box>\n ),\n },\n {\n options: [OPTIONS[0], OPTIONS[1]],\n footer: (\n <Box px={2} py={1} bg=\"black10\">\n <Text variant=\"xs\">Footer</Text>\n </Box>\n ),\n },\n ]}\n >\n <AutocompleteInput\n placeholder=\"Search\"\n options={OPTIONS}\n onSelect={action(\"onSelect\")}\n onSubmit={action(\"onSubmit\")}\n onClose={action(\"onClose\")}\n />\n </States>\n )\n}\n\nexport const Demo = () => {\n const [query, setQuery] = useState(\"\")\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setQuery(event.target.value)\n }\n\n return (\n <AutocompleteInput\n placeholder=\"Begin typing...\"\n options={[...(query ? [{ text: query, value: query }] : []), ...OPTIONS]}\n onChange={handleChange}\n onSelect={action(\"onSelect\")}\n onSubmit={action(\"onSubmit\")}\n onClose={action(\"onClose\")}\n renderOption={(option, i) => {\n const displayQuery = i === 0 && query !== \"\"\n\n return (\n <Box\n px={2}\n py={1}\n {...(displayQuery\n ? { borderBottom: \"1px solid\", borderColor: \"black10\" }\n : {})}\n >\n <Text variant=\"md\">\n {displayQuery\n ? `See full results for “${option.text}”`\n : option.text}\n </Text>\n\n {\"subtitle\" in option && (\n <Text variant=\"xs\" color=\"black60\">\n {option.subtitle}\n </Text>\n )}\n </Box>\n )\n }}\n />\n )\n}\n"],"file":"AutocompleteInput.story.js"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.FilterInput = void 0;
|
|
9
|
+
|
|
10
|
+
var React = _interopRequireWildcard(require("react"));
|
|
11
|
+
|
|
12
|
+
var _CloseCircleIcon = require("../../../svgs/CloseCircleIcon");
|
|
13
|
+
|
|
14
|
+
var _MagnifyingGlassIcon = require("../../../svgs/MagnifyingGlassIcon");
|
|
15
|
+
|
|
16
|
+
var _LabeledInput = require("../../LabeledInput");
|
|
17
|
+
|
|
18
|
+
var _Clickable = require("../../Clickable");
|
|
19
|
+
|
|
20
|
+
var _FilterSelectContext = require("./FilterSelectContext");
|
|
21
|
+
|
|
22
|
+
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
|
|
23
|
+
|
|
24
|
+
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
25
|
+
|
|
26
|
+
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
27
|
+
|
|
28
|
+
var FilterInput = function FilterInput(props) {
|
|
29
|
+
var _useFilterSelectConte = (0, _FilterSelectContext.useFilterSelectContext)(),
|
|
30
|
+
query = _useFilterSelectConte.query,
|
|
31
|
+
setQuery = _useFilterSelectConte.setQuery,
|
|
32
|
+
placeholder = _useFilterSelectConte.placeholder;
|
|
33
|
+
|
|
34
|
+
var ref = (0, React.useRef)(null);
|
|
35
|
+
|
|
36
|
+
var handleChange = function handleChange(event) {
|
|
37
|
+
setQuery(event.target.value);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
var handleClick = function handleClick() {
|
|
41
|
+
var _ref$current;
|
|
42
|
+
|
|
43
|
+
setQuery("");
|
|
44
|
+
(_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.focus();
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
return /*#__PURE__*/React.createElement(_LabeledInput.LabeledInput, _extends({
|
|
48
|
+
ref: ref,
|
|
49
|
+
role: "search",
|
|
50
|
+
label: query !== "" ?
|
|
51
|
+
/*#__PURE__*/
|
|
52
|
+
// Active state
|
|
53
|
+
React.createElement(_Clickable.Clickable, {
|
|
54
|
+
display: "flex",
|
|
55
|
+
onClick: handleClick,
|
|
56
|
+
"aria-label": "Clear search input"
|
|
57
|
+
}, /*#__PURE__*/React.createElement(_CloseCircleIcon.CloseCircleIcon, null)) :
|
|
58
|
+
/*#__PURE__*/
|
|
59
|
+
// Resting state
|
|
60
|
+
React.createElement(_MagnifyingGlassIcon.MagnifyingGlassIcon, {
|
|
61
|
+
style: {
|
|
62
|
+
pointerEvents: "none"
|
|
63
|
+
}
|
|
64
|
+
}),
|
|
65
|
+
onChange: handleChange,
|
|
66
|
+
value: query,
|
|
67
|
+
placeholder: placeholder
|
|
68
|
+
}, props));
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
exports.FilterInput = FilterInput;
|
|
72
|
+
FilterInput.displayName = "FilterInput";
|
|
73
|
+
//# sourceMappingURL=FilterInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/elements/FilterSelect/Components/FilterInput.tsx"],"names":["FilterInput","props","query","setQuery","placeholder","ref","handleChange","event","target","value","handleClick","current","focus","pointerEvents"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AAEA;;AACA;;AAEA;;;;;;;;AAIO,IAAMA,WAAiC,GAAG,SAApCA,WAAoC,CAACC,KAAD,EAAW;AAAA,8BACjB,kDADiB;AAAA,MAClDC,KADkD,yBAClDA,KADkD;AAAA,MAC3CC,QAD2C,yBAC3CA,QAD2C;AAAA,MACjCC,WADiC,yBACjCA,WADiC;;AAE1D,MAAMC,GAAG,GAAG,kBAAgC,IAAhC,CAAZ;;AAEA,MAAMC,YAAY,GAAG,SAAfA,YAAe,CAACC,KAAD,EAAgD;AACnEJ,IAAAA,QAAQ,CAACI,KAAK,CAACC,MAAN,CAAaC,KAAd,CAAR;AACD,GAFD;;AAIA,MAAMC,WAAW,GAAG,SAAdA,WAAc,GAAM;AAAA;;AACxBP,IAAAA,QAAQ,CAAC,EAAD,CAAR;AACA,oBAAAE,GAAG,CAACM,OAAJ,8DAAaC,KAAb;AACD,GAHD;;AAKA,sBACE,oBAAC,0BAAD;AACE,IAAA,GAAG,EAAEP,GADP;AAEE,IAAA,IAAI,EAAC,QAFP;AAGE,IAAA,KAAK,EACHH,KAAK,KAAK,EAAV;AAAA;AACE;AACA,wBAAC,oBAAD;AACE,MAAA,OAAO,EAAC,MADV;AAEE,MAAA,OAAO,EAAEQ,WAFX;AAGE,oBAAW;AAHb,oBAKE,oBAAC,gCAAD,OALF,CAFF;AAAA;AAUE;AACA,wBAAC,wCAAD;AAAqB,MAAA,KAAK,EAAE;AAAEG,QAAAA,aAAa,EAAE;AAAjB;AAA5B,MAfN;AAkBE,IAAA,QAAQ,EAAEP,YAlBZ;AAmBE,IAAA,KAAK,EAAEJ,KAnBT;AAoBE,IAAA,WAAW,EAAEE;AApBf,KAqBMH,KArBN,EADF;AAyBD,CAtCM;;;AAAMD,W","sourcesContent":["import * as React from \"react\"\nimport { CloseCircleIcon } from \"../../../svgs/CloseCircleIcon\"\nimport { MagnifyingGlassIcon } from \"../../../svgs/MagnifyingGlassIcon\"\nimport { InputProps } from \"../../Input\"\nimport { LabeledInput } from \"../../LabeledInput\"\nimport { Clickable } from \"../../Clickable\"\nimport { useRef } from \"react\"\nimport { useFilterSelectContext } from \"./FilterSelectContext\"\n\nexport type FilterInputProps = InputProps\n\nexport const FilterInput: React.FC<InputProps> = (props) => {\n const { query, setQuery, placeholder } = useFilterSelectContext()\n const ref = useRef<HTMLInputElement | null>(null)\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setQuery(event.target.value)\n }\n\n const handleClick = () => {\n setQuery(\"\")\n ref.current?.focus()\n }\n\n return (\n <LabeledInput\n ref={ref}\n role=\"search\"\n label={\n query !== \"\" ? (\n // Active state\n <Clickable\n display=\"flex\"\n onClick={handleClick}\n aria-label=\"Clear search input\"\n >\n <CloseCircleIcon />\n </Clickable>\n ) : (\n // Resting state\n <MagnifyingGlassIcon style={{ pointerEvents: \"none\" }} />\n )\n }\n onChange={handleChange}\n value={query}\n placeholder={placeholder}\n {...props}\n />\n )\n}\n"],"file":"FilterInput.js"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface Item {
|
|
3
|
+
label: string;
|
|
4
|
+
value: string;
|
|
5
|
+
[key: string]: string | number | boolean;
|
|
6
|
+
}
|
|
7
|
+
interface FilterSelectContextProps {
|
|
8
|
+
items: Item[];
|
|
9
|
+
filteredItems: Item[];
|
|
10
|
+
initialItemsToShow: number;
|
|
11
|
+
isFiltered: boolean;
|
|
12
|
+
onChange: (state: {
|
|
13
|
+
items: FilterSelectContextProps["items"];
|
|
14
|
+
filteredItems: FilterSelectContextProps["filteredItems"];
|
|
15
|
+
selectedItems: FilterSelectContextProps["selectedItems"];
|
|
16
|
+
query: FilterSelectContextProps["query"];
|
|
17
|
+
}) => void;
|
|
18
|
+
order: [string[], Array<"asc" | "desc">];
|
|
19
|
+
placeholder: string;
|
|
20
|
+
query: string;
|
|
21
|
+
renderItemLabel?: (item: any) => string;
|
|
22
|
+
selectedItems: Item[];
|
|
23
|
+
setSelectedItems: (item: Item) => void;
|
|
24
|
+
setQuery: (query: string) => void;
|
|
25
|
+
}
|
|
26
|
+
export declare type FilterSelectState = Pick<FilterSelectContextProps, "filteredItems" | "initialItemsToShow" | "items" | "isFiltered" | "onChange" | "order" | "placeholder" | "renderItemLabel" | "query" | "selectedItems">;
|
|
27
|
+
export declare const FilterSelectContextProvider: React.FC<Partial<FilterSelectState>>;
|
|
28
|
+
export declare const useFilterSelectContext: () => FilterSelectContextProps;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.useFilterSelectContext = exports.FilterSelectContextProvider = void 0;
|
|
9
|
+
|
|
10
|
+
var _lodash = _interopRequireDefault(require("lodash.reject"));
|
|
11
|
+
|
|
12
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
13
|
+
|
|
14
|
+
var _ShowMore = require("../../ShowMore");
|
|
15
|
+
|
|
16
|
+
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
|
|
17
|
+
|
|
18
|
+
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
19
|
+
|
|
20
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
+
|
|
22
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
23
|
+
|
|
24
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
25
|
+
|
|
26
|
+
function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
27
|
+
|
|
28
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
29
|
+
|
|
30
|
+
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
31
|
+
|
|
32
|
+
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
33
|
+
|
|
34
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
35
|
+
|
|
36
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
37
|
+
|
|
38
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
39
|
+
|
|
40
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
|
|
41
|
+
|
|
42
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
43
|
+
|
|
44
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
45
|
+
|
|
46
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
47
|
+
|
|
48
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
49
|
+
|
|
50
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
51
|
+
|
|
52
|
+
var filterSelectReducer = function filterSelectReducer(state, action) {
|
|
53
|
+
switch (action.type) {
|
|
54
|
+
case "SET_QUERY":
|
|
55
|
+
{
|
|
56
|
+
var _query = action.payload.query;
|
|
57
|
+
|
|
58
|
+
if (_query === "") {
|
|
59
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
60
|
+
query: _query,
|
|
61
|
+
isFiltered: false,
|
|
62
|
+
filteredItems: []
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
var filteredItems = state.items.filter(function (_ref) {
|
|
67
|
+
var name = _ref.label;
|
|
68
|
+
return name.toLowerCase().includes(_query.toLowerCase());
|
|
69
|
+
});
|
|
70
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
71
|
+
query: _query,
|
|
72
|
+
isFiltered: true,
|
|
73
|
+
filteredItems: filteredItems
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
case "SET_SELECTED_ITEMS":
|
|
78
|
+
{
|
|
79
|
+
var isFound = !!state.selectedItems.find(function (item) {
|
|
80
|
+
return item.value === action.payload.item.value;
|
|
81
|
+
});
|
|
82
|
+
var selectedItems = isFound ? (0, _lodash.default)(state.selectedItems, {
|
|
83
|
+
value: action.payload.item.value
|
|
84
|
+
}) : [].concat(_toConsumableArray(state.selectedItems), [action.payload.item]);
|
|
85
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
86
|
+
selectedItems: selectedItems
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
var initialState = {
|
|
93
|
+
filteredItems: [],
|
|
94
|
+
initialItemsToShow: _ShowMore.INITIAL_ITEMS_TO_SHOW,
|
|
95
|
+
isFiltered: false,
|
|
96
|
+
items: [],
|
|
97
|
+
onChange: function onChange(x) {
|
|
98
|
+
return x;
|
|
99
|
+
},
|
|
100
|
+
order: [["label"], ["asc"]],
|
|
101
|
+
placeholder: "",
|
|
102
|
+
query: "",
|
|
103
|
+
renderItemLabel: undefined,
|
|
104
|
+
selectedItems: []
|
|
105
|
+
};
|
|
106
|
+
var FilterSelectContext = /*#__PURE__*/(0, _react.createContext)({});
|
|
107
|
+
|
|
108
|
+
var FilterSelectContextProvider = function FilterSelectContextProvider(_ref2) {
|
|
109
|
+
var children = _ref2.children,
|
|
110
|
+
props = _objectWithoutProperties(_ref2, ["children"]);
|
|
111
|
+
|
|
112
|
+
var _useReducer = (0, _react.useReducer)(filterSelectReducer, _objectSpread(_objectSpread({}, initialState), props)),
|
|
113
|
+
_useReducer2 = _slicedToArray(_useReducer, 2),
|
|
114
|
+
state = _useReducer2[0],
|
|
115
|
+
dispatch = _useReducer2[1];
|
|
116
|
+
|
|
117
|
+
var contextValue = _objectSpread(_objectSpread({}, state), {}, {
|
|
118
|
+
setSelectedItems: function setSelectedItems(item) {
|
|
119
|
+
dispatch({
|
|
120
|
+
type: "SET_SELECTED_ITEMS",
|
|
121
|
+
payload: {
|
|
122
|
+
item: item
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
},
|
|
126
|
+
setQuery: function setQuery(query) {
|
|
127
|
+
dispatch({
|
|
128
|
+
type: "SET_QUERY",
|
|
129
|
+
payload: {
|
|
130
|
+
query: query
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
(0, _react.useLayoutEffect)(function () {
|
|
137
|
+
var _props$query;
|
|
138
|
+
|
|
139
|
+
if ((_props$query = props.query) !== null && _props$query !== void 0 && _props$query.length) {
|
|
140
|
+
contextValue.setQuery(props.query);
|
|
141
|
+
} // eslint-disable-next-line react-hooks/exhaustive-deps
|
|
142
|
+
|
|
143
|
+
}, []);
|
|
144
|
+
return /*#__PURE__*/_react.default.createElement(FilterSelectContext.Provider, {
|
|
145
|
+
value: contextValue
|
|
146
|
+
}, children);
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
exports.FilterSelectContextProvider = FilterSelectContextProvider;
|
|
150
|
+
FilterSelectContextProvider.displayName = "FilterSelectContextProvider";
|
|
151
|
+
|
|
152
|
+
var useFilterSelectContext = function useFilterSelectContext() {
|
|
153
|
+
return (0, _react.useContext)(FilterSelectContext);
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
exports.useFilterSelectContext = useFilterSelectContext;
|
|
157
|
+
//# sourceMappingURL=FilterSelectContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/elements/FilterSelect/Components/FilterSelectContext.tsx"],"names":["filterSelectReducer","state","action","type","query","payload","isFiltered","filteredItems","items","filter","name","label","toLowerCase","includes","isFound","selectedItems","find","item","value","initialState","initialItemsToShow","INITIAL_ITEMS_TO_SHOW","onChange","x","order","placeholder","renderItemLabel","undefined","FilterSelectContext","FilterSelectContextProvider","children","props","dispatch","contextValue","setSelectedItems","setQuery","length","useFilterSelectContext"],"mappings":"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","sourcesContent":["import reject from \"lodash.reject\"\nimport React, {\n createContext,\n useContext,\n useLayoutEffect,\n useReducer,\n} from \"react\"\nimport { INITIAL_ITEMS_TO_SHOW } from \"../../ShowMore\"\n\nexport interface Item {\n label: string\n value: string\n [key: string]: string | number | boolean\n}\n\ninterface FilterSelectContextProps {\n items: Item[]\n filteredItems: Item[]\n initialItemsToShow: number\n isFiltered: boolean\n onChange: (state: {\n items: FilterSelectContextProps[\"items\"]\n filteredItems: FilterSelectContextProps[\"filteredItems\"]\n selectedItems: FilterSelectContextProps[\"selectedItems\"]\n query: FilterSelectContextProps[\"query\"]\n }) => void\n order: [string[], Array<\"asc\" | \"desc\">] // See: https://lodash.com/docs/4.17.15#orderBy\n placeholder: string\n query: string\n renderItemLabel?: (item: any) => string\n selectedItems: Item[]\n setSelectedItems: (item: Item) => void\n setQuery: (query: string) => void\n}\n\nexport type FilterSelectState = Pick<\n FilterSelectContextProps,\n | \"filteredItems\"\n | \"initialItemsToShow\"\n | \"items\"\n | \"isFiltered\"\n | \"onChange\"\n | \"order\"\n | \"placeholder\"\n | \"renderItemLabel\"\n | \"query\"\n | \"selectedItems\"\n>\n\ntype Action =\n | { type: \"SET_QUERY\"; payload: { query: string } }\n | { type: \"SET_SELECTED_ITEMS\"; payload: { item: Item } }\n\nconst filterSelectReducer = (state: FilterSelectState, action: Action) => {\n switch (action.type) {\n case \"SET_QUERY\": {\n const { query } = action.payload\n\n if (query === \"\") {\n return {\n ...state,\n query,\n isFiltered: false,\n filteredItems: [],\n }\n }\n\n const filteredItems = state.items.filter(({ label: name }) => {\n return name.toLowerCase().includes(query.toLowerCase())\n })\n\n return {\n ...state,\n query,\n isFiltered: true,\n filteredItems,\n }\n }\n\n case \"SET_SELECTED_ITEMS\": {\n const isFound = !!state.selectedItems.find(\n (item) => item.value === action.payload.item.value\n )\n\n const selectedItems = isFound\n ? reject(state.selectedItems, { value: action.payload.item.value })\n : [...state.selectedItems, action.payload.item]\n\n return {\n ...state,\n selectedItems,\n }\n }\n }\n}\n\nconst initialState: FilterSelectState = {\n filteredItems: [],\n initialItemsToShow: INITIAL_ITEMS_TO_SHOW,\n isFiltered: false,\n items: [],\n onChange: (x) => x,\n order: [[\"label\"], [\"asc\"]],\n placeholder: \"\",\n query: \"\",\n renderItemLabel: undefined,\n selectedItems: [],\n}\n\nconst FilterSelectContext = createContext<FilterSelectContextProps>({} as any)\n\nexport const FilterSelectContextProvider: React.FC<\n Partial<FilterSelectState>\n> = ({ children, ...props }) => {\n const [state, dispatch] = useReducer(filterSelectReducer, {\n ...initialState,\n ...props,\n })\n\n const contextValue = {\n ...state,\n\n setSelectedItems: (item) => {\n dispatch({\n type: \"SET_SELECTED_ITEMS\",\n payload: { item },\n })\n },\n setQuery: (query) => {\n dispatch({\n type: \"SET_QUERY\",\n payload: { query },\n })\n },\n }\n\n useLayoutEffect(() => {\n if (props.query?.length) {\n contextValue.setQuery(props.query)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return (\n <FilterSelectContext.Provider value={contextValue}>\n {children}\n </FilterSelectContext.Provider>\n )\n}\n\nexport const useFilterSelectContext = () => {\n return useContext(FilterSelectContext)\n}\n"],"file":"FilterSelectContext.js"}
|