Static CMS v2.0 (#226)

- [x] Update auf Static CMS v2.0
- [x] aktualisierte Shortcodes (schließt #225)
- [x] aktualisierte Previews (schließt #181)
- Ordnerunterstützung
- [x] vervollständigte Seiten
- [x] Aufräumarbeiten

Reviewed-on: https://git.cantorgymnasium.de/gcg/gcg-website/pulls/226
This commit is contained in:
2023-04-19 22:44:06 +02:00
parent fbcb423480
commit a275283b6e
316 changed files with 2832 additions and 1978 deletions

View File

@ -19,13 +19,15 @@ site_url: https://cantorgymnasium.de
display_url: https://cantorgymnasium.de
locale: "de"
media_library:
max_file_size: 2048000
folder_support: true
slug:
encoding: "ascii"
clean_accents: true
sanitize_replacement: "-"
show_preview_links: false
collections:
- name: "config"
icon: "settings"
@ -33,15 +35,10 @@ collections:
description: "Hier können die Basiseinstellungen der Website geändert werden."
editor:
preview: false
media_folder: "/static/media"
public_folder: "/media"
files:
- name: "homepage-config"
label: "Startseitenkonfiguration"
file: "data/de/homepage.yml"
media_folder: "/static/media/home"
public_folder: "/media/home"
format: yml
fields:
- label: "Banner"
name: "top_banner"
@ -66,7 +63,7 @@ collections:
collapsed: true
fields:
- {label: "Aktivieren", name: "enable", widget: "boolean", required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "image", required: false, media_library: { config: { max_file_size: 2048000 } } }
- {label: "Hintergrundbild", name: "bg_image", widget: "image", required: false }
- {label: "Titel", name: "title", widget: "string", required: false}
- label: "Elemente"
label_singular: "Element"
@ -95,7 +92,7 @@ collections:
fields:
- {label: "Titel", name: "title", widget: "string", required: false}
- {label: "Link", name: "link", widget: "string", required: false}
- {label: "Grafik", name: "image", widget: "image", required: true, media_folder: "/static/media/logos", public_folder: "/media/logos"}
- {label: "Grafik", name: "image", widget: "image", required: true}
- label: "\"Über\"-Seite"
name: "about"
widget: "object"
@ -124,14 +121,14 @@ collections:
collapsed: true
fields:
- {label: "Aktivieren", name: "enable", widget: "boolean", required: false}
- {label: "Bild", name: "image", widget: "image", required: false, media_library: { config: { max_file_size: 2048000 } } }
- {label: "Bild", name: "image", widget: "image", required: false }
- label: "Elemente"
name: "feature_item"
widget: "list"
fields:
- {label: "Bezeichnung", name: "name", widget: "string", required: false}
- {label: "Symbol", name: "icon", widget: "string", required: false, hint: "Liste unter https://pictogrammers.com/library/mdi/"}
- {label: "Bild", name: "image", widget: "image", required: false, media_library: { config: { max_file_size: 2048000 } } }
- {label: "Bild", name: "image", widget: "image", required: false }
- {label: "Inhalt", name: "content", widget: "markdown", required: false}
- label: "Ganztagsangebote"
name: "ganztagsangebote"
@ -161,7 +158,7 @@ collections:
collapsed: true
fields:
- {label: "Aktivieren", name: "enable", widget: "boolean", required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "image", required: false, media_library: { config: { max_file_size: 2048000 } } }
- {label: "Hintergrundbild", name: "bg_image", widget: "image", required: false }
- {label: "Titel", name: "title", widget: "string", required: false}
- {label: "Inhalt", name: "content", widget: "text", required: false}
- {label: "Video-Link", name: "video_link", widget: "string", required: false}
@ -179,7 +176,7 @@ collections:
fields:
- {label: "Aktivieren", name: "enable", widget: "boolean", required: false}
- {label: "Titel", name: "title", widget: "string", required: false}
- {label: "Bild", name: "image", widget: "image", required: false, media_library: { config: { max_file_size: 2048000 } } }
- {label: "Bild", name: "image", widget: "image", required: false }
- {label: "Inhalt", name: "content", widget: "markdown", required: false}
- label: "Partnerlogos (unten)"
name: "footer_logos"
@ -194,7 +191,7 @@ collections:
fields:
- {label: "Titel", name: "title", widget: "string", required: false}
- {label: "Link", name: "link", widget: "string", required: false}
- {label: "Grafik", name: "image", widget: "image", required: true, media_folder: "/static/media/logos", public_folder: "/media/logos"}
- {label: "Grafik", name: "image", widget: "image", required: true}
- name: "hugo-config"
label: "Website-Konfiguration"
file: "config.yml"
@ -242,7 +239,7 @@ collections:
widget: "list"
fields:
- {label: "Link", name: "link", widget: "string"}
- {label: "Logo", name: "logo", widget: "image", media_library: { config: { max_file_size: 2048000 } } }
- {label: "Logo", name: "logo", widget: "image" }
- {label: "Autor", name: "author", widget: "string"}
- {label: "Adresse", name: "address", widget: "string"}
- {label: "Route (Link)", name: "route_link", widget: "string"}
@ -265,8 +262,8 @@ collections:
widget: "object"
fields:
- {label: "Aktivieren", name: "enable", widget: "boolean", required: false}
- {label: "Logo", name: "preloader", widget: "image", media_library: { config: { max_file_size: 2048000 } } }
- {label: "Ladeanimation", name: "loader", widget: "image", media_library: { config: { max_file_size: 2048000 } } }
- {label: "Logo", name: "preloader", widget: "image" }
- {label: "Ladeanimation", name: "loader", widget: "image" }
- label: "Soz. Netzwerke"
name: "social"
widget: "list"
@ -349,13 +346,13 @@ collections:
- name: "categories-config"
label: "Kategorien"
file: "data/de/categories.yml"
format: yml
fields:
- label: "Aktuelles"
label_singular: "Kategorie"
name: "blog"
widget: "list"
required: true
collapsed: true
fields:
- {label: "Kategorie", name: "category", widget: "string", required: true}
- label: "Ganztagsbereich"
@ -363,6 +360,7 @@ collections:
name: "ganztag"
widget: "list"
required: true
collapsed: true
fields:
- {label: "Kategorie", name: "category", widget: "string", required: true}
- label: "Wettbewerbe"
@ -370,6 +368,7 @@ collections:
name: "contests"
widget: "list"
required: true
collapsed: true
fields:
- {label: "Kategorie", name: "category", widget: "string", required: true}
- label: "Begabtenförderung"
@ -377,12 +376,12 @@ collections:
name: "begabte"
widget: "list"
required: true
collapsed: true
fields:
- {label: "Kategorie", name: "category", widget: "string", required: true}
- name: "ausblick-config"
label: "Ausblick auf die Woche"
file: "data/de/ausblick.yml"
format: yml
fields:
- {label: "Aktivieren", name: "enable", widget: "boolean", required: false}
- {label: "Titel", name: "title", widget: "string", required: false}
@ -393,30 +392,30 @@ collections:
search_fields: ["title"]
value_field: "title"
required: false
- {label: "Titelbild", name: "image", widget: "image", required: false, media_library: { config: { max_file_size: 2048000 } } }
- {label: "Titelbild", name: "image", widget: "image", required: false }
- {label: "Inhalt", name: "content", widget: "markdown", required: false}
- name: "index-pages"
icon: "page"
label: "Hauptseiten"
label_singular: "Hauptseite"
description: Hauptseiten können nur manuell durch den Administrator angelegt und in die Website eingebunden werden. Über diesen Bereich ist die Änderung der Inhalte möglich.
editor:
preview: true
frame: true
summary_fields: ["title", "description"]
files:
- name: "blog-index"
label: "Aktuelles"
file: "content/german/blog/_index.md"
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- name: "about-index"
label: "Über die Schule"
file: "content/german/about/_index.md"
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Bild", name: "image", widget: "image", default: "/media/image.webp", required: false, media_library: { config: { max_file_size: 2048000 } } }
- {label: "Bild", name: "image", widget: "image", default: "/media/image.webp", required: false }
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- label: "Statistik"
name: "stats"
@ -432,12 +431,10 @@ collections:
- {label: "Zahl", name: "count", widget: "number", required: false}
- {label: "Text", name: "body", widget: "markdown"}
- name: "anmeldung-index"
label: "Anmeldung"
label: "Aufnahmeverfahren"
file: "content/german/anmeldung/_index.md"
fields:
- {label: "Titel", name: "title", widget: "string", required: true}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- label: "Elemente"
label_singular: "Element"
@ -448,36 +445,51 @@ collections:
- {label: "Text", name: "content", widget: "markdown", required: true}
required: false
- {label: "Text", name: "body", widget: "markdown", required: false}
- name: "author-index"
label: "Autoren"
file: "content/german/author/_index.md"
fields:
- {label: "Titel", name: "title", widget: "string", required: true}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- name: "anmeldeformular"
label: "Anmeldeformular"
file: "content/german/anmeldeformular/_index.md"
fields:
- {label: "Titel", name: "title", widget: "string", required: true}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- {label: "Text", name: "body", widget: "markdown", required: false}
- name: "cantorpreis-index"
label: "Cantor-Preis"
label: "Cantorpreis"
file: "content/german/cantorpreis/_index.md"
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- name: "contact-index"
label: "Kontakt"
file: "content/german/kontakt/_index.md"
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- {label: "Text", name: "body", widget: "markdown"}
- label: "Kontaktdaten"
name: "kontaktdaten"
widget: "list"
required: true
collapsed: true
fields:
- {label: "Name", name: "name", widget: "string", required: true}
- {label: "Berufsbezeichnung", name: "position", widget: "string", required: true}
- {label: "E-Mail-Adresse", name: "email", widget: "string", required: true, pattern: ["^\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$", "name@domain.tld"]}
- name: "event-index"
label: "Termine"
file: "content/german/termine/_index.md"
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- label: Termine
label_singular: "Termin"
name: "events"
widget: "list"
collapsed: false
collapsed: true
fields:
- {label: "Titel", name: "title", widget: "string", required: true}
- {label: "Datum/Startdatum", name: "date", widget: "datetime", required: true, date_format: "dd.MM.yyyy", time_format: false, format: "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"}
@ -489,69 +501,88 @@ collections:
file: "content/german/forms/_index.md"
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- name: "ganztagsangebote-index"
label: "Ganztagsangebote"
label: "Unser Ganztagsbereich"
file: "content/german/ganztagsangebote/_index.md"
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- name: "projektwoche-index"
label: "Projektwoche"
file: "content/german/projektwoche/_index.md"
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- name: "wettbewerbe-index"
label: "Wettbewerbe"
file: "content/german/wettbewerbe/_index.md"
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- name: "begabte-index"
label: "Begabtenförderung"
file: "content/german/begabte/_index.md"
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- name: "abiturienten"
- name: "abiturienten-index"
label: "Abiturienten"
file: "content/german/abiturienten/_index.md"
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- name: "cantorfora"
- name: "cantorfora-index"
label: "Cantorfora"
file: "content/german/cantorfora/_index.md"
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- {label: "Text", name: "body", widget: "markdown", required: false}
- name: "schulchronik-index"
label: "Schulchronik"
file: "content/german/schulchronik/_index.md"
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- {label: "Text", name: "body", widget: "markdown", required: false}
- label: "Karte"
name: "infocard"
widget: "object"
required: false
fields:
- {label: "Aktiviert", name: "enable", widget: "boolean", required: false}
- {label: "Bild", name: "image", widget: "image", required: false}
- {label: "Zitat", name: "quote", widget: "string", required: false}
- {label: "Autor", name: "author", widget: "string", required: false}
- label: "Informationsseiten"
name: "links"
widget: "list"
required: false
collapsed: true
fields:
- {label: "Titel", name: "title", widget: "string", required: true}
- {label: "Link", name: "link", widget: "string", required: true}
- name: "pages"
icon: "page-add"
label: "Zusatzseiten"
label_singular: "Zusatzseite"
description: "Zusatzseiten können direkt aus der grafischen Oberfläche heraus erstellt werden und sind unter https://cantorgymnasium.de/pages/[SEITENTITEL] einsehbar. Sie bestehen immer aus einem Titel, einer Metabeschreibung (kurzer Einstiegstext) und dem eigentlichen Inhalt. Einer Zusatzseite kann auch ein Alias, also eine alternative URL zugewiesen werden."
folder: "content/german/pages"
create: true
editor:
preview: true
frame: true
slug: "{{slug}}"
filter:
field: type
value: pages
summary_fields: ["title", "draft","aliases", "description"]
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- {label: "Type", name: "type", widget: "hidden", default: "pages"}
- {label: "Layout", name: "layout", widget: "hidden", default: "single.html"}
- label: "Aliase"
name: "aliases"
widget: "list"
@ -563,49 +594,47 @@ collections:
- name: "author"
icon: "user"
label: "Autoren"
label_singular: "Autoren"
label_singular: "Autor"
description: Autoren können einem Blogartikel zugewiesen werden. Wir unterscheiden in aktive und inaktive sowie vereinfachte Autoren, welche nur mit dem Namen angezeigt werden, und erweiterte Autoren, für die eine Übersichtsseite angelegt wird.
folder: "content/german/author"
filter: {field: type, value: author}
create: true
slug: "{{slug}}"
editor:
preview: false
media_folder: '/static/media/people'
public_folder: '/media/people'
preview: true
frame: true
view_filters:
- label: "aktiv"
field: active
pattern: true
- label: "inaktiv"
field: active
pattern: false
- label: "einfach"
field: simplified
pattern: true
- label: "erweitert"
field: simplified
pattern: false
view_groups:
- label: "vereinfacht"
field: simplified
- label: "aktiv"
field: active
summary_fields: ["title", "active", "simplified", "body"]
fields:
- {label: "Name", name: "title", widget: "string"}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", default: "", required: false}
- {label: "Gravatar-E-Mail", name: "email", widget: "string", required: false}
- {label: "Foto", name: "image", widget: "image", required: false, media_library: { config: { max_file_size: 2048000 } } }
- label: "Kontaktdaten"
label_singular: " "
name: "social"
widget: "list"
required: false
fields:
- {label: "Titel", name: "title", widget: "string", required: false}
- label: "Symbol"
name: "icon"
widget: "select"
options:
- { label: "YouTube", value: "mdi mdi-youtube" }
- { label: "Twitter", value: "mdi mdi-twitter" }
- { label: "Pinterest", value: "mdi mdi-pinterest" }
- { label: "GitHub", value: "mdi mdi-github" }
- { label: "Git", value: "mdi mdi-git" }
- { label: "Vimeo", value: "mdi mdi-vimeo" }
- { label: "Instagram", value: "mdi mdi-instagram" }
- { label: "Facebook", value: "mdi mdi-facebook" }
- { label: "Linkedin", value: "mid mdi-linkedin" }
- { label: "E-Mail", value: "mdi mdi-at" }
- { label: "Sonstige", value: "mdi mdi-share-variant-outline" }
- {label: "Link", name: "link", widget: "string"}
- {label: "E-Mail-Adresse", name: "email", widget: "string", required: false}
- {label: "Foto", name: "image", widget: "image", required: false, default: "/media/authors/gcg.webp" }
- {label: "vereinfacht", name: "simplified", widget: "boolean", default: false, required: false}
- {label: "aktiv", name: "active", widget: "boolean", default: true, required: false}
- {label: "Beschreibung", name: "body", widget: "markdown"}
- name: "blog"
icon: "news"
label: "Aktuelles"
description: Diese Artikel werden im Bereich "Aktuelles" auf der Schulhomepage angezeigt.
label_singular: "Blogbeitrag"
description: Diese Artikel werden im Bereich "Aktuelles" auf der Schulhomepage angezeigt. Sie können sowohl direkt veröffentlicht, als auch als Entwurf gespeichert werden.
label_singular: "Artikel"
folder: "content/german/blog"
filter: {field: "type", value: "post"}
create: true
@ -613,8 +642,6 @@ collections:
editor:
preview: true
frame: true
media_folder: '/static/media/blog'
public_folder: '/media/blog'
view_groups:
- label: Entwurf
field: draft
@ -625,13 +652,13 @@ collections:
default:
field: date
direction: Descending
summary_fields: ["date", "title", "draft", "author", "body"]
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Datum", name: "date", widget: "datetime", date_format: "dd/MM/yyyy", time_format: false, format: "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", default: "", required: false}
- {label: "Beitragsbild", name: "image", widget: "image", default: "/media/blog/image.webp", media_library: { config: { max_file_size: 2048000 } } }
- {label: "Beitragsbild", name: "image", widget: "image", default: "/media/blog/image.webp" }
- label: "Beitragsautor"
name: "author"
widget: "relation"
@ -649,6 +676,17 @@ collections:
display_fields: ["blog.*"]
multiple: true
options_length: 50
- label: "Fächer"
name: "subjects"
widget: "relation"
required: false
collection: "config"
file: "categories-config"
value_field: "subjects.*"
search_fields: ["subjects.*"]
display_fields: ["subjects.*"]
multiple: true
options_length: 50
- label: "Tags"
name: "tags"
widget: "list"
@ -658,7 +696,6 @@ collections:
name: "tag"
widget: "string"
- {label: "Type", name: "type", widget: "hidden", default: "post"}
- {label: "Text", name: "body", widget: "markdown"}
- name: "forms"
icon: "document"
@ -670,13 +707,12 @@ collections:
create: true
slug: "{{slug}}"
editor:
preview: false
media_folder: '/static/media/forms'
public_folder: '/media/forms'
preview: true
frame: true
summary_fields: ["title", "draft"]
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- label: "Dateien"
name: "files"
@ -686,7 +722,6 @@ collections:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Datei", name: "link", widget: "file"}
- {label: "Type", name: "type", widget: "hidden", default: "forms"}
- {label: "Text", name: "body", widget: "markdown"}
- name: "cantorpreis"
icon: "award"
@ -702,40 +737,16 @@ collections:
summary: "{{title}} - {{name}}"
create: true
editor:
preview: false
media_folder: '/static/media/cantorpreis'
public_folder: '/media/cantorpreis'
preview: true
frame: true
summary_fields: ["title", "name", "draft", "body"]
fields:
- {label: "Jahr", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Beschreibung", name: "description", widget: "text", required: false}
- {label: "Bild", name: "image", widget: "image", default: "/media/cantorpreis/image.webp", required: false, media_library: { config: { max_file_size: 2048000 } } }
- {label: "Name", name: "name", widget: "string"}
- label: "Kontaktdaten/Soz. Netzwerke"
name: "contact"
widget: "list"
required: false
fields:
- {label: "Bezeichnung", name: "name", widget: "string"}
- label: "Symbol"
name: "icon"
widget: "select"
options:
- { label: "YouTube", value: "mdi mdi-youtube" }
- { label: "Twitter", value: "mdi mdi-twitter" }
- { label: "Pinterest", value: "mdi mdi-pinterest" }
- { label: "GitHub", value: "mdi mdi-github" }
- { label: "Git", value: "mdi mdi-git" }
- { label: "Vimeo", value: "mdi mdi-vimeo" }
- { label: "Instagram", value: "mdi mdi-instagram" }
- { label: "Facebook", value: "mdi mdi-facebook" }
- { label: "Linkedin", value: "mid mdi-linkedin" }
- { label: "E-Mail", value: "mdi mdi-at" }
- { label: "Sonstige", value: "mdi mdi-share-variant-outline" }
- {label: "Link", name: "link", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Beschreibung", name: "description", widget: "text", required: false}
- {label: "Bild", name: "image", widget: "image", default: "/media/cantorpreis/image.webp", required: false }
- {label: "Type", name: "type", widget: "hidden", default: "cantorpreis"}
- {label: "Text", name: "body", widget: "markdown", required: false}
- name: "ganztagsangebote"
icon: "group"
@ -747,14 +758,12 @@ collections:
editor:
preview: true
frame: true
media_folder: '/static/media/ganztagsangebote'
public_folder: '/media/ganztagsangebote'
summary_fields: ["title", "draft", "category", "schedule", "room"]
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- {label: "Bild", name: "image", widget: "image", default: "/media/ganztagsangebote/image.webp", required: false, media_library: { config: { max_file_size: 2048000 } } }
- {label: "Bild", name: "image", widget: "image", default: "/media/ganztagsangebote/image.webp", required: false }
- label: "Themenbereich"
name: "category"
widget: "relation"
@ -771,7 +780,6 @@ collections:
- {label: "Raum", name: "room", widget: "string"}
- {label: "Anmeldelink", name: "apply_url", widget: "hidden", default: "https://moodle.bildung-lsa.de/gcg/mod/choice/view.php?id=828"}
- {label: "Type", name: "type", widget: "hidden", default: "ganztagsangebote"}
- {label: "Text", name: "body", widget: "markdown"}
- name: "wettbewerbe"
icon: "trophy"
@ -783,14 +791,12 @@ collections:
editor:
preview: true
frame: true
media_folder: '/static/media/contests'
public_folder: '/media/contests'
summary_fields: ["title", "draft", "category"]
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- {label: "Bild", name: "image", widget: "image", default: "/media/contests/image.webp", required: false, media_library: { config: { max_file_size: 2048000 } } }
- {label: "Bild", name: "image", widget: "image", default: "/media/contests/image.webp", required: false }
- label: "Fach"
name: "category"
widget: "relation"
@ -804,7 +810,6 @@ collections:
- {label: "Klassenstufen", name: "class", widget: "string"}
- {label: "Website", name: "web_url", widget: "string", required: false}
- {label: "Type", name: "type", widget: "hidden", default: "wettbewerbe"}
- {label: "Text", name: "body", widget: "markdown"}
- name: "begabte"
icon: "pi"
@ -814,29 +819,17 @@ collections:
filter: {field: "type", value: "begabte"}
create: true
editor:
preview: false
media_folder: '/static/media/begabte'
public_folder: '/media/begabte'
preview: true
frame: true
summary_fields: ["title", "draft", "body"]
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- {label: "Bild", name: "image", widget: "image", default: "/media/begabte/image.webp", required: false, media_library: { config: { max_file_size: 2048000 } } }
- label: "Fach"
name: "category"
widget: "relation"
required: true
collection: "config"
file: "categories-config"
value_field: "begabte.*"
search_fields: ["begabte.*"]
display_fields: ["begabte.*"]
options_length: 50
- {label: "Bild", name: "image", widget: "image", default: "/media/begabte/image.webp", required: false }
- {label: "Klassenstufen", name: "class", widget: "string"}
- {label: "Website", name: "web_url", widget: "string", required: false}
- {label: "Type", name: "type", widget: "hidden", default: "begabte"}
- {label: "Text", name: "body", widget: "markdown"}
- name: "projektwoche"
icon: "projektwoche"
@ -846,27 +839,27 @@ collections:
filter: {field: "type", value: "projektwoche"}
create: true
editor:
preview: false
media_folder: '/static/media/projektwoche'
public_folder: '/media/projektwoche'
preview: true
frame: true
summary_fields: ["title", "draft", "tiles", "description"]
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Type", name: "type", widget: "hidden", default: "projektwoche"}
- {label: "Text", name: "body", widget: "markdown", required: false, default: ""}
- label: "Kacheln"
name: "tiles"
widget: "list"
required: false
collapsed: true
hint: "Die Vorschau zeigt nur die generierten Symbolkarten, NICHT die Inhalte."
fields:
- {label: "Titel", name: "title", widget: "string", required: true}
- {label: "Hintergrundfarbe", name: "bg_color", widget: "color", required: true}
- {label: "Symbol", name: "icon", widget: "string", required: true}
- {label: "Symbolfarbe", name: "font_color", widget: "color", required: true}
- {label: "Inhalt", name: "content", widget: "markdown", required: true}
- {label: "Text", name: "body", widget: "markdown", required: false, default: ""}
- name: "schulchronik"
icon: "pillar"
label: "Schulchronik"
@ -876,23 +869,88 @@ collections:
create: true
editor:
preview: false
media_folder: '/static/media/schulchronik'
public_folder: '/media/schulchronik'
summary_fields: ["title", "draft", "cantorpreisträger", "topics"]
sortable_fields:
fields: ['title']
default:
field: title
direction: Descending
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Type", name: "type", widget: "hidden", default: "schulchronik"}
- {label: "Einleitung", name: "pretext", hint: "Jahreszahltext", widget: "markdown", required: false}
- label: "Kreative Haufen"
name: "topics"
widget: "list"
required: false
fields:
- {label: "Titel", name: "title", widget: "string", required: true}
- {label: "Inhalt", name: "content", widget: "markdown", required: true}
- label: "Superhaufen"
name: "superhaufen"
widget: "object"
required: false
fields:
- {label: "Aktiviert", name: "enable", widget: "boolean", required: false}
- label: "Superhaufen"
name: "link"
widget: "relation"
collection: "superhaufen"
search_fields: ["title"]
value_field: "title"
required: false
collapsed: true
- label: "Cantorpreisträger"
name: "cantorpreisträger"
widget: "relation"
collection: "cantorpreis"
search_fields: ["jahr", "name"]
value_field: "name"
required: false
- {label: "Text", name: "body", widget: "markdown", required: false, default: ""}
- name: "superhaufen"
icon: "superhaufen"
label: "Superhaufen"
label_singular: "Superhaufen"
folder: "content/german/superhaufen"
filter: {field: "type", value: "superhaufen"}
create: true
editor:
preview: true
frame: true
summary_fields: ["title", "draft", "tiles"]
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Type", name: "type", widget: "hidden", default: "superhaufen"}
- label: "Rückverlinkung"
name: "previous"
widget: "object"
fields:
- {label: "Aktiviert", name: "enable", widget: "hidden", default: true}
- {label: "Titel", name: "title", widget: "string", required: true}
- {label: "Link", name: "link", widget: "string", required: true}
- label: "Kacheln"
name: "tiles"
widget: "list"
required: false
collapsed: true
hint: "Die Vorschau zeigt nur die generierten Symbolkarten, NICHT die Inhalte."
fields:
- {label: "Titel", name: "title", widget: "string", required: true}
- {label: "Hintergrundfarbe", name: "bg_color", widget: "color", required: true}
- {label: "Symbol", name: "icon", widget: "string", required: true}
- {label: "Symbolfarbe", name: "font_color", widget: "color", required: true}
- {label: "Inhalt", name: "content", widget: "markdown", required: true}
- label: "Unter-Unterhaufen"
name: "unterhaufen"
widget: "list"
required: false
collapsed: true
fields:
- {label: "Titel", name: "title", widget: "string", required: false}
- {label: "Inhalt", name: "content", widget: "markdown", required: true}
- name: "abiturienten"
icon: "graduation-cap"
label: "Abiturienten"
@ -901,17 +959,19 @@ collections:
filter: {field: "type", value: "abiturienten"}
create: true
editor:
preview: false
media_folder: '/static/media/abiturienten'
public_folder: '/media/abiturienten'
preview: true
frame: true
summary_fields: ["title", "draft"]
sortable_fields:
fields: ["title"]
default:
field: title
direction: Descending
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Bild", name: "image", widget: "image", default: "/media/abiturienten/image.webp", required: false, media_library: { config: { max_file_size: 2048000 } } }
- {label: "Mehrere Bilder", name: "multiple", widget: "boolean", default: false, required: false}
- {label: "Bild", name: "image", widget: "image", default: "/media/abiturienten/image.webp", required: false }
- {label: "Type", name: "type", widget: "hidden", default: "abiturienten"}
- {label: "Text", name: "body", widget: "markdown"}
- name: "cantorfora"
icon: "presentation"
@ -924,23 +984,77 @@ collections:
editor:
preview: true
frame: true
media_folder: '/static/media/cantorfora'
public_folder: '/media/cantorfora'
view_groups:
- label: Drafts
field: draft
summary_fields: ["title", "draft", "description"]
sortable_fields:
fields: ['index', 'title']
default:
field: index
direction: Ascending
direction: Descending
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Laufindex", name: "index", widget: "number", value_type: 'int', min: 1, step: 1, required: true, hint: "Nummer des Cantorforums"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Hintergrundbild", name: "bg_image", widget: "hidden", default: "/media/backgrounds/page-title.webp"}
- {label: "Metabeschreibung", name: "description", widget: "text", default: "", required: false}
- {label: "Beitragsbild", name: "image", widget: "image", default: "/media/image.webp", media_library: { config: { max_file_size: 2048000 } } }
- {label: "Beitragsbild", name: "image", widget: "image", default: "/media/image.webp" }
- {label: "Type", name: "type", widget: "hidden", default: "cantorfora"}
- {label: "Text", name: "body", widget: "markdown"}
- name: "chronikseiten"
icon: "page-add"
label: "Chronikseiten"
label_singular: "Seite"
folder: "content/german/chronikseiten"
create: true
editor:
preview: true
frame: true
slug: "{{slug}}"
filter: {field: "type", value: "pages"}
summary_fields: ["title", "draft", "aliases", "body"]
fields:
- {label: "Titel", name: "title", widget: "string"}
- {label: "Entwurf", name: "draft", widget: "boolean", default: false, required: false}
- {label: "Metabeschreibung", name: "description", widget: "text", required: false}
- {label: "Type", name: "type", widget: "hidden", default: "pages"}
- label: "Aliase"
name: "aliases"
widget: "list"
required: false
fields:
- label: "Alias"
name: "alias"
widget: "string"
- {label: "Text", name: "body", widget: "markdown", required: false}
- name: "statistik"
icon: "stats"
label: "Statistik"
editor:
preview: false
files:
- name: "abiturdurchschnitte"
label: "Abiturdurchschnitte"
file: "static/data/abiturdurchschnitte.json"
fields:
- label: "Abiturdurchschnitte"
label_singular: "Abiturdurchschnitt"
name: "abiturdurchschnitte"
widget: "list"
required: false
fields:
- {label: "Jahr", name: "jahr", widget: "number", required: true}
- {label: "Schnitt", name: "schnitt", widget: "number", value_type: "float", step: 0.01, required: true}
- name: "schuelerzahlen"
label: "Schülerzahlen"
file: "static/data/schuelerzahlen.json"
fields:
- label: "Schülerzahlen"
label_singular: "Schülerzahlen"
name: "schuelerzahlen"
widget: "list"
required: false
fields:
- {label: "Jahr", name: "year", widget: "number", required: true}
- {label: "Gesamt", name: "all", widget: "number", required: true}
- {label: "davon Mädchen", name: "girls", widget: "number", required: true}

37
static/admin/icons.js Normal file
View File

@ -0,0 +1,37 @@
const IconNames = {
settings: "mdi mdi-cog-outline",
user: "mdi mdi-fountain-pen-tip",
page: "mdi mdi-file-document-outline",
"page-add": "mdi mdi-file-document-plus-outline",
document: "mdi mdi-file-document-multiple-outline",
news: "mdi mdi-newspaper",
award: "mdi mdi-seal-variant",
group: "mdi mdi-crowd",
trophy: "mdi mdi-trophy-outline",
pi: "mdi mdi-pi-box",
pillar: "mdi mdi-pillar",
"graduation-cap": "mdi mdi-school-outline",
help: "mdi mdi-lifebuoy",
dash: "mdi mdi-monitor-dashboard",
presentation: "mdi mdi-presentation",
projektwoche: "mdi mdi-calendar-range-outline",
superhaufen: "mdi mdi-view-dashboard",
stats: "mdi mdi-chart-bar",
};
let Icons = [];
for (let [name, icon] of Object.entries(IconNames)) {
Icons.push({
name,
icon: () =>
h(
"div",
{ className: "flex items-center" },
h("i", { className: icon, style: { fontSize: "1.5rem" } })
),
});
}
export default Icons;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,5 @@
import StatusPage from "./status.js";
import WikiLink from "./wiki.js";
export { StatusPage, WikiLink };

View File

@ -0,0 +1,17 @@
const StatusPage = {
id: "status",
title: "Status",
data: () =>
h("iframe", {
src: "https://grafana.cantorgymnasium.de/d/ni-7T-J4z/status?orgId=2&refresh=5s&kiosk",
style: {
width: "100%",
height: "90vh",
},
}),
options: {
icon: "dash",
},
};
export default StatusPage;

View File

@ -0,0 +1,10 @@
const WikiLink = {
id: "wiki",
title: "GCG.Wiki",
data: "https://wiki.cantorgymnasium.de",
options: {
icon: "help",
},
};
export default WikiLink;

View File

@ -0,0 +1,5 @@
import { truncate } from "./components/index.js";
const BodyPreview = ({ value }) => h("p", {}, truncate(value ?? "", 50));
export default BodyPreview;

View File

@ -0,0 +1,6 @@
const BooleanPreview = ({ value }) =>
h("i", {
className: value ? "mdi mdi-check" : "mdi mdi-close",
});
export default BooleanPreview;

View File

@ -0,0 +1,3 @@
import truncate from "./truncate.js";
export { truncate };

View File

@ -0,0 +1,9 @@
function truncate(str, num) {
if (str.length > num) {
return str.slice(0, num) + "...";
} else {
return str;
}
}
export default truncate;

View File

@ -0,0 +1,3 @@
const CountPreview = ({ value }) => (value ? value.length : 0);
export default CountPreview;

View File

@ -0,0 +1,11 @@
const DatePreview = ({ value }) =>
h(
"p",
{},
new Intl.DateTimeFormat("de-DE", {
year: "numeric",
month: "2-digit",
day: "2-digit",
hour12: false,
}).format(new Date(value))
);

View File

@ -0,0 +1,21 @@
const DraftPreview = ({ value }) =>
h(
"div",
{
style: {
backgroundColor: value === true ? "rgb(37 99 235)" : "rgb(22 163 74)",
color: "white",
border: "none",
padding: "2px 6px",
textAlign: "center",
textDecoration: "none",
display: "inline-block",
cursor: "pointer",
borderRadius: "4px",
fontSize: "14px",
},
},
value ? "Entwurf" : "Veröffentlicht"
);
export default DraftPreview;

View File

@ -0,0 +1,13 @@
import BooleanPreview from "./boolean-preview.js";
import DraftPreview from "./draft-preview.js";
import CountPreview from "./count-preview.js";
import BodyPreview from "./body-preview.js";
import DraftPreview from "./draft-preview.js";
export {
BooleanPreview,
DraftPreview,
CountPreview,
BodyPreview,
DraftPreview,
};

View File

@ -0,0 +1,32 @@
import { Container, PageHeader, Section, Row } from "./components/index.js";
const AbiturientenPreview = ({ widgetFor, entry, collection, fields }) => {
const imageField = useMemo(
() => fields.find((field) => field.name === "image"),
[fields]
);
const imageUrl = useMediaAsset(
entry.data.image,
collection,
imageField,
entry
);
return [
PageHeader(entry),
Section(
Container(
Row([
h(
"div",
{ className: "col-12 mb-4" },
h("img", { className: "img-fluid w-100", src: imageUrl })
),
h("div", { className: "col-12 content" }, widgetFor("body")),
])
)
),
];
};
export default AbiturientenPreview;

View File

@ -0,0 +1,64 @@
import { PageHeader } from "./components/index.js";
const AboutPreview = ({ widgetFor, widgetsFor, entry, fields, collection }) => {
const imageField = useMemo(
() => fields.find((field) => field.name === "image"),
[fields]
);
const imageUrl = useMediaAsset(
entry.data.image,
collection,
imageField,
entry
);
return [
PageHeader(entry),
h(
"section",
{ className: "section-sm" },
h(
"div",
{ className: "container" },
h(
"div",
{ className: "row" },
h(
"div",
{ className: "col-12" },
h("img", { className: "img-fluid w-100 mb-4", src: imageUrl }),
widgetFor("body")
)
)
)
),
entry.data.stats.enable
? h(
"section",
{ className: "section-sm bg-primary" },
h(
"div",
{ className: "container" },
h(
"div",
{ className: "row" },
widgetsFor("stats").data.zahlen.map((element) => {
return h(
"div",
{ className: "col-md-4 col-sm-6 mb-4 mb-md-0" },
h(
"div",
{ className: "text-center" },
h("h2", { className: "count text-white" }, element.count),
h("h5", { className: "text-white" }, element.name)
)
);
})
)
)
)
: null,
];
};
export default AboutPreview;

View File

@ -0,0 +1,159 @@
import { PageHeader } from "./components/index.js";
const AnmeldeformularPreview = ({ widgetFor, entry }) => {
return [
PageHeader(entry),
h(
"section",
{ className: "section-sm bg-gray" },
h(
"div",
{ className: "container" },
h(
"div",
{ className: "row" },
h(
"div",
{ className: "col-lg-8 mb-4 mb-lg-0" },
h(
"form",
{},
h(
"div",
{ className: "input-group" },
h("input", {
className: "form-control mb-3",
type: "text",
placeholder: "Name (Schüler/in)",
}),
h("input", {
className: "form-control mb-3",
type: "text",
placeholder: "Vorname",
})
),
h(
"div",
{ className: "input-group mb-3" },
h("span", { className: "input-group-text" }, "Geburtsdatum"),
h("input", { className: "form-control", type: "date" })
),
h("input", {
className: "form-control mb-3",
type: "text",
placeholder: "Straße",
}),
h(
"div",
{ className: "input-group" },
h("input", {
className: "form-control mb-3",
type: "text",
placeholder: "Hausnummer",
}),
h("input", {
className: "form-control mb-3",
type: "text",
placeholder: "Adresszusatz",
})
),
h(
"div",
{ className: "input-group" },
h("input", {
className: "form-control mb-3",
type: "text",
placeholder: "PLZ",
}),
h("input", {
className: "form-control mb-3",
type: "text",
placeholder: "Stadt",
})
),
h("input", {
className: "form-control mb-3",
type: "text",
placeholder: "Landkreis",
}),
h(
"div",
{ className: "input-group" },
h("input", {
className: "form-control mb-3",
type: "text",
placeholder: "Telefon privat",
}),
h("input", {
className: "form-control mb-3",
type: "text",
placeholder: "Telefon dienstl.",
})
),
h("input", {
className: "form-control mb-3",
type: "text",
placeholder: "Abweichender Elternname",
}),
h("input", {
className: "form-control mb-3",
type: "text",
placeholder: "Grundschule",
}),
h("input", {
className: "form-control mb-3",
type: "text",
placeholder: "Ihre E-Mail-Adresse",
}),
h("textarea", {
className: "form-control mb-3",
placeholder: "Bemerkungen",
}),
h(
"div",
{ className: "input-group mb-3" },
h("input", { className: "form-control", type: "file" }),
h(
"span",
{ className: "input-group-text" },
"Zeugnis (Vorderseite)"
)
),
h(
"div",
{ className: "input-group mb-3" },
h("input", { className: "form-control", type: "file" }),
h(
"span",
{ className: "input-group-text" },
"Zeugnis (Rückseite)"
)
),
h(
"div",
{ className: "input-group mb-3" },
h(
"div",
{ className: "input-group-text" },
h("input", {
className: "form-check-input",
type: "checkbox",
})
),
h(
"p",
{ className: "form-control mb-0" },
"Hiermit melden wir unser Kind verbindlich zur Aufnahmeprüfung an."
)
),
h("button", { className: "btn btn-primary" }, "Senden")
)
),
h("div", { className: "col-lg-4" }, widgetFor("body"))
)
)
),
];
};
export default AnmeldeformularPreview;

View File

@ -0,0 +1,44 @@
import { PageHeader } from "./components/index.js";
const AnmeldungPreview = ({ widgetsFor, widgetFor, entry }) => {
return [
PageHeader(entry),
h(
"section",
{ className: "section-sm" },
h(
"div",
{ className: "container" },
h(
"div",
{ className: "row mb-4" },
h("div", { className: "col-md-6 content" }, widgetFor("body"))
),
h(
"div",
{ className: "row" },
widgetsFor("elements").map(function (element, index) {
return h(
"div",
{
className: "col-lg-6 col-sm-6 mb-4 d-flex align-items-stretch",
},
h(
"div",
{ className: "card rounded-0 hover-shadow border-primary" },
h(
"div",
{ className: "card-body" },
h("h4", { className: "card-title mb-3" }, element.data.title),
h("div", { className: "content" }, element.widgets.content)
)
)
);
})
)
)
),
];
};
export default AnmeldungPreview;

View File

@ -0,0 +1,72 @@
import { PageHeader, md5 } from "./components/index.js";
const AuthorPreview = ({ widgetFor, entry, fields, collection }) => {
const imageField = useMemo(
() => fields.find((field) => field.name === "image"),
[fields]
);
const imageUrl = entry.data.image
? useMediaAsset(entry.data.image, collection, imageField, entry)
: entry.data.email
? undefined
: useMediaAsset("/media/people/gcg.webp", collection, imageField, entry);
return [
PageHeader(entry),
h(
"section",
{ className: "section-sm bg-light" },
h(
"div",
{ className: "container" },
h(
"div",
{ className: "row" },
h(
"div",
{ className: "col-lg-10 mx-auto" },
h(
"div",
{ className: "text-center" },
h(
"figure",
{},
h("img", {
className: "rounded-circle img-fluid mb-4",
src:
imageUrl ??
"https://www.gravatar.com/avatar/" +
md5(entry.data.email) +
"?s=128&pg&d=identicon",
width: "128px",
}),
h(
"figcaption",
{},
h("h4", { className: "fw-bold" }, entry.data.title)
)
),
h("hr"),
widgetFor("body"),
h("hr"),
h(
"ul",
{ className: "list-inline" },
entry.data.email
? h(
"li",
{ className: "list-inline-item" },
h("i", { className: "mdi mdi-at" })
)
: null
)
)
)
)
)
),
];
};
export default AuthorPreview;

View File

@ -0,0 +1,89 @@
import {
DateFormat,
PageHeader,
Section,
Container,
Col12,
Row,
} from "./components/index.js";
const BlogPreview = ({ widgetFor, entry, fields, collection }) => {
const imageField = useMemo(() => {
return fields.find((field) => field.name === "image");
}, [fields]);
const imageUrl = useMediaAsset(
entry.data.image,
collection,
imageField,
entry
);
return [
PageHeader(entry),
Section(
Container(
Row([
h(
"div",
{ key: "cover-image", className: "col-12 mb-4" },
h("img", { className: "img-fluid w-100", src: imageUrl })
),
Col12(
h(
"div",
{ className: "row mb-3" },
h(
"div",
{ className: "col-6 mb-md-0 text-light" },
h("span", { className: "fw-bold me-1" }, "Geschrieben von:"),
entry.data.author
),
h(
"div",
{ className: "col-6 mb-3 mb-md-0 text-light" },
h("span", { className: "fw-bold me-1" }, "Datum:"),
entry.data.date
? DateFormat({
date: entry.data.date,
format: {
day: "numeric",
month: "short",
year: "numeric",
},
})
: ""
)
)
),
Row(
h(
"div",
{ className: "col-12 mb-md-0 text-light" },
h("span", { className: "fw-bold me-1" }, "Kategorie:"),
entry.data.categories
? entry.data.categories.map(
(category, index) => (index != 0 ? ", " : "") + category
)
: ""
)
),
h(
"div",
{ key: "border-bottom", className: "col-12 my-4" },
h("div", { className: "border-bottom" })
),
h(
"div",
{
key: "body-content",
className: "col-12 mb-5 content content-justify",
},
widgetFor("body")
),
])
)
),
];
};
export default BlogPreview;

View File

@ -0,0 +1,49 @@
import {
PageHeader,
Section,
Container,
Row,
Content,
} from "./components/index.js";
const CantorpreisPreview = ({ widgetFor, entry, fields, collection }) => {
const imageField = useMemo(
() => fields.find((field) => field.name === "image"),
[fields]
);
const imageUrl = useMediaAsset(
entry.data.image,
collection,
imageField,
entry
);
return [
PageHeader(entry),
Section(
Container(
Row([
h(
"div",
{ className: "col-md-5 mb-5" },
h("img", {
className: "img-fluid w-75",
src: imageUrl,
alt: entry.data.name,
})
),
h(
"div",
{ className: "col-md-7 mb-5" },
h("h3", {}, entry.data.name),
h("h6", { className: "text-color" }, entry.data.title),
Content(widgetFor("body"))
),
])
)
),
];
};
export default CantorpreisPreview;

View File

@ -0,0 +1,113 @@
import { PageHeader } from "./components/index.js";
const ChronikIndexPreview = ({
widgetFor,
widgetsFor,
entry,
fields,
collection,
}) => {
const imageField = useMemo(
() => fields.find((field) => field.name === "image"),
[fields]
);
const imageUrl = useMediaAsset(
widgetsFor("infocard").data.image,
collection,
imageField,
entry
);
return [
PageHeader(entry),
h(
"section",
{ className: "section-sm" },
h("div", { className: "container" }, widgetFor("body")),
widgetsFor("infocard").data.enable
? h(
"div",
{ className: "container" },
h(
"div",
{ className: "card mb-3" },
h(
"div",
{ className: "row g-0" },
h(
"div",
{ className: "col-md-3" },
h("img", {
className: "img-fluid rounded w-100",
src: imageUrl,
})
),
h(
"div",
{ className: "col-md-9 d-flex align-items-center" },
h(
"div",
{ className: "card-body" },
h(
"p",
{ className: "h2 card-title" },
widgetsFor("infocard").data.quote
),
h(
"p",
{ className: "card-text" },
h(
"small",
{ className: "text-muted" },
widgetsFor("infocard").data.author
)
)
)
)
)
)
)
: null,
h(
"div",
{ className: "container" },
h("h2", { className: "section-title" }, "Informationsseiten"),
h(
"div",
{ className: "row" },
widgetsFor("links").map((element) =>
h(
"div",
{ className: "col-lg-4 col-sm-6" },
h(
"div",
{
className: "card border-primary rounded-0 hover-shadow mb-4",
},
h(
"div",
{ className: "card-body" },
h(
"h4",
{ className: "card-title text-truncate" },
h("a", { href: element.data.link }, element.data.title)
),
h(
"a",
{
className: "btn btn-primary btn-sm",
href: element.data.link,
},
"Mehr anzeigen"
)
)
)
)
)
)
)
),
];
};
export default ChronikIndexPreview;

View File

@ -0,0 +1,78 @@
import { PageHeader } from "./components/index.js";
const ChronikPreview = ({ widgetFor, widgetsFor, entry, document, window }) => {
/*return [PageHeader,
h('section', {className: "section-sm"},
h('div', {className: "container"},
h('div', {className: "row"},
h('div', {className: "col-12 mb-4 content"},
widgetsFor('topics').map(function(i, index) {
return h('div', {"id": i.data.id, className: "modal"},
h('div', {className: "modal-dialog modal-lg", "role": "document"},
h('div', {className: "modal-content"},
h('div', {className: "modal-header"},
h('h5', {className: "modal-title"}, i.data.title),
h('button', {className: "close", type: "button", "dataDismiss": "modal", "ariaLabel": "Close"},
h('span', {"ariaHidden": "true"}, '\u{00d7}')
)
),
h('div', {className: "modal-body"},
h('div', {className: "content"}, i.content)
)
)
)
);
}),
entry.data.pretext != "" && entry.data.pretext != null ? h('div', {"id": "pretext", className: "modal"},
h('div', {className: "modal-dialog modal-lg", "role": "document"},
h('div', {className: "modal-content"},
h('div', {className: "modal-header"},
h('h5', {className: "modal-title"}, entry.data.title),
h('button', {className: "close", type: "button", "dataDismiss": "modal", "ariaLabel": "Close"},
h('span', {"ariaHidden": "true"}, '\u{00d7}')
)
),
h('div', {className: "modal-body"},
h('div', {className: "content"}, widgetFor('pretext'))
)
)
)
) : null,
h('div', {"id": "wc-canvas"}),
() => {
var topics = [[entry.data.title, 100, "pretext"]];
widgetsFor('topics').map(function(i, index) {
topics.push([i.data.title, 40, i.data.id]);
});
var script = document.createElement('script');
var div = document.getElementById('sc-root');
div.appendChild(script);
WordCloud(
document.getElementById('wc-canvas'),
{
click: function (item) {
if (item[1] != 100 || (item[1] == 100 && item[2] == "pretext")) {
$('#' + item[2]).modal('show');
}
},
color: function (word, weight) {
return (weight === 100) ? '#ffbc3b' : '#1a1a37';
},
fontFamily: 'Fira Sans, serif',
fontWeight: 800,
list: topics,
shrinkToFit: true,
gridSize: 25,
rotateRatio: 0,
}
);
},
widgetFor('body')
)
)
)
)
];*/
};
export default ChronikPreview;

View File

@ -0,0 +1,8 @@
const Section = (children) =>
h("section", { className: "section-sm" }, children);
const Container = (children) => h("div", { className: "container" }, children);
const Row = (children) => h("div", { className: "row" }, children);
const Content = (children) => h("div", { className: "content" }, children);
const Col12 = (children) => h("div", { className: "col-12" }, children);
export { Section, Container, Row, Content, Col12 };

View File

@ -0,0 +1,5 @@
const DateFormat = ({ date, format }) => {
return new Intl.DateTimeFormat("de-DE", format).format(new Date(date));
};
export default DateFormat;

View File

@ -0,0 +1,6 @@
import PageHeader from "./page-header.js";
import DateFormat from "./date-format.js";
import md5 from "./md5.js";
import { Section, Container, Row, Content, Col12 } from "./base.js";
export { PageHeader, DateFormat, md5, Section, Container, Row, Content, Col12 };

View File

@ -0,0 +1,5 @@
function md5gen(d){return rstr2hex(binl2rstr(binl_md5(rstr2binl(d),8*d.length)))}function rstr2hex(d){for(var _,m="0123456789ABCDEF",f="",r=0;r<d.length;r++)_=d.charCodeAt(r),f+=m.charAt(_>>>4&15)+m.charAt(15&_);return f}function rstr2binl(d){for(var _=Array(d.length>>2),m=0;m<_.length;m++)_[m]=0;for(m=0;m<8*d.length;m+=8)_[m>>5]|=(255&d.charCodeAt(m/8))<<m%32;return _}function binl2rstr(d){for(var _="",m=0;m<32*d.length;m+=8)_+=String.fromCharCode(d[m>>5]>>>m%32&255);return _}function binl_md5(d,_){d[_>>5]|=128<<_%32,d[14+(_+64>>>9<<4)]=_;for(var m=1732584193,f=-271733879,r=-1732584194,i=271733878,n=0;n<d.length;n+=16){var h=m,t=f,g=r,e=i;f=md5_ii(f=md5_ii(f=md5_ii(f=md5_ii(f=md5_hh(f=md5_hh(f=md5_hh(f=md5_hh(f=md5_gg(f=md5_gg(f=md5_gg(f=md5_gg(f=md5_ff(f=md5_ff(f=md5_ff(f=md5_ff(f,r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+0],7,-680876936),f,r,d[n+1],12,-389564586),m,f,d[n+2],17,606105819),i,m,d[n+3],22,-1044525330),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+4],7,-176418897),f,r,d[n+5],12,1200080426),m,f,d[n+6],17,-1473231341),i,m,d[n+7],22,-45705983),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+8],7,1770035416),f,r,d[n+9],12,-1958414417),m,f,d[n+10],17,-42063),i,m,d[n+11],22,-1990404162),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+12],7,1804603682),f,r,d[n+13],12,-40341101),m,f,d[n+14],17,-1502002290),i,m,d[n+15],22,1236535329),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+1],5,-165796510),f,r,d[n+6],9,-1069501632),m,f,d[n+11],14,643717713),i,m,d[n+0],20,-373897302),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+5],5,-701558691),f,r,d[n+10],9,38016083),m,f,d[n+15],14,-660478335),i,m,d[n+4],20,-405537848),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+9],5,568446438),f,r,d[n+14],9,-1019803690),m,f,d[n+3],14,-187363961),i,m,d[n+8],20,1163531501),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+13],5,-1444681467),f,r,d[n+2],9,-51403784),m,f,d[n+7],14,1735328473),i,m,d[n+12],20,-1926607734),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+5],4,-378558),f,r,d[n+8],11,-2022574463),m,f,d[n+11],16,1839030562),i,m,d[n+14],23,-35309556),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+1],4,-1530992060),f,r,d[n+4],11,1272893353),m,f,d[n+7],16,-155497632),i,m,d[n+10],23,-1094730640),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+13],4,681279174),f,r,d[n+0],11,-358537222),m,f,d[n+3],16,-722521979),i,m,d[n+6],23,76029189),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+9],4,-640364487),f,r,d[n+12],11,-421815835),m,f,d[n+15],16,530742520),i,m,d[n+2],23,-995338651),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+0],6,-198630844),f,r,d[n+7],10,1126891415),m,f,d[n+14],15,-1416354905),i,m,d[n+5],21,-57434055),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+12],6,1700485571),f,r,d[n+3],10,-1894986606),m,f,d[n+10],15,-1051523),i,m,d[n+1],21,-2054922799),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+8],6,1873313359),f,r,d[n+15],10,-30611744),m,f,d[n+6],15,-1560198380),i,m,d[n+13],21,1309151649),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+4],6,-145523070),f,r,d[n+11],10,-1120210379),m,f,d[n+2],15,718787259),i,m,d[n+9],21,-343485551),m=safe_add(m,h),f=safe_add(f,t),r=safe_add(r,g),i=safe_add(i,e)}return Array(m,f,r,i)}function md5_cmn(d,_,m,f,r,i){return safe_add(bit_rol(safe_add(safe_add(_,d),safe_add(f,i)),r),m)}function md5_ff(d,_,m,f,r,i,n){return md5_cmn(_&m|~_&f,d,_,r,i,n)}function md5_gg(d,_,m,f,r,i,n){return md5_cmn(_&f|m&~f,d,_,r,i,n)}function md5_hh(d,_,m,f,r,i,n){return md5_cmn(_^m^f,d,_,r,i,n)}function md5_ii(d,_,m,f,r,i,n){return md5_cmn(m^(_|~f),d,_,r,i,n)}function safe_add(d,_){var m=(65535&d)+(65535&_);return(d>>16)+(_>>16)+(m>>16)<<16|65535&m}function bit_rol(d,_){return d<<_|d>>>32-_}
const md5 = (string) => md5gen(unescape(encodeURIComponent(string))).toLowerCase();
export default md5;

View File

@ -0,0 +1,51 @@
const PageHeader = (entry) => {
return h(
"section",
{
key: "page-header",
className: "page-title-section overlay",
style: {
backgroundImage:
'url("/media/backgrounds/page-title.webp"),url("/media/backgrounds/page-title.webp")',
},
},
h(
"div",
{ className: "container" },
h(
"div",
{ className: "row" },
h(
"div",
{ className: "col-md-8 position-relative" },
h(
"ul",
{ className: "list-inline" },
h(
"li",
{ className: "list-inline-item h2" },
h(
"font",
{ className: "text-primary font-secondary", href: "" },
"Startseite"
)
),
h(
"li",
{ className: "list-inline-item h2" },
h("i", { className: "mdi mdi-chevron-double-right text-white" })
),
h(
"li",
{ className: "list-inline-item text-white h2 font-secondary" },
entry.data.title
)
),
h("p", { className: "text-lighten" }, entry.data.description)
)
)
)
);
};
export default PageHeader;

View File

@ -0,0 +1,67 @@
import { Container, PageHeader, Row, Section } from "./components/index.js";
const ContestPreview = ({ widgetFor, entry, fields, collection }) => {
const imageField = useMemo(() => {
return fields.find((field) => field.name === "image");
}, [fields]);
const imageUrl = useMediaAsset(
entry.data.image,
collection,
imageField,
entry
);
return [
PageHeader(entry),
Section(
Container([
entry.data.image &&
!["/media/contests/image.webp", "/media/begabte/image.webp"].includes(
entry.data.image
)
? Row(
h(
"div",
{ className: "col-12 mb-4" },
h("img", { className: "img-fluid w-100", src: imageUrl })
)
)
: null,
h(
"div",
{ className: "row mb-4" },
h(
"div",
{ className: "col-7" },
h(
"div",
{ className: "d-flex align-items-center" },
h("i", { className: "mdi mdi-crowd text-primary icon-md me-2" }),
h(
"div",
{ className: "text-start" },
h("h6", { className: "mb-0" }, "KLASSE(N)"),
h("p", { className: "mb-0" }, entry.data.class)
)
)
),
entry.data.web_url
? h(
"div",
{ className: "col-5 text-end mb-4 mb-xl-0" },
h("a", { className: "btn btn-primary" }, "Website")
)
: null,
h(
"div",
{ className: "col-12 mt-4" },
h("div", { className: "border-bottom border-primary" })
)
),
Row(h("div", { className: "col-12 content" }, widgetFor("body"))),
])
),
];
};
export default ContestPreview;

View File

@ -0,0 +1,147 @@
import { PageHeader, DateFormat } from "./components/index.js";
function isFuture(date, enddate) {
let date1 = new Date(date ? date : 0);
let date2 = new Date(enddate ? enddate : 0);
let present = new Date();
if (date1 >= present || date2 >= present) {
return true;
} else {
return false;
}
}
const EventPreview = ({ widgetsFor, entry }) => {
return [
PageHeader(entry),
h(
"section",
{ className: "section-sm" },
h(
"div",
{ className: "container" },
h(
"div",
{ className: "row" },
h(
"div",
{ className: "col-12" },
h(
"div",
{ className: "row" },
h(
"div",
{ className: "col-12" },
h(
"ul",
{ className: "list-inline text-center filter-controls mb-5" },
h(
"li",
{ className: "list-inline-item m-3 text-uppercase active" },
"Alle"
),
h(
"li",
{ className: "list-inline-item m-3 text-uppercase" },
"Anstehend"
),
h(
"li",
{ className: "list-inline-item m-3 text-uppercase" },
"Vergangen"
)
)
)
),
h(
"div",
{ className: "filtr-container" },
widgetsFor("events").map((event) =>
h(
"div",
{ className: "mb-2 mt-2 col-12 filtr-item" },
h(
"div",
{
className:
"card d-md-table w-100 hover-shadow border-primary ps-0 pe-0 mb-4",
},
h(
"div",
{
className:
"d-md-table-cell text-center p-4 bg-primary text-white mb-4 mb-md-0 termin-tc rounded",
},
h(
"span",
{ className: "h2 d-block" },
event.data.date != null && event.data.date != ""
? DateFormat({
date: event.data.date,
format: { day: "numeric" },
})
: null
),
h(
"span",
{ className: "d-block" },
event.data.date != null && event.data.date != ""
? DateFormat({
date: event.data.date,
format: { month: "short", year: "numeric" },
})
: null
),
event.data.enddate != null && event.data.enddate != ""
? [
h("br"),
"bis " +
DateFormat({
date: event.data.enddate,
format: {
day: "numeric",
month: "short",
year: "numeric",
},
}),
]
: null
),
h(
"div",
{
className:
"d-md-table-cell px-4 vertical-align-middle mb-4 mb-md-0 p-2",
},
h("p", { className: "h4 mb-0 d-block" }, event.data.title)
),
event.data.location
? h(
"div",
{
className:
"d-md-table-cell text-end pe-md-4 p-2 vertical-align-middle",
},
h(
"p",
{},
h("i", {
className:
"mdi mdi-map-marker-radius-outline icon-s text-primary me-2",
}),
event.data.location
)
)
: null
)
)
)
)
)
)
)
),
];
};
export default EventPreview;

View File

@ -0,0 +1,64 @@
import { PageHeader } from "./components/index.js";
const FormsPreview = ({ widgetsFor, widgetFor, entry }) => {
return [
PageHeader(entry),
h(
"section",
{ className: "section-sm" },
h(
"div",
{ className: "container" },
h(
"div",
{ className: "row" },
h(
"div",
{ className: "col-12" },
h("h2", { className: "section-title" }, entry.data.title)
)
),
h(
"div",
{ className: "row" },
h(
"div",
{ className: "col-12 content" },
widgetsFor("files").map((file) =>
h(
"div",
{ className: "container mb-0" },
h(
"div",
{
className:
"card border-primary rounded-0 hover-shadow mb-5",
},
h(
"div",
{ className: "card-body mb-0" },
h("h4", { className: "card-title" }, file.data.title),
h(
"a",
{
className:
"text-decoration-none btn btn-primary btn-sm mb-0",
},
h("i", {
className: "mdi mdi-tray-arrow-down mb-0 me-2",
}),
"Download"
)
)
)
)
),
widgetFor("body")
)
)
)
),
];
};
export default FormsPreview;

View File

@ -0,0 +1,127 @@
import {
Col12,
Container,
PageHeader,
Row,
Section,
} from "./components/index.js";
const GanztagPreview = ({
widgetFor,
widgetsFor,
entry,
fields,
collection,
}) => {
const imageField = useMemo(() => {
return fields.find((field) => field.name === "image");
}, [fields]);
const imageUrl = useMediaAsset(
entry.data.image,
collection,
imageField,
entry
);
return [
PageHeader(entry),
Section(
Container([
Row(
h(
"div",
{ className: "col-12 mb-4" },
h("img", { className: "img-fluid w-100", src: imageUrl })
)
),
h("h2", {}, entry.data.title),
h(
"div",
{ className: "row align-items-center mb-4" },
Col12(
Row([
h(
"div",
{ className: "col-lg-3 col-sm-6 mb-3 mb-sm-0" },
h(
"div",
{ className: "d-flex align-items-center" },
h("i", {
className:
"mdi mdi-calendar-today-outline text-primary icon-md me-2",
}),
h(
"div",
{ className: "text-start" },
h("h6", { className: "mb-0" }, "ZEIT"),
h("p", { className: "mb-0" }, entry.data.schedule)
)
)
),
h(
"div",
{ className: "col-lg-3 col-sm-6 mb-3 mb-sm-0" },
h(
"div",
{ className: "d-flex align-items-center" },
h("i", {
className: "mdi mdi-timer-sand text-primary icon-md me-2",
}),
h(
"div",
{ className: "text-start" },
h("h6", { className: "mb-0" }, "DAUER"),
h("p", { className: "mb-0" }, entry.data.duration)
)
)
),
h(
"div",
{ className: "col-lg-3 col-sm-6 mb-3 mb-sm-0" },
h(
"div",
{ className: "d-flex align-items-center" },
h("i", {
className: "mdi mdi-crowd text-primary icon-md me-2",
}),
h(
"div",
{ className: "text-start" },
h("h6", { className: "mb-0" }, "KLASSE(N)"),
h("p", { className: "mb-0" }, entry.data.class)
)
)
),
h(
"div",
{ className: "col-lg-3 col-sm-6 mb-3 mb-sm-0" },
h(
"div",
{ className: "d-flex align-items-center" },
h("i", {
className:
"mdi mdi-map-marker-radius-outline text-primary icon-md me-2",
}),
h(
"div",
{ className: "text-start" },
h("h6", { className: "mb-0" }, "RAUM"),
h("p", { className: "mb-0" }, entry.data.room)
)
)
),
])
),
h(
"div",
{ className: "col-12 mt-4" },
h("div", { className: "border-bottom border-primary" })
)
),
Row(h("div", { className: "col-12 content" }, widgetFor("body"))),
])
),
];
};
export default GanztagPreview;

View File

@ -0,0 +1,5 @@
import { PageHeader } from "./components/index.js";
const HeaderPreview = ({ entry }) => PageHeader(entry);
export default HeaderPreview;

View File

@ -0,0 +1,40 @@
import AboutPreview from "./about-preview.js";
import BlogPreview from "./blog-preview.js";
import ContestPreview from "./contest-preview.js";
import GanztagPreview from "./ganztag-preview.js";
import PagePreview from "./page-preview.js";
import EventPreview from "./event-preview.js";
import AnmeldungPreview from "./anmeldung-preview.js";
import HeaderPreview from "./header-preview.js";
import ChronikPreview from "./chronik-preview.js";
import KontaktPreview from "./kontakt-preview.js";
import AnmeldeformularPreview from "./anmeldeformular-preview.js";
import ChronikIndexPreview from "./chronik-index-preview.js";
import AuthorPreview from "./author-preview.js";
import FormsPreview from "./forms-preview.js";
import CantorpreisPreview from "./cantorpreis-preview.js";
import ProjektwochePreview from "./projektwoche-preview.js";
import AbiturientenPreview from "./abiturienten-preview.js";
import PreviewStyles from "./styles.js";
export {
AboutPreview,
BlogPreview,
ContestPreview,
GanztagPreview,
PagePreview,
EventPreview,
AnmeldungPreview,
HeaderPreview,
ChronikPreview,
KontaktPreview,
AnmeldeformularPreview,
ChronikIndexPreview,
AuthorPreview,
FormsPreview,
CantorpreisPreview,
ProjektwochePreview,
AbiturientenPreview,
PreviewStyles,
};

View File

@ -0,0 +1,98 @@
import { PageHeader } from "./components/index.js";
const KontaktPreview = ({ widgetsFor, entry }) => {
return [
PageHeader(entry),
h(
"section",
{ className: "section-sm bg-gray" },
h(
"div",
{ className: "container" },
h(
"div",
{ className: "row" },
h(
"div",
{ className: "col-lg-6 mb-4 mb-lg-0" },
h(
"form",
{},
h("input", {
className: "form-control form-control-lg mb-3",
type: "text",
placeholder: "Ihr Name",
}),
h("input", {
className: "form-control form-control-lg mb-3",
type: "text",
placeholder: "Ihre E-Mail Adresse",
}),
h("input", {
className: "form-control form-control-lg mb-3",
type: "text",
placeholder: "Betreff",
}),
h("textarea", {
className: "form-control form-control-lg mb-3",
placeholder: "Nachricht",
}),
h("button", { className: "btn btn-primary" }, "Senden")
)
),
h(
"div",
{ className: "col-lg-6" },
h(
"div",
{ className: "card" },
h("div", { className: "card-header fw-bold" }, "Kontaktdaten"),
h(
"ul",
{ className: "list-group list-group-flush" },
widgetsFor("kontaktdaten").map((person) =>
h(
"li",
{ className: "list-group-item" },
h("p", { className: "card-title mb-0" }, person.data.name),
h(
"p",
{ className: "text-muted mb-0" },
person.data.position
),
h(
"p",
{ className: "card-text" },
h("i", {
className: "mdi mdi-email-multiple-outline me-2",
}),
person.data.email.replace("@", "(at)")
)
)
),
h(
"li",
{ className: "list-group-item" },
h(
"p",
{ className: "card-text" },
h("i", { className: "mdi mdi-phone-outline me-2" }),
"Telefon: +49-0345/6903156"
),
h(
"p",
{ className: "card-text" },
h("i", { className: "mdi mdi-fax me-2" }),
"Fax: +49-0345/6903157"
)
)
)
)
)
)
)
),
];
};
export default KontaktPreview;

View File

@ -0,0 +1,26 @@
import { PageHeader } from "./components/index.js";
const PagePreview = ({ widgetFor, entry }) => {
return [
PageHeader(entry),
h(
"section",
{ className: "section-sm" },
h(
"div",
{ className: "container" },
h(
"div",
{ className: "row" },
h(
"div",
{ className: "col-12" },
h("div", { className: "content" }, widgetFor("body"))
)
)
)
),
];
};
export default PagePreview;

View File

@ -0,0 +1,55 @@
import { Container, PageHeader, Row, Section } from "./components/index.js";
const ProjektwochePreview = ({ widgetsFor, widgetFor, entry }) => {
return [
PageHeader(entry),
Section([
Container(
Row(h("div", { className: "col-12 mb-4 content" }, widgetFor("body")))
),
Container(
Row([
widgetsFor("tiles").map((tile) =>
h(
"div",
{ className: "col-lg-4 col-sm-6" },
h(
"div",
{
className: "card border-primary rounded-0 hover-shadow mb-4",
},
h(
"div",
{
className: "container fb-tile-color",
style: { backgroundColor: tile.data.bg_color },
},
h("i", {
className: (tile.data.icon ?? "") + " fb-tile-icon",
style: { color: tile.data.font_color },
})
),
h(
"div",
{ className: "card-body" },
h(
"h4",
{ className: "card-title text-truncate" },
tile.data.title
),
h(
"button",
{ type: "button", className: "btn btn-primary btn-sm" },
"Mehr anzeigen"
)
)
)
)
),
])
),
]),
];
};
export default ProjektwochePreview;

View File

@ -0,0 +1,8 @@
const PreviewStyles = [
"https://assets.cantorgymnasium.de/bootstrap/v5/css/bootstrap.min.css",
"https://assets.cantorgymnasium.de/fonts/fira/fira.css",
"https://assets.cantorgymnasium.de/fonts/mdi/v7/css/materialdesignicons.min.css",
"https://cantorgymnasium.de/scss/style.css",
];
export default PreviewStyles;

View File

@ -0,0 +1,67 @@
import { Card, TextField } from "./components/index.js";
const AudioShortcode = {
label: "Audiodatei",
openTag: "{{< ",
closeTag: " >}}",
separator: " ",
toProps: (args) => {
if (args.length > 0) {
const src =
args
.find((arg) => arg.startsWith("src="))
?.split("=")[1]
.replaceAll('"', "") ?? "";
return { src: src };
}
return { src: "" };
},
toArgs: ({ src }) => {
return [`src=\"${src}\"`];
},
control: ({ src, onChange, controlProps }) => {
const { collection, field } = controlProps;
const handleChange = ({ path }) => {
onChange({ src: path });
};
const handleOpenMediaLibrary = useMediaInsert(
src,
{ collection, field },
handleChange
);
return Card([
TextField({
label: "Audiodatei",
value: src,
onChange: (event) => {
onChange({ src: event.target.value });
},
}),
h(
"span",
{ key: "audio-button", className: "flex gap-2 pt-2 px-2" },
h(
"button",
{
type: "button",
onClick: handleOpenMediaLibrary,
className: "btn btn-contained-primary",
},
"wählen"
)
),
]);
},
preview: ({ src }) => {
return h(
"div",
{ className: "card" },
h("audio", { src: src, controls: true })
);
},
};
export default AudioShortcode;

View File

@ -0,0 +1,75 @@
import { Card, TextField } from "./components/index.js";
const CardShortcode = {
label: "Link-Karte",
openTag: "{{< ",
closeTag: " >}}",
separator: " ",
toProps: (args) => {
if (args.length > 0) {
var title = "";
var link = "";
const linkIndex = args.findIndex((arg) => arg.startsWith('link="'));
const titleIndex = args.findIndex((arg) => arg.startsWith('title="'));
for (let arg of args.slice(titleIndex, linkIndex)) {
title += " " + arg.replaceAll("title=", "").replaceAll('"', "");
}
for (let arg of args.slice(linkIndex)) {
link += " " + arg.replaceAll("link=", "").replaceAll('"', "");
}
return { title: title.trim(), link: link.trim() };
}
return { title: "", link: "" };
},
toArgs: ({ title, link }) => {
return [`title=\"${title}\"`, `link=\"${link}\"`];
},
control: ({ title, link, onChange }) => {
return Card([
TextField({
label: "Titel",
value: title,
onChange: (event) => {
onChange({ title: event.target.value, link });
},
}),
TextField({
label: "Link",
value: link,
onChange: (event) => {
onChange({ title, link: event.target.value });
},
}),
]);
},
preview: ({ title, link }) => {
return h(
"div",
{ className: "container mb-0" },
h(
"div",
{ className: "card border-primary rounded-0 hover-shadow mb-5" },
h(
"div",
{ className: "card-body mb-0" },
h(
"h4",
{ className: "card-title" },
h("a", { className: "text-decoration-none", href: link }, title)
),
h(
"a",
{
className: "mb-0 btn btn-primary btn-sm text-decoration-none",
href: link,
},
"Mehr anzeigen"
)
)
)
);
},
};
export default CardShortcode;

View File

@ -0,0 +1,12 @@
const Card = (child, opts = { vertical: false }) =>
h(
"span",
{
className:
"relative flex border border-slate-400 focus-within:border-blue-800 dark:focus-within:border-blue-100 focus-within:bg-slate-100 dark:focus-within:bg-slate-800 hover:bg-slate-100 dark:hover:bg-slate-800 pb-3 cursor-text group/active" +
(opts.vertical ? " flex-col" : ""),
},
child
);
export default Card;

View File

@ -0,0 +1,41 @@
const Image = ({ label, assetSource, handleOpenMediaLibrary }) =>
h(
"span",
{ className: "flex flex-col w-full" },
h(
"label",
{
className:
"w-full flex text-xs font-bold dark:font-semibold group-focus-within/active:text-blue-500 group-hover/active:text-blue-500 cursor-text text-slate-500 dark:text-slate-400 px-3 pt-3",
},
label
),
h(
"span",
{ className: "flex flex-col gap-2 px-3 pt-2" },
h(
"span",
{},
h("img", {
role: "presentation",
src: assetSource,
className: "object-cover max-w-full overflow-hidden",
})
),
h(
"span",
{ className: "flex gap-2" },
h(
"button",
{
type: "button",
onClick: handleOpenMediaLibrary,
className: "btn btn-contained-primary",
},
"Bild auswählen"
)
)
)
);
export default Image;

View File

@ -0,0 +1,5 @@
import Card from "./card.js";
import TextField from "./text-field.js";
import Image from "./image.js";
export { Card, TextField, Image };

View File

@ -0,0 +1,21 @@
const TextField = ({ label, value, onChange }) =>
h(
"span",
{ key: "text-" + label, className: "flex flex-col w-full" },
h(
"label",
{
className:
"w-full flex text-xs font-bold dark:font-semibold group-focus-within/active:text-blue-500 group-hover/active:text-blue-500 cursor-text text-slate-500 dark:text-slate-400 px-3 pt-3",
},
label
),
h("input", {
className:
"MuiInout-Input w-full h-6 px-3 bg-transparent outline-none text-sm font-medium text-gray-900 dark:text-gray-100 cursor-default",
value,
onChange,
})
);
export default TextField;

View File

@ -0,0 +1,76 @@
import { Card, TextField } from "./components/index.js";
const DownloadShortcode = {
label: "Download-Karte",
openTag: "{{< ",
closeTag: " >}}",
separator: " ",
toProps: (args) => {
if (args.length > 0) {
var title = "";
var link = "";
const linkIndex = args.findIndex((arg) => arg.startsWith('link="'));
const titleIndex = args.findIndex((arg) => arg.startsWith('title="'));
for (let arg of args.slice(titleIndex, linkIndex)) {
title += " " + arg.replaceAll("title=", "").replaceAll('"', "");
}
for (let arg of args.slice(linkIndex)) {
link += " " + arg.replaceAll("link=", "").replaceAll('"', "");
}
return { title: title.trim(), link: link.trim() };
}
return { title: "", link: "" };
},
toArgs: ({ title, link }) => {
return [`title=\"${title}\"`, `link=\"${link}\"`];
},
control: ({ title, link, onChange }) => {
return Card([
TextField({
label: "Titel",
value: title,
onChange: (event) => {
onChange({ title: event.target.value, link });
},
}),
TextField({
label: "Download-Link",
value: link,
onChange: (event) => {
onChange({ title, link: event.target.value });
},
}),
]);
},
preview: ({ title, link }) => {
return h(
"div",
{ className: "container mb-0" },
h(
"div",
{ className: "card border-primary rounded-0 hover-shadow mb-5" },
h(
"div",
{ className: "card-body mb-0" },
h(
"h4",
{ className: "card-title" },
h("a", { className: "text-decoration-none", href: link }, title)
),
h(
"a",
{
className: "mb-0 btn btn-primary btn-sm text-decoration-none",
href: link,
},
h("i", { className: "mdi mdi-tray-arrow-down mb-0 me-2" }),
"Download"
)
)
)
);
},
};
export default DownloadShortcode;

View File

@ -0,0 +1,73 @@
import { Card, TextField } from "./components/index.js";
const GalleryShortcode = {
label: "Bildergallerie",
openTag: "{{< ",
closeTag: " >}}",
separator: " ",
toProps: (args) => {
if (args.length > 0) {
return {
dir:
args
.find((arg) => arg.startsWith("dir="))
?.split("=")[1]
.replaceAll('"', "") ?? "",
};
}
return { dir: "" };
},
toArgs: ({ dir }) => {
return [`dir=\"${dir}\"`];
},
control: ({ dir, onChange, controlProps }) => {
const { collection, field } = controlProps;
const handleChange = ({ path }) => {
onChange({ dir: path });
};
const handleOpenMediaLibrary = useMediaInsert(
dir,
{ collection, field, forFolder: true },
handleChange
);
return Card([
TextField({
label: "Gallerie-Ordner",
value: dir,
onChange: (event) => {
onChange({ dir: event.target.value });
},
}),
h(
"span",
{ key: "gallery-button", className: "flex gap-2 pt-2 px-2" },
h(
"button",
{
type: "button",
onClick: handleOpenMediaLibrary,
className: "btn btn-contained-primary",
},
"wählen"
)
),
]);
},
preview: ({ dir }) => {
return h(
"div",
{ className: "card mb-4" },
h(
"div",
{ className: "card-body mb-0" },
h("div", { className: "card-title h4" }, "Gallerie-Ordner"),
h("div", { className: "card-text" }, dir)
)
);
},
};
export default GalleryShortcode;

View File

@ -0,0 +1,64 @@
import { Card, Image } from "./components/index.js";
import { md5 } from "../previews/page-previews/components/index.js";
const ImageShortcode = {
label: "Bild",
openTag: "{{< ",
closeTag: " >}}",
separator: " ",
toProps: (args) => {
if (args.length > 0) {
return {
src:
args
.find((arg) => arg.startsWith("src="))
?.split("=")[1]
.replaceAll('"', "") ?? "",
};
}
return { src: "" };
},
toArgs: ({ src }) => {
return [`src=\"${src}\"`];
},
control: ({ src, onChange, controlProps }) => {
const { collection, field, entry } = controlProps;
const handleChange = ({ path }) => {
onChange({ src: path });
};
const handleOpenMediaLibrary = useMediaInsert(
src,
{ collection, field },
handleChange
);
const assetSource = useMediaAsset(src, collection, field, entry);
return Card(
Image({
label: "Bild",
assetSource,
handleOpenMediaLibrary,
})
);
},
preview: ({ src }) => {
return h(
"div",
{ className: "col-lg-3 col-md-4 col-sm-6" },
h(
"a",
{ className: "vb-gallery", "data-gall": md5(src) },
h("img", {
className: "img-thumbnail w-100 h-100",
style: { objectFit: "cover" },
src,
})
)
);
},
};
export default ImageShortcode;

View File

@ -0,0 +1,17 @@
import GalleryShortcode from "./gallery.js";
import ImageShortcode from "./image.js";
import DownloadShortcode from "./download.js";
import CardShortcode from "./card.js";
import YoutubeShortcode from "./youtube.js";
import AudioShortcode from "./audio.js";
import SliderShortcode from "./slider.js";
export {
GalleryShortcode,
ImageShortcode,
DownloadShortcode,
CardShortcode,
YoutubeShortcode,
AudioShortcode,
SliderShortcode,
};

View File

@ -0,0 +1,73 @@
import { Card, TextField } from "./components/index.js";
const SliderShortcode = {
label: "Bilderkarussell",
openTag: "{{< ",
closeTag: " >}}",
separator: " ",
toProps: (args) => {
if (args.length > 0) {
return {
dir:
args
.find((arg) => arg.startsWith("dir="))
?.split("=")[1]
.replaceAll('"', "") ?? "",
};
}
return { dir: "" };
},
toArgs: ({ dir }) => {
return [`dir=\"${dir}\"`];
},
control: ({ dir, onChange, controlProps }) => {
const { collection, field } = controlProps;
const handleChange = ({ path }) => {
onChange({ dir: path });
};
const handleOpenMediaLibrary = useMediaInsert(
dir,
{ collection, field, forFolder: true },
handleChange
);
return Card([
TextField({
label: "Bilderkarussell",
value: dir,
onChange: (event) => {
onChange({ dir: event.target.value });
},
}),
h(
"span",
{ key: "slider-button", className: "flex gap-2 pt-2 px-2" },
h(
"button",
{
type: "button",
onClick: handleOpenMediaLibrary,
className: "btn btn-contained-primary",
},
"wählen"
)
),
]);
},
preview: ({ dir }) => {
return h(
"div",
{ className: "card mb-4" },
h(
"div",
{ className: "card-body mb-0" },
h("div", { className: "card-title h4" }, "Bilderkarussell"),
h("div", { className: "card-text" }, dir)
)
);
},
};
export default SliderShortcode;

View File

@ -0,0 +1,59 @@
import { Card, TextField } from "./components/index.js";
const YoutubeShortcode = {
label: "YouTube-Video",
openTag: "{{< ",
closeTag: " >}}",
separator: " ",
toProps: (args) => {
if (args.length > 0) {
return { src: args[0] };
}
return { src: "" };
},
toArgs: ({ src }) => {
return [src];
},
control: ({ src, onChange }) => {
return Card(
[
TextField({
label: "YouTube-Video-ID",
value: src,
onChange: (event) => {
onChange({ src: event.target.value });
},
}),
h(
"iframe",
{
width: "100%",
height: "360",
src: `https://piped.kavin.rocks/embed/${src}`,
className: "px-3 pt-3",
},
""
),
],
{ vertical: true }
);
},
preview: ({ src }) => {
return h(
"span",
{},
h(
"iframe",
{
width: "420",
height: "315",
src: `https://piped.kavin.rocks/embed/${src}`,
},
""
)
);
},
};
export default YoutubeShortcode;