Skip to content
Snippets Groups Projects
graph.js 3.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • /**
    import ManagedData from "./structures/manageddata";
    
    import { PLUGIN_PATH, COLOR_PALETTE } from "../../config";
    
    Maximilian Giller's avatar
    Maximilian Giller committed
    
    
    const LINK_NAME_CONNECTOR = " → ";
    
    
    Maximilian Giller's avatar
    Maximilian Giller committed
    
    
    Maximilian Giller's avatar
    Maximilian Giller committed
    
    
    export const GRAPH_NODES = "nodes";
    export const GRAPH_LINKS = "links";
    
    Maximilian Giller's avatar
    Maximilian Giller committed
    
    
    export const IMAGE_SIZE = 12;
    export const IMAGE_SRC = PLUGIN_PATH + "datasets/images/";
    
    export const JSON_CONFIG = PLUGIN_PATH + "datasets/aud1v2.json";
    
    Maximilian Giller's avatar
    Maximilian Giller committed
    
    
    export const STOP_PHYSICS_DELAY = 5000; // ms
    
    
    export class PREVIOUSGraph extends ManagedData {
    
    Maximilian Giller's avatar
    Maximilian Giller committed
        constructor(data) {
            super(Graph.addIdentifiers(data));
    
            this.calculateNodeTypes();
    
    Maximilian Giller's avatar
    Maximilian Giller committed
            this.physicsDelay = STOP_PHYSICS_DELAY;
    
            this.physicsStopTimeoutId = undefined;
        }
    
    Maximilian Giller's avatar
    Maximilian Giller committed
    
    
        restartSimulation() {
            if (this.physicsStopTimeoutId !== undefined) {
                clearTimeout(this.physicsStopTimeoutId);
            }
    
    
            this.data = Graph.addIdentifiers(this.getCleanData(this.data, false));
            this.triggerOnChange();
    
    
            // Deactivate physics after a short delay
            this.physicsStopTimeoutId = setTimeout(() => {
                this.stopPhysics();
    
                this.storeCurrentData("Physics stopped", false);
    
                this.physicsStopTimeoutId = undefined;
            }, this.physicsDelay);
    
    Maximilian Giller's avatar
    Maximilian Giller committed
        stopPhysics() {
    
    Maximilian Giller's avatar
    Maximilian Giller committed
            this.data[GRAPH_NODES].forEach((n) => {
    
    Maximilian Giller's avatar
    Maximilian Giller committed
                n.fx = n.x;
                n.fy = n.y;
            });
    
    Maximilian Giller's avatar
    Maximilian Giller committed
    
        existsLink(sourceId, targetId) {
    
    Maximilian Giller's avatar
    Maximilian Giller committed
            const links = this.data[GRAPH_LINKS];
    
    Maximilian Giller's avatar
    Maximilian Giller committed
    
            for (var i = 0; i < links.length; i++) {
                var link = links[i];
                if (
    
                    linkdeleteLink[LINK_SOURCE][NODE_ID] === sourceId &&
    
    Maximilian Giller's avatar
    Maximilian Giller committed
                    link[LINK_TARGET][NODE_ID] === targetId
                ) {
                    return true;
                }
            }
    
            return false;
    
    Maximilian Giller's avatar
    Maximilian Giller committed
    
    
        getCleanLink(link, simulationParameters) {
    
    Maximilian Giller's avatar
    Maximilian Giller committed
            var cleanLink = {};
    
    
    Maximilian Giller's avatar
    Maximilian Giller committed
            // Assuming that all nodes are valid, there are two possible formats
            // 1. source and target are node objects
            if (link[LINK_SOURCE][NODE_ID] !== undefined) {
                // Source and target nodes
                // Node ids will be converted to complete node objects on running graphs, gotta convert back
                cleanLink[LINK_SOURCE] = link[LINK_SOURCE][NODE_ID];
                cleanLink[LINK_TARGET] = link[LINK_TARGET][NODE_ID];
            } else {
                // 2. source and target are just node ids
                cleanLink[LINK_SOURCE] = link[LINK_SOURCE];
                cleanLink[LINK_TARGET] = link[LINK_TARGET];
            }
    
    Maximilian Giller's avatar
    Maximilian Giller committed
    
            return cleanLink;
    
    
        existsNodeId(nodeId) {
    
    Maximilian Giller's avatar
    Maximilian Giller committed
            var nodes = this.data[GRAPH_NODES];
    
            for (var i = 0; i < nodes.length; i++) {
                if (nodes[i][NODE_ID] === nodeId) {
                    return true;
                }
            }
            return false;
    
    
        getUnusedNodeId() {
            var id;
            do {
    
    Maximilian Giller's avatar
    Maximilian Giller committed
                id = this.getRandomString();
            } while (this.existsNodeId(id));
    
            return id;
    
    
        getRandomString(length = 8) {
    
    Maximilian Giller's avatar
    Maximilian Giller committed
            // Move to global helpers
    
            // Based on: https://stackoverflow.com/a/1349426/7376120
            var characters =
                "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
            var charactersLength = characters.length;
    
            var result = "";
            for (var i = 0; i < length; i++) {
                result += characters.charAt(
                    Math.floor(Math.random() * charactersLength)
                );
            }
            return result;
    
        static toStr(item) {
            if (item === undefined) {
                return "UNDEFINED";
            }
    
            if (item.node) {
    
                return item[NODE_LABEL];
    
            } else if (item.link) {
                return (
    
                    Graph.toStr(item[LINK_SOURCE]) +
    
                    LINK_NAME_CONNECTOR +
    
                    Graph.toStr(item[LINK_TARGET])
    
                );
            } else {
                return "UNDEFINED";
            }
        }