UNPKG

@gpa-gemstone/react-interactive

Version:
75 lines (74 loc) 4.65 kB
"use strict"; //****************************************************************************************************** // LayoutGrid.tsx - Gbtc // // Copyright (c) 2020, Grid Protection Alliance. All Rights Reserved. // // Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See // the NOTICE file distributed with this work for additional information regarding copyright ownership. // The GPA licenses this file to you under the MIT License (MIT), the "License"; you may not use this // file except in compliance with the License. You may obtain a copy of the License at: // // http://opensource.org/licenses/MIT // // Unless agreed to in writing, the subject software distributed under the License is distributed on an // "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the // License for the specific language `governing permissions and limitations. // // Code Modification History: // ---------------------------------------------------------------------------------------------------- // 06/10/2024 - Collins Self // Generated original version of source code. // //****************************************************************************************************** var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var react_1 = __importDefault(require("react")); var LayoutGrid = function (props) { var _a = react_1.default.useState([]), rows = _a[0], setRows = _a[1]; var totalNumOfItems = react_1.default.Children.count(props.children); react_1.default.useEffect(function () { var rowsOnGrid = []; var lowestSquare = Math.floor(Math.sqrt(totalNumOfItems)); var numOfRows = lowestSquare; // Default values assumes a perfect square grid var rowsNeedingExtraItems = totalNumOfItems - Math.pow(lowestSquare, 2); // Will add these overflow items to beginning rows 1:1 if (props.ColMax !== undefined && props.ColMax <= lowestSquare) { rowsNeedingExtraItems = 0; var itemsInRow = props.ColMax; numOfRows = Math.ceil(totalNumOfItems / itemsInRow); } // Checks if items would overfill the perfect square grid plus another row, then adds that row if needed if (totalNumOfItems >= Math.pow(lowestSquare, 2) + lowestSquare) { rowsNeedingExtraItems -= lowestSquare; // "extra" items taken from final cols numOfRows = lowestSquare + 1; // moving "extras" to another row } // Create rows, balanced with extra items var numOfItemsRemaining = totalNumOfItems; for (var i = 0; i < rowsNeedingExtraItems && numOfItemsRemaining >= 0; ++i) { var itemsInRow = lowestSquare + 1; // adding "extras" to another col var row = { StartIndex: totalNumOfItems - numOfItemsRemaining, NumOfCols: itemsInRow }; numOfItemsRemaining -= itemsInRow; rowsOnGrid.push(row); // push a row onto array with appropriate number of items } for (var i = 0; i < numOfRows - rowsNeedingExtraItems && numOfItemsRemaining >= 0; ++i) { var itemsInRow = lowestSquare === props.ColMax ? props.ColMax : lowestSquare; var row = { StartIndex: totalNumOfItems - numOfItemsRemaining, NumOfCols: Math.min(numOfItemsRemaining, itemsInRow) }; numOfItemsRemaining -= itemsInRow; rowsOnGrid.push(row); // push a row onto array with appropriate number of items } setRows(rowsOnGrid); }, [totalNumOfItems, props.ColMax]); function generateColumns(currentRow) { var ItemDivs = []; for (var i = 0; i < currentRow.NumOfCols; ++i) { var padding = i === 0 ? 'pl-1 pr-1' : 'pr-1 pl-0'; var ItemDiv = react_1.default.createElement("div", { key: i, className: 'col ' + padding, style: { height: '100%', width: "".concat(100 / currentRow.NumOfCols, "%") } }, react_1.default.Children.toArray(props.children)[currentRow.StartIndex + i]); ItemDivs.push(ItemDiv); } return ItemDivs; } return (react_1.default.createElement("div", { className: 'container-fluid p-0 h-100', style: { overflowY: 'auto' } }, rows.map(function (row, i) { return (react_1.default.createElement("div", { key: i, className: 'row pb-1 m-0', style: { height: "".concat(100 / Math.min(rows.length, props.RowsPerPage), "%") } }, generateColumns(row))); }))); }; exports.default = LayoutGrid;