Eerste commit voor Helvoirt Gevelreiniging

This commit is contained in:
Joery Disselhof
2026-08-26 13:57:08 +02:00
commit 276dba07a2
225 changed files with 23121 additions and 0 deletions
+22
View File
@@ -0,0 +1,22 @@
-- Vangnet-tabel voor contactformulier-aanvragen.
-- /api/contact schrijft elke geldige aanvraag hierheen naast de e-mailmelding,
-- zodat er geen lead verloren gaat. Idempotent: veilig her-uit te voeren.
--
-- Remote (productie) toepassen:
-- $env:NODE_OPTIONS="--use-system-ca"; $env:CLOUDFLARE_ACCOUNT_ID="41972f4905f2c83f51111b80283e030b"
-- node node_modules/wrangler/bin/wrangler.js d1 execute helvoirt-db --remote --file=migrations/0001_contact_submissions.sql
CREATE TABLE IF NOT EXISTS contact_submissions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
created_at TEXT NOT NULL,
name TEXT NOT NULL,
email TEXT NOT NULL,
phone TEXT,
message TEXT NOT NULL,
ip TEXT,
country TEXT,
user_agent TEXT
);
CREATE INDEX IF NOT EXISTS idx_contact_submissions_created_at
ON contact_submissions (created_at DESC);
+27
View File
@@ -0,0 +1,27 @@
-- Auto-gegenereerd door scripts/gen-cms-sql.mjs — NIET met de hand bewerken.
-- ===== collectie: over_ons (Over ons (pagina)) =====
INSERT INTO _emdash_collections (id, slug, label, label_singular, supports, source, has_seo) VALUES ('01KV808CAK076NW7QYYYP4Z9EE', 'over_ons', 'Over ons (pagina)', 'Over ons', '["drafts","revisions"]', 'seed', 0);
CREATE TABLE "ec_over_ons" ("id" text primary key, "slug" text, "status" text default 'draft', "author_id" text, "primary_byline_id" text, "created_at" text default (datetime('now')), "updated_at" text default (datetime('now')), "published_at" text, "scheduled_at" text, "deleted_at" text, "version" integer default 1, "live_revision_id" text references "revisions" ("id"), "draft_revision_id" text references "revisions" ("id"), "locale" text default 'en' not null, "translation_group" text, "hero_eyebrow" TEXT, "hero_title" TEXT NOT NULL DEFAULT '', "hero_lead" TEXT, "story_title" TEXT, "story_body" JSON, "values_title" TEXT, "values_intro" TEXT, "meta_title" TEXT, "meta_description" TEXT, constraint "ec_over_ons_slug_locale_unique" unique ("slug", "locale"));
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV808CAMHMAEY6SQD6H0T1SD', '01KV808CAK076NW7QYYYP4Z9EE', 'hero_eyebrow', 'Hero · kicker', 'string', 'TEXT', 0, 0, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV808CAMFSR9W3V86Z91NSMS', '01KV808CAK076NW7QYYYP4Z9EE', 'hero_title', 'Hero · titel (H1)', 'string', 'TEXT', 1, 1, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV808CAM6QKBP3NE3THP44FV', '01KV808CAK076NW7QYYYP4Z9EE', 'hero_lead', 'Hero · inleiding', 'text', 'TEXT', 0, 2, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV808CAM669PHXWHX0HQ5J29', '01KV808CAK076NW7QYYYP4Z9EE', 'story_title', 'Verhaal · titel (H2)', 'string', 'TEXT', 0, 3, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV808CAMBF79J65S1C5V0KKY', '01KV808CAK076NW7QYYYP4Z9EE', 'story_body', 'Verhaal · tekst', 'portableText', 'JSON', 0, 4, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV808CAMJ4FCVJ3A8ANKJY7B', '01KV808CAK076NW7QYYYP4Z9EE', 'values_title', 'Waarden · kop (H2)', 'string', 'TEXT', 0, 5, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV808CAM2ZJDHW2AC7MGVFY1', '01KV808CAK076NW7QYYYP4Z9EE', 'values_intro', 'Waarden · inleiding', 'string', 'TEXT', 0, 6, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV808CAM8850VVNEJS20X9Z6', '01KV808CAK076NW7QYYYP4Z9EE', 'meta_title', 'SEO · paginatitel (~60 tekens)', 'string', 'TEXT', 0, 7, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV808CAMB1DZ6ADXRA6P4HFH', '01KV808CAK076NW7QYYYP4Z9EE', 'meta_description', 'SEO · omschrijving (~155 tekens)', 'text', 'TEXT', 0, 8, 0, 1);
INSERT INTO "ec_over_ons" ("id", "slug", "status", "locale", "hero_eyebrow", "hero_title", "hero_lead", "story_title", "story_body", "values_title", "values_intro", "meta_title", "meta_description") VALUES ('01KV808CAN1XVJ5MWH6MN5FPSP', 'main', 'published', 'en', 'Over ons', 'De vakmensen achter een schone gevel', 'Helvoirt Gevelreiniging maakt de buitenkant van je huis weer schoon en heel. Van gevelreiniging en voegwerk tot daken en schoorstenen, voor particulieren en bedrijven in de regio.', 'Schoon, strak en vakkundig', '[{"_type":"block","style":"normal","children":[{"_type":"span","text":"Een vieze gevel, groen dak of lekkende schoorsteen is meer dan een kwestie van uiterlijk. Vocht en aanslag tasten op den duur de steen, het voegwerk en de constructie aan. Wij pakken dat aan met de methode die bij jouw situatie past, zodat je huis er niet alleen mooi bij staat, maar ook heel blijft."}]},{"_type":"block","style":"normal","children":[{"_type":"span","text":"We werken voor particulieren en bedrijven en denken altijd met je mee. Je krijgt vooraf een heldere prijs en een duidelijke planning, en we leveren het werk netjes en opgeruimd op. Zo weet je precies waar je aan toe bent, van het eerste belletje tot de laatste spoelbeurt."}]}]', 'Waarom Helvoirt Gevelreiniging', 'Wat je van ons mag verwachten, bij elke klus.', 'Over ons · Helvoirt Gevelreiniging', 'Helvoirt Gevelreiniging is een lokaal gevelreinigings- en renovatiebedrijf. Vakwerk, een eerlijke prijs vooraf en netjes opgeleverd, in Helvoirt en omgeving.');
-- ===== collectie: waarden (Waarden (over ons)) =====
INSERT INTO _emdash_collections (id, slug, label, label_singular, supports, source, has_seo) VALUES ('01KV808CANY30RMEB6Y38Y260M', 'waarden', 'Waarden (over ons)', 'Waarde', '["drafts","revisions"]', 'seed', 0);
CREATE TABLE "ec_waarden" ("id" text primary key, "slug" text, "status" text default 'draft', "author_id" text, "primary_byline_id" text, "created_at" text default (datetime('now')), "updated_at" text default (datetime('now')), "published_at" text, "scheduled_at" text, "deleted_at" text, "version" integer default 1, "live_revision_id" text references "revisions" ("id"), "draft_revision_id" text references "revisions" ("id"), "locale" text default 'en' not null, "translation_group" text, "title" TEXT NOT NULL DEFAULT '', "text" TEXT, "icon" TEXT, "sort_order" INTEGER, constraint "ec_waarden_slug_locale_unique" unique ("slug", "locale"));
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV808CANH56WJJQDAKN8QM10', '01KV808CANY30RMEB6Y38Y260M', 'title', 'Titel', 'string', 'TEXT', 1, 0, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV808CAN1RVZ3S2FT5SA4PNZ', '01KV808CANY30RMEB6Y38Y260M', 'text', 'Tekst', 'text', 'TEXT', 0, 1, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV808CANSKWS1854BZZ8KJQ8', '01KV808CANY30RMEB6Y38Y260M', 'icon', 'Icoon (SVG-inhoud, geavanceerd)', 'text', 'TEXT', 0, 2, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV808CANV5RT6JV03V2YRE88', '01KV808CANY30RMEB6Y38Y260M', 'sort_order', 'Volgorde', 'integer', 'INTEGER', 0, 3, 0, 1);
INSERT INTO "ec_waarden" ("id", "slug", "status", "locale", "title", "text", "icon", "sort_order") VALUES ('01KV808CANZM26H20D3Q6PT8HE', 'eerlijke-prijs-vooraf', 'published', 'en', 'Eerlijke prijs vooraf', 'Je krijgt een duidelijke offerte op papier. Geen verrassingen achteraf, geen kleine lettertjes.', '<path d="M20.59 13.41 13.42 20.58a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z"/><circle cx="7" cy="7" r="1.4"/>', 1);
INSERT INTO "ec_waarden" ("id", "slug", "status", "locale", "title", "text", "icon", "sort_order") VALUES ('01KV808CANGT9YV8HBVD6XZDX3', 'echt-vakwerk', 'published', 'en', 'Echt vakwerk', 'We kennen ons vak en de materialen. Elke gevel, elk dak en elke schoorsteen krijgt de juiste aanpak.', '<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/><path d="m8.5 12 2.2 2.2 4.5-4.5"/>', 2);
INSERT INTO "ec_waarden" ("id", "slug", "status", "locale", "title", "text", "icon", "sort_order") VALUES ('01KV808CAN3BM8TWS72DRPT8BX', 'netjes-opgeleverd', 'published', 'en', 'Netjes opgeleverd', 'We dekken alles goed af, ruimen op en lopen het werk samen met je na. Je huis blijft schoon achter.', '<path d="M12 3l1.8 5.4L19 10l-5.2 1.6L12 17l-1.8-5.4L5 10l5.2-1.6z"/>', 3);
INSERT INTO "ec_waarden" ("id", "slug", "status", "locale", "title", "text", "icon", "sort_order") VALUES ('01KV808CANKHZKT3MA94BVZTEM', 'lokaal-en-betrokken', 'published', 'en', 'Lokaal en betrokken', 'We werken in Helvoirt en omgeving. Korte lijnen, snel even langs en altijd persoonlijk aanspreekbaar.', '<path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/>', 4);
+17
View File
@@ -0,0 +1,17 @@
-- Auto-gegenereerd — Over ons: waarden -> inline repeater + minder "(optional)".
-- 1. Repeater-kolom + velddefinitie (rijen toevoegen/verwijderen/verslepen).
ALTER TABLE ec_over_ons ADD COLUMN waarden JSON;
UPDATE _emdash_fields SET sort_order=8 WHERE collection_id=(SELECT id FROM _emdash_collections WHERE slug='over_ons') AND slug='meta_title';
UPDATE _emdash_fields SET sort_order=9 WHERE collection_id=(SELECT id FROM _emdash_collections WHERE slug='over_ons') AND slug='meta_description';
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable, validation)
VALUES ('01KV81R957N09TYXY4J5QPY9BD', (SELECT id FROM _emdash_collections WHERE slug='over_ons'), 'waarden', 'Waarden (rijen: voeg toe / verwijder / versleep)', 'repeater', 'JSON', 0, 7, 0, 1, '{"subFields":[{"slug":"title","type":"string","label":"Titel","required":true},{"slug":"text","type":"text","label":"Tekst"},{"slug":"icon","type":"text","label":"Icoon (SVG-inhoud, geavanceerd)"}],"minItems":0,"maxItems":8}');
UPDATE ec_over_ons SET waarden='[{"title":"Eerlijke prijs vooraf","text":"Je krijgt een duidelijke offerte op papier. Geen verrassingen achteraf, geen kleine lettertjes.","icon":"<path d=\"M20.59 13.41 13.42 20.58a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z\"/><circle cx=\"7\" cy=\"7\" r=\"1.4\"/>"},{"title":"Echt vakwerk","text":"We kennen ons vak en de materialen. Elke gevel, elk dak en elke schoorsteen krijgt de juiste aanpak.","icon":"<path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/><path d=\"m8.5 12 2.2 2.2 4.5-4.5\"/>"},{"title":"Netjes opgeleverd","text":"We dekken alles goed af, ruimen op en lopen het werk samen met je na. Je huis blijft schoon achter.","icon":"<path d=\"M12 3l1.8 5.4L19 10l-5.2 1.6L12 17l-1.8-5.4L5 10l5.2-1.6z\"/>"},{"title":"Lokaal en betrokken","text":"We werken in Helvoirt en omgeving. Korte lijnen, snel even langs en altijd persoonlijk aanspreekbaar.","icon":"<path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/>"}]' WHERE slug='main';
-- 2. Kern-inhoudvelden verplicht -> "(optional)" verdwijnt daar (SEO blijft optioneel).
UPDATE _emdash_fields SET required=1 WHERE collection_id=(SELECT id FROM _emdash_collections WHERE slug='over_ons') AND slug IN ('hero_lead','story_title','story_body','values_title');
-- 3. Losse 'waarden'-collectie opruimen (vervangen door het repeater-veld hierboven).
DROP TABLE IF EXISTS ec_waarden;
DELETE FROM _emdash_fields WHERE collection_id=(SELECT id FROM _emdash_collections WHERE slug='waarden');
DELETE FROM _emdash_collections WHERE slug='waarden';
+13
View File
@@ -0,0 +1,13 @@
-- Auto-gegenereerd — Over ons: hero- en verhaal-afbeelding beheerbaar maken.
ALTER TABLE ec_over_ons ADD COLUMN hero_image TEXT;
ALTER TABLE ec_over_ons ADD COLUMN story_image TEXT;
-- Herorden zodat de beeldvelden logisch tussen de tekst staan.
UPDATE _emdash_fields SET sort_order=4 WHERE collection_id=(SELECT id FROM _emdash_collections WHERE slug='over_ons') AND slug='story_title';
UPDATE _emdash_fields SET sort_order=5 WHERE collection_id=(SELECT id FROM _emdash_collections WHERE slug='over_ons') AND slug='story_body';
UPDATE _emdash_fields SET sort_order=7 WHERE collection_id=(SELECT id FROM _emdash_collections WHERE slug='over_ons') AND slug='values_title';
UPDATE _emdash_fields SET sort_order=8 WHERE collection_id=(SELECT id FROM _emdash_collections WHERE slug='over_ons') AND slug='values_intro';
UPDATE _emdash_fields SET sort_order=9 WHERE collection_id=(SELECT id FROM _emdash_collections WHERE slug='over_ons') AND slug='waarden';
UPDATE _emdash_fields SET sort_order=10 WHERE collection_id=(SELECT id FROM _emdash_collections WHERE slug='over_ons') AND slug='meta_title';
UPDATE _emdash_fields SET sort_order=11 WHERE collection_id=(SELECT id FROM _emdash_collections WHERE slug='over_ons') AND slug='meta_description';
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV83NTC09VQG6CDC4CWPP7PD', (SELECT id FROM _emdash_collections WHERE slug='over_ons'), 'hero_image', 'Hero · afbeelding (banner) — leeg = standaardfoto', 'image', 'TEXT', 0, 3, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV83NTC27JH5XEV6CBFX2PX8', (SELECT id FROM _emdash_collections WHERE slug='over_ons'), 'story_image', 'Verhaal · foto — leeg = standaardfoto', 'image', 'TEXT', 0, 6, 0, 1);
+9
View File
@@ -0,0 +1,9 @@
-- Klantverzoek: verwijder de "(~N tekens)"-hints uit de SEO-labels.
UPDATE _emdash_fields SET label='SEO · standaard paginatitel' WHERE slug='meta_title' AND collection_id=(SELECT id FROM _emdash_collections WHERE slug='site_settings');
UPDATE _emdash_fields SET label='SEO · standaard omschrijving / Google-snippet' WHERE slug='meta_description' AND collection_id=(SELECT id FROM _emdash_collections WHERE slug='site_settings');
UPDATE _emdash_fields SET label='SEO · titel voor Google (leeg = paginatitel)' WHERE slug='meta_title' AND collection_id=(SELECT id FROM _emdash_collections WHERE slug='paginas');
UPDATE _emdash_fields SET label='SEO · omschrijving / Google-snippet' WHERE slug='meta_description' AND collection_id=(SELECT id FROM _emdash_collections WHERE slug='paginas');
UPDATE _emdash_fields SET label='SEO · titel voor Google (leeg = paginakop)' WHERE slug='meta_title' AND collection_id=(SELECT id FROM _emdash_collections WHERE slug='locaties');
UPDATE _emdash_fields SET label='SEO · omschrijving / Google-snippet' WHERE slug='meta_description' AND collection_id=(SELECT id FROM _emdash_collections WHERE slug='locaties');
UPDATE _emdash_fields SET label='SEO · paginatitel' WHERE slug='meta_title' AND collection_id=(SELECT id FROM _emdash_collections WHERE slug='over_ons');
UPDATE _emdash_fields SET label='SEO · omschrijving' WHERE slug='meta_description' AND collection_id=(SELECT id FROM _emdash_collections WHERE slug='over_ons');
+6
View File
@@ -0,0 +1,6 @@
-- Over ons: huidige foto's in de mediabibliotheek + gekoppeld aan de beeldvelden.
INSERT OR REPLACE INTO media (id, filename, mime_type, size, width, height, alt, storage_key, status, created_at) VALUES
('01KV84WV45PEE39DKGYB0VM0YD', 'over-ons-hero.webp', 'image/webp', 158222, 1280, 714, 'Schone, verzorgde gevel van een woonhuis na reiniging', '01KV84WV45PEE39DKGYB0VM0YD.webp', 'ready', datetime('now')),
('01KV84WV46WDTJJ0573BM0WYVD', 'over-ons-verhaal.webp', 'image/webp', 181398, 738, 983, 'Vakman aan het werk aan het voegwerk van een gevel', '01KV84WV46WDTJJ0573BM0WYVD.webp', 'ready', datetime('now'));
UPDATE ec_over_ons SET hero_image='{"id":"01KV84WV45PEE39DKGYB0VM0YD","provider":"local","filename":"over-ons-hero.webp","mimeType":"image/webp","width":1280,"height":714,"alt":"Schone, verzorgde gevel van een woonhuis na reiniging","meta":{"storageKey":"01KV84WV45PEE39DKGYB0VM0YD.webp"}}' WHERE slug='main';
UPDATE ec_over_ons SET story_image='{"id":"01KV84WV46WDTJJ0573BM0WYVD","provider":"local","filename":"over-ons-verhaal.webp","mimeType":"image/webp","width":738,"height":983,"alt":"Vakman aan het werk aan het voegwerk van een gevel","meta":{"storageKey":"01KV84WV46WDTJJ0573BM0WYVD.webp"}}' WHERE slug='main';
+26
View File
@@ -0,0 +1,26 @@
-- Auto-gegenereerd door scripts/gen-cms-sql.mjs — NIET met de hand bewerken.
-- ===== collectie: homepage (Homepage) =====
INSERT INTO _emdash_collections (id, slug, label, label_singular, supports, source, has_seo) VALUES ('01KV85FTR6069N14G8ANM032XB', 'homepage', 'Homepage', 'Homepage', '["drafts","revisions"]', 'seed', 0);
CREATE TABLE "ec_homepage" ("id" text primary key, "slug" text, "status" text default 'draft', "author_id" text, "primary_byline_id" text, "created_at" text default (datetime('now')), "updated_at" text default (datetime('now')), "published_at" text, "scheduled_at" text, "deleted_at" text, "version" integer default 1, "live_revision_id" text references "revisions" ("id"), "draft_revision_id" text references "revisions" ("id"), "locale" text default 'en' not null, "translation_group" text, "hero_title" TEXT NOT NULL DEFAULT '', "hero_sub" TEXT NOT NULL DEFAULT '', "hero_points" JSON, "intro_statement" TEXT NOT NULL DEFAULT '', "intro_body" TEXT NOT NULL DEFAULT '', "intro_meta" TEXT, "diensten_kicker" TEXT, "diensten_kop" TEXT NOT NULL DEFAULT '', "werkwijze_kop" TEXT NOT NULL DEFAULT '', "werkwijze" JSON, "proof_kop" TEXT NOT NULL DEFAULT '', "reviews_featured_text" TEXT NOT NULL DEFAULT '', "reviews_featured_name" TEXT, "reviews_featured_place" TEXT, "reviews_small" JSON, "gebied_kop" TEXT NOT NULL DEFAULT '', "gebied_sub" TEXT, "faq_kop" TEXT NOT NULL DEFAULT '', "faq_lead" TEXT, "faq" JSON, constraint "ec_homepage_slug_locale_unique" unique ("slug", "locale"));
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV85FTR9KA233VFHXJYKH8M6', '01KV85FTR6069N14G8ANM032XB', 'hero_title', 'Hero · titel (H1)', 'string', 'TEXT', 1, 0, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV85FTR95GFH8YE21S52SHGG', '01KV85FTR6069N14G8ANM032XB', 'hero_sub', 'Hero · subtekst', 'text', 'TEXT', 1, 1, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable, validation) VALUES ('01KV85FTR9J0WQ54R4Y1YGNCYX', '01KV85FTR6069N14G8ANM032XB', 'hero_points', 'Hero · vinkjes (rijen)', 'repeater', 'JSON', 0, 2, 0, 1, '{"subFields":[{"slug":"text","type":"string","label":"Tekst","required":true}],"minItems":0,"maxItems":20}');
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV85FTRACBQ392VJDG4RB7WG', '01KV85FTR6069N14G8ANM032XB', 'intro_statement', 'Intro · statement', 'text', 'TEXT', 1, 3, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV85FTRAEJTZDY9EXTAAZ8GY', '01KV85FTR6069N14G8ANM032XB', 'intro_body', 'Intro · alinea', 'text', 'TEXT', 1, 4, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV85FTRAZ70HB3376WV5FKNA', '01KV85FTR6069N14G8ANM032XB', 'intro_meta', 'Intro · meta-regel', 'string', 'TEXT', 0, 5, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV85FTRA04S345B9MCEQQ42T', '01KV85FTR6069N14G8ANM032XB', 'diensten_kicker', 'Diensten · kicker', 'string', 'TEXT', 0, 6, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV85FTRAJEQNA3H503E2BPJN', '01KV85FTR6069N14G8ANM032XB', 'diensten_kop', 'Diensten · kop', 'string', 'TEXT', 1, 7, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV85FTRA283DGA2C4N4M6CEB', '01KV85FTR6069N14G8ANM032XB', 'werkwijze_kop', 'Werkwijze · kop', 'string', 'TEXT', 1, 8, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable, validation) VALUES ('01KV85FTRA3Y1W6WVHH74J2ZGF', '01KV85FTR6069N14G8ANM032XB', 'werkwijze', 'Werkwijze · stappen (rijen)', 'repeater', 'JSON', 0, 9, 0, 1, '{"subFields":[{"slug":"title","type":"string","label":"Titel","required":true},{"slug":"text","type":"text","label":"Tekst"}],"minItems":0,"maxItems":20}');
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV85FTRB3S6RTRCJC5TZM8F4', '01KV85FTR6069N14G8ANM032XB', 'proof_kop', 'Bewijs-galerij · kop', 'string', 'TEXT', 1, 10, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV85FTRB8BGKZM5EGZ47A7VS', '01KV85FTR6069N14G8ANM032XB', 'reviews_featured_text', 'Reviews · uitgelichte quote', 'text', 'TEXT', 1, 11, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV85FTRBYCX8YKMR957J4KEF', '01KV85FTR6069N14G8ANM032XB', 'reviews_featured_name', 'Reviews · uitgelichte naam', 'string', 'TEXT', 0, 12, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV85FTRBN35PFZ4SHG2F615E', '01KV85FTR6069N14G8ANM032XB', 'reviews_featured_place', 'Reviews · uitgelichte plaats', 'string', 'TEXT', 0, 13, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable, validation) VALUES ('01KV85FTRBDBM30119C8MRWWFH', '01KV85FTR6069N14G8ANM032XB', 'reviews_small', 'Reviews · kleine reviews (rijen)', 'repeater', 'JSON', 0, 14, 0, 1, '{"subFields":[{"slug":"text","type":"text","label":"Reviewtekst","required":true},{"slug":"name","type":"string","label":"Naam"}],"minItems":0,"maxItems":20}');
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV85FTRBBM6H6HQTRS8987G9', '01KV85FTR6069N14G8ANM032XB', 'gebied_kop', 'Werkgebied · kop', 'string', 'TEXT', 1, 15, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV85FTRB3C9QA939AWMCCCHC', '01KV85FTR6069N14G8ANM032XB', 'gebied_sub', 'Werkgebied · subtekst', 'string', 'TEXT', 0, 16, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV85FTRBEZ8BJFW92R7JWSHD', '01KV85FTR6069N14G8ANM032XB', 'faq_kop', 'FAQ · kop', 'string', 'TEXT', 1, 17, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV85FTRB31ZQ7YR0E21MM06V', '01KV85FTR6069N14G8ANM032XB', 'faq_lead', 'FAQ · inleiding', 'string', 'TEXT', 0, 18, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable, validation) VALUES ('01KV85FTRBZB7WGD5FBGG4QMFA', '01KV85FTR6069N14G8ANM032XB', 'faq', 'FAQ · vragen (rijen)', 'repeater', 'JSON', 0, 19, 0, 1, '{"subFields":[{"slug":"question","type":"string","label":"Vraag","required":true},{"slug":"answer","type":"text","label":"Antwoord"}],"minItems":0,"maxItems":20}');
INSERT INTO "ec_homepage" ("id", "slug", "status", "locale", "hero_title", "hero_sub", "hero_points", "intro_statement", "intro_body", "intro_meta", "diensten_kicker", "diensten_kop", "werkwijze_kop", "werkwijze", "proof_kop", "reviews_featured_text", "reviews_featured_name", "reviews_featured_place", "reviews_small", "gebied_kop", "gebied_sub", "faq_kop", "faq_lead", "faq") VALUES ('01KV85FTRBPVZGKWGDW655XE97', 'main', 'published', 'en', 'Je gevel weer als nieuw.', 'Van groene aanslag tot kapot voegwerk: wij maken de buitenkant van je huis weer schoon en heel. Netjes opgeleverd, met een eerlijke prijs vooraf.', '[{"text":"Eerlijke prijs vooraf"},{"text":"Netjes opgeleverd"},{"text":"Particulier en zakelijk"}]', 'Schoon, strak en vakkundig. Dat is waar Helvoirt Gevelreiniging voor staat.', 'Of het nu om een hele gevel gaat of om één schoorsteen: we komen langs, denken mee en leveren werk waar je trots op bent. Voor particulieren en bedrijven in Helvoirt en omgeving.', 'Particulier en zakelijk · eerlijke prijs vooraf · netjes opgeleverd', 'Onze diensten', 'Vakwerk voor je hele buitenkant', 'Van eerste belletje tot schoon opgeleverd', '[{"title":"Bellen of mailen","text":"Je vraagt een gratis offerte aan. Vertel kort om welk werk het gaat."},{"title":"We komen kijken","text":"We bekijken het werk ter plekke, meten op en denken met je mee."},{"title":"Heldere offerte","text":"Je krijgt een duidelijke prijs op papier. Geen verrassingen achteraf."},{"title":"Schoon opgeleverd","text":"We voeren het netjes uit, ruimen op en lopen het samen na."}]', 'Echt werk, echte resultaten', 'Onze gevel zat vol groene aanslag en ziet er nu weer als nieuw uit. Keurig gewerkt, alles netjes afgedekt en opgeruimd. Echt vakwerk.', 'Familie Jansen', 'Helvoirt', '[{"text":"Snel een eerlijke offerte gekregen en het voegwerk is prachtig geworden.","name":"Peter de Vries"},{"text":"Dak laten reinigen en coaten. Goede communicatie en een mooi resultaat.","name":"M. Bakker"}]', 'Werkzaam in Helvoirt en omgeving', 'Staat jouw plaats er niet bij? Bel of mail gerust, vaak komen we er ook.', 'Goed om te weten', 'De vragen die klanten ons meestal als eerste stellen.', '[{"question":"Wat bepaalt de prijs?","answer":"De grootte van het oppervlak, de mate van vervuiling en de bereikbaarheid. Je krijgt vooraf een vaste prijs, zonder verrassingen achteraf."},{"question":"Hoe lang duurt het?","answer":"Dat hangt van het werk af. Bij de offerte hoor je een concrete planning, zodat je weet waar je aan toe bent."},{"question":"Geven jullie garantie?","answer":"Ja. We werken netjes en staan achter ons werk; de afspraken leggen we vast in de offerte."},{"question":"Moet ik thuis zijn?","answer":"Voor de inspectie en de oplevering is het handig, maar lang niet altijd nodig. We stemmen het samen af."}]');
+11
View File
@@ -0,0 +1,11 @@
-- Auto-gegenereerd door scripts/gen-cms-sql.mjs — NIET met de hand bewerken.
-- ===== collectie: contact_page (Contactpagina) =====
INSERT INTO _emdash_collections (id, slug, label, label_singular, supports, source, has_seo) VALUES ('01KV861174PBRAR04T26ZM8S4D', 'contact_page', 'Contactpagina', 'Contactpagina', '["drafts","revisions"]', 'seed', 0);
CREATE TABLE "ec_contact_page" ("id" text primary key, "slug" text, "status" text default 'draft', "author_id" text, "primary_byline_id" text, "created_at" text default (datetime('now')), "updated_at" text default (datetime('now')), "published_at" text, "scheduled_at" text, "deleted_at" text, "version" integer default 1, "live_revision_id" text references "revisions" ("id"), "draft_revision_id" text references "revisions" ("id"), "locale" text default 'en' not null, "translation_group" text, "eyebrow" TEXT, "title" TEXT NOT NULL DEFAULT '', "intro" TEXT NOT NULL DEFAULT '', "meta_title" TEXT, "meta_description" TEXT, constraint "ec_contact_page_slug_locale_unique" unique ("slug", "locale"));
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV861176AJ97JADDW76KTZ1S', '01KV861174PBRAR04T26ZM8S4D', 'eyebrow', 'Kicker', 'string', 'TEXT', 0, 0, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV86117653QW0MTMBJE5711F', '01KV861174PBRAR04T26ZM8S4D', 'title', 'Titel (H1)', 'string', 'TEXT', 1, 1, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV861176B720RF1T2HQMVFRA', '01KV861174PBRAR04T26ZM8S4D', 'intro', 'Intro', 'text', 'TEXT', 1, 2, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV861176RPS7QAY62CCYAKCF', '01KV861174PBRAR04T26ZM8S4D', 'meta_title', 'SEO · paginatitel', 'string', 'TEXT', 0, 3, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KV861176ZGV6Y48EXHFFWP0T', '01KV861174PBRAR04T26ZM8S4D', 'meta_description', 'SEO · omschrijving', 'text', 'TEXT', 0, 4, 0, 1);
INSERT INTO "ec_contact_page" ("id", "slug", "status", "locale", "eyebrow", "title", "intro", "meta_title", "meta_description") VALUES ('01KV8611767AHXRRK2A1Q432XK', 'main', 'published', 'en', 'Contact', 'Vraag een gratis offerte aan', 'Laat je gegevens achter, dan plannen we een moment om langs te komen en het werk te bekijken. Je krijgt een heldere prijs op papier, zonder verplichtingen. Liever even bellen of mailen? Dat kan ook.', 'Contact en gratis offerte · Helvoirt Gevelreiniging', 'Neem contact op met Helvoirt Gevelreiniging voor een gratis, vrijblijvende offerte. Bel, mail of laat je gegevens achter via het formulier.');
+46
View File
@@ -0,0 +1,46 @@
-- Auto-gegenereerd door scripts/gen-cms-sql.mjs — NIET met de hand bewerken.
-- ===== collectie: diensten (Diensten) =====
INSERT INTO _emdash_collections (id, slug, label, label_singular, supports, source, has_seo) VALUES ('01KVA99538R5JTKEVHDYN32XD3', 'diensten', 'Diensten', 'Dienst', '["drafts","revisions"]', 'seed', 0);
CREATE TABLE "ec_diensten" ("id" text primary key, "slug" text, "status" text default 'draft', "author_id" text, "primary_byline_id" text, "created_at" text default (datetime('now')), "updated_at" text default (datetime('now')), "published_at" text, "scheduled_at" text, "deleted_at" text, "version" integer default 1, "live_revision_id" text references "revisions" ("id"), "draft_revision_id" text references "revisions" ("id"), "locale" text default 'en' not null, "translation_group" text, "nav_order" INTEGER, "nav_title" TEXT NOT NULL DEFAULT '', "nav_text" TEXT NOT NULL DEFAULT '', "nav_image" TEXT, "nav_alt" TEXT, "title" TEXT NOT NULL DEFAULT '', "eyebrow" TEXT, "lead" TEXT NOT NULL DEFAULT '', "hero_image" TEXT, "hero_alt" TEXT, "hero_caption" TEXT, "points" JSON, "intro_heading" TEXT NOT NULL DEFAULT '', "intro_body" JSON, "included_title" TEXT, "included" JSON, "resultaat_heading" TEXT, "resultaat_sub" TEXT, "result_1_image" TEXT, "result_1_alt" TEXT, "result_1_caption" TEXT, "result_1_detail" TEXT, "result_2_image" TEXT, "result_2_alt" TEXT, "result_2_caption" TEXT, "result_2_detail" TEXT, "result_3_image" TEXT, "result_3_alt" TEXT, "result_3_caption" TEXT, "result_3_detail" TEXT, "aanpak_title" TEXT, "aanpak" JSON, "faq" JSON, "meta_title" TEXT, "meta_description" TEXT, "noindex" INTEGER, constraint "ec_diensten_slug_locale_unique" unique ("slug", "locale"));
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA99539W1MVK5SHZB8AJT6Y', '01KVA99538R5JTKEVHDYN32XD3', 'nav_order', 'Volgorde in het menu (1-5)', 'integer', 'INTEGER', 0, 0, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA99539DREEZK0G7A9FZC85', '01KVA99538R5JTKEVHDYN32XD3', 'nav_title', 'Menu/overzicht · titel', 'string', 'TEXT', 1, 1, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA99539GZ9MT7MQFHEPJRVP', '01KVA99538R5JTKEVHDYN32XD3', 'nav_text', 'Menu/overzicht · korte tekst', 'text', 'TEXT', 1, 2, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA99539G0WTZHSD0YETHASB', '01KVA99538R5JTKEVHDYN32XD3', 'nav_image', 'Overzicht · afbeelding (leeg = standaardfoto)', 'image', 'TEXT', 0, 3, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA995397F9W7NMBRDBGAJZD', '01KVA99538R5JTKEVHDYN32XD3', 'nav_alt', 'Overzicht · alt-tekst', 'string', 'TEXT', 0, 4, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA99539CGBSW2WCQED1KQD1', '01KVA99538R5JTKEVHDYN32XD3', 'title', 'Detailpagina · titel (H1)', 'string', 'TEXT', 1, 5, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA995393FWWYDA30J1YP9JZ', '01KVA99538R5JTKEVHDYN32XD3', 'eyebrow', 'Detailpagina · kicker', 'string', 'TEXT', 0, 6, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA99539KVMR7NBVH4V6TJKT', '01KVA99538R5JTKEVHDYN32XD3', 'lead', 'Detailpagina · introzin (hero)', 'text', 'TEXT', 1, 7, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953901ME27BGWF2THBJW', '01KVA99538R5JTKEVHDYN32XD3', 'hero_image', 'Hero · afbeelding (leeg = standaardfoto)', 'image', 'TEXT', 0, 8, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA995399AKANV3RRNXF2BBS', '01KVA99538R5JTKEVHDYN32XD3', 'hero_alt', 'Hero · alt-tekst', 'string', 'TEXT', 0, 9, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA99539K7GVCR6FP7B7B8G4', '01KVA99538R5JTKEVHDYN32XD3', 'hero_caption', 'Hero · bijschrift', 'string', 'TEXT', 0, 10, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable, validation) VALUES ('01KVA99539NCW5J5D6CA34069B', '01KVA99538R5JTKEVHDYN32XD3', 'points', 'Hero · vinkjes (rijen)', 'repeater', 'JSON', 0, 11, 0, 1, '{"subFields":[{"slug":"text","type":"string","label":"Tekst","required":true}],"minItems":0,"maxItems":20}');
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA99539J158DQW95TW7QPZY', '01KVA99538R5JTKEVHDYN32XD3', 'intro_heading', 'Intro · kop', 'string', 'TEXT', 1, 12, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable, validation) VALUES ('01KVA995399EY9RARAHN0Z6N8B', '01KVA99538R5JTKEVHDYN32XD3', 'intro_body', 'Intro · alinea''s (rijen)', 'repeater', 'JSON', 0, 13, 0, 1, '{"subFields":[{"slug":"text","type":"text","label":"Alinea","required":true}],"minItems":0,"maxItems":20}');
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953936PWTVCPTRWC5PBV', '01KVA99538R5JTKEVHDYN32XD3', 'included_title', 'Wat we doen · kop', 'string', 'TEXT', 0, 14, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable, validation) VALUES ('01KVA99539D73ZRHH9PSN2GXWV', '01KVA99538R5JTKEVHDYN32XD3', 'included', 'Wat we doen · punten (rijen)', 'repeater', 'JSON', 0, 15, 0, 1, '{"subFields":[{"slug":"text","type":"string","label":"Punt","required":true}],"minItems":0,"maxItems":20}');
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953APRSFFM11889ADRNB', '01KVA99538R5JTKEVHDYN32XD3', 'resultaat_heading', 'Resultaat · kop', 'string', 'TEXT', 0, 16, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953AR52G40D0EA6CP69C', '01KVA99538R5JTKEVHDYN32XD3', 'resultaat_sub', 'Resultaat · subtekst', 'text', 'TEXT', 0, 17, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953A0D9W40GGH591389P', '01KVA99538R5JTKEVHDYN32XD3', 'result_1_image', 'Resultaat 1 · afbeelding (leeg = standaardfoto)', 'image', 'TEXT', 0, 18, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953A889PG42PVQBTHJCS', '01KVA99538R5JTKEVHDYN32XD3', 'result_1_alt', 'Resultaat 1 · alt-tekst', 'string', 'TEXT', 0, 19, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953AEH0PS7EN814QE2D8', '01KVA99538R5JTKEVHDYN32XD3', 'result_1_caption', 'Resultaat 1 · bijschrift', 'string', 'TEXT', 0, 20, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953A7V94ZQT9VFRGPAKW', '01KVA99538R5JTKEVHDYN32XD3', 'result_1_detail', 'Resultaat 1 · detailtekst', 'text', 'TEXT', 0, 21, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953A90007TRNW9X1FNV9', '01KVA99538R5JTKEVHDYN32XD3', 'result_2_image', 'Resultaat 2 · afbeelding (leeg = standaardfoto)', 'image', 'TEXT', 0, 22, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953A3AMCP04JH17ZKM77', '01KVA99538R5JTKEVHDYN32XD3', 'result_2_alt', 'Resultaat 2 · alt-tekst', 'string', 'TEXT', 0, 23, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953A7E1JDB5FT18818K8', '01KVA99538R5JTKEVHDYN32XD3', 'result_2_caption', 'Resultaat 2 · bijschrift', 'string', 'TEXT', 0, 24, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953A33YZ0KKM90PPECFV', '01KVA99538R5JTKEVHDYN32XD3', 'result_2_detail', 'Resultaat 2 · detailtekst', 'text', 'TEXT', 0, 25, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953AVF10QJMK2ME7XNAQ', '01KVA99538R5JTKEVHDYN32XD3', 'result_3_image', 'Resultaat 3 · afbeelding (leeg = standaardfoto)', 'image', 'TEXT', 0, 26, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953AZ8NB820DVY0KZ1G5', '01KVA99538R5JTKEVHDYN32XD3', 'result_3_alt', 'Resultaat 3 · alt-tekst', 'string', 'TEXT', 0, 27, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953AZA4XW4KD3VRZJ0JS', '01KVA99538R5JTKEVHDYN32XD3', 'result_3_caption', 'Resultaat 3 · bijschrift', 'string', 'TEXT', 0, 28, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953AD2VDJWXKGT0EXKDR', '01KVA99538R5JTKEVHDYN32XD3', 'result_3_detail', 'Resultaat 3 · detailtekst', 'text', 'TEXT', 0, 29, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953AW0ZWBB3WR8TJ90VY', '01KVA99538R5JTKEVHDYN32XD3', 'aanpak_title', 'Aanpak · kop', 'string', 'TEXT', 0, 30, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable, validation) VALUES ('01KVA9953AEQAFB5E4QS7P239R', '01KVA99538R5JTKEVHDYN32XD3', 'aanpak', 'Aanpak · stappen (rijen)', 'repeater', 'JSON', 0, 31, 0, 1, '{"subFields":[{"slug":"title","type":"string","label":"Titel","required":true},{"slug":"text","type":"text","label":"Tekst"}],"minItems":0,"maxItems":20}');
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable, validation) VALUES ('01KVA9953AQGD2HQQKN12ADAVM', '01KVA99538R5JTKEVHDYN32XD3', 'faq', 'FAQ · vragen (rijen)', 'repeater', 'JSON', 0, 32, 0, 1, '{"subFields":[{"slug":"question","type":"string","label":"Vraag","required":true},{"slug":"answer","type":"text","label":"Antwoord"}],"minItems":0,"maxItems":20}');
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953ATASY0S7K6DTWFMY5', '01KVA99538R5JTKEVHDYN32XD3', 'meta_title', 'SEO · paginatitel', 'string', 'TEXT', 0, 33, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953BJ40GW99R6YCCXRVZ', '01KVA99538R5JTKEVHDYN32XD3', 'meta_description', 'SEO · omschrijving', 'text', 'TEXT', 0, 34, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVA9953BVDWQVE4YJX763CKA', '01KVA99538R5JTKEVHDYN32XD3', 'noindex', 'SEO · uitsluiten van Google (noindex)', 'boolean', 'INTEGER', 0, 35, 0, 1);
INSERT INTO "ec_diensten" ("id", "slug", "status", "locale", "nav_order", "nav_title", "nav_text", "nav_alt", "title", "eyebrow", "lead", "hero_alt", "hero_caption", "points", "intro_heading", "intro_body", "included_title", "included", "resultaat_heading", "resultaat_sub", "result_1_alt", "result_1_caption", "result_1_detail", "result_2_alt", "result_2_caption", "result_2_detail", "result_3_alt", "result_3_caption", "result_3_detail", "aanpak_title", "aanpak", "faq", "meta_title", "meta_description") VALUES ('01KVA9953B7H0NG3S51CX30TRW', 'gevelreiniging', 'published', 'en', 1, 'Gevelreiniging + renovatie', 'Jaren aanslag, groene vervuiling en vuil weg, en herstel waar nodig. De gevel staat er weer strak bij, zonder schade aan de steen.', 'Bakstenen gevel half gereinigd: links nog vuil, rechts weer schoon', 'Gevelreiniging en renovatie', 'Onze diensten', 'Jaren van aanslag, groene vervuiling en vuil halen we van je gevel, en waar nodig herstellen we de steen en het voegwerk. Je huis staat er weer strak en verzorgd bij, zonder schade aan de gevel.', 'Bakstenen gevel halverwege de reiniging: links nog vuil, rechts weer schoon', 'Halverwege de reiniging', '[{"text":"Veilig voor de steen"},{"text":"Herstel inbegrepen"},{"text":"Eerlijke prijs vooraf"}]', 'Een schone, gezonde gevel die er weer staat als nieuw', '[{"text":"Een vieze gevel is meer dan een kwestie van uiterlijk. Groene aanslag, algen en mos houden vocht vast, en dat tast op den duur de steen en het voegwerk aan. Wij halen die laag eraf met een methode die past bij jouw gevel, en pakken zwakke plekken meteen mee."},{"text":"Of het nu om een rijtjeshuis gaat of om een hele bedrijfsgevel: je krijgt vooraf een vaste prijs en een duidelijke planning. We werken netjes, dekken alles goed af en leveren schoon op."}]', 'Wat we voor je doen', '[{"text":"Groene aanslag, algen en mos verwijderen"},{"text":"Vuil, roet en uitslag van de gevel halen"},{"text":"De juiste reinigingsmethode per steensoort"},{"text":"Loszittend of beschadigd voegwerk herstellen"},{"text":"Optioneel impregneren tegen nieuwe vervuiling"},{"text":"Alles netjes afgedekt en opgeruimd"}]', 'Zo ziet het resultaat eruit', 'Een greep uit ons werk: schone gevels, hersteld voegwerk en steen die er weer verzorgd bij staat.', 'Schone bakstenen gevel na het verwijderen van aanslag en mos', 'Aanslag en mos verwijderd', 'Groene vervuiling en vuil weg, zonder de steen te beschadigen.', 'Strak hersteld voegwerk tussen de bakstenen', 'Voegwerk hersteld', 'Loszittende en kapotte voegen vervangen, weer netjes en waterdicht.', 'Verzorgde, schone gevel van een woonhuis', 'Strak en verzorgd', 'De gevel staat er weer als nieuw bij, klaar voor jaren vooruit.', 'Zo pakken we het aan', '[{"title":"Inspectie en advies","text":"We bekijken de steen en de mate van vervuiling, en kiezen de methode die schoon maakt zonder de gevel te beschadigen."},{"title":"Reinigen op maat","text":"Van een zachte lagedruk-reiniging tot een steviger aanpak bij hardnekkige aanslag, afgestemd op jouw gevel."},{"title":"Herstel waar nodig","text":"Loszittend of kapot voegwerk en kleine beschadigingen pakken we in dezelfde klus mee."},{"title":"Strak opgeleverd","text":"We spoelen na, ruimen alles op en lopen het samen na, zodat je tevreden achterblijft."}]', '[{"question":"Beschadigt gevelreiniging de steen?","answer":"Niet als het goed gebeurt. We stemmen de druk en het reinigingsmiddel af op de steensoort, zodat de gevel schoon wordt zonder dat de steen of de voegen eronder lijden."},{"question":"Welke methode gebruiken jullie?","answer":"Dat hangt van de gevel af. Soms volstaat een zachte lagedruk-reiniging, bij zware aanslag is een steviger aanpak nodig. We kiezen altijd wat veilig en effectief is voor jouw situatie."},{"question":"Hoe lang blijft de gevel schoon?","answer":"Dat verschilt per ligging en omgeving. Een gevel op het noorden vervuilt sneller dan een zonnige kant. Met een impregneerlaag gaat het langer mee, omdat vuil en vocht minder grip krijgen."},{"question":"Doen jullie ook het voegwerk?","answer":"Ja. Loszittend of beschadigd voegwerk herstellen we in dezelfde klus, zodat de gevel niet alleen schoon is maar ook weer heel en waterdicht."}]', 'Gevelreiniging en renovatie in Helvoirt en omgeving · Helvoirt Gevelreiniging', 'Gevelreiniging en renovatie door Helvoirt Gevelreiniging. Aanslag en groene vervuiling weg, herstel van steen en voegwerk, veilig voor de gevel. Vraag een gratis offerte aan.');
INSERT INTO "ec_diensten" ("id", "slug", "status", "locale", "nav_order", "nav_title", "nav_text", "nav_alt", "title", "eyebrow", "lead", "hero_alt", "hero_caption", "points", "intro_heading", "intro_body", "included_title", "included", "resultaat_heading", "resultaat_sub", "result_1_alt", "result_1_caption", "result_1_detail", "result_2_alt", "result_2_caption", "result_2_detail", "result_3_alt", "result_3_caption", "result_3_detail", "aanpak_title", "aanpak", "faq", "meta_title", "meta_description") VALUES ('01KVA9953BHYC0T530GXBEF3R3', 'voegwerk', 'published', 'en', 2, 'Voegwerkzaamheden', 'Oud en kapot voegwerk uithakken en opnieuw invoegen. Dat houdt de gevel waterdicht en netjes, passend bij het huis.', 'Strak nieuw voegwerk tussen rode bakstenen', 'Voegwerkzaamheden', 'Onze diensten', 'Oud, uitgesleten of kapot voegwerk vervangen we vakkundig. We hakken de slechte voegen uit en voegen opnieuw in, in een kleur en stijl die bij je huis passen. Zo blijft de gevel waterdicht en netjes.', 'Strak nieuw voegwerk tussen rode bakstenen van een gevel', 'Vers ingevoegd', '[{"text":"Past bij je gevel"},{"text":"Weer waterdicht"},{"text":"Eerlijke prijs vooraf"}]', 'Goed voegwerk houdt je gevel heel en droog', '[{"text":"Voegen zijn meer dan een afwerking. Ze houden het vocht buiten en de stenen op hun plek. Als de voegen uitslijten, verzanden of loslaten, krijgt water vrij spel en kan er vorstschade en lekkage ontstaan. Wij hakken het slechte voegwerk uit en voegen opnieuw in."},{"text":"We stemmen de kleur en de vorm van de voeg af op je huis, zodat het werk niet opvalt maar gewoon klopt. Bij oudere panden werken we waar nodig met een ademende kalkmortel."}]', 'Wat we voor je doen', '[{"text":"Oude en kapotte voegen uithakken"},{"text":"Opnieuw invoegen in de juiste kleur en vorm"},{"text":"Knip-, snij- of platvol voegwerk naar wens"},{"text":"Passende mortel, ook voor oudere panden"},{"text":"Scheuren en kleine beschadigingen meenemen"},{"text":"Netjes afgewerkt en opgeruimd"}]', 'Zo ziet het resultaat eruit', 'Een greep uit ons voegwerk: strak ingevoegd, waterdicht en passend bij de gevel.', 'Strak nieuw voegwerk tussen de bakstenen van een gevel', 'Strak ingevoegd', 'Uitgehakt en opnieuw gevoegd in een passende kleur.', 'Hersteld metsel- en voegwerk aan een tuinmuur met trap', 'Metsel- en voegwerk hersteld', 'Loszittende stenen en voegen weer vast en netjes.', 'Verzorgde gevel met strak voegwerk', 'Verzorgd geheel', 'Schone steen en strak voegwerk, weer als nieuw.', 'Zo pakken we het aan', '[{"title":"Inspectie en advies","text":"We bekijken de voegen en de steen, en bepalen welke mortel en voegvorm passen."},{"title":"Uithakken","text":"Het oude, slechte voegwerk halen we netjes weg tot op de juiste diepte."},{"title":"Opnieuw invoegen","text":"We voegen in met de juiste mortel, kleur en afwerking voor jouw gevel."},{"title":"Strak opgeleverd","text":"We borstelen na, ruimen op en lopen het samen na."}]', '[{"question":"Wanneer is voegwerk aan vervanging toe?","answer":"Als voegen verzanden, uitslijten, loslaten of als je vocht of vorstschade ziet. Wij beoordelen het vrijblijvend en zeggen eerlijk of het nodig is."},{"question":"Kunnen jullie de kleur van de voeg aanpassen?","answer":"Ja. We stemmen de kleur en de vorm af op je huis, zodat het nieuwe voegwerk natuurlijk overgaat in het bestaande beeld."},{"question":"Doen jullie ook oudere of monumentale panden?","answer":"Ja. Bij oudere panden gebruiken we waar nodig een ademende kalkmortel, zodat de muur droog kan blijven ademen."},{"question":"Moet de hele gevel opnieuw gevoegd worden?","answer":"Niet altijd. Soms volstaat het om de slechte vlakken aan te pakken. We adviseren wat verstandig en kostenefficiënt is."}]', 'Voegwerkzaamheden in Helvoirt en omgeving · Helvoirt Gevelreiniging', 'Voegwerk vervangen en herstellen door Helvoirt Gevelreiniging. Oude voegen uithakken en opnieuw invoegen in de juiste kleur en mortel, weer waterdicht. Vraag een gratis offerte aan.');
INSERT INTO "ec_diensten" ("id", "slug", "status", "locale", "nav_order", "nav_title", "nav_text", "nav_alt", "title", "eyebrow", "lead", "hero_alt", "hero_caption", "points", "intro_heading", "intro_body", "included_title", "included", "resultaat_heading", "resultaat_sub", "result_1_alt", "result_1_caption", "result_1_detail", "result_2_alt", "result_2_caption", "result_2_detail", "result_3_alt", "result_3_caption", "result_3_detail", "aanpak_title", "aanpak", "faq", "meta_title", "meta_description") VALUES ('01KVA9953CPG3K9D3J20TAGYPB', 'dakreiniging-coating', 'published', 'en', 3, 'Dak reinigen + coating', 'Mos en aanslag eraf, daarna een beschermende coating. Een schoon dak dat water beter afvoert en langer mooi blijft.', 'Schoon dakpannendak na reiniging en coating', 'Dak reinigen en coaten', 'Onze diensten', 'Mos, algen en aanslag halen we van je dak, daarna brengen we waar gewenst een beschermende coating aan. Een schoon dak dat water beter afvoert en langer mooi en heel blijft.', 'Schoon dakpannendak na reiniging en coating', 'Schoon en beschermd', '[{"text":"Mos en aanslag eraf"},{"text":"Beschermende coating"},{"text":"Eerlijke prijs vooraf"}]', 'Een schoon dak gaat langer mee', '[{"text":"Mos en algen houden vocht vast en kunnen pannen poreus maken en de waterafvoer verstoppen. Wij reinigen het dak grondig en verwijderen de begroeiing, zodat het water weer vrij wegloopt en je dak er weer netjes bij ligt."},{"text":"Daarna kun je kiezen voor een beschermende coating. Die sluit de pannen af, gaat nieuwe aangroei tegen en geeft het dak weer een egale, frisse kleur."}]', 'Wat we voor je doen', '[{"text":"Mos, algen en aanslag verwijderen"},{"text":"Dak grondig reinigen, veilig op hoogte"},{"text":"Dakgoten en afvoer meenemen"},{"text":"Optioneel een beschermende coating"},{"text":"Kleurherstel voor een egaal, fris dak"},{"text":"Afgespoelde resten netjes opgeruimd"}]', 'Van mos tot een schoon dak', 'Mos eraf, grondig gereinigd en waar gewenst beschermend gecoat.', 'Dakpannendak vol mos voor de reiniging', 'Mos en algen verwijderen', 'Begroeiing houdt vocht vast en verstopt de afvoer, die halen we eraf.', 'Dak wordt op hoogte gereinigd', 'Grondig reinigen op hoogte', 'Veilig en zorgvuldig, ook de lastig bereikbare delen.', 'Schoon dakpannendak na reiniging en coating', 'Schoon en beschermd opgeleverd', 'Een egaal, fris dak, klaar voor jaren vooruit.', 'Zo pakken we het aan', '[{"title":"Inspectie op hoogte","text":"We bekijken het dak, de pannen en de afvoer, en bepalen de juiste aanpak."},{"title":"Reinigen","text":"Mos, algen en aanslag verwijderen we grondig, veilig en netjes op hoogte."},{"title":"Coaten (optioneel)","text":"Een beschermende coating sluit de pannen af en gaat nieuwe aangroei tegen."},{"title":"Strak opgeleverd","text":"We spoelen na, ruimen de resten op en lopen het samen na."}]', '[{"question":"Is mijn dak geschikt voor coating?","answer":"De meeste pannendaken wel. We beoordelen de staat van de pannen eerst; soms is alleen reinigen verstandiger. We zeggen eerlijk wat het beste is."},{"question":"Hoe lang blijft het dak schoon?","answer":"Dat hangt van de ligging en de begroeiing in de omgeving af. Met een coating gaat het langer mee, omdat mos en vuil minder grip krijgen."},{"question":"Werken jullie veilig op hoogte?","answer":"Ja. We werken met de juiste voorzieningen, zodat het werk veilig en zorgvuldig gebeurt."},{"question":"Beschadigt de reiniging de dakpannen niet?","answer":"Niet als de druk en de methode kloppen. We stemmen die af op de staat van de pannen, zodat het dak schoon wordt zonder schade."}]', 'Dak reinigen en coaten in Helvoirt en omgeving · Helvoirt Gevelreiniging', 'Dakreiniging en coating door Helvoirt Gevelreiniging. Mos en aanslag eraf, een beschermende coating en betere waterafvoer. Vraag een gratis offerte aan.');
INSERT INTO "ec_diensten" ("id", "slug", "status", "locale", "nav_order", "nav_title", "nav_text", "nav_alt", "title", "eyebrow", "lead", "hero_alt", "hero_caption", "points", "intro_heading", "intro_body", "included_title", "included", "resultaat_heading", "resultaat_sub", "result_1_alt", "result_1_caption", "result_1_detail", "result_2_alt", "result_2_caption", "result_2_detail", "result_3_alt", "result_3_caption", "result_3_detail", "aanpak_title", "aanpak", "faq", "meta_title", "meta_description") VALUES ('01KVA9953CCD1BZS9G3DACX7FQ', 'schoorsteen-voegwerk', 'published', 'en', 4, 'Schoorsteen voegwerk', 'Voeg-, metsel- en loodwerk aan de schoorsteen herstellen, zodat lekkage en verdere schade voorkomen worden.', 'Herstelde schoorsteen met nieuw voegwerk op een dak', 'Schoorsteen voegwerk', 'Onze diensten', 'Voeg- en metselwerk aan de schoorsteen herstellen we vakkundig, vaak in combinatie met het loodwerk. Zo voorkomen we lekkage en verdere schade, en staat de schoorsteen er weer netjes en veilig bij.', 'Herstelde schoorsteen met nieuw voegwerk en loodwerk op een dak', 'Schoorsteen hersteld', '[{"text":"Voorkomt lekkage"},{"text":"Vaak met loodwerk"},{"text":"Eerlijke prijs vooraf"}]', 'Een schoorsteen die weer waterdicht is', '[{"text":"De schoorsteen krijgt veel weer te verduren en is een veelvoorkomende bron van lekkage. Loszittend voegwerk, scheuren in het metselwerk of slecht aansluitend lood laten water binnen, soms tot in de woning. Wij herstellen het voeg- en metselwerk en pakken het loodwerk in dezelfde klus mee."},{"text":"Omdat het werk op hoogte gebeurt, werken we veilig en zorgvuldig. Je krijgt vooraf een duidelijke prijs, ook als blijkt dat alleen een deel hersteld hoeft te worden."}]', 'Wat we voor je doen', '[{"text":"Loszittend voegwerk uithakken en opnieuw invoegen"},{"text":"Scheuren en beschadigd metselwerk herstellen"},{"text":"Loodwerk nakijken en waar nodig vervangen"},{"text":"Aansluitingen weer waterdicht maken"},{"text":"Veilig werken op hoogte"},{"text":"Netjes opgeleverd en opgeruimd"}]', 'Zo ziet het resultaat eruit', 'Schoorstenen met hersteld voeg-, metsel- en loodwerk, weer waterdicht en netjes.', 'Schoorsteen met nieuw aangebracht loodwerk op een dak', 'Nieuw loodwerk', 'Strak aangesloten lood rond de schoorsteen, weer waterdicht.', 'Hersteld metsel- en voegwerk', 'Metselwerk hersteld', 'Loszittende stenen en voegen weer vast en netjes.', 'Herstelde schoorsteen met nieuw voegwerk op een dak', 'Schoorsteen weer netjes', 'Hersteld voeg- en loodwerk, klaar voor jaren vooruit.', 'Zo pakken we het aan', '[{"title":"Inspectie op hoogte","text":"We bekijken het voeg-, metsel- en loodwerk en sporen de oorzaak van lekkage op."},{"title":"Herstellen","text":"Slecht voegwerk hakken we uit, scheuren en metselwerk herstellen we."},{"title":"Loodwerk waterdicht","text":"Het lood kijken we na en vervangen we waar nodig, zodat alles weer goed aansluit."},{"title":"Veilig opgeleverd","text":"We ruimen op en lopen het werk samen na."}]', '[{"question":"Hoe weet ik of mijn schoorsteen lekt?","answer":"Vochtplekken op zolder of rond de schoorsteen, of een muffe geur, wijzen vaak op een lekkende schoorsteen. We zoeken vrijblijvend de oorzaak op."},{"question":"Doen jullie ook het loodwerk?","answer":"Ja. Voeg-, metsel- en loodwerk pakken we het liefst in een klus, want de lekkage zit vaak in de combinatie van die drie."},{"question":"Moet de schoorsteen helemaal opnieuw?","answer":"Lang niet altijd. Vaak volstaat herstel van de slechte plekken. We zeggen eerlijk wat nodig is."},{"question":"Werken jullie veilig op hoogte?","answer":"Ja. We werken met de juiste voorzieningen, zodat het werk veilig en netjes gebeurt."}]', 'Schoorsteen voegwerk en herstel in Helvoirt en omgeving · Helvoirt Gevelreiniging', 'Schoorsteen voegwerk, metselwerk en loodwerk herstellen door Helvoirt Gevelreiniging. Voorkom lekkage en schade, weer waterdicht. Vraag een gratis offerte aan.');
INSERT INTO "ec_diensten" ("id", "slug", "status", "locale", "nav_order", "nav_title", "nav_text", "nav_alt", "title", "eyebrow", "lead", "hero_alt", "hero_caption", "points", "intro_heading", "intro_body", "included_title", "included", "resultaat_heading", "resultaat_sub", "result_1_alt", "result_1_caption", "result_1_detail", "result_2_alt", "result_2_caption", "result_2_detail", "result_3_alt", "result_3_caption", "result_3_detail", "aanpak_title", "aanpak", "faq", "meta_title", "meta_description") VALUES ('01KVA9953C2GRRXNQP5JXBQEP9', 'algemeen-reinigen', 'published', 'en', 5, 'Algemeen reinigen', 'Terras, oprit, bestrating en ander buitenwerk. We pakken het hele plaatje aan en maken de buitenkant weer fris.', 'Terras en bestrating worden schoongespoten', 'Algemeen reinigen', 'Onze diensten', 'Terras, oprit, bestrating en ander buitenwerk maken we weer fris. We pakken het hele plaatje rond je huis aan, zodat de buitenkant er weer verzorgd en veilig bij ligt.', 'Terras en bestrating worden schoongespoten', 'Bestrating weer fris', '[{"text":"Terras en oprit"},{"text":"Heel het buitenwerk"},{"text":"Eerlijke prijs vooraf"}]', 'De hele buitenkant weer fris', '[{"text":"Niet alleen de gevel, ook het terras, de oprit, de bestrating en ander buitenwerk vervuilen en vergroenen na verloop van tijd. Groene aanslag maakt bestrating bovendien glad en onveilig. Wij reinigen het grondig, zodat alles er weer netjes en veilig bij ligt."},{"text":"We kijken naar het hele plaatje rond je huis en stemmen de aanpak af op de ondergrond, of het nu om sierbestrating, beton of natuursteen gaat."}]', 'Wat we voor je doen', '[{"text":"Terras, oprit en bestrating reinigen"},{"text":"Groene aanslag en onkruid aanpakken"},{"text":"Tuinmuren, schuttingen en bijgebouwen"},{"text":"Aanpak afgestemd op de ondergrond"},{"text":"Optioneel opnieuw invegen van voegzand"},{"text":"Alles netjes opgeruimd en afgespoeld"}]', 'Zo ziet het resultaat eruit', 'Een greep uit ons werk: terrassen, bestrating en muren weer schoon en fris.', 'Schone tuinmuur en bestrating na reiniging', 'Tuinmuur en bestrating', 'Muur en terras weer schoon en verzorgd.', 'Schone tuintrap en metselwerk', 'Tuintrap en metselwerk', 'Bestrating en trap weer netjes en veilig.', 'Vers gereinigd terras en bestrating', 'Terras weer fris', 'Groene aanslag eraf, de bestrating is weer veilig.', 'Zo pakken we het aan', '[{"title":"Inspectie en advies","text":"We bekijken het buitenwerk en de ondergrond, en kiezen de juiste methode."},{"title":"Reinigen op maat","text":"Met de juiste druk halen we aanslag en vuil weg, zonder de bestrating te beschadigen."},{"title":"Afwerken","text":"Waar nodig vegen we voegzand opnieuw in en pakken we onkruid aan."},{"title":"Strak opgeleverd","text":"We spoelen na, ruimen op en lopen het samen na."}]', '[{"question":"Wat kunnen jullie allemaal reinigen?","answer":"Terras, oprit, bestrating, tuinmuren, schuttingen en bijgebouwen. Vrijwel al het buitenwerk rond je huis."},{"question":"Beschadigt hogedruk de bestrating niet?","answer":"Niet als de druk klopt. We stemmen die af op de ondergrond, zodat het schoon wordt zonder schade."},{"question":"Vegen jullie het voegzand opnieuw in?","answer":"Dat kan. Na het reinigen kunnen we het voegzand aanvullen, zodat de bestrating stevig blijft liggen."},{"question":"Kan dit samen met de gevelreiniging?","answer":"Zeker. Veel klanten combineren het, dan staat de hele buitenkant in een keer weer fris. Dat scheelt ook in de kosten."}]', 'Terras, oprit en bestrating reinigen in Helvoirt en omgeving · Helvoirt Gevelreiniging', 'Algemeen reinigen door Helvoirt Gevelreiniging: terras, oprit, bestrating en ander buitenwerk weer fris en veilig. Vraag een gratis offerte aan.');
+40
View File
@@ -0,0 +1,40 @@
-- Diensten: foto's in de mediabibliotheek + gekoppeld aan de 25 beeldvelden.
INSERT OR REPLACE INTO media (id, filename, mime_type, size, width, height, alt, storage_key, status, created_at) VALUES
('01KVABG8HVD5Q9SZHB57R1V4QE', 'dienst-gevelreiniging-1280.webp', 'image/webp', 223140, 1280, 956, 'Bakstenen gevel halverwege de reiniging', '01KVABG8HVD5Q9SZHB57R1V4QE.webp', 'ready', datetime('now')),
('01KVABG8HY61YGK0E9153CQ3WT', 'dienst-voegwerk-1280.webp', 'image/webp', 158522, 1280, 956, 'Strak nieuw voegwerk tussen rode bakstenen', '01KVABG8HY61YGK0E9153CQ3WT.webp', 'ready', datetime('now')),
('01KVABG8HYX533E7BA88787QC8', 'dienst-dakreiniging-1280.webp', 'image/webp', 147566, 1280, 956, 'Schoon dakpannendak na reiniging en coating', '01KVABG8HYX533E7BA88787QC8.webp', 'ready', datetime('now')),
('01KVABG8HYSDJ42N6SXVH96KRA', 'dienst-schoorsteen-1280.webp', 'image/webp', 141238, 1280, 956, 'Herstelde schoorsteen met nieuw voegwerk op een dak', '01KVABG8HYSDJ42N6SXVH96KRA.webp', 'ready', datetime('now')),
('01KVABG8HZQS2JPPZH7R6EZH2N', 'dienst-algemeen-1280.webp', 'image/webp', 283500, 1280, 956, 'Vers gereinigd terras en bestrating', '01KVABG8HZQS2JPPZH7R6EZH2N.webp', 'ready', datetime('now')),
('01KVABG8HZ74N5V5ZM6JYVGNJH', 'hero-after-1280.webp', 'image/webp', 158222, 1280, 714, 'Schone bakstenen gevel na reiniging', '01KVABG8HZ74N5V5ZM6JYVGNJH.webp', 'ready', datetime('now')),
('01KVABG8HZH5Y705NAS5B7FMEX', 'hero-gevel-1280.webp', 'image/webp', 192040, 1280, 714, 'Verzorgde, schone gevel van een woonhuis', '01KVABG8HZH5Y705NAS5B7FMEX.webp', 'ready', datetime('now')),
('01KVABG8HZENXT71V00NY1M2N5', 'werk-1.webp', 'image/webp', 376578, 1200, 1600, 'Schoorsteen met nieuw aangebracht loodwerk op een dak', '01KVABG8HZENXT71V00NY1M2N5.webp', 'ready', datetime('now')),
('01KVABG8HZSPH8YKM0GJC0WDE2', 'werk-2.webp', 'image/webp', 341744, 1600, 1200, 'Schone tuinmuur en bestrating na reiniging', '01KVABG8HZSPH8YKM0GJC0WDE2.webp', 'ready', datetime('now')),
('01KVABG8HZN66T8KPTBWHQSFZS', 'werk-3.webp', 'image/webp', 181398, 738, 1600, 'Strak nieuw voegwerk tussen de bakstenen van een gevel', '01KVABG8HZN66T8KPTBWHQSFZS.webp', 'ready', datetime('now')),
('01KVABG8HZ2H1TAB7E4J3QRCSM', 'werk-4.webp', 'image/webp', 614486, 1200, 1600, 'Dakpannendak vol mos voor de reiniging', '01KVABG8HZ2H1TAB7E4J3QRCSM.webp', 'ready', datetime('now')),
('01KVABG8HZ9KFWV8604FYYSEAY', 'werk-5.webp', 'image/webp', 428016, 1200, 1600, 'Dak wordt op hoogte gereinigd', '01KVABG8HZ9KFWV8604FYYSEAY.webp', 'ready', datetime('now')),
('01KVABG8HZV3AHQ5RQGVAKW29F', 'werk-6.webp', 'image/webp', 293814, 1200, 1600, 'Hersteld metsel- en voegwerk aan een tuinmuur met trap', '01KVABG8HZV3AHQ5RQGVAKW29F.webp', 'ready', datetime('now'));
UPDATE ec_diensten SET nav_image='{"id":"01KVABG8HVD5Q9SZHB57R1V4QE","provider":"local","filename":"dienst-gevelreiniging-1280.webp","mimeType":"image/webp","width":1280,"height":956,"alt":"Bakstenen gevel halverwege de reiniging","meta":{"storageKey":"01KVABG8HVD5Q9SZHB57R1V4QE.webp"}}' WHERE slug='gevelreiniging';
UPDATE ec_diensten SET hero_image='{"id":"01KVABG8HVD5Q9SZHB57R1V4QE","provider":"local","filename":"dienst-gevelreiniging-1280.webp","mimeType":"image/webp","width":1280,"height":956,"alt":"Bakstenen gevel halverwege de reiniging","meta":{"storageKey":"01KVABG8HVD5Q9SZHB57R1V4QE.webp"}}' WHERE slug='gevelreiniging';
UPDATE ec_diensten SET result_1_image='{"id":"01KVABG8HZ74N5V5ZM6JYVGNJH","provider":"local","filename":"hero-after-1280.webp","mimeType":"image/webp","width":1280,"height":714,"alt":"Schone bakstenen gevel na reiniging","meta":{"storageKey":"01KVABG8HZ74N5V5ZM6JYVGNJH.webp"}}' WHERE slug='gevelreiniging';
UPDATE ec_diensten SET result_2_image='{"id":"01KVABG8HY61YGK0E9153CQ3WT","provider":"local","filename":"dienst-voegwerk-1280.webp","mimeType":"image/webp","width":1280,"height":956,"alt":"Strak nieuw voegwerk tussen rode bakstenen","meta":{"storageKey":"01KVABG8HY61YGK0E9153CQ3WT.webp"}}' WHERE slug='gevelreiniging';
UPDATE ec_diensten SET result_3_image='{"id":"01KVABG8HZH5Y705NAS5B7FMEX","provider":"local","filename":"hero-gevel-1280.webp","mimeType":"image/webp","width":1280,"height":714,"alt":"Verzorgde, schone gevel van een woonhuis","meta":{"storageKey":"01KVABG8HZH5Y705NAS5B7FMEX.webp"}}' WHERE slug='gevelreiniging';
UPDATE ec_diensten SET nav_image='{"id":"01KVABG8HY61YGK0E9153CQ3WT","provider":"local","filename":"dienst-voegwerk-1280.webp","mimeType":"image/webp","width":1280,"height":956,"alt":"Strak nieuw voegwerk tussen rode bakstenen","meta":{"storageKey":"01KVABG8HY61YGK0E9153CQ3WT.webp"}}' WHERE slug='voegwerk';
UPDATE ec_diensten SET hero_image='{"id":"01KVABG8HY61YGK0E9153CQ3WT","provider":"local","filename":"dienst-voegwerk-1280.webp","mimeType":"image/webp","width":1280,"height":956,"alt":"Strak nieuw voegwerk tussen rode bakstenen","meta":{"storageKey":"01KVABG8HY61YGK0E9153CQ3WT.webp"}}' WHERE slug='voegwerk';
UPDATE ec_diensten SET result_1_image='{"id":"01KVABG8HZN66T8KPTBWHQSFZS","provider":"local","filename":"werk-3.webp","mimeType":"image/webp","width":738,"height":1600,"alt":"Strak nieuw voegwerk tussen de bakstenen van een gevel","meta":{"storageKey":"01KVABG8HZN66T8KPTBWHQSFZS.webp"}}' WHERE slug='voegwerk';
UPDATE ec_diensten SET result_2_image='{"id":"01KVABG8HZV3AHQ5RQGVAKW29F","provider":"local","filename":"werk-6.webp","mimeType":"image/webp","width":1200,"height":1600,"alt":"Hersteld metsel- en voegwerk aan een tuinmuur met trap","meta":{"storageKey":"01KVABG8HZV3AHQ5RQGVAKW29F.webp"}}' WHERE slug='voegwerk';
UPDATE ec_diensten SET result_3_image='{"id":"01KVABG8HZH5Y705NAS5B7FMEX","provider":"local","filename":"hero-gevel-1280.webp","mimeType":"image/webp","width":1280,"height":714,"alt":"Verzorgde, schone gevel van een woonhuis","meta":{"storageKey":"01KVABG8HZH5Y705NAS5B7FMEX.webp"}}' WHERE slug='voegwerk';
UPDATE ec_diensten SET nav_image='{"id":"01KVABG8HYX533E7BA88787QC8","provider":"local","filename":"dienst-dakreiniging-1280.webp","mimeType":"image/webp","width":1280,"height":956,"alt":"Schoon dakpannendak na reiniging en coating","meta":{"storageKey":"01KVABG8HYX533E7BA88787QC8.webp"}}' WHERE slug='dakreiniging-coating';
UPDATE ec_diensten SET hero_image='{"id":"01KVABG8HYX533E7BA88787QC8","provider":"local","filename":"dienst-dakreiniging-1280.webp","mimeType":"image/webp","width":1280,"height":956,"alt":"Schoon dakpannendak na reiniging en coating","meta":{"storageKey":"01KVABG8HYX533E7BA88787QC8.webp"}}' WHERE slug='dakreiniging-coating';
UPDATE ec_diensten SET result_1_image='{"id":"01KVABG8HZ2H1TAB7E4J3QRCSM","provider":"local","filename":"werk-4.webp","mimeType":"image/webp","width":1200,"height":1600,"alt":"Dakpannendak vol mos voor de reiniging","meta":{"storageKey":"01KVABG8HZ2H1TAB7E4J3QRCSM.webp"}}' WHERE slug='dakreiniging-coating';
UPDATE ec_diensten SET result_2_image='{"id":"01KVABG8HZ9KFWV8604FYYSEAY","provider":"local","filename":"werk-5.webp","mimeType":"image/webp","width":1200,"height":1600,"alt":"Dak wordt op hoogte gereinigd","meta":{"storageKey":"01KVABG8HZ9KFWV8604FYYSEAY.webp"}}' WHERE slug='dakreiniging-coating';
UPDATE ec_diensten SET result_3_image='{"id":"01KVABG8HYX533E7BA88787QC8","provider":"local","filename":"dienst-dakreiniging-1280.webp","mimeType":"image/webp","width":1280,"height":956,"alt":"Schoon dakpannendak na reiniging en coating","meta":{"storageKey":"01KVABG8HYX533E7BA88787QC8.webp"}}' WHERE slug='dakreiniging-coating';
UPDATE ec_diensten SET nav_image='{"id":"01KVABG8HYSDJ42N6SXVH96KRA","provider":"local","filename":"dienst-schoorsteen-1280.webp","mimeType":"image/webp","width":1280,"height":956,"alt":"Herstelde schoorsteen met nieuw voegwerk op een dak","meta":{"storageKey":"01KVABG8HYSDJ42N6SXVH96KRA.webp"}}' WHERE slug='schoorsteen-voegwerk';
UPDATE ec_diensten SET hero_image='{"id":"01KVABG8HYSDJ42N6SXVH96KRA","provider":"local","filename":"dienst-schoorsteen-1280.webp","mimeType":"image/webp","width":1280,"height":956,"alt":"Herstelde schoorsteen met nieuw voegwerk op een dak","meta":{"storageKey":"01KVABG8HYSDJ42N6SXVH96KRA.webp"}}' WHERE slug='schoorsteen-voegwerk';
UPDATE ec_diensten SET result_1_image='{"id":"01KVABG8HZENXT71V00NY1M2N5","provider":"local","filename":"werk-1.webp","mimeType":"image/webp","width":1200,"height":1600,"alt":"Schoorsteen met nieuw aangebracht loodwerk op een dak","meta":{"storageKey":"01KVABG8HZENXT71V00NY1M2N5.webp"}}' WHERE slug='schoorsteen-voegwerk';
UPDATE ec_diensten SET result_2_image='{"id":"01KVABG8HZV3AHQ5RQGVAKW29F","provider":"local","filename":"werk-6.webp","mimeType":"image/webp","width":1200,"height":1600,"alt":"Hersteld metsel- en voegwerk aan een tuinmuur met trap","meta":{"storageKey":"01KVABG8HZV3AHQ5RQGVAKW29F.webp"}}' WHERE slug='schoorsteen-voegwerk';
UPDATE ec_diensten SET result_3_image='{"id":"01KVABG8HYSDJ42N6SXVH96KRA","provider":"local","filename":"dienst-schoorsteen-1280.webp","mimeType":"image/webp","width":1280,"height":956,"alt":"Herstelde schoorsteen met nieuw voegwerk op een dak","meta":{"storageKey":"01KVABG8HYSDJ42N6SXVH96KRA.webp"}}' WHERE slug='schoorsteen-voegwerk';
UPDATE ec_diensten SET nav_image='{"id":"01KVABG8HZQS2JPPZH7R6EZH2N","provider":"local","filename":"dienst-algemeen-1280.webp","mimeType":"image/webp","width":1280,"height":956,"alt":"Vers gereinigd terras en bestrating","meta":{"storageKey":"01KVABG8HZQS2JPPZH7R6EZH2N.webp"}}' WHERE slug='algemeen-reinigen';
UPDATE ec_diensten SET hero_image='{"id":"01KVABG8HZQS2JPPZH7R6EZH2N","provider":"local","filename":"dienst-algemeen-1280.webp","mimeType":"image/webp","width":1280,"height":956,"alt":"Vers gereinigd terras en bestrating","meta":{"storageKey":"01KVABG8HZQS2JPPZH7R6EZH2N.webp"}}' WHERE slug='algemeen-reinigen';
UPDATE ec_diensten SET result_1_image='{"id":"01KVABG8HZSPH8YKM0GJC0WDE2","provider":"local","filename":"werk-2.webp","mimeType":"image/webp","width":1600,"height":1200,"alt":"Schone tuinmuur en bestrating na reiniging","meta":{"storageKey":"01KVABG8HZSPH8YKM0GJC0WDE2.webp"}}' WHERE slug='algemeen-reinigen';
UPDATE ec_diensten SET result_2_image='{"id":"01KVABG8HZV3AHQ5RQGVAKW29F","provider":"local","filename":"werk-6.webp","mimeType":"image/webp","width":1200,"height":1600,"alt":"Hersteld metsel- en voegwerk aan een tuinmuur met trap","meta":{"storageKey":"01KVABG8HZV3AHQ5RQGVAKW29F.webp"}}' WHERE slug='algemeen-reinigen';
UPDATE ec_diensten SET result_3_image='{"id":"01KVABG8HZQS2JPPZH7R6EZH2N","provider":"local","filename":"dienst-algemeen-1280.webp","mimeType":"image/webp","width":1280,"height":956,"alt":"Vers gereinigd terras en bestrating","meta":{"storageKey":"01KVABG8HZQS2JPPZH7R6EZH2N.webp"}}' WHERE slug='algemeen-reinigen';
+32
View File
@@ -0,0 +1,32 @@
-- Nieuwe hero-card-varianten in de mediabibliotheek.
INSERT OR REPLACE INTO media (id, filename, mime_type, size, width, height, alt, storage_key, status, created_at) VALUES
('01KVABVVPZA6FYGXQYPH0SGJP1', 'werk-1-768.webp', 'image/webp', 172718, 768, 1024, 'Herstelde schoorsteen met nieuw loodwerk op een dak', '01KVABVVPZA6FYGXQYPH0SGJP1.webp', 'ready', datetime('now')),
('01KVABVVQ0DE1QX42SJ0SD44W8', 'werk-5-768.webp', 'image/webp', 191256, 768, 1024, 'Dak wordt op hoogte gereinigd', '01KVABVVQ0DE1QX42SJ0SD44W8.webp', 'ready', datetime('now'));
-- Auto-gegenereerd door scripts/gen-cms-sql.mjs — NIET met de hand bewerken.
-- ===== collectie: hero_cards (Homepage · hero-foto's) =====
INSERT INTO _emdash_collections (id, slug, label, label_singular, supports, source, has_seo) VALUES ('01KVABVVQ1NR3K9F9WKSRESQS2', 'hero_cards', 'Homepage · hero-foto''s', 'Hero-foto', '["drafts"]', 'seed', 0);
CREATE TABLE "ec_hero_cards" ("id" text primary key, "slug" text, "status" text default 'draft', "author_id" text, "primary_byline_id" text, "created_at" text default (datetime('now')), "updated_at" text default (datetime('now')), "published_at" text, "scheduled_at" text, "deleted_at" text, "version" integer default 1, "live_revision_id" text references "revisions" ("id"), "draft_revision_id" text references "revisions" ("id"), "locale" text default 'en' not null, "translation_group" text, "sort" INTEGER, "image" TEXT, "title" TEXT NOT NULL DEFAULT '', "sub" TEXT, "alt" TEXT, constraint "ec_hero_cards_slug_locale_unique" unique ("slug", "locale"));
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVABVVQ122ME8J05N5KVVN6Y', '01KVABVVQ1NR3K9F9WKSRESQS2', 'sort', 'Volgorde', 'integer', 'INTEGER', 0, 0, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVABVVQ16T3Y8AGE0CC5WDMN', '01KVABVVQ1NR3K9F9WKSRESQS2', 'image', 'Foto', 'image', 'TEXT', 0, 1, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVABVVQ16JSEANWCYPSXYZFR', '01KVABVVQ1NR3K9F9WKSRESQS2', 'title', 'Titel (op de foto)', 'string', 'TEXT', 1, 2, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVABVVQ1ECG3EWNNCBJBQ9GS', '01KVABVVQ1NR3K9F9WKSRESQS2', 'sub', 'Ondertitel (op de foto)', 'string', 'TEXT', 0, 3, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVABVVQ1RZHRW4SS4BFQCP0C', '01KVABVVQ1NR3K9F9WKSRESQS2', 'alt', 'Alt-tekst', 'string', 'TEXT', 0, 4, 0, 1);
INSERT INTO "ec_hero_cards" ("id", "slug", "status", "locale", "sort", "image", "title", "sub", "alt") VALUES ('01KVABVVQ11RQWC684MBJ6WBYK', 'card-1', 'published', 'en', 1, '{"id":"01KVABG8HZN66T8KPTBWHQSFZS","provider":"local","filename":"werk-3.webp","mimeType":"image/webp","width":738,"height":1600,"alt":"Strak nieuw voegwerk tussen bakstenen van een gevel","meta":{"storageKey":"01KVABG8HZN66T8KPTBWHQSFZS.webp"}}', 'Voegwerk', 'gevel hersteld', 'Strak nieuw voegwerk tussen bakstenen van een gevel');
INSERT INTO "ec_hero_cards" ("id", "slug", "status", "locale", "sort", "image", "title", "sub", "alt") VALUES ('01KVABVVQ1FDVGKZ9D3WMGH5VN', 'card-2', 'published', 'en', 2, '{"id":"01KVABVVPZA6FYGXQYPH0SGJP1","provider":"local","filename":"werk-1-768.webp","mimeType":"image/webp","width":768,"height":1024,"alt":"Herstelde schoorsteen met nieuw loodwerk op een dak","meta":{"storageKey":"01KVABVVPZA6FYGXQYPH0SGJP1.webp"}}', 'Schoorsteen', 'nieuw loodwerk', 'Herstelde schoorsteen met nieuw loodwerk op een dak');
INSERT INTO "ec_hero_cards" ("id", "slug", "status", "locale", "sort", "image", "title", "sub", "alt") VALUES ('01KVABVVQ1F6R1AX4EQEVX3NY8', 'card-3', 'published', 'en', 3, '{"id":"01KVABVVQ0DE1QX42SJ0SD44W8","provider":"local","filename":"werk-5-768.webp","mimeType":"image/webp","width":768,"height":1024,"alt":"Dak wordt op hoogte gereinigd","meta":{"storageKey":"01KVABVVQ0DE1QX42SJ0SD44W8.webp"}}', 'Dakreiniging', 'op hoogte', 'Dak wordt op hoogte gereinigd');
-- ===== collectie: galerij (Homepage · bewijs-galerij) =====
INSERT INTO _emdash_collections (id, slug, label, label_singular, supports, source, has_seo) VALUES ('01KVABVVQ14SQR0WHZTH7WFDMZ', 'galerij', 'Homepage · bewijs-galerij', 'Galerij-foto', '["drafts"]', 'seed', 0);
CREATE TABLE "ec_galerij" ("id" text primary key, "slug" text, "status" text default 'draft', "author_id" text, "primary_byline_id" text, "created_at" text default (datetime('now')), "updated_at" text default (datetime('now')), "published_at" text, "scheduled_at" text, "deleted_at" text, "version" integer default 1, "live_revision_id" text references "revisions" ("id"), "draft_revision_id" text references "revisions" ("id"), "locale" text default 'en' not null, "translation_group" text, "sort" INTEGER, "image" TEXT, "caption" TEXT NOT NULL DEFAULT '', "featured" INTEGER, constraint "ec_galerij_slug_locale_unique" unique ("slug", "locale"));
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVABVVQ2XMM41D22G827XSK1', '01KVABVVQ14SQR0WHZTH7WFDMZ', 'sort', 'Volgorde', 'integer', 'INTEGER', 0, 0, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVABVVQ2EHPAYE6W6MGDH97V', '01KVABVVQ14SQR0WHZTH7WFDMZ', 'image', 'Foto', 'image', 'TEXT', 0, 1, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVABVVQ2EW3FW6JR4KHXZ99F', '01KVABVVQ14SQR0WHZTH7WFDMZ', 'caption', 'Bijschrift', 'string', 'TEXT', 1, 2, 0, 1);
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable) VALUES ('01KVABVVQ2VAGD68C1JR9TJS8H', '01KVABVVQ14SQR0WHZTH7WFDMZ', 'featured', 'Uitgelicht (grote tegel)', 'boolean', 'INTEGER', 0, 3, 0, 1);
INSERT INTO "ec_galerij" ("id", "slug", "status", "locale", "sort", "image", "caption", "featured") VALUES ('01KVABVVQ2YS6NB5BR9QP49G21', 'g-1', 'published', 'en', 1, '{"id":"01KVABG8HZN66T8KPTBWHQSFZS","provider":"local","filename":"werk-3.webp","mimeType":"image/webp","width":738,"height":1600,"alt":"Voegwerk aan de gevel","meta":{"storageKey":"01KVABG8HZN66T8KPTBWHQSFZS.webp"}}', 'Voegwerk aan de gevel', 1);
INSERT INTO "ec_galerij" ("id", "slug", "status", "locale", "sort", "image", "caption", "featured") VALUES ('01KVABVVQ2CARDWEFR2S7527QT', 'g-2', 'published', 'en', 2, '{"id":"01KVABG8HZENXT71V00NY1M2N5","provider":"local","filename":"werk-1.webp","mimeType":"image/webp","width":1200,"height":1600,"alt":"Schoorsteen met nieuw loodwerk","meta":{"storageKey":"01KVABG8HZENXT71V00NY1M2N5.webp"}}', 'Schoorsteen met nieuw loodwerk', 0);
INSERT INTO "ec_galerij" ("id", "slug", "status", "locale", "sort", "image", "caption", "featured") VALUES ('01KVABVVQ2R2CFFNSVST3RKW1E', 'g-3', 'published', 'en', 3, '{"id":"01KVABG8HZ2H1TAB7E4J3QRCSM","provider":"local","filename":"werk-4.webp","mimeType":"image/webp","width":1200,"height":1600,"alt":"Dak vol mos, voor reiniging","meta":{"storageKey":"01KVABG8HZ2H1TAB7E4J3QRCSM.webp"}}', 'Dak vol mos, voor reiniging', 0);
INSERT INTO "ec_galerij" ("id", "slug", "status", "locale", "sort", "image", "caption", "featured") VALUES ('01KVABVVQ20N5N5YNM50TK2991', 'g-4', 'published', 'en', 4, '{"id":"01KVABG8HZSPH8YKM0GJC0WDE2","provider":"local","filename":"werk-2.webp","mimeType":"image/webp","width":1600,"height":1200,"alt":"Tuinmuur en bestrating","meta":{"storageKey":"01KVABG8HZSPH8YKM0GJC0WDE2.webp"}}', 'Tuinmuur en bestrating', 0);
INSERT INTO "ec_galerij" ("id", "slug", "status", "locale", "sort", "image", "caption", "featured") VALUES ('01KVABVVQ2K99A0XS85TRWPD9Q', 'g-5', 'published', 'en', 5, '{"id":"01KVABG8HZ9KFWV8604FYYSEAY","provider":"local","filename":"werk-5.webp","mimeType":"image/webp","width":1200,"height":1600,"alt":"Dakreiniging op hoogte","meta":{"storageKey":"01KVABG8HZ9KFWV8604FYYSEAY.webp"}}', 'Dakreiniging op hoogte', 0);
INSERT INTO "ec_galerij" ("id", "slug", "status", "locale", "sort", "image", "caption", "featured") VALUES ('01KVABVVQ2Z0YDXZB31X4TQ10Y', 'g-6', 'published', 'en', 6, '{"id":"01KVABG8HZV3AHQ5RQGVAKW29F","provider":"local","filename":"werk-6.webp","mimeType":"image/webp","width":1200,"height":1600,"alt":"Metselwerk, tuintrap","meta":{"storageKey":"01KVABG8HZV3AHQ5RQGVAKW29F.webp"}}', 'Metselwerk, tuintrap', 0);
File diff suppressed because one or more lines are too long
+30
View File
@@ -0,0 +1,30 @@
-- Voegt een "Embedcode / scripts"-veld toe aan de bestaande collectie `paginas`.
-- Doel: de SEO-/cookie-partij kan op een gewone CMS-pagina (bv. /cookieverklaring)
-- een extern script of HTML-embed plakken dat 1-op-1 in de pagina-body wordt geladen
-- en daadwerkelijk DRAAIT. Dit kan NIET via het normale inhoud-veld: PortableText
-- escapet HTML (je ziet de code als tekst), een "Code"-blok toont code bewust als code,
-- en het rauwe htmlBlock filtert <script> eruit (sanitize-html). Dit veld omzeilt dat
-- bewust: de route rendert het via `set:html`, zonder sanitatie. Alleen vertrouwde
-- admins bewerken het CMS, dus dat is verantwoord (WordPress "custom HTML"-patroon).
--
-- `paginas` bestaat al (geseed via de wizard) → ALTER TABLE + nieuwe _emdash_fields-rij,
-- NIET via gen-cms-sql (dat maakt nieuwe tabellen). Toepassen op remote D1:
-- node node_modules/wrangler/bin/wrangler.js d1 execute helvoirt-db --remote --file migrations/0013_paginas_embed.sql
ALTER TABLE "ec_paginas" ADD COLUMN "embed_code" TEXT;
INSERT INTO _emdash_fields
(id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable, widget)
VALUES (
'01KVT537A3104R76DHMAV3WS5G',
(SELECT id FROM _emdash_collections WHERE slug = 'paginas'),
'embed_code',
'Embedcode / scripts (geavanceerd: HTML/JS, bv. cookieverklaring)',
'text',
'TEXT',
0,
8,
0,
0,
'textarea'
);
+38
View File
@@ -0,0 +1,38 @@
-- FIX "Failed to publish" op locatie- en gewone pagina's (collecties `locaties` + `paginas`).
--
-- OORZAAK (deterministisch, geverifieerd): de setup-wizard maakte voor deze twee collecties
-- een FTS5-zoekindex aan als EXTERNE-CONTENT-tabel (`content='ec_locaties'`), met sync-triggers
-- op INSERT/UPDATE/DELETE. De UPDATE-trigger doet `DELETE FROM _emdash_fts_* WHERE rowid=OLD.rowid`.
-- Bij een externe-content FTS5-tabel herberekent die DELETE de oude termen door de bron-tabel te
-- lezen — maar tijdens AFTER UPDATE is die rij AL bijgewerkt, dus de index klopt niet meer en
-- SQLite gooit "database disk image is malformed". De hele UPDATE rolt terug.
--
-- Publiceren roept intern `syncDataColumns` aan = `UPDATE ec_locaties SET <kolommen>` → trigger
-- vuurt → fout → status wordt nooit 'published'. (De /maastricht-pagina staat alleen live omdat
-- die als 'published' is GESEED via een INSERT, dus nooit het UPDATE-pad raakte.) Lokaal 1-op-1
-- gereproduceerd met de exacte trigger-DDL: INSERT lukt, UPDATE faalt.
--
-- FIX: maak deze collecties non-searchable — net als alle ZELF-gegenereerde collecties
-- (over_ons/diensten/homepage/contact_page/voorwaarden), die bewust geen FTS hebben en wél
-- publiceren. We droppen de triggers + de FTS-virtualtabellen (incl. shadow-tabellen) en zetten
-- searchable=0. De frontend gebruikt geen full-text-search (routes halen op via slug); alleen de
-- admin-zoekbalk voor deze twee collecties valt weg. Pure DB-wijziging → geen redeploy nodig.
--
-- Toepassen op remote D1:
-- node node_modules/wrangler/bin/wrangler.js d1 execute helvoirt-db --remote --file migrations/0014_fix_publish_drop_fts.sql
DROP TRIGGER IF EXISTS "_emdash_fts_locaties_insert";
DROP TRIGGER IF EXISTS "_emdash_fts_locaties_update";
DROP TRIGGER IF EXISTS "_emdash_fts_locaties_delete";
DROP TABLE IF EXISTS "_emdash_fts_locaties";
DROP TRIGGER IF EXISTS "_emdash_fts_paginas_insert";
DROP TRIGGER IF EXISTS "_emdash_fts_paginas_update";
DROP TRIGGER IF EXISTS "_emdash_fts_paginas_delete";
DROP TABLE IF EXISTS "_emdash_fts_paginas";
UPDATE _emdash_fields
SET searchable = 0
WHERE collection_id IN (
SELECT id FROM _emdash_collections WHERE slug IN ('locaties', 'paginas')
);
+56
View File
@@ -0,0 +1,56 @@
-- Rijkere opmaak voor locatiepagina's (collectie `locaties`): een optionele hero-foto,
-- 4 vaste content-blokken (kop + alinea + optionele foto, om-en-om getoond) en een
-- aanpasbare CTA-balk. Alles optioneel en door de SEO-partij zelf in te vullen; leeg = wordt
-- niet getoond. Het bestaande veld `content` blijft bestaan en verschuift naar onderaan
-- ("Extra lokale tekst"), zodat bestaande tekst (o.a. /maastricht) niet verloren gaat.
--
-- `locaties` bestaat al (geseed via de wizard) → ALTER TABLE + nieuwe _emdash_fields-rijen,
-- NIET via gen-cms-sql (dat maakt nieuwe tabellen). Veilig dankzij 0014: de kapotte FTS-triggers
-- op ec_locaties zijn weg, dus ALTER/UPDATE op deze tabel werkt nu probleemloos.
-- Toepassen op remote D1:
-- node node_modules/wrangler/bin/wrangler.js d1 execute helvoirt-db --remote --file migrations/0015_locaties_layout.sql
-- ---- 1. Nieuwe kolommen op de content-tabel ----
ALTER TABLE "ec_locaties" ADD COLUMN "hero_image" TEXT;
ALTER TABLE "ec_locaties" ADD COLUMN "blok1_heading" TEXT;
ALTER TABLE "ec_locaties" ADD COLUMN "blok1_text" TEXT;
ALTER TABLE "ec_locaties" ADD COLUMN "blok1_image" TEXT;
ALTER TABLE "ec_locaties" ADD COLUMN "blok2_heading" TEXT;
ALTER TABLE "ec_locaties" ADD COLUMN "blok2_text" TEXT;
ALTER TABLE "ec_locaties" ADD COLUMN "blok2_image" TEXT;
ALTER TABLE "ec_locaties" ADD COLUMN "blok3_heading" TEXT;
ALTER TABLE "ec_locaties" ADD COLUMN "blok3_text" TEXT;
ALTER TABLE "ec_locaties" ADD COLUMN "blok3_image" TEXT;
ALTER TABLE "ec_locaties" ADD COLUMN "blok4_heading" TEXT;
ALTER TABLE "ec_locaties" ADD COLUMN "blok4_text" TEXT;
ALTER TABLE "ec_locaties" ADD COLUMN "blok4_image" TEXT;
ALTER TABLE "ec_locaties" ADD COLUMN "cta_heading" TEXT;
ALTER TABLE "ec_locaties" ADD COLUMN "cta_text" TEXT;
-- ---- 2. Bestaande velden herordenen + `content` herlabelen (schuift naar onderaan) ----
UPDATE _emdash_fields SET sort_order = 18,
label = 'Extra lokale tekst onderaan (optioneel — vrije tekst met koppen/lijsten)'
WHERE collection_id = '01KV7XX3NQG57PFRGRDRB5571M' AND slug = 'content';
UPDATE _emdash_fields SET sort_order = 19 WHERE collection_id = '01KV7XX3NQG57PFRGRDRB5571M' AND slug = 'meta_title';
UPDATE _emdash_fields SET sort_order = 20 WHERE collection_id = '01KV7XX3NQG57PFRGRDRB5571M' AND slug = 'meta_description';
UPDATE _emdash_fields SET sort_order = 21 WHERE collection_id = '01KV7XX3NQG57PFRGRDRB5571M' AND slug = 'canonical';
UPDATE _emdash_fields SET sort_order = 22 WHERE collection_id = '01KV7XX3NQG57PFRGRDRB5571M' AND slug = 'og_image';
UPDATE _emdash_fields SET sort_order = 23 WHERE collection_id = '01KV7XX3NQG57PFRGRDRB5571M' AND slug = 'noindex';
-- ---- 3. Velddefinities voor de nieuwe velden (widget NULL = emdash kiest op type) ----
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable, widget) VALUES
('01KVYY23F7VXW2GD6YJTKQAGXZ', '01KV7XX3NQG57PFRGRDRB5571M', 'hero_image', 'Hero-foto bovenaan (optioneel — leeg = donkere balk zonder foto)', 'image', 'TEXT', 0, 3, 0, 1, NULL),
('01KVYY23F82AW73NMKM3GD1W95', '01KV7XX3NQG57PFRGRDRB5571M', 'blok1_heading', 'Blok 1 · kop', 'string', 'TEXT', 0, 4, 0, 1, NULL),
('01KVYY23F83WB37RTYF78W1YM7', '01KV7XX3NQG57PFRGRDRB5571M', 'blok1_text', 'Blok 1 · tekst (alinea)', 'text', 'TEXT', 0, 5, 0, 1, NULL),
('01KVYY23F8BZNNMG8JZWD9ZYHV', '01KV7XX3NQG57PFRGRDRB5571M', 'blok1_image', 'Blok 1 · foto (optioneel)', 'image', 'TEXT', 0, 6, 0, 1, NULL),
('01KVYY23F819SWRPR7MJPGQWNP', '01KV7XX3NQG57PFRGRDRB5571M', 'blok2_heading', 'Blok 2 · kop', 'string', 'TEXT', 0, 7, 0, 1, NULL),
('01KVYY23F85JM1HRRGHPXNM17Y', '01KV7XX3NQG57PFRGRDRB5571M', 'blok2_text', 'Blok 2 · tekst (alinea)', 'text', 'TEXT', 0, 8, 0, 1, NULL),
('01KVYY23F9ZRMGK2R3YCASMMSC', '01KV7XX3NQG57PFRGRDRB5571M', 'blok2_image', 'Blok 2 · foto (optioneel)', 'image', 'TEXT', 0, 9, 0, 1, NULL),
('01KVYY23F93PJ841HQMT77QM77', '01KV7XX3NQG57PFRGRDRB5571M', 'blok3_heading', 'Blok 3 · kop', 'string', 'TEXT', 0, 10, 0, 1, NULL),
('01KVYY23F9EES7PKTNS6PDQA4F', '01KV7XX3NQG57PFRGRDRB5571M', 'blok3_text', 'Blok 3 · tekst (alinea)', 'text', 'TEXT', 0, 11, 0, 1, NULL),
('01KVYY23F9ES6G9CKCHC1J66MB', '01KV7XX3NQG57PFRGRDRB5571M', 'blok3_image', 'Blok 3 · foto (optioneel)', 'image', 'TEXT', 0, 12, 0, 1, NULL),
('01KVYY23F9AAY29MV7JSBE02DF', '01KV7XX3NQG57PFRGRDRB5571M', 'blok4_heading', 'Blok 4 · kop', 'string', 'TEXT', 0, 13, 0, 1, NULL),
('01KVYY23F93FQBK8XJVY34T59D', '01KV7XX3NQG57PFRGRDRB5571M', 'blok4_text', 'Blok 4 · tekst (alinea)', 'text', 'TEXT', 0, 14, 0, 1, NULL),
('01KVYY23F9FCECQYJJA1XDEJN3', '01KV7XX3NQG57PFRGRDRB5571M', 'blok4_image', 'Blok 4 · foto (optioneel)', 'image', 'TEXT', 0, 15, 0, 1, NULL),
('01KVYY23F98SHEN873B4GJMM0A', '01KV7XX3NQG57PFRGRDRB5571M', 'cta_heading', 'CTA-balk · kop (optioneel — blauwe oproepbalk)', 'string', 'TEXT', 0, 16, 0, 1, NULL),
('01KVYY23F9D7QBQPF0PQRC54MZ', '01KV7XX3NQG57PFRGRDRB5571M', 'cta_text', 'CTA-balk · tekst (optioneel)', 'text', 'TEXT', 0, 17, 0, 1, NULL);
@@ -0,0 +1,23 @@
-- Fix de "Bekijk"-link (en auto-redirects) in de CMS-admin.
--
-- Probleem: emdash bouwt de publieke URL van een item standaard als `/{collectie}/{slug}`
-- (bv. /locaties/maastricht). Onze locatie- en gewone pagina's draaien echter op de ROOT
-- (`/maastricht`, /<slug>) via src/pages/[...slug].astro. Daardoor wees het "Bekijk"-oogje
-- naar een 404-URL.
--
-- emdash heeft per collectie een `url_pattern` met {slug}-placeholder (registry leest
-- `row.url_pattern`; leeg = de `/{collectie}/{slug}`-fallback). We zetten het juiste patroon
-- per collectie zodat de admin-link én redirect-generatie (bij slug-wijziging) kloppen.
-- Pure D1-wijziging: de manifest-API leest dit live → werkt na een herlaad van de admin,
-- geen redeploy nodig. De publieke routing zelf gebruikt url_pattern niet (eigen Astro-routes).
--
-- Toepassen op remote D1:
-- node node_modules/wrangler/bin/wrangler.js d1 execute helvoirt-db --remote --file migrations/0016_collection_url_patterns.sql
UPDATE _emdash_collections SET url_pattern = '/{slug}' WHERE slug = 'locaties';
UPDATE _emdash_collections SET url_pattern = '/{slug}' WHERE slug = 'paginas';
UPDATE _emdash_collections SET url_pattern = '/diensten/{slug}' WHERE slug = 'diensten';
UPDATE _emdash_collections SET url_pattern = '/' WHERE slug = 'homepage';
UPDATE _emdash_collections SET url_pattern = '/over-ons' WHERE slug = 'over_ons';
UPDATE _emdash_collections SET url_pattern = '/contact' WHERE slug = 'contact_page';
UPDATE _emdash_collections SET url_pattern = '/voorwaarden' WHERE slug = 'voorwaarden';
@@ -0,0 +1,15 @@
-- Verwijder het veld "Extra lokale tekst onderaan" (slug `content`) van de collectie
-- `locaties` — op klantverzoek (de locatiepagina's gebruiken de 4 blokken voor de inhoud;
-- het losse tekstveld gaf onderaan een lege grijze balk en is overbodig).
--
-- Alleen de VELDDEFINITIE wordt verwijderd (admin toont het veld dan niet meer). De KOLOM
-- `ec_locaties.content` laten we staan (data-behoud; ongebruikt, geen risico, en SQLite/D1
-- DROP COLUMN is rommelig). De frontend rendert het al niet meer (zie [...slug].astro).
-- Géén wijziging aan de collectie `paginas` — gewone pagina's houden hun inhoud-veld.
--
-- Toepassen op remote D1:
-- node node_modules/wrangler/bin/wrangler.js d1 execute helvoirt-db --remote --file migrations/0017_locaties_remove_content.sql
DELETE FROM _emdash_fields
WHERE slug = 'content'
AND collection_id = (SELECT id FROM _emdash_collections WHERE slug = 'locaties');
+13
View File
@@ -0,0 +1,13 @@
-- Verwijder de CTA-balk-velden (slug `cta_heading`, `cta_text`) van de collectie `locaties`.
-- Op klantverzoek: de blauwe "Klaar om je gevel in {plaats} ..."-balk is van de locatiepagina's
-- gehaald (er staat direct daaronder al het offerteformulier, dus de balk was dubbelop).
--
-- Alleen de velddefinities weg (admin toont ze niet meer); kolommen blijven staan (data-behoud,
-- ongebruikt). De frontend rendert de balk al niet meer (zie [...slug].astro).
--
-- Toepassen op remote D1:
-- node node_modules/wrangler/bin/wrangler.js d1 execute helvoirt-db --remote --file migrations/0018_locaties_remove_cta.sql
DELETE FROM _emdash_fields
WHERE slug IN ('cta_heading', 'cta_text')
AND collection_id = (SELECT id FROM _emdash_collections WHERE slug = 'locaties');
@@ -0,0 +1,28 @@
-- Maak de 4 content-blokken op locatiepagina's RICH TEXT (PortableText): kop blijft een los
-- veld, maar 'Blok N - tekst' wordt een editor met opsommingen (lijsten), interne links, vet etc.
-- Klantverzoek: opsommingen/stappen + interne linkstructuur waren niet mogelijk in het platte
-- tekstveld. De admin-PortableTextEditor heeft een toolbar (links, bullet/genummerde lijsten);
-- de frontend rendert via <PortableText> (astro-portabletext) als <ul>/<ol>/<a>, met .prose-opmaak.
--
-- Bestaande platte tekst wordt hieronder omgezet naar PortableText (paragrafen op lege regels,
-- '- ' -> bullets, 'N. ' -> genummerde lijst, <a href> -> echte links). Daarna verandert het
-- veldtype text->portableText (column_type JSON). Pure D1; geen FTS-triggers (al weg in 0014).
-- node node_modules/wrangler/bin/wrangler.js d1 execute helvoirt-db --remote --file migrations/0019_locaties_blocks_portabletext.sql
UPDATE ec_locaties SET blok1_text = '[{"_type":"block","_key":"k1ecd3","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"k0sp7x","text":"Korte lijnen, vakwerk en een eerlijke prijs vooraf. We komen langs, denken mee en leveren werk waar je trots op bent, voor particulieren en bedrijven.","marks":[]}]}]' WHERE id = '01KV7XX5TWF8EAJ7DX0HGSKVC0';
UPDATE ec_locaties SET blok2_text = '[{"_type":"block","_key":"k3maii","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"k2th3t","text":"Gevelreiniging en renovatie, voegwerkzaamheden, dak reinigen en coaten, schoorsteen-voegwerk en algemeen reinigen van terras, oprit en bestrating.","marks":[]}]}]' WHERE id = '01KV7XX5TWF8EAJ7DX0HGSKVC0';
UPDATE ec_locaties SET blok1_text = '[{"_type":"block","_key":"k5o2lj","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"k4zsf3","text":"Korte lijnen, vakwerk en een eerlijke prijs vooraf. We komen langs, denken mee en leveren werk waar je trots op bent, voor particulieren en bedrijven.","marks":[]}]}]' WHERE id = '01KVZ43P5KXEAH5E7045YTGRTY';
UPDATE ec_locaties SET blok2_text = '[{"_type":"block","_key":"k7gf3p","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"k6xg4f","text":"Gevelreiniging en renovatie, voegwerkzaamheden, dak reinigen en coaten, schoorsteen-voegwerk en algemeen reinigen van terras, oprit en bestrating.","marks":[]}]}]' WHERE id = '01KVZ43P5KXEAH5E7045YTGRTY';
UPDATE ec_locaties SET blok1_text = '[{"_type":"block","_key":"k9z6yv","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"k84jja","text":"Korte lijnen, vakwerk en een eerlijke prijs vooraf. We komen langs, denken mee en leveren werk waar je trots op bent, voor particulieren en bedrijven.","marks":[]}]}]' WHERE id = '01KVZ4Y19XZ0M45HAW9Q7000P0';
UPDATE ec_locaties SET blok2_text = '[{"_type":"block","_key":"kb5127","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"kawyeo","text":"Gevelreiniging en renovatie, voegwerkzaamheden, dak reinigen en coaten, schoorsteen-voegwerk en algemeen reinigen van terras, oprit en bestrating.","marks":[]}]}]' WHERE id = '01KVZ4Y19XZ0M45HAW9Q7000P0';
UPDATE ec_locaties SET blok1_text = '[{"_type":"block","_key":"kdbn5z","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"kcw54e","text":"Korte lijnen, vakwerk en een eerlijke prijs vooraf. We komen langs, denken mee en leveren werk waar je trots op bent, voor particulieren en bedrijven.","marks":[]}]}]' WHERE id = '01KVZ5F8E95181DHV3Y9ZPN0YJ';
UPDATE ec_locaties SET blok2_text = '[{"_type":"block","_key":"kf95pu","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"ke1aj8","text":"Gevelreiniging en renovatie, voegwerkzaamheden, dak reinigen en coaten, schoorsteen-voegwerk en algemeen reinigen van terras, oprit en bestrating.","marks":[]}]}]' WHERE id = '01KVZ5F8E95181DHV3Y9ZPN0YJ';
UPDATE ec_locaties SET blok1_text = '[{"_type":"block","_key":"kkdjh3","style":"normal","markDefs":[{"_type":"link","_key":"khz58n","href":"https://helvoirtgevelreiniging.nl/diensten/voegwerk"}],"children":[{"_type":"span","_key":"kgoxzo","text":"Een vieze of beschadigde gevel lijkt misschien vooral een kwestie van uitstraling, maar er speelt vaak meer. Aanslag, mos, algen en oud ","marks":[]},{"_type":"span","_key":"kip69q","text":"voegwerk ","marks":["khz58n"]},{"_type":"span","_key":"kjjcmy","text":" houden vocht vast. Daardoor kunnen stenen, voegen en andere delen van de buitenkant langzaam achteruitgaan. Met goede gevelrenovatie in Limburg zorg je dus niet alleen voor een frisser huis of bedrijfspand, maar ook voor bescherming op de lange termijn.","marks":[]}]},{"_type":"block","_key":"km15yo","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"klpxy6","text":"Helvoirt Gevelreiniging kiest altijd de aanpak die past bij jouw gevel. Niet iedere steen kan dezelfde behandeling hebben en niet iedere vervuiling vraagt om dezelfde methode. Soms is voorzichtig reinigen genoeg, soms moet beschadigd voegwerk worden hersteld en soms is impregneren een slimme extra stap. We kijken naar de staat van de gevel, geven eerlijk advies en zorgen dat je vooraf weet waar je aan toe bent. Als ervaren voegbedrijf in Limburg maken we de buitenkant weer strak, schoon en stevig. We werken netjes, dekken goed af en laten alles opgeruimd achter. Zo krijg je geen half werk, maar een gevel die er verzorgd bij staat en weer jaren mee kan.","marks":[]}]}]' WHERE id = '01KVZA95S478DQP136TRQKA3M8';
UPDATE ec_locaties SET blok2_text = '[{"_type":"block","_key":"koeica","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"knchaf","text":"Geen pand is hetzelfde. De ene gevel heeft vooral een goede reiniging nodig, terwijl bij de andere gevel het voegwerk aan vervanging toe is. Daarom bieden we meerdere diensten aan voor de hele buitenkant van je woning of bedrijfspand. Als voegersbedrijf in Limburg kunnen we zowel kleine herstelklussen als complete renovaties uitvoeren.","marks":[]}]},{"_type":"block","_key":"kqgc6e","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"kpveqi","text":"We helpen onder andere met:","marks":[]}]},{"_type":"block","_key":"ksiq6d","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"krwcoh","text":"gevelreiniging en gevelherstel;","marks":[]}],"listItem":"bullet","level":1},{"_type":"block","_key":"ku5tj6","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"kt5ujl","text":"oud voegwerk uithakken en opnieuw invoegen;","marks":[]}],"listItem":"bullet","level":1},{"_type":"block","_key":"kwp05e","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"kvz15t","text":"schoorsteen voegwerk, metselwerk en loodwerk;","marks":[]}],"listItem":"bullet","level":1},{"_type":"block","_key":"kyngae","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"kxlls4","text":"dak reinigen en coaten;","marks":[]}],"listItem":"bullet","level":1},{"_type":"block","_key":"k10hm2i","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"kzklr2","text":"terras, oprit en bestrating reinigen;","marks":[]}],"listItem":"bullet","level":1},{"_type":"block","_key":"k12l7ut","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"k11a9sb","text":"impregneren tegen nieuwe vervuiling en vocht.","marks":[]}],"listItem":"bullet","level":1},{"_type":"block","_key":"k141vrc","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"k13855v","text":"Goed voegwerk in Limburg is belangrijker dan veel mensen denken. Beschadigde of poreuze voegen laten sneller vocht door en maken de gevel kwetsbaarder. Door kapotte voegen op tijd te vervangen, voorkom je verdere schade en blijft je gevel netjes en waterdicht. Ook bij schoorstenen is goed onderhoud belangrijk. Loszittende voegen, slecht loodwerk of kleine scheuren kunnen lekkage veroorzaken. We bekijken wat er nodig is, herstellen waar nodig en zorgen dat het geheel weer stevig en verzorgd is. Zo heb je één vakman voor meerdere werkzaamheden aan de buitenkant.","marks":[]}]}]' WHERE id = '01KVZA95S478DQP136TRQKA3M8';
UPDATE ec_locaties SET blok3_text = '[{"_type":"block","_key":"k16niao","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"k15kqrl","text":"Klanten kiezen voor Helvoirt Gevelreiniging omdat we duidelijk, eerlijk en vakkundig werken. Onze voegers in Limburg kennen de materialen, weten welke methode bij welke gevel past en denken met je mee. Je krijgt geen standaardoplossing, maar een aanpak die klopt bij jouw woning, bedrijfspand en situatie.","marks":[]}]},{"_type":"block","_key":"k18s6j0","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"k17qih1","text":"We houden het proces graag overzichtelijk:","marks":[]}]},{"_type":"block","_key":"k1a5mk9","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"k195mve","text":"Inspectie en advies We bekijken de gevel, schoorsteen, het dak of de bestrating en letten op vervuiling, schade en de staat van het voegwerk.","marks":[]}],"listItem":"number","level":1},{"_type":"block","_key":"k1cimyt","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"k1bakgq","text":"Duidelijke offerte Je ontvangt een heldere prijs vooraf. Geen verrassingen achteraf en geen onduidelijke afspraken.","marks":[]}],"listItem":"number","level":1},{"_type":"block","_key":"k1efs2l","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"k1dlepn","text":"Werk op maat Bij gevel voegen in Limburg verwijderen we oud of beschadigd voegwerk zorgvuldig en brengen we nieuw voegwerk strak aan. Bij reiniging kiezen we een methode die schoonmaakt zonder onnodige schade aan de steen.","marks":[]}],"listItem":"number","level":1},{"_type":"block","_key":"k1g7wc2","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"k1fwakj","text":"Netjes opleveren We spoelen na, ruimen op en lopen het werk samen met je na. Pas als alles netjes is, zijn wij klaar.","marks":[]}],"listItem":"number","level":1},{"_type":"block","_key":"k1irfve","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"k1hb7qy","text":"Die manier van werken past bij wie we zijn: lokaal, betrokken en praktisch. We komen langs, kijken goed, geven eerlijk advies en doen wat we beloven. Of het nu gaat om een complete gevelrenovatie, een schoorsteen die aandacht nodig heeft of alleen herstel van een paar slechte voegen, je krijgt altijd vakwerk.","marks":[]}]}]' WHERE id = '01KVZA95S478DQP136TRQKA3M8';
UPDATE ec_locaties SET blok4_text = '[{"_type":"block","_key":"k1k80xx","style":"normal","markDefs":[],"children":[{"_type":"span","_key":"k1j28iw","text":"Wil je jouw gevel laten reinigen, voegen laten herstellen of de buitenkant van je pand weer netjes laten maken? Neem dan contact op met ons voor gevelrenovatie in Limburg. We denken graag met je mee en plannen een moment om de situatie te bekijken. Ook wanneer je zoekt naar een eerlijk en ervaren voegbedrijf in Limburg, helpen we je graag verder. Je kunt telefonisch contact opnemen, een mail sturen of het contactformulier op de website invullen. Daarna ontvang je een duidelijke, vrijblijvende offerte, zodat je precies weet waar je aan toe bent.","marks":[]}]}]' WHERE id = '01KVZA95S478DQP136TRQKA3M8';
-- Veldtype text -> portableText (admin toont nu de rich-text editor; loader leest JSON).
UPDATE _emdash_fields SET type = 'portableText', column_type = 'JSON'
WHERE collection_id = (SELECT id FROM _emdash_collections WHERE slug = 'locaties')
AND slug IN ('blok1_text', 'blok2_text', 'blok3_text', 'blok4_text');
+29
View File
@@ -0,0 +1,29 @@
-- 2 content-blokken (kop + rich-text + optionele foto) op de dienst-detailpagina's
-- (/diensten/<slug>), ONDER de eerste alinea ("Wat we voor je doen"-sectie) en BOVEN de
-- resultaat-galerij. Zelfde opzet als blok 1/2 op locatiepagina's: PortableText-editor met
-- volledige opmaak (links, lijsten, vet), foto optioneel, om-en-om (zig-zag). Blok leeg =
-- niet getoond. Bedoeld voor extra content op de Google Ads-landingspagina's.
--
-- `ec_diensten` bestaat al (0009) -> ALTER TABLE + nieuwe _emdash_fields-rijen. De velden
-- komen in het admin-formulier net na "included" (sort_order 16-21); de bestaande velden
-- vanaf resultaat schuiven 6 op. Toepassen op remote D1:
-- node node_modules/wrangler/bin/wrangler.js d1 execute helvoirt-db --remote --file migrations/0020_diensten_blocks.sql
ALTER TABLE "ec_diensten" ADD COLUMN "blok1_heading" TEXT;
ALTER TABLE "ec_diensten" ADD COLUMN "blok1_text" TEXT;
ALTER TABLE "ec_diensten" ADD COLUMN "blok1_image" TEXT;
ALTER TABLE "ec_diensten" ADD COLUMN "blok2_heading" TEXT;
ALTER TABLE "ec_diensten" ADD COLUMN "blok2_text" TEXT;
ALTER TABLE "ec_diensten" ADD COLUMN "blok2_image" TEXT;
-- maak ruimte: schuif resultaat/aanpak/faq/seo 6 plekken op.
UPDATE _emdash_fields SET sort_order = sort_order + 6
WHERE collection_id = '01KVA99538R5JTKEVHDYN32XD3' AND sort_order >= 16;
INSERT INTO _emdash_fields (id, collection_id, slug, label, type, column_type, required, sort_order, searchable, translatable, widget) VALUES
('01KVZHZNC600G5M8DF1PZ2G3FB', '01KVA99538R5JTKEVHDYN32XD3', 'blok1_heading', 'Blok 1 · kop (optioneel)', 'string', 'TEXT', 0, 16, 0, 1, NULL),
('01KVZHZNC8TCCFMSYP0N4G3X8X', '01KVA99538R5JTKEVHDYN32XD3', 'blok1_text', 'Blok 1 · tekst (alinea)', 'portableText', 'JSON', 0, 17, 0, 1, NULL),
('01KVZHZNC8KKJAKEYHE2WZ3QKY', '01KVA99538R5JTKEVHDYN32XD3', 'blok1_image', 'Blok 1 · foto (optioneel)', 'image', 'TEXT', 0, 18, 0, 1, NULL),
('01KVZHZNC8202T54FVCTBKPSGX', '01KVA99538R5JTKEVHDYN32XD3', 'blok2_heading', 'Blok 2 · kop (optioneel)', 'string', 'TEXT', 0, 19, 0, 1, NULL),
('01KVZHZNC8N41RA1FNQQHJ5FFD', '01KVA99538R5JTKEVHDYN32XD3', 'blok2_text', 'Blok 2 · tekst (alinea)', 'portableText', 'JSON', 0, 20, 0, 1, NULL),
('01KVZHZNC87ZXZH0DWZ0TQ9C11', '01KVA99538R5JTKEVHDYN32XD3', 'blok2_image', 'Blok 2 · foto (optioneel)', 'image', 'TEXT', 0, 21, 0, 1, NULL);