diff --git a/.gitignore b/.gitignore index 14e13f8d..baed8b31 100644 --- a/.gitignore +++ b/.gitignore @@ -258,4 +258,6 @@ api/.claude/ *.pdf +CLAUDE.md + ui/.claude/worktrees/ diff --git a/ui/all-translations-het-archief.json b/ui/all-translations-het-archief.json index a5b3ba30..67625526 100644 --- a/ui/all-translations-het-archief.json +++ b/ui/all-translations-het-archief.json @@ -2466,7 +2466,7 @@ "location": "modules/content-page/const/get-content-block-type-options", "key": "overzicht-met-carousel", "language": "nl", - "value": "Overzicht met carousel", + "value": "Overzicht met carrousel", "value_type": "TEXT" }, { @@ -2476,27 +2476,7 @@ "location": "modules/content-page/const/get-content-block-type-options", "key": "overzicht-met-carousel", "language": "en", - "value": "Overzicht met carousel", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/const/get-content-block-type-options", - "key": "homepage-banner", - "language": "nl", - "value": "Homepage banner", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/const/get-content-block-type-options", - "key": "homepage-banner", - "language": "en", - "value": "Homepage banner", + "value": "Overview block with carousel", "value_type": "TEXT" }, { @@ -2504,9 +2484,9 @@ "app": "HET_ARCHIEF", "component": "ADMIN_CORE", "location": "modules/content-page/const/get-content-block-type-options", - "key": "highlight-text", + "key": "thema-reels", "language": "nl", - "value": "Highlight text", + "value": "Thema reels", "value_type": "TEXT" }, { @@ -2514,9 +2494,9 @@ "app": "HET_ARCHIEF", "component": "ADMIN_CORE", "location": "modules/content-page/const/get-content-block-type-options", - "key": "highlight-text", + "key": "thema-reels", "language": "en", - "value": "Highlight text", + "value": "Thema reels", "value_type": "TEXT" }, { @@ -2524,9 +2504,9 @@ "app": "HET_ARCHIEF", "component": "ADMIN_CORE", "location": "modules/content-page/const/get-content-block-type-options", - "key": "thema-reels", + "key": "objecten-grid", "language": "nl", - "value": "Thema reels", + "value": "Objecten grid", "value_type": "TEXT" }, { @@ -2534,9 +2514,9 @@ "app": "HET_ARCHIEF", "component": "ADMIN_CORE", "location": "modules/content-page/const/get-content-block-type-options", - "key": "thema-reels", + "key": "objecten-grid", "language": "en", - "value": "Thema reels", + "value": "Objecten grid", "value_type": "TEXT" }, { @@ -18439,6 +18419,346 @@ "value": "Go to organisation {{maintainerName}}", "value_type": "TEXT" }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "objecten-grid", + "language": "nl", + "value": "Objecten grid", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "objecten-grid", + "language": "en", + "value": "Objecten grid", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "titel", + "language": "nl", + "value": "Titel", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "titel", + "language": "en", + "value": "Titel", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "titel-grootte", + "language": "nl", + "value": "Titel grootte", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "titel-grootte", + "language": "en", + "value": "Titel grootte", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "zoekfilter-url", + "language": "nl", + "value": "Zoekfilter (URL)", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "zoekfilter-url", + "language": "en", + "value": "Zoekfilter (URL)", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "geef-een-zoek-url-van-hetarchief-be-in-bijvoorbeeld-https-hetarchief-be-zoeken-aanbieders-or-page-1", + "language": "nl", + "value": "Geef een zoek-URL van hetarchief.be in, bijvoorbeeld https://hetarchief.be/zoeken?aanbieders=OR-...&page=1", + "value_type": "HTML" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "geef-een-zoek-url-van-hetarchief-be-in-bijvoorbeeld-https-hetarchief-be-zoeken-aanbieders-or-page-1", + "language": "en", + "value": "Geef een zoek-URL van hetarchief.be in, bijvoorbeeld https://hetarchief.be/zoeken?aanbieders=OR-...&page=1", + "value_type": "HTML" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "een-zoekfilter-is-verplicht", + "language": "nl", + "value": "Een zoekfilter is verplicht", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "een-zoekfilter-is-verplicht", + "language": "en", + "value": "Een zoekfilter is verplicht", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "gelieve-een-geldige-url-in-te-vullen", + "language": "nl", + "value": "Gelieve een geldige URL in te vullen", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "gelieve-een-geldige-url-in-te-vullen", + "language": "en", + "value": "Gelieve een geldige URL in te vullen", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "vaste-positie", + "language": "nl", + "value": "Vaste positie", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "vaste-positie", + "language": "en", + "value": "Vaste positie", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "object-pid-of-fragment-id", + "language": "nl", + "value": "Object (pid of fragment id)", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "object-pid-of-fragment-id", + "language": "en", + "value": "Object (pid of fragment id)", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "voeg-een-vaste-positie-toe", + "language": "nl", + "value": "Voeg een vaste positie toe", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "voeg-een-vaste-positie-toe", + "language": "en", + "value": "Voeg een vaste positie toe", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "verwijder-vaste-positie", + "language": "nl", + "value": "Verwijder vaste positie", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "verwijder-vaste-positie", + "language": "en", + "value": "Verwijder vaste positie", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "ga-naar-de-detailpagina-van-title", + "language": "nl", + "value": "Ga naar de detailpagina van {{title}}", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "ga-naar-de-detailpagina-van-title", + "language": "en", + "value": "Ga naar de detailpagina van {{title}}", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "objecten-worden-geladen", + "language": "nl", + "value": "Objecten worden geladen…", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "objecten-worden-geladen", + "language": "en", + "value": "Objecten worden geladen…", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "er-konden-geen-objecten-geladen-worden", + "language": "nl", + "value": "Er konden geen objecten geladen worden.", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "er-konden-geen-objecten-geladen-worden", + "language": "en", + "value": "Er konden geen objecten geladen worden.", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "er-zijn-geen-objecten-gevonden", + "language": "nl", + "value": "Er zijn geen objecten gevonden.", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "er-zijn-geen-objecten-gevonden", + "language": "en", + "value": "Er zijn geen objecten gevonden.", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "toon-alle-objecten-voor-deze-zoekopdracht", + "language": "nl", + "value": "Toon alle objecten voor deze zoekopdracht", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "toon-alle-objecten-voor-deze-zoekopdracht", + "language": "en", + "value": "Toon alle objecten voor deze zoekopdracht", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "toon-alle", + "language": "nl", + "value": "Toon alle", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-objects-grid/block-objects-grid", + "key": "toon-alle", + "language": "en", + "value": "Toon alle", + "value_type": "TEXT" + }, { "id": "", "app": "HET_ARCHIEF", @@ -18679,506 +18999,6 @@ "value": "Button link", "value_type": "TEXT" }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "overzicht-met-carrousel", - "language": "nl", - "value": "Overzicht met carrousel", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "overzicht-met-carrousel", - "language": "en", - "value": "Overzicht met carrousel", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "title", - "language": "nl", - "value": "Title", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "title", - "language": "en", - "value": "Title", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "titel-is-verplicht", - "language": "nl", - "value": "Titel is verplicht", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "titel-is-verplicht", - "language": "en", - "value": "Titel is verplicht", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "titletype", - "language": "nl", - "value": "Titletype", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "titletype", - "language": "en", - "value": "Titletype", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "titletype-is-verplicht", - "language": "nl", - "value": "Titletype is verplicht", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "titletype-is-verplicht", - "language": "en", - "value": "Titletype is verplicht", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "button-label", - "language": "nl", - "value": "Button label", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "button-label", - "language": "en", - "value": "Button label", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "button-alt-title", - "language": "nl", - "value": "Button alt title", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "button-alt-title", - "language": "en", - "value": "Button alt title", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "button-action", - "language": "nl", - "value": "Button action", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "button-action", - "language": "en", - "value": "Button action", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "content-item", - "language": "nl", - "value": "Content item", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "content-item", - "language": "en", - "value": "Content item", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "item", - "language": "nl", - "value": "Item", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "item", - "language": "en", - "value": "Item", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "item-image", - "language": "nl", - "value": "Item image", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "item-image", - "language": "en", - "value": "Item image", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "afbeelding-is-verplicht", - "language": "nl", - "value": "Afbeelding is verplicht", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "afbeelding-is-verplicht", - "language": "en", - "value": "Afbeelding is verplicht", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "alt-tekst-voor-de-afbeelding", - "language": "nl", - "value": "Alt tekst voor de afbeelding", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "alt-tekst-voor-de-afbeelding", - "language": "en", - "value": "Alt tekst voor de afbeelding", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "item-title", - "language": "nl", - "value": "Item title", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "item-title", - "language": "en", - "value": "Item title", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "achtergrondkleur-van-het-item", - "language": "nl", - "value": "Achtergrondkleur van het item", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "achtergrondkleur-van-het-item", - "language": "en", - "value": "Achtergrondkleur van het item", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "tekst-kleur", - "language": "nl", - "value": "Tekst kleur", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "tekst-kleur", - "language": "en", - "value": "Tekst kleur", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "weergave", - "language": "nl", - "value": "Weergave", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "weergave", - "language": "en", - "value": "Weergave", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "portret", - "language": "nl", - "value": "Portret", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "portret", - "language": "en", - "value": "Portret", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "afgerond-portret", - "language": "nl", - "value": "Afgerond portret", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "afgerond-portret", - "language": "en", - "value": "Afgerond portret", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "landscape", - "language": "nl", - "value": "Landscape", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "landscape", - "language": "en", - "value": "Landscape", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "weergave-is-verplicht", - "language": "nl", - "value": "Weergave is verplicht", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "weergave-is-verplicht", - "language": "en", - "value": "Weergave is verplicht", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "voeg-object-toe", - "language": "nl", - "value": "Voeg object toe", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "voeg-object-toe", - "language": "en", - "value": "Voeg object toe", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "verwijder-object", - "language": "nl", - "value": "Verwijder object", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "verwijder-object", - "language": "en", - "value": "Verwijder object", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "vorige-slide", - "language": "nl", - "value": "Vorige slide", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "vorige-slide", - "language": "en", - "value": "Vorige slide", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "volgende-slide", - "language": "nl", - "value": "Volgende slide", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", - "key": "volgende-slide", - "language": "en", - "value": "Volgende slide", - "value_type": "TEXT" - }, { "id": "", "app": "HET_ARCHIEF", @@ -20379,26 +20199,6 @@ "value": "Thema", "value_type": "TEXT" }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-themes/block-overview-themes", - "key": "thema", - "language": "nl", - "value": "Thema", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "ADMIN_CORE", - "location": "modules/content-page/components/blocks/block-overview-themes/block-overview-themes", - "key": "thema", - "language": "en", - "value": "Thema", - "value_type": "TEXT" - }, { "id": "", "app": "HET_ARCHIEF", @@ -20846,7 +20646,7 @@ "location": "modules/content-page/components/blocks/block-theme-reels/block-theme-reel-section", "key": "toon-alle-materialen-voor-dit-theme", "language": "nl", - "value": "Toon alle materialen voor dit theme", + "value": "Toon alle materialen voor dit thema", "value_type": "TEXT" }, { @@ -20856,7 +20656,7 @@ "location": "modules/content-page/components/blocks/block-theme-reels/block-theme-reel-section", "key": "toon-alle-materialen-voor-dit-theme", "language": "en", - "value": "Toon alle materialen voor dit theme", + "value": "Show all materials for this theme", "value_type": "TEXT" }, { @@ -21759,6 +21559,566 @@ "value": "Please enter a correct search filter link.", "value_type": "TEXT" }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/const/get-content-block-type-options", + "key": "homepage-banner", + "language": "nl", + "value": "Homepage banner", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/const/get-content-block-type-options", + "key": "homepage-banner", + "language": "en", + "value": "Homepage banner", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/const/get-content-block-type-options", + "key": "highlight-text", + "language": "nl", + "value": "Highlight text", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/const/get-content-block-type-options", + "key": "highlight-text", + "language": "en", + "value": "Highlight text", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "overzicht-met-carrousel", + "language": "nl", + "value": "Overzicht met carrousel", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "overzicht-met-carrousel", + "language": "en", + "value": "Overview block with carousel", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "title", + "language": "nl", + "value": "Title", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "title", + "language": "en", + "value": "Title", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "titel-is-verplicht", + "language": "nl", + "value": "Titel is verplicht", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "titel-is-verplicht", + "language": "en", + "value": "Titel is verplicht", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "titletype", + "language": "nl", + "value": "Titletype", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "titletype", + "language": "en", + "value": "Titletype", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "titletype-is-verplicht", + "language": "nl", + "value": "Titletype is verplicht", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "titletype-is-verplicht", + "language": "en", + "value": "Titletype is verplicht", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "button-label", + "language": "nl", + "value": "Button label", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "button-label", + "language": "en", + "value": "Button label", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "button-alt-title", + "language": "nl", + "value": "Button alt title", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "button-alt-title", + "language": "en", + "value": "Button alt title", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "button-action", + "language": "nl", + "value": "Button action", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "button-action", + "language": "en", + "value": "Button action", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "content-item", + "language": "nl", + "value": "Content item", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "content-item", + "language": "en", + "value": "Content item", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "item", + "language": "nl", + "value": "Item", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "item", + "language": "en", + "value": "Item", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "item-image", + "language": "nl", + "value": "Item image", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "item-image", + "language": "en", + "value": "Item image", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "afbeelding-is-verplicht", + "language": "nl", + "value": "Afbeelding is verplicht", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "afbeelding-is-verplicht", + "language": "en", + "value": "Afbeelding is verplicht", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "alt-tekst-voor-de-afbeelding", + "language": "nl", + "value": "Alt tekst voor de afbeelding", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "alt-tekst-voor-de-afbeelding", + "language": "en", + "value": "Alt tekst voor de afbeelding", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "item-title", + "language": "nl", + "value": "Item title", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "item-title", + "language": "en", + "value": "Item title", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "achtergrondkleur-van-het-item", + "language": "nl", + "value": "Achtergrondkleur van het item", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "achtergrondkleur-van-het-item", + "language": "en", + "value": "Achtergrondkleur van het item", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "tekst-kleur", + "language": "nl", + "value": "Tekst kleur", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "tekst-kleur", + "language": "en", + "value": "Tekst kleur", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "weergave", + "language": "nl", + "value": "Weergave", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "weergave", + "language": "en", + "value": "Weergave", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "portret", + "language": "nl", + "value": "Portret", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "portret", + "language": "en", + "value": "Portret", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "afgerond-portret", + "language": "nl", + "value": "Afgerond portret", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "afgerond-portret", + "language": "en", + "value": "Afgerond portret", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "landscape", + "language": "nl", + "value": "Landscape", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "landscape", + "language": "en", + "value": "Landscape", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "weergave-is-verplicht", + "language": "nl", + "value": "Weergave is verplicht", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "weergave-is-verplicht", + "language": "en", + "value": "Weergave is verplicht", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "voeg-object-toe", + "language": "nl", + "value": "Voeg object toe", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "voeg-object-toe", + "language": "en", + "value": "Voeg object toe", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "verwijder-object", + "language": "nl", + "value": "Verwijder object", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "verwijder-object", + "language": "en", + "value": "Verwijder object", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "vorige-slide", + "language": "nl", + "value": "Vorige slide", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "vorige-slide", + "language": "en", + "value": "Vorige slide", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "volgende-slide", + "language": "nl", + "value": "Volgende slide", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel", + "key": "volgende-slide", + "language": "en", + "value": "Volgende slide", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-themes/block-overview-themes", + "key": "thema", + "language": "nl", + "value": "Thema", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "ADMIN_CORE", + "location": "modules/content-page/components/blocks/block-overview-themes/block-overview-themes", + "key": "thema", + "language": "en", + "value": "Thema", + "value_type": "TEXT" + }, { "id": "", "app": "HET_ARCHIEF", @@ -39679,6 +40039,26 @@ "value": "Url themadetailpagina nl", "value_type": "TEXT" }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "FRONTEND", + "location": "modules/admin/views/themes/themes-edit-page", + "key": "selecteer-een-nl-content-pagina", + "language": "nl", + "value": "Selecteer een nl content pagina", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "FRONTEND", + "location": "modules/admin/views/themes/themes-edit-page", + "key": "selecteer-een-nl-content-pagina", + "language": "en", + "value": "Selecteer een nl content pagina", + "value_type": "TEXT" + }, { "id": "", "app": "HET_ARCHIEF", @@ -39699,6 +40079,26 @@ "value": "Url themadetailpagina en", "value_type": "TEXT" }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "FRONTEND", + "location": "modules/admin/views/themes/themes-edit-page", + "key": "selecteer-een-en-content-pagina", + "language": "nl", + "value": "Selecteer een en content pagina", + "value_type": "TEXT" + }, + { + "id": "", + "app": "HET_ARCHIEF", + "component": "FRONTEND", + "location": "modules/admin/views/themes/themes-edit-page", + "key": "selecteer-een-en-content-pagina", + "language": "en", + "value": "Selecteer een en content pagina", + "value_type": "TEXT" + }, { "id": "", "app": "HET_ARCHIEF", @@ -45276,7 +45676,7 @@ "location": "modules/navigation/components/navigation/navigation", "key": "kranten", "language": "en", - "value": "Kranten", + "value": "Newspapers", "value_type": "TEXT" }, { @@ -45296,7 +45696,7 @@ "location": "modules/navigation/components/navigation/navigation", "key": "zoek-alles", "language": "en", - "value": "Zoek alles", + "value": "Search all", "value_type": "TEXT" }, { @@ -56299,46 +56699,6 @@ "value": "Close", "value_type": "TEXT" }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "FRONTEND", - "location": "modules/admin/views/themes/themes-edit-page", - "key": "selecteer-een-nl-content-pagina", - "language": "nl", - "value": "Selecteer een nl content pagina", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "FRONTEND", - "location": "modules/admin/views/themes/themes-edit-page", - "key": "selecteer-een-nl-content-pagina", - "language": "en", - "value": "Selecteer een nl content pagina", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "FRONTEND", - "location": "modules/admin/views/themes/themes-edit-page", - "key": "selecteer-een-en-content-pagina", - "language": "nl", - "value": "Selecteer een en content pagina", - "value_type": "TEXT" - }, - { - "id": "", - "app": "HET_ARCHIEF", - "component": "FRONTEND", - "location": "modules/admin/views/themes/themes-edit-page", - "key": "selecteer-een-en-content-pagina", - "language": "en", - "value": "Selecteer een en content pagina", - "value_type": "TEXT" - }, { "id": "", "app": "HET_ARCHIEF", diff --git a/ui/all-translations-het-archief.sql b/ui/all-translations-het-archief.sql index 427648aa..b136dbd4 100644 --- a/ui/all-translations-het-archief.sql +++ b/ui/all-translations-het-archief.sql @@ -1393,6 +1393,40 @@ INSERT INTO app.translations ("component", "location", "key", "value", "value_ty INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-image-text-background/block-image-text-background', 'titel-grootte', 'Title size', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Title size', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-maintainers-grid/block-maintainers-grid', 'ga-naar-aanbieder-maintainer-name', 'Ga naar aanbieder {{maintainerName}}', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Ga naar aanbieder {{maintainerName}}', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-maintainers-grid/block-maintainers-grid', 'ga-naar-aanbieder-maintainer-name', 'Go to organisation {{maintainerName}}', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Go to organisation {{maintainerName}}', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'een-zoekfilter-is-verplicht', 'Een zoekfilter is verplicht', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Een zoekfilter is verplicht', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'een-zoekfilter-is-verplicht', 'Een zoekfilter is verplicht', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Een zoekfilter is verplicht', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'er-konden-geen-objecten-geladen-worden', 'Er konden geen objecten geladen worden.', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Er konden geen objecten geladen worden.', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'er-konden-geen-objecten-geladen-worden', 'Er konden geen objecten geladen worden.', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Er konden geen objecten geladen worden.', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'er-zijn-geen-objecten-gevonden', 'Er zijn geen objecten gevonden.', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Er zijn geen objecten gevonden.', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'er-zijn-geen-objecten-gevonden', 'Er zijn geen objecten gevonden.', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Er zijn geen objecten gevonden.', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'ga-naar-de-detailpagina-van-title', 'Ga naar de detailpagina van {{title}}', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Ga naar de detailpagina van {{title}}', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'ga-naar-de-detailpagina-van-title', 'Ga naar de detailpagina van {{title}}', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Ga naar de detailpagina van {{title}}', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'geef-een-zoek-url-van-hetarchief-be-in-bijvoorbeeld-https-hetarchief-be-zoeken-aanbieders-or-page-1', 'Geef een zoek-URL van hetarchief.be in, bijvoorbeeld https://hetarchief.be/zoeken?aanbieders=OR-...&page=1', 'HTML', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Geef een zoek-URL van hetarchief.be in, bijvoorbeeld https://hetarchief.be/zoeken?aanbieders=OR-...&page=1', value_type = 'HTML'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'geef-een-zoek-url-van-hetarchief-be-in-bijvoorbeeld-https-hetarchief-be-zoeken-aanbieders-or-page-1', 'Geef een zoek-URL van hetarchief.be in, bijvoorbeeld https://hetarchief.be/zoeken?aanbieders=OR-...&page=1', 'HTML', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Geef een zoek-URL van hetarchief.be in, bijvoorbeeld https://hetarchief.be/zoeken?aanbieders=OR-...&page=1', value_type = 'HTML'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'gelieve-een-geldige-url-in-te-vullen', 'Gelieve een geldige URL in te vullen', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Gelieve een geldige URL in te vullen', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'gelieve-een-geldige-url-in-te-vullen', 'Gelieve een geldige URL in te vullen', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Gelieve een geldige URL in te vullen', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'object-pid-of-fragment-id', 'Object (pid of fragment id)', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Object (pid of fragment id)', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'object-pid-of-fragment-id', 'Object (pid of fragment id)', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Object (pid of fragment id)', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'objecten-grid', 'Objecten grid', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Objecten grid', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'objecten-grid', 'Objecten grid', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Objecten grid', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'objecten-worden-geladen', 'Objecten worden geladen…', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Objecten worden geladen…', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'objecten-worden-geladen', 'Objecten worden geladen…', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Objecten worden geladen…', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'titel', 'Titel', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Titel', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'titel', 'Titel', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Titel', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'titel-grootte', 'Titel grootte', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Titel grootte', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'titel-grootte', 'Titel grootte', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Titel grootte', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'toon-alle', 'Toon alle', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Toon alle', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'toon-alle', 'Toon alle', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Toon alle', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'toon-alle-objecten-voor-deze-zoekopdracht', 'Toon alle objecten voor deze zoekopdracht', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Toon alle objecten voor deze zoekopdracht', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'toon-alle-objecten-voor-deze-zoekopdracht', 'Toon alle objecten voor deze zoekopdracht', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Toon alle objecten voor deze zoekopdracht', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'vaste-positie', 'Vaste positie', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Vaste positie', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'vaste-positie', 'Vaste positie', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Vaste positie', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'verwijder-vaste-positie', 'Verwijder vaste positie', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Verwijder vaste positie', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'verwijder-vaste-positie', 'Verwijder vaste positie', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Verwijder vaste positie', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'voeg-een-vaste-positie-toe', 'Voeg een vaste positie toe', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Voeg een vaste positie toe', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'voeg-een-vaste-positie-toe', 'Voeg een vaste positie toe', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Voeg een vaste positie toe', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'zoekfilter-url', 'Zoekfilter (URL)', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Zoekfilter (URL)', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid', 'zoekfilter-url', 'Zoekfilter (URL)', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Zoekfilter (URL)', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-overview-newspaper-titles/block-overview-newspaper-titles', 'zoek-kranten-op-titel-input-aria-label', 'Hier kan je kranten zoeken op titel', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Hier kan je kranten zoeken op titel', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-overview-newspaper-titles/block-overview-newspaper-titles', 'zoek-kranten-op-titel-input-aria-label', 'This will allow you to search newspapers by title', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'This will allow you to search newspapers by title', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-overview-newspaper-titles/block-overview-newspaper-titles', 'zoek-op-titel', 'Search title', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Search title', value_type = 'TEXT'; @@ -1437,7 +1471,7 @@ INSERT INTO app.translations ("component", "location", "key", "value", "value_ty INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel', 'item-title', 'Item title', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Item title', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel', 'landscape', 'Landscape', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Landscape', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel', 'landscape', 'Landscape', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Landscape', value_type = 'TEXT'; -INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel', 'overzicht-met-carrousel', 'Overzicht met carrousel', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Overzicht met carrousel', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel', 'overzicht-met-carrousel', 'Overview block with carousel', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Overview block with carousel', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel', 'overzicht-met-carrousel', 'Overzicht met carrousel', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Overzicht met carrousel', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel', 'portret', 'Portret', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Portret', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-overview-with-carousel/block-overview-with-carousel', 'portret', 'Portret', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Portret', value_type = 'TEXT'; @@ -1479,8 +1513,8 @@ INSERT INTO app.translations ("component", "location", "key", "value", "value_ty INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-scroll-down-nudge/block-scroll-down-nudge', 'scroll-down-nudge', 'Scroll down nudge', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Scroll down nudge', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-theme-reels/block-theme-reel-section', 'toon-alle', 'Toon alle', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Toon alle', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-theme-reels/block-theme-reel-section', 'toon-alle', 'Toon alle', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Toon alle', value_type = 'TEXT'; -INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-theme-reels/block-theme-reel-section', 'toon-alle-materialen-voor-dit-theme', 'Toon alle materialen voor dit theme', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Toon alle materialen voor dit theme', value_type = 'TEXT'; -INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-theme-reels/block-theme-reel-section', 'toon-alle-materialen-voor-dit-theme', 'Toon alle materialen voor dit theme', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Toon alle materialen voor dit theme', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-theme-reels/block-theme-reel-section', 'toon-alle-materialen-voor-dit-theme', 'Show all materials for this theme', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Show all materials for this theme', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-theme-reels/block-theme-reel-section', 'toon-alle-materialen-voor-dit-theme', 'Toon alle materialen voor dit thema', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Toon alle materialen voor dit thema', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-theme-reels/block-theme-reel-section', 'volgende-slide', 'Volgende slide', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Volgende slide', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-theme-reels/block-theme-reel-section', 'volgende-slide', 'Volgende slide', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Volgende slide', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/components/blocks/block-theme-reels/block-theme-reel-section', 'vorige-slide', 'Vorige slide', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Vorige slide', value_type = 'TEXT'; @@ -1607,10 +1641,12 @@ INSERT INTO app.translations ("component", "location", "key", "value", "value_ty INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/const/get-content-block-type-options', 'highlight-text', 'Highlight text', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Highlight text', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/const/get-content-block-type-options', 'homepage-banner', 'Homepage banner', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Homepage banner', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/const/get-content-block-type-options', 'homepage-banner', 'Homepage banner', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Homepage banner', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/const/get-content-block-type-options', 'objecten-grid', 'Objecten grid', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Objecten grid', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/const/get-content-block-type-options', 'objecten-grid', 'Objecten grid', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Objecten grid', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/const/get-content-block-type-options', 'overzicht-krantentitels', 'Overview newspaper titles', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Overview newspaper titles', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/const/get-content-block-type-options', 'overzicht-krantentitels', 'Overzicht krantentitels', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Overzicht krantentitels', value_type = 'TEXT'; -INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/const/get-content-block-type-options', 'overzicht-met-carousel', 'Overzicht met carousel', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Overzicht met carousel', value_type = 'TEXT'; -INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/const/get-content-block-type-options', 'overzicht-met-carousel', 'Overzicht met carousel', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Overzicht met carousel', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/const/get-content-block-type-options', 'overzicht-met-carousel', 'Overview block with carousel', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Overview block with carousel', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/const/get-content-block-type-options', 'overzicht-met-carousel', 'Overzicht met carrousel', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Overzicht met carrousel', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/const/get-content-block-type-options', 'scroll-down-nudge', 'Nudge om te scrollen', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Nudge om te scrollen', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/const/get-content-block-type-options', 'scroll-down-nudge', 'Nudge to scroll down', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Nudge to scroll down', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('ADMIN_CORE', 'modules/content-page/const/get-content-block-type-options', 'thema-reels', 'Thema reels', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Thema reels', value_type = 'TEXT'; @@ -4165,15 +4201,15 @@ INSERT INTO app.translations ("component", "location", "key", "value", "value_ty INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('FRONTEND', 'modules/navigation/components/navigation/navigation', 'bezoekersruimte', 'Visitor''s Room', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Visitor''s Room', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('FRONTEND', 'modules/navigation/components/navigation/navigation', 'instellingen', 'Instellingen', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Instellingen', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('FRONTEND', 'modules/navigation/components/navigation/navigation', 'instellingen', 'Settings', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Settings', value_type = 'TEXT'; -INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('FRONTEND', 'modules/navigation/components/navigation/navigation', 'kranten', 'Kranten', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Kranten', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('FRONTEND', 'modules/navigation/components/navigation/navigation', 'kranten', 'Kranten', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Kranten', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('FRONTEND', 'modules/navigation/components/navigation/navigation', 'kranten', 'Newspapers', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Newspapers', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('FRONTEND', 'modules/navigation/components/navigation/navigation', 'materiaalaanvragen', 'Materiaalaanvragen', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Materiaalaanvragen', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('FRONTEND', 'modules/navigation/components/navigation/navigation', 'materiaalaanvragen', 'Material requests', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Material requests', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('FRONTEND', 'modules/navigation/components/navigation/navigation', 'naar-mijn-bezoekerstool', 'Mijn bezoekertool', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Mijn bezoekertool', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('FRONTEND', 'modules/navigation/components/navigation/navigation', 'naar-mijn-bezoekerstool', 'My visitor tool', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'My visitor tool', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('FRONTEND', 'modules/navigation/components/navigation/navigation', 'video', 'Video', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Video', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('FRONTEND', 'modules/navigation/components/navigation/navigation', 'video', 'Video', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Video', value_type = 'TEXT'; -INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('FRONTEND', 'modules/navigation/components/navigation/navigation', 'zoek-alles', 'Zoek alles', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Zoek alles', value_type = 'TEXT'; +INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('FRONTEND', 'modules/navigation/components/navigation/navigation', 'zoek-alles', 'Search all', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Search all', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('FRONTEND', 'modules/navigation/components/navigation/navigation', 'zoek-alles', 'Zoek alles', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Zoek alles', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('FRONTEND', 'modules/navigation/components/navigation/navigation-link/navigation-link', 'navigeer-naar-een-pagina', 'Navigate to a page.', 'TEXT', 'en') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Navigate to a page.', value_type = 'TEXT'; INSERT INTO app.translations ("component", "location", "key", "value", "value_type", "language") VALUES ('FRONTEND', 'modules/navigation/components/navigation/navigation-link/navigation-link', 'navigeer-naar-een-pagina', 'Navigeer naar een pagina.', 'TEXT', 'nl') ON CONFLICT (component, location, key, language) DO UPDATE SET value = 'Navigeer naar een pagina.', value_type = 'TEXT'; diff --git a/ui/src/client.ts b/ui/src/client.ts index f3eb7810..6f0547ab 100644 --- a/ui/src/client.ts +++ b/ui/src/client.ts @@ -18,6 +18,7 @@ export { BlockImageTitleTextButtonWrapper } from '~content-blocks/BlockImageTitl export { BlockIntro } from '~content-blocks/BlockIntro'; export { BlockKlaar } from '~content-blocks/BlockKlaar'; export { BlockMaintainersGrid } from '~content-blocks/BlockMaintainersGrid'; +export { BlockObjectsGrid } from '~content-blocks/BlockObjectsGrid'; export { BlockOverviewNewspaperTitles } from '~content-blocks/BlockOverviewNewspaperTitles'; export { BlockOverviewThemes } from '~content-blocks/BlockOverviewThemes'; export { BlockOverviewWithCarousel } from '~content-blocks/BlockOverviewWithCarousel'; diff --git a/ui/src/react-admin/core/config/config.types.ts b/ui/src/react-admin/core/config/config.types.ts index b1d97eaa..d3d40714 100644 --- a/ui/src/react-admin/core/config/config.types.ts +++ b/ui/src/react-admin/core/config/config.types.ts @@ -5,14 +5,13 @@ import type { AvoUserCommonUser, } from '@viaa/avo2-types'; import type { ComponentType, FC, FunctionComponent, MouseEvent, ReactNode } from 'react'; - +import type { OrderProperty } from '~content-blocks/BlockObjectsGrid/BlockObjectsGrid.types.ts'; import type { ContentBlockType } from '~modules/content-page/types/content-block.types'; import type { ContentPageInfo, ContentPageWidth, } from '~modules/content-page/types/content-pages.types'; import type { App, Locale } from '~modules/translations/translations.core.types'; - import type { UserBulkAction } from '~modules/user/user.types'; import type { FlowPlayerWrapperProps } from '~shared/components/FlowPlayerWrapper/FlowPlayerWrapper.types'; @@ -56,6 +55,22 @@ export interface LinkInfo { export type NavigateFunction = (to: string, options?: { replace?: boolean }) => Promise; +export interface SearchFilter { + field: string; + operator: string; + value?: string; + multiValue?: string[]; +} + +export interface IeObjectsSearchBody { + filters: SearchFilter[]; + size: number; + page: number; + requestedAggs?: string[]; + orderProp?: OrderProperty; + orderDirection?: 'asc' | 'desc'; +} + export interface AdminConfig { // Core module configurations flowplayer: { @@ -88,6 +103,13 @@ export interface AdminConfig { queryCache: { clear: (key: string) => Promise; }; + search?: { + // Converts a hetarchief search-page url (as stored on eg. the ObjectsGrid content-page + // block) into an ie-objects search API request body. Lives in the config so the client's + // own url-filter-mapping logic (used by its search page) can be reused here, without the + // admin-core needing to depend on the client package. + clientSearchUrlToApiSearchUrl: (searchQuery: string) => IeObjectsSearchBody; + }; }; components: { loader: { diff --git a/ui/src/react-admin/modules/content-page/components/ContentBlockRenderer/ContentBlockRenderer.const.tsx b/ui/src/react-admin/modules/content-page/components/ContentBlockRenderer/ContentBlockRenderer.const.tsx index da9dd477..c1968642 100644 --- a/ui/src/react-admin/modules/content-page/components/ContentBlockRenderer/ContentBlockRenderer.const.tsx +++ b/ui/src/react-admin/modules/content-page/components/ContentBlockRenderer/ContentBlockRenderer.const.tsx @@ -23,6 +23,7 @@ import { BlockImageTitleTextButtonWrapper } from '~content-blocks/BlockImageTitl import { BlockIntro } from '~content-blocks/BlockIntro'; import { BlockKlaar } from '~content-blocks/BlockKlaar'; import { BlockMaintainersGrid } from '~content-blocks/BlockMaintainersGrid'; +import { BlockObjectsGrid } from '~content-blocks/BlockObjectsGrid'; import { BlockOverviewNewspaperTitles } from '~content-blocks/BlockOverviewNewspaperTitles'; import { BlockOverviewThemes } from '~content-blocks/BlockOverviewThemes/BlockOverviewThemes.tsx'; import { BlockOverviewWithCarousel } from '~content-blocks/BlockOverviewWithCarousel/BlockOverviewWithCarousel.tsx'; @@ -81,6 +82,7 @@ export function GET_BLOCK_COMPONENT( [ContentBlockType.CardsWithoutDescription]: BlockCardsWithoutDescription, [ContentBlockType.MaintainersGrid]: BlockMaintainersGrid, [ContentBlockType.ScrollDownNudge]: BlockScrollDownNudge, + [ContentBlockType.ObjectsGrid]: BlockObjectsGrid, // Het archief specific blocks [ContentBlockType.HetArchiefHeaderSearch]: BlockHetArchiefHeaderSearch, diff --git a/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/BlockObjectsGrid.editorconfig.ts b/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/BlockObjectsGrid.editorconfig.ts new file mode 100644 index 00000000..1fa27286 --- /dev/null +++ b/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/BlockObjectsGrid.editorconfig.ts @@ -0,0 +1,176 @@ +import { AvoCoreContentPickerType } from '@viaa/avo2-types'; +import { BLOCK_FIELD_DEFAULTS, BLOCK_STATE_DEFAULTS, TEXT_FIELD } from '~content-blocks/defaults'; +import { GET_HEADING_TYPE_OPTIONS } from '~modules/content-page/const/get-heading-type-options'; +import { + type ContentBlockConfig, + ContentBlockEditor, + type ContentBlockField, + ContentBlockType, + type DefaultContentBlockState, + type HeadingTypeOption, +} from '~modules/content-page/types/content-block.types'; +import type { PickerItem } from '~modules/shared/types/content-picker'; +import { tHtml, tText } from '~shared/helpers/translation-functions'; +import { HET_ARCHIEF } from '~shared/types'; + +// The grid can hold at most 3 "fixed positions" that are always shown (see FA). +const MAX_FIXED_POSITIONS = 3; + +export interface ObjectsGridFixedPositionState { + // A single ie-object (referenced by its pid / fragmentId) that is pinned to a fixed position. + mediaItem: PickerItem; +} + +export interface ObjectsGridBlockComponentState { + title: string; + titleType: HeadingTypeOption; + // A hetarchief.be search url, e.g. https://hetarchief.be/zoeken?aanbieders=OR-...&page=1 + searchQuery: string; + // Optional (0 to 3) objects that are always shown, in the order they are entered. + elements: ObjectsGridFixedPositionState[]; +} + +const INITIAL_OBJECTS_GRID_FIXED_POSITION_STATE = (): ObjectsGridFixedPositionState => ({ + mediaItem: { + label: '', + type: AvoCoreContentPickerType.IE_OBJECT, + value: '', + }, +}); + +export const INITIAL_OBJECTS_GRID_COMPONENTS_STATE = (): ObjectsGridBlockComponentState => ({ + title: '', + titleType: 'h2', + searchQuery: '', + elements: [], +}); + +export const INITIAL_OBJECTS_GRID_BLOCK_STATE = (): DefaultContentBlockState => ({ + ...BLOCK_STATE_DEFAULTS({ + padding: { + top: 'top-large', + bottom: 'bottom-large', + }, + }), +}); + +export const OBJECTS_GRID_BLOCK_CONFIG = (position = 0): ContentBlockConfig => ({ + position, + name: tText( + 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid___objecten-grid', + undefined, + [HET_ARCHIEF] + ), + type: ContentBlockType.ObjectsGrid, + components: { + state: INITIAL_OBJECTS_GRID_COMPONENTS_STATE(), + fields: { + // Optional title, shown at the top of the block. + title: TEXT_FIELD({ + label: tText( + 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid___titel', + undefined, + [HET_ARCHIEF] + ), + validator: undefined, + }), + titleType: { + label: tText( + 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid___titel-grootte', + undefined, + [HET_ARCHIEF] + ), + editorType: ContentBlockEditor.Select, + editorProps: { + options: GET_HEADING_TYPE_OPTIONS(), + }, + }, + // Required search url on hetarchief.be that fills the grid. + searchQuery: TEXT_FIELD({ + label: tText( + 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid___zoekfilter-url', + undefined, + [HET_ARCHIEF] + ), + note: tHtml( + 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid___geef-een-zoek-url-van-hetarchief-be-in-bijvoorbeeld-https-hetarchief-be-zoeken-aanbieders-or-page-1', + undefined, + [HET_ARCHIEF] + ), + validator: (value: string) => { + const errors: string[] = []; + + if (!value) { + errors.push( + tText( + 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid___een-zoekfilter-is-verplicht', + undefined, + [HET_ARCHIEF] + ) + ); + return errors; + } + + try { + new URL(value); + } catch { + errors.push( + tText( + 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid___gelieve-een-geldige-url-in-te-vullen', + undefined, + [HET_ARCHIEF] + ) + ); + } + + return errors; + }, + }), + // Up to 3 optional fixed positions, each pinned to a specific ie-object. + elements: { + label: tText( + 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid___vaste-positie', + undefined, + [HET_ARCHIEF] + ), + type: 'fieldGroup', + min: 0, + max: MAX_FIXED_POSITIONS, + fields: { + mediaItem: { + label: tText( + 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid___object-pid-of-fragment-id', + undefined, + [HET_ARCHIEF] + ), + editorType: ContentBlockEditor.ContentPicker, + editorProps: { + allowedTypes: [AvoCoreContentPickerType.IE_OBJECT], + hideTypeDropdown: true, + }, + } as ContentBlockField, + }, + repeat: { + defaultState: INITIAL_OBJECTS_GRID_FIXED_POSITION_STATE(), + addButtonLabel: tText( + 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid___voeg-een-vaste-positie-toe', + undefined, + [HET_ARCHIEF] + ), + deleteButtonLabel: tText( + 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid___verwijder-vaste-positie', + undefined, + [HET_ARCHIEF] + ), + }, + }, + }, + }, + block: { + state: INITIAL_OBJECTS_GRID_BLOCK_STATE(), + fields: { + // Includes the block-wide background color (see FA), padding, margin, user groups and anchor. + ...BLOCK_FIELD_DEFAULTS(), + }, + }, +}); diff --git a/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/BlockObjectsGrid.scss b/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/BlockObjectsGrid.scss new file mode 100644 index 00000000..b652ed11 --- /dev/null +++ b/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/BlockObjectsGrid.scss @@ -0,0 +1,230 @@ +@use "../../../../shared/styles/settings/variables" as variables; +@use "../../../../shared/styles/settings/colors" as colors; +@use "../../../../shared/styles/mixins/typography" as typography; +@use "../../../../shared/styles/mixins/focus" as focus; +@use "../../../../shared/styles/mixins/animations" as animations; + +.c-block-objects-grid { + // Number of grid columns per breakpoint. The count is responsive (see FA) but capped at 4 + // columns; a fixed landscape tile always spans 2 of these columns. + --c-objects-grid-columns: 2; + + // All tiles share this height (standard tiles are 1 column wide, fixed tiles 2), so every + // tile lines up regardless of type. + --c-objects-grid-row-height: 22rem; + + @media (min-width: variables.$g-bp2) { + --c-objects-grid-columns: 3; + --c-objects-grid-row-height: 28rem; + } + + @media (min-width: variables.$g-bp3) { + --c-objects-grid-columns: 4; + --c-objects-grid-row-height: 32rem; + } + + .c-block-objects-grid__title { + @include typography.sofia-pro-heading-lg($important: false); + color: colors.$color-gray-1000; + margin-bottom: 2.2rem; + } + + .c-block-objects-grid__grid { + display: grid; + grid-template-columns: repeat(var(--c-objects-grid-columns), minmax(0, 1fr)); + grid-auto-rows: var(--c-objects-grid-row-height); + gap: variables.$g-spacer-unit * 2; + list-style: none; + margin: 0; + padding: 0; + } + + .c-block-objects-grid__tile { + display: flex; + min-width: 0; + + // Fixed positions are shown as a landscape tile that occupies 2 standard positions + // (2 columns), at the same height as every other tile. + &--fixed { + grid-column: span 2; + } + } + + .c-block-objects-grid__tile-link { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + min-width: 0; + text-decoration: none; + color: inherit; + @include focus.focus-outline; + } + + .c-block-objects-grid__tile-media { + position: relative; + width: 100%; + overflow: hidden; + background-color: colors.$color-gray-100; + + // Fill the tile height above the title bar; the image is cropped with object-fit: cover, + // so a 1-column (portrait) and a 2-column (landscape) tile end up exactly the same height. + flex: 1 1 auto; + min-height: 0; + + // TODO replace these audio wave forms with the new visualisation from the "ontdek" track + &--audio { + display: flex; + align-items: center; + justify-content: center; + background-color: colors.$color-gray-900; + + // Fixed waveform look for audio, which has no thumbnail. + background-image: repeating-linear-gradient( + 90deg, + colors.$color-gray-400 0, + colors.$color-gray-400 2px, + transparent 2px, + transparent 8px + ); + } + + .c-block-objects-grid__tile-image { + width: 100%; + height: 100%; + object-fit: cover; + object-position: center; + display: block; + @include animations.zoom-in-transition; + } + + + + &--newspaper { + .c-block-objects-grid__tile-image { + object-position: top; + } + } + } + + // Only limit newspapers if the tile is double width for fixed ie objects + .c-block-objects-grid__tile--fixed { + // Newspaper scans are tall pages; crop from the top so the masthead stays visible + // instead of centering on the middle of the page. + .c-block-objects-grid__tile-media--newspaper { + .c-block-objects-grid__tile-image { + width: 60%; + height: 100%; + margin: 0 auto; + object-position: top; + display: block; + @include animations.zoom-in-transition; + } + } + } + + .c-block-objects-grid__tile-placeholder { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + font-size: 4rem; + color: colors.$white; + } + + // Desktop-only zoom-in on hover (see FA). Pointer devices only, never affects keyboard focus. + @media (hover: hover) { + .c-block-objects-grid__tile-link:hover .c-block-objects-grid__tile-image { + @include animations.zoom-in-animation; + } + } + + .c-block-objects-grid__tile-titlebar { + display: flex; + align-items: flex-start; + gap: variables.$g-spacer-unit; + max-height: 9.6rem; + flex-shrink: 0; + + // Black bar with white text/icons (see FA) — contrast ratio 21:1. + background-color: colors.$color-gray-1000; + color: colors.$white; + padding: variables.$g-spacer-unit * 2; + } + + .c-block-objects-grid__tile-titlebar-left { + display: flex; + flex-direction: column; + flex: 1 1 auto; + min-width: 0; + } + + .c-block-objects-grid__tile-type-icon { + flex-shrink: 0; + width: 2.2rem; + height: 2.2rem; + font-size: 2.2rem; + line-height: 1; + + @media (min-width: variables.$g-bp2) { + width: 2.4rem; + height: 2.4rem; + font-size: 2.4rem; + } + } + + .c-block-objects-grid__tile-title { + @include typography.sofia-pro-heading-sm($important: false); + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + + @media (min-width: variables.$g-bp2) { + font-size: 1.6rem; + } + } + + .c-block-objects-grid__tile-maintainer { + font-size: 1.4rem; + font-weight: 400; + line-height: 2rem; + @include typography.truncate; + + @media (min-width: variables.$g-bp2) { + font-size: 1.6rem; + } + } + + .c-block-objects-grid__footer { + display: flex; + justify-content: center; + margin-top: variables.$g-spacer-unit * 3; + } + + .c-block-objects-grid__cta { + display: inline-flex; + align-items: center; + padding: variables.$g-spacer-unit * 1.5 variables.$g-spacer-unit * 3; + border-radius: 0.4rem; + background-color: colors.$color-gray-1000; + color: colors.$white; + @include typography.sofia-pro-heading(); + text-decoration: none; + @include focus.focus-outline; + } + + // Visually hidden but available to screen readers (for the aria-live status messages). + .c-block-objects-grid__sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip-path: inset(50%); + white-space: nowrap; + border: 0; + } +} diff --git a/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/BlockObjectsGrid.service.ts b/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/BlockObjectsGrid.service.ts new file mode 100644 index 00000000..525e6b1e --- /dev/null +++ b/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/BlockObjectsGrid.service.ts @@ -0,0 +1,129 @@ +import { stringifyUrl } from 'query-string'; +import { AdminConfigManager } from '~core/config/config.class'; +import type { IeObjectsSearchBody } from '~core/config/config.types'; +import { CustomError } from '~shared/helpers/custom-error'; +import { fetchWithLogout, fetchWithLogoutJson } from '~shared/helpers/fetch-with-logout'; +import { getProxyUrl } from '~shared/helpers/get-proxy-url-from-admin-core-config'; +import { mapFormatToType } from '~shared/helpers/mapFormatToType.ts'; +import type { PickerItem } from '~shared/types/content-picker'; +import { type ObjectsGridItem, OrderProperty } from './BlockObjectsGrid.types'; + +/** + * How many query-result objects to request. The grid shows 4 rows and the number of columns + * is responsive (see the FA), so we fetch enough to fill the widest layout; the grid clamps + * what is actually rendered via CSS. + */ +export const DEFAULT_OBJECTS_GRID_LIMIT = 24; + +/** + * Shape of a single item as returned by both `POST /ie-objects` (search, in `.items`) and + * `GET /ie-objects?schemaIdentifiers=…` (array). Only the fields the grid needs are declared. + */ +interface RawIeObject { + schemaIdentifier: string; + name?: string; + maintainerName?: string; + // dcterms format, e.g. "video" | "audio" | "newspaper". + dctermsFormat?: string; + thumbnailUrl?: string; +} + +const mapRawToGridItem = (raw: RawIeObject): ObjectsGridItem => ({ + schemaIdentifier: raw.schemaIdentifier, + name: raw.name || '', + maintainerName: raw.maintainerName, + type: mapFormatToType(raw.dctermsFormat), + thumbnailUrl: raw.thumbnailUrl, +}); + +/** + * Convert a raw hetarchief.be `/zoeken` search URL into the ie-objects search body. + * + * The actual url-param-to-filter mapping logic lives client-side (it mirrors the search page's + * own filter logic, which the admin-core cannot import — the client depends on the admin-core, + * not the other way around), and is passed in through the admin-core config as + * `services.search.searchUrlToApiUrl`. + * + * Notice: this doesn't work inside the demo app, since the client doesn't pass us the conversion url function + */ +export const parseSearchQueryToSearchBody = (searchQuery: string): IeObjectsSearchBody => { + const clientSearchUrlToApiSearchUrl = + AdminConfigManager.getConfig().services.search?.clientSearchUrlToApiSearchUrl; + if (!clientSearchUrlToApiSearchUrl) { + return { filters: [], size: 20, page: 1 }; + } + return clientSearchUrlToApiSearchUrl(searchQuery); +}; + +const searchIeObjects = async (body: IeObjectsSearchBody): Promise => { + const response: { items?: RawIeObject[] } = await fetchWithLogoutJson( + `${getProxyUrl()}/ie-objects`, + { + method: 'POST', + body: JSON.stringify(body), + } + ); + return (response.items || []).map(mapRawToGridItem); +}; + +/** + * Resolve the pinned "fixed position" objects (by their schemaIdentifier / pid) to full objects, + * in a single `GET /ie-objects?schemaIdentifiers=…` call, preserving the admin-configured order. + */ +const getFixedObjects = async (fixedItems: PickerItem[]): Promise => { + const identifiers = fixedItems.map((item) => item.value).filter(Boolean); + + if (identifiers.length === 0) { + return []; + } + + const url = stringifyUrl({ + url: `${getProxyUrl()}/ie-objects`, + query: { schemaIdentifiers: identifiers, resolveThumbnailUrl: 'true' }, + }); + const response = await fetchWithLogout(url); + const raw: RawIeObject[] = response.ok ? await response.json() : []; + const bySchemaIdentifier = new Map(raw.map((item) => [item.schemaIdentifier, item])); + + // Keep the admin-configured order, drop identifiers that resolved to nothing. + return identifiers + .map((id) => bySchemaIdentifier.get(id)) + .filter((item): item is RawIeObject => Boolean(item)) + .map(mapRawToGridItem); +}; + +export interface ObjectsGridData { + fixedObjects: ObjectsGridItem[]; + objects: ObjectsGridItem[]; +} + +export const getObjectsGridItems = async ( + searchQuery: string, + fixedItems: PickerItem[], + limit = DEFAULT_OBJECTS_GRID_LIMIT +): Promise => { + try { + const apiSearchQueryParams = parseSearchQueryToSearchBody(searchQuery); + // Grid needs to show random items, except for the fixed items + apiSearchQueryParams.orderProp = OrderProperty.RANDOM; + apiSearchQueryParams.size = limit; + + const [fixedObjects, objects] = await Promise.all([ + getFixedObjects(fixedItems), + searchQuery ? searchIeObjects(apiSearchQueryParams) : Promise.resolve([]), + ]); + + // Don't show the same object twice if it is both pinned and returned by the query. + const fixedIds = new Set(fixedObjects.map((item) => item.schemaIdentifier)); + return { + fixedObjects, + objects: objects.filter((item) => !fixedIds.has(item.schemaIdentifier)), + }; + } catch (err) { + throw new CustomError('Failed to fetch objects for the objects-grid block', err, { + searchQuery, + fixedItems, + limit, + }); + } +}; diff --git a/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/BlockObjectsGrid.tsx b/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/BlockObjectsGrid.tsx new file mode 100644 index 00000000..f007aeab --- /dev/null +++ b/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/BlockObjectsGrid.tsx @@ -0,0 +1,260 @@ +import { Button } from '@meemoo/react-components'; +import type { IconName } from '@viaa/avo2-components'; +import { AvoCoreContentPickerType } from '@viaa/avo2-types'; +import clsx from 'clsx'; +import type { FunctionComponent, ReactElement, ReactNode } from 'react'; +import { useEffect, useState } from 'react'; +import { BlockHeading } from '~content-blocks/BlockHeading'; +import { ItemsService } from '~modules/item/items.service.ts'; +import { SmartLink } from '~modules/shared/components/SmartLink/SmartLink'; +import { Icon } from '~shared/components/Icon'; +import { Link } from '~shared/components/Link'; +import { BREAKPOINTS } from '~shared/consts/breakpoints.ts'; +import { getIconFromObjectType } from '~shared/helpers/icon.ts'; +import { tText } from '~shared/helpers/translation-functions'; +import { HET_ARCHIEF } from '~shared/types'; +import type { BlockObjectsGridProps, ObjectsGridItem, OrderedTile } from './BlockObjectsGrid.types'; +import { useGetObjectsGridItems } from './hooks/useGetObjectsGridItems'; +import './BlockObjectsGrid.scss'; + +// 4 rows of 4 items per row when there are no fixed items present +// https://meemoo.atlassian.net/wiki/spaces/HA2/pages/6217171023/FA+Objecten+grid#Gedrag-van-het-contentblok +const OBJECT_GRID_MAX_ITEMS = 16; + +export const BlockObjectsGrid: FunctionComponent = ({ + className, + title, + titleType = 'h2', + searchQuery, + elements = [], + backgroundColor, +}): ReactNode => { + const fixedItems = elements.map((element) => element.mediaItem).filter((item) => item?.value); + // Items to fetch is: max - 2 * fixed items, because fixed items are double width + const { data, isLoading, isError } = useGetObjectsGridItems( + searchQuery, + fixedItems, + OBJECT_GRID_MAX_ITEMS - fixedItems.length * 2 + ); + + // Tracks viewport width so the tablet/mobile breakpoints can hide tiles that would + // otherwise leave the last row half-filled (desktop always fetches an exact 4 rows). + const [windowWidth, setWindowWidth] = useState(() => + typeof window === 'undefined' ? BREAKPOINTS.desktop : window.innerWidth + ); + + useEffect(() => { + const handleResize = (): void => setWindowWidth(window.innerWidth); + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, []); + + // Number of grid columns and rows shown per breakpoint (see FA linked above). + const getColumnsForWidth = (width: number): number => { + if (width >= BREAKPOINTS.desktop) { + return 4; + } + if (width >= BREAKPOINTS.tablet) { + return 3; + } + return 2; + }; + + // Packs tiles into rows the same way the CSS grid renders them (auto-flow row, not dense): + // a fixed (2-column-wide) tile that doesn't fit the remaining space in a row wraps to the + // next row, leaving the remainder of the current row empty. + const packTilesIntoRows = (tiles: OrderedTile[], columns: number): OrderedTile[][] => { + const rows: OrderedTile[][] = []; + let currentRow: OrderedTile[] = []; + let usedColumns = 0; + + tiles.forEach((tile) => { + const width = tile.isFixed ? 2 : 1; + if (usedColumns + width > columns) { + rows.push(currentRow); + currentRow = []; + usedColumns = 0; + } + currentRow.push(tile); + usedColumns += width; + }); + if (currentRow.length > 0) { + rows.push(currentRow); + } + return rows; + }; + + // Limits the tiles to what fits in the max number of rows for this breakpoint, dropping + // tiles from an incomplete trailing row so the last visible row is always fully filled. + const getVisibleTiles = (tiles: OrderedTile[], columns: number): OrderedTile[] => { + const visibleRows = packTilesIntoRows(tiles, columns); + + // Find the last row + const lastRow = visibleRows[visibleRows.length - 1]; + // Count how many cells are used on the last row + // Double width tiles are counted double + // Single width tiles are counted single + const lastRowUsedColumns = lastRow?.reduce((sum, tile) => sum + (tile.isFixed ? 2 : 1), 0) ?? 0; + if (lastRow && lastRowUsedColumns < columns) { + visibleRows.pop(); + } + + return visibleRows.flat(); + }; + + // The searchQuery is a full url pointing to the search page on hetarchief.be, but since this + // admin-core module is embedded on that same site, we want a relative link instead of an + // absolute one pointing to a specific domain (eg qas./int./prod.hetarchief.be). + const stripDomain = (url: string): string => { + try { + const parsed = new URL(url); + return `${parsed.pathname}${parsed.search}${parsed.hash}`; + } catch { + return url; + } + }; + + const renderTile = (item: ObjectsGridItem, isFixed: boolean): ReactElement => { + const iconName = item.type ? getIconFromObjectType(item.type) : undefined; + + return ( +
  • + +
    + {item.thumbnailUrl ? ( + + ) : ( + // No thumbnail (e.g. audio): decorative placeholder, the link already carries the name. + + )} +
    +
    +
    + {item.name} + {item.maintainerName && ( + {item.maintainerName} + )} +
    + {iconName && ( + + )} +
    +
    +
  • + ); + }; + + const fixedObjects = data?.fixedObjects ?? []; + const objects = data?.objects ?? []; + + // Interleave order (see functional analysis): the first fixed object, then 2 random results, + // then the remaining fixed objects, then the rest of the random results. + // e.g. F1, R, R, F2, F3, R, R, … — with fixed tiles spanning 2 columns this puts F1 on row 1 + // and F2/F3 on row 2. + const [firstFixed, ...restFixed] = fixedObjects; + const orderedTiles: { item: ObjectsGridItem; isFixed: boolean }[] = [ + ...(firstFixed ? [{ item: firstFixed, isFixed: true }] : []), + ...objects.slice(0, 2).map((item) => ({ item, isFixed: false })), + ...restFixed.map((item) => ({ item, isFixed: true })), + ...objects.slice(2).map((item) => ({ item, isFixed: false })), + ]; + + const columns = getColumnsForWidth(windowWidth); + const visibleTiles = getVisibleTiles(orderedTiles, columns); + const hasObjects = visibleTiles.length > 0; + + return ( +
    + {title && ( + + {title} + + )} + + {/* Screen-reader status for the dynamic (async) content. */} + + {isLoading && + tText( + 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid___objecten-worden-geladen', + undefined, + [HET_ARCHIEF] + )} + {isError && + tText( + 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid___er-konden-geen-objecten-geladen-worden', + undefined, + [HET_ARCHIEF] + )} + {!isLoading && + !isError && + !hasObjects && + tText( + 'modules/content-page/components/blocks/block-objects-grid/block-objects-grid___er-zijn-geen-objecten-gevonden', + undefined, + [HET_ARCHIEF] + )} + + + {hasObjects && ( +
      + {visibleTiles.map(({ item, isFixed }) => renderTile(item, isFixed))} +
    + )} + + {searchQuery && ( +
    + +
    + )} +
    + ); +}; diff --git a/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/BlockObjectsGrid.types.ts b/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/BlockObjectsGrid.types.ts new file mode 100644 index 00000000..b5247297 --- /dev/null +++ b/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/BlockObjectsGrid.types.ts @@ -0,0 +1,56 @@ +import type { HeadingTypeOption } from '~modules/content-page/types/content-block.types'; +import type { DefaultComponentProps } from '~modules/shared/types/components'; +import type { PickerItem } from '~modules/shared/types/content-picker'; +import type { ObjectType } from '~shared/helpers/mapFormatToType.ts'; + +export type OrderedTile = { item: ObjectsGridItem; isFixed: boolean }; + +/** + * A single IE-object as rendered in the grid. + * + * NOTE (backend contract): this is the normalised shape the component renders. The raw + * search response is mapped to this in `BlockObjectsGrid.service.ts`. If the search proxy + * returns different field names, adjust the mapping there — the component only depends on + * this interface. + */ +export interface ObjectsGridItem { + // pid / fragmentId, used for the detail-page link and as the React key. + schemaIdentifier: string; + // Object title, shown in the title bar. + name: string; + // Provider / maintainer name, shown in the title bar. + maintainerName?: string; + // Object type, drives the type-icon. Falls back to a generic icon when unknown. + type?: ObjectType; + // Thumbnail (video / newspaper / image). Absent for audio → waveform fallback is shown. + thumbnailUrl?: string; +} + +/** + * A single configured "fixed position": a pinned ie-object shown before the query results. + * `mediaItem.value` holds the object's schemaIdentifier (pid / fragmentId). + */ +export interface ObjectsGridFixedPosition { + mediaItem: PickerItem; +} + +export interface BlockObjectsGridProps extends DefaultComponentProps { + // Optional heading shown above the grid. + title?: string; + titleType?: HeadingTypeOption; + // Raw hetarchief.be search URL that fills the grid, e.g. + // https://hetarchief.be/zoeken?aanbieders=OR-...&page=1 + searchQuery: string; + // 0..3 fixed positions, always shown first (as landscape tiles on rows 1-2). + elements?: ObjectsGridFixedPosition[]; + // Block-wide background color (from the block-level "Blok-opties"). + backgroundColor?: string; +} + +export enum OrderProperty { + RELEVANCE = 'relevance', + CREATED = 'created', + ARCHIVED = 'archived', + NAME = 'name', + RANDOM = 'random', +} diff --git a/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/hooks/useGetObjectsGridItems.tsx b/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/hooks/useGetObjectsGridItems.tsx new file mode 100644 index 00000000..05f2ac72 --- /dev/null +++ b/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/hooks/useGetObjectsGridItems.tsx @@ -0,0 +1,27 @@ +import { useQuery } from '@tanstack/react-query'; +import type { PickerItem } from '~modules/shared/types/content-picker'; +import { QUERY_KEYS } from '~shared/types'; +import { + DEFAULT_OBJECTS_GRID_LIMIT, + getObjectsGridItems, + type ObjectsGridData, +} from '../BlockObjectsGrid.service'; + +export const useGetObjectsGridItems = ( + searchQuery: string, + fixedItems: PickerItem[], + limit = DEFAULT_OBJECTS_GRID_LIMIT +) => { + return useQuery({ + queryKey: [ + QUERY_KEYS.GET_OBJECTS_GRID_ITEMS, + searchQuery, + limit, + fixedItems.map((item) => item.value).join(','), + ], + queryFn: () => getObjectsGridItems(searchQuery, fixedItems, limit), + // FA: a different random selection should be shown on every load, so don't serve stale data. + staleTime: 0, + enabled: Boolean(searchQuery) || fixedItems.length > 0, + }); +}; diff --git a/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/index.ts b/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/index.ts new file mode 100644 index 00000000..b22e47d8 --- /dev/null +++ b/ui/src/react-admin/modules/content-page/components/blocks/BlockObjectsGrid/index.ts @@ -0,0 +1,6 @@ +export { BlockObjectsGrid } from './BlockObjectsGrid'; +export { + INITIAL_OBJECTS_GRID_BLOCK_STATE, + INITIAL_OBJECTS_GRID_COMPONENTS_STATE, + OBJECTS_GRID_BLOCK_CONFIG, +} from './BlockObjectsGrid.editorconfig'; diff --git a/ui/src/react-admin/modules/content-page/components/blocks/BlockOverviewThemes/BlockOverviewThemes.scss b/ui/src/react-admin/modules/content-page/components/blocks/BlockOverviewThemes/BlockOverviewThemes.scss index e055666e..e4adb8b1 100644 --- a/ui/src/react-admin/modules/content-page/components/blocks/BlockOverviewThemes/BlockOverviewThemes.scss +++ b/ui/src/react-admin/modules/content-page/components/blocks/BlockOverviewThemes/BlockOverviewThemes.scss @@ -81,6 +81,7 @@ $tile-padding: 3rem; aspect-ratio: 4/3; overflow: hidden; text-decoration: none; + @include focus.focus-outline; @media (min-width: variables.$g-bp2) { // Size comes from the grid row/column spans below instead of a fixed aspect ratio. @@ -108,9 +109,6 @@ $tile-padding: 3rem; grid-row: span 1 !important; } - &:focus-visible { - @include focus.focus; - } &:hover &-image > img { @include animations.zoom-in-animation; diff --git a/ui/src/react-admin/modules/content-page/components/blocks/BlockOverviewWithCarousel/BlockOverviewWithCarousel.scss b/ui/src/react-admin/modules/content-page/components/blocks/BlockOverviewWithCarousel/BlockOverviewWithCarousel.scss index 2b0bc312..8e1c9269 100644 --- a/ui/src/react-admin/modules/content-page/components/blocks/BlockOverviewWithCarousel/BlockOverviewWithCarousel.scss +++ b/ui/src/react-admin/modules/content-page/components/blocks/BlockOverviewWithCarousel/BlockOverviewWithCarousel.scss @@ -3,6 +3,7 @@ @use "../../../../shared/styles/settings/colors" as colors; @use "../../../../shared/styles/mixins/typography" as typography; @use "../../../../shared/styles/mixins/animations" as animations; +@use "../../../../shared/styles/mixins/focus" as focus; $slide-width: 28rem; @@ -95,10 +96,7 @@ $slide-width: 28rem; a { text-decoration: none; - - &:focus-visible { - outline: 2px solid colors.$color-ocean-green; - } + @include focus.focus-outline; } &:hover { diff --git a/ui/src/react-admin/modules/content-page/components/blocks/BlockThemeReels/BlockThemeReelSection.tsx b/ui/src/react-admin/modules/content-page/components/blocks/BlockThemeReels/BlockThemeReelSection.tsx index bdaab9a3..7f09f0d8 100644 --- a/ui/src/react-admin/modules/content-page/components/blocks/BlockThemeReels/BlockThemeReelSection.tsx +++ b/ui/src/react-admin/modules/content-page/components/blocks/BlockThemeReels/BlockThemeReelSection.tsx @@ -1,21 +1,23 @@ -import { type IconName, Image, LinkTarget } from '@viaa/avo2-components'; -import React, { type FunctionComponent, type ReactNode, useEffect, useState } from 'react'; -import type { DefaultComponentProps } from '~modules/shared/types/components'; -import './BlockThemeReelsSection.scss'; import { Button } from '@meemoo/react-components'; +import { type IconName, Image, LinkTarget } from '@viaa/avo2-components'; import { AvoCoreContentPickerType } from '@viaa/avo2-types'; import clsx from 'clsx'; +import React, { type FunctionComponent, type ReactNode, useEffect, useState } from 'react'; import type SwiperController from 'swiper'; import { Controller } from 'swiper/modules'; import { Swiper, SwiperSlide } from 'swiper/react'; import { useGetThemeWithObjects } from '~content-blocks/BlockThemeReels/hooks/useGetThemeWithObjects.ts'; import { AdminConfigManager } from '~core/config'; +import type { DefaultComponentProps } from '~modules/shared/types/components'; import { App, Locale } from '~modules/translations/translations.core.types.ts'; import { Icon } from '~shared/components/Icon'; import { generateSmartLink } from '~shared/components/SmartLink/SmartLink.tsx'; +import { getIconFromObjectType } from '~shared/helpers/icon.ts'; import { isMobileWidth } from '~shared/helpers/media-query.ts'; import { tText } from '~shared/helpers/translation-functions.ts'; import 'swiper/css'; +import './BlockThemeReelsSection.scss'; +import type { ObjectType } from '~shared/helpers/mapFormatToType.ts'; export interface BlockThemeReelSectionProps extends DefaultComponentProps { themeId: string; @@ -61,36 +63,13 @@ export const BlockThemeReelSection: FunctionComponent { - switch (format) { - case 'film': - case 'video': - case 'videofragment': - return 'no-video--light'; - - case 'audio': - case 'audiofragment': - return 'no-audio--light'; - - case 'newspaper': - case 'newspaperpage': - return 'no-newspaper--light'; - - case 'image': - return 'no-image--light'; - - default: - return 'no-file--light'; - } - }; - const renderSlideContent = ( image: string, imageAlt: string, title: string, description: string, className?: string, - format?: string + format?: ObjectType ) => { return ( <> diff --git a/ui/src/react-admin/modules/content-page/components/blocks/BlockThemeReels/BlockThemeReelsSection.scss b/ui/src/react-admin/modules/content-page/components/blocks/BlockThemeReels/BlockThemeReelsSection.scss index b659aeba..4914c86e 100644 --- a/ui/src/react-admin/modules/content-page/components/blocks/BlockThemeReels/BlockThemeReelsSection.scss +++ b/ui/src/react-admin/modules/content-page/components/blocks/BlockThemeReels/BlockThemeReelsSection.scss @@ -3,6 +3,7 @@ @use "../../../../shared/styles/settings/colors" as colors; @use '../../../../shared/styles/mixins/typography' as typography; @use '../../../../shared/styles/mixins/animations' as animations; +@use "../../../../shared/styles/mixins/focus" as focus; .c-block-theme-reels-section { & + & { @@ -127,10 +128,7 @@ a { text-decoration: none; - - &:focus-visible { - outline: 2px solid colors.$color-ocean-green; - } + @include focus.focus-outline; } &:hover:not(&--first) { diff --git a/ui/src/react-admin/modules/content-page/const/content-block-config-map.ts b/ui/src/react-admin/modules/content-page/const/content-block-config-map.ts index 9406f588..8d4ac338 100644 --- a/ui/src/react-admin/modules/content-page/const/content-block-config-map.ts +++ b/ui/src/react-admin/modules/content-page/const/content-block-config-map.ts @@ -27,6 +27,7 @@ import { MAINTAINERS_GRID_BLOCK_CONFIG } from '~content-blocks/BlockMaintainersG import { MEDIA_GRID_BLOCK_CONFIG } from '~content-blocks/BlockMediaGrid'; import { OVERVIEW_NEWSPAPER_TITLES_BLOCK_CONFIG } from '~content-blocks/BlockOverviewNewspaperTitles'; import { OVERVIEW_WITH_CAROUSEL_CONFIG } from '~content-blocks/BlockOverviewWithCarousel'; +import { OBJECTS_GRID_BLOCK_CONFIG } from '~content-blocks/BlockObjectsGrid'; import { OVERVIEW_THEMES_BLOCK_CONFIG } from '~content-blocks/BlockOverviewThemes'; import { QUOTE_BLOCK_CONFIG } from '~content-blocks/BlockQuote'; import { @@ -94,5 +95,6 @@ export const CONTENT_BLOCK_CONFIG_MAP: Record< [ContentBlockType.HomepageBanner]: CONTENT_HOMEPAGE_BANNER_CONFIG, [ContentBlockType.HighlightText]: CONTENT_HIGHLIGHT_TEXT_CONFIG, [ContentBlockType.ThemeReels]: THEME_REELS_BLOCK_CONFIG, + [ContentBlockType.ObjectsGrid]: OBJECTS_GRID_BLOCK_CONFIG, [ContentBlockType.OverviewThemes]: OVERVIEW_THEMES_BLOCK_CONFIG, }; diff --git a/ui/src/react-admin/modules/content-page/const/content-block-initial-state-map.ts b/ui/src/react-admin/modules/content-page/const/content-block-initial-state-map.ts index 61b21ca0..8feca892 100644 --- a/ui/src/react-admin/modules/content-page/const/content-block-initial-state-map.ts +++ b/ui/src/react-admin/modules/content-page/const/content-block-initial-state-map.ts @@ -27,6 +27,7 @@ import { INITIAL_MAINTAINERS_GRID_BLOCK_STATE } from '~content-blocks/BlockMaint import { INITIAL_MEDIA_GRID_COMPONENTS_STATE } from '~content-blocks/BlockMediaGrid'; import { INITIAL_OVERVIEW_NEWSPAPER_TITLES_BLOCK_STATE } from '~content-blocks/BlockOverviewNewspaperTitles'; import { INITIAL_OVERVIEW_WITH_CAROUSEL_BLOCK_STATE } from '~content-blocks/BlockOverviewWithCarousel/BlockOverviewWithCarousel.editorconfig.ts'; +import { INITIAL_OBJECTS_GRID_BLOCK_STATE } from '~content-blocks/BlockObjectsGrid'; import { INITIAL_OVERVIEW_THEMES_COMPONENTS_STATE } from '~content-blocks/BlockOverviewThemes/BlockOverviewThemes.editorconfig.ts'; import { INITIAL_PAGE_OVERVIEW_COMPONENTS_STATE } from '~content-blocks/BlockPageOverview'; import { INITIAL_QUOTE_COMPONENTS_STATE } from '~content-blocks/BlockQuote'; @@ -97,5 +98,6 @@ export const CONTENT_BLOCK_INITIAL_STATE_MAP: { [ContentBlockType.HomepageBanner]: INITIAL_CONTENT_HOMEPAGE_BANNER_BLOCK_STATE, [ContentBlockType.HighlightText]: INITIAL_CONTENT_HIGHLIGHT_TEXT_BLOCK_STATE, [ContentBlockType.ThemeReels]: INITIAL_THEME_REELS_COMPONENTS_STATE, + [ContentBlockType.ObjectsGrid]: INITIAL_OBJECTS_GRID_BLOCK_STATE, [ContentBlockType.OverviewThemes]: INITIAL_OVERVIEW_THEMES_COMPONENTS_STATE, }; diff --git a/ui/src/react-admin/modules/content-page/const/get-content-block-type-options.ts b/ui/src/react-admin/modules/content-page/const/get-content-block-type-options.ts index 18f589ed..0bc16c56 100644 --- a/ui/src/react-admin/modules/content-page/const/get-content-block-type-options.ts +++ b/ui/src/react-admin/modules/content-page/const/get-content-block-type-options.ts @@ -206,6 +206,14 @@ export const GET_CONTENT_BLOCK_TYPE_OPTIONS: () => SelectOption[] = () = ]), value: ContentBlockType.ThemeReels, }, + { + label: tText( + 'modules/content-page/const/get-content-block-type-options___objecten-grid', + {}, + [HET_ARCHIEF] + ), + value: ContentBlockType.ObjectsGrid, + }, { label: tText( "modules/content-page/const/get-content-block-type-options___overzicht-themas", diff --git a/ui/src/react-admin/modules/content-page/types/content-block.types.ts b/ui/src/react-admin/modules/content-page/types/content-block.types.ts index fd3961a8..8e82b973 100644 --- a/ui/src/react-admin/modules/content-page/types/content-block.types.ts +++ b/ui/src/react-admin/modules/content-page/types/content-block.types.ts @@ -190,6 +190,7 @@ export enum ContentBlockType { HomepageBanner = 'HOMEPAGE_BANNER', HighlightText = 'HIGHLIGHT_TEXT', ThemeReels = 'THEME_REELS', + ObjectsGrid = 'OBJECTS_GRID', OverviewThemes = 'OVERVIEW_THEMES', } diff --git a/ui/src/react-admin/modules/content-page/views/ContentPageEdit.scss b/ui/src/react-admin/modules/content-page/views/ContentPageEdit.scss index d4e4e8bf..c15554b1 100644 --- a/ui/src/react-admin/modules/content-page/views/ContentPageEdit.scss +++ b/ui/src/react-admin/modules/content-page/views/ContentPageEdit.scss @@ -1,4 +1,5 @@ @use "../../shared/styles/settings/colors" as colors; +@use "../../shared/styles/mixins/typography" as typography; @use "./react-split-pane"; .c-content-edit-view__sidebar { @@ -7,9 +8,7 @@ > .o-sidebar__content { .c-select__control .c-select__placeholder { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + @include typography.truncate; } > .c-navbar { diff --git a/ui/src/react-admin/modules/index.ts b/ui/src/react-admin/modules/index.ts index ed8c9bc1..7bb48a1f 100644 --- a/ui/src/react-admin/modules/index.ts +++ b/ui/src/react-admin/modules/index.ts @@ -122,6 +122,7 @@ export * from './content-page/components/blocks/BlockIntro/BlockIntro'; export * from './content-page/components/blocks/BlockKlaar/BlockKlaar'; export * from './content-page/components/blocks/BlockMaintainersGrid/BlockMaintainersGrid'; export * from './content-page/components/blocks/BlockMediaGrid/BlockMediaGrid.editorconfig'; +export * from './content-page/components/blocks/BlockObjectsGrid/BlockObjectsGrid'; export * from './content-page/components/blocks/BlockOverviewNewspaperTitles/BlockOverviewNewspaperTitles'; export * from './content-page/components/blocks/BlockPageOverview/BlockPageOverview'; export * from './content-page/components/blocks/BlockQuote/BlockQuote'; diff --git a/ui/src/react-admin/modules/item/items.service.ts b/ui/src/react-admin/modules/item/items.service.ts index 68e9bdd1..06a7fc53 100644 --- a/ui/src/react-admin/modules/item/items.service.ts +++ b/ui/src/react-admin/modules/item/items.service.ts @@ -2,9 +2,14 @@ import type { AvoItemItem } from '@viaa/avo2-types'; import { stringifyUrl } from 'query-string'; import { fetchWithLogoutJson } from '~shared/helpers/fetch-with-logout'; import { getAdminCoreApiUrl } from '~shared/helpers/get-proxy-url-from-admin-core-config'; +import { isHetArchief } from '~shared/helpers/is-hetarchief.ts'; import { CustomError } from '../shared/helpers/custom-error'; import { addDefaultAudioStillToItem } from '../shared/helpers/default-still'; +// NOTE (client route): ie-object detail pages live under this path on hetarchief.be. Adjust +// the prefix if the client application uses a different detail route for objects. +const OBJECT_DETAIL_PATH_PREFIX = '/pid'; + export class ItemsService { private static getBaseUrl(): string { return `${getAdminCoreApiUrl()}/admin/items`; @@ -64,4 +69,13 @@ export class ItemsService { }); } } + + public static getObjectDetailPath(schemaIdentifier: string): string { + if (!isHetArchief()) { + throw new CustomError('getObjectDetailPath is only available on hetarchief.be', null, { + schemaIdentifier, + }); + } + return `${OBJECT_DETAIL_PATH_PREFIX}/${encodeURIComponent(schemaIdentifier)}`; + } } diff --git a/ui/src/react-admin/modules/shared/components/FileUpload/FileUpload.scss b/ui/src/react-admin/modules/shared/components/FileUpload/FileUpload.scss index c077721e..a8777663 100644 --- a/ui/src/react-admin/modules/shared/components/FileUpload/FileUpload.scss +++ b/ui/src/react-admin/modules/shared/components/FileUpload/FileUpload.scss @@ -1,3 +1,5 @@ +@use "../../styles/mixins/typography" as typography; + .c-file-upload { position: relative; @@ -34,9 +36,7 @@ } [class^="Button-module_c-button__label__"] { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + @include typography.truncate; } input[type="file"] { diff --git a/ui/src/react-admin/modules/shared/consts/breakpoints.ts b/ui/src/react-admin/modules/shared/consts/breakpoints.ts new file mode 100644 index 00000000..f3b801bb --- /dev/null +++ b/ui/src/react-admin/modules/shared/consts/breakpoints.ts @@ -0,0 +1,4 @@ +export const BREAKPOINTS = { + tablet: 700, // $g-bp2 + desktop: 900, // $g-bp3 +}; diff --git a/ui/src/react-admin/modules/shared/helpers/icon.ts b/ui/src/react-admin/modules/shared/helpers/icon.ts new file mode 100644 index 00000000..e663f145 --- /dev/null +++ b/ui/src/react-admin/modules/shared/helpers/icon.ts @@ -0,0 +1,25 @@ +import type { IconName } from '@viaa/avo2-components'; +import { ObjectType } from '~shared/helpers/mapFormatToType.ts'; + +export function getIconFromObjectType(format: ObjectType | undefined): IconName { + switch (format) { + case ObjectType.film: + case ObjectType.video: + case ObjectType.videofragment: + return 'no-video--light' as IconName; + + case ObjectType.audio: + case ObjectType.audiofragment: + return 'no-audio--light' as IconName; + + case ObjectType.newspaper: + case ObjectType.newspaperpage: + return 'no-newspaper--light' as IconName; + + case ObjectType.image: + return 'no-image--light' as IconName; + + default: + return 'no-file--light' as IconName; + } +} diff --git a/ui/src/react-admin/modules/shared/helpers/mapFormatToType.ts b/ui/src/react-admin/modules/shared/helpers/mapFormatToType.ts new file mode 100644 index 00000000..bdb1d2e4 --- /dev/null +++ b/ui/src/react-admin/modules/shared/helpers/mapFormatToType.ts @@ -0,0 +1,28 @@ +export enum ObjectType { + audio = 'audio', + audiofragment = 'audiofragment', + film = 'film', + image = 'image', + newspaper = 'newspaper', + newspaperpage = 'newspaperpage', + video = 'video', + videofragment = 'videofragment', +} + +export function mapFormatToType(format?: string): ObjectType | undefined { + switch ((format || '').toLowerCase()) { + case 'video': + case 'film': + return ObjectType.video; + case 'audio': + return ObjectType.audio; + case 'newspaper': + case 'krant': + return ObjectType.newspaper; + case 'image': + case 'photo': + return ObjectType.image; + default: + return undefined; + } +} diff --git a/ui/src/react-admin/modules/shared/services/themes-service/themes.types.ts b/ui/src/react-admin/modules/shared/services/themes-service/themes.types.ts index ebbe1421..992fc3f6 100644 --- a/ui/src/react-admin/modules/shared/services/themes-service/themes.types.ts +++ b/ui/src/react-admin/modules/shared/services/themes-service/themes.types.ts @@ -1,3 +1,5 @@ +import type { ObjectType } from '~shared/helpers/mapFormatToType.ts'; + export interface Theme { id: string; slug: string; @@ -15,7 +17,7 @@ export interface ThemeWithObjects extends Theme { id: string; schemaIdentifier: string; name: string; - format: string; + format: ObjectType; thumbnailUrl: string; maintainerId: string; maintainerName: string; diff --git a/ui/src/react-admin/modules/shared/styles/components/_title-overlay.scss b/ui/src/react-admin/modules/shared/styles/components/_title-overlay.scss index 15b95863..2c032ccb 100644 --- a/ui/src/react-admin/modules/shared/styles/components/_title-overlay.scss +++ b/ui/src/react-admin/modules/shared/styles/components/_title-overlay.scss @@ -1,5 +1,6 @@ @use "../../styles/settings/colors" as colors; @use "../../styles/settings/variables" as variables; +@use "../../styles/mixins/typography" as typography; /* ========================================================================== Component: Title overlay @@ -27,11 +28,9 @@ $c-title-overlay-padding: 1.6rem; padding: 0.8rem 1.2rem; margin: 0 0 1rem; font-size: 1.8rem; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; display: inline-block; max-width: calc(100% - #{$c-title-overlay-padding * 2}); + @include typography.truncate; } .c-title-overlay__source { diff --git a/ui/src/react-admin/modules/shared/styles/mixins/_focus.scss b/ui/src/react-admin/modules/shared/styles/mixins/_focus.scss index 4cb0fb8b..750699ce 100644 --- a/ui/src/react-admin/modules/shared/styles/mixins/_focus.scss +++ b/ui/src/react-admin/modules/shared/styles/mixins/_focus.scss @@ -1,6 +1,11 @@ -@use '../../styles/settings/colors' as colors; +@use "../../styles/settings/colors" as colors; -@mixin focus { - outline: 2px solid colors.$color-ocean-green; - outline-offset: 2px; +/** + * Provides a focus outline for keyboard navigation. + */ +@mixin focus-outline { + &:focus-visible { + outline: 2px solid colors.$color-ocean-green; + outline-offset: 2px; + } } diff --git a/ui/src/react-admin/modules/shared/styles/mixins/_typography.scss b/ui/src/react-admin/modules/shared/styles/mixins/_typography.scss index f048a56c..91f8b847 100644 --- a/ui/src/react-admin/modules/shared/styles/mixins/_typography.scss +++ b/ui/src/react-admin/modules/shared/styles/mixins/_typography.scss @@ -37,6 +37,14 @@ $font-family: "SofiaPro", sans-serif; @include sofia-pro(1.8rem, 800, 2.8rem, $important); } +@mixin sofia-pro-heading($important: false) { + @include sofia-pro(1.6rem, 800, 2.4rem, $important); +} + +@mixin sofia-pro-heading-sm($important: false) { + @include sofia-pro(1.4rem, 800, 2rem, $important); +} + @mixin sofia-pro-body($important: false) { @include sofia-pro(1.8rem, 500, 2.8rem, $important); } diff --git a/ui/src/react-admin/modules/shared/types/index.ts b/ui/src/react-admin/modules/shared/types/index.ts index 6ecd65ed..201c00ae 100644 --- a/ui/src/react-admin/modules/shared/types/index.ts +++ b/ui/src/react-admin/modules/shared/types/index.ts @@ -38,6 +38,7 @@ export enum QUERY_KEYS { GET_ALL_LANGUAGES = 'GET_ALL_LANGUAGES', GET_IE_OBJECTS_NEWSPAPER_TITLES = 'GET_IE_OBJECTS_NEWSPAPER_TITLES', GET_IE_OBJECT = 'GET_IE_OBJECT', + GET_OBJECTS_GRID_ITEMS = 'GET_OBJECTS_GRID_ITEMS', GET_TABLE_COLUMN_PREFERENCE = 'GET_TABLE_COLUMN_PREFERENCE', GET_NAMES_BY_PROFILE_IDS = 'GET_NAMES_BY_PROFILE_IDS', GET_THEMES = 'GET_THEMES', diff --git a/ui/src/shared/helpers/admin-core-config.tsx b/ui/src/shared/helpers/admin-core-config.tsx index d8082acf..1583e7fa 100644 --- a/ui/src/shared/helpers/admin-core-config.tsx +++ b/ui/src/shared/helpers/admin-core-config.tsx @@ -97,6 +97,7 @@ export function getAdminCoreConfigForLocalTestApp(navigateFunc: NavigateFunction // ContentBlockType.ContentEncloseGrid, // ContentBlockType.Breadcrumbs, ContentBlockType.OverviewWithCarousel, + ContentBlockType.ObjectsGrid, ContentBlockType.OverviewThemes, ], defaultPageWidth: ContentPageWidth.LARGE, diff --git a/ui/src/shared/translations/hetArchief/nl.json b/ui/src/shared/translations/hetArchief/nl.json index 189acb5b..f17e154b 100644 --- a/ui/src/shared/translations/hetArchief/nl.json +++ b/ui/src/shared/translations/hetArchief/nl.json @@ -700,6 +700,23 @@ "modules/content-page/components/blocks/block-image-text-background/block-image-text-background___tekst-padding-achtergrondkleur": "Tekst padding achtergrondkleur", "modules/content-page/components/blocks/block-image-text-background/block-image-text-background___titel-grootte": "Titelgrootte", "modules/content-page/components/blocks/block-maintainers-grid/block-maintainers-grid___ga-naar-aanbieder-maintainer-name": "Ga naar aanbieder {{maintainerName}}", + "modules/content-page/components/blocks/block-objects-grid/block-objects-grid___een-zoekfilter-is-verplicht": "Een zoekfilter is verplicht", + "modules/content-page/components/blocks/block-objects-grid/block-objects-grid___er-konden-geen-objecten-geladen-worden": "Er konden geen objecten geladen worden.", + "modules/content-page/components/blocks/block-objects-grid/block-objects-grid___er-zijn-geen-objecten-gevonden": "Er zijn geen objecten gevonden.", + "modules/content-page/components/blocks/block-objects-grid/block-objects-grid___ga-naar-de-detailpagina-van-title": "Ga naar de detailpagina van {{title}}", + "modules/content-page/components/blocks/block-objects-grid/block-objects-grid___geef-een-zoek-url-van-hetarchief-be-in-bijvoorbeeld-https-hetarchief-be-zoeken-aanbieders-or-page-1": "Geef een zoek-URL van hetarchief.be in, bijvoorbeeld https://hetarchief.be/zoeken?aanbieders=OR-...&page=1", + "modules/content-page/components/blocks/block-objects-grid/block-objects-grid___gelieve-een-geldige-url-in-te-vullen": "Gelieve een geldige URL in te vullen", + "modules/content-page/components/blocks/block-objects-grid/block-objects-grid___object-pid-of-fragment-id": "Object (pid of fragment id)", + "modules/content-page/components/blocks/block-objects-grid/block-objects-grid___objecten-grid": "Objecten grid", + "modules/content-page/components/blocks/block-objects-grid/block-objects-grid___objecten-worden-geladen": "Objecten worden geladen…", + "modules/content-page/components/blocks/block-objects-grid/block-objects-grid___titel": "Titel", + "modules/content-page/components/blocks/block-objects-grid/block-objects-grid___titel-grootte": "Titel grootte", + "modules/content-page/components/blocks/block-objects-grid/block-objects-grid___toon-alle": "Toon alle", + "modules/content-page/components/blocks/block-objects-grid/block-objects-grid___toon-alle-objecten-voor-deze-zoekopdracht": "Toon alle objecten voor deze zoekopdracht", + "modules/content-page/components/blocks/block-objects-grid/block-objects-grid___vaste-positie": "Vaste positie", + "modules/content-page/components/blocks/block-objects-grid/block-objects-grid___verwijder-vaste-positie": "Verwijder vaste positie", + "modules/content-page/components/blocks/block-objects-grid/block-objects-grid___voeg-een-vaste-positie-toe": "Voeg een vaste positie toe", + "modules/content-page/components/blocks/block-objects-grid/block-objects-grid___zoekfilter-url": "Zoekfilter (URL)", "modules/content-page/components/blocks/block-overview-newspaper-titles/block-overview-newspaper-titles___zoek-kranten-op-titel-input-aria-label": "Hier kan je kranten zoeken op titel", "modules/content-page/components/blocks/block-overview-newspaper-titles/block-overview-newspaper-titles___zoek-op-titel": "Zoek op titel", "modules/content-page/components/blocks/block-overview-newspaper-titles/overview-newspaper-titles___alternative": "Alternatief", @@ -743,7 +760,7 @@ "modules/content-page/components/blocks/block-page-overview/block-page-overview___toon-de-pagina-titels": "Toon de paginatitels", "modules/content-page/components/blocks/block-scroll-down-nudge/block-scroll-down-nudge___scroll-down-nudge": "Scroll down nudge", "modules/content-page/components/blocks/block-theme-reels/block-theme-reel-section___toon-alle": "Toon alle", - "modules/content-page/components/blocks/block-theme-reels/block-theme-reel-section___toon-alle-materialen-voor-dit-theme": "Toon alle materialen voor dit theme", + "modules/content-page/components/blocks/block-theme-reels/block-theme-reel-section___toon-alle-materialen-voor-dit-theme": "Toon alle materialen voor dit thema", "modules/content-page/components/blocks/block-theme-reels/block-theme-reel-section___volgende-slide": "Volgende slide", "modules/content-page/components/blocks/block-theme-reels/block-theme-reel-section___vorige-slide": "Vorige slide", "modules/content-page/components/blocks/block-theme-reels/block-theme-reels___afbeelding": "Afbeelding", @@ -807,8 +824,9 @@ "modules/content-page/const/get-content-block-type-options___content-enclose-grid": "Content insluiten grid", "modules/content-page/const/get-content-block-type-options___highlight-text": "Highlight text", "modules/content-page/const/get-content-block-type-options___homepage-banner": "Homepage banner", + "modules/content-page/const/get-content-block-type-options___objecten-grid": "Objecten grid", "modules/content-page/const/get-content-block-type-options___overzicht-krantentitels": "Overzicht krantentitels", - "modules/content-page/const/get-content-block-type-options___overzicht-met-carousel": "Overzicht met carousel", + "modules/content-page/const/get-content-block-type-options___overzicht-met-carousel": "Overzicht met carrousel", "modules/content-page/const/get-content-block-type-options___scroll-down-nudge": "Nudge om te scrollen", "modules/content-page/const/get-content-block-type-options___thema-reels": "Thema reels", "modules/content-page/const/get-heading-type-options___groot": "Groot",