Listing
Developer Reference
Schema
Pass this object inside the blocks option when calling initBridge() to register this block type with the admin UI. See Custom Blocks for the full setup guide.
{
"listing": {
"itemTypeField": "variation",
"schemaEnhancer": {
"inheritSchemaFrom": {
"mappingField": "fieldMapping",
"defaultsField": "itemDefaults",
"filterConvertibleFrom": "@default",
"title": "Item Type",
"default": "summary"
}
}
},
"summary": {
"fieldMappings": {
"@default": {
"@id": "href",
"title": "title",
"description": "description",
"image": "image"
}
},
"blockSchema": {
"properties": {
"href": {
"title": "Link",
"widget": "url"
},
"title": {
"title": "Title"
},
"description": {
"title": "Description",
"widget": "textarea"
},
"image": {
"title": "Image",
"widget": "url"
},
"date": {
"title": "Date",
"widget": "date"
}
}
}
},
"default": {
"fieldMappings": {
"@default": {
"@id": "href",
"title": "title",
"description": "description"
}
},
"blockSchema": {
"properties": {
"href": {
"title": "Link",
"widget": "url"
},
"title": {
"title": "Title"
},
"description": {
"title": "Description",
"widget": "textarea"
}
}
}
}
}JSON Block Data
Example JSON as stored in the Plone content API. This is the data structure your component will receive in the block prop.
{
"@type": "listing",
"variation": "summary",
"querystring": {
"query": [
{
"i": "portal_type",
"o": "plone.app.querystring.operation.selection.any",
"v": [
"Document"
]
}
],
"sort_on": "effective",
"sort_order": "descending"
}
}
{
"@uid": "item-1",
"@type": "summary",
"href": "/news/my-article",
"title": "My Article",
"description": "Article summary text",
"image": "/news/my-article/@@images/image-800x600.jpg"
}Component
Render component for your frontend framework. Add this to your block renderer's switch/map so it handles this @type.
function ListingBlock({ block, blockId }) {
const [items, setItems] = useState([]);
useEffect(() => {
async function load() {
const fetchItems = ploneFetchItems({ apiUrl: API_URL });
const result = await expandListingBlocks([blockId], {
blocks: { [blockId]: block },
fetchItems: { listing: fetchItems },
itemTypeField: 'variation',
});
setItems(result.items);
}
load();
}, [block.querystring]);
return (
<div data-block-uid={blockId} className="listing-block">
{items.map((item, i) => (
<BlockRenderer key={i} block={item} />
))}
</div>
);
}






































