UNPKG

@activecollab/components

Version:

ActiveCollab Components

195 lines • 5.94 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import React, { useCallback, useEffect, useMemo, useState } from "react"; import { MoveFocusInside } from "react-focus-lock"; import { StartMenu } from "./StartMenu"; import { StyledMenu, StyledMenuFooter } from "./Styles"; import { Submenu } from "./Submenu"; import { Button } from "../Button"; import { CounterButton } from "../CounterButton"; import { FilterIcon } from "../Icons"; import { Select } from "../Select"; import { ResizeTransition, SlideLeftRightTransition } from "../Transitions"; export const Filter = _ref => { let { data, selected = {}, label, clearAllText, resetLabel = "Reset", onChange, width = 260, noResultText, emptyFilterText, children, icon = /*#__PURE__*/React.createElement(FilterIcon, null), position = "bottom-end", disabled = false, className } = _ref; const [open, setOpen] = useState(false); const [menu, setMenu] = useState("index"); const [isLeft, setIsLeft] = useState(true); const [height, setHeight] = useState(0); const [enteredMenu, setEnteredMenu] = useState("index"); const [filter, setFilter] = useState(() => selected); useEffect(() => { if (Object.keys(selected).length > 0 || Object.keys(filter).length > 0) { setFilter(selected); } }, [selected, filter]); const handleOpen = useCallback(() => { setOpen(true); }, []); const handleClose = useCallback(() => { setOpen(false); setMenu("index"); setHeight(0); }, []); const handleHeight = useCallback(element => { var _element$offsetHeight; setHeight((_element$offsetHeight = element == null ? void 0 : element.offsetHeight) != null ? _element$offsetHeight : 0); }, []); const handleItemClick = useCallback(value => { setMenu(value); setIsLeft(true); }, []); const setIndex = useCallback(() => { setMenu("index"); setIsLeft(false); }, []); const handleChange = useCallback(selectedArray => { let newFilters = {}; if (selectedArray.length) { newFilters = { ...filter, [menu]: selectedArray }; } else { newFilters = { ...filter }; delete newFilters[menu]; } setFilter(newFilters); onChange(newFilters); }, [filter, menu, onChange]); const handleClearAll = useCallback(event => { event.stopPropagation(); setFilter({}); onChange({}); }, [onChange]); const handleReset = useCallback(() => { const newFilters = { ...filter }; delete newFilters[menu]; setFilter(newFilters); onChange(newFilters); }, [filter, menu, onChange]); const count = useMemo(() => { let c = 0; Object.values(filter).forEach(entry => { if (typeof entry === "string") { return c += 1; } return c += entry.length; }); return c; }, [filter]); const shouldRenderSubmenus = useMemo(() => { if (data.length === 0) { return false; } for (const entry of data) { var _entry$submenu; if (((_entry$submenu = entry.submenu) == null ? void 0 : _entry$submenu.length) > 1) { return true; } } return false; }, [data]); return /*#__PURE__*/React.createElement(StyledMenu, { open: open, onOpen: handleOpen, onClose: handleClose, position: position, target: /*#__PURE__*/React.createElement(CounterButton, { active: open, label: label, icon: icon, counter: count, tooltipText: clearAllText, onClearAll: handleClearAll, disabled: disabled, labelClassName: className }) }, /*#__PURE__*/React.createElement(ResizeTransition, { in: true }, /*#__PURE__*/React.createElement("div", { style: { height, width } }, /*#__PURE__*/React.createElement(SlideLeftRightTransition, { in: menu === "index", direction: isLeft ? "left" : "right", onEnter: handleHeight, onEntered: () => setEnteredMenu("index") }, /*#__PURE__*/React.createElement(MoveFocusInside, null, /*#__PURE__*/React.createElement(StartMenu, { data: data, selected: filter, style: { width }, onHeightChange: setHeight, onItemClick: handleItemClick, shouldRenderSubmenus: shouldRenderSubmenus, emptyFilterText: emptyFilterText }, children))), shouldRenderSubmenus && data.map((_ref2, index) => { var _filter$id; let { id, title, submenu, searchPlaceholder, disableInternalSort, isSingleSelect, defaultValue, ...rest } = _ref2; return /*#__PURE__*/React.createElement(SlideLeftRightTransition, { key: "filter-submenu-" + index, in: menu === id, direction: isLeft ? "left" : "right", onEnter: handleHeight, onEntered: () => setEnteredMenu(id) }, /*#__PURE__*/React.createElement(Submenu, { title: title, onBack: setIndex, onHeightChange: setHeight, style: { width }, indexPage: menu === "index" }, /*#__PURE__*/React.createElement(MoveFocusInside, { disabled: enteredMenu !== id }, /*#__PURE__*/React.createElement(Select, _extends({ options: submenu, selected: filter[id], onChange: handleChange, type: isSingleSelect ? "single" : "multiple", autoHeightMax: 255, placeholder: searchPlaceholder, noResultText: noResultText, keepSameOptionsOrder: Boolean(submenu.length <= 7), disableSearch: Boolean(submenu.length <= 7), disabledInternalSort: disableInternalSort, defaultValue: defaultValue }, rest)), (_filter$id = filter[id]) != null && _filter$id.length ? /*#__PURE__*/React.createElement(StyledMenuFooter, null, /*#__PURE__*/React.createElement(Button, { variant: "text colored", size: "small", onClick: handleReset }, resetLabel)) : null))); })))); }; //# sourceMappingURL=Filter.js.map