Skip to content

Commit 240998b

Browse files
committed
feat: overriding child viewer
1 parent d711b84 commit 240998b

4 files changed

Lines changed: 51 additions & 1 deletion

File tree

.changeset/soft-rocks-travel.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@hydrofoil/roadshow": patch
3+
---
4+
5+
Possibility to override the viewer for property objects when calling `show()`

packages/roadshow/lib/ViewContext/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export interface ViewContext<S, P = any> {
2323

2424
export interface Show {
2525
property: PropertyState | PropertyShape | NamedNode
26+
viewer?: NamedNode
2627
}
2728

2829
export interface FocusNodeViewContext<R = unknown> extends ViewContext<FocusNodeState<R>, PropertyState> {

packages/roadshow/lib/render.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,11 @@ function showProperty(this: FocusNodeViewContext, show: Show) {
237237
if (!objects.terms.length) {
238238
objects = findNodes(this.node, property.path)
239239
}
240+
241+
if (show.viewer) {
242+
property.viewer = show.viewer
243+
}
244+
240245
if (property.viewer && this.controller.viewers.isMultiViewer(property.viewer)) {
241246
this.controller.initShapes(property, objects)
242247

packages/roadshow/test/lib/render.test.ts

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { fromPointer } from '@rdfine/shacl/lib/NodeShape'
33
import { NodeShape } from '@rdfine/shacl'
44
import { html } from 'lit'
55
import sinon from 'sinon'
6-
import { dash, foaf, rdf, rdfs, sh } from '@tpluscode/rdf-ns-builders/strict'
6+
import { dash, foaf, rdf, rdfs, schema, sh } from '@tpluscode/rdf-ns-builders/strict'
77
import { Initializer } from '@tpluscode/rdfine/RdfResource'
88
import { render } from '../../lib/render'
99
import { blankNode, namedNode } from '../_support/clownface'
@@ -161,6 +161,45 @@ describe('@hydrofoil/roadshow/lib/render', () => {
161161
expect(result.textContent).to.eq('Count: 3')
162162
})
163163

164+
it('renders using selected viewer when overridden in .show()', async () => {
165+
// given
166+
const shape = createShape({
167+
property: [{
168+
path: schema.breadcrumb,
169+
viewer: ex.BreadcrumbViewer,
170+
node: {
171+
property: {
172+
path: schema.itemListElement,
173+
},
174+
},
175+
}],
176+
})
177+
const focusNode = namedNode('/page/child')
178+
.addOut(schema.breadcrumb, (bc) => {
179+
bc.addOut(schema.itemListElement, (item) => {
180+
item.addOut(schema.item, item.namedNode('/page'))
181+
.addOut(schema.name, 'Parent')
182+
})
183+
})
184+
const state: FocusNodeState = create({ shape, term: focusNode.term, pointer: focusNode })
185+
renderers.set(ex.BreadcrumbViewer, function (this: FocusNodeViewContext) {
186+
const [itemsProperty] = this.state.properties
187+
188+
return html`<ol class="breadcrumbs">
189+
${this.show({ property: itemsProperty, viewer: ex.BreadcrumbItemViewer })}
190+
</ol>`
191+
})
192+
renderers.set(ex.BreadcrumbItemViewer, resource => html`<li>${resource.out(schema.name).value}</li>`)
193+
194+
// when
195+
const result = await fixture(render({ state, focusNode, controller, params }))
196+
197+
// then
198+
expect(result).dom.to.eq(`<ol class="breadcrumbs">
199+
<li>Parent</li>
200+
</ol>`)
201+
})
202+
164203
it('calling sub-renderer for individual objects', async () => {
165204
// given
166205
const shape = createShape({

0 commit comments

Comments
 (0)