view src/streamed-graph.ts @ 9:26d3e4860adc

working on porting graph_view to n3.js. also working on making tests run
author drewp@bigasterisk.com
date Fri, 06 Dec 2019 09:19:43 -0800
parents 6fefd287aff9
children 7ca4ff2088c3
line wrap: on
line source


// these are just for timebank- move them out
import '@polymer/polymer/lib/elements/dom-bind.js';


import { PolymerElement, html } from '@polymer/polymer';
import { customElement, property, computed } from '@polymer/decorators';
import { render } from 'lit-html';
import { graphView } from './graph_view';
import { N3Store } from "n3"

import { StreamedGraphClient } from './streamed_graph_client';

@customElement('streamed-graph')
class StreamedGraph extends PolymerElement {
    @property({ type: String })
    url: string = '';

    @property({ type: Object })
    graph: {version: number, graph: N3Store};

    @property({ type: Boolean })
    expanded: Boolean = false;

    @computed('expanded')
    get expandAction() {
        return this.expanded ? '-' : '+';
    }

    @property({ type: String })
    status: String = '';

    sg: StreamedGraphClient;
    graphView: Element;
    graphViewDirty = true;

    static get template() {
        return html`
            <link rel="stylesheet" href="../src/streamed-graph.css">
            <div id="ui">
                <span class="expander"><button on-click="toggleExpand">{{expandAction}}</button></span>
                StreamedGraph <a href="{{url}}">[source]</a>:
                {{status}}
            </div>
            <div id="graphView"></div>`;
    }

    ready() {
        super.ready();
        this.graph = {version: -1, graph: null};
        this.graphView = this.shadowRoot.getElementById("graphView");

        this._onUrl(this.url); // todo: watch for changes and rebuild
    }

    toggleExpand(ev) {
        this.expanded = !this.expanded;
        if (this.expanded) {
            this.redrawGraph()
        } else {
            this.graphViewDirty = false;
            render(null, this.graphView);
        }
    }

    redrawGraph() {
        this.graphViewDirty = true;
        requestAnimationFrame(this._redrawLater.bind(this));
    }

    _onUrl(url) {
        if (this.sg) { this.sg.close(); }
        this.sg = new StreamedGraphClient(
            url,
            this.onGraphChanged.bind(this),
            this.set.bind(this, 'status'),
            [],//window.NS,
            []
        );
    }

    onGraphChanged() {
        this.graph = { version: this.graph.version + 1, graph: this.sg.store };
        if (this.expanded) {
            this.redrawGraph();
        }
    }

    _redrawLater() {
        if (!this.graphViewDirty) return;
        render(graphView(this.graph.graph), this.graphView);
        this.graphViewDirty = false;
    }


}