{
"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"
}
}
}
}
}
{
"@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"
}
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>
);
}<template>
<div :data-block-uid="blockId" class="listing-block">
<BlockRenderer v-for="(item, i) in items" :key="i" :block="item" />
</div>
</template>
<script setup>
import { ref, watch } from 'vue';
const props = defineProps({ block: Object, blockId: String });
const items = ref([]);
watch(() => props.block.querystring, async () => {
const fetchItems = ploneFetchItems({ apiUrl: API_URL });
const result = await expandListingBlocks([props.blockId], {
blocks: { [props.blockId]: props.block },
fetchItems: { listing: fetchItems },
itemTypeField: 'variation',
});
items.value = result.items;
}, { immediate: true });
</script><script>
import BlockRenderer from './BlockRenderer.svelte';
export let block;
export let blockId;
let items = [];
$: block.querystring, loadItems();
async function loadItems() {
const fetchItems = ploneFetchItems({ apiUrl: API_URL });
const result = await expandListingBlocks([blockId], {
blocks: { [blockId]: block },
fetchItems: { listing: fetchItems },
itemTypeField: 'variation',
});
items = result.items;
}
</script>
<div data-block-uid={blockId} class="listing-block">
{#each items as item, i (i)}
<BlockRenderer block={item} />
{/each}
</div>
{
"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"
}
}
}
}
}
{
"@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"
}
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>
);
}<template>
<div :data-block-uid="blockId" class="listing-block">
<BlockRenderer v-for="(item, i) in items" :key="i" :block="item" />
</div>
</template>
<script setup>
import { ref, watch } from 'vue';
const props = defineProps({ block: Object, blockId: String });
const items = ref([]);
watch(() => props.block.querystring, async () => {
const fetchItems = ploneFetchItems({ apiUrl: API_URL });
const result = await expandListingBlocks([props.blockId], {
blocks: { [props.blockId]: props.block },
fetchItems: { listing: fetchItems },
itemTypeField: 'variation',
});
items.value = result.items;
}, { immediate: true });
</script><script>
import BlockRenderer from './BlockRenderer.svelte';
export let block;
export let blockId;
let items = [];
$: block.querystring, loadItems();
async function loadItems() {
const fetchItems = ploneFetchItems({ apiUrl: API_URL });
const result = await expandListingBlocks([blockId], {
blocks: { [blockId]: block },
fetchItems: { listing: fetchItems },
itemTypeField: 'variation',
});
items = result.items;
}
</script>
<div data-block-uid={blockId} class="listing-block">
{#each items as item, i (i)}
<BlockRenderer block={item} />
{/each}
</div>
{
"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"
}
}
}
}
}
{
"@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"
}
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>
);
}<template>
<div :data-block-uid="blockId" class="listing-block">
<BlockRenderer v-for="(item, i) in items" :key="i" :block="item" />
</div>
</template>
<script setup>
import { ref, watch } from 'vue';
const props = defineProps({ block: Object, blockId: String });
const items = ref([]);
watch(() => props.block.querystring, async () => {
const fetchItems = ploneFetchItems({ apiUrl: API_URL });
const result = await expandListingBlocks([props.blockId], {
blocks: { [props.blockId]: props.block },
fetchItems: { listing: fetchItems },
itemTypeField: 'variation',
});
items.value = result.items;
}, { immediate: true });
</script><script>
import BlockRenderer from './BlockRenderer.svelte';
export let block;
export let blockId;
let items = [];
$: block.querystring, loadItems();
async function loadItems() {
const fetchItems = ploneFetchItems({ apiUrl: API_URL });
const result = await expandListingBlocks([blockId], {
blocks: { [blockId]: block },
fetchItems: { listing: fetchItems },
itemTypeField: 'variation',
});
items = result.items;
}
</script>
<div data-block-uid={blockId} class="listing-block">
{#each items as item, i (i)}
<BlockRenderer block={item} />
{/each}
</div>