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:
		| @@ -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
									
								
							
							
						
						
									
										37
									
								
								static/admin/icons.js
									
									
									
									
									
										Normal 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
											
										
									
								
							
							
								
								
									
										5
									
								
								static/admin/links/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								static/admin/links/index.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| import StatusPage from "./status.js"; | ||||
|  | ||||
| import WikiLink from "./wiki.js"; | ||||
|  | ||||
| export { StatusPage, WikiLink }; | ||||
							
								
								
									
										17
									
								
								static/admin/links/status.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								static/admin/links/status.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										10
									
								
								static/admin/links/wiki.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								static/admin/links/wiki.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| const WikiLink = { | ||||
| 	id: "wiki", | ||||
| 	title: "GCG.Wiki", | ||||
| 	data: "https://wiki.cantorgymnasium.de", | ||||
| 	options: { | ||||
| 		icon: "help", | ||||
| 	}, | ||||
| }; | ||||
|  | ||||
| export default WikiLink; | ||||
							
								
								
									
										5
									
								
								static/admin/previews/field-previews/body-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								static/admin/previews/field-previews/body-preview.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| import { truncate } from "./components/index.js"; | ||||
|  | ||||
| const BodyPreview = ({ value }) => h("p", {}, truncate(value ?? "", 50)); | ||||
|  | ||||
| export default BodyPreview; | ||||
							
								
								
									
										6
									
								
								static/admin/previews/field-previews/boolean-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								static/admin/previews/field-previews/boolean-preview.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| const BooleanPreview = ({ value }) => | ||||
| 	h("i", { | ||||
| 		className: value ? "mdi mdi-check" : "mdi mdi-close", | ||||
| 	}); | ||||
|  | ||||
| export default BooleanPreview; | ||||
							
								
								
									
										3
									
								
								static/admin/previews/field-previews/components/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								static/admin/previews/field-previews/components/index.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| import truncate from "./truncate.js"; | ||||
|  | ||||
| export { truncate }; | ||||
| @@ -0,0 +1,9 @@ | ||||
| function truncate(str, num) { | ||||
| 	if (str.length > num) { | ||||
| 		return str.slice(0, num) + "..."; | ||||
| 	} else { | ||||
| 		return str; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| export default truncate; | ||||
							
								
								
									
										3
									
								
								static/admin/previews/field-previews/count-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								static/admin/previews/field-previews/count-preview.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| const CountPreview = ({ value }) => (value ? value.length : 0); | ||||
|  | ||||
| export default CountPreview; | ||||
							
								
								
									
										11
									
								
								static/admin/previews/field-previews/date-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								static/admin/previews/field-previews/date-preview.js
									
									
									
									
									
										Normal 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)) | ||||
| 	); | ||||
							
								
								
									
										21
									
								
								static/admin/previews/field-previews/draft-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								static/admin/previews/field-previews/draft-preview.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										13
									
								
								static/admin/previews/field-previews/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								static/admin/previews/field-previews/index.js
									
									
									
									
									
										Normal 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, | ||||
| }; | ||||
							
								
								
									
										32
									
								
								static/admin/previews/page-previews/abiturienten-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								static/admin/previews/page-previews/abiturienten-preview.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										64
									
								
								static/admin/previews/page-previews/about-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								static/admin/previews/page-previews/about-preview.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										159
									
								
								static/admin/previews/page-previews/anmeldeformular-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								static/admin/previews/page-previews/anmeldeformular-preview.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										44
									
								
								static/admin/previews/page-previews/anmeldung-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								static/admin/previews/page-previews/anmeldung-preview.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										72
									
								
								static/admin/previews/page-previews/author-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								static/admin/previews/page-previews/author-preview.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										89
									
								
								static/admin/previews/page-previews/blog-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								static/admin/previews/page-previews/blog-preview.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										49
									
								
								static/admin/previews/page-previews/cantorpreis-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								static/admin/previews/page-previews/cantorpreis-preview.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										113
									
								
								static/admin/previews/page-previews/chronik-index-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								static/admin/previews/page-previews/chronik-index-preview.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										78
									
								
								static/admin/previews/page-previews/chronik-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								static/admin/previews/page-previews/chronik-preview.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										8
									
								
								static/admin/previews/page-previews/components/base.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								static/admin/previews/page-previews/components/base.js
									
									
									
									
									
										Normal 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 }; | ||||
| @@ -0,0 +1,5 @@ | ||||
| const DateFormat = ({ date, format }) => { | ||||
| 	return new Intl.DateTimeFormat("de-DE", format).format(new Date(date)); | ||||
| }; | ||||
|  | ||||
| export default DateFormat; | ||||
							
								
								
									
										6
									
								
								static/admin/previews/page-previews/components/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								static/admin/previews/page-previews/components/index.js
									
									
									
									
									
										Normal 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 }; | ||||
							
								
								
									
										5
									
								
								static/admin/previews/page-previews/components/md5.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								static/admin/previews/page-previews/components/md5.js
									
									
									
									
									
										Normal 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; | ||||
| @@ -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; | ||||
							
								
								
									
										67
									
								
								static/admin/previews/page-previews/contest-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								static/admin/previews/page-previews/contest-preview.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										147
									
								
								static/admin/previews/page-previews/event-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								static/admin/previews/page-previews/event-preview.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										64
									
								
								static/admin/previews/page-previews/forms-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								static/admin/previews/page-previews/forms-preview.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										127
									
								
								static/admin/previews/page-previews/ganztag-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								static/admin/previews/page-previews/ganztag-preview.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										5
									
								
								static/admin/previews/page-previews/header-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								static/admin/previews/page-previews/header-preview.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| import { PageHeader } from "./components/index.js"; | ||||
|  | ||||
| const HeaderPreview = ({ entry }) => PageHeader(entry); | ||||
|  | ||||
| export default HeaderPreview; | ||||
							
								
								
									
										40
									
								
								static/admin/previews/page-previews/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								static/admin/previews/page-previews/index.js
									
									
									
									
									
										Normal 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, | ||||
| }; | ||||
							
								
								
									
										98
									
								
								static/admin/previews/page-previews/kontakt-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								static/admin/previews/page-previews/kontakt-preview.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										26
									
								
								static/admin/previews/page-previews/page-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								static/admin/previews/page-previews/page-preview.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										55
									
								
								static/admin/previews/page-previews/projektwoche-preview.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								static/admin/previews/page-previews/projektwoche-preview.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										8
									
								
								static/admin/previews/page-previews/styles.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								static/admin/previews/page-previews/styles.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										67
									
								
								static/admin/shortcodes/audio.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								static/admin/shortcodes/audio.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										75
									
								
								static/admin/shortcodes/card.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								static/admin/shortcodes/card.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										12
									
								
								static/admin/shortcodes/components/card.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								static/admin/shortcodes/components/card.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										41
									
								
								static/admin/shortcodes/components/image.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								static/admin/shortcodes/components/image.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										5
									
								
								static/admin/shortcodes/components/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								static/admin/shortcodes/components/index.js
									
									
									
									
									
										Normal 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 }; | ||||
							
								
								
									
										21
									
								
								static/admin/shortcodes/components/text-field.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								static/admin/shortcodes/components/text-field.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										76
									
								
								static/admin/shortcodes/download.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								static/admin/shortcodes/download.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										73
									
								
								static/admin/shortcodes/gallery.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								static/admin/shortcodes/gallery.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										64
									
								
								static/admin/shortcodes/image.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								static/admin/shortcodes/image.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										17
									
								
								static/admin/shortcodes/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								static/admin/shortcodes/index.js
									
									
									
									
									
										Normal 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, | ||||
| }; | ||||
							
								
								
									
										73
									
								
								static/admin/shortcodes/slider.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								static/admin/shortcodes/slider.js
									
									
									
									
									
										Normal 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; | ||||
							
								
								
									
										59
									
								
								static/admin/shortcodes/youtube.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								static/admin/shortcodes/youtube.js
									
									
									
									
									
										Normal 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; | ||||
		Reference in New Issue
	
	Block a user