UNPKG

organism-react-sort-by

Version:
221 lines (186 loc) 7.36 kB
"use strict"; var _interopRequireDefault = require("reshow-runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("reshow-runtime/helpers/interopRequireWildcard"); exports.__esModule = true; exports["default"] = void 0; var _objectSpread2 = _interopRequireDefault(require("reshow-runtime/helpers/objectSpread2")); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("reshow-runtime/helpers/objectWithoutPropertiesLoose")); var _react = _interopRequireWildcard(require("react")); var _seturl = _interopRequireWildcard(require("seturl")); var _Sort = _interopRequireDefault(require("ricon/Sort")); var _Dropdown = _interopRequireDefault(require("ricon/Dropdown")); var _reactAtomicMolecule = require("react-atomic-molecule"); var _getObjectValue = _interopRequireDefault(require("get-object-value")); var _winDoc = require("win-doc"); var _callFunc = _interopRequireDefault(require("call-func")); var _jsxRuntime = require("react/jsx-runtime"); var _SortIcon; var _excluded = ["inactiveStyle", "activeStyle", "data-sort", "component", "sortKeyName", "descKeyName", "sort2KeyName", "sliceKeyName", "icon", "children", "onClick", "sort", "desc"]; var useSortLink = function useSortLink(props) { var _props$inactiveStyle = props.inactiveStyle, inactiveStyle = _props$inactiveStyle === void 0 ? { fill: "#ccc" } : _props$inactiveStyle, _props$activeStyle = props.activeStyle, activeStyle = _props$activeStyle === void 0 ? {} : _props$activeStyle, _props$dataSort = props["data-sort"], nextSort = _props$dataSort === void 0 ? "" : _props$dataSort, _props$component = props.component, component = _props$component === void 0 ? "a" : _props$component, _props$sortKeyName = props.sortKeyName, sortKeyName = _props$sortKeyName === void 0 ? "sort" : _props$sortKeyName, _props$descKeyName = props.descKeyName, descKeyName = _props$descKeyName === void 0 ? "desc" : _props$descKeyName, _props$sort2KeyName = props.sort2KeyName, sort2KeyName = _props$sort2KeyName === void 0 ? "sortt2" : _props$sort2KeyName, _props$sliceKeyName = props.sliceKeyName, sliceKeyName = _props$sliceKeyName === void 0 ? "slice" : _props$sliceKeyName, _props$icon = props.icon, icon = _props$icon === void 0 ? true : _props$icon, children = props.children, onClick = props.onClick, currentSort = props.sort, desc = props.desc, others = (0, _objectWithoutPropertiesLoose2["default"])(props, _excluded); var lastProps = (0, _react.useRef)({}); lastProps.current = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, props), {}, { currentSort: currentSort, nextSort: nextSort }); var isSorted = function isSorted() { var _lastProps$current = lastProps.current, nextSort = _lastProps$current.nextSort, currentSort = _lastProps$current.currentSort; return nextSort === currentSort; }; var getNextDesc = function getNextDesc(thisDesc, invert) { var _ref, _thisDesc; thisDesc = (_ref = (_thisDesc = thisDesc) !== null && _thisDesc !== void 0 ? _thisDesc : lastProps.current.desc) !== null && _ref !== void 0 ? _ref : (0, _seturl.getUrl)(descKeyName); var nextDesc; var bSorted = isSorted(); if (bSorted) { nextDesc = -1 === thisDesc * 1 ? 1 : -1; } else { nextDesc = 1; } if (invert) { nextDesc = nextDesc > 0 ? -1 : 1; } return nextDesc; }; var _useState = (0, _react.useState)(function () { return { href: "#" + nextSort, desc: getNextDesc(null, true) }; }), _useState$ = _useState[0], stateHref = _useState$.href, stateDesc = _useState$.desc, setState = _useState[1]; others["data-sort"] = nextSort; others["data-desc"] = stateDesc; (0, _react.useEffect)(function () { if (isSorted()) { setState(function (prev) { return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, prev), {}, { desc: desc }); }); } }, [desc]); var handler = { click: function click(e) { var _lastProps$current2 = lastProps.current, sortKeyName = _lastProps$current2.sortKeyName, onClick = _lastProps$current2.onClick; var target = e.currentTarget; var nextDesc = getNextDesc(target.getAttribute("data-desc")); target.setAttribute("data-desc", nextDesc); var nextSort = target.getAttribute("data-sort"); var sort2 = target.getAttribute("data-sort2"); var slice = target.getAttribute("data-slice"); /** * Call before get data-url * because onclick possible change url. */ e.nextSort = nextSort; e.nextDesc = nextDesc; var isContinue = (0, _callFunc["default"])(onClick, [e]); // end call onClick ---> var url = target.getAttribute("data-url") || (0, _winDoc.doc)().URL; if (nextSort) { url = (0, _seturl["default"])(sortKeyName, nextSort, url); url = (0, _seturl["default"])(descKeyName, nextDesc, url); } if (sort2) { url = (0, _seturl["default"])(sort2KeyName, sort2, url); url = (0, _seturl["default"])(sliceKeyName, slice, url); } target.href = url; setState({ href: url, desc: nextDesc }); return isContinue; } }; return { children: children, component: component, handler: handler, href: stateHref, desc: getNextDesc(stateDesc, true), icon: icon, inactiveStyle: inactiveStyle, activeStyle: activeStyle, isSorted: isSorted, getNextDesc: getNextDesc, others: others }; }; var SortLink = function SortLink(props) { var _useSortLink = useSortLink(props), children = _useSortLink.children, component = _useSortLink.component, handler = _useSortLink.handler, href = _useSortLink.href, desc = _useSortLink.desc, icon = _useSortLink.icon, inactiveStyle = _useSortLink.inactiveStyle, activeStyle = _useSortLink.activeStyle, isSorted = _useSortLink.isSorted, getNextDesc = _useSortLink.getNextDesc, others = _useSortLink.others; var child = children; if (icon) { var bSorted = isSorted(); var thisIcon = bSorted ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Dropdown["default"], { type: desc > 0 ? null : "up" }) : _SortIcon || (_SortIcon = /*#__PURE__*/(0, _jsxRuntime.jsx)(_Sort["default"], {})); var iconStyle = bSorted ? activeStyle : inactiveStyle; child = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactAtomicMolecule.SemanticUI, { style: Styles.inner, children: [children, /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactAtomicMolecule.Icon, { style: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, Styles.icon), iconStyle), children: thisIcon })] }); } return (0, _reactAtomicMolecule.build)(component)((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, others), {}, { onClick: handler.click, href: href }), child); }; var _default = SortLink; exports["default"] = _default; var Styles = { icon: { width: 20, height: 20, verticalAlign: "bottom" }, inner: { whiteSpace: "nowrap" } }; module.exports = exports.default;