diff src/index.ts @ 33:b82c05e22d9a

change to npm with a build that worked better as a local package to be shared
author drewp@bigasterisk.com
date Tue, 24 Dec 2019 20:30:27 -0800
parents src/streamed-graph.ts@e54941d93356
children 8b4dc9e87b56
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/index.ts	Tue Dec 24 20:30:27 2019 -0800
@@ -0,0 +1,107 @@
+
+// these are just for timebank- move them out
+import '@polymer/polymer/lib/elements/dom-bind.js';
+
+import { PolymerElement, html } from '@polymer/polymer';
+import { render } from 'lit-html';
+import { N3Store } from "n3"
+import { customElement, property, computed } from '@polymer/decorators';
+
+import { GraphView } from './graph_view';
+import { StreamedGraphClient } from './streamed_graph_client';
+export { StreamedGraphClient } from './streamed_graph_client';
+
+interface VersionedGraph { version: number, store: N3Store | undefined };
+
+@customElement('streamed-graph')
+class StreamedGraph extends PolymerElement {
+    @property({ type: String })
+    url: string = '';
+
+    @property({ type: Object })
+    graph!: VersionedGraph;
+
+    @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, store: undefined };
+        this.graphView = (this.shadowRoot as ShadowRoot).getElementById("graphView") as Element;
+
+        this._onUrl(this.url); // todo: watch for changes and rebuild
+        if (this.expanded) {
+            this.redrawGraph();
+        }
+    }
+
+    toggleExpand() {
+        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: string) {
+        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,
+            store: this.sg.store
+        };
+        if (this.expanded) {
+            this.redrawGraph();
+        }
+    }
+
+    _redrawLater() {
+        if (!this.graphViewDirty) return;
+
+        if ((this.graph as VersionedGraph).store && this.graph.store) {
+            render(new GraphView(this.url, this.graph.store).makeTemplate(), this.graphView);
+            this.graphViewDirty = false;
+        } else {
+            render(html`<span>waiting for data...</span>`, this.graphView);
+        }
+    }
+}
\ No newline at end of file