CMS refactor
This commit is contained in:
		
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -2,53 +2,55 @@ import { MarkdownProps } from "../props.js"; | ||||
| import { DraftBoolean, Title } from "./widgets.js"; | ||||
|  | ||||
| const AbiturientenCollection = { | ||||
|     name: "abiturienten", | ||||
|     label: "Abiturienten", | ||||
|     label_singular: "Abiturjahrgang", | ||||
|     description: "Hier kann die Übersicht der Abiturjahrgänge bearbeitet werden. Dieser Bereich wird von der Schulchronik verwaltet.", | ||||
|     icon: "graduation-cap", | ||||
|     folder: "content/german/abiturienten", | ||||
|     filter: { | ||||
|         field: "type", | ||||
|         value: "abiturienten" | ||||
|   name: "abiturienten", | ||||
|   label: "Abiturienten", | ||||
|   label_singular: "Abiturjahrgang", | ||||
|   description: | ||||
|     "Hier kann die Übersicht der Abiturjahrgänge bearbeitet werden. Dieser Bereich wird von der Schulchronik verwaltet.", | ||||
|   icon: "graduation-cap", | ||||
|   folder: "content/german/abiturienten", | ||||
|   filter: { | ||||
|     field: "type", | ||||
|     value: "abiturienten", | ||||
|   }, | ||||
|   create: true, | ||||
|   editor: { | ||||
|     preview: true, | ||||
|     frame: true, | ||||
|     size: "half", | ||||
|   }, | ||||
|   summary_fields: ["title", "draft"], | ||||
|   sortable_fields: { | ||||
|     fields: ["title"], | ||||
|     default: { | ||||
|       field: "title", | ||||
|       direction: "Descending", | ||||
|     }, | ||||
|     create: true, | ||||
|     editor: { | ||||
|         preview: true, | ||||
|         frame: true | ||||
|   }, | ||||
|   fields: [ | ||||
|     Title(false), | ||||
|     DraftBoolean, | ||||
|     { | ||||
|       name: "image", | ||||
|       label: "Bild", | ||||
|       widget: "image", | ||||
|       default: "/media/image.webp", | ||||
|       required: false, | ||||
|     }, | ||||
|     summary_fields: ["title", "draft"], | ||||
|     sortable_fields: { | ||||
|         fields: ["title"], | ||||
|         default: { | ||||
|             field: "title", | ||||
|             direction: "Descending" | ||||
|         } | ||||
|     { | ||||
|       name: "type", | ||||
|       label: "Typ", | ||||
|       widget: "hidden", | ||||
|       default: "abiturienten", | ||||
|     }, | ||||
|     fields: [ | ||||
|         Title(false), | ||||
|         DraftBoolean, | ||||
|         { | ||||
|             name: "image", | ||||
|             label: "Bild", | ||||
|             widget: "image", | ||||
|             default: "/media/image.webp", | ||||
|             required: false | ||||
|         }, | ||||
|         { | ||||
|             name: "type", | ||||
|             label: "Typ", | ||||
|             widget: "hidden", | ||||
|             default: "abiturienten" | ||||
|         }, | ||||
|         { | ||||
|             name: "body", | ||||
|             label: "Text", | ||||
|             widget: "markdown", | ||||
|             required: false, | ||||
|             ...MarkdownProps | ||||
|         } | ||||
|     ] | ||||
|     { | ||||
|       name: "body", | ||||
|       label: "Text", | ||||
|       widget: "markdown", | ||||
|       required: false, | ||||
|       ...MarkdownProps, | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export default AbiturientenCollection; | ||||
| export default AbiturientenCollection; | ||||
|   | ||||
							
								
								
									
										100
									
								
								static/admin/config/collections/author.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								static/admin/config/collections/author.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | ||||
| import { MarkdownProps, PatternEmail } from "../props.js"; | ||||
| import { DescriptionText } from "./widgets.js"; | ||||
|  | ||||
| const AuthorCollection = { | ||||
|   name: "author", | ||||
|   label: "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.Autoren können einem Blogartikel zugewiesen werden.", | ||||
|   icon: "user", | ||||
|   folder: "content/german/author", | ||||
|   create: true, | ||||
|   editor: { | ||||
|     preview: true, | ||||
|     frame: true, | ||||
|     size: "half", | ||||
|   }, | ||||
|   filter: { | ||||
|     field: "type", | ||||
|     value: "author", | ||||
|   }, | ||||
|   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: [ | ||||
|     { | ||||
|       name: "title", | ||||
|       label: "Name", | ||||
|       widget: "string", | ||||
|       required: true, | ||||
|     }, | ||||
|     DescriptionText, | ||||
|     { | ||||
|       name: "email", | ||||
|       label: "E-Mail-Adresse", | ||||
|       widget: "string", | ||||
|       required: false, | ||||
|       ...PatternEmail, | ||||
|     }, | ||||
|     { | ||||
|       name: "image", | ||||
|       label: "Bild", | ||||
|       widget: "image", | ||||
|       required: false, | ||||
|       default: "/media/authors/gcg.webp", | ||||
|     }, | ||||
|     { | ||||
|       name: "simplified", | ||||
|       label: "vereinfacht", | ||||
|       widget: "boolean", | ||||
|       required: false, | ||||
|     }, | ||||
|     { | ||||
|       name: "active", | ||||
|       label: "aktiv", | ||||
|       widget: "boolean", | ||||
|       required: false, | ||||
|       default: true, | ||||
|     }, | ||||
|     { | ||||
|       name: "body", | ||||
|       label: "Beschreibung", | ||||
|       widget: "markdown", | ||||
|       required: false, | ||||
|       ...MarkdownProps, | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export default AuthorCollection; | ||||
							
								
								
									
										62
									
								
								static/admin/config/collections/begabte.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								static/admin/config/collections/begabte.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| import { MarkdownProps } from "../props.js"; | ||||
| import { DescriptionText, DraftBoolean, Title } from "./widgets.js"; | ||||
|  | ||||
| const BegabteCollection = { | ||||
|   name: "begabte", | ||||
|   label: "Begabtenförderung", | ||||
|   label_singular: "Begabtenförderungsangebot", | ||||
|   description: | ||||
|     "Hier kann die Übersicht der Begabtenförderungsangebote bearbeitet werden.", | ||||
|   icon: "pi", | ||||
|   folder: "content/german/begabte", | ||||
|   create: true, | ||||
|   editor: { | ||||
|     preview: true, | ||||
|     frame: true, | ||||
|     size: "half", | ||||
|   }, | ||||
|   filter: { | ||||
|     field: "type", | ||||
|     value: "begabte", | ||||
|   }, | ||||
|   summary_fields: ["title", "draft", "body"], | ||||
|   fields: [ | ||||
|     Title(false), | ||||
|     DraftBoolean, | ||||
|     DescriptionText, | ||||
|     { | ||||
|       name: "image", | ||||
|       label: "Titelbild", | ||||
|       widget: "image", | ||||
|       required: true, | ||||
|       default: "/media/image.webp", | ||||
|     }, | ||||
|     { | ||||
|       name: "class", | ||||
|       label: "Klassenstufe(n)", | ||||
|       widget: "string", | ||||
|       required: true, | ||||
|     }, | ||||
|     { | ||||
|       name: "web_url", | ||||
|       label: "Website", | ||||
|       widget: "string", | ||||
|       required: false, | ||||
|     }, | ||||
|     { | ||||
|       name: "type", | ||||
|       label: "Typ", | ||||
|       widget: "hidden", | ||||
|       default: "begabte", | ||||
|     }, | ||||
|     { | ||||
|       name: "body", | ||||
|       label: "Inhalt", | ||||
|       widget: "markdown", | ||||
|       required: true, | ||||
|       ...MarkdownProps, | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export default BegabteCollection; | ||||
							
								
								
									
										114
									
								
								static/admin/config/collections/blog.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								static/admin/config/collections/blog.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | ||||
| import { DateFormat, MarkdownProps } from "../props.js"; | ||||
| import { DescriptionText, DraftBoolean, Title } from "./widgets.js"; | ||||
|  | ||||
| const BlogCollection = { | ||||
|   name: "blog", | ||||
|   label: "Aktuelles", | ||||
|   label_singular: "Artikel", | ||||
|   description: | ||||
|     'Diese Artikel werden im Bereich "Aktuelles" auf der Schulhomepage angezeigt. Sie können sowohl direkt veröffentlicht, als auch als Entwurf gespeichert werden.', | ||||
|   icon: "news", | ||||
|   folder: "content/german/blog", | ||||
|   create: true, | ||||
|   editor: { | ||||
|     preview: true, | ||||
|     frame: true, | ||||
|     size: "half", | ||||
|   }, | ||||
|   filter: { | ||||
|     field: "type", | ||||
|     value: "post", | ||||
|   }, | ||||
|   view_groups: [ | ||||
|     { | ||||
|       label: "Entwurf", | ||||
|       field: "draft", | ||||
|     }, | ||||
|   ], | ||||
|   sortable_fields: { | ||||
|     fields: ["date", "title"], | ||||
|     default: { | ||||
|       field: "date", | ||||
|       direction: "Descending", | ||||
|     }, | ||||
|   }, | ||||
|   summary_fields: ["date", "title", "draft", "author", "body"], | ||||
|   fields: [ | ||||
|     Title(false), | ||||
|     { | ||||
|       name: "date", | ||||
|       label: "Datum", | ||||
|       widget: "datetime", | ||||
|       required: true, | ||||
|       ...DateFormat, | ||||
|     }, | ||||
|     DraftBoolean, | ||||
|     DescriptionText, | ||||
|     { | ||||
|       name: "image", | ||||
|       label: "Titelbild", | ||||
|       widget: "image", | ||||
|       required: true, | ||||
|       default: "/media/image.webp", | ||||
|     }, | ||||
|     { | ||||
|       name: "author", | ||||
|       label: "Autor(en)", | ||||
|       hint: "Verwaltet im Autoren-Bereich. Mehrere Autoren werden in alphabetischer Reihenfolge aufgelistet.", | ||||
|       widget: "relation", | ||||
|       collection: "author", | ||||
|       value_field: "{{slug}}", | ||||
|       search_fields: ["{{title}}"], | ||||
|       display_fields: ["{{title}}"], | ||||
|       multiple: true, | ||||
|       required: true, | ||||
|     }, | ||||
|     { | ||||
|       name: "categories", | ||||
|       label: "Kategorien", | ||||
|       hint: "Verwaltet in den Einstellungen", | ||||
|       widget: "relation", | ||||
|       collection: "settings", | ||||
|       file: "data-categories", | ||||
|       value_field: "blog.*", | ||||
|       search_fields: ["blog.*"], | ||||
|       display_fields: ["blog.*"], | ||||
|       multiple: true, | ||||
|       required: true, | ||||
|     }, | ||||
|     { | ||||
|       name: "subjects", | ||||
|       label: "Fächer", | ||||
|       hint: "Verwaltet in den Einstellungen", | ||||
|       widget: "relation", | ||||
|       collection: "settings", | ||||
|       file: "data-categories", | ||||
|       value_field: "subjects.*", | ||||
|       search_fields: ["subjects.*"], | ||||
|       display_fields: ["subjects.*"], | ||||
|       multiple: true, | ||||
|       required: true, | ||||
|     }, | ||||
|     { | ||||
|       name: "tags", | ||||
|       label: "Tags", | ||||
|       widget: "list", | ||||
|       delimiter: ",", | ||||
|     }, | ||||
|     { | ||||
|       name: "type", | ||||
|       label: "Typ", | ||||
|       widget: "hidden", | ||||
|       default: "post", | ||||
|     }, | ||||
|     { | ||||
|       name: "body", | ||||
|       label: "Inhalt", | ||||
|       widget: "markdown", | ||||
|       required: true, | ||||
|       ...MarkdownProps, | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export default BlogCollection; | ||||
| @@ -2,70 +2,72 @@ import { MarkdownProps } from "../props.js"; | ||||
| import { DescriptionText, DraftBoolean, Title } from "./widgets.js"; | ||||
|  | ||||
| const CantorforaCollection = { | ||||
|     name: "cantorfora", | ||||
|     label: "Cantorfora", | ||||
|     label_singular: "Cantorforum", | ||||
|     description: "Hier kann die Übersicht der Cantorfora bearbeitet werden. Dieser Bereich wird von der Schulchronik verwaltet.", | ||||
|     icon: "presentation", | ||||
|     folder: "content/german/cantorfora", | ||||
|     filter: { | ||||
|         field: "type", | ||||
|         value: "cantorfora" | ||||
|   name: "cantorfora", | ||||
|   label: "Cantorfora", | ||||
|   label_singular: "Cantorforum", | ||||
|   description: | ||||
|     "Hier kann die Übersicht der Cantorfora bearbeitet werden. Dieser Bereich wird von der Schulchronik verwaltet.", | ||||
|   icon: "presentation", | ||||
|   folder: "content/german/cantorfora", | ||||
|   filter: { | ||||
|     field: "type", | ||||
|     value: "cantorfora", | ||||
|   }, | ||||
|   create: true, | ||||
|   editor: { | ||||
|     preview: true, | ||||
|     frame: true, | ||||
|     size: "half", | ||||
|   }, | ||||
|   view_groups: [ | ||||
|     { | ||||
|       label: "Entwürfe", | ||||
|       field: "draft", | ||||
|     }, | ||||
|     create: true, | ||||
|     editor: { | ||||
|         preview: true, | ||||
|         frame: true | ||||
|   ], | ||||
|   summary_fields: ["title", "draft", "description"], | ||||
|   sortable_fields: { | ||||
|     fields: ["index", "title"], | ||||
|     default: { | ||||
|       field: "index", | ||||
|       direction: "Descending", | ||||
|     }, | ||||
|     view_groups: [ | ||||
|         { | ||||
|             label: "Entwürfe", | ||||
|             field: "draft" | ||||
|         } | ||||
|     ], | ||||
|     summary_fields: ["title", "draft", "description"], | ||||
|     sortable_fields: { | ||||
|         fields: ['index', 'title'], | ||||
|         default: { | ||||
|             field: "index", | ||||
|             direction: "Descending" | ||||
|         } | ||||
|   }, | ||||
|   fields: [ | ||||
|     Title(false), | ||||
|     { | ||||
|       name: "index", | ||||
|       label: "Laufindex", | ||||
|       hint: "Nummer des Cantorforums", | ||||
|       widget: "number", | ||||
|       value_type: "int", | ||||
|       min: 1, | ||||
|       step: 1, | ||||
|       required: true, | ||||
|     }, | ||||
|     fields: [ | ||||
|         Title(false), | ||||
|         { | ||||
|             name: "index", | ||||
|             label: "Laufindex", | ||||
|             hint: "Nummer des Cantorforums", | ||||
|             widget: "number", | ||||
|             value_type: "int", | ||||
|             min: 1, | ||||
|             step: 1, | ||||
|             required: true | ||||
|         }, | ||||
|         DraftBoolean, | ||||
|         DescriptionText, | ||||
|         { | ||||
|             name: "image", | ||||
|             label: "Titelbild", | ||||
|             widget: "image", | ||||
|             default: "/media/image.webp", | ||||
|             required: true | ||||
|         }, | ||||
|         { | ||||
|             name: "type", | ||||
|             label: "Typ", | ||||
|             widget: "hidden", | ||||
|             default: "cantorfora" | ||||
|         }, | ||||
|         { | ||||
|             name: "body", | ||||
|             label: "Text", | ||||
|             widget: "markdown", | ||||
|             required: true, | ||||
|             ...MarkdownProps | ||||
|         } | ||||
|     ] | ||||
|     DraftBoolean, | ||||
|     DescriptionText, | ||||
|     { | ||||
|       name: "image", | ||||
|       label: "Titelbild", | ||||
|       widget: "image", | ||||
|       default: "/media/image.webp", | ||||
|       required: true, | ||||
|     }, | ||||
|     { | ||||
|       name: "type", | ||||
|       label: "Typ", | ||||
|       widget: "hidden", | ||||
|       default: "cantorfora", | ||||
|     }, | ||||
|     { | ||||
|       name: "body", | ||||
|       label: "Text", | ||||
|       widget: "markdown", | ||||
|       required: true, | ||||
|       ...MarkdownProps, | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export default CantorforaCollection; | ||||
| export default CantorforaCollection; | ||||
|   | ||||
| @@ -2,65 +2,67 @@ import { MarkdownProps } from "../props.js"; | ||||
| import { DescriptionText, DraftBoolean } from "./widgets.js"; | ||||
|  | ||||
| const CantorpreisCollection = { | ||||
|     name: "cantorpreis", | ||||
|     label: "Cantorpreisträger", | ||||
|     description: "Hier sind alle Cantorpreisträger aufgelistet. Dieser Bereich wird von der Schulchronik verwaltet.", | ||||
|     icon: "award", | ||||
|     folder: "content/german/cantorpreis", | ||||
|     filter: { | ||||
|         field: "type", | ||||
|         value: "cantorpreis" | ||||
|   name: "cantorpreis", | ||||
|   label: "Cantorpreisträger", | ||||
|   description: | ||||
|     "Hier sind alle Cantorpreisträger aufgelistet. Dieser Bereich wird von der Schulchronik verwaltet.", | ||||
|   icon: "award", | ||||
|   folder: "content/german/cantorpreis", | ||||
|   filter: { | ||||
|     field: "type", | ||||
|     value: "cantorpreis", | ||||
|   }, | ||||
|   sortable_fields: { | ||||
|     fields: ["title", "name"], | ||||
|     default: { | ||||
|       field: "title", | ||||
|       direction: "Descending", | ||||
|     }, | ||||
|     sortable_fields: { | ||||
|         fields: ['title', 'name'], | ||||
|         default: { | ||||
|             field: "title", | ||||
|             direction: "Descending" | ||||
|         } | ||||
|   }, | ||||
|   summary: "{{title}} - {{name}}", | ||||
|   create: true, | ||||
|   editor: { | ||||
|     preview: true, | ||||
|     frame: true, | ||||
|     size: "half", | ||||
|   }, | ||||
|   summary_fields: ["title", "name", "draft", "body"], | ||||
|   fields: [ | ||||
|     { | ||||
|       name: "title", | ||||
|       label: "Jahr", | ||||
|       widget: "string", | ||||
|       required: true, | ||||
|     }, | ||||
|     summary: "{{title}} - {{name}}", | ||||
|     create: true, | ||||
|     editor: { | ||||
|         preview: true, | ||||
|         frame: true | ||||
|     { | ||||
|       name: "name", | ||||
|       label: "Name", | ||||
|       widget: "string", | ||||
|       required: true, | ||||
|     }, | ||||
|     summary_fields: ["title", "name", "draft", "body"], | ||||
|     fields: [ | ||||
|         { | ||||
|             name: "title", | ||||
|             label: "Jahr", | ||||
|             widget: "string", | ||||
|             required: true | ||||
|         }, | ||||
|         { | ||||
|             name: "name", | ||||
|             label: "Name", | ||||
|             widget: "string", | ||||
|             required: true | ||||
|         }, | ||||
|         DraftBoolean, | ||||
|         DescriptionText, | ||||
|         { | ||||
|             name: "image", | ||||
|             label: "Bild", | ||||
|             widget: "image", | ||||
|             default: "/media/image.webp", | ||||
|             required: false | ||||
|         }, | ||||
|         { | ||||
|             name: "type", | ||||
|             label: "Typ", | ||||
|             widget: "hidden", | ||||
|             default: "cantorpreis" | ||||
|         }, | ||||
|         { | ||||
|             name: "body", | ||||
|             label: "Text", | ||||
|             widget: "markdown", | ||||
|             required: false, | ||||
|             ...MarkdownProps | ||||
|         } | ||||
|     ] | ||||
|     DraftBoolean, | ||||
|     DescriptionText, | ||||
|     { | ||||
|       name: "image", | ||||
|       label: "Bild", | ||||
|       widget: "image", | ||||
|       default: "/media/image.webp", | ||||
|       required: false, | ||||
|     }, | ||||
|     { | ||||
|       name: "type", | ||||
|       label: "Typ", | ||||
|       widget: "hidden", | ||||
|       default: "cantorpreis", | ||||
|     }, | ||||
|     { | ||||
|       name: "body", | ||||
|       label: "Text", | ||||
|       widget: "markdown", | ||||
|       required: false, | ||||
|       ...MarkdownProps, | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export default CantorpreisCollection; | ||||
| export default CantorpreisCollection; | ||||
|   | ||||
| @@ -2,110 +2,111 @@ import { MarkdownProps } from "../props.js"; | ||||
| import { DraftBoolean, EnableBoolean } from "./widgets.js"; | ||||
|  | ||||
| const ChronikjahreCollection = { | ||||
|     name: "chronikjahre", | ||||
|     description: "Hier können die Chronikjahre bearbeitet werden. Dieser Bereich wird von der Schulchronik verwaltet.", | ||||
|     icon: "schulchronik", | ||||
|     label: "Chronikjahre", | ||||
|     label_singular: "Chronikjahr", | ||||
|     folder: "content/german/schulchronik", | ||||
|     filter: { | ||||
|         field: "type", | ||||
|         value: "schulchronik" | ||||
|   name: "chronikjahre", | ||||
|   description: | ||||
|     "Hier können die Chronikjahre bearbeitet werden. Dieser Bereich wird von der Schulchronik verwaltet.", | ||||
|   icon: "schulchronik", | ||||
|   label: "Chronikjahre", | ||||
|   label_singular: "Chronikjahr", | ||||
|   folder: "content/german/schulchronik", | ||||
|   filter: { | ||||
|     field: "type", | ||||
|     value: "schulchronik", | ||||
|   }, | ||||
|   create: true, | ||||
|   editor: { | ||||
|     preview: false, | ||||
|     size: "half", | ||||
|   }, | ||||
|   summary_fields: ["title", "draft", "cantorpreisträger", "topics"], | ||||
|   sortable_fields: { | ||||
|     fields: ["title"], | ||||
|     default: { | ||||
|       field: "title", | ||||
|       direction: "Descending", | ||||
|     }, | ||||
|     create: true, | ||||
|     editor: { | ||||
|         preview: false | ||||
|   }, | ||||
|   fields: [ | ||||
|     { | ||||
|       name: "title", | ||||
|       label: "Jahr", | ||||
|       widget: "string", | ||||
|     }, | ||||
|     summary_fields: ["title", "draft", "cantorpreisträger", "topics"], | ||||
|     sortable_fields: { | ||||
|         fields: ['title'], | ||||
|         default: { | ||||
|             field: "title", | ||||
|             direction: "Descending" | ||||
|         } | ||||
|     DraftBoolean, | ||||
|     { | ||||
|       name: "type", | ||||
|       label: "Typ", | ||||
|       widget: "hidden", | ||||
|       default: "schulchronik", | ||||
|     }, | ||||
|     fields: [ | ||||
|     { | ||||
|       name: "pretext", | ||||
|       label: "Einleitung", | ||||
|       hint: "Text für die Jahreszahl", | ||||
|       widget: "markdown", | ||||
|       required: false, | ||||
|       ...MarkdownProps, | ||||
|     }, | ||||
|     { | ||||
|       name: "topics", | ||||
|       label: "Kreative Haufen", | ||||
|       label_singular: "Haufen", | ||||
|       widget: "list", | ||||
|       required: false, | ||||
|       collapsed: true, | ||||
|       fields: [ | ||||
|         { | ||||
|             name: "title", | ||||
|             label: "Jahr", | ||||
|             widget: "string" | ||||
|         }, | ||||
|         DraftBoolean, | ||||
|         { | ||||
|             name: "type", | ||||
|             label: "Typ", | ||||
|             widget: "hidden", | ||||
|             default: "schulchronik" | ||||
|           name: "title", | ||||
|           label: "Titel", | ||||
|           widget: "string", | ||||
|           required: true, | ||||
|         }, | ||||
|         { | ||||
|             name: "pretext", | ||||
|             label: "Einleitung", | ||||
|             hint: "Text für die Jahreszahl", | ||||
|             widget: "markdown", | ||||
|             required: false, | ||||
|             ...MarkdownProps | ||||
|           name: "content", | ||||
|           label: "Inhalt", | ||||
|           widget: "markdown", | ||||
|           required: false, | ||||
|           ...MarkdownProps, | ||||
|         }, | ||||
|         { | ||||
|             name: "topics", | ||||
|             label: "Kreative Haufen", | ||||
|             label_singular: "Haufen", | ||||
|             widget: "list", | ||||
|             required: false, | ||||
|             collapsed: true, | ||||
|             fields: [ | ||||
|                 { | ||||
|                     name: "title", | ||||
|                     label: "Titel", | ||||
|                     widget: "string", | ||||
|                     required: true, | ||||
|                 }, | ||||
|                 { | ||||
|                     name: "content", | ||||
|                     label: "Inhalt", | ||||
|                     widget: "markdown", | ||||
|                     required: false, | ||||
|                     ...MarkdownProps | ||||
|                 }, | ||||
|                 { | ||||
|                     name: "superhaufen", | ||||
|                     label: "Superhaufen", | ||||
|                     widget: "object", | ||||
|                     required: false, | ||||
|                     fields: [ | ||||
|                         EnableBoolean, | ||||
|                         { | ||||
|                             name: "link", | ||||
|                             label: "Superhaufen", | ||||
|                             widget: "relation", | ||||
|                             collection: "superhaufen", | ||||
|                             search_fields: ["title"], | ||||
|                             value_field: "title", | ||||
|                             required: false, | ||||
|                             collapsed: true | ||||
|                         } | ||||
|                     ] | ||||
|                 } | ||||
|             ] | ||||
|           name: "superhaufen", | ||||
|           label: "Superhaufen", | ||||
|           widget: "object", | ||||
|           required: false, | ||||
|           fields: [ | ||||
|             EnableBoolean, | ||||
|             { | ||||
|               name: "link", | ||||
|               label: "Superhaufen", | ||||
|               widget: "relation", | ||||
|               collection: "superhaufen", | ||||
|               search_fields: ["title"], | ||||
|               value_field: "title", | ||||
|               required: false, | ||||
|               collapsed: true, | ||||
|             }, | ||||
|           ], | ||||
|         }, | ||||
|         { | ||||
|             name: "cantorpreisträger", | ||||
|             label: "Cantorpreisträger", | ||||
|             widget: "relation", | ||||
|             collection: "cantorpreis", | ||||
|             search_fields: ["jahr", "name"], | ||||
|             value_field: "name", | ||||
|             required: false | ||||
|         }, | ||||
|         { | ||||
|             name: "body", | ||||
|             label: "Text", | ||||
|             hint: "Erscheint zusätzlich zu den Kreativen Haufen", | ||||
|             widget: "markdown", | ||||
|             required: false, | ||||
|             ...MarkdownProps | ||||
|         } | ||||
|       ], | ||||
|     }, | ||||
|     { | ||||
|       name: "cantorpreisträger", | ||||
|       label: "Cantorpreisträger", | ||||
|       widget: "relation", | ||||
|       collection: "cantorpreis", | ||||
|       search_fields: ["jahr", "name"], | ||||
|       value_field: "name", | ||||
|       required: false, | ||||
|     }, | ||||
|     { | ||||
|       name: "body", | ||||
|       label: "Text", | ||||
|       hint: "Erscheint zusätzlich zu den Kreativen Haufen", | ||||
|       widget: "markdown", | ||||
|       required: false, | ||||
|       ...MarkdownProps, | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
|     ] | ||||
| } | ||||
|  | ||||
| export default ChronikjahreCollection; | ||||
| export default ChronikjahreCollection; | ||||
|   | ||||
| @@ -2,55 +2,57 @@ import { MarkdownProps } from "../props.js"; | ||||
| import { DescriptionText, DraftBoolean, Title } from "./widgets.js"; | ||||
|  | ||||
| const ChronikseitenCollection = { | ||||
|     name: "chronikseiten", | ||||
|     label: "Chronikseiten", | ||||
|     label_singular: "Zusatzseite (Chronik)", | ||||
|     description: "Chronikseiten entsprechen von der Funktionalität herkömmlichen Zusatzseiten, sind allerdings der Schulchronik vorbehalten.", | ||||
|     icon: "page-add", | ||||
|     folder: "content/german/chronikseiten", | ||||
|     create: true, | ||||
|     editor: { | ||||
|         preview: true, | ||||
|         frame: true | ||||
|   name: "chronikseiten", | ||||
|   label: "Chronikseiten", | ||||
|   label_singular: "Zusatzseite (Chronik)", | ||||
|   description: | ||||
|     "Chronikseiten entsprechen von der Funktionalität herkömmlichen Zusatzseiten, sind allerdings der Schulchronik vorbehalten.", | ||||
|   icon: "page-add", | ||||
|   folder: "content/german/chronikseiten", | ||||
|   create: true, | ||||
|   editor: { | ||||
|     preview: true, | ||||
|     frame: true, | ||||
|     size: "half", | ||||
|   }, | ||||
|   filter: { | ||||
|     field: "type", | ||||
|     value: "pages", | ||||
|   }, | ||||
|   summary_fields: ["title", "draft", "aliases", "body"], | ||||
|   fields: [ | ||||
|     Title(false), | ||||
|     DraftBoolean, | ||||
|     DescriptionText, | ||||
|     { | ||||
|       name: "type", | ||||
|       label: "Typ", | ||||
|       widget: "hidden", | ||||
|       default: "pages", | ||||
|     }, | ||||
|     filter: { | ||||
|         field: "type", | ||||
|         value: "pages" | ||||
|     { | ||||
|       name: "aliases", | ||||
|       label: "Aliase", | ||||
|       label_singular: "Alias", | ||||
|       widget: "list", | ||||
|       collapsed: true, | ||||
|       required: false, | ||||
|       fields: [ | ||||
|         { | ||||
|           name: "alias", | ||||
|           label: "Alias", | ||||
|           widget: "string", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|     summary_fields: ["title", "draft", "aliases", "body"], | ||||
|     fields: [ | ||||
|         Title(false), | ||||
|         DraftBoolean, | ||||
|         DescriptionText, | ||||
|         { | ||||
|             name: "type", | ||||
|             label: "Typ", | ||||
|             widget: "hidden", | ||||
|             default: "pages" | ||||
|         }, | ||||
|         { | ||||
|             name: "aliases", | ||||
|             label: "Aliase", | ||||
|             label_singular: "Alias", | ||||
|             widget: "list", | ||||
|             collapsed: true, | ||||
|             required: false, | ||||
|             fields: [ | ||||
|                 { | ||||
|                     name: "alias", | ||||
|                     label: "Alias", | ||||
|                     widget: "string" | ||||
|                 } | ||||
|             ] | ||||
|         }, | ||||
|         { | ||||
|             name: "body", | ||||
|             label: "Text", | ||||
|             widget: "markdown", | ||||
|             required: false, | ||||
|             ...MarkdownProps | ||||
|         } | ||||
|     ] | ||||
| } | ||||
|     { | ||||
|       name: "body", | ||||
|       label: "Inhalt", | ||||
|       widget: "markdown", | ||||
|       required: false, | ||||
|       ...MarkdownProps, | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export default ChronikseitenCollection; | ||||
| export default ChronikseitenCollection; | ||||
|   | ||||
							
								
								
									
										65
									
								
								static/admin/config/collections/forms.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								static/admin/config/collections/forms.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| import { MarkdownProps } from "../props.js"; | ||||
| import { DescriptionText, DraftBoolean, Title } from "./widgets.js"; | ||||
|  | ||||
| const FormsCollection = { | ||||
|   name: "forms", | ||||
|   label: "Dokumente", | ||||
|   label_singular: "Dokument", | ||||
|   description: | ||||
|     "Hier sind Formulare, Vorlagen und andere Dokumente zu hinterlegen.", | ||||
|   icon: "document", | ||||
|   folder: "content/german/forms", | ||||
|   create: true, | ||||
|   editor: { | ||||
|     preview: true, | ||||
|     frame: true, | ||||
|     size: "half", | ||||
|   }, | ||||
|   filter: { | ||||
|     field: "type", | ||||
|     value: "forms", | ||||
|   }, | ||||
|   summary_fields: ["title", "draft"], | ||||
|   fields: [ | ||||
|     Title(false), | ||||
|     DraftBoolean, | ||||
|     DescriptionText, | ||||
|     { | ||||
|       name: "files", | ||||
|       label: "Dateien", | ||||
|       label_singular: "Datei", | ||||
|       widget: "list", | ||||
|       required: false, | ||||
|       collapsed: true, | ||||
|       fields: [ | ||||
|         { | ||||
|           name: "title", | ||||
|           label: "Bezeichnung", | ||||
|           widget: "string", | ||||
|           required: true, | ||||
|         }, | ||||
|         { | ||||
|           name: "link", | ||||
|           label: "Datei", | ||||
|           widget: "file", | ||||
|           required: true, | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|     { | ||||
|       name: "type", | ||||
|       label: "Typ", | ||||
|       widget: "hidden", | ||||
|       default: "forms", | ||||
|     }, | ||||
|     { | ||||
|       name: "body", | ||||
|       label: "Inhalt", | ||||
|       widget: "markdown", | ||||
|       required: false, | ||||
|       ...MarkdownProps, | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export default FormsCollection; | ||||
							
								
								
									
										92
									
								
								static/admin/config/collections/ganztag.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								static/admin/config/collections/ganztag.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| import { MarkdownProps } from "../props.js"; | ||||
| import { Title, DescriptionText, DraftBoolean } from "./widgets.js"; | ||||
|  | ||||
| const GanztagCollection = { | ||||
|   name: "ganztagsangebote", | ||||
|   label: "Ganztag", | ||||
|   label_singular: "Arbeitsgemeinschaft", | ||||
|   description: | ||||
|     "Hier kann die Übersicht der Ganztagsangebote bearbeitet werden.", | ||||
|   icon: "group", | ||||
|   folder: "content/german/ganztagsangebote", | ||||
|   create: true, | ||||
|   editor: { | ||||
|     preview: true, | ||||
|     frame: true, | ||||
|     size: "half", | ||||
|   }, | ||||
|   filter: { | ||||
|     field: "type", | ||||
|     value: "ganztagsangebote", | ||||
|   }, | ||||
|   summary_fields: ["title", "draft", "category", "schedule", "room"], | ||||
|   fields: [ | ||||
|     Title(false), | ||||
|     DraftBoolean, | ||||
|     DescriptionText, | ||||
|     { | ||||
|       name: "image", | ||||
|       label: "Titelbild", | ||||
|       widget: "image", | ||||
|       default: "/media/ganztagsangebote/image.webp", | ||||
|       required: true, | ||||
|     }, | ||||
|     { | ||||
|       name: "category", | ||||
|       label: "Themebereich", | ||||
|       hint: "Verwaltet in den Einstellungen", | ||||
|       widget: "relation", | ||||
|       collection: "settings", | ||||
|       file: "data-categories", | ||||
|       value_field: "ganztag.*", | ||||
|       search_fields: ["ganztag.*"], | ||||
|       display_fields: ["ganztag.*"], | ||||
|       required: true, | ||||
|     }, | ||||
|     { | ||||
|       name: "duration", | ||||
|       label: "Dauer", | ||||
|       widget: "string", | ||||
|       required: true, | ||||
|     }, | ||||
|     { | ||||
|       name: "schedule", | ||||
|       label: "Tag/Stunden", | ||||
|       widget: "string", | ||||
|       required: true, | ||||
|     }, | ||||
|     { | ||||
|       name: "class", | ||||
|       label: "Klassenstufen(n)", | ||||
|       widget: "string", | ||||
|       required: true, | ||||
|     }, | ||||
|     { | ||||
|       name: "room", | ||||
|       label: "Raum", | ||||
|       widget: "string", | ||||
|       required: true, | ||||
|     }, | ||||
|     { | ||||
|       name: "apply_url", | ||||
|       label: "Anmeldelink", | ||||
|       widget: "hidden", | ||||
|       default: "https://moodle.bildung-lsa.de/gcg/mod/choice/view.php?id=828", | ||||
|     }, | ||||
|     { | ||||
|       name: "type", | ||||
|       label: "Typ", | ||||
|       widget: "hidden", | ||||
|       default: "ganztagsangebote", | ||||
|     }, | ||||
|     { | ||||
|       name: "body", | ||||
|       label: "Inhalt", | ||||
|       widget: "markdown", | ||||
|       required: false, | ||||
|       ...MarkdownProps, | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export default GanztagCollection; | ||||
							
								
								
									
										347
									
								
								static/admin/config/collections/index-pages.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										347
									
								
								static/admin/config/collections/index-pages.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,347 @@ | ||||
| import { | ||||
|   DataObject, | ||||
|   DateFormat, | ||||
|   MarkdownProps, | ||||
|   PatternEmail, | ||||
| } from "../props.js"; | ||||
| import { DescriptionText, EnableBoolean, Title } from "./widgets.js"; | ||||
|  | ||||
| const IndexPagesCollection = { | ||||
|   name: "index-pages", | ||||
|   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.", | ||||
|   icon: "page", | ||||
|   editor: { | ||||
|     preview: true, | ||||
|     frame: true, | ||||
|     size: "half", | ||||
|   }, | ||||
|   summary_fields: ["title", "description"], | ||||
|   files: [ | ||||
|     { | ||||
|       name: "blog-index", | ||||
|       label: "Aktuelles", | ||||
|       file: "content/german/blog/_index.md", | ||||
|       fields: [Title(false), DescriptionText], | ||||
|     }, | ||||
|     { | ||||
|       name: "about-index", | ||||
|       label: "Über die Schule", | ||||
|       file: "content/german/about/_index.md", | ||||
|       fields: [ | ||||
|         Title(false), | ||||
|         DescriptionText, | ||||
|         { | ||||
|           name: "image", | ||||
|           label: "Bild", | ||||
|           widget: "image", | ||||
|           required: false, | ||||
|         }, | ||||
|         { | ||||
|           name: "stats", | ||||
|           label: "Statistik", | ||||
|           ...DataObject, | ||||
|           fields: [ | ||||
|             EnableBoolean, | ||||
|             { | ||||
|               name: "zahlen", | ||||
|               label: "Elemente", | ||||
|               label_singular: "Element", | ||||
|               widget: "list", | ||||
|               required: false, | ||||
|               collapsed: false, | ||||
|               fields: [ | ||||
|                 { | ||||
|                   name: "name", | ||||
|                   label: "Bezeichnung", | ||||
|                   widget: "string", | ||||
|                   required: true, | ||||
|                 }, | ||||
|                 { | ||||
|                   name: "count", | ||||
|                   label: "Zahl", | ||||
|                   widget: "number", | ||||
|                   value_type: "int", | ||||
|                   min: 0, | ||||
|                   step: 1, | ||||
|                   required: true, | ||||
|                 }, | ||||
|               ], | ||||
|             }, | ||||
|           ], | ||||
|         }, | ||||
|         { | ||||
|           name: "body", | ||||
|           label: "Inhalt", | ||||
|           widget: "markdown", | ||||
|           required: false, | ||||
|           ...MarkdownProps, | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|     { | ||||
|       name: "anmeldung-index", | ||||
|       label: "Aufnahmeverfahren", | ||||
|       file: "content/german/anmeldung/_index.md", | ||||
|       fields: [ | ||||
|         Title(false), | ||||
|         DescriptionText, | ||||
|         { | ||||
|           name: "body", | ||||
|           label: "Inhalt", | ||||
|           widget: "markdown", | ||||
|           required: false, | ||||
|           ...MarkdownProps, | ||||
|         }, | ||||
|         { | ||||
|           name: "elements", | ||||
|           label: "Abschnitte", | ||||
|           label_singular: "Abschnitt", | ||||
|           widget: "list", | ||||
|           required: false, | ||||
|           collapsed: true, | ||||
|           fields: [ | ||||
|             Title(false), | ||||
|             { | ||||
|               name: "content", | ||||
|               label: "Inhalt", | ||||
|               widget: "markdown", | ||||
|               required: true, | ||||
|               ...MarkdownProps, | ||||
|             }, | ||||
|           ], | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|     { | ||||
|       name: "author-index", | ||||
|       label: "Autoren", | ||||
|       file: "content/german/author/_index.md", | ||||
|       fields: [Title(false), DescriptionText], | ||||
|     }, | ||||
|     { | ||||
|       name: "anmeldeformular", | ||||
|       label: "Anmeldeformular", | ||||
|       file: "content/german/anmeldeformular/_index.md", | ||||
|       fields: [ | ||||
|         Title(false), | ||||
|         DescriptionText, | ||||
|         { | ||||
|           name: "body", | ||||
|           label: "Inhalt", | ||||
|           widget: "markdown", | ||||
|           required: false, | ||||
|           ...MarkdownProps, | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|     { | ||||
|       name: "cantorpreis-index", | ||||
|       label: "Cantorpreis", | ||||
|       file: "content/german/cantorpreis/_index.md", | ||||
|       fields: [Title(false), DescriptionText], | ||||
|     }, | ||||
|     { | ||||
|       name: "kontakt", | ||||
|       label: "Kontakt", | ||||
|       file: "content/german/kontakt/_index.md", | ||||
|       fields: [ | ||||
|         Title(false), | ||||
|         DescriptionText, | ||||
|         { | ||||
|           name: "kontaktdaten", | ||||
|           label: "Kontaktdaten", | ||||
|           widget: "list", | ||||
|           required: true, | ||||
|           collapsed: true, | ||||
|           fields: [ | ||||
|             { | ||||
|               name: "name", | ||||
|               label: "Name", | ||||
|               widget: "string", | ||||
|               required: true, | ||||
|             }, | ||||
|             { | ||||
|               name: "position", | ||||
|               label: "Berufsbezeichnung", | ||||
|               widget: "string", | ||||
|               required: true, | ||||
|             }, | ||||
|             { | ||||
|               name: "email", | ||||
|               label: "E-Mail-Adresse", | ||||
|               widget: "string", | ||||
|               required: true, | ||||
|               ...PatternEmail, | ||||
|             }, | ||||
|           ], | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|     { | ||||
|       name: "termine", | ||||
|       label: "Termine", | ||||
|       file: "content/german/termine/_index.md", | ||||
|       fields: [ | ||||
|         Title(false), | ||||
|         DescriptionText, | ||||
|         { | ||||
|           name: "events", | ||||
|           label: "Termine", | ||||
|           label_singular: "Termin", | ||||
|           widget: "list", | ||||
|           required: true, | ||||
|           collapsed: true, | ||||
|           fields: [ | ||||
|             { | ||||
|               name: "title", | ||||
|               label: "Bezeichnung", | ||||
|               widget: "string", | ||||
|               required: true, | ||||
|             }, | ||||
|             { | ||||
|               name: "date", | ||||
|               label: "Datum/Startdatum", | ||||
|               widget: "datetime", | ||||
|               required: true, | ||||
|               ...DateFormat, | ||||
|             }, | ||||
|             { | ||||
|               name: "enddate", | ||||
|               label: "Enddatum", | ||||
|               hint: "Für mehrtägige Veanstaltungen, nur sichtbar wenn eingestellt", | ||||
|               widget: "datetime", | ||||
|               required: false, | ||||
|               ...DateFormat, | ||||
|             }, | ||||
|             { | ||||
|               name: "location", | ||||
|               label: "Ort", | ||||
|               widget: "string", | ||||
|               required: false, | ||||
|             }, | ||||
|           ], | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|     { | ||||
|       name: "forms-index", | ||||
|       label: "Dokumente und Formulare", | ||||
|       file: "content/german/forms/_index.md", | ||||
|       fields: [Title(false), DescriptionText], | ||||
|     }, | ||||
|     { | ||||
|       name: "ganztagsangebote-index", | ||||
|       label: "Unser Ganztagsbereich", | ||||
|       file: "content/german/ganztagsangebote/_index.md", | ||||
|       fields: [Title(false), DescriptionText], | ||||
|     }, | ||||
|     { | ||||
|       name: "projektwoche-index", | ||||
|       label: "Projektwoche", | ||||
|       file: "content/german/projektwoche/_index.md", | ||||
|       fields: [Title(false), DescriptionText], | ||||
|     }, | ||||
|     { | ||||
|       name: "wettbewerbe-index", | ||||
|       label: "Wettbewerbe", | ||||
|       file: "content/german/wettbewerbe/_index.md", | ||||
|       fields: [Title(false), DescriptionText], | ||||
|     }, | ||||
|     { | ||||
|       name: "begabte-index", | ||||
|       label: "Begabtenförderung", | ||||
|       file: "content/german/begabte/_index.md", | ||||
|       fields: [Title(false), DescriptionText], | ||||
|     }, | ||||
|     { | ||||
|       name: "abiturienten-index", | ||||
|       label: "Abiturienten", | ||||
|       file: "content/german/abiturienten/_index.md", | ||||
|       fields: [Title(false), DescriptionText], | ||||
|     }, | ||||
|     { | ||||
|       name: "cantorfora-index", | ||||
|       label: "Cantorfora", | ||||
|       file: "content/german/cantorfora/_index.md", | ||||
|       fields: [ | ||||
|         Title(false), | ||||
|         DescriptionText, | ||||
|         { | ||||
|           name: "body", | ||||
|           label: "Inhalt", | ||||
|           widget: "markdown", | ||||
|           required: false, | ||||
|           ...MarkdownProps, | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|     { | ||||
|       name: "schulchronik-index", | ||||
|       label: "Schulchronik", | ||||
|       file: "content/german/schulchronik/_index.md", | ||||
|       fields: [ | ||||
|         Title(false), | ||||
|         DescriptionText, | ||||
|         { | ||||
|           name: "body", | ||||
|           label: "Inhalt", | ||||
|           widget: "markdown", | ||||
|           required: false, | ||||
|           ...MarkdownProps, | ||||
|         }, | ||||
|         { | ||||
|           name: "infocard", | ||||
|           label: "Zitatkarte", | ||||
|           ...DataObject, | ||||
|           fields: [ | ||||
|             EnableBoolean, | ||||
|             { | ||||
|               name: "image", | ||||
|               label: "Bild", | ||||
|               widget: "image", | ||||
|               required: false, | ||||
|             }, | ||||
|             { | ||||
|               name: "quote", | ||||
|               label: "Zitat", | ||||
|               widget: "text", | ||||
|               required: false, | ||||
|             }, | ||||
|             { | ||||
|               name: "author", | ||||
|               label: "Autor", | ||||
|               widget: "string", | ||||
|               required: false, | ||||
|             }, | ||||
|           ], | ||||
|         }, | ||||
|         { | ||||
|           name: "links", | ||||
|           label: "Informationsseiten", | ||||
|           widget: "list", | ||||
|           required: false, | ||||
|           collapsed: true, | ||||
|           fields: [ | ||||
|             { | ||||
|               name: "title", | ||||
|               label: "Bezeichnung", | ||||
|               widget: "string", | ||||
|               required: true, | ||||
|             }, | ||||
|             { | ||||
|               name: "link", | ||||
|               label: "Link", | ||||
|               widget: "string", | ||||
|               required: true, | ||||
|             }, | ||||
|           ], | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export default IndexPagesCollection; | ||||
| @@ -1,9 +1,37 @@ | ||||
| import SettingsCollection from "./settings-collection.js"; | ||||
| import IndexPagesCollection from "./index-pages.js"; | ||||
| import PagesCollection from "./pages.js"; | ||||
| import AuthorCollection from "./author.js"; | ||||
| import BlogCollection from "./blog.js"; | ||||
| import FormsCollection from "./forms.js"; | ||||
| import GanztagCollection from "./ganztag.js"; | ||||
| import WettbewerbeCollection from "./wettbewerbe.js"; | ||||
| import BegabteCollection from "./begabte.js"; | ||||
| import ProjektwocheCollection from "./projektwoche.js"; | ||||
| import ChronikjahreCollection from "./chronikjahre.js"; | ||||
| import SuperhaufenCollection from "./superhaufen.js"; | ||||
| import CantorpreisCollection from "./cantorpreis.js"; | ||||
| import AbiturientenCollection from "./abiturienten.js"; | ||||
| import CantorforaCollection from "./cantorfora.js"; | ||||
| import ChronikseitenCollection from "./chronikseiten.js"; | ||||
| import StatsCollection from "./stats.js"; | ||||
|  | ||||
| export { SettingsCollection, ChronikjahreCollection, SuperhaufenCollection, CantorpreisCollection, AbiturientenCollection, CantorforaCollection, ChronikseitenCollection }; | ||||
| export { | ||||
|   SettingsCollection, | ||||
|   IndexPagesCollection, | ||||
|   PagesCollection, | ||||
|   AuthorCollection, | ||||
|   BlogCollection, | ||||
|   FormsCollection, | ||||
|   GanztagCollection, | ||||
|   WettbewerbeCollection, | ||||
|   BegabteCollection, | ||||
|   ProjektwocheCollection, | ||||
|   ChronikjahreCollection, | ||||
|   SuperhaufenCollection, | ||||
|   CantorpreisCollection, | ||||
|   AbiturientenCollection, | ||||
|   CantorforaCollection, | ||||
|   ChronikseitenCollection, | ||||
|   StatsCollection, | ||||
| }; | ||||
|   | ||||
							
								
								
									
										58
									
								
								static/admin/config/collections/pages.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								static/admin/config/collections/pages.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| import { MarkdownProps } from "../props.js"; | ||||
| import { DescriptionText, DraftBoolean, Title } from "./widgets.js"; | ||||
|  | ||||
| const PagesCollection = { | ||||
|   name: "pages", | ||||
|   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.", | ||||
|   icon: "page-add", | ||||
|   folder: "content/german/pages", | ||||
|   create: true, | ||||
|   editor: { | ||||
|     preview: true, | ||||
|     frame: true, | ||||
|     size: "half", | ||||
|   }, | ||||
|   filter: { | ||||
|     field: "type", | ||||
|     value: "pages", | ||||
|   }, | ||||
|   summary_fields: ["title", "draft", "aliases", "description"], | ||||
|   fields: [ | ||||
|     Title(false), | ||||
|     DraftBoolean, | ||||
|     DescriptionText, | ||||
|     { | ||||
|       name: "type", | ||||
|       label: "Typ", | ||||
|       widget: "hidden", | ||||
|       default: "pages", | ||||
|     }, | ||||
|     { | ||||
|       name: "aliases", | ||||
|       label: "Aliase", | ||||
|       label_singular: "Alias", | ||||
|       widget: "list", | ||||
|       collapsed: true, | ||||
|       required: false, | ||||
|       fields: [ | ||||
|         { | ||||
|           name: "alias", | ||||
|           label: "Alias", | ||||
|           widget: "string", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|     { | ||||
|       name: "body", | ||||
|       label: "Inhalt", | ||||
|       widget: "markdown", | ||||
|       required: false, | ||||
|       ...MarkdownProps, | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export default PagesCollection; | ||||
							
								
								
									
										73
									
								
								static/admin/config/collections/projektwoche.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								static/admin/config/collections/projektwoche.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| import { MarkdownProps } from "../props.js"; | ||||
| import { DescriptionText, DraftBoolean, IconList, Title } from "./widgets.js"; | ||||
|  | ||||
| const ProjektwocheCollection = { | ||||
|   name: "projektwoche", | ||||
|   label: "Projektwochen", | ||||
|   label_singular: "Projektwoche", | ||||
|   description: "Hier kann die Übersicht der Projektwochen bearbeitet werden.", | ||||
|   icon: "projektwoche", | ||||
|   folder: "content/german/projektwoche", | ||||
|   filter: { | ||||
|     field: "type", | ||||
|     value: "projektwoche", | ||||
|   }, | ||||
|   create: true, | ||||
|   editor: { | ||||
|     preview: true, | ||||
|     frame: true, | ||||
|     size: "half", | ||||
|   }, | ||||
|   summary_fields: ["title", "draft", "tiles", "description"], | ||||
|   fields: [ | ||||
|     Title(false), | ||||
|     DraftBoolean, | ||||
|     DescriptionText, | ||||
|     { | ||||
|       name: "type", | ||||
|       label: "Typ", | ||||
|       widget: "hidden", | ||||
|       default: "projektwoche", | ||||
|     }, | ||||
|     { | ||||
|       name: "body", | ||||
|       label: "Inhalt", | ||||
|       widget: "markdown", | ||||
|       required: false, | ||||
|       ...MarkdownProps, | ||||
|     }, | ||||
|     { | ||||
|       name: "tiles", | ||||
|       label: "Kacheln", | ||||
|       hint: "Die Vorschau zeigt nur die generierten Symbolkarten, NICHT die Inhalte.", | ||||
|       widget: "list", | ||||
|       required: false, | ||||
|       collapsed: true, | ||||
|       fields: [ | ||||
|         Title(false), | ||||
|         { | ||||
|           name: "bg_color", | ||||
|           label: "Hintergrundfarbe", | ||||
|           widget: "color", | ||||
|           required: true, | ||||
|         }, | ||||
|         IconList, | ||||
|         { | ||||
|           name: "font_color", | ||||
|           label: "Symbolfarbe", | ||||
|           widget: "color", | ||||
|           required: true, | ||||
|         }, | ||||
|         { | ||||
|           name: "content", | ||||
|           label: "Inhalt", | ||||
|           widget: "markdown", | ||||
|           required: true, | ||||
|           ...MarkdownProps, | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export default ProjektwocheCollection; | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,78 +0,0 @@ | ||||
| const StatistikCollection = { | ||||
|     name: "statistik", | ||||
|     label: "Statistik", | ||||
|     description: "Hier können statistische Daten bearbeitet werden. Dieser Bereich wird von der Schulchronik verwaltet.", | ||||
|     icon: "stats", | ||||
|     editor: { | ||||
|         preview: false | ||||
|     }, | ||||
|     files: [ | ||||
|         { | ||||
|             name: "abiturdurchschnitte", | ||||
|             label: "Abiturdurchschnitte", | ||||
|             file: "static/data/abiturdurchschnitte.json", | ||||
|             fields: [ | ||||
|                 { | ||||
|                     name: "abiturdurchschnitte", | ||||
|                     label: "Abiturdurchschnitte", | ||||
|                     label_singular: "Abiturdurchschnitt", | ||||
|                     widget: "list", | ||||
|                     required: false, | ||||
|                     fields: [ | ||||
|                         { | ||||
|                             name: "jahr", | ||||
|                             label: "Jahr", | ||||
|                             widget: "number", | ||||
|                             value_type: "int", | ||||
|                             step: 1, | ||||
|                             required: true | ||||
|                         }, | ||||
|                         { | ||||
|                             name: "schnitt", | ||||
|                             label: "Schnitt", | ||||
|                             widget: "number", | ||||
|                             value_type: "float", | ||||
|                             step: 0.01, | ||||
|                             required: true | ||||
|                         } | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     name: "schuelerzahlen", | ||||
|                     label: "Schülerzahlen", | ||||
|                     file: "static/data/schuelerzahlen.json", | ||||
|                     fields: [ | ||||
|                         { | ||||
|                             name: "schuelerzahlen", | ||||
|                             label: "Schülerzahlen", | ||||
|                             widget: "list", | ||||
|                             required: false, | ||||
|                             fields: [ | ||||
|                                 { | ||||
|                                     name: "year", | ||||
|                                     label: "Jahr", | ||||
|                                     widget: "number", | ||||
|                                     required: true | ||||
|                                 }, | ||||
|                                 { | ||||
|                                     name: "all", | ||||
|                                     label: "Gesamt", | ||||
|                                     widget: "number", | ||||
|                                     required: true | ||||
|                                 }, | ||||
|                                 { | ||||
|                                     name: "girls", | ||||
|                                     label: "davon Mädchen", | ||||
|                                     widget: "number", | ||||
|                                     required: true | ||||
|                                 } | ||||
|                             ] | ||||
|                         } | ||||
|                     ] | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|     ] | ||||
| } | ||||
|  | ||||
| export default StatistikCollection; | ||||
							
								
								
									
										83
									
								
								static/admin/config/collections/stats.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								static/admin/config/collections/stats.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| const StatsCollection = { | ||||
|   name: "statistik", | ||||
|   label: "Statistik", | ||||
|   description: | ||||
|     "Hier können statistische Daten bearbeitet werden. Dieser Bereich wird von der Schulchronik verwaltet.", | ||||
|   icon: "stats", | ||||
|   editor: { | ||||
|     preview: false, | ||||
|     size: "half", | ||||
|   }, | ||||
|   files: [ | ||||
|     { | ||||
|       name: "abiturdurchschnitte", | ||||
|       label: "Abiturdurchschnitte", | ||||
|       file: "static/data/abiturdurchschnitte.json", | ||||
|       fields: [ | ||||
|         { | ||||
|           name: "abiturdurchschnitte", | ||||
|           label: "Abiturdurchschnitte", | ||||
|           label_singular: "Jahr", | ||||
|           widget: "list", | ||||
|           required: false, | ||||
|           fields: [ | ||||
|             { | ||||
|               name: "jahr", | ||||
|               label: "Jahr", | ||||
|               widget: "number", | ||||
|               value_type: "int", | ||||
|               required: true, | ||||
|             }, | ||||
|             { | ||||
|               name: "schnitt", | ||||
|               label: "Schnitt", | ||||
|               widget: "number", | ||||
|               value_type: "float", | ||||
|               step: 0.01, | ||||
|               required: true, | ||||
|             }, | ||||
|           ], | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|     { | ||||
|       name: "schuelerzahlen", | ||||
|       label: "Schülerzahlen", | ||||
|       file: "static/data/schuelerzahlen.json", | ||||
|       fields: [ | ||||
|         { | ||||
|           name: "schuelerzahlen", | ||||
|           label: "Schülerzahlen", | ||||
|           label_singular: "Jahr", | ||||
|           widget: "list", | ||||
|           required: false, | ||||
|           fields: [ | ||||
|             { | ||||
|               name: "year", | ||||
|               label: "Jahr", | ||||
|               widget: "number", | ||||
|               value_type: "int", | ||||
|               required: true, | ||||
|             }, | ||||
|             { | ||||
|               name: "all", | ||||
|               label: "Gesamtzahl", | ||||
|               widget: "number", | ||||
|               value_type: "int", | ||||
|               required: true, | ||||
|             }, | ||||
|             { | ||||
|               name: "girls", | ||||
|               label: "davon Mädchen", | ||||
|               widget: "number", | ||||
|               value_type: "int", | ||||
|               required: true, | ||||
|             }, | ||||
|           ], | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export default StatsCollection; | ||||
| @@ -2,100 +2,102 @@ import { MarkdownProps } from "../props.js"; | ||||
| import { DraftBoolean, EnableBoolean, Title } from "./widgets.js"; | ||||
|  | ||||
| const SuperhaufenCollection = { | ||||
|     name: "superhaufen", | ||||
|     label: "Superhaufen", | ||||
|     description: "\"Superhaufen\" sind ein besonderer Bereich der Schulchronik, um besonders ausführliche Ereignisse darzustellen. Dieser Bereich wird von der Schulchronik verwaltet.", | ||||
|     icon: "superhaufen", | ||||
|     folder: "content/german/superhaufen", | ||||
|     filter: { | ||||
|         field: "type", | ||||
|         value: "superhaufen" | ||||
|   name: "superhaufen", | ||||
|   label: "Superhaufen", | ||||
|   description: | ||||
|     '"Superhaufen" sind ein besonderer Bereich der Schulchronik, um besonders ausführliche Ereignisse darzustellen. Dieser Bereich wird von der Schulchronik verwaltet.', | ||||
|   icon: "superhaufen", | ||||
|   folder: "content/german/superhaufen", | ||||
|   filter: { | ||||
|     field: "type", | ||||
|     value: "superhaufen", | ||||
|   }, | ||||
|   create: true, | ||||
|   editor: { | ||||
|     preview: true, | ||||
|     frame: true, | ||||
|     size: "half", | ||||
|   }, | ||||
|   summary_fields: ["title", "draft", "tiles"], | ||||
|   fields: [ | ||||
|     Title(false), | ||||
|     DraftBoolean, | ||||
|     { | ||||
|       name: "type", | ||||
|       label: "Typ", | ||||
|       widget: "hidden", | ||||
|       default: "superhaufen", | ||||
|     }, | ||||
|     create: true, | ||||
|     editor: { | ||||
|         preview: true, | ||||
|         frame: true, | ||||
|     }, | ||||
|     summary_fields: ["title", "draft", "tiles"], | ||||
|     fields: [ | ||||
|     { | ||||
|       name: "previous", | ||||
|       label: "Rückverlinkung", | ||||
|       widget: "object", | ||||
|       collapsed: true, | ||||
|       fields: [ | ||||
|         EnableBoolean, | ||||
|         Title(false), | ||||
|         DraftBoolean, | ||||
|         { | ||||
|             name: "type", | ||||
|             label: "Typ", | ||||
|             widget: "hidden", | ||||
|             default: "superhaufen" | ||||
|           name: "link", | ||||
|           label: "Link", | ||||
|           widget: "string", | ||||
|           required: true, | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|     { | ||||
|       name: "tiles", | ||||
|       label: "Kacheln", | ||||
|       hint: "Die Vorschau zeigt nur die generierten Symbolkarten, NICHT die Inhalte.", | ||||
|       widget: "list", | ||||
|       required: false, | ||||
|       collapsed: true, | ||||
|       fields: [ | ||||
|         Title(false), | ||||
|         { | ||||
|           name: "bg_color", | ||||
|           label: "Hintergrundfarbe", | ||||
|           widget: "color", | ||||
|           required: true, | ||||
|         }, | ||||
|         { | ||||
|             name: "previous", | ||||
|             label: "Rückverlinkung", | ||||
|             widget: "object", | ||||
|             collapsed: true, | ||||
|             fields: [ | ||||
|                 EnableBoolean, | ||||
|                 Title(false), | ||||
|                 { | ||||
|                     name: "link", | ||||
|                     label: "Link", | ||||
|                     widget: "string", | ||||
|                     required: true | ||||
|                 } | ||||
|             ] | ||||
|           name: "icon", | ||||
|           label: "Symbol", | ||||
|           widget: "string", | ||||
|           required: true, | ||||
|         }, | ||||
|         { | ||||
|             name: "tiles", | ||||
|             label: "Kacheln", | ||||
|             hint: "Die Vorschau zeigt nur die generierten Symbolkarten, NICHT die Inhalte.", | ||||
|             widget: "list", | ||||
|             required: false, | ||||
|             collapsed: true, | ||||
|             fields: [ | ||||
|                 Title(false), | ||||
|                 { | ||||
|                     name: "bg_color", | ||||
|                     label: "Hintergrundfarbe", | ||||
|                     widget: "color", | ||||
|                     required: true, | ||||
|                 }, | ||||
|                 { | ||||
|                     name: "icon", | ||||
|                     label: "Symbol", | ||||
|                     widget: "string", | ||||
|                     required: true, | ||||
|                 }, | ||||
|                 { | ||||
|                     name: "font_color", | ||||
|                     label: "Symbolfarbe", | ||||
|                     widget: "color", | ||||
|                     required: true, | ||||
|                 }, | ||||
|                 { | ||||
|                     name: "content", | ||||
|                     label: "Inhalt", | ||||
|                     widget: "markdown", | ||||
|                     required: true, | ||||
|                     ...MarkdownProps | ||||
|                 }, | ||||
|                 { | ||||
|                     name: "unterhaufen", | ||||
|                     label: "Unterhaufen", | ||||
|                     widget: "list", | ||||
|                     required: false, | ||||
|                     collapsed: true, | ||||
|                     fields: [ | ||||
|                         Title(false), | ||||
|                         { | ||||
|                             name: "content", | ||||
|                             label: "Inhalt", | ||||
|                             widget: "markdown", | ||||
|                             required: true, | ||||
|                             ...MarkdownProps | ||||
|                         } | ||||
|                     ] | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|     ] | ||||
| } | ||||
|           name: "font_color", | ||||
|           label: "Symbolfarbe", | ||||
|           widget: "color", | ||||
|           required: true, | ||||
|         }, | ||||
|         { | ||||
|           name: "content", | ||||
|           label: "Inhalt", | ||||
|           widget: "markdown", | ||||
|           required: true, | ||||
|           ...MarkdownProps, | ||||
|         }, | ||||
|         { | ||||
|           name: "unterhaufen", | ||||
|           label: "Unterhaufen", | ||||
|           widget: "list", | ||||
|           required: false, | ||||
|           collapsed: true, | ||||
|           fields: [ | ||||
|             Title(false), | ||||
|             { | ||||
|               name: "content", | ||||
|               label: "Inhalt", | ||||
|               widget: "markdown", | ||||
|               required: true, | ||||
|               ...MarkdownProps, | ||||
|             }, | ||||
|           ], | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export default SuperhaufenCollection; | ||||
| export default SuperhaufenCollection; | ||||
|   | ||||
							
								
								
									
										73
									
								
								static/admin/config/collections/wettbewerbe.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								static/admin/config/collections/wettbewerbe.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| import { MarkdownProps } from "../props.js"; | ||||
| import { DescriptionText, DraftBoolean, Title } from "./widgets.js"; | ||||
|  | ||||
| const WettbewerbeCollection = { | ||||
|   name: "wettbewerbe", | ||||
|   label: "Wettbewerbe", | ||||
|   label_singular: "Wettbewerb", | ||||
|   description: "Hier kann die Übersicht der Wettbewerbe bearbeitet werden.", | ||||
|   icon: "trophy", | ||||
|   folder: "content/german/wettbewerbe", | ||||
|   create: true, | ||||
|   editor: { | ||||
|     preview: true, | ||||
|     frame: true, | ||||
|     size: "half", | ||||
|   }, | ||||
|   filter: { | ||||
|     field: "type", | ||||
|     value: "wettbewerbe", | ||||
|   }, | ||||
|   summary_fields: ["title", "draft", "category"], | ||||
|   fields: [ | ||||
|     Title(false), | ||||
|     DraftBoolean, | ||||
|     DescriptionText, | ||||
|     { | ||||
|       name: "image", | ||||
|       label: "Titelbild", | ||||
|       widget: "image", | ||||
|       required: true, | ||||
|       default: "/media/image.webp", | ||||
|     }, | ||||
|     { | ||||
|       name: "category", | ||||
|       label: "Fach", | ||||
|       hint: "Verwaltet in den Einstellungen", | ||||
|       widget: "relation", | ||||
|       collection: "settings", | ||||
|       file: "data-categories", | ||||
|       value_field: "contests.*", | ||||
|       search_fields: ["contests.*"], | ||||
|       display_fields: ["contests.*"], | ||||
|       required: true, | ||||
|     }, | ||||
|     { | ||||
|       name: "class", | ||||
|       label: "Klassenstufe(n)", | ||||
|       widget: "string", | ||||
|       required: true, | ||||
|     }, | ||||
|     { | ||||
|       name: "web_url", | ||||
|       label: "Website", | ||||
|       widget: "string", | ||||
|       required: false, | ||||
|     }, | ||||
|     { | ||||
|       name: "type", | ||||
|       label: "Typ", | ||||
|       widget: "hidden", | ||||
|       default: "wettbewerbe", | ||||
|     }, | ||||
|     { | ||||
|       name: "body", | ||||
|       label: "Inhalt", | ||||
|       widget: "markdown", | ||||
|       required: true, | ||||
|       ...MarkdownProps, | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export default WettbewerbeCollection; | ||||
| @@ -1,30 +1,88 @@ | ||||
| import { DataObject } from "../props.js"; | ||||
|  | ||||
| const EnableBoolean = { | ||||
|     name: "enable", | ||||
|     label: "Aktivieren", | ||||
|     widget: "boolean", | ||||
|     required: false | ||||
|   name: "enable", | ||||
|   label: "Aktivieren", | ||||
|   widget: "boolean", | ||||
|   required: false, | ||||
| }; | ||||
|  | ||||
| const DisableBoolean = { | ||||
|   name: "disable", | ||||
|   label: "Deaktivieren", | ||||
|   widget: "boolean", | ||||
|   required: false, | ||||
| }; | ||||
|  | ||||
| const DraftBoolean = { | ||||
|     name: "draft", | ||||
|     label: "Entwurf", | ||||
|     widget: "boolean", | ||||
|     default: false, | ||||
|     required: false | ||||
| } | ||||
|   name: "draft", | ||||
|   label: "Entwurf", | ||||
|   widget: "boolean", | ||||
|   default: false, | ||||
|   required: false, | ||||
| }; | ||||
|  | ||||
| const Title = (optional = false) => ({ | ||||
|     name: "title", | ||||
|     label: "Titel", | ||||
|     widget: "string", | ||||
|     required: !optional | ||||
|   name: "title", | ||||
|   label: "Titel", | ||||
|   widget: "string", | ||||
|   required: !optional, | ||||
| }); | ||||
|  | ||||
| const DescriptionText = { | ||||
|     name: "description", | ||||
|     label: "Beschreibung", | ||||
|     widget: "text", | ||||
|     required: false | ||||
|   name: "description", | ||||
|   label: "Beschreibung", | ||||
|   widget: "text", | ||||
|   required: false, | ||||
| }; | ||||
|  | ||||
| export { EnableBoolean, DraftBoolean, Title, DescriptionText }; | ||||
| const IconList = { | ||||
|   name: "icon", | ||||
|   label: "Symbol", | ||||
|   widget: "string", | ||||
|   required: false, | ||||
|   hint: "Liste unter https://assets.cantorgymnasium.de/fonts/mdi/v7/preview.html", | ||||
| }; | ||||
|  | ||||
| const PreviewNumber = { | ||||
|   name: "number", | ||||
|   label: "Anzahl", | ||||
|   hint: "Anzahl der Elemente, die auf der Startseite angezeigt werden sollen.", | ||||
|   widget: "number", | ||||
|   value_type: "int", | ||||
|   min: 0, | ||||
|   step: 1, | ||||
|   required: true, | ||||
| }; | ||||
|  | ||||
| const ButtonObject = { | ||||
|   name: "button", | ||||
|   label: "Button", | ||||
|   ...DataObject, | ||||
|   fields: [ | ||||
|     EnableBoolean, | ||||
|     { | ||||
|       name: "label", | ||||
|       label: "Aufschrift", | ||||
|       widget: "string", | ||||
|       required: false, | ||||
|     }, | ||||
|     { | ||||
|       name: "link", | ||||
|       label: "Link", | ||||
|       widget: "string", | ||||
|       required: false, | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export { | ||||
|   EnableBoolean, | ||||
|   DisableBoolean, | ||||
|   DraftBoolean, | ||||
|   Title, | ||||
|   DescriptionText, | ||||
|   IconList, | ||||
|   PreviewNumber, | ||||
|   ButtonObject, | ||||
| }; | ||||
|   | ||||
| @@ -1,37 +1,71 @@ | ||||
| import { SettingsCollection } from "./collections/index.js"; | ||||
| import { | ||||
|   AbiturientenCollection, | ||||
|   AuthorCollection, | ||||
|   BegabteCollection, | ||||
|   BlogCollection, | ||||
|   CantorforaCollection, | ||||
|   CantorpreisCollection, | ||||
|   ChronikjahreCollection, | ||||
|   ChronikseitenCollection, | ||||
|   FormsCollection, | ||||
|   GanztagCollection, | ||||
|   IndexPagesCollection, | ||||
|   PagesCollection, | ||||
|   ProjektwocheCollection, | ||||
|   SettingsCollection, | ||||
|   StatsCollection, | ||||
|   SuperhaufenCollection, | ||||
|   WettbewerbeCollection, | ||||
| } from "./collections/index.js"; | ||||
|  | ||||
| const config = { | ||||
|     backend: { | ||||
|         name: "gitea", | ||||
|         repo: "gcg/gcg-website", | ||||
|         branch: "master", | ||||
|         api_root: "https://git.cantorgymnasium.de/api/v1", | ||||
|         base_url: "https://oauth.cantorgymnasium.de", | ||||
|         commit_messages: { | ||||
|             create: "{{collection}} {{slug}} erstellt", | ||||
|             update: "{{collection}} {{slug}} aktualisiert", | ||||
|             delete: "{{collection}} {{slug}} gelöscht", | ||||
|             updateMedia: "{{path}} hochgeladen", | ||||
|             deleteMedia: "{{path}} gelöscht" | ||||
|         } | ||||
|   backend: { | ||||
|     name: "gitea", | ||||
|     repo: "gcg/gcg-website", | ||||
|     branch: "master", | ||||
|     api_root: "https://git.cantorgymnasium.de/api/v1", | ||||
|     base_url: "https://oauth.cantorgymnasium.de", | ||||
|     commit_messages: { | ||||
|       create: "{{collection}} {{slug}} erstellt", | ||||
|       update: "{{collection}} {{slug}} aktualisiert", | ||||
|       delete: "{{collection}} {{slug}} gelöscht", | ||||
|       updateMedia: "{{path}} hochgeladen", | ||||
|       deleteMedia: "{{path}} gelöscht", | ||||
|     }, | ||||
|     local_backend: true, | ||||
|     media_folder: "/static/media", | ||||
|     public_folder: "/media", | ||||
|     media_library: { | ||||
|         max_file_size: 10240000, | ||||
|         folder_support: true | ||||
|     }, | ||||
|     site_url: "https://cantorgymnasium.de", | ||||
|     locale: "de", | ||||
|     slug: { | ||||
|         encoding: "ascii", | ||||
|         clean_accents: true, | ||||
|         sanitize_replacement: "-" | ||||
|     }, | ||||
|     collections: [ | ||||
|         SettingsCollection | ||||
|     ] | ||||
|   }, | ||||
|   local_backend: true, | ||||
|   media_folder: "/static/media", | ||||
|   public_folder: "/media", | ||||
|   media_library: { | ||||
|     max_file_size: 10240000, | ||||
|     folder_support: true, | ||||
|   }, | ||||
|   site_url: "https://cantorgymnasium.de", | ||||
|   locale: "de", | ||||
|   slug: { | ||||
|     encoding: "ascii", | ||||
|     clean_accents: true, | ||||
|     sanitize_replacement: "-", | ||||
|   }, | ||||
|   collections: [ | ||||
|     SettingsCollection, | ||||
|     IndexPagesCollection, | ||||
|     PagesCollection, | ||||
|     AuthorCollection, | ||||
|     BlogCollection, | ||||
|     FormsCollection, | ||||
|     GanztagCollection, | ||||
|     WettbewerbeCollection, | ||||
|     BegabteCollection, | ||||
|     ProjektwocheCollection, | ||||
|     ChronikjahreCollection, | ||||
|     SuperhaufenCollection, | ||||
|     CantorpreisCollection, | ||||
|     AbiturientenCollection, | ||||
|     CantorforaCollection, | ||||
|     ChronikseitenCollection, | ||||
|     StatsCollection, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export default config; | ||||
| export default config; | ||||
|   | ||||
| @@ -1,56 +1,77 @@ | ||||
| const MarkdownProps = { | ||||
|     toolbar_buttons: { | ||||
|         main: [ | ||||
|             'bold', | ||||
|             'italic', | ||||
|             'strikethrough', | ||||
|             'code', | ||||
|             'font', | ||||
|             'unordered-list', | ||||
|             'ordered-list', | ||||
|             'decrease-indent', | ||||
|             'increase-indent', | ||||
|             'insert-table', | ||||
|             'blockquote', | ||||
|             'file-link', | ||||
|             'code-block', | ||||
|             'shortcode', | ||||
|           ], | ||||
|           empty: [], | ||||
|           selection: ['bold', 'italic', 'strikethrough', 'code', 'font', 'file-link', 'blockquote'], | ||||
|           table_empty: [ | ||||
|             'bold', | ||||
|             'italic', | ||||
|             'strikethrough', | ||||
|             'code', | ||||
|             'insert-row', | ||||
|             'delete-row', | ||||
|             'insert-column', | ||||
|             'delete-column', | ||||
|             'delete-table', | ||||
|             'file-link', | ||||
|             'shortcode', | ||||
|           ], | ||||
|           table_selection: [ | ||||
|             'bold', | ||||
|             'italic', | ||||
|             'strikethrough', | ||||
|             'code', | ||||
|             'insert-row', | ||||
|             'delete-row', | ||||
|             'insert-column', | ||||
|             'delete-column', | ||||
|             'delete-table', | ||||
|             'file-link', | ||||
|             'shortcode', | ||||
|           ] | ||||
|     } | ||||
|   toolbar_buttons: { | ||||
|     main: [ | ||||
|       "bold", | ||||
|       "italic", | ||||
|       "strikethrough", | ||||
|       "code", | ||||
|       "font", | ||||
|       "unordered-list", | ||||
|       "ordered-list", | ||||
|       "decrease-indent", | ||||
|       "increase-indent", | ||||
|       "insert-table", | ||||
|       "blockquote", | ||||
|       "file-link", | ||||
|       "code-block", | ||||
|       "shortcode", | ||||
|     ], | ||||
|     empty: [], | ||||
|     selection: [ | ||||
|       "bold", | ||||
|       "italic", | ||||
|       "strikethrough", | ||||
|       "code", | ||||
|       "font", | ||||
|       "file-link", | ||||
|       "blockquote", | ||||
|     ], | ||||
|     table_empty: [ | ||||
|       "bold", | ||||
|       "italic", | ||||
|       "strikethrough", | ||||
|       "code", | ||||
|       "insert-row", | ||||
|       "delete-row", | ||||
|       "insert-column", | ||||
|       "delete-column", | ||||
|       "delete-table", | ||||
|       "file-link", | ||||
|       "shortcode", | ||||
|     ], | ||||
|     table_selection: [ | ||||
|       "bold", | ||||
|       "italic", | ||||
|       "strikethrough", | ||||
|       "code", | ||||
|       "insert-row", | ||||
|       "delete-row", | ||||
|       "insert-column", | ||||
|       "delete-column", | ||||
|       "delete-table", | ||||
|       "file-link", | ||||
|       "shortcode", | ||||
|     ], | ||||
|   }, | ||||
| }; | ||||
|  | ||||
| const DateFormat = { | ||||
|     date_format: "dd.MM.yyyy", | ||||
|     time_format: false, | ||||
|     format: "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" | ||||
|   date_format: "dd.MM.yyyy", | ||||
|   time_format: false, | ||||
|   format: "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", | ||||
| }; | ||||
|  | ||||
| export { MarkdownProps, DateFormat }; | ||||
| const DataObject = { | ||||
|   widget: "object", | ||||
|   collapsed: true, | ||||
|   summary: "{{fields.enable | ternary('aktiv', 'inaktiv')}}", | ||||
| }; | ||||
|  | ||||
| const PatternEmail = { | ||||
|   pattern: [ | ||||
|     "^\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$", | ||||
|     "name@domain.tld", | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export { MarkdownProps, DateFormat, DataObject, PatternEmail }; | ||||
|   | ||||
| @@ -1,43 +1,51 @@ | ||||
| import { AbiturientenCollection, CantorforaCollection, CantorpreisCollection, ChronikjahreCollection, ChronikseitenCollection, SuperhaufenCollection } from "./collections/index.js"; | ||||
|  | ||||
| import { | ||||
|   AbiturientenCollection, | ||||
|   CantorforaCollection, | ||||
|   CantorpreisCollection, | ||||
|   ChronikjahreCollection, | ||||
|   ChronikseitenCollection, | ||||
|   StatsCollection, | ||||
|   SuperhaufenCollection, | ||||
| } from "./collections/index.js"; | ||||
|  | ||||
| const config = { | ||||
|     backend: { | ||||
|         name: "gitea", | ||||
|         repo: "gcg/gcg-website", | ||||
|         branch: "master", | ||||
|         api_root: "https://git.cantorgymnasium.de/api/v1", | ||||
|         base_url: "https://oauth.cantorgymnasium.de", | ||||
|         commit_messages: { | ||||
|             create: "{{collection}} {{slug}} erstellt", | ||||
|             update: "{{collection}} {{slug}} aktualisiert", | ||||
|             delete: "{{collection}} {{slug}} gelöscht", | ||||
|             updateMedia: "{{path}} hochgeladen", | ||||
|             deleteMedia: "{{path}} gelöscht" | ||||
|         } | ||||
|   backend: { | ||||
|     name: "gitea", | ||||
|     repo: "gcg/gcg-website", | ||||
|     branch: "master", | ||||
|     api_root: "https://git.cantorgymnasium.de/api/v1", | ||||
|     base_url: "https://oauth.cantorgymnasium.de", | ||||
|     commit_messages: { | ||||
|       create: "{{collection}} {{slug}} erstellt", | ||||
|       update: "{{collection}} {{slug}} aktualisiert", | ||||
|       delete: "{{collection}} {{slug}} gelöscht", | ||||
|       updateMedia: "{{path}} hochgeladen", | ||||
|       deleteMedia: "{{path}} gelöscht", | ||||
|     }, | ||||
|     local_backend: true, | ||||
|     media_folder: "/static/media", | ||||
|     public_folder: "/media", | ||||
|     media_library: { | ||||
|         max_file_size: 10240000, | ||||
|         folder_support: true | ||||
|     }, | ||||
|     site_url: "https://cantorgymnasium.de/schulchronik/", | ||||
|     locale: "de", | ||||
|     slug: { | ||||
|         encoding: "ascii", | ||||
|         clean_accents: true, | ||||
|         sanitize_replacement: "-" | ||||
|     }, | ||||
|     collections: [ | ||||
|         ChronikjahreCollection, | ||||
|         SuperhaufenCollection, | ||||
|         CantorpreisCollection, | ||||
|         AbiturientenCollection, | ||||
|         CantorforaCollection, | ||||
|         ChronikseitenCollection | ||||
|     ] | ||||
|   }, | ||||
|   local_backend: true, | ||||
|   media_folder: "/static/media", | ||||
|   public_folder: "/media", | ||||
|   media_library: { | ||||
|     max_file_size: 10240000, | ||||
|     folder_support: true, | ||||
|   }, | ||||
|   site_url: "https://cantorgymnasium.de/schulchronik/", | ||||
|   locale: "de", | ||||
|   slug: { | ||||
|     encoding: "ascii", | ||||
|     clean_accents: true, | ||||
|     sanitize_replacement: "-", | ||||
|   }, | ||||
|   collections: [ | ||||
|     ChronikjahreCollection, | ||||
|     SuperhaufenCollection, | ||||
|     CantorpreisCollection, | ||||
|     AbiturientenCollection, | ||||
|     CantorforaCollection, | ||||
|     ChronikseitenCollection, | ||||
|     StatsCollection, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
| export default config; | ||||
| export default config; | ||||
|   | ||||
| @@ -1,37 +1,36 @@ | ||||
| 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", | ||||
|     schulchronik: "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; | ||||
|    | ||||
|   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", | ||||
|   schulchronik: "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; | ||||
|   | ||||
| @@ -3,8 +3,14 @@ | ||||
|   <head> | ||||
|     <meta charset="utf-8" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||
|     <link rel="stylesheet" href="https://assets.cantorgymnasium.de/fonts/mdi/v7/css/materialdesignicons.min.css"> | ||||
|     <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@staticcms/app@^2.0.0/dist/main.css" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://assets.cantorgymnasium.de/fonts/mdi/v7/css/materialdesignicons.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdn.jsdelivr.net/npm/@staticcms/app@^2.0.0/dist/main.css" | ||||
|     /> | ||||
|     <title>Static CMS</title> | ||||
|   </head> | ||||
|   <body> | ||||
| @@ -52,15 +58,15 @@ | ||||
|       import Icons from "./icons.js"; | ||||
|  | ||||
|       // cms initialization | ||||
|       CMS.init(); | ||||
|       CMS.init({ config }); | ||||
|  | ||||
|       // preview templates | ||||
|       CMS.registerPreviewTemplate("about-index", AboutPreview); | ||||
|       CMS.registerPreviewTemplate("blog", BlogPreview); | ||||
|       CMS.registerPreviewTemplate("wettbewerbe", ContestPreview); | ||||
|       CMS.registerPreviewTemplate("ganztagsangebote", GanztagPreview); | ||||
|       CMS.registerPreviewTemplate("contact-index", KontaktPreview); | ||||
|       CMS.registerPreviewTemplate("event-index", EventPreview); | ||||
|       CMS.registerPreviewTemplate("kontakt", KontaktPreview); | ||||
|       CMS.registerPreviewTemplate("termine", EventPreview); | ||||
|       CMS.registerPreviewTemplate("anmeldung-index", AnmeldungPreview); | ||||
|       CMS.registerPreviewTemplate("chronikjahre", ChronikPreview); | ||||
|       CMS.registerPreviewTemplate("anmeldeformular", AnmeldeformularPreview); | ||||
| @@ -116,7 +122,6 @@ | ||||
|       Icons.forEach((i) => CMS.registerIcon(i.name, i.icon)); | ||||
|  | ||||
|       // field previews | ||||
|  | ||||
|       CMS.registerFieldPreview("author", "active", BooleanPreview); | ||||
|       CMS.registerFieldPreview("author", "simplified", BooleanPreview); | ||||
|       CMS.registerFieldPreview("blog", "date", DatePreview); | ||||
| @@ -141,8 +146,15 @@ | ||||
|       ].forEach((collection) => | ||||
|         CMS.registerFieldPreview(collection, "draft", DraftPreview) | ||||
|       ); | ||||
|       ["blog", "author", "chronikseiten", "pages", "cantorpreis", "begabte"].forEach( | ||||
|         (collection) => CMS.registerFieldPreview(collection, "body", BodyPreview) | ||||
|       [ | ||||
|         "blog", | ||||
|         "author", | ||||
|         "chronikseiten", | ||||
|         "pages", | ||||
|         "cantorpreis", | ||||
|         "begabte", | ||||
|       ].forEach((collection) => | ||||
|         CMS.registerFieldPreview(collection, "body", BodyPreview) | ||||
|       ); | ||||
|       [ | ||||
|         "cantorpreis-index", | ||||
| @@ -154,8 +166,8 @@ | ||||
|         "blog-index", | ||||
|         "about-index", | ||||
|         "anmeldung-index", | ||||
|         "contact-index", | ||||
|         "event-index", | ||||
|         "kontakt", | ||||
|         "termine", | ||||
|         "forms-index", | ||||
|         "ganztagsangebote-index", | ||||
|         "begabte-index", | ||||
| @@ -166,6 +178,27 @@ | ||||
|       ["chronikseiten", "blog"].forEach((collection) => | ||||
|         CMS.registerFieldPreview(collection, "title", BodyPreview) | ||||
|       ); | ||||
|  | ||||
|       // access control | ||||
|       CMS.registerEventListener({ | ||||
|         name: "login", | ||||
|         handler: ({ login }) => { | ||||
|           const adminUsers = [ | ||||
|             "fberger", | ||||
|             "denyskon", | ||||
|             "gfelke", | ||||
|             "lberthold", | ||||
|             "cschapitz", | ||||
|             "bgorsler", | ||||
|           ]; | ||||
|           if (login && !adminUsers.includes(login)) { | ||||
|             alert( | ||||
|               "Sie sind nicht berechtigt, diese Seite aufzurufen. Sie werden nun auf die Startseite weitergeleitet." | ||||
|             ); | ||||
|             location.href = "/"; | ||||
|           } | ||||
|         }, | ||||
|       }); | ||||
|     </script> | ||||
|   </body> | ||||
| </html> | ||||
|   | ||||
| @@ -2,4 +2,4 @@ import StatusPage from "./status.js"; | ||||
|  | ||||
| import WikiLink from "./wiki.js"; | ||||
|  | ||||
| export { StatusPage, WikiLink }; | ||||
| export { StatusPage, WikiLink }; | ||||
|   | ||||
| @@ -1,17 +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", | ||||
| 	}, | ||||
|   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; | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| const WikiLink = { | ||||
| 	id: "wiki", | ||||
| 	title: "GCG.Wiki", | ||||
| 	data: "https://wiki.cantorgymnasium.de", | ||||
| 	options: { | ||||
| 		icon: "help", | ||||
| 	}, | ||||
|   id: "wiki", | ||||
|   title: "GCG.Wiki", | ||||
|   data: "https://wiki.cantorgymnasium.de", | ||||
|   options: { | ||||
|     icon: "help", | ||||
|   }, | ||||
| }; | ||||
|  | ||||
| export default WikiLink; | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| const BooleanPreview = ({ value }) => | ||||
| 	h("i", { | ||||
| 		className: value ? "mdi mdi-check" : "mdi mdi-close", | ||||
| 	}); | ||||
|   h("i", { | ||||
|     className: value ? "mdi mdi-check" : "mdi mdi-close", | ||||
|   }); | ||||
|  | ||||
| export default BooleanPreview; | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| function truncate(str, num) { | ||||
| 	if (str.length > num) { | ||||
| 		return str.slice(0, num) + "..."; | ||||
| 	} else { | ||||
| 		return str; | ||||
| 	} | ||||
|   if (str.length > num) { | ||||
|     return str.slice(0, num) + "..."; | ||||
|   } else { | ||||
|     return str; | ||||
|   } | ||||
| } | ||||
|  | ||||
| export default truncate; | ||||
|   | ||||
| @@ -1,13 +1,13 @@ | ||||
| const DatePreview = ({ value }) => | ||||
| 	h( | ||||
| 		"p", | ||||
| 		{}, | ||||
| 		new Intl.DateTimeFormat("de-DE", { | ||||
| 			year: "numeric", | ||||
| 			month: "2-digit", | ||||
| 			day: "2-digit", | ||||
| 			hour12: false, | ||||
| 		}).format(new Date(value)) | ||||
| 	); | ||||
|   h( | ||||
|     "p", | ||||
|     {}, | ||||
|     new Intl.DateTimeFormat("de-DE", { | ||||
|       year: "numeric", | ||||
|       month: "2-digit", | ||||
|       day: "2-digit", | ||||
|       hour12: false, | ||||
|     }).format(new Date(value)) | ||||
|   ); | ||||
|  | ||||
| export default DatePreview; | ||||
|   | ||||
| @@ -1,21 +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" | ||||
| 	); | ||||
|   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; | ||||
|   | ||||
| @@ -4,10 +4,4 @@ import CountPreview from "./count-preview.js"; | ||||
| import BodyPreview from "./body-preview.js"; | ||||
| import DatePreview from "./date-preview.js"; | ||||
|  | ||||
| export { | ||||
| 	BooleanPreview, | ||||
| 	DraftPreview, | ||||
| 	CountPreview, | ||||
| 	BodyPreview, | ||||
| 	DatePreview, | ||||
| }; | ||||
| export { BooleanPreview, DraftPreview, CountPreview, BodyPreview, DatePreview }; | ||||
|   | ||||
| @@ -1,32 +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 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")), | ||||
| 				]) | ||||
| 			) | ||||
| 		), | ||||
| 	]; | ||||
|   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; | ||||
|   | ||||
| @@ -1,64 +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 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, | ||||
| 	]; | ||||
|   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; | ||||
|   | ||||
| @@ -1,159 +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")) | ||||
| 				) | ||||
| 			) | ||||
| 		), | ||||
| 	]; | ||||
|   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; | ||||
|   | ||||
| @@ -1,44 +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) | ||||
| 								) | ||||
| 							) | ||||
| 						); | ||||
| 					}) | ||||
| 				) | ||||
| 			) | ||||
| 		), | ||||
| 	]; | ||||
|   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; | ||||
|   | ||||
| @@ -1,72 +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 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); | ||||
|   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 | ||||
| 							) | ||||
| 						) | ||||
| 					) | ||||
| 				) | ||||
| 			) | ||||
| 		), | ||||
| 	]; | ||||
|   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; | ||||
|   | ||||
| @@ -1,89 +1,89 @@ | ||||
| import { | ||||
| 	DateFormat, | ||||
| 	PageHeader, | ||||
| 	Section, | ||||
| 	Container, | ||||
| 	Col12, | ||||
| 	Row, | ||||
|   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 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") | ||||
| 					), | ||||
| 				]) | ||||
| 			) | ||||
| 		), | ||||
| 	]; | ||||
|   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:"), | ||||
|                 widgetFor("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; | ||||
|   | ||||
| @@ -1,49 +1,49 @@ | ||||
| import { | ||||
| 	PageHeader, | ||||
| 	Section, | ||||
| 	Container, | ||||
| 	Row, | ||||
| 	Content, | ||||
|   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 imageField = useMemo( | ||||
|     () => fields.find((field) => field.name === "image"), | ||||
|     [fields] | ||||
|   ); | ||||
|  | ||||
| 	const imageUrl = useMediaAsset( | ||||
| 		entry.data.image, | ||||
| 		collection, | ||||
| 		imageField, | ||||
| 		entry | ||||
| 	); | ||||
|   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")) | ||||
| 					), | ||||
| 				]) | ||||
| 			) | ||||
| 		), | ||||
| 	]; | ||||
|   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; | ||||
|   | ||||
| @@ -1,113 +1,113 @@ | ||||
| import { PageHeader } from "./components/index.js"; | ||||
|  | ||||
| const ChronikIndexPreview = ({ | ||||
| 	widgetFor, | ||||
| 	widgetsFor, | ||||
| 	entry, | ||||
| 	fields, | ||||
| 	collection, | ||||
|   widgetFor, | ||||
|   widgetsFor, | ||||
|   entry, | ||||
|   fields, | ||||
|   collection, | ||||
| }) => { | ||||
| 	const imageField = useMemo( | ||||
| 		() => fields.find((field) => field.name === "image"), | ||||
| 		[fields] | ||||
| 	); | ||||
|   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" | ||||
| 									) | ||||
| 								) | ||||
| 							) | ||||
| 						) | ||||
| 					) | ||||
| 				) | ||||
| 			) | ||||
| 		), | ||||
| 	]; | ||||
|   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; | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| import { PageHeader } from "./components/index.js"; | ||||
|  | ||||
| const ChronikPreview = ({ widgetFor, widgetsFor, entry, document, window }) => { | ||||
| 	/*return [PageHeader, | ||||
|   /*return [PageHeader, | ||||
|             h('section', {className: "section-sm"}, | ||||
|                 h('div', {className: "container"}, | ||||
|                     h('div', {className: "row"}, | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| const Section = (children) => | ||||
| 	h("section", { className: "section-sm" }, 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); | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| const DateFormat = ({ date, format }) => { | ||||
| 	return new Intl.DateTimeFormat("de-DE", format).format(new Date(date)); | ||||
|   return new Intl.DateTimeFormat("de-DE", format).format(new Date(date)); | ||||
| }; | ||||
|  | ||||
| export default DateFormat; | ||||
|   | ||||
| @@ -1,51 +1,51 @@ | ||||
| const PageHeader = (entry) => { | ||||
| 	return h( | ||||
| 		"section", | ||||
| 		{ | ||||
| 			key: "page-header", | ||||
| 			className: "page-title-section overlay", | ||||
| 			style: { | ||||
| 				backgroundImage: | ||||
| 					'url("/media/titelbild.webp"),url("/media/titelbild.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) | ||||
| 				) | ||||
| 			) | ||||
| 		) | ||||
| 	); | ||||
|   return h( | ||||
|     "section", | ||||
|     { | ||||
|       key: "page-header", | ||||
|       className: "page-title-section overlay", | ||||
|       style: { | ||||
|         backgroundImage: | ||||
|           'url("/media/titelbild.webp"),url("/media/titelbild.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; | ||||
|   | ||||
| @@ -1,65 +1,64 @@ | ||||
| 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 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 && | ||||
| 				entry.data.image != "/media/image.webp" | ||||
| 					? 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"))), | ||||
| 			]) | ||||
| 		), | ||||
| 	]; | ||||
|   const imageUrl = useMediaAsset( | ||||
|     entry.data.image, | ||||
|     collection, | ||||
|     imageField, | ||||
|     entry | ||||
|   ); | ||||
|   return [ | ||||
|     PageHeader(entry), | ||||
|     Section( | ||||
|       Container([ | ||||
|         entry.data.image && entry.data.image != "/media/image.webp" | ||||
|           ? 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; | ||||
|   | ||||
| @@ -1,147 +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; | ||||
| 	} | ||||
|   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 | ||||
| 									) | ||||
| 								) | ||||
| 							) | ||||
| 						) | ||||
| 					) | ||||
| 				) | ||||
| 			) | ||||
| 		), | ||||
| 	]; | ||||
|   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; | ||||
|   | ||||
| @@ -1,64 +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") | ||||
| 					) | ||||
| 				) | ||||
| 			) | ||||
| 		), | ||||
| 	]; | ||||
|   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; | ||||
|   | ||||
| @@ -1,127 +1,127 @@ | ||||
| import { | ||||
| 	Col12, | ||||
| 	Container, | ||||
| 	PageHeader, | ||||
| 	Row, | ||||
| 	Section, | ||||
|   Col12, | ||||
|   Container, | ||||
|   PageHeader, | ||||
|   Row, | ||||
|   Section, | ||||
| } from "./components/index.js"; | ||||
|  | ||||
| const GanztagPreview = ({ | ||||
| 	widgetFor, | ||||
| 	widgetsFor, | ||||
| 	entry, | ||||
| 	fields, | ||||
| 	collection, | ||||
|   widgetFor, | ||||
|   widgetsFor, | ||||
|   entry, | ||||
|   fields, | ||||
|   collection, | ||||
| }) => { | ||||
| 	const imageField = useMemo(() => { | ||||
| 		return fields.find((field) => field.name === "image"); | ||||
| 	}, [fields]); | ||||
|   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"))), | ||||
| 			]) | ||||
| 		), | ||||
| 	]; | ||||
|   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; | ||||
|   | ||||
| @@ -19,22 +19,22 @@ 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, | ||||
|   AboutPreview, | ||||
|   BlogPreview, | ||||
|   ContestPreview, | ||||
|   GanztagPreview, | ||||
|   PagePreview, | ||||
|   EventPreview, | ||||
|   AnmeldungPreview, | ||||
|   HeaderPreview, | ||||
|   ChronikPreview, | ||||
|   KontaktPreview, | ||||
|   AnmeldeformularPreview, | ||||
|   ChronikIndexPreview, | ||||
|   AuthorPreview, | ||||
|   FormsPreview, | ||||
|   CantorpreisPreview, | ||||
|   ProjektwochePreview, | ||||
|   AbiturientenPreview, | ||||
|   PreviewStyles, | ||||
| }; | ||||
|   | ||||
| @@ -1,98 +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" | ||||
| 									) | ||||
| 								) | ||||
| 							) | ||||
| 						) | ||||
| 					) | ||||
| 				) | ||||
| 			) | ||||
| 		), | ||||
| 	]; | ||||
|   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; | ||||
|   | ||||
| @@ -1,26 +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")) | ||||
| 					) | ||||
| 				) | ||||
| 			) | ||||
| 		), | ||||
| 	]; | ||||
|   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; | ||||
|   | ||||
| @@ -1,55 +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" | ||||
| 									) | ||||
| 								) | ||||
| 							) | ||||
| 						) | ||||
| 					), | ||||
| 				]) | ||||
| 			), | ||||
| 		]), | ||||
| 	]; | ||||
|   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; | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| 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/ubuntu/ubuntu.css", | ||||
| 	"https://assets.cantorgymnasium.de/fonts/mdi/v7/css/materialdesignicons.min.css", | ||||
| 	"https://cantorgymnasium.de/scss/style.css", | ||||
|   "https://assets.cantorgymnasium.de/bootstrap/v5/css/bootstrap.min.css", | ||||
|   "https://assets.cantorgymnasium.de/fonts/fira/fira.css", | ||||
|   "https://assets.cantorgymnasium.de/fonts/ubuntu/ubuntu.css", | ||||
|   "https://assets.cantorgymnasium.de/fonts/mdi/v7/css/materialdesignicons.min.css", | ||||
|   "https://cantorgymnasium.de/scss/style.css", | ||||
| ]; | ||||
|  | ||||
| export default PreviewStyles; | ||||
|   | ||||
| @@ -1,67 +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; | ||||
|   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 handleChange = ({ path }) => { | ||||
|       onChange({ src: path }); | ||||
|     }; | ||||
|  | ||||
| 		const handleOpenMediaLibrary = useMediaInsert( | ||||
| 			src, | ||||
| 			{ collection, field }, | ||||
| 			handleChange | ||||
| 		); | ||||
|     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 }) | ||||
| 		); | ||||
| 	}, | ||||
|     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; | ||||
|   | ||||
| @@ -1,75 +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() }; | ||||
| 		} | ||||
|   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" | ||||
| 					) | ||||
| 				) | ||||
| 			) | ||||
| 		); | ||||
| 	}, | ||||
|     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; | ||||
|   | ||||
| @@ -1,12 +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 | ||||
| 	); | ||||
|   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 top-3 bottom-3" + | ||||
|         (opts.vertical ? " flex-col" : ""), | ||||
|     }, | ||||
|     child | ||||
|   ); | ||||
|  | ||||
| export default Card; | ||||
|   | ||||
| @@ -1,41 +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" | ||||
| 				) | ||||
| 			) | ||||
| 		) | ||||
| 	); | ||||
|   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; | ||||
|   | ||||
| @@ -1,21 +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, | ||||
| 		}) | ||||
| 	); | ||||
|   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; | ||||
|   | ||||
| @@ -1,76 +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() }; | ||||
| 		} | ||||
|   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" | ||||
| 					) | ||||
| 				) | ||||
| 			) | ||||
| 		); | ||||
| 	}, | ||||
|     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; | ||||
|   | ||||
| @@ -1,73 +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; | ||||
|   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 handleChange = ({ path }) => { | ||||
|       onChange({ dir: path }); | ||||
|     }; | ||||
|  | ||||
| 		const handleOpenMediaLibrary = useMediaInsert( | ||||
| 			dir, | ||||
| 			{ collection, field, forFolder: true }, | ||||
| 			handleChange | ||||
| 		); | ||||
|     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) | ||||
| 			) | ||||
| 		); | ||||
| 	}, | ||||
|     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; | ||||
|   | ||||
| @@ -2,63 +2,63 @@ 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('"', "") ?? "", | ||||
| 			}; | ||||
| 		} | ||||
|   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; | ||||
|     return { src: "" }; | ||||
|   }, | ||||
|   toArgs: ({ src }) => { | ||||
|     return [`src=\"${src}\"`]; | ||||
|   }, | ||||
|   control: ({ src, onChange, controlProps }) => { | ||||
|     const { collection, field, entry } = controlProps; | ||||
|  | ||||
| 		const handleChange = ({ path }) => { | ||||
| 			onChange({ src: path }); | ||||
| 		}; | ||||
|     const handleChange = ({ path }) => { | ||||
|       onChange({ src: path }); | ||||
|     }; | ||||
|  | ||||
| 		const handleOpenMediaLibrary = useMediaInsert( | ||||
| 			src, | ||||
| 			{ collection, field }, | ||||
| 			handleChange | ||||
| 		); | ||||
| 		const assetSource = useMediaAsset(src, collection, field, entry); | ||||
|     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, | ||||
| 				}) | ||||
| 			) | ||||
| 		); | ||||
| 	}, | ||||
|     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; | ||||
|   | ||||
| @@ -7,11 +7,11 @@ import AudioShortcode from "./audio.js"; | ||||
| import SliderShortcode from "./slider.js"; | ||||
|  | ||||
| export { | ||||
| 	GalleryShortcode, | ||||
| 	ImageShortcode, | ||||
| 	DownloadShortcode, | ||||
| 	CardShortcode, | ||||
| 	YoutubeShortcode, | ||||
| 	AudioShortcode, | ||||
| 	SliderShortcode, | ||||
|   GalleryShortcode, | ||||
|   ImageShortcode, | ||||
|   DownloadShortcode, | ||||
|   CardShortcode, | ||||
|   YoutubeShortcode, | ||||
|   AudioShortcode, | ||||
|   SliderShortcode, | ||||
| }; | ||||
|   | ||||
| @@ -1,73 +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; | ||||
|   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 handleChange = ({ path }) => { | ||||
|       onChange({ dir: path }); | ||||
|     }; | ||||
|  | ||||
| 		const handleOpenMediaLibrary = useMediaInsert( | ||||
| 			dir, | ||||
| 			{ collection, field, forFolder: true }, | ||||
| 			handleChange | ||||
| 		); | ||||
|     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) | ||||
| 			) | ||||
| 		); | ||||
| 	}, | ||||
|     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; | ||||
|   | ||||
| @@ -1,59 +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] }; | ||||
| 		} | ||||
|   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}`, | ||||
| 				}, | ||||
| 				"" | ||||
| 			) | ||||
| 		); | ||||
| 	}, | ||||
|     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; | ||||
|   | ||||
| @@ -3,8 +3,14 @@ | ||||
|   <head> | ||||
|     <meta charset="utf-8" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||
|     <link rel="stylesheet" href="https://assets.cantorgymnasium.de/fonts/mdi/v7/css/materialdesignicons.min.css"> | ||||
|     <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@staticcms/app@^2.0.0/dist/main.css" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://assets.cantorgymnasium.de/fonts/mdi/v7/css/materialdesignicons.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdn.jsdelivr.net/npm/@staticcms/app@^2.0.0/dist/main.css" | ||||
|     /> | ||||
|     <title>Chronikverwaltung</title> | ||||
|   </head> | ||||
|   <body> | ||||
| @@ -52,10 +58,9 @@ | ||||
|       ["abiturienten", "cantorfora"].forEach((page) => | ||||
|         CMS.registerPreviewTemplate(page, AbiturientenPreview) | ||||
|       ); | ||||
|       [ | ||||
|         "cantorpreis-index", | ||||
|         "abiturienten-index", | ||||
|       ].forEach((page) => CMS.registerPreviewTemplate(page, HeaderPreview)); | ||||
|       ["cantorpreis-index", "abiturienten-index"].forEach((page) => | ||||
|         CMS.registerPreviewTemplate(page, HeaderPreview) | ||||
|       ); | ||||
|       [ | ||||
|         "abiturienten", | ||||
|         "cantorfora-index", | ||||
| @@ -96,15 +101,12 @@ | ||||
|       ].forEach((collection) => | ||||
|         CMS.registerFieldPreview(collection, "draft", DraftPreview) | ||||
|       ); | ||||
|       ["chronikseiten", "cantorpreis"].forEach( | ||||
|         (collection) => CMS.registerFieldPreview(collection, "body", BodyPreview) | ||||
|       ["chronikseiten", "cantorpreis"].forEach((collection) => | ||||
|         CMS.registerFieldPreview(collection, "body", BodyPreview) | ||||
|       ); | ||||
|       [ | ||||
|         "cantorpreis-index", | ||||
|         "abiturienten-index", | ||||
|         "cantorfora", | ||||
|       ].forEach((collection) => | ||||
|         CMS.registerFieldPreview(collection, "description", BodyPreview) | ||||
|       ["cantorpreis-index", "abiturienten-index", "cantorfora"].forEach( | ||||
|         (collection) => | ||||
|           CMS.registerFieldPreview(collection, "description", BodyPreview) | ||||
|       ); | ||||
|       CMS.registerFieldPreview("chronikseiten", "title", BodyPreview); | ||||
|     </script> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user