<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://schwarzatal.org/index.php?action=history&amp;feed=atom&amp;title=Eventform</id>
	<title>Eventform - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://schwarzatal.org/index.php?action=history&amp;feed=atom&amp;title=Eventform"/>
	<link rel="alternate" type="text/html" href="https://schwarzatal.org/index.php?title=Eventform&amp;action=history"/>
	<updated>2026-07-03T18:48:56Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Schwarzatal.org</subtitle>
	<generator>MediaWiki 1.44.5</generator>
	<entry>
		<id>https://schwarzatal.org/index.php?title=Eventform&amp;diff=896&amp;oldid=prev</id>
		<title>Admin: Die Seite wurde neu angelegt: „Hauptseite &gt; Schwarzatal.org   Diese Seite dokumentiert das &#039;&#039;&#039;Eventform-Gadget&#039;&#039;&#039;, mit dem eingeloggte Benutzer über ein Formular neue Veranstaltungsseiten anlegen können. Die Dokumentation ist so gehalten, dass das Gadget damit vollständig nachgebaut werden kann.  == Überblick ==  Das Eventform-Gadget blendet auf der Seite Veranstaltungen einen Button „Neue Veranstaltung anlegen&quot; ein. Ein Klick öffnet einen…“</title>
		<link rel="alternate" type="text/html" href="https://schwarzatal.org/index.php?title=Eventform&amp;diff=896&amp;oldid=prev"/>
		<updated>2026-07-02T22:00:43Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „&lt;a href=&quot;/index.php?title=Hauptseite&quot; title=&quot;Hauptseite&quot;&gt;Hauptseite&lt;/a&gt; &amp;gt; &lt;a href=&quot;/index.php?title=Hauptseite#Schwarzatal.org&quot; title=&quot;Hauptseite&quot;&gt;Schwarzatal.org&lt;/a&gt;   Diese Seite dokumentiert das &amp;#039;&amp;#039;&amp;#039;Eventform-Gadget&amp;#039;&amp;#039;&amp;#039;, mit dem eingeloggte Benutzer über ein Formular neue Veranstaltungsseiten anlegen können. Die Dokumentation ist so gehalten, dass das Gadget damit vollständig nachgebaut werden kann.  == Überblick ==  Das Eventform-Gadget blendet auf der Seite &lt;a href=&quot;/index.php?title=Veranstaltungen&quot; title=&quot;Veranstaltungen&quot;&gt;Veranstaltungen&lt;/a&gt; einen Button „Neue Veranstaltung anlegen&amp;quot; ein. Ein Klick öffnet einen…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Hauptseite]] &amp;gt; [[Hauptseite#Schwarzatal.org|Schwarzatal.org]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Seite dokumentiert das &amp;#039;&amp;#039;&amp;#039;Eventform-Gadget&amp;#039;&amp;#039;&amp;#039;, mit dem eingeloggte Benutzer über ein Formular neue Veranstaltungsseiten anlegen können. Die Dokumentation ist so gehalten, dass das Gadget damit vollständig nachgebaut werden kann.&lt;br /&gt;
&lt;br /&gt;
== Überblick ==&lt;br /&gt;
&lt;br /&gt;
Das Eventform-Gadget blendet auf der Seite [[Veranstaltungen]] einen Button „Neue Veranstaltung anlegen&amp;quot; ein. Ein Klick öffnet einen Formular-Dialog. Nach dem Ausfüllen erzeugt das Gadget eine neue Wiki-Seite mit standardisierter Struktur (Abschnitte Zeit, Event, Location, Photos &amp;amp; Videos) und leitet den Benutzer direkt dorthin weiter.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Eigenschaften:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Reines JavaScript-Gadget — keine Server-Extension, keine Änderung an &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; nötig (außer der einmaligen Aktivierung der Gadgets-Extension)&lt;br /&gt;
* Läuft nur auf einer konfigurierbaren Trigger-Seite und nur für eingeloggte Benutzer&lt;br /&gt;
* Prüft vor dem Anlegen, ob der Seitentitel bereits existiert (kein Überschreiben möglich)&lt;br /&gt;
* Erkennt GPS-Koordinaten in mehreren Formaten und generiert daraus automatisch Kartenlinks (OpenStreetMap, CoMaps, Google Maps), sofern die jeweiligen URL-Felder leer sind&lt;br /&gt;
&lt;br /&gt;
== Architektur ==&lt;br /&gt;
&lt;br /&gt;
Das Gadget besteht aus drei Wiki-Seiten und einer normalen Inhaltsseite:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Seite !! Zweck&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MediaWiki:Gadgets-definition&amp;lt;/code&amp;gt; || Registriert das Gadget beim ResourceLoader&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MediaWiki:Gadget-eventform.js&amp;lt;/code&amp;gt; || Gesamte Logik: Formular-Dialog, Koordinaten-Parser, Wikitext-Generator, API-Aufrufe&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MediaWiki:Gadget-eventform.css&amp;lt;/code&amp;gt; || Styling des Button-Containers&lt;br /&gt;
|-&lt;br /&gt;
| [[Veranstaltungen]] (Trigger-Seite) || Enthält den Anker &amp;lt;code&amp;gt;&amp;amp;lt;div id=&amp;quot;event-form-container&amp;quot;&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;lt;/code&amp;gt;, in den der Button gerendert wird&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Verwendete MediaWiki-Bausteine:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Extension:Gadgets Extension:Gadgets] — Auslieferung des Codes an die Browser&lt;br /&gt;
* [https://www.mediawiki.org/wiki/OOUI OOUI] (&amp;lt;code&amp;gt;oojs-ui-core&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;oojs-ui-windows&amp;lt;/code&amp;gt;) — Formular-Dialog und Button, in MediaWiki eingebaut&lt;br /&gt;
* &amp;lt;code&amp;gt;mediawiki.api&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;mw.Api&amp;lt;/code&amp;gt;) — Seitenexistenz-Prüfung und Seitenerstellung über die Action-API&lt;br /&gt;
* &amp;lt;code&amp;gt;mediawiki.util&amp;lt;/code&amp;gt; — URL-Erzeugung für die Weiterleitung&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Schritt 1: Gadgets-Extension aktivieren ===&lt;br /&gt;
&lt;br /&gt;
Die Gadgets-Extension liegt MediaWiki bei, muss aber ggf. aktiviert werden. In &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; (per FTP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wfLoadExtension( &amp;#039;Gadgets&amp;#039; );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kontrolle: Auf &amp;lt;code&amp;gt;Spezial:Version&amp;lt;/code&amp;gt; muss unter „Installierte Erweiterungen&amp;quot; der Eintrag &amp;#039;&amp;#039;&amp;#039;Gadgets&amp;#039;&amp;#039;&amp;#039; erscheinen.&lt;br /&gt;
&lt;br /&gt;
=== Schritt 2: Gadget registrieren ===&lt;br /&gt;
&lt;br /&gt;
Auf der Seite &amp;lt;code&amp;gt;MediaWiki:Gadgets-definition&amp;lt;/code&amp;gt; folgenden Block eintragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
== Werkzeuge ==&lt;br /&gt;
* eventform[ResourceLoader|default|rights=edit]|eventform.js|eventform.css&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bedeutung der Flags:&lt;br /&gt;
* &amp;lt;code&amp;gt;ResourceLoader&amp;lt;/code&amp;gt; — Auslieferung über den ResourceLoader (Caching, Minifizierung)&lt;br /&gt;
* &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; — für alle Benutzer standardmäßig aktiv (abwählbar unter Einstellungen → Gadgets)&lt;br /&gt;
* &amp;lt;code&amp;gt;rights=edit&amp;lt;/code&amp;gt; — nur Benutzer mit Bearbeitungsrecht erhalten das Gadget&lt;br /&gt;
&lt;br /&gt;
Kontrolle: Auf &amp;lt;code&amp;gt;Spezial:Gadgets&amp;lt;/code&amp;gt; muss „eventform&amp;quot; gelistet sein.&lt;br /&gt;
&lt;br /&gt;
=== Schritt 3: JavaScript anlegen ===&lt;br /&gt;
&lt;br /&gt;
Die Seite &amp;lt;code&amp;gt;MediaWiki:Gadget-eventform.js&amp;lt;/code&amp;gt; mit dem vollständigen Gadget-Code anlegen (siehe [[#Funktionsweise im Detail|Funktionsweise im Detail]] für die Logik; der aktuelle Code steht in der Versionsgeschichte der Seite selbst).&lt;br /&gt;
&lt;br /&gt;
=== Schritt 4: CSS anlegen ===&lt;br /&gt;
&lt;br /&gt;
Die Seite &amp;lt;code&amp;gt;MediaWiki:Gadget-eventform.css&amp;lt;/code&amp;gt; anlegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#event-form-container {&lt;br /&gt;
	margin: 1.5em 0;&lt;br /&gt;
	padding: 1em;&lt;br /&gt;
	background: #f8f9fa;&lt;br /&gt;
	border: 1px solid #c8ccd1;&lt;br /&gt;
	border-radius: 4px;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Schritt 5: Trigger-Seite vorbereiten ===&lt;br /&gt;
&lt;br /&gt;
Auf der Seite [[Veranstaltungen]] an gewünschter Stelle den Anker einfügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;event-form-container&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fehlt der Anker, hängt das Gadget den Button automatisch ans Ende des Seiteninhalts.&lt;br /&gt;
&lt;br /&gt;
=== Schritt 6: Testen ===&lt;br /&gt;
&lt;br /&gt;
# Eingeloggt die Seite [[Veranstaltungen]] aufrufen&lt;br /&gt;
# Hard-Reload durchführen (Strg+Shift+R), da der ResourceLoader aggressiv cacht&lt;br /&gt;
# Button „Neue Veranstaltung anlegen&amp;quot; muss erscheinen&lt;br /&gt;
&lt;br /&gt;
== Funktionsweise im Detail ==&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt beschreibt die Logik so, dass das Gadget nachprogrammiert werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Grundgerüst ===&lt;br /&gt;
&lt;br /&gt;
Der gesamte Code liegt in einer IIFE (&amp;lt;code&amp;gt;( function () { ... }() );&amp;lt;/code&amp;gt;) mit &amp;lt;code&amp;gt;&amp;#039;use strict&amp;#039;&amp;lt;/code&amp;gt;. Am Anfang stehen zwei Guards, die das Skript sofort beenden, wenn es nicht greifen soll:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;mw.config.get( &amp;#039;wgPageName&amp;#039; ) !== TRIGGER_PAGE&amp;lt;/code&amp;gt; — das Gadget wird zwar auf jeder Seite geladen (Gadgets sind global), rendert aber nur auf der konfigurierten Trigger-Seite. &amp;lt;code&amp;gt;TRIGGER_PAGE&amp;lt;/code&amp;gt; ist eine Konstante am Dateianfang (aktuell &amp;lt;code&amp;gt;&amp;#039;Veranstaltungen&amp;#039;&amp;lt;/code&amp;gt;). Achtung: &amp;lt;code&amp;gt;wgPageName&amp;lt;/code&amp;gt; verwendet Unterstriche statt Leerzeichen.&lt;br /&gt;
# &amp;lt;code&amp;gt;!mw.config.get( &amp;#039;wgUserName&amp;#039; )&amp;lt;/code&amp;gt; — anonyme Benutzer (Wert &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;) werden ausgeschlossen.&lt;br /&gt;
&lt;br /&gt;
Danach lädt &amp;lt;code&amp;gt;mw.loader.using( [...] )&amp;lt;/code&amp;gt; asynchron die benötigten Module. Erst im &amp;lt;code&amp;gt;.then()&amp;lt;/code&amp;gt;-Callback wird die UI aufgebaut — zu diesem Zeitpunkt ist das DOM garantiert bereit, ein zusätzlicher DOM-Ready-Wrapper ist nicht nötig (und führte in der Entwicklung zu Problemen, siehe [[#Bekannte Stolpersteine|Stolpersteine]]).&lt;br /&gt;
&lt;br /&gt;
Benötigte Module:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
oojs-ui-core, oojs-ui-windows, oojs-ui.styles.icons-interactions,&lt;br /&gt;
mediawiki.api, mediawiki.util&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Formular-Dialog (OOUI) ===&lt;br /&gt;
&lt;br /&gt;
Der Dialog ist eine Subklasse von &amp;lt;code&amp;gt;OO.ui.ProcessDialog&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;OO.inheritClass( EventDialog, OO.ui.ProcessDialog )&amp;lt;/code&amp;gt;&lt;br /&gt;
* Statische Eigenschaften: &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;actions&amp;lt;/code&amp;gt; (Aktion &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; mit Flags &amp;lt;code&amp;gt;primary, progressive&amp;lt;/code&amp;gt; sowie eine Abbrechen-Aktion mit Flag &amp;lt;code&amp;gt;safe&amp;lt;/code&amp;gt;)&lt;br /&gt;
* In &amp;lt;code&amp;gt;initialize()&amp;lt;/code&amp;gt; werden die Eingabefelder als &amp;lt;code&amp;gt;OO.ui.TextInputWidget&amp;lt;/code&amp;gt; erzeugt und über &amp;lt;code&amp;gt;OO.ui.FieldLayout&amp;lt;/code&amp;gt; in drei &amp;lt;code&amp;gt;OO.ui.FieldsetLayout&amp;lt;/code&amp;gt;-Gruppen gegliedert: &amp;#039;&amp;#039;Pflichtfelder&amp;#039;&amp;#039;, &amp;#039;&amp;#039;Event&amp;#039;&amp;#039;, &amp;#039;&amp;#039;Location&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;getBodyHeight()&amp;lt;/code&amp;gt; gibt eine feste Höhe (600px) zurück&lt;br /&gt;
* Der Dialog wird über einen &amp;lt;code&amp;gt;OO.ui.WindowManager&amp;lt;/code&amp;gt; geöffnet, der an &amp;lt;code&amp;gt;document.body&amp;lt;/code&amp;gt; hängt&lt;br /&gt;
&lt;br /&gt;
Felder (alle &amp;lt;code&amp;gt;TextInputWidget&amp;lt;/code&amp;gt;; Datum mit &amp;lt;code&amp;gt;type: &amp;#039;date&amp;#039;&amp;lt;/code&amp;gt;, Uhrzeit mit &amp;lt;code&amp;gt;type: &amp;#039;time&amp;#039;&amp;lt;/code&amp;gt; und Vorbelegung &amp;lt;code&amp;gt;17:00&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Pflicht !! Verwendung im Wikitext&lt;br /&gt;
|-&lt;br /&gt;
| Seitentitel || ja || Name der neuen Wiki-Seite&lt;br /&gt;
|-&lt;br /&gt;
| Datum || ja || Zeile &amp;lt;code&amp;gt;🗓️ …&amp;lt;/code&amp;gt; (wird unverändert als String übernommen)&lt;br /&gt;
|-&lt;br /&gt;
| Uhrzeit || nein || Zeile &amp;lt;code&amp;gt;⏰ …&amp;lt;/code&amp;gt;; bei leerem Feld entfällt die Zeile komplett&lt;br /&gt;
|-&lt;br /&gt;
| Bild (Dateiname) || nein || &amp;lt;code&amp;gt;[[file:…|frameless|upright=3.0]]&amp;lt;/code&amp;gt;; Rotlink erlaubt nachträglichen Upload per Klick&lt;br /&gt;
|-&lt;br /&gt;
| Website URL || nein || Zeile &amp;lt;code&amp;gt;🌐 …&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Adresse || nein || Zeile &amp;lt;code&amp;gt;📍 …&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| OpenStreetMap URL || nein || Zeile mit OSM-Icon; wird ggf. automatisch generiert&lt;br /&gt;
|-&lt;br /&gt;
| GPS-Koordinaten || nein || Zeile &amp;lt;code&amp;gt;🧭 …&amp;lt;/code&amp;gt; (Originaleingabe); Quelle der Auto-Generierung&lt;br /&gt;
|-&lt;br /&gt;
| CoMaps URL || nein || Zeile mit CoMaps-Icon; wird ggf. automatisch generiert&lt;br /&gt;
|-&lt;br /&gt;
| Google Maps URL || nein || Zeile mit Google-Maps-Icon; wird ggf. automatisch generiert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Speicher-Ablauf ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;getActionProcess( &amp;#039;save&amp;#039; )&amp;lt;/code&amp;gt; gibt einen &amp;lt;code&amp;gt;OO.ui.Process&amp;lt;/code&amp;gt; zurück, dessen Callback:&lt;br /&gt;
&lt;br /&gt;
# Alle Feldwerte ausliest und trimmt&lt;br /&gt;
# Pflichtfelder prüft (Titel, Datum); bei Fehlern wird ein &amp;lt;code&amp;gt;OO.ui.Error&amp;lt;/code&amp;gt; mit &amp;lt;code&amp;gt;recoverable: true&amp;lt;/code&amp;gt; zurückgegeben — der Dialog zeigt die Meldung an und bleibt offen&lt;br /&gt;
# Koordinaten parst (siehe unten) und leere Karten-URL-Felder automatisch befüllt&lt;br /&gt;
# Den Wikitext generiert (siehe unten)&lt;br /&gt;
# Per &amp;lt;code&amp;gt;api.get( { action: &amp;#039;query&amp;#039;, titles: titel } )&amp;lt;/code&amp;gt; prüft, ob die Seite existiert (&amp;lt;code&amp;gt;page.missing&amp;lt;/code&amp;gt; im Ergebnis); wenn ja → Fehler „existiert bereits&amp;quot;&lt;br /&gt;
# Per &amp;lt;code&amp;gt;api.postWithToken( &amp;#039;csrf&amp;#039;, { action: &amp;#039;edit&amp;#039;, title, text, createonly: true, summary } )&amp;lt;/code&amp;gt; die Seite anlegt. &amp;lt;code&amp;gt;createonly&amp;lt;/code&amp;gt; ist eine zweite Absicherung gegen Überschreiben (Race Condition zwischen Prüfung und Anlage)&lt;br /&gt;
# Bei Erfolg per &amp;lt;code&amp;gt;window.location.href = mw.util.getUrl( titel )&amp;lt;/code&amp;gt; zur neuen Seite weiterleitet&lt;br /&gt;
&lt;br /&gt;
=== Koordinaten-Parser ===&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;parseCoordinates( input )&amp;lt;/code&amp;gt; gibt &amp;lt;code&amp;gt;{ lat, lng }&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; zurück. Sie probiert nacheinander mehrere reguläre Ausdrücke; der erste Treffer mit plausiblen Werten (|lat| ≤ 90, |lng| ≤ 180) gewinnt:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Deutsches Dezimalformat&amp;#039;&amp;#039;&amp;#039; (Komma als Dezimaltrenner): &amp;lt;code&amp;gt;47,7073132, 15,9934565&amp;lt;/code&amp;gt; — auch mit Semikolon oder Leerzeichen als Koordinatentrenner. Wichtig, weil die Google-Maps-App auf deutschsprachigen Geräten dieses Format in die Zwischenablage kopiert. Erkennungslogik: zwei Zahlen mit Dezimal-Komma, getrennt durch &amp;lt;code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;/code&amp;gt; (Komma+Leerzeichen), Semikolon oder Leerzeichen. Vor &amp;lt;code&amp;gt;parseFloat&amp;lt;/code&amp;gt; wird das Komma durch einen Punkt ersetzt.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Internationales Dezimalformat&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;48.0542, 15.4276&amp;lt;/code&amp;gt;, auch ohne Leerzeichen, mit Semikolon oder nur Leerzeichen, negative Werte erlaubt&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Dezimal mit Himmelsrichtungen&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;47.75N 15.68E&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;47,75°N, 15,68°E&amp;lt;/code&amp;gt; — S und W negieren den Wert&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Grad-Minuten-Sekunden (DMS)&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;47°45&amp;#039;00.0&amp;quot;N 15°40&amp;#039;48.0&amp;quot;E&amp;lt;/code&amp;gt; — Umrechnung: Grad + Minuten/60 + Sekunden/3600. Akzeptiert sowohl gerade (&amp;lt;code&amp;gt;&amp;#039;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt;) als auch typografische Zeichen (&amp;lt;code&amp;gt;’&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;”&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;′&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;″&amp;lt;/code&amp;gt;), da mobile Betriebssysteme beim Kopieren oft typografische Zeichen erzeugen&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Grad-Dezimalminuten (DM)&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;47°45.000&amp;#039;N 15°40.800&amp;#039;E&amp;lt;/code&amp;gt; — Umrechnung: Grad + Minuten/60&lt;br /&gt;
&lt;br /&gt;
=== Automatische Kartenlink-Generierung ===&lt;br /&gt;
&lt;br /&gt;
Wenn &amp;lt;code&amp;gt;parseCoordinates&amp;lt;/code&amp;gt; erfolgreich war, werden für &amp;#039;&amp;#039;&amp;#039;leere&amp;#039;&amp;#039;&amp;#039; URL-Felder Links generiert (vom Benutzer ausgefüllte Felder haben immer Vorrang). Die Koordinaten werden mit &amp;lt;code&amp;gt;toFixed( 7 )&amp;lt;/code&amp;gt; formatiert:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Dienst !! URL-Schema&lt;br /&gt;
|-&lt;br /&gt;
| OpenStreetMap || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.openstreetmap.org/?mlat=LAT&amp;amp;mlon=LNG#map=17/LAT/LNG&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (Pin + Zoomstufe 17)&lt;br /&gt;
|-&lt;br /&gt;
| CoMaps || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://comaps.at/LAT,LNG&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (CoMaps ist ein Fork von Organic Maps und nutzt dessen URL-Schema)&lt;br /&gt;
|-&lt;br /&gt;
| Google Maps || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.google.com/maps?q=LAT,LNG&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wikitext-Generator ===&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;buildWikitext( fields )&amp;lt;/code&amp;gt; baut die Seite als Array von Zeilen auf und verbindet sie mit &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;. Regeln:&lt;br /&gt;
&lt;br /&gt;
* Erste Zeile ist die Breadcrumb-Navigation: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[Hauptseite]] &amp;gt; [[Hauptseite#Kultur &amp;amp; Events|Kultur &amp;amp; Events]] &amp;gt; [[Veranstaltungen]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Abschnitte in fester Reihenfolge: &amp;lt;code&amp;gt;==Zeit==&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;==Event==&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;==Location==&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;==Photos &amp;amp; Videos==&amp;lt;/code&amp;gt;&lt;br /&gt;
* Optionale Zeilen (Uhrzeit, Bild, Website, alle Location-Zeilen) werden bei leerem Feld &amp;#039;&amp;#039;&amp;#039;komplett weggelassen&amp;#039;&amp;#039;&amp;#039; — es entstehen keine leeren Zeilen oder verwaisten Symbole&lt;br /&gt;
* Im Location-Abschnitt wird zwischen den vorhandenen Zeilen jeweils eine Leerzeile eingefügt (jede Zeile wird ein eigener Absatz); Hilfskonstruktion: eine Funktion &amp;lt;code&amp;gt;addLocLine&amp;lt;/code&amp;gt; mit einem &amp;lt;code&amp;gt;locFirst&amp;lt;/code&amp;gt;-Flag, das vor jeder Zeile außer der ersten eine Leerzeile einschiebt&lt;br /&gt;
* URLs werden als Klartext eingefügt — MediaWiki wandelt &amp;lt;code&amp;gt;https://…&amp;lt;/code&amp;gt; automatisch in klickbare Links um&lt;br /&gt;
* Jeder Abschnitt endet mit vier &amp;lt;code&amp;gt;&amp;amp;lt;br&amp;amp;gt;&amp;lt;/code&amp;gt;-Zeilen (Layout-Vorgabe der Event-Seiten)&lt;br /&gt;
* Karten-Zeilen mit Icons: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[file:osm.png|24px|link=]] URL&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (analog &amp;lt;code&amp;gt;CoMaps.png&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;GoogleMaps.png&amp;lt;/code&amp;gt;) — die Icon-Dateien müssen im Wiki hochgeladen sein&lt;br /&gt;
&lt;br /&gt;
== Manual: Benutzung ==&lt;br /&gt;
&lt;br /&gt;
# Auf der Seite [[Veranstaltungen]] den Button &amp;#039;&amp;#039;&amp;#039;Neue Veranstaltung anlegen&amp;#039;&amp;#039;&amp;#039; klicken (nur sichtbar, wenn eingeloggt)&lt;br /&gt;
# Pflichtfelder ausfüllen: &amp;#039;&amp;#039;&amp;#039;Seitentitel&amp;#039;&amp;#039;&amp;#039; (wird der Name der Wiki-Seite, muss eindeutig sein) und &amp;#039;&amp;#039;&amp;#039;Datum&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# Optional: Uhrzeit (Vorbelegung 17:00, kann geleert werden), Bild-Dateiname, Website, Adresse, Kartenlinks, GPS-Koordinaten&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Tipp Bild:&amp;#039;&amp;#039;&amp;#039; Einen sinnvollen Dateinamen mit Endung vergeben (z.B. &amp;lt;code&amp;gt;Sommerfest2026.jpg&amp;lt;/code&amp;gt;). Auf der fertigen Seite erscheint ein Rotlink, über den das Bild direkt hochgeladen werden kann. Alternativ vorher unter [[Spezial:Hochladen]] hochladen.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Tipp Koordinaten:&amp;#039;&amp;#039;&amp;#039; Aus einer Karten-App kopieren und einfügen — deutsche Schreibweise mit Komma (&amp;lt;code&amp;gt;47,7073132, 15,9934565&amp;lt;/code&amp;gt;) wird erkannt. Bei eingetragenen Koordinaten werden fehlende Links zu OpenStreetMap, CoMaps und Google Maps automatisch ergänzt.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Seite anlegen&amp;#039;&amp;#039;&amp;#039; klicken. Bei Erfolg erfolgt die Weiterleitung auf die neue Seite. Existiert der Titel bereits, erscheint eine Fehlermeldung und das Formular bleibt offen.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration und Anpassung ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Trigger-Seite ändern:&amp;#039;&amp;#039;&amp;#039; Konstante &amp;lt;code&amp;gt;TRIGGER_PAGE&amp;lt;/code&amp;gt; am Anfang von &amp;lt;code&amp;gt;MediaWiki:Gadget-eventform.js&amp;lt;/code&amp;gt; anpassen. Leerzeichen im Seitennamen als Unterstrich schreiben.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Felder hinzufügen:&amp;#039;&amp;#039;&amp;#039; (1) &amp;lt;code&amp;gt;TextInputWidget&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;initialize()&amp;lt;/code&amp;gt; anlegen, (2) &amp;lt;code&amp;gt;FieldLayout&amp;lt;/code&amp;gt; im passenden Fieldset ergänzen, (3) Wert in &amp;lt;code&amp;gt;getActionProcess&amp;lt;/code&amp;gt; ins &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt;-Objekt aufnehmen, (4) Ausgabe in &amp;lt;code&amp;gt;buildWikitext&amp;lt;/code&amp;gt; ergänzen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Seitenstruktur ändern:&amp;#039;&amp;#039;&amp;#039; Nur &amp;lt;code&amp;gt;buildWikitext&amp;lt;/code&amp;gt; anpassen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Berechtigungen:&amp;#039;&amp;#039;&amp;#039; Über das Flag &amp;lt;code&amp;gt;rights=…&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;MediaWiki:Gadgets-definition&amp;lt;/code&amp;gt; steuerbar (z.B. &amp;lt;code&amp;gt;rights=edit&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Bekannte Stolpersteine ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;ResourceLoader-Cache:&amp;#039;&amp;#039;&amp;#039; Nach jeder Änderung an Gadget-JS/CSS ist im Browser ein Hard-Reload nötig (Strg+Shift+R), teils dauert es zusätzlich bis zu ~5 Minuten, bis der ResourceLoader serverseitig neu ausliefert. Bei „Änderung wirkt nicht&amp;quot;-Symptomen zuerst immer an den Cache denken — auch am Handy.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kein DOM-Ready-Wrapper im &amp;lt;code&amp;gt;then()&amp;lt;/code&amp;gt;:&amp;#039;&amp;#039;&amp;#039; Ein &amp;lt;code&amp;gt;$( function () { … } )&amp;lt;/code&amp;gt; innerhalb des &amp;lt;code&amp;gt;mw.loader.using().then()&amp;lt;/code&amp;gt;-Callbacks kann dazu führen, dass der Handler nie feuert. Der UI-Code gehört direkt in den &amp;lt;code&amp;gt;then()&amp;lt;/code&amp;gt;-Callback.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;wgPageName&amp;lt;/code&amp;gt; exakt treffen:&amp;#039;&amp;#039;&amp;#039; Groß-/Kleinschreibung und Unterstriche müssen exakt stimmen, sonst beendet sich das Gadget kommentarlos.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Icon-Dateien:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;osm.png&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CoMaps.png&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;GoogleMaps.png&amp;lt;/code&amp;gt; müssen im Wiki existieren, sonst erscheinen Rotlinks in den Location-Zeilen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Debugging:&amp;#039;&amp;#039;&amp;#039; In der Browser-Konsole prüfen: &amp;lt;code&amp;gt;mw.loader.getState(&amp;#039;ext.gadget.eventform&amp;#039;)&amp;lt;/code&amp;gt; muss &amp;lt;code&amp;gt;&amp;quot;ready&amp;quot;&amp;lt;/code&amp;gt; liefern; &amp;lt;code&amp;gt;mw.config.get(&amp;#039;wgPageName&amp;#039;)&amp;lt;/code&amp;gt; muss der Trigger-Seite entsprechen. Für Debugging über Seitenwechsel hinweg in den DevTools „Persistente Logs&amp;quot; aktivieren.&lt;br /&gt;
&lt;br /&gt;
== Grenzen der Lösung ==&lt;br /&gt;
&lt;br /&gt;
* Keine serverseitige Validierung — das Gadget läuft vollständig im Browser. Die Rechte-Durchsetzung übernimmt die MediaWiki-API (ein Benutzer kann nur anlegen, was er auch manuell anlegen dürfte).&lt;br /&gt;
* Das Datum wird als freier String übernommen, ohne Plausibilitätsprüfung.&lt;br /&gt;
* Keine Vorschau vor dem Anlegen (Erweiterung möglich).&lt;br /&gt;
* Für strukturierte Abfragen über Events (z.B. „alle Veranstaltungen im Mai&amp;quot;) wäre langfristig eine Lösung mit [https://www.mediawiki.org/wiki/Extension:Page_Forms Page Forms] und [https://www.mediawiki.org/wiki/Extension:Cargo Cargo] geeigneter.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>