flatpickr now uses an alternative display input with altFormat d.m.Y,
typed input is parsed in that format as well. The submitted value stays
ISO (Y-m-d), so form handling and validation are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The frontend form built the alias from date + first 20 title characters
without checking for existing aliases and recalculated it on every save.
Duplicating an event and saving the copy with the same title and date
(or entering an event twice) produced the same alias, so only one of
the events was reachable.
- aliases are made unique (-2, -3, ...)
- existing events keep their alias on update (stable URLs); only an
empty alias, e.g. of a fresh copy, is generated
- migration renames existing duplicates; the oldest event keeps its
alias and URL
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- SitemapListener: <lastmod> for event detail pages (event tstamp) and
regular pages; events that ended more than 12 months ago are removed
from the sitemap
- PastEventPolicy: events stay indexable for 12 months after they end
(recurring events are searched before the next date), afterwards the
detail page gets noindex,follow but stays reachable as archive
- detail template data: is_past and next_occurrence (next published
event with the same title) for a notice with a link to the next date
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- event detail pages: <title> is "Title – 03.12.2026" (multi-day ranges
supported) so recurring events with the same name stay distinguishable;
H1 and lists keep the editor's title
- meta description fallback for events without teaser/description (date,
time, location); a teaser that is only an insert tag (shared series
text) also falls back, so a series does not share one description
- EventOpenGraphProvider for numero2/contao-opengraph3 (registered only
when the bundle is installed, priority above its CalendarEventsProvider):
og:title with date, og:description from teaser, event image as og:image
- FrontendCacheInvalidator: frontend event/organization edits write via
DBAL, so invalidate the same cache tags the backend uses; tag the map
and organization listing, invalidate the generic organization tag on
backend saves
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Events with a URL were saved with source "external", so Contao linked
lists straight to the external site and redirected the detail page.
The URL is now kept in the url field and only shown as a button on the
detail page.
- frontend form saves source "default" for every event
- backend: source option "external" removed, url field relabelled
"Externer Link", obsolete target field dropped from the palette
- migration switches existing source="external" events to "default"
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The event detail template data set has_tag_21 to drive the
Kulturhauptdorf logo, but tag 21 is "Feste & Märkte", so the logo
showed on every market/festival event. Add is_kulturhauptdorf, which
checks for a tag named "Kulturhauptdorf" (case-insensitive), and keep
has_tag_21 as deprecated for backwards compatibility.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The event detail page was the last place still loading MapLibre 5. Its
theme template now imports maplibre-gl.mjs as an ES module, so the
listener no longer needs to register the UMD bundle.
pmtiles stays a classic script: it only has to provide an IIFE global
for addProtocol. The stylesheet registration is unchanged.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
MapLibre GL JS 6 ships ESM only; the UMD bundle and the global
maplibregl no longer exist. Load maplibre-gl.mjs via dynamic import
into a module-scoped binding instead, keeping the UMD build as a
fallback so a server-side rollback needs no code change.
styleimagemissing is notify-only in v6, so the transparent 1x1
placeholder is now supplied through setMissingStyleImageResolver,
falling back to the event on v5.
Also drop the setFog block: MapLibre has never implemented setFog,
so the typeof guard never passed.
Verified against MapLibre 6.5.0 and pmtiles 4.5.0 in the browser:
map init, protomaps vector tiles, globe projection, organisation
markers, event clustering, spiderfy including leaf popups, and the
satellite style switch all work without console errors.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>