UNPKG

@grandlinex/react-components

Version:
102 lines (101 loc) 4.79 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const react_1 = __importStar(require("react")); const react_icons_1 = require("@grandlinex/react-icons"); const ContentSwitcher_1 = __importDefault(require("../ContentSwitch/ContentSwitcher")); const IconButton_1 = require("../../button/IconButton"); const util_1 = require("../../../util"); function getPos(ref, offset) { if (!ref || !ref.current) { return -1; } const min = ref.current.offsetTop || 0; return min - (offset || 0); } function scrollTo(container, element, offset) { if (!container || !container.current || !element) { return false; } container.current.scrollTo({ top: getPos(element, offset), left: 0, behavior: 'smooth', }); return true; } const PortalStepperEl = (props) => { const { rRef, el, collapse } = props; const [open, setOpen] = (0, react_1.useState)(!el.collapsed); return (react_1.default.createElement("div", { ref: rRef, key: el.key }, react_1.default.createElement("h4", null, react_1.default.createElement("span", { className: (0, util_1.cnx)([!!collapse, 'glx-pointer']), onClick: () => setOpen(!open) }, el.headerName ?? el.name), collapse ? (react_1.default.createElement(IconButton_1.IconButton, { className: "glx-mx-8", onClick: () => setOpen(!open) }, open ? react_1.default.createElement(react_icons_1.IOChevronDown, null) : react_1.default.createElement(react_icons_1.IOChevronForward, null))) : null), (collapse && open) || !collapse ? react_1.default.createElement("div", null, el.render) : null)); }; const PortalStepper = (props) => { const { width, height, conf, className, offset = 0, style, collapse } = props; const cName = (0, util_1.useCnx)('portal-stepper-main', className); const [cur, setCur] = (0, react_1.useState)(0); const refField = (0, react_1.useMemo)(() => conf.map(() => (0, react_1.createRef)()), [conf]); const bodyRef = (0, react_1.createRef)(); const scrollFc = (event) => { const container = event.target; const { scrollTop, scrollHeight, offsetHeight } = container; let last = null; refField.forEach((el, index) => { const pos = getPos(el, (offset || 0) + 10); if (pos < scrollTop && pos !== -1) { last = index; } }); if (scrollTop + offsetHeight === scrollHeight) { last = refField.length - 1; } if ((last && last < 0) || !last || conf[last].hidden) { last = conf.findIndex((e) => !e.hidden); } setCur(last || 0); }; (0, react_1.useEffect)(() => { const rr = bodyRef.current; rr?.addEventListener('scroll', scrollFc); return () => { rr?.removeEventListener('scroll', scrollFc); }; }); return (react_1.default.createElement("div", { style: { ...style, width, height }, className: cName }, react_1.default.createElement(ContentSwitcher_1.default, { parentState: [cur, setCur], onChange: (el) => { const sel = el.index; setCur(sel); const tar = refField[sel]; scrollTo(bodyRef, tar, offset); }, items: conf }), react_1.default.createElement("div", { ref: bodyRef, className: "portal-stepper--content" }, conf.map((el, index) => el.hidden ? null : (react_1.default.createElement(PortalStepperEl, { key: el.key, rRef: refField[index], el: el, collapse: el.collapse ?? collapse })))))); }; exports.default = PortalStepper;