UNPKG

@gpa-gemstone/react-graph

Version:
180 lines 17.1 kB
"use strict"; // ****************************************************************************************************** // AggregatingCircles.tsx - Gbtc // // Copyright © 2023, 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: // ---------------------------------------------------------------------------------------------------- // 03/02/2023 - C Lackner // Generated original version of source code. // // ****************************************************************************************************** var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; Object.defineProperty(exports, "__esModule", { value: true }); var React = require("react"); var GraphContext_1 = require("./GraphContext"); var Circle_1 = require("./Circle"); var AggregatingCircles = function (props) { /* Circle that will aggregate into larger circles */ var context = React.useContext(GraphContext_1.GraphContext); var _a = __read(React.useState([]), 2), aggregate = _a[0], setAggregate = _a[1]; // Optional prop to prevent aggregating into groups var useSingleAggregation = props.useSingleAggregation === undefined ? false : props.useSingleAggregation; // Re-calculate aggregation when data or context changes React.useEffect(function () { setAggregate(cluster(props.data)); }, [props.data, context.UpdateFlag]); // Cluster circles based on aggregation criteria function cluster(circles) { var singleCircles = circles.map(function (c) { return (__assign({}, c)); }); var clusters = []; // Define transformation functions using the context var fctn = { YInverseTransformation: context.YInverseTransformation, XInverseTransformation: context.XInverseTransformation, YTransformation: context.YTransformation, XTransformation: context.XTransformation }; var _loop_1 = function (i) { var c1 = clusters.findIndex(function (c) { return c.Indices.includes(i); }); var _loop_3 = function (j) { var _a; if (!props.canAggregate(singleCircles[i], singleCircles[j], fctn)) return "continue"; var c2 = clusters.findIndex(function (c) { return c.Indices.includes(j); }); // Handle various scenarios for merging and creating new clusters if (c1 < 0 && c2 < 0) { clusters.push({ Indices: [i, j], Aggregate: null }); c1 = clusters.length - 1; return "continue"; } if (c1 === c2) return "continue"; if (c1 >= 0 && c2 < 0) { clusters[c1].Indices.push(j); } if (c1 < 0 && c2 >= 0) { clusters[c2].Indices.push(i); c1 = clusters.length - 1; return "continue"; } if (c1 >= 0 && c2 >= 0) { (_a = clusters[c1].Indices).push.apply(_a, __spreadArray([], __read(clusters[c2].Indices), false)); clusters.splice(c2, 1); c1 = clusters.findIndex(function (c) { return c.Indices.includes(i); }); } }; for (var j = i + 1; j < singleCircles.length; j = j + 1) { _loop_3(j); } }; // Cluster start to cluster based on single circles for (var i = 0; i < singleCircles.length; i = i + 1) { _loop_1(i); } var NClusters = clusters.length; var NClustered = clusters.reduce(function (s, c) { return s + c.Indices.length; }, 0); clusters.forEach(function (c) { c.Aggregate = props.onAggregation(singleCircles.filter(function (x, i) { return c.Indices.includes(i); }), fctn); }); // If not using single aggregation mode, perform further aggregation if (!useSingleAggregation && NClusters > 0) { var _loop_2 = function () { NClusters = clusters.length; NClustered = clusters.reduce(function (s, c) { return s + c.Indices.length; }, 0); // clusters with index in 0 are replaced with clusters in index 1 (always remove i) var clusterReplacements = []; var _loop_4 = function (i) { var replacementCluster = i; var _loop_5 = function (j) { var _b; if (!props.canAggregate(clusters[i].Aggregate, clusters[j].Aggregate, fctn)) return "continue"; clusterReplacements.push(i); (_b = clusters[j].Indices).push.apply(_b, __spreadArray([], __read(clusters[i].Indices), false)); clusters[j].Aggregate = props.onAggregation(singleCircles.filter(function (x, l) { return clusters[j].Indices.includes(l); }), fctn); replacementCluster = j; return "break"; }; for (var j = i + 1; j < clusters.length; j = j + 1) { var state_1 = _loop_5(j); if (state_1 === "break") break; } var _loop_6 = function (j) { if (clusters.findIndex(function (cl) { return cl.Indices.includes(j); }) > -1) return "continue"; if (!props.canAggregate(clusters[replacementCluster].Aggregate, singleCircles[j], fctn)) return "continue"; clusters[replacementCluster].Indices.push(j); clusters[replacementCluster].Aggregate = props.onAggregation(singleCircles.filter(function (x, l) { return clusters[replacementCluster].Indices.includes(l); }), fctn); }; for (var j = 0; j < singleCircles.length; j = j + 1) { _loop_6(j); } }; for (var i = 0; i < clusters.length; i = i + 1) { _loop_4(i); } clusters = clusters.filter(function (c, l) { return !clusterReplacements.includes(l); }); }; do { _loop_2(); } while (NClusters !== clusters.length || NClustered !== clusters.reduce(function (s, c) { return s + c.Indices.length; }, 0)); } // Return a combination of single circles not in any cluster and the aggregated circles return __spreadArray(__spreadArray([], __read(singleCircles.filter(function (c, i) { return clusters.findIndex(function (cl) { return cl.Indices.includes(i); }) === -1; })), false), __read(clusters.map(function (c) { return c.Aggregate; })), false); } return (React.createElement("g", null, aggregate.map(function (c, i) { return React.createElement(Circle_1.ContextlessCircle, { key: i.toString() + (c.text === undefined ? '' : c.text), circleProps: c, context: context }); }))); }; exports.default = AggregatingCircles; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdncmVnYXRpbmdDaXJjbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0FnZ3JlZ2F0aW5nQ2lyY2xlcy50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHlHQUF5RztBQUN6RyxpQ0FBaUM7QUFDakMsRUFBRTtBQUNGLHFFQUFxRTtBQUNyRSxFQUFFO0FBQ0Ysd0dBQXdHO0FBQ3hHLHdHQUF3RztBQUN4RyxzR0FBc0c7QUFDdEcsd0ZBQXdGO0FBQ3hGLEVBQUU7QUFDRiwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLHdHQUF3RztBQUN4Ryx3R0FBd0c7QUFDeEcsNEVBQTRFO0FBQzVFLEVBQUU7QUFDRiw4QkFBOEI7QUFDOUIsd0dBQXdHO0FBQ3hHLDBCQUEwQjtBQUMxQixtREFBbUQ7QUFDbkQsRUFBRTtBQUNGLHlHQUF5Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHekcsNkJBQStCO0FBQy9CLCtDQUE4RDtBQUM5RCxtQ0FBb0U7QUFzQnBFLElBQU0sa0JBQWtCLEdBQUcsVUFBQyxLQUFhO0lBQ3ZDOztNQUVFO0lBRUYsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQywyQkFBWSxDQUFDLENBQUE7SUFDeEMsSUFBQSxLQUFBLE9BQTRCLEtBQUssQ0FBQyxRQUFRLENBQWlCLEVBQUUsQ0FBQyxJQUFBLEVBQTdELFNBQVMsUUFBQSxFQUFFLFlBQVksUUFBc0MsQ0FBQTtJQUVwRSxtREFBbUQ7SUFDakQsSUFBTSxvQkFBb0IsR0FBRyxLQUFLLENBQUMsb0JBQW9CLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQztJQUU3Ryx3REFBd0Q7SUFDeEQsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNaLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQyxFQUFFLENB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