27 Commits
Author SHA1 Message Date
admin.juergenandClaude Fable 5.1 93baeac8a4 Hide the inbox edit button without access to the bookings or inquiries module
The button leads into the modules Anmeldungen and Kontaktanfragen. A group
that has those modules hidden got a 403 when clicking it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-27 20:12:37 +01:00
admin.juergenandClaude Fable 5.1 11f1ab3d2b Show exported inbox records newest first
The exported folder is an archive: with the limit of 300 records the oldest
of the newest 300 used to appear at the top. The working folders keep their
oldest-first order.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-27 20:08:09 +01:00
Jürgen MummertandClaude Fable 5.1 3aad6aa559 Store the display fields of events as virtual fields
- Move 29 display-only event fields (subtitles, audience, tags, prices,
  price types, organizer) from columns into the jsonData storage; fields
  used for filtering, joins and calculations stay real columns
- Add EventFieldsToVirtualMigration, which copies the values and drops
  the columns on contao:migrate
- Read and write the fields in the import, the preview and the booking
  through EventRowCodec; other bundles' keys in the storage are kept
- Validate prices in a save callback instead of the percent check that
  rejected every price above 100; accept a decimal comma
- Do not report events as changed after a backend save: ignore the
  spelling of HTML entities in teaser and topics and the order of the
  speakers

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-27 20:42:47 +02:00
Jürgen MummertandClaude Fable 5.1 07f7b4828a Describe the backend style sheet registration in the README
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-27 20:21:28 +02:00
Jürgen MummertandClaude Fable 5.1 4d4f21b7c8 Require Contao 6 and drop the Contao 5 compatibility code
- Require contao/core-bundle and calendar-bundle ^6.0
- Render the setup check and the notification help as input_field
  callbacks instead of a custom backend widget; the fields no longer
  create a virtual jsonData column
- Load the backend style sheet through contao.backend.custom_css and
  remove the menu listener (tooltip workaround for Contao 5 included)
- Tell editors when the Notification Center is not installed instead of
  linking to a module that does not exist
- Generate category aliases with the slug settings of the calendar page
  so that umlauts are transliterated for German sites
- Always return a RecordLabel for the category list, export stored
  values as they are, remove the decodeEntities options and the legacy
  "events" URL parameter, use array notation for the price columns

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-27 20:21:12 +02:00
Jürgen MummertandClaude Fable 5.1 27375e8d66 Support Contao 6
- Allow contao/core-bundle and calendar-bundle ^6.0 and Symfony 8
- Return the category columns as RecordLabel under Contao 6, where
  callback strings are encoded as text
- Only undo the double-escaped navigation tooltips where
  BackendUser::navigation() still exists (Contao 5)
- Decode stored entities in the W&K CSV export (Contao 5 stores input
  encoded)
- Use #[Target] for the named Contao logger aliases (Symfony 8.1
  deprecation); document Contao 6 in the README

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-27 13:07:17 +02:00
Jürgen MummertandClaude Fable 5.1 8aebfcd28d Housekeeping from the code review
Adds wk-sync:purge to remove old files under var/wk-sync (purge() was
never reachable), makes stored file names unique within a second,
excludes widgets from service autowiring, removes unused repository
methods, and adds a planner test covering re-imports with and without
member groups.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-26 18:56:59 +02:00
Jürgen MummertandClaude Fable 5.1 995b39e916 Redirect after all form hooks and lock the event while saving a booking
The redirect to the confirmation page moves into a last-priority
processFormData hook, so other listeners such as Notification Center
"form" notifications still run. The booking is created inside a
transaction that locks the event row and re-checks the availability,
so two simultaneous bookings cannot both take the last place; the
loser is sent back to the booking page, which now shows "fully booked".

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-26 18:56:59 +02:00
Jürgen MummertandClaude Fable 5.1 84bf180789 Keep the URL suffix when linking to the booking form
The event alias is passed as route parameter instead of being appended
to the page URL, so a site with a suffix such as .html gets
/kurs/anmeldung/<alias>.html instead of /kurs/anmeldung.html/<alias>.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-26 18:56:59 +02:00
Jürgen MummertandClaude Fable 5.1 1d2007a701 Use the PaletteManipulator from the core bundle namespace
Contao\PaletteManipulator does not exist; the settings listeners would
have failed with a fatal error in the list view and as soon as a
notification of the type "W&K booking" exists.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-26 18:56:59 +02:00
Jürgen MummertandClaude Fable 5.1 a96eed690a Bring the README up to date with the setup check and settings form
Documents the setup check legend, the explained notification matrix and
the missing-notification notice, that wk-sync:form:create creates a new
form on every call and only the selected form counts, the member group
behaviour on re-import, the birthday format, export file naming, MySQL 8
support and the reusable backend explanation widget.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-26 18:05:21 +02:00
Jürgen MummertandClaude Fable 5.1 36a317d32e Check the setup chain at the top of the settings form
A "setup check" box lists whether the booking form has the expected
field names (essential ones flagged as errors), the booking page carries
the booking form module, confirmation and inquiry pages are wired, the
calendar's reader page shows the booking status module and at least one
notification is assigned. Green when complete, red with concrete hints
otherwise, so misconfigurations show up before the first booking.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-26 18:01:22 +02:00
Jürgen MummertandClaude Fable 5.1 fdaff1b1d1 Explain the notification conditions in the settings form
The explanation texts existed but used the "explanation" input type,
which Contao only knows in the front end form generator, so the backend
rendered nothing and editors saw twelve unlabelled selects. A small
backend explanation widget now shows how a notification is chosen and
the condition matrix, each select carries its condition as label, the
single-day and multi-day variants sit side by side, and a notice with a
link to the Notification Center appears while no notification of the
type "W&K booking" exists.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-26 17:36:18 +02:00
Jürgen MummertandClaude Fable 5.1 8835e15f85 Add a graduation cap icon to the W&K-Tools navigation group
Uses the Lucide icon in the same size and colours as the core group
icons, with a dark variant, loaded through the backend menu listener.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-26 16:59:33 +02:00
Jürgen MummertandClaude Fable 5.1 ee9ef3a848 Polish the inbox, import and export views
Action buttons are as wide as their label instead of the column, the
export button stays on one line, date and file columns no longer wrap
mid-word, the long preview message list scrolls in a box, and buttons
use the Contao colour variables so they fit the dark colour scheme.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-26 16:59:33 +02:00
Jürgen MummertandClaude Fable 5.1 fb2bfa1ee8 Separate the W&K names in the category list
The newline-separated names were rendered as one run-on string.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-26 16:59:33 +02:00
Jürgen MummertandClaude Fable 5.1 6e75ad31ea Store the birthday as a plain TT.MM.JJJJ text field in the backend
The field was declared as a Contao date field, so DC_Table parsed the
stored W&K format with the website's date format and threw "Invalid
date" when opening a booking. A save callback now normalises and
validates the value the same way the frontend form does.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-26 16:59:33 +02:00
Jürgen MummertandClaude Fable 5.1 cabe5506e6 Give the backend modules the container padding of Contao 5.7
The content card no longer pads its children, so the import, inbox and
export modules use the same spacing as the core listing containers.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-26 16:29:14 +02:00
Jürgen MummertandClaude Fable 5.1 007b5b1d80 Undo the double-escaped module descriptions in the backend menu tooltips
Contao escapes the descriptions in BackendUser::navigation() and the menu
template escapes the title attribute again, so "W&K" showed as "W&amp;K".

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-26 16:29:14 +02:00
Jürgen MummertandClaude Fable 5.1 59bb6322a0 Quote the groups column so members can be created on MySQL 8
"groups" is a reserved word in MySQL 8 but not in MariaDB, so the
unquoted insert and update failed only there.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-26 16:29:14 +02:00
Jürgen MummertandClaude Fable 5.1 d415e9e86b Compare only resolved members when planning speaker and instructor changes
Without a member group the import stores an empty speaker list, but the
planner turned every unresolved name into ID 0 and flagged the event as
changed on each upload. With a member group set, the preview now also
reports the change when instructor or speakers will be created on apply.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-26 16:29:14 +02:00
admin.juergenandClaude Fable 5.1 08aa204ef9 Name the group field for record operations correctly in the README
Contao 5.7 calls it "Tabellenrechte" (create/update/delete per table).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 19:40:30 +02:00
admin.juergenandClaude Fable 5.1 cb3c3bdae7 Bookings without parent table link so editors need no calendar access
Editing a booking required read access to the calendar event because of
the ptable link. Bookings are now a standalone table (deleted together with
the event via ctable) and the README describes the group permissions
(modules, record operations, fields).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 19:34:36 +02:00
admin.juergenandClaude Fable 5.1 df38c58954 Mark all bundle DCA fields as excludable for group permissions
All editable fields of tl_wk_config, tl_wk_category, tl_wk_booking,
tl_wk_inquiry, the W&K fields of tl_calendar_events and the module
category filter can now be restricted per user group via "Erlaubte
Felder", like core tables. README documents the permission setup.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 19:22:27 +02:00
admin.juergenandClaude Fable 5.1 c976f47e9c Backend group W&K-Tools with settings module instead of calendar fields
All W&K configuration moves from tl_calendar into the new table
tl_wk_config (one entry per calendar), edited under W&K-Tools → Einstellungen.
The backend group now has separate entries for import, inbox, bookings,
inquiries, exports, categories, settings and log. Notification selects show
the notification ID.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 18:08:20 +02:00
admin.juergenandClaude Fable 5.1 efce662b4f Manage bookings in the W&K-Sync backend group instead of at the event
Bookings get their own backend module (W&K-Sync → Anmeldungen) with a
sortable, filterable list; the operation on calendar events is removed and
the calendar module no longer exposes tl_wk_booking. Inbox edit links point
to the new module.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 17:55:46 +02:00
admin.juergenandClaude Fable 5.1 142afa6e52 Initial version of the W&K sync bundle for Contao 5.7
Import of W&K seminar exports with preview, booking form via form generator
with event-dependent field rules, notification routing, inbox with folders
and CSV export for W&K.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 17:42:34 +02:00