Migrations 0020/0021/0022 converted textarea columns to jsonb with USING NULL,
discarding all existing content. Restore values from the 2026-06-10 pre-webp
backup, wrapped as Lexical editor state. Idempotent (IS NULL guard). Three
birthday package items created after the backup got new placeholder copy.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0021 failed on dinosaur_page_why_visit_items, dyvolis_page_why_visit_items,
locations_why_visit_items because those columns had NOT NULL constraints
(from Payload required: true). Drop constraint first, then change type to jsonb.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Covers: group_visits_page, dinosaur_page, dyvolis_page, tickets_page, home_page,
birthday_page, locations, legal_pages child tables and their _v version tables.
All blocks are idempotent (check data_type IN varchar/text before altering).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Change heroDescription, featureText, bottomText fields from textarea to richText (Lexical)
in GroupVisitsPage global so admins can format paragraphs and bold text in admin UI
- Render rich text fields with <RichText> component on the frontend
- Migration: ALTER varchar → jsonb for the three fields; UPDATE header cta_href and
birthday_page_pricing_packages cta_href from /kvytky to /payments
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Move hero title plate to the bottom of the photo so faces stay visible
- Admin can now set hero title/subtitle size (px) and font
(Montserrat/Poppins/Inter); mobile scales via clamp()
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Add checkbox field to control whether a location card appears on /lokatsii.
Default true so existing entries remain visible. Filter added to getLocations query.
Migration 20260610_140000 adds show_on_lokatsii boolean column with DEFAULT true.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Header: strip hostname from Payload media URL in resolveLogoUrl (was showing IP)
- DyvoLisTickets: prefer 'dyvolis' category over 'dyno' for single tickets
- DyvoLisWhyVisit: narrow accordion (628→480px), remove video max-w cap
- migration 0017: seed 3 extra birthday package items (rows 4-6) so CMS block is editable
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ALTER TABLE home_page + _home_page_v to add the new varchar column
for the Google review URL field added to sectionTitles group.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace text src/poster in whyVideos with media upload pickers so
admins can upload video files directly from the CMS instead of
entering raw URLs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Admins can now upload custom pattern images for green and orange
pricing cards via Home Page → День народження → Паттерн зелених/оранжевої карток.
Falls back to static /images/figma/card-pattern-*.png if not set.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add missing version_faq_title column to _home_page_v and create
_home_page_v_version_faq_items table; Payload versions: {max:20}
requires both the main table and the versions table to be in sync.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add FAQ accordion section (FAQ.tsx) after Reviews on home page
- Add faq group field to HomePage global (title + items array)
- Add HomePageFaq types to types/globals.ts
- Seed whyParents.items with 6 items from static fallback texts
- Seed faq with 6 Q&A items about the park
- Migration 0012: create home_page_faq_items table for Payload array field
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sub-table for the tariffCategoryLabels array field added to SiteSettings
global. Was missing from prod DB causing query failures on every page load.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Extracts forms + form_submissions schema from TS migrations into
idempotent SQL so Dockerfile.migrator can apply it on production.
Also updates generated payload-types after form-builder plugin.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Tables group_visits_page, birthday_page and their _v counterparts were missing from the DB
despite prior migrations being marked applied. The updated migration uses CREATE TABLE IF NOT EXISTS,
DO/EXCEPTION blocks for enum types and FK constraints, and ADD COLUMN IF NOT EXISTS to recover
the full schema before adding form_id relationship columns.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Creates forms, form_submissions and all related block tables for the @payloadcms/plugin-form-builder integration.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Inserts the ДивоЛіс location into locations table with showDetailPage=true
plus heroTips and whyVisitItems child records. Idempotent (ON CONFLICT/DELETE+INSERT).
Run by the psql migrator on next deploy.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- migrations/0002_delta.sql: idempotent SQL extracted from 20260515_162527.ts
(redirects table, locations detail fields, globals versioning, new pages)
so the psql migrator container applies it on next deploy
- Dockerfile: ARG/ENV NEXT_PUBLIC_SITE_URL in builder stage so the URL is
baked into the Next.js bundle (fixes postMessage origin warning in admin)
- docker-compose.prod.yml: pass build arg NEXT_PUBLIC_SITE_URL=https://shumi.ai-impress.com
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix ZodError: EZY API returns params=null, use .nullish() instead of .optional()
- Add manual SQL migration for new collections (locations, reviews,
birthday_packages) and schema changes (header ctaLabel/ctaHref,
navLinks autoChildrenFrom/children, homepage sectionTitles/whyParents/
gallery/video/birthdayIntro groups)
- Note: push:true doesn't run CLI drizzle-kit in standalone build;
run migrations/0001_new_collections.sql manually on new environments
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>