ab78c84296
The CMS engine is now consumed from openbureau-core instead of this repo's own copy. cms/core = openbureau-core (subtree of its main). docker-compose builds the cms image from ./core (core's own Dockerfile → core/admin + core/api), and a new cms/openbureau.config.js (CMS_CONFIG) tells the generic engine this site's content model + plugins (dialog). Old vendored cms/api + cms/admin removed. Behaviour-preserving: core's admin/src is byte-identical to the old one, and core's API was live-verified byte-identical against the running stack. Schema stays owned by the stack's migrate service (db/schema.sql incl. dialog tables); DATABASE_URL left unset so core's plugin migration runner is a no-op here. Update core later with `git subtree pull --prefix=cms/core <core> main --squash`. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
76 lines
2.8 KiB
JavaScript
76 lines
2.8 KiB
JavaScript
// openbureau site config — what this site's content model + plugins are.
|
|
// Consumed by openbureau-core (vendored at cms/core) via CMS_CONFIG. Reproduces
|
|
// the previously hard-coded content model 1:1 (proven by core's collections test).
|
|
export default {
|
|
site: 'openbureau',
|
|
auth: 'supabase', // GoTrue/Supabase login (the stack provides it); core default
|
|
admins: ['karim@gabrielevarano.ch'],
|
|
plugins: ['dialog'], // comment/forum subsystem (library ↔ threads sync)
|
|
|
|
collections: [
|
|
{
|
|
kind: 'beitrag', label: 'Beiträge', order: 0,
|
|
path: 'archiv/:section/:slug',
|
|
sections: ['buerofuehrung', 'software', 'theorie'],
|
|
statKey: 'beitraege',
|
|
draftStatKey: 'entwuerfe', // Beitrag-Entwürfe als eigener Zähler (Dashboard)
|
|
fields: [
|
|
{ name: 'title', type: 'string', required: true },
|
|
{ name: 'section', type: 'select', options: ['buerofuehrung', 'software', 'theorie'] },
|
|
{ name: 'slug', type: 'slug' },
|
|
{ name: 'date', type: 'date' },
|
|
{ name: 'weight', type: 'number' },
|
|
{ name: 'color', type: 'string' },
|
|
{ name: 'layout', type: 'select', options: ['text'], default: 'text' },
|
|
{ name: 'tags', type: 'list' },
|
|
{ name: 'summary', type: 'text' },
|
|
{ name: 'cover_image', type: 'image' },
|
|
{ name: 'authors', type: 'list' },
|
|
{ name: 'toc', type: 'bool' },
|
|
{ name: 'draft', type: 'bool', default: true },
|
|
{ name: 'body', type: 'markdown' },
|
|
],
|
|
},
|
|
{
|
|
kind: 'biblio', label: 'Library', order: 1,
|
|
path: 'library/:slug',
|
|
statKey: 'library',
|
|
fields: [
|
|
{ name: 'title', type: 'string', required: true },
|
|
{ name: 'slug', type: 'slug' },
|
|
{ name: 'date', type: 'date' },
|
|
{ name: 'tags', type: 'list' },
|
|
{ name: 'summary', type: 'text' },
|
|
{ name: 'cover_image', type: 'image' },
|
|
{ name: 'external', type: 'string' },
|
|
{ name: 'group', type: 'string' },
|
|
{ name: 'authors', type: 'list' },
|
|
{ name: 'draft', type: 'bool', default: true },
|
|
{ name: 'body', type: 'markdown' },
|
|
],
|
|
},
|
|
{
|
|
kind: 'rubrik', label: 'Rubriken', order: 3, index: true,
|
|
statKey: 'rubriken',
|
|
fields: [
|
|
{ name: 'title', type: 'string', required: true },
|
|
{ name: 'color', type: 'string' },
|
|
{ name: 'layout', type: 'string' },
|
|
{ name: 'weight', type: 'number' },
|
|
{ name: 'body', type: 'markdown' },
|
|
],
|
|
},
|
|
{
|
|
kind: 'seite', label: 'Seiten', order: 2, fallback: true,
|
|
statKey: 'seiten',
|
|
fields: [
|
|
{ name: 'title', type: 'string', required: true },
|
|
{ name: 'layout', type: 'string' },
|
|
{ name: 'toc', type: 'bool' },
|
|
{ name: 'draft', type: 'bool', default: true },
|
|
{ name: 'body', type: 'markdown' },
|
|
],
|
|
},
|
|
],
|
|
};
|