UNPKG

@light-sheet/react

Version:

FortuneSheet is a drop-in javascript spreadsheet library that provides rich features like Excel and Google Sheets

242 lines (240 loc) 8.49 kB
import React, { useCallback, useContext } from "react"; import "./index.css"; import { locale, updateItem } from "@light-sheet/core"; import _ from "lodash"; import WorkbookContext from "../../context"; import Select, { Option } from "../Toolbar/Select"; import SVGIcon from "../SVGIcon"; import { useDialog } from "../../hooks/useDialog"; import ConditionRules from "./ConditionRules"; import { MenuDivider } from "../Toolbar/Divider"; var ConditionalFormat = function ConditionalFormat(_ref) { var items = _ref.items, setOpen = _ref.setOpen; var _useContext = useContext(WorkbookContext), context = _useContext.context, setContext = _useContext.setContext, refs = _useContext.refs; var _useDialog = useDialog(), showDialog = _useDialog.showDialog; var _locale = locale(context), conditionformat = _locale.conditionformat; // 子菜单溢出屏幕时,重新定位子菜单位置 // re-position the subMenu if it oveflows the window var showSubMenu = useCallback(function (e) { var target = e.target; var menuItem = target.className === "fortune-toolbar-menu-line" ? target.parentElement : target; var menuItemRect = menuItem.getBoundingClientRect(); var workbookContainerRect = refs.workbookContainer.current.getBoundingClientRect(); var subMenu = menuItem.querySelector(".condition-format-sub-menu"); if (_.isNil(subMenu)) return; var menuItemStyle = window.getComputedStyle(menuItem); var menuItemPaddingRight = parseFloat(menuItemStyle.getPropertyValue("padding-right").replace("px", "")); if (workbookContainerRect.right - menuItemRect.right < parseFloat(subMenu.style.width.replace("px", ""))) { subMenu.style.display = "block"; subMenu.style.right = "".concat(menuItemRect.width - menuItemPaddingRight, "px"); } else { subMenu.style.display = "block"; subMenu.style.right = "".concat(-(parseFloat(subMenu.style.width.replace("px", "")) + menuItemPaddingRight), "px"); } }, [refs.workbookContainer]); var hideSubMenu = useCallback(function (e) { var target = e.target; if (target.className === "condition-format-sub-menu") { target.style.display = "none"; return; } var subMenu = target.className === "condition-format-item" ? target.parentElement : target.querySelector(".condition-format-sub-menu"); if (_.isNil(subMenu)) return; subMenu.style.display = "none"; }, []); // 获得条件格式 var getConditionFormatItem = useCallback(function (name) { if (name === "-") { return /*#__PURE__*/React.createElement(MenuDivider, { key: name }); } if (name === "highlightCellRules") { return /*#__PURE__*/React.createElement(Option, { key: name, onMouseEnter: showSubMenu, onMouseLeave: hideSubMenu }, /*#__PURE__*/React.createElement("div", { className: "fortune-toolbar-menu-line", key: "div".concat(name) }, conditionformat[name], /*#__PURE__*/React.createElement(SVGIcon, { name: "rightArrow", width: 18 }), /*#__PURE__*/React.createElement("div", { className: "condition-format-sub-menu", style: { display: "none", width: 150 } }, [{ text: "greaterThan", value: ">" }, { text: "lessThan", value: "<" }, { text: "between", value: "[]" }, { text: "equal", value: "=" }, { text: "textContains", value: "()" }, { text: "occurrenceDate", value: conditionformat.yesterday }, { text: "duplicateValue", value: "##" }].map(function (v) { return /*#__PURE__*/React.createElement("div", { className: "condition-format-item", key: v.text, onClick: function onClick() { setOpen(false); showDialog( /*#__PURE__*/React.createElement(ConditionRules, { type: v.text })); }, tabIndex: 0 }, conditionformat[v.text], /*#__PURE__*/React.createElement("span", null, v.value)); })))); } if (name === "itemSelectionRules") { return /*#__PURE__*/React.createElement(Option, { key: name, onMouseEnter: showSubMenu, onMouseLeave: hideSubMenu }, /*#__PURE__*/React.createElement("div", { className: "fortune-toolbar-menu-line" }, conditionformat[name], /*#__PURE__*/React.createElement(SVGIcon, { name: "rightArrow", width: 18 }), /*#__PURE__*/React.createElement("div", { className: "condition-format-sub-menu", style: { display: "none", width: 180 } }, [{ text: "top10", value: conditionformat.top10 }, { text: "top10_percent", value: conditionformat.top10_percent }, { text: "last10", value: conditionformat.last10 }, { text: "last10_percent", value: conditionformat.last10_percent }, { text: "aboveAverage", value: conditionformat.above }, { text: "belowAverage", value: conditionformat.below }].map(function (v) { return /*#__PURE__*/React.createElement("div", { className: "condition-format-item", key: v.text, onClick: function onClick() { setOpen(false); showDialog( /*#__PURE__*/React.createElement(ConditionRules, { type: v.text })); }, tabIndex: 0 }, conditionformat[v.text], /*#__PURE__*/React.createElement("span", null, v.value)); })))); } if (name === "dataBar") { return /*#__PURE__*/React.createElement("div", { className: "fortune-toolbar-menu-line", key: "div".concat(name) }, conditionformat[name], /*#__PURE__*/React.createElement(SVGIcon, { name: "rightArrow", width: 18 })); } if (name === "colorGradation") { return /*#__PURE__*/React.createElement("div", { className: "fortune-toolbar-menu-line", key: "div".concat(name) }, conditionformat[name], /*#__PURE__*/React.createElement(SVGIcon, { name: "rightArrow", width: 18 })); } if (name === "icons") { return /*#__PURE__*/React.createElement("div", { className: "fortune-toolbar-menu-line", key: "div".concat(name) }, conditionformat[name]); } if (name === "newFormatRule") { return /*#__PURE__*/React.createElement("div", { className: "fortune-toolbar-menu-line", key: "div".concat(name) }, conditionformat[name]); } if (name === "deleteRule") { return /*#__PURE__*/React.createElement(Option, { key: name, onMouseEnter: showSubMenu, onMouseLeave: hideSubMenu }, /*#__PURE__*/React.createElement("div", { className: "fortune-toolbar-menu-line" }, conditionformat[name], /*#__PURE__*/React.createElement(SVGIcon, { name: "rightArrow", width: 18 }), /*#__PURE__*/React.createElement("div", { className: "condition-format-sub-menu", style: { display: "none", width: 150 } }, ["deleteSheetRule"].map(function (v) { return /*#__PURE__*/React.createElement("div", { className: "condition-format-item", key: v, style: { padding: "6px 10px" }, onClick: function onClick() { setContext(function (ctx) { updateItem(ctx, "delSheet"); }); }, tabIndex: 0 }, conditionformat[v]); })))); } if (name === "manageRules") { return /*#__PURE__*/React.createElement("div", { className: "fortune-toolbar-menu-line", key: "div".concat(name) }, conditionformat[name]); } return /*#__PURE__*/React.createElement("div", null); }, [conditionformat, hideSubMenu, setContext, setOpen, showDialog, showSubMenu]); return /*#__PURE__*/React.createElement("div", { className: "condition-format" }, /*#__PURE__*/React.createElement(Select, { style: { overflow: "visible" } }, items.map(function (v) { return /*#__PURE__*/React.createElement("div", { key: "option".concat(v) }, getConditionFormatItem(v)); }))); }; export default ConditionalFormat;