Payload Global configs mirroring proto/src/content/types.ts:
- src/globals/{Home,About,Services,Contact,Common}.ts
- src/globals/fields/stringArray.ts — shared helper: Payload has no
native string[] field, so every plain string array from the old
content types (trustBullets, paragraphs, features, spec items, …)
becomes an array of one-field { value } objects.
- home.partners is intentionally NOT included — that becomes its own
Partners collection (logo -> Media upload) in MITHOME-89, to avoid
two disagreeing sources for the same data.
- contact.form.fields.gdpr.label stays a plain textarea (not lexical
richText): the JSON source is a hand-written HTML string with an
<a> tag; richText's node-tree serialization would need its own
migration/render logic, out of scope for this bootstrap pass.
scripts/migrate-content-to-payload.ts: one-shot, idempotent Local API
migration reading the existing JSON files and calling updateGlobal —
does not touch or delete the JSON files. Run via the new
`npm run migrate:content` script.
Registered the five Globals in payload.config.ts.
Also included here (belongs with the previous "resolve double-root-
layout conflict" commit but didn't actually get staged there —
verified only now by diffing HEAD against the working tree):
(frontend)/layout.tsx's relative imports corrected to ../../ instead
of ../ (one directory deeper than the original src/app/layout.tsx).
Verified:
- npm run build / lint, tsc --noEmit, npm test (58 passed) all clean
- npm run migrate:content against the real dev MongoDB container,
then read back via payload.findGlobal() — hero.title, trustBullets,
services.items[0].features, footer.address, faq.items.length all
match the JSON source
- Real browser: logged into /admin, opened the Home global editor —
Hero/Trust bullets group renders and shows the migrated Hungarian
content correctly (see screenshot shared in chat)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
106 lines
3.2 KiB
TypeScript
106 lines
3.2 KiB
TypeScript
import type { GlobalConfig } from 'payload'
|
|
|
|
import { stringArrayField } from './fields/stringArray'
|
|
|
|
/**
|
|
* Mirrors HomePageContent (proto/src/content/types.ts) — MITHOME-87.
|
|
*
|
|
* WHY nincs `partners` mező: a home.partners.items a JSON-ban ma egy
|
|
* beágyazott lista, de a Payload oldalon önálló `Partners` collection lesz
|
|
* (logó = Media upload reference) — lásd MITHOME-89. Itt szándékosan
|
|
* kihagyjuk, nehogy két, egymásnak ellentmondó forrás legyen.
|
|
*/
|
|
export const Home: GlobalConfig = {
|
|
slug: 'home',
|
|
admin: {
|
|
group: 'Oldalak',
|
|
},
|
|
fields: [
|
|
{
|
|
name: 'hero',
|
|
type: 'group',
|
|
fields: [
|
|
{ name: 'title', type: 'text', required: true },
|
|
{ name: 'subtitle', type: 'text', required: true },
|
|
{ name: 'description', type: 'textarea', required: true },
|
|
stringArrayField('trustBullets', 'Trust bullets'),
|
|
{
|
|
name: 'cta',
|
|
type: 'group',
|
|
fields: [
|
|
{
|
|
name: 'primary',
|
|
type: 'group',
|
|
fields: [
|
|
{ name: 'text', type: 'text', required: true },
|
|
{ name: 'href', type: 'text', required: true },
|
|
{ name: 'external', type: 'checkbox', defaultValue: false },
|
|
],
|
|
},
|
|
{
|
|
name: 'secondary',
|
|
type: 'group',
|
|
fields: [
|
|
{ name: 'text', type: 'text', required: true },
|
|
{ name: 'href', type: 'text', required: true },
|
|
{ name: 'external', type: 'checkbox', defaultValue: false },
|
|
],
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'about',
|
|
type: 'group',
|
|
fields: [
|
|
{ name: 'title', type: 'text', required: true },
|
|
{
|
|
name: 'usps',
|
|
type: 'array',
|
|
fields: [
|
|
{ name: 'id', type: 'text', required: true },
|
|
{ name: 'title', type: 'text', required: true },
|
|
{ name: 'description', type: 'textarea', required: true },
|
|
{ name: 'icon', type: 'text', required: true },
|
|
],
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'services',
|
|
type: 'group',
|
|
fields: [
|
|
{ name: 'title', type: 'text', required: true },
|
|
{ name: 'subtitle', type: 'text', required: true },
|
|
{
|
|
name: 'items',
|
|
type: 'array',
|
|
fields: [
|
|
{ name: 'id', type: 'text', required: true },
|
|
{ name: 'title', type: 'text', required: true },
|
|
{ name: 'description', type: 'textarea', required: true },
|
|
{ name: 'icon', type: 'text', required: true },
|
|
stringArrayField('features', 'Features'),
|
|
{ name: 'ctaText', type: 'text', required: true },
|
|
],
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'cta',
|
|
type: 'group',
|
|
fields: [
|
|
{ name: 'title', type: 'text', required: true },
|
|
{ name: 'subtitle', type: 'textarea', required: true },
|
|
{ name: 'button', type: 'text', required: true },
|
|
],
|
|
},
|
|
{
|
|
name: 'serviceFeatures',
|
|
type: 'group',
|
|
fields: [{ name: 'title', type: 'text', required: true }],
|
|
},
|
|
],
|
|
}
|