@gpa-gemstone/react-graph
Version:
Interactive UI Components for GPA products
180 lines • 17.1 kB
JavaScript
;
// ******************************************************************************************************
// 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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