Mercurial > code > home > repos > streamed-graph
annotate src/elements/graph-view/GraphView.ts @ 129:f47661b9ed34
merge
author | drewp@bigasterisk.com |
---|---|
date | Fri, 05 May 2023 21:27:24 -0700 |
parents | 5a1a79f54779 |
children | cf642d395be4 |
rev | line source |
---|---|
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
1 import Immutable from "immutable"; |
128 | 2 import { LitElement, PropertyValues, TemplateResult, html } from "lit"; |
3 import { customElement, property } from "lit/decorators.js"; | |
109 | 4 import { NamedNode, Quad, Store, Term } from "n3"; |
128 | 5 import { MultiStore } from "../../MultiStore"; |
6 import { Patch } from "../../Patch"; | |
110 | 7 import { |
8 AlignedTable, | |
9 FreeStatements, | |
10 Layout, | |
11 PredRow, | |
12 SubjRow, | |
128 | 13 } from "../../layout/Layout"; |
14 import { ViewConfig } from "../../layout/ViewConfig"; | |
15 import { uniqueSortedTerms } from "../../layout/rdf_value"; | |
16 import { SuffixLabels } from "../../layout/suffixLabels"; | |
17 import { graphViewStyle, pageStyle } from "../../style"; | |
109 | 18 import { NodeDisplay } from "./NodeDisplay"; |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
19 type UriSet = Immutable.Set<NamedNode>; |
109 | 20 |
128 | 21 @customElement("graph-view") |
22 export class GraphView extends LitElement { | |
23 @property() graph: MultiStore | null = null; | |
24 @property() viewEl: HTMLElement | null = null; | |
25 | |
26 viewConfig: ViewConfig | null = null; | |
27 | |
28 nodeDisplay: NodeDisplay | null = null; | |
29 constructor() { | |
30 super(); | |
31 } | |
32 | |
33 static styles = [pageStyle, graphViewStyle]; | |
34 update(changedProperties: PropertyValues) { | |
35 if (changedProperties.has("graph") && this.graph) { | |
36 // const viewUri = new NamedNode(this.viewEl?.getAttribute('uri')) | |
37 const viewUri = new NamedNode(new URL("#view", document.baseURI).href); | |
38 this.viewConfig = new ViewConfig(this.graph, viewUri); | |
39 | |
40 // "when viewconfig is updated..." | |
41 setTimeout(()=>this.requestUpdate(), 1000) | |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
42 |
128 | 43 this.graph.graphChanged.subscribe(this.onChange?.bind(this)); |
44 } | |
45 super.update(changedProperties); | |
46 } | |
47 | |
48 onChange(p: Patch) { | |
49 this.requestUpdate(); | |
50 } | |
51 | |
52 render() { | |
53 if (!this.graph) { | |
54 return; | |
55 } | |
56 return this.makeTemplate(this.graph); | |
57 } | |
58 | |
59 makeTemplate(graph: MultiStore): TemplateResult { | |
60 if (!this.viewConfig) { | |
61 throw new Error(); | |
62 } | |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
63 const layout = new Layout(this.viewConfig); |
128 | 64 const lr = layout.plan(graph); |
15
7ca4ff2088c3
managed to use a newer ts or something, so this includes a bunch of type fixes too
drewp@bigasterisk.com
parents:
9
diff
changeset
|
65 |
84
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
66 const labels = new SuffixLabels(); |
128 | 67 this._addLabelsForAllTerms(graph, labels); |
68 labels.planDisplayForNode(this.viewConfig.viewRoot); // todo shoudltn be needed | |
84
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
69 this.nodeDisplay = new NodeDisplay(labels); |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
70 let viewTitle = html` (no view)`; |
128 | 71 viewTitle = html` using view |
72 <a href="${this.viewConfig.viewRoot.value}" | |
73 >{this.nodeDisplay.render(this.viewConfig.viewRoot)}</a | |
74 >`; | |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
75 return html` |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
76 <section> |
128 | 77 <h2>View: ${viewTitle}</h2> |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
78 <div> |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
79 <!-- todo: graphs and provenance. |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
80 These statements are all in the |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
81 <span data-bind="html: $root.createCurie(graphUri())">...</span> graph.--> |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
82 </div> |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
83 ${lr.sections.map(this._renderSection.bind(this))} |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
84 </section> |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
85 `; |
84
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
86 } |
8
6fefd287aff9
closer- element now holds a changing graph, but can't draw it yet
drewp@bigasterisk.com
parents:
diff
changeset
|
87 |
97 | 88 _addLabelsForAllTerms(graph: Store, labels: SuffixLabels) { |
89 graph.forEach( | |
84
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
90 (q: Quad) => { |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
91 if (q.subject.termType === "NamedNode") { |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
92 labels.planDisplayForNode(q.subject); |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
93 } |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
94 if (q.predicate.termType === "NamedNode") { |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
95 labels.planDisplayForNode(q.predicate); |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
96 } |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
97 if (q.object.termType === "NamedNode") { |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
98 labels.planDisplayForNode(q.object); |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
99 } |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
100 if (q.object.termType === "Literal" && q.object.datatype) { |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
101 labels.planDisplayForNode(q.object.datatype); |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
102 } |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
103 }, |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
104 null, |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
105 null, |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
106 null, |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
107 null |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
108 ); |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
109 } |
118 | 110 |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
111 _renderSection(section: AlignedTable | FreeStatements) { |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
112 if ((section as any).columnHeaders) { |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
113 return this._renderAlignedTable(section as AlignedTable); |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
114 } else { |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
115 return this._renderFreeStatements(section as FreeStatements); |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
116 } |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
117 } |
8
6fefd287aff9
closer- element now holds a changing graph, but can't draw it yet
drewp@bigasterisk.com
parents:
diff
changeset
|
118 |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
119 _renderAlignedTable(section: AlignedTable): TemplateResult { |
128 | 120 const nodeDisplay = this.nodeDisplay; |
121 if (!nodeDisplay) throw new Error(); | |
118 | 122 const tableTypes: NamedNode[][] = []; |
123 const typeHeads: TemplateResult[] = []; | |
124 const heads: TemplateResult[] = []; | |
125 for (let ch of section.columnHeaders) { | |
126 const colSpan = 1; //todo | |
127 typeHeads.push( | |
128 html`<th colspan="${colSpan}"> | |
128 | 129 ${ch.rdfTypes.map((n) => nodeDisplay.render(n))} |
118 | 130 </th>` |
131 ); | |
132 | |
133 tableTypes.push(ch.rdfTypes); | |
128 | 134 heads.push(html`<th>${nodeDisplay.render(ch.pred)}</th>`); |
118 | 135 } |
136 | |
110 | 137 const cells = []; |
138 | |
139 for (let rowIndex in section.rows) { | |
128 | 140 const headerCol = nodeDisplay.render(section.rowHeaders[rowIndex]); |
118 | 141 const bodyCols = []; |
110 | 142 for (let cellObjs of section.rows[rowIndex]) { |
143 const display = cellObjs.map( | |
128 | 144 (t) => html`<div>${nodeDisplay.render(t)}</div>` |
110 | 145 ); |
146 bodyCols.push(html`<td>${display}</td>`); | |
147 } | |
118 | 148 cells.push( |
149 html`<tr> | |
150 <th>${headerCol}</th> | |
151 ${bodyCols} | |
152 </tr>` | |
153 ); | |
110 | 154 } |
118 | 155 const tableTypesUnique = uniqueSortedTerms(tableTypes.flat()); |
156 const typesDisplay = html`${tableTypesUnique.length == 1 ? "type" : "types"} | |
128 | 157 ${tableTypesUnique.map((n) => nodeDisplay.render(n))}`; |
118 | 158 |
110 | 159 return html` |
118 | 160 <div>[icon] Resources of ${typesDisplay}</div> |
110 | 161 <div class="typeBlockScroll"> |
113 | 162 <table class="typeBlock"> |
163 <thead> | |
118 | 164 <tr> |
165 <th></th> | |
166 ${typeHeads} | |
167 </tr> | |
168 <tr> | |
169 <th>Subject</th> | |
170 ${heads} | |
171 </tr> | |
113 | 172 </thead> |
173 <tbody> | |
174 ${cells} | |
175 </tbody> | |
176 </table> | |
110 | 177 </div> |
178 `; | |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
179 } |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
180 |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
181 _renderFreeStatements(section: FreeStatements): TemplateResult { |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
182 const subjects: NamedNode[] = []; |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
183 let subjPreds = Immutable.Map<NamedNode, UriSet>(); |
110 | 184 |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
185 return html`<div class="spoGrid"> |
110 | 186 grid has rowcount ${section.subjRows.length} |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
187 ${section.subjRows.map(this._subjPredObjsBlock.bind(this))} |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
188 </div>`; |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
189 } |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
190 |
110 | 191 _subjPredObjsBlock(row: SubjRow): TemplateResult { |
84
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
192 return html` |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
193 <div class="subject"> |
128 | 194 ${this.nodeDisplay?.render(row.subj)} |
84
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
195 <!-- todo: special section for uri/type-and-icon/label/comment --> |
110 | 196 <div>${row.predRows.map(this._predObjsBlock.bind(this))}</div> |
84
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
197 </div> |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
198 `; |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
199 } |
8
6fefd287aff9
closer- element now holds a changing graph, but can't draw it yet
drewp@bigasterisk.com
parents:
diff
changeset
|
200 |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
201 _predObjsBlock(row: PredRow): TemplateResult { |
84
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
202 return html` |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
203 <div class="predicate"> |
128 | 204 ${this.nodeDisplay?.render(row.pred)} |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
205 <div>${row.objs.map(this._objCell.bind(this))}</div> |
84
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
206 </div> |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
207 `; |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
208 } |
8
6fefd287aff9
closer- element now holds a changing graph, but can't draw it yet
drewp@bigasterisk.com
parents:
diff
changeset
|
209 |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
210 _objCell(obj: Term): TemplateResult { |
84
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
211 return html` |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
212 <div class="object"> |
128 | 213 ${this.nodeDisplay?.render(obj)} |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
214 <!-- indicate what source or graph said this stmt --> |
84
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
215 </div> |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
216 `; |
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
217 } |
15
7ca4ff2088c3
managed to use a newer ts or something, so this includes a bunch of type fixes too
drewp@bigasterisk.com
parents:
9
diff
changeset
|
218 |
88
ac7ad087d474
graph view rewrites and fixes for the multi-subject table
drewp@bigasterisk.com
parents:
84
diff
changeset
|
219 _drawObj(obj: Term): TemplateResult { |
128 | 220 return html` <div>${this.nodeDisplay?.render(obj)}</div> `; |
88
ac7ad087d474
graph view rewrites and fixes for the multi-subject table
drewp@bigasterisk.com
parents:
84
diff
changeset
|
221 } |
8
6fefd287aff9
closer- element now holds a changing graph, but can't draw it yet
drewp@bigasterisk.com
parents:
diff
changeset
|
222 |
88
ac7ad087d474
graph view rewrites and fixes for the multi-subject table
drewp@bigasterisk.com
parents:
84
diff
changeset
|
223 _drawColumnHead(pred: NamedNode): TemplateResult { |
128 | 224 return html` <th>${this.nodeDisplay?.render(pred)}</th> `; |
88
ac7ad087d474
graph view rewrites and fixes for the multi-subject table
drewp@bigasterisk.com
parents:
84
diff
changeset
|
225 } |
15
7ca4ff2088c3
managed to use a newer ts or something, so this includes a bunch of type fixes too
drewp@bigasterisk.com
parents:
9
diff
changeset
|
226 |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
227 // return html` |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
228 // <div>[icon] Resources of type ${typeNames}</div> |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
229 // <div class="typeBlockScroll"> |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
230 // <table class="typeBlock"> |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
231 // ${this._thead(layout)} ${layout.subjs.map(this._instanceRow(layout))} |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
232 // </table> |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
233 // </div> |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
234 // `; |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
107
diff
changeset
|
235 // } |
84
067d66a45a51
enable more code. factor out setGraphView
drewp@bigasterisk.com
parents:
79
diff
changeset
|
236 } |
128 | 237 |
238 declare global { | |
239 interface HTMLElementTagNameMap { | |
240 "graph-view": GraphView; | |
241 } | |
242 } |