UNPKG

@lonli-lokli/react-mosaic-component

Version:
156 lines (154 loc) 6.02 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // libs/react-mosaic-component/src/lib/MosaicRoot.tsx var MosaicRoot_exports = {}; __export(MosaicRoot_exports, { MosaicRoot: () => MosaicRoot }); module.exports = __toCommonJS(MosaicRoot_exports); var import_lodash_es = require("lodash-es"); var import_react = __toESM(require("react"), 1); var import_contextTypes = require("./contextTypes.cjs"); var import_Split = require("./Split.cjs"); var import_BoundingBox = require("./util/BoundingBox.cjs"); var import_mosaicUtilities = require("./util/mosaicUtilities.cjs"); var import_MosaicTabs = require("./MosaicTabs.cjs"); var MosaicRoot = class extends import_react.default.PureComponent { static contextType = import_contextTypes.MosaicContext; render() { const naryRoot = (0, import_mosaicUtilities.convertLegacyToNary)(this.props.root); if (naryRoot === null) { return null; } return /* @__PURE__ */ import_react.default.createElement("div", { className: "mosaic-root" }, this.renderRecursively(naryRoot, (0, import_BoundingBox.emptyBoundingBox)(), [])); } // The recursive renderer is now updated for the n-ary tree structure renderRecursively(node, boundingBox, path) { if (typeof node === "string" || typeof node === "number") { return /* @__PURE__ */ import_react.default.createElement( "div", { key: node, className: "mosaic-tile", style: { ...(0, import_BoundingBox.boundingBoxAsStyles)(boundingBox) } }, this.props.renderTile(node, path) ); } switch (node.type) { // Case 2: Node is a split container case "split": { const { children, direction } = node; const splitPercentages = node.splitPercentages ?? children.map(() => 100 / children.length); const childBoxes = (0, import_BoundingBox.splitBoundingBox)( boundingBox, splitPercentages, direction ); const renderedChildren = children.flatMap((child, index) => { const childPath = path.concat(index); const elements = [ this.renderRecursively(child, childBoxes[index], childPath) ]; if (index < children.length - 1) { elements.push(this.renderSplit(node, path, index, boundingBox)); } return elements; }); const flattenedElements = (0, import_lodash_es.flatten)(renderedChildren).filter(nonNullElement); return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, flattenedElements.map( (element, index) => import_react.default.cloneElement(element, { key: element.key || `${path.join("-")}-${index}` }) )); } // Case 3: Node is a tab container case "tabs": { return /* @__PURE__ */ import_react.default.createElement( import_MosaicTabs.MosaicTabs, { node, path, renderTile: this.props.renderTile, renderTabToolbar: this.props.renderTabToolbar, boundingBox, renderTabTitle: this.props.renderTabTitle, renderTabButton: this.props.renderTabButton, canClose: this.props.canClose } ); } default: console.error("Unknown mosaic node type:", node); return null; } } renderSplit(parentNode, path, splitIndex, boundingBox) { const { resize } = this.props; if (resize !== "DISABLED" && parentNode.children.length > 1) { const { direction } = parentNode; const splitPercentages = parentNode.splitPercentages ?? parentNode.children.map(() => 100 / parentNode.children.length); return /* @__PURE__ */ import_react.default.createElement( import_Split.Split, { key: `split-${path.join("-")}-${splitIndex}`, ...resize, direction, boundingBox, splitIndex, splitPercentages, onChange: (percentages) => this.onResize(percentages, path, true), onRelease: (percentages) => this.onResize(percentages, path, false) } ); } else { return null; } } // onResize now handles an array of percentages onResize = (percentages, path, suppressOnRelease) => { this.context.mosaicActions.updateTree( [ { path, // Path to the parent MosaicSplitNode spec: { splitPercentages: { $set: percentages } } } ], { suppressOnRelease } ); }; }; function nonNullElement(x) { return x !== null; }