From 9724f0b732c982cb5d60d74d8f9a731f813799a8 Mon Sep 17 00:00:00 2001 From: Johan Cwiklinski Date: Sun, 27 Sep 2026 13:58:29 +0200 Subject: [PATCH 1/8] Move calendar script to js/, read its options from JSON, write its modal once --- bin/release | 3 +- calendar.js => js/calendar.js | 46 +++++-------- templates/default/calendar.html.twig | 64 ++++++++++--------- .../Crud/tests/units/EventsController.php | 9 ++- webpack.config.js | 2 +- 5 files changed, 61 insertions(+), 63 deletions(-) rename calendar.js => js/calendar.js (55%) diff --git a/bin/release b/bin/release index 02e0202b..e9d8045f 100755 --- a/bin/release +++ b/bin/release @@ -413,7 +413,6 @@ def add_libs(rel_name, galette_archive): '.gitignore', '.php-cs-fixer.dist.php', '.phpcs.xml', - 'calendar.js', 'package-lock.json', 'package.json', 'phpstan.neon', @@ -424,7 +423,7 @@ def add_libs(rel_name, galette_archive): if os.path.exists(target): os.remove(target) - for todrop in ['.github', 'bin', 'node_modules', 'tests']: + for todrop in ['.github', 'bin', 'js', 'node_modules', 'tests']: target = os.path.join(npm_dir, todrop) if os.path.exists(target): shutil.rmtree(target) diff --git a/calendar.js b/js/calendar.js similarity index 55% rename from calendar.js rename to js/calendar.js index 8ebce7e4..60658525 100644 --- a/calendar.js +++ b/js/calendar.js @@ -17,49 +17,38 @@ import 'fullcalendar/themes/classic/palette.css'; $(function() { var calendarEl = document.getElementById('calendar'); + var options = JSON.parse(document.getElementById('calendar_options').textContent); + //modal is written in the page, only its content changes + var $modal = $('#calendar_event'); + var $edit = $modal.find('[data-action="edit"]'); + var $booking = $modal.find('[data-action="booking"]'); var calendar = new Calendar(calendarEl, { plugins: [ themePlugin, interactionPlugin, dayGridPlugin, listPlugin ], - views: _fullcalendar_views, + views: options.views, headerToolbar: { left: 'title', right: 'dayGridMonth,listDay,listWeek,listMonth prevYear,prev,today,next,nextYear' }, height: 'auto', locales: allLocales, - locale: _fullcalendar_locale, + locale: options.locale, weekNumbers: true, - events: _calendar_dataurl, + events: options.dataurl, selectable: true, eventClick: function(info) { - var _infos = JSON.parse(JSON.stringify(info.event.extendedProps)); - _infos.url = _calendar_event_url.replace('PLACEBO', _infos.id_event); - _infos.booking = _calendar_booking_url.replace('PLACEBO', _infos.id_event); - var _actions = []; - if (_infos.can_edit) { - _actions.push(_edit_action); - } - _actions.push(Object.assign({}, _booking_action, { - click: function() { - window.location.href = _infos.booking; - } - })); - _actions.push(_close_action); + var infos = info.event.extendedProps; //description is built and escaped server side, other values must be displayed as text - var _elt = $(''); - _elt.find('.header').text(_infos.name + ' (' + _infos.begin_date_fmt + ' - ' + _infos.end_date_fmt + ')'); - _elt.find('.content').html(_infos.description); - _elt.appendTo('body'); - _elt.modal({ - onApprove: function() { - window.location.href = _infos.url; - }, - actions: _actions - }).modal('show'); + $modal.find('.header').text(infos.name + ' (' + infos.begin_date_fmt + ' - ' + infos.end_date_fmt + ')'); + $modal.find('.content').html(infos.description); + $edit + .attr('href', options.event_url.replace('PLACEBO', infos.id_event)) + .toggleClass('displaynone', !infos.can_edit); + $booking.attr('href', options.booking_url.replace('PLACEBO', infos.id_event)); + $modal.modal('show'); }, eventMouseEnter: function(info) { - var _el = $(info.el); - _el.popup({ + $(info.el).popup({ exclusive: true, hoverable: true, variation: 'basic', @@ -70,4 +59,3 @@ $(function() { calendar.render(); }); - diff --git a/templates/default/calendar.html.twig b/templates/default/calendar.html.twig index c95d1a48..dc09bbe0 100644 --- a/templates/default/calendar.html.twig +++ b/templates/default/calendar.html.twig @@ -8,37 +8,41 @@ {% block content %}
+ {% endblock %} {% block javascripts %} - - + {% set calendar_options = { + 'dataurl': url_for("ajax-events_calendar"), + 'event_url': url_for("events_event_edit", {"id": "PLACEBO"}), + 'booking_url': url_for("events_booking_add") ~ '?event=PLACEBO', + 'locale': i18n.getWebID(), + 'views': { + 'listDay': {'buttonText': _T("Daily list", "events")}, + 'listWeek': {'buttonText': _T("Weekly list", "events")}, + 'listMonth': {'buttonText': _T("Monthly list", "events")}, + 'dayGridMonth': {'buttonText': _T("Month calendar", "events")}, + 'today': {'buttonText': _T("Today", "events")} + } + } %} + + {% endblock %} diff --git a/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php b/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php index 9e510ed6..22ca1928 100644 --- a/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php +++ b/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php @@ -445,6 +445,13 @@ public function testCalendarPage(): void $body = (string)$test_response->getBody(); $this->assertStringContainsString('
', $body); $this->assertStringContainsString('js/calendar.bundle.js', $body); - $this->assertStringContainsString($this->routeparser->urlFor('ajax-events_calendar'), $body); + $this->assertStringContainsString(' {% endblock %} - -{% block javascripts %} - {{ parent() }} - -{% endblock %} diff --git a/templates/default/booking.html.twig b/templates/default/booking.html.twig index b249b93c..b05c28be 100644 --- a/templates/default/booking.html.twig +++ b/templates/default/booking.html.twig @@ -146,17 +146,12 @@ {% endblock %} {% block javascripts %} + {% if login.isAdmin() or login.isStaff() or login.isGroupManager() %} + {% endif %} {% endblock %} diff --git a/templates/default/bookings.html.twig b/templates/default/bookings.html.twig index d373d746..7c7dc096 100644 --- a/templates/default/bookings.html.twig +++ b/templates/default/bookings.html.twig @@ -279,47 +279,11 @@ {% block batch_selection %} else if (value == 'sendmail') { - {% if existing_mailing == true %} - _sendmail(true); - {% else %} _sendmail(); - {% endif %} } {% endblock %} {% block javascripts %} {% set batch_selection = ['sendmail'] %} {{ parent() }} - {% endblock %} diff --git a/templates/default/event.html.twig b/templates/default/event.html.twig index fd08bca5..ddf87448 100644 --- a/templates/default/event.html.twig +++ b/templates/default/event.html.twig @@ -121,7 +121,7 @@ {% endfor %} - @@ -134,7 +134,7 @@ {% endfor %} - @@ -169,23 +169,3 @@ {% endblock %} - -{% block javascripts %} - -{% endblock %} diff --git a/templates/default/scripts.html.twig b/templates/default/scripts.html.twig new file mode 100644 index 00000000..60cae56b --- /dev/null +++ b/templates/default/scripts.html.twig @@ -0,0 +1,10 @@ +{# + # This file is part of Galette Events plugin (https://galette.eu). + # SPDX-FileCopyrightText: Copyright © 2018-2026 The Galette Team + # SPDX-License-Identifier: GPL-3.0-or-later + #} + +{# plugin pages only #} +{% if cur_route starts with 'events_' %} + +{% endif %} diff --git a/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php b/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php index 22ca1928..9c29b86d 100644 --- a/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php +++ b/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php @@ -454,4 +454,21 @@ public function testCalendarPage(): void $this->assertSame('Daily list', $options['views']['listDay']['buttonText']); $this->assertSame('en-US', $options['locale']); } + + /** + * Plugin pages load their script from a file, other pages do not + */ + public function testScriptFile(): void + { + $this->logSuperAdmin(); + $this->linkActivity($this->insertEvent('Event'), $this->insertActivity('Dinner')); + + $body = (string)$this->app->handle($this->createRequest('events_event_add'))->getBody(); + $this->assertStringContainsString('events.js', $body); + $this->assertStringNotContainsString('alert(', $body); + $this->assertStringContainsString('aria-controls="attach_activity"', $body); + + $body = (string)$this->app->handle($this->createRequest('dashboard'))->getBody(); + $this->assertStringNotContainsString('events.js', $body); + } } diff --git a/webroot/events.js b/webroot/events.js new file mode 100644 index 00000000..26c27953 --- /dev/null +++ b/webroot/events.js @@ -0,0 +1,46 @@ +/** + * This file is part of Galette Events plugin (https://galette.eu). + * SPDX-FileCopyrightText: Copyright © 2018-2026 The Galette Team + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/* Event form: activities are attached or detached once one has been chosen */ +var _eventsActivities = function() { + $('#add_activity, #remove_activity').on('click', function(e) { + var $button = $(this); + if ($('#' + $button.attr('aria-controls')).val() !== '') { + return; + } + e.preventDefault(); + $.modal({ + content: $button.data('message'), + class: 'tiny', + actions: [{ + text: $button.data('close'), + icon: 'times', + class: 'icon labeled cancel' + }] + }).modal('show'); + }); +}; + +/* Booking form: choosing another event reloads the form with its activities */ +var _eventsBookingEvent = function() { + $('#modifform #event').on('change', function() { + $(this).closest('form').trigger('submit'); + }); +}; + +/* Bookings list: mailing to the members of selected bookings */ +var _sendmail = function() { + $('#listform') + .append('') + .append('') + .append('') + .trigger('submit'); +}; + +$(function() { + _eventsActivities(); + _eventsBookingEvent(); +}); From 70698fba292c1e118c146b32c67e78bae8b560c4 Mon Sep 17 00:00:00 2001 From: Johan Cwiklinski Date: Sun, 27 Sep 2026 14:05:38 +0200 Subject: [PATCH 3/8] Use core components for activities of an event, label their status --- templates/default/bookings.html.twig | 2 +- templates/default/event.html.twig | 84 +++++++++++-------- .../Crud/tests/units/EventsController.php | 16 ++++ 3 files changed, 66 insertions(+), 36 deletions(-) diff --git a/templates/default/bookings.html.twig b/templates/default/bookings.html.twig index 7c7dc096..28906fe7 100644 --- a/templates/default/bookings.html.twig +++ b/templates/default/bookings.html.twig @@ -180,7 +180,7 @@ {% if booking.isPaid() %} {{ _T("Paid", "events") }} {% else %} - {{ _T("Not paid", "events") }}" + {{ _T("Not paid", "events") }} {% endif %} diff --git a/templates/default/event.html.twig b/templates/default/event.html.twig index ddf87448..367660ef 100644 --- a/templates/default/event.html.twig +++ b/templates/default/event.html.twig @@ -108,56 +108,70 @@ {{ _T("Activities", "events") }}
-
-

{% set availables = event.availableActivities() %} {% set activities = event.getActivities() %} - {% if availables|length or activities|length %} {% if availables|length %} - - +

+ {% include "components/forms/select.html.twig" with { + id: 'attach_activity', + value: '', + values: attach_values, + label: _T("Add selected activity to event", "events"), + component_class: 'twelve wide field' + } %} +
+ +
+
{% endif %} {% if activities|length %} - - - {% endif %} -

- {% if activities|length %} +
+ {% include "components/forms/select.html.twig" with { + id: 'detach_activity', + value: '', + values: detach_values, + label: _T("Remove selected activity from event", "events"), + component_class: 'twelve wide field' + } %} +
+ +
+
+ + {% set status_values = { + (constant('GaletteEvents\\Activity::YES')): _T("Yes"), + (constant('GaletteEvents\\Activity::NO')): _T("No"), + (constant('GaletteEvents\\Activity::REQUIRED')): _T("Required", "events") + } %} {% for item in activities %} - {% set activity = item.activity %} -

- - - -

+ + {% include "components/forms/select.html.twig" with { + id: 'activities_status_' ~ item.activity.getId(), + name: 'activities_status[]', + value: item.status, + values: status_values, + label: item.activity.getName() + } %} {% endfor %} {% endif %} {% else %} -

{{ _T("No activity available in the database.", "events") }}

+

{{ _T("No activity available in the database.", "events") }}

{% endif %} -
diff --git a/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php b/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php index 9c29b86d..a4754298 100644 --- a/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php +++ b/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php @@ -468,6 +468,22 @@ public function testScriptFile(): void $this->assertStringNotContainsString('alert(', $body); $this->assertStringContainsString('aria-controls="attach_activity"', $body); + //linked activities status are labelled + $event = $this->insertEvent('Linked'); + $dinner = $this->insertActivity('Supper'); + $this->linkActivity($event, $dinner, \GaletteEvents\Activity::REQUIRED); + $body = (string)$this->app->handle($this->createRequest('events_event_edit', ['id' => (string)$event]))->getBody(); + $this->assertMatchesRegularExpression('#\s*Supper\s*#', $body); + $this->assertMatchesRegularExpression( + '#assertMatchesRegularExpression( + '#assertStringNotContainsString('{$activity', $body); + $body = (string)$this->app->handle($this->createRequest('dashboard'))->getBody(); $this->assertStringNotContainsString('events.js', $body); } From 6b1cca3ae85130067bfbf125f23e1e35d651d12b Mon Sep 17 00:00:00 2001 From: Johan Cwiklinski Date: Sun, 27 Sep 2026 14:13:46 +0200 Subject: [PATCH 4/8] Accessibility: hide decorative icons, label row checkboxes and paid filter, readable calendar, no invalid autocomplete --- .../Controllers/Crud/ActivitiesController.php | 1 - .../Controllers/Crud/BookingsController.php | 2 -- .../Controllers/Crud/EventsController.php | 1 - templates/default/activities.html.twig | 2 +- templates/default/activity.html.twig | 4 ++-- templates/default/booking.html.twig | 8 ++++---- templates/default/bookings.html.twig | 11 ++++++----- templates/default/event.html.twig | 8 ++++---- templates/default/events.html.twig | 2 +- webroot/galette_events.css | 13 ++++--------- 10 files changed, 22 insertions(+), 30 deletions(-) diff --git a/lib/GaletteEvents/Controllers/Crud/ActivitiesController.php b/lib/GaletteEvents/Controllers/Crud/ActivitiesController.php index 465a605e..f56a0a7f 100644 --- a/lib/GaletteEvents/Controllers/Crud/ActivitiesController.php +++ b/lib/GaletteEvents/Controllers/Crud/ActivitiesController.php @@ -150,7 +150,6 @@ public function edit(Request $request, Response $response, ?int $id = null, stri $response, $this->getTemplate('activity'), [ - 'autocomplete' => true, 'page_title' => $title, 'activity' => $activity, // pseudo random int diff --git a/lib/GaletteEvents/Controllers/Crud/BookingsController.php b/lib/GaletteEvents/Controllers/Crud/BookingsController.php index ae78f9bb..a7f382cb 100644 --- a/lib/GaletteEvents/Controllers/Crud/BookingsController.php +++ b/lib/GaletteEvents/Controllers/Crud/BookingsController.php @@ -388,7 +388,6 @@ public function edit(Request $request, Response $response, ?int $id = null, stri 'filters' => $m->getFilters(), 'count' => $m->getCount() ]; - $route_params['autocomplete'] = true; //check if current attached member is part of the list if ( @@ -412,7 +411,6 @@ public function edit(Request $request, Response $response, ?int $id = null, stri array_merge( $route_params, [ - 'autocomplete' => true, 'page_title' => $title, 'booking' => $booking, 'events' => $events->getList(true), diff --git a/lib/GaletteEvents/Controllers/Crud/EventsController.php b/lib/GaletteEvents/Controllers/Crud/EventsController.php index cbba10e1..884d355f 100644 --- a/lib/GaletteEvents/Controllers/Crud/EventsController.php +++ b/lib/GaletteEvents/Controllers/Crud/EventsController.php @@ -223,7 +223,6 @@ public function edit(Request $request, Response $response, ?int $id = null, stri $response, $this->getTemplate('event'), [ - 'autocomplete' => true, 'page_title' => $title, 'event' => $event, 'require_calendar' => true, diff --git a/templates/default/activities.html.twig b/templates/default/activities.html.twig index b8723c48..54d276cc 100644 --- a/templates/default/activities.html.twig +++ b/templates/default/activities.html.twig @@ -73,7 +73,7 @@ {{ activity.getCreationDate()|date(_T("Y-m-d")) }} {{ activity.countEvents() }} - + {% if activity.isActive() %} {{ _T("Active", "events") }} diff --git a/templates/default/activity.html.twig b/templates/default/activity.html.twig index cbc7d5b2..ea5dc0a6 100644 --- a/templates/default/activity.html.twig +++ b/templates/default/activity.html.twig @@ -10,7 +10,7 @@
- + {{ _T("General information", "events") }}
@@ -37,7 +37,7 @@
diff --git a/templates/default/booking.html.twig b/templates/default/booking.html.twig index b05c28be..8a0293e2 100644 --- a/templates/default/booking.html.twig +++ b/templates/default/booking.html.twig @@ -10,7 +10,7 @@
- + {{ _T("Booking information", "events") }}
@@ -74,7 +74,7 @@
- + {{ _T("Activities", "events") }}
@@ -99,7 +99,7 @@ {% if login.isAdmin() or login.isStaff() %}
- + {{ _T("Financial information", "events") }}
@@ -138,7 +138,7 @@ {% endif %}
diff --git a/templates/default/bookings.html.twig b/templates/default/bookings.html.twig index 28906fe7..c0c866f4 100644 --- a/templates/default/bookings.html.twig +++ b/templates/default/bookings.html.twig @@ -102,8 +102,8 @@
-
- +
+
@@ -127,7 +127,7 @@
diff --git a/templates/default/events.html.twig b/templates/default/events.html.twig index 60f6dd1b..f74174ce 100644 --- a/templates/default/events.html.twig +++ b/templates/default/events.html.twig @@ -78,7 +78,7 @@ {{ event.getTown() }} {{ event.getGroupName() }} - + {% if event.isOpen() %} {{ _T("Event is open", "events") }} diff --git a/webroot/galette_events.css b/webroot/galette_events.css index 85f6ef79..2be4bb32 100644 --- a/webroot/galette_events.css +++ b/webroot/galette_events.css @@ -4,15 +4,10 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -a.fc-col-header-cell-cushion, -a.fc-daygrid-day-number, -a.fc-list-day-text, -a.fc-list-day-side-text { - color: #636b70; -} - -.fc-event-title-container { - cursor: pointer; +/* calendar week numbers and days of other months are readable */ +#calendar { + --fc-classic-faint-foreground: #4b5563; + --fc-classic-muted-foreground: #4b5563; } .event-notpaid { From 769a9b96a3b9fc3970948bc39c4ffd2c10e65e83 Mon Sep 17 00:00:00 2001 From: Johan Cwiklinski Date: Sun, 27 Sep 2026 14:14:37 +0200 Subject: [PATCH 5/8] Label calendar buttons with FullCalendar 7 option --- js/calendar.js | 2 +- templates/default/calendar.html.twig | 12 ++++++------ .../Crud/tests/units/EventsController.php | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/js/calendar.js b/js/calendar.js index 60658525..ddc521fe 100644 --- a/js/calendar.js +++ b/js/calendar.js @@ -25,7 +25,7 @@ $(function() { var calendar = new Calendar(calendarEl, { plugins: [ themePlugin, interactionPlugin, dayGridPlugin, listPlugin ], - views: options.views, + buttons: options.buttons, headerToolbar: { left: 'title', right: 'dayGridMonth,listDay,listWeek,listMonth prevYear,prev,today,next,nextYear' diff --git a/templates/default/calendar.html.twig b/templates/default/calendar.html.twig index dc09bbe0..9af48bba 100644 --- a/templates/default/calendar.html.twig +++ b/templates/default/calendar.html.twig @@ -35,12 +35,12 @@ 'event_url': url_for("events_event_edit", {"id": "PLACEBO"}), 'booking_url': url_for("events_booking_add") ~ '?event=PLACEBO', 'locale': i18n.getWebID(), - 'views': { - 'listDay': {'buttonText': _T("Daily list", "events")}, - 'listWeek': {'buttonText': _T("Weekly list", "events")}, - 'listMonth': {'buttonText': _T("Monthly list", "events")}, - 'dayGridMonth': {'buttonText': _T("Month calendar", "events")}, - 'today': {'buttonText': _T("Today", "events")} + 'buttons': { + 'listDay': {'text': _T("Daily list", "events")}, + 'listWeek': {'text': _T("Weekly list", "events")}, + 'listMonth': {'text': _T("Monthly list", "events")}, + 'dayGridMonth': {'text': _T("Month calendar", "events")}, + 'today': {'text': _T("Today", "events")} } } %} diff --git a/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php b/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php index a4754298..59a7b092 100644 --- a/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php +++ b/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php @@ -451,7 +451,7 @@ public function testCalendarPage(): void $this->assertSame(1, preg_match('##s', $body, $matches)); $options = json_decode($matches[1], true); $this->assertSame($this->routeparser->urlFor('ajax-events_calendar'), $options['dataurl']); - $this->assertSame('Daily list', $options['views']['listDay']['buttonText']); + $this->assertSame('Daily list', $options['buttons']['listDay']['text']); $this->assertSame('en-US', $options['locale']); } From 5a46af25c33d6a06bd1dcc41ac5a0b1920f41349 Mon Sep 17 00:00:00 2001 From: Johan Cwiklinski Date: Sun, 27 Sep 2026 14:15:33 +0200 Subject: [PATCH 6/8] Number the placeholder of bookings total --- lang/events.pot | 2 +- lang/events_ar.utf8.po | 2 +- lang/events_br.utf8.po | 2 +- lang/events_ca.utf8.po | 2 +- lang/events_de_DE.utf8.po | 4 ++-- lang/events_en_US.po | 4 ++-- lang/events_es.utf8.po | 4 ++-- lang/events_fr_FR.utf8.po | 4 ++-- lang/events_it_IT.utf8.po | 4 ++-- lang/events_nb_NO.utf8.po | 2 +- lang/events_oc.utf8.po | 2 +- lang/events_ota.utf8.po | 2 +- lang/events_pt.utf8.po | 4 ++-- lang/events_pt_BR.utf8.po | 4 ++-- lang/events_ru.utf8.po | 4 ++-- lang/events_si.utf8.po | 2 +- lang/events_sl.utf8.po | 4 ++-- lang/events_ta.utf8.po | 4 ++-- lang/events_tr.utf8.po | 2 +- lang/events_uk.utf8.po | 4 ++-- templates/default/bookings.html.twig | 2 +- .../Crud/tests/units/BookingsController.php | 17 +++++++++++++++++ 22 files changed, 49 insertions(+), 32 deletions(-) diff --git a/lang/events.pot b/lang/events.pot index c4345638..c76994e3 100644 --- a/lang/events.pot +++ b/lang/events.pot @@ -555,7 +555,7 @@ msgstr "" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" +msgid "Found bookings total %1$s" msgstr "" #: ../templates/default/bookings.html.twig:192 diff --git a/lang/events_ar.utf8.po b/lang/events_ar.utf8.po index 6b405b55..0c582735 100644 --- a/lang/events_ar.utf8.po +++ b/lang/events_ar.utf8.po @@ -535,7 +535,7 @@ msgstr "" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" +msgid "Found bookings total %1$s" msgstr "" #: ../templates/default/bookings.html.twig:192 diff --git a/lang/events_br.utf8.po b/lang/events_br.utf8.po index 9728af63..63e9f5a0 100644 --- a/lang/events_br.utf8.po +++ b/lang/events_br.utf8.po @@ -533,7 +533,7 @@ msgstr "" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" +msgid "Found bookings total %1$s" msgstr "" #: ../templates/default/bookings.html.twig:192 diff --git a/lang/events_ca.utf8.po b/lang/events_ca.utf8.po index 7f0f2a68..150fb673 100644 --- a/lang/events_ca.utf8.po +++ b/lang/events_ca.utf8.po @@ -526,7 +526,7 @@ msgstr "No pagat" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" +msgid "Found bookings total %1$s" msgstr "" #: ../templates/default/bookings.html.twig:192 diff --git a/lang/events_de_DE.utf8.po b/lang/events_de_DE.utf8.po index 480d85cc..14d8cf0a 100644 --- a/lang/events_de_DE.utf8.po +++ b/lang/events_de_DE.utf8.po @@ -535,8 +535,8 @@ msgstr "Nicht bezahlt" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" -msgstr "Gesamtzahl der gefundenen Buchungen: %f" +msgid "Found bookings total %1$s" +msgstr "Gesamtzahl der gefundenen Buchungen: %1$s" #: ../templates/default/bookings.html.twig:192 msgid "Edit booking" diff --git a/lang/events_en_US.po b/lang/events_en_US.po index 3da86652..cbbf2e1b 100644 --- a/lang/events_en_US.po +++ b/lang/events_en_US.po @@ -583,8 +583,8 @@ msgstr "Not paid" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" -msgstr "Found bookings total %f" +msgid "Found bookings total %1$s" +msgstr "Found bookings total %1$s" #: ../templates/default/bookings.html.twig:192 msgid "Edit booking" diff --git a/lang/events_es.utf8.po b/lang/events_es.utf8.po index bdfcc97a..2de91afc 100644 --- a/lang/events_es.utf8.po +++ b/lang/events_es.utf8.po @@ -539,8 +539,8 @@ msgstr "No pagado" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" -msgstr "Se encontraron un total de %f reservas" +msgid "Found bookings total %1$s" +msgstr "Se encontraron un total de %1$s reservas" #: ../templates/default/bookings.html.twig:192 msgid "Edit booking" diff --git a/lang/events_fr_FR.utf8.po b/lang/events_fr_FR.utf8.po index 86cdf2d5..3398bde7 100644 --- a/lang/events_fr_FR.utf8.po +++ b/lang/events_fr_FR.utf8.po @@ -531,8 +531,8 @@ msgstr "Non payée" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" -msgstr "Total des réservations trouvées : %f" +msgid "Found bookings total %1$s" +msgstr "Total des réservations trouvées : %1$s" #: ../templates/default/bookings.html.twig:192 msgid "Edit booking" diff --git a/lang/events_it_IT.utf8.po b/lang/events_it_IT.utf8.po index db4771f6..6ca1b542 100644 --- a/lang/events_it_IT.utf8.po +++ b/lang/events_it_IT.utf8.po @@ -530,8 +530,8 @@ msgstr "Non pagato" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" -msgstr "Totale prenotazioni trovate %f" +msgid "Found bookings total %1$s" +msgstr "Totale prenotazioni trovate %1$s" #: ../templates/default/bookings.html.twig:192 msgid "Edit booking" diff --git a/lang/events_nb_NO.utf8.po b/lang/events_nb_NO.utf8.po index 621e65a4..ee95f056 100644 --- a/lang/events_nb_NO.utf8.po +++ b/lang/events_nb_NO.utf8.po @@ -523,7 +523,7 @@ msgstr "" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" +msgid "Found bookings total %1$s" msgstr "" #: ../templates/default/bookings.html.twig:192 diff --git a/lang/events_oc.utf8.po b/lang/events_oc.utf8.po index 379a0b4f..78d74cbe 100644 --- a/lang/events_oc.utf8.po +++ b/lang/events_oc.utf8.po @@ -527,7 +527,7 @@ msgstr "" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" +msgid "Found bookings total %1$s" msgstr "" #: ../templates/default/bookings.html.twig:192 diff --git a/lang/events_ota.utf8.po b/lang/events_ota.utf8.po index 294895ea..b593c3ec 100644 --- a/lang/events_ota.utf8.po +++ b/lang/events_ota.utf8.po @@ -523,7 +523,7 @@ msgstr "" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" +msgid "Found bookings total %1$s" msgstr "" #: ../templates/default/bookings.html.twig:192 diff --git a/lang/events_pt.utf8.po b/lang/events_pt.utf8.po index 5f43559b..0c70915d 100644 --- a/lang/events_pt.utf8.po +++ b/lang/events_pt.utf8.po @@ -534,8 +534,8 @@ msgstr "Não pago" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" -msgstr "Reservas encontradas totalizam %f" +msgid "Found bookings total %1$s" +msgstr "Reservas encontradas totalizam %1$s" #: ../templates/default/bookings.html.twig:192 msgid "Edit booking" diff --git a/lang/events_pt_BR.utf8.po b/lang/events_pt_BR.utf8.po index 9626a832..d31fd34b 100644 --- a/lang/events_pt_BR.utf8.po +++ b/lang/events_pt_BR.utf8.po @@ -531,8 +531,8 @@ msgstr "Não pago" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" -msgstr "Reservas encontradas totalizam %f" +msgid "Found bookings total %1$s" +msgstr "Reservas encontradas totalizam %1$s" #: ../templates/default/bookings.html.twig:192 msgid "Edit booking" diff --git a/lang/events_ru.utf8.po b/lang/events_ru.utf8.po index 1360377b..19cb9f0d 100644 --- a/lang/events_ru.utf8.po +++ b/lang/events_ru.utf8.po @@ -538,8 +538,8 @@ msgstr "Не оплачено" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" -msgstr "Всего найдено броней %f" +msgid "Found bookings total %1$s" +msgstr "Всего найдено броней %1$s" #: ../templates/default/bookings.html.twig:192 msgid "Edit booking" diff --git a/lang/events_si.utf8.po b/lang/events_si.utf8.po index e9b83cda..5854f746 100644 --- a/lang/events_si.utf8.po +++ b/lang/events_si.utf8.po @@ -523,7 +523,7 @@ msgstr "" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" +msgid "Found bookings total %1$s" msgstr "" #: ../templates/default/bookings.html.twig:192 diff --git a/lang/events_sl.utf8.po b/lang/events_sl.utf8.po index 21cb5e7a..73e2298d 100644 --- a/lang/events_sl.utf8.po +++ b/lang/events_sl.utf8.po @@ -533,8 +533,8 @@ msgstr "Ni plačano" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" -msgstr "Skupaj najdenih rezervacij %f" +msgid "Found bookings total %1$s" +msgstr "Skupaj najdenih rezervacij %1$s" #: ../templates/default/bookings.html.twig:192 msgid "Edit booking" diff --git a/lang/events_ta.utf8.po b/lang/events_ta.utf8.po index 0fc19489..3057d5bf 100644 --- a/lang/events_ta.utf8.po +++ b/lang/events_ta.utf8.po @@ -532,8 +532,8 @@ msgstr "செலுத்தப்படவில்லை" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" -msgstr "முன்பதிவு மொத்தம் %f" +msgid "Found bookings total %1$s" +msgstr "முன்பதிவு மொத்தம் %1$s" #: ../templates/default/bookings.html.twig:192 msgid "Edit booking" diff --git a/lang/events_tr.utf8.po b/lang/events_tr.utf8.po index 1f52cb36..9697d785 100644 --- a/lang/events_tr.utf8.po +++ b/lang/events_tr.utf8.po @@ -526,7 +526,7 @@ msgstr "" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" +msgid "Found bookings total %1$s" msgstr "" #: ../templates/default/bookings.html.twig:192 diff --git a/lang/events_uk.utf8.po b/lang/events_uk.utf8.po index 58efeb45..0bf8a3b6 100644 --- a/lang/events_uk.utf8.po +++ b/lang/events_uk.utf8.po @@ -540,8 +540,8 @@ msgstr "Не оплачено" #: ../templates/default/bookings.html.twig:147 #, php-format -msgid "Found bookings total %f" -msgstr "Загалом бронювань знайдено: %f" +msgid "Found bookings total %1$s" +msgstr "Загалом бронювань знайдено: %1$s" #: ../templates/default/bookings.html.twig:192 msgid "Edit booking" diff --git a/templates/default/bookings.html.twig b/templates/default/bookings.html.twig index c0c866f4..fbd5159a 100644 --- a/templates/default/bookings.html.twig +++ b/templates/default/bookings.html.twig @@ -144,7 +144,7 @@ {% if nb > 0 %} - {{ _T("Found bookings total %f", "events")|replace({'%f': bookings.getSum()}) }} + {{ _T("Found bookings total %1$s", "events")|format(bookings.getSum()) }} {% endif %} diff --git a/tests/GaletteEvents/Controllers/Crud/tests/units/BookingsController.php b/tests/GaletteEvents/Controllers/Crud/tests/units/BookingsController.php index 18d93115..40b5bcc1 100644 --- a/tests/GaletteEvents/Controllers/Crud/tests/units/BookingsController.php +++ b/tests/GaletteEvents/Controllers/Crud/tests/units/BookingsController.php @@ -660,4 +660,21 @@ public function testFilterOnEvent(): void $this->assertNull($this->session->plugin_events_bookings_filter->event_filter); $this->expectNoLogEntry(); } + + /** + * Bookings list shows the total amount of listed bookings + */ + public function testListTotal(): void + { + $member_one = $this->getMemberOne(); + $member_two = $this->getMemberTwo(); + $event = $this->insertEvent('Event'); + $this->insertBooking($event, $member_one->id, ['payment_amount' => 12.5]); + $this->insertBooking($event, $member_two->id, ['payment_amount' => 7]); + $this->logSuperAdmin(); + + $body = (string)$this->app->handle($this->createRequest('events_bookings', ['event' => (string)$event]))->getBody(); + $this->assertStringContainsString('Found bookings total 19.5', $body); + $this->expectNoLogEntry(); + } } From f31abad25f379b825743f52e5552daa1fc7ba181 Mon Sep 17 00:00:00 2001 From: Johan Cwiklinski Date: Sun, 27 Sep 2026 14:16:07 +0200 Subject: [PATCH 7/8] Compile locales --- lang/de_DE.utf8/LC_MESSAGES/events.mo | Bin 9253 -> 9257 bytes lang/de_DE/LC_MESSAGES/events.mo | Bin 9240 -> 9257 bytes lang/en_US/LC_MESSAGES/events.mo | Bin 8941 -> 9823 bytes lang/es.utf8/LC_MESSAGES/events.mo | Bin 9646 -> 9650 bytes lang/es/LC_MESSAGES/events.mo | Bin 9632 -> 9650 bytes lang/fr_FR.utf8/LC_MESSAGES/events.mo | Bin 10110 -> 10114 bytes lang/fr_FR/LC_MESSAGES/events.mo | Bin 10093 -> 10114 bytes lang/it_IT.utf8/LC_MESSAGES/events.mo | Bin 9699 -> 9703 bytes lang/it_IT/LC_MESSAGES/events.mo | Bin 9689 -> 9703 bytes lang/pt.utf8/LC_MESSAGES/events.mo | Bin 9577 -> 9581 bytes lang/pt/LC_MESSAGES/events.mo | Bin 9573 -> 9581 bytes lang/pt_BR.utf8/LC_MESSAGES/events.mo | Bin 9603 -> 9607 bytes lang/pt_BR/LC_MESSAGES/events.mo | Bin 9608 -> 9607 bytes lang/ru.utf8/LC_MESSAGES/events.mo | Bin 12263 -> 12267 bytes lang/ru/LC_MESSAGES/events.mo | Bin 12256 -> 12267 bytes lang/sl.utf8/LC_MESSAGES/events.mo | Bin 9663 -> 9667 bytes lang/sl/LC_MESSAGES/events.mo | Bin 9657 -> 9667 bytes lang/ta.utf8/LC_MESSAGES/events.mo | Bin 15981 -> 15985 bytes lang/ta/LC_MESSAGES/events.mo | Bin 15972 -> 15985 bytes lang/uk.utf8/LC_MESSAGES/events.mo | Bin 11801 -> 11805 bytes lang/uk/LC_MESSAGES/events.mo | Bin 11790 -> 11805 bytes 21 files changed, 0 insertions(+), 0 deletions(-) diff --git a/lang/de_DE.utf8/LC_MESSAGES/events.mo b/lang/de_DE.utf8/LC_MESSAGES/events.mo index f030e0ff097426a51b8ef028e72808ecf88f725c..088edd588104212b4777d9f21f9c5535fcd55d2b 100644 GIT binary patch delta 1558 zcmXZcOGs2v9LMqh_#8FUnM}=cQj^k5^MNl~)ojLAlG948sK839MO2HZi`haD0?|dF z^fD=9~0Z(S$- zPGluhROIkt7B^u$z3jyz)IhCRhSxC-CvhXrA(zEdsrvQY^nEF6;4oHV6Q*DnYJq*I zg%3Iuaw&|WqMt_1a0WHwS=5Iss1ChrBN6&s1DH&G5nl6{)uQ_Qkj`ZA4;Ent@hSQs zYC-j=cFsu(B@{X_4xgYJK1cep_n3$a$YsB{6=QN{q~jg9f#+t_`%74ky{I!YfrM&P zsQwqQ7MHM!@vVrBtEA!}YM?8qX!=kqyN8<4W7LXXp*o&LLa{|uyJ!xAw#0|@ZDpth z>_)XafQtS!Dp?2pjBlM36zwh4K!dmi$8bA-Ms1Cs(bYjFYNC0lttv(iyp^Nc1#uhJ zp^`m=N}wM#&O>D7HjW95Z!7MLC~{Q8Bvh0E_qhtQd9FhiYt3$bD=N}%R02Jyvoe4+ zIEqSk8Mk5qom683>Q~i)jv^YSP>3&3(JiAoPU55}YCme_S+4n5%X0~GzU&A_qk~GM z4K>kr)Pioh^$$?vjiDy`ESxA#Z)s*rcuqww%iy*Y^Du^WzAr`%ybsH;4pZ?8YJpMI z!uwnbYbgw&q8~@iZ~`^sNz{i6s1D;YV-co$=3p}QA-w6Bm81Imm}RyK|6n0z5}%^4 zLM^BU)y{39P)wm6GdTM;I$h;>|vIXpL^-k-xQcpY_S-Xo#f z7^?qiti(Co#`qRu}o zi<;gPIw+Nz158(ZO&_hJ_Hfx~a33U}jvyofprpKu2zF`AO9 zK@EJ=d%le9ruASc4x^Hr$6EZ0N?;HFBs8I>MhZIZt+)YQ)XZ*s-a|#)kL-%QLM1hY z>fo2BK32OFbWnc{G0ZxP{B2HsXRp89sT=s}|L!=Efj5a!pL1lOC2%$we&$xh{R5wr Bm%ac1 diff --git a/lang/de_DE/LC_MESSAGES/events.mo b/lang/de_DE/LC_MESSAGES/events.mo index 886b3815b38586c1db1220db0fae7e16394aff82..088edd588104212b4777d9f21f9c5535fcd55d2b 100644 GIT binary patch delta 1704 zcmXZcYfMvT9LMp0DVGX!*p7=jWtEW)tYrmK1oefrBZFZ!0^Q!Ia~&99P`U|hiP?7I zTrv|A6H;H0Kz3us@q*1zw@i$Q#+Y4=i&;VzUreWA(H9!rB_vCheShmAC+G8==RD`R z{GO*ww$HYoPUJc3%q+3S>=7Kn0(=*JcobLR1Qy{G*5V94j6b5vxvYZQLs*M-81e#zm=k1vStlDw-M8%DzBN=sapg z-=jKSLPD{7sCHfsg0{qu^lc5O1w4yt_cAK_aa6Jn1{mKaC@9)bQ3K84lemCS;cuv| z2{5`kSc{ryHEOHE$bq*;RJ%BC!46ciZ=e!5i5ll?WaV}dS24b=xG(a^Q4LE_QC7Ln z&A5^04rH;`@75niMS232z!d7N%wh|kMJ4+HH)AcGY{eebuj&{&ifEof9e#_7?g6Uf z5>ASu4xm=P-n9l>d9Fv!mkpp79aJJmP!m0hTF@tM{g*uJ5&mg;EKcJGjgX-XK*L*%!y8wDne=p^*_DtAU>3J>F=IixX zX4bdWvoCwo*Xb!gL<7z8Ew|z8G7~F)-?JzCUGc{S-iDgd?9iGyZ+2Z-lc%&R7VnHb z(-wTOt-Gh=`R6iw%Qts6MjD&Lk=AgeDcBI%7HtVd_$%I>932ZM4kkxNhm&LJgWH0! z-eli_)L?ofxFc0RkRCoXkQ^U9FtT%Od@Pwt4i4A%rc;^A<$d1$Pq$_3D!wZEf9M+< HTMGXJIBda# delta 1687 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 DWGn|K diff --git a/lang/es.utf8/LC_MESSAGES/events.mo b/lang/es.utf8/LC_MESSAGES/events.mo index 97a4bb92bdfe145edb87166770887092197e28b5..b2ccddfd5cf9410f28d3c741536661b1809942f1 100644 GIT binary patch delta 1649 zcmXZcO-NKx7{>84>i9jSqgGlrVC81G0dfZ2Gg(`nZopX zjg`DH$iO}Z;+TUAsD+-RCjNnX;THzb%_=*w2Gx(?UhKsZjH42Jfc(r7mxH*5dM~5U z4%}C0*%JpDP-KT4!>9}*=*K8lU_W-?Bx=De456pU7@8)GK0Jw9xZfEcLA^hP$;x5_ z{S}MGb{b}fooODb0wq|60o0bXpaN_|RU(Rd?-J_y7;54hs8Yur@1TeNG~Ra^GlvSW zW0zeiD@KE#8RMcYNT4QMLzVE8GyVtt^eY%F#Ryj81x&{{>b-GPiKkFow}`655^DZ6 z$A9QI?0+>IMiER4YQiqe#$nV%1<>g9!;Vo@pgm5%56kHfqbig@ZQX0sbE~KT z-#X)8(98N}lZFo4Kj%g+Zz~WlYN8Mq-ET*>&vaoE#!wZSMQy<=ROYKlamwP!KZDZPn7T*6BHj>^=-Nup`$P=U0gp6fv^G={3c z461^UP=|97btsp8?7u#rHw5DiScM-^-)|aevr8t3jd&DQi2*J; z?RQauCQz9_Lk0K}mEZ~6>1stNVS(uOMGdDJ1ff||fWWj2PIczPm{ u+3Xsb|C)K-<+?a=HrsL?pV-Kby3Bkir!PG8)Gr#j&%Tja3)YP;T$52G5AtW*j6G=iLOar4u%q;pax*M?xEF;N{ z5HVpEL{84ih1#M*utf$H7`6y3i#Ba45TyU(y)fM0Ip^Mc&ilUS+?j59-V(XK#ol3z zxt(E57EWL+&R_!0V>nx_PHzrpn=Zlix1w_-0ch3U^U z_U4TN2Fe)-VKPpm7Mep%{2leeZ!ENDm zxvry!cuff#M)IZ^HDMPf;UH?F5maWA=)(wB;VM>QR-TjLAyfb-P?b63dI9;FYg}}Q z$1oiqY|8#m(a^##QG2?EBx~aHoya|?0DNx0$+Zm?XrJ4^ghliRQ5Bj*ZQX0sbBm|| zKf2>zF_ZPp8Vwz`b@xURZ!3^=)I)6vupa@Bcx) zpUR}FbOEYgi#A`B@zYRgI@|}kQF|7|I=qQxIE%&j4V7s!CyA!nj|!v}^*Q#T78*uX zAdITu6V%~+fjX3Ph3vmRpSKKXPc~35quL#S5f2l zP-i5JTId~C;}=u_X_Q!qi>L_(P?-&*CVn{j qG@;Ql(ba^@meo4ion%{~(Uqijt2bJc9Eh{dM;~Xbq`**NW!!&ugPh9% diff --git a/lang/es/LC_MESSAGES/events.mo b/lang/es/LC_MESSAGES/events.mo index 663f0ceccaac335605c33d5a6e3c12f3cbf4c7a9..b2ccddfd5cf9410f28d3c741536661b1809942f1 100644 GIT binary patch delta 1788 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 delta 1645 zcmXZcYiQ147{~GJZwIr@W{+Xa?6KLLH`~mxM5CuQr)FuSm9o_EVzw1A{UvE+-aH|p z9GYXYOrf?}Nfu3Ldn3G?Ev*(wi(0y7vX12!l*!GTmUsL9kosls(+2M922QmV>H$xOITgN{E3d^G%Ti} z1rzWIYNKw{!b7MDKQR}h*hL3lf~uF{Jgmbx*n+e1Hu7g({42tbsChA|k%MQX`jLfm zY0$}5JJ+FZP=-OQ#B6N9op=eg;RqIB!VEKtwhl9K2WsO6*M0^y|0+&I7K^F(`V^8W zjH7OvG&2%`G@MU;0V*XS)B(4kB2kH&w+|JuM%2PSD%35`i#V0~ExhNMwWAKcJB_t9 z{wRek3fFNd_MjFV!61&IQZbu&$}-HrgII`XF%~;99$z7Q*n8B429d1UDCXlN^0NX9 zk%RcQkAfzgLgnZR>aq1<5C>fS50+9N$Mv{2op9qZ)Qz8`QuZ3BVZW;nq7M8UH7+pM zj9^<8z!T2oP}C1gu2KfR79Il z>zqWT@&cx?zlBx6HrMeCm5NT(S22ua!2-lf3oXS>Sb|!x*|ncTJ-SP%NB97lYHv~V zhn*gss?WiR@4twGLbDl(lI?N>nozI16_vY}sDq7S9;OE)Z=wPfu}0MA*oxZVDe7(X zp(4?bir5$DP>}eS((sE0MIetSuN!Va<#G$^ZR|nyH=sg&8uj`wV-((X{SRG#7p|oJ z11i@s*QGx9vr`>;#7JhU*_f-OS^g zQVJ4LHxD`&qJDVtP$>*#O1so9=aXIWq2Ng_`>-a^|ky%MJzwp ztQ<>G2R)5?8#hs3!((Kq^`ORo#~57mi-KPD7%Eg#7e+#qjT*QL)nDe?t5G*R5WXK* p>RHEN+!4>)8m@`=y_WFT_$sfqqadLn*4y84CnYHvo(12<{s*NLqU8Vp diff --git a/lang/fr_FR/LC_MESSAGES/events.mo b/lang/fr_FR/LC_MESSAGES/events.mo index e5882a4ec0c337a6bbe9b005b3a2c67485273383..329728ecf0ed9d4e9fefbde1e1998a2249a2e1a0 100644 GIT binary patch delta 1795 zcmXZbe`wTo9LMqZdEVTn*3NFu)V1$yZQ4A$-CVNGTHv{KObcg3iP*)iTw7<{eYYg6 zFO&Wl>xaT23MPtdSQJdUpkHK7ipYYBEc>IPf{ zyzlIRdBM$Q_EOaBCOm@?d>_kk8Y}PuF2IYp8h^kWFtVgHE`}Oci(01%)!*st!9~;` z!uj|ZvV;vTv0$#_SsK>RFpdlHE!0LIp%(rfHQ_I8#0b08;968Yg}2}!F2`}y#U_zo z`;dRF_zh~_f>`O`b+Mqd@M;=#vJPh#>INzFun%uVA0NPDs12`T3ofoUqi9`NhdWUl z`>uTqHU9+8MHbtrUkE7NNWqqtZd!$kz;dj|MpR0+pboel6^TC7ybNmmFlymZRH(LOWGL`P8T97Lt^Fh<$mj;MfVT*tepRGdS76*EW{EJnPvP#ja( zj#}_J*Zv~v(H%oQ!Z(nq_62JGj5AE9>MJqO=g>w$q1lE+$sTqCMo_Q&5Gr@msDoX@ zby(|_-b61dV#BU}2(`gGsJHPoDiYtLBKEWMibwoAX_%!!5lGgTZkR&l@_y9Y*n{dH zL4|q@_4WNiB>CwGR1DCS%sPFPu)XkSM zN;m64(rx`nmyKdKPPqOnsGCLjrj&vz)Xf{5&8SExQ7P>~MbZx_?51!EllUKQ!WLc- z58j4xEgnV>KXCqp`dY4|-b8C74-UIf2OUGbjY-tkP(+5>$Efi$7{T^g3VPN5qCypI zDut*CHLwHK-|gCWp>CKhyjI>B8Y}!(J{8?hUAGJKr^AjGCM(_!^%r(m2BB?*A1nJp zR%}_AD+{+YcCavfgJzP;(Jx9RDD!J&a{esI9s o=;zY;y_wuS`{RDLf8C>*!re9f;XU0uil=L?m(QKzwD)=0|5e%0WB>pF delta 1773 zcmXZce`wTo9LMqZ*K_lBGv}?j<&W9d<(8XHn|0K-L~ri48M__b8lfS2ZmUK^>2`l8 zF1|IW78MC6gTnl0Xoc0xRU&8x`bQ%DQJ7MaFhWL=py+=}_I!CC*!KAR{_%c)z8g#3 z=s7+*C#W*B52I!e;}I;vQy9jxSb{&{Jp2_`;UBmFL*<2W<*0E>QR~#A`kS3yIG_59 zI2Q+yC2XkNf(IS@X{e`R982*8YNH=e3(uk^+`>8xv5OAgfU39QavZ`XIF5^P68W(+ z{CN_8LCq_wC>*@HA}B0eM}toGjB^9(25so$^Y|EMu@5Iu8~%$;Sh~oJqHVxOG41ME z=ewx+hftCI5o35EpioBPKI*1rm4yf_#ue0SQ7P#}9WaTCL>e`302Q$uYT-9gp?=Rf zfe%ri#0k&r8`QzO9x+>q!7CJMD13mcaSFBIRrGNdm5MO&lucNT+i*SZ#bP{$5j=tH zVP{Ymx`brSuHibog-_rL^29*`OH&z39#ksdz$p9MmfgdZbQ?G$SM73WQ734=XZ18fIuv1gd%Ry5TxhE?ZG=<2h7+ z1{LZN)a!o-Lpb63KXLtE;#0JrMdkVqK8+FbtNCrHRQ1&ag-5rK1}NhFkMrgj+q!Uk^`3-=ePDh4|HB_vVk3ob;0U?UBG6&;J?e z^#-P!O0&h@%hN}rGoet8rSm)IS4@ApsNP%HksaLK|Ej;LGc!Dx%MI4&uU0l}+?t4| z8410@|b6B>|mPXA+@qhEXm9?lhCZ7EW$7$C?Q0`v?MIH1(AtCFr*ohe9o3LL>oT*d=fv@vkvcGO8bF%ElBB^*K}IgU!^ z3lh35pqKUS4-H+mxMZ_TEJ8k3&zF*EN4@Arz4+L593$vYqe?Q1T4)J<7)j1bCKpwj z0@T6wp-OrP<5}O1&`@Ocs2Vrp4!nvg$slUsPpFN|<3U_Top={@(n95^J5h!FWVJ}u ztPM5pzT5A2`>)W^&fn3{1hc6Achp47xCeEmRhlBy2^&yJbs|IT8ETUJ)nPMnw?7+8*!)#}iP*HFpyp-wu3+VB!8 z!QZHjh4QDP1R_zFJOP>7vXPHfIeed?(S+K-2Q0=#<#UOl&TJSmQKiXT=xLN;j uc(JE*Y$3eO<2mm?8{v44`oBfgcx)^`@^WZUerC(qKzv=yO2gxu3;7R`s-YnO delta 1645 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 delta 1645 zcmXZcOGuPa7{>84&ZwiNyq45!vOp!rJ zF1i>PY0)BSB6MMGB$S{qXklrKz#_1q7IqP%|Kofh^E>B!=klKSJ@u{nYxQtfgtgWf z)01dS65hv197Q+2z!;psXnc#C@jWJ>(-WTOLCy1`_Q^(lFSgx_E9f6Y7q%i>m^P2G zmOpedu!Vsj#^DpxLC;Yee?cwyfjQ{p6a}7(>Q~|hY{OIx;yS#C{FyO+3ULaxE;2bB zcv`X*-Z+N=MYhAX40VG_^kD;T!~iy7AL_t)^kdv=V`!Q(OvnAGg9G+>H){PYT+S?R zr$1rQSV`j_>ZS>6!Wl@x4EkB9l2oArtVLy_0ky6Lm9aCZjV)BFgSIy?p8f#daTqg< z3cNlgd@-w?27l%%KT72gYQbw%DreA#zfcQP$SZr8B2#;v@L(9{#`UO8MuN3Wgg>toJ39hj7sev)Z>ZZqiUOqO8r(;NlH+G)!Lp$ zC;dLuyql=f45Bg?!bHwDqcjxpD^!iAQ7QU}y0I%Qe6u`UMZW}hVGZiw9*n}fc7G75 zmKi~|FjIE_J1X#K>ZlTV(b5Kf8cNM>RBdZeH*ZEip2bZ#gv!(#^x;p`Yfs`wnJYx4 zx(-#+lc<|sK<$4Sm5J-9O!TKy|7|oLF`!z_pfWL!s^wqQO=5iEn`fc|D@1Kjh00hX z>cB&&b?umoU8s3OsM0(|1u%^&<($t7|GQjbfXkQ+!Y{y`n1`p3Pv$o2`xx>J%na_q z->4LqlNLSN!>H6AN8P*=72tW)1-nuE_u0O*XdGZ*0gJGX|0T-tBB~VQ$QkB?-Csgw zB$?}|B>AWtHem%eqiQ^W%H%WDn;AzRzC#x-px#XJA`NXA!Hd&d@S+yxqZ3O}kyoG& w+Gl&D_o2JgVM2564u_+z_h_u;2=>m#Hac2E{5Gy70XLeT6951J diff --git a/lang/pt/LC_MESSAGES/events.mo b/lang/pt/LC_MESSAGES/events.mo index dd93668e352d1c2f2185685ebfe583fbf269b43c..eec6c0d3ee84821a5a672844d2b501db266a74f8 100644 GIT binary patch delta 1780 zcmXZae@xVM9LMp`@#BC)4CoL-@V|DugWWya7ntr);v zsDqR4_y}tKd0fscZl=HJ(0GA{S(S;j7?puad>Ly|C3zcl!Cq7*BB*u!sQHIb8=pX> zI^}v6i|9|_d5%&5u$!jau+CDwThrh5w-zR+3ltFpa1Z?Lb}d zDEd$jikM6aRk{nP%v{E`cmvnrU$~m-#>Xj|P>Xs4&8UU_$OJQtdVF7^E|^AbH0Sp3 zqAu)ZvP$Mh^=nWWvQe3AL+!Hf!~|Q6;KIM;kQIP-?nRwe3Mg-iJ0G#yXrv zW$G8S@Db{@m+_;_ZAQKF?WmF_P?3(H_8&!M;tVPiUk9jvh{g;9s?`!I6Aw_ee1?jo z$jU@si@Mkr)COTx#@EQ30k<`=4`N)P&s(JjN~fF8O;C zzd)7ZCUS-If_p^Q|ZN@AlT+=H#SA64Uvs7%hG-poz3@HXb)W7L~zd`?3fdU
FNAt&q(@S{!Gac#+6RZ-^l+H>B)lcJbmd8eU7Imea9E^ zm|43p?#;H>CT1r}{>;uYJJWkt_-Dt<>OCvlI^Jn}tIOKmwKLMay*GV(RekrS(55$n zp~hgS!Lse9P-sJlf4*(eL^8N59vw;?h$e^QO;&h#AUb4q93G4v7#vE(2CbH4JenBj bk8eE^Ob+$E_HqAgdwE^{^0A);p5*=yCb+{q delta 1772 zcmXZcSx8h-9LMo9jh1O;nrWMPTg)62lW5b*Mx0!7lE!vu8E}drD;g&oO6NEQ?nL=hFV6G8R;H5bPDoOAD4{^$QckJ*a*qj>Iqy!!{g>apYre@HGh^qvj=N zB?8aQvJ(rB_i5J;wbw0sFGBp0`#LY5kSprLS-z9T6hO4)%zXWu|NGd9&s6S z85MZlki^04FbzKD0AEUF95vwqDwREG;aAkeEb_`4W)iAIb*KPaFcr5TXED1`2Re$% z%xN5potTd=ak!!WN$jEl7U~X6MonCa3@~BT<=cY_@E~fTt4{wJDqsy($p)bMxu^^k zp)y&HT4yA!ikf6*39D#RG17D+3`yF+8{-7>ZHiMLU52_?nP=VDr zu0uEd!>DoXsM4H5W$Yqmu)n!RLlNIa)wmm#qUWd+o7}|73UDCZDd@#&)W-X3k`3 zC8$)_qDs0Jb2QkW!Z_}Iq~F$;I1O3{VvVV*ku zU#N@>x11YJ3uv$t$Qk(}fm3#w7fLx--*%($Io`P`5$>)!ae{1 diff --git a/lang/pt_BR.utf8/LC_MESSAGES/events.mo b/lang/pt_BR.utf8/LC_MESSAGES/events.mo index 8b6d3b7465e0787d30361227f52aa672b7a4ca0f..558664f9952745dcc1110606d88e63e7e8e7fdfb 100644 GIT binary patch delta 1648 zcmXZaOGs2v9LMo9>F79Sz9vh{W-{|pLQVF-R4gzsM};s21IxnNh#Mb8WnE$xnp7^N z2Zp)O=;gwiASo(^+DwZUxvDJa1rcRnLExtE&wF8*&pG#=d(QuH!lB;KM9&f{(-?Cx z)tGd=g>HO;9-PJmjAA^_U;)0zW#~?`*ZENEvQhiwqu!S~R^w9UO&E*EkS$DGnz0sN zoZ&$s5Bf0?AEFMLLT&sV^}#&mp_@}yU=eCwiEFS8v#=kP*iGbTp7U3XZ&2UG`|QB| zKFi*?fCq|fr(*>wgGvlwJ+8wpY`|-%1Ak!O z*SH@4;3`A^vp7WywxjMq2=!q%vcOoV%Xb|W;3#UNs575K1)RZRwJaAkFGf{pH>#5R zQ2TTu*T|e+d{6%`G05S;4J0TtjjQn;YT-XrX%l&<%i}}!wg^@FU8t7SpaMJS7{(ap zw^8fHQLULoRqQ3Ea=v-RKoQTPdi(=bqTi^DGqUZ>$}xp`4erKf)WIVdhxeWNB+@k# zMYb@Xow*vX=b5M$Z9z*LR54I#4xoB_1eN(o4B`dM$7iTYeZv4Ia3ORjHt?s)Rikcs zE2^b^s7!}Z`;Ve3aSv6AM}GRhnZXMls8@ecm2d~_jMGsY=b$n#Lj_ig+Moqhv3Asf z9jH6di>lle)Vimr)tahrEcYT7%OoE)rv33S!ThRXOo61vK7^m zI#hhnGnC?tTCIelH0O~H3pgs&?3^t)6Z$=%|?s#hO tj;GYs7y0Tr;c~SOHhV2s?cl7p-en@e#E!U_U~Xq*EcHW@2BTqr+<(M4ooxUB delta 1644 zcmXZcSx8h-9LMo<8y%O)wJ|lf$=tGs6cZG)NXoSc4O>VfN(5ho6tc*;gpot#LrIdD zL`g;wDGf-1We~*l5LgdEg;G#Nw1_?AoAmuT7l!$qbLZT1{>#z+hQ5Z$-ZgfzF=ima zn00s$!*LoTaTcR6h!OY>3-BYxqAM}9E)lgZ4Yf}$>i2TTT3pNg5QbqJvW4kLH1_Hb z=XkK02Y&S66VyS^Q5%0py|9FN=;9OwUWl4kVJ3Fq2J~Ypjv*iOjIR=Wi+V5I8wxzb zYlk+@|tte`TDT_37I3T|YcgK9}ND!{#{N;IP0JBg}TH)>-WRcgQE4UA!a7av*1OripB zO$jAt_cGvPM)^`Hr%*4KStvKl8d>CO6W1FGEXrF z-(W8O#WdnIDV(AO+fa9)4)tO;vcQ~2UA|#dfOk+E1)ceCRKQ*qt7X}!c`>R&J5iO~ zkJ{%Ha*fQ{)!*s=RR-BSxP=5|W-%QpmzA*wY~sEWPB1kN|F87SgUs2=}7mFN#DV{b+%vkHu7UXQ!*DC*!*bmN3GpF+B3 zg2)!;i!)zwOy&ZpMMY?9gK7pU&0$n;kE1g0!D76O`8b2B)K~Oj1Q$YgqJS?|t`=45 z6R4J6L}faR+W$7H68BM+2xQU!A_gybpk6JZDq;CT8ONbE&O~Kih6=0>wLuH2VjZXh zJ5hI_4^_GAsCCn**1SRm@DtU_WuG1TyNn}jk}@TzfSPa%_Ms0aP`}S1*TF2}9`sNS zmADagX**E?otM8fYX4B)f~Xt?dcn zfh}q4!=`F%l?No=NW83x#72e0zHA@*P@cS`soEw@)7peKY2r)2KlYI2d}ij%nVJ9p zKe51A;MVChyT};xWv(&#cm*@?J9Oh5W?>SS;yiA_XSf10@>27>sCgx*bvC2k?{sX% zW%Li>68r#J!u01Ed-27m3~Xg!9JBE*YNJ`y!oQbs@h)WJ)=c52}*4CrLFj=ND2G@^w;+<;L$i04ro{)K*AzRDPyW;d4N z0o2A(XFP`b{vs}B7T=?vv}vrQVG2@_=AbfAjO%a{swB;*1Gb|w5k!60i<&=-T6hGN z>T$<&xSalFoOT&=2X*kHt5bp5pV8oFCU_{7GpG-KMy2vkw9rjH71>r~4by@uQ8(&< zpQ8uQATgN>sM6g+W#&GX;g7fx|G_ne`WLf{CTvIDfdJ~mVPt}_QJ3!<)Bz_^3niWY zYt(@Yn5>eOq59RR3^kxKxgWJo1i41$lg0Pc|0^2n8MuTT%FN+g_!KqqKU8Y78Pw(R zqH0@#N_{=5ByFgJ9dR7Rboy6O^QKXynL%ajd(35j^8*c?_&KV^f1pzIH!9+Sl2l~7 zFo%8{HeeTO;|a{f+fIK5shUY5OPH5VUxn9r5voL0XlsFH8cNM!RBex;BL4{e_yump zhp0^bh8AXVA#^9oc_?$Os9WBHDrpQA=|$A~lc-GGKxN`yDfRc!c+7xm^)D(D8CELd zeAL40QIXf74z>@qKsPF51E>wds5>x*%G_Dhya%Y#BvA)=jVk3E%TAp*pBq9@W(Vp( zowyCh(82`j{XB9V%mOyyO46YeA4FZ+FzSG(QIVfP9q?;ZfEVx`yzcnKrqRiOhrI2= z5H{ijsuZt~z04b@UqTql$h)YLw4)+CiFG)Nx}3A9OwOY+_W~_kz$NJAg6YoG6w%P7 zuuylQ2K8Y8)A11MX5|?v-Nl!B!@$O~b#J8);T`L;)1RC}>S)ENC!It;i<1Y%zTdI6j z+bexFmA-1r@2~aww)yz;w1pzk$^+rhVB|z7Iux$8T8EB@2CY3G_Vu6W8;tb#S#{BH dC~~|vTz{%EI@t5}vED?Wu+FV*Cu60V{{vi{!S4V7 delta 1780 zcmXZcYiN^K9LMn!Q)_MNr8TuyTl;vay=ZYoI&5vx)I=*y8ceNag2T8*DU=FHyfED! z6|oT%b%E~1)}mGgQBW6Q8^s%JP>~KM^vz^ro9Gw}@y7N-!F_+t18qL%JUP!f|I29y z+EeW}4o$I3j4`JQjhTa&a4LR}d3YD6;}}lEM_7%&;7oKEW!Dv<)-6EoQ;GV%(XkB+ zn0I3i_8?oB-Xdd9esPcoH9Sb62fslbbO*KZU#J&e;xcq|iUO}i&0BFH_Tqd@VJVIv zKjtiw@#mA!`z_`qf`i@|$TrnBZ|D^QAym{+1&vJn+v2vvy)>b)LR#geFv52H$b z!f_C1FdxAiE@N(@0^d0=o0xrs0YByfA1dW2>V-d1rF?-FdZ?!|TY>Chf~XdKf(q~? z=HnMgE@lXoPzF_*+qe`TVI}^D3k>})=M*hyMBRZ7)Qbm@1?DK~@(rT`yo}mt+?l^Z z1zgHvwX6y?{}5FnKdO>jQ2Xpdu95kC@_YJ!mce2koJWE(KVTXDhFbU*Roa<6)a5Bb zU8UbR8%&(%>T}QQM6jiY?EaZIi69Yy3JF3UeQ6+kf%DA*Vo7p;? z%{+`g+<`jy0_Nf^XFiH_&5R>km}k!1P2=^v4Ar6rw6#Gy1C?ews<$yz=7+EzPh%C{ zM^)-?w6K5+p*vB>hbk9Bm3lX-r6*9C4x{$Jh^oXjR3*Nvp#L8*_>l+d)xW4pJFq(mHQI4?hdLo4^aWUK(+FnWoQ2`y@X9tW;H6H zZd{HjwD1<{`w8Sam^T=}*_1;i-io@k2~>cep)x;%3UCmW;8(a3uR1=q8EoZ&hyM;O zxD)+&4%LdM$XVu{Ghav=sz?K>C1F&C`>`31p)TirR3#@+m3x8~zQG(U=7QE`3Z(X7E_I%rw zO8=VQ>FUYUd*ZpSU75>;f4JR?O(eaez?&H=u632|i6{5&-WyBAtm@Wy^wZwH8moF^ zv@e!S#%j_Nb8FXr6!1mrLg6~U&uR-dg*GkU7VZe-2cwB(-IjQ?KhYOW?uj>98@hr) itHT!xSj~ZuZ&Prc&+m@}Iy*CMCCz!RT_Xb(x&H%^OT>u) diff --git a/lang/ru.utf8/LC_MESSAGES/events.mo b/lang/ru.utf8/LC_MESSAGES/events.mo index d718a6e42b888480c9ec8ee5d8c51f8158b648c8..f48425e9594fdc63f9b8aef8e1c7ac5256ea19c8 100644 GIT binary patch delta 1649 zcmXZce`t+S9LMqRHFukf*)Kmfn_X;o8#8t_VdM@&I~y8B%w>bqRjI)$kB6`mV#68#-G9vhJ*tSQ}` zu@@&9C}yA?Ct?q3qsOR)2T>D#VF>-~G961${V2}DCd|fmRAM)fKYPSuF}_C4OUiTu z&&zb&g^L(aWXnAxs0^YQ#A=+2%~*q%Q5z0p8BU&RM$;mghucsaH+$o4sQFiMtg={6 z|Aj+i3Jsg)W}1qsKsL_C5b8+Qp#t25szfzv-d@!AM^Ou(LY2DR^Ab*`--!c0vwOIi ze#Z&5a;1<)ENeO=);w$fcB#nY(Zss9<^~VYU5W}iC-{+ zp`d#tjY!q)AnNj+K^@UG%yMYlqM?#LL!IFOYM~L-LSbGO;9*o|mvImFAjPn(Iqn8a zP`{#$s7u*`r5H!ee}@Zj)a#dUBOOhsqM-;|QT-Sy!(NQy5UN7qeD{v*$My8@;adEM znipjkRqO!fVFxPH2dGN*p?+2GJqHV@{~8AVFreRYgonUcm~yiz)a61Gwxj4V5mD^qFfR z>gv5E6|*q$EU;9)b#tgn9_X$cmyM2&w*`d&6P>W@hi1S+i!HiJI}6?u%jW0yDcF zYZi~~7><1yfde=ThjAvp#w;AgXq*=3eHVxNE*Z5>5cR&$cQZ!O--FXJge+ml;>?|T zae;wl3^ZdT_MkR;hFW+WHQ@(l;xu+q;Mu5t38vyPOu}YN#QVt4p7L0QuTb;C=X!ys z%yqqmGZ|21YkZ4QCn&)*EXO5Shr6*2wc!`c$H;kRG_4pHVFhaAI)D5sYW{7U$}Fy? zKkU+oq45`W(&+hK1`=>F{S4HVl%fLMj><$iYTgl4#?GP^c2TKr_HD)4^zY%gW7ds3 z>EBH70(U>rsAM3Cd~L*2NG$dk72yk9gUYK;T!;#6FK)#~oP$HC42%5M10e=<;!gj?JJf_2c2^3kkg~8V zz7Md9{vfJml6YvNjY#3!0n|zBQ3tw$X?Pd+;s9!Xf=h+npm7@aqeH1SU^NnhjbJhU zL)~354=s2C^>1lHrS>hJ!q3PdZ68sqC@-O|wiS!83#0K92C(oq4W%xO<1^RNk=w8` zjKX?U$}XdduibzDyrnau$g$qBi1UuKqvc@0b(&k=2P&OVZ+>Lm4CiR?!`Scfa4T35 F_z#jAuFwDg diff --git a/lang/ru/LC_MESSAGES/events.mo b/lang/ru/LC_MESSAGES/events.mo index 4c2d681576a66fc3ae8b165ca91be13f451d95bb..f48425e9594fdc63f9b8aef8e1c7ac5256ea19c8 100644 GIT binary patch delta 1781 zcmXZce`wTo9LMqZ?YcQnotvB5Y;)hr%}safcCyj7;#}Uet(s_%6e=<)nm93CvXGK zp*D5~`L!>2Y{TzR zu@?JL3unFdS=9JF@~Rzoq5>Pl zUYx-)TtsEyDn5pHk*TfbA?^dVp%#A8^JAo+Yxlhl&DCacIt*YC=h49hul@r*NBt)5 z!$?gb@LA+q*mYFO|3IcRKhbI4weUsM!rx*S{)|zqcM3-`ie%lUP?zs@)DgXhRW5}ODJZ3vQD=A?HPN4_ zi6XqL!!&AVCvX@SkYrfZBZURpP+!q*)TNxpW}HWjzltHe@70^Qk*)^BDJa4jR6U2< z;YEz$T~vl5n+kVi5__nh$6fdzYFvy}l(7`n;wjWlKSyP15%pDF^So0>{&&*w4-NW` zqdas*qsYB87d7!o^03 zOQ`YHF8O+kLIwvhz*T)24sMP+1DZGbl()JUzF6C>e zqdke8cn(YPcMM|tzZ8_ZVz$p%t4B`5`cY?h1eLNkP?vAsdw)4MU()HD&HYmHN%>*g zb+i5a5w9K1omu{wZ#cI<==yf&ZUhrP%eSmZ7yDZ_W%8%XZ~2QXo;$FzGXKunM&Iha zT|1uX+STn0bjK4td-`%euG`WR2}jyO;r38?o6{2RXl>sb<|p`UGLsGUr<1A7WHLLI z?r?gi#*!&#$MpEbkmS7{78yjcUe!QBP@ zP`?F1D@c(eLr@WAkw{oh$YL$QKPm`TMg>LI$nuX2iV$l3QO{T3FX;F2`Fy_L&*$_0 zyg%>TuRDI+@y?zb+!ix?Eo|0^Q&@xVV=aD!i}4e@2`^y>ev9=OZ1BEoKz-MSS|@^f z-{m`iOXxp}H(~)|-I zoWxc`T z_25d(`u&pc%c%KBP?^1e8}U<@#!?#pqE5QB*~>sH-cCP)x{`iWfN4}FvZ#3lRK_Z( zg}^zp7jYB*jXLq&3Mxz+MtqalOMeV?Wp800<(8veL!#I+r+ zcfwHybm9~Ki%X~pwd}4GW{|S5eZEKW5&AQznrY;rjUGe_-?pMoI)OUSK6LO6d<@T{ z=7(J>>>!P&a62yGvzVh~iNWTu2meCd-F-Z?U;*`O*^5f;=UBv_kV9IQs8y8Dp{{m6 zcHvtMT-9N}&YaeS-*0_o~#$PG+ZzYmQB3ey|vN{a%!rr!+D2ZO6DTYX|l)AZ5h(Lgx+bh$j9 zFFGCl`Q2lc%2>4eRdeT-ZOM2xmd?Zyac3a2Ih|U!Ju{RH4d%<0*w#|MSl*qlOq4b| leYwFwXDFUdIu9h%@zmf$@kAn<92uD&Xc?+!yTg%e=s)Yo(pdli diff --git a/lang/sl.utf8/LC_MESSAGES/events.mo b/lang/sl.utf8/LC_MESSAGES/events.mo index 775b9b393e84af3f9bcd09b7a6191eab7385e5b2..bbded56292907e14ea30eaef003e3079c40258de 100644 GIT binary patch delta 1649 zcmXZcNk~;u9LMqVw5Rq=droQQa4mBn(QKenNh@j61~7|2DMTZ(RcdXN+XOjKn}=C} z(89)rlrN}=vZ&Q-W9cF)r4}Vg0~ihDrti;tLHwL^?wS7o|Iy*9=T&#w!|a8|nDcSQ zB;XD7;vQ$;hwm{Kz46YxMAW==)IPbW@1?HWaUT8sI0p|QTbSl}W6yr* zU?87?Zj8ozsDqxOHvWQI@Dp>;%PGlNfa+Ib1~y|VcB2BjhWwaeeyzk&)Vjz-=i-@( zwzF{_1G-s>YdI={O0=*BmtZT_;w999-?12Dl8m8g$}to7pbl* zrZJy}S>QzKM`a)tvoHr$lC7u*@ET zIDyz98oG%^z7)}3)Pgot1ZU8~KGcOCpi=x6mHJ<(w~@x653`XfnIcr_HX=uuYFvs< zu06_uhZ1uF6p)WPGZ5>6s_G`~^v z{Atbw(=d+nO%aWBK5Re>51!!4*sxC=?5X+)lv zvC)scsM1__`w!7pL?Ig5V8Z?I87t}k!F(*^NiW7jn2lYiS`MOK^%&})zsQe?wVaC- zqW0Z{io6Q-Mrz&uL5uvWhDR9C4KJfobsM!Hh>GYjD$>`ec^^@)e;UIvjF+kJ5w1y? zOFtVmzZw-tJ*t%FP#Fqj*-m7G43JIp3U#3$Xki9ns|4k!n%B9uUG29>EOCKHoMK`)lLuB)J-1)EWk>_aU$ih6YIt`}UdqUH|;Zbg-P rI)k60PIx?xfqI|q*%27`)p$&>IQm#bcyV@1a3Jn%>}(_7y6F86SaqM3 delta 1645 zcmXZcOGs2v9LMo9zB0A3F)bS(UCl>I3ihx}O_8ifU6@4=5+n!7RWL3JEH6>`2%^O> z64@hQg8G?lmmPofSEy5rrb^#izGS=>*5 z%BGP>V-1z5cdJu@RLr8EgSwKVr~vCxm1sn*YeiM81GTY@Ds``G7&p;>fO8&WM)5HH zzEmd>dy0l4$)sM&=oD%}2P%UbXki!?&~r6 z(}D`D9ks3l<2m1S(oo5JPz%Cn;Q+Fyd4;<352$%7Sb=|08J1E>czHE$91`oCc$uA#n1@Is{z z^U*@hKaNV|9O^1>qAGMZ%XTt*!hj-wkHxrx7WzqBS5S_+^Rup(v6_B2D!_NBjTcZ? zw2XSRtEhzjp(+$Zx%5WTQE#Nyrcq5JhM^PpUMCL diff --git a/lang/sl/LC_MESSAGES/events.mo b/lang/sl/LC_MESSAGES/events.mo index c6c9e35efa609ae798e5e5df26cd8b120f796c40..bbded56292907e14ea30eaef003e3079c40258de 100644 GIT binary patch delta 1782 zcmXxkS!_&E9LMo9t*J3pT5Z)*T+~v!Ovm0f+EQCvOSB~tLd!I?rAZeNA=mPN3NMo? zLgK;xVChH@u>~*nVtZ(8(FcTB5@HE2zQ5k9Y3Fm!y=VLX|7Uu=^j_(uZBh1MW6XgB zV-oQUdhrJO@GkbjPV9}(a6G=me&`+Gj7vg|8-`kE9O`|ZYYFzHzXE$<4YGu(8({37 z7u$J|&VyEr#Ve?d?w}U_fST|f$D)^AQZNJ6FUH|mheNOx71$}{*WBh~5z(8r zd_4FbVbq3SFbCt3jiG4@a0FJMHg0yG??uf&jy;*h zDfByS8vSXQflj3Hs0<9jkvJArlKH3uE<$CZ95pY58sCCicqb~=t*-4DNB<;td5r16 zne_J$asshCY3L*t`BFs7P!n2E5$r|_+ffI)hDz~sRO)}A?nWvP{g{SS$z-ESHw)Rq zl;Ic*x$Z~yv(0519LhXG)%-oiVEj-g(iBub9hK?;2C*8munm=g`>4ntp*DVnD&c$N zjOHh5Tzsl?z*J0Nf0IpP7%z&@!qun=J5VP-ikcWfW#l&Mz)w+;e{`RJLj@4SVi}l? zD&0y{X{u2Nt3%Ce!C3Y;+i57}`%n|w(Zb`%n&uX&<}Xm=K4U)qMMXHBJZiyts7tsQ zNupVYTrXo|Jhq`qbK31+M_Unf($E60-52k$nEo$J$9%5zD6GLW+=r^=1=Ov6hT7;i z@@x88&Ox$J>&`|+UW&RSm2Q8HMgCR8S{~?xM^LFckD3rcMRXGt=@ZnrZq)7nhS3C;KR4MnMG87(ZJCR-B0ogQW(b1X%y1fjQToV#mV>@^`9z{d@JP>`A~le z>T<3}m0%YtQ)h7+cAz5ui264CMPp|BO zsPP@)bG|&!-tb%B#e^;Nb+~B$6xGh~sXkXd>%y!2wr64ZmA~9$A~~^*G0{0`O_7rc z-O*8IX?RWFq{y-4bWi^!MYBtb=FPE|%~@K$VDX}G*T4xS!9Z|oW?)8UaEcWS<_4xu z4DjPGt7>Y_tZ1y-)Kp*9+|Zb7l{7rK6|&}r>Nl+2P+PUh%CBwM8Y-;$-_KgxurX4U N((UWnc(irM`wyIi##sOW delta 1772 zcmXZcTWFJK9LMn|X02(X*49|h?v3jy-8ytrXS-^fl2}Wd789LVtQgl03bjIvTF~)Y z6jm=v!C1&q{q23B&F6XE_c{Fk|K~}5 zZNAZb`QS8ro-t;y(3m-R7IW|h`tT>r!!ewW<5+ox1+GB@#T7k!JIObbx`Aga_A_!+k2r#OhJ zz)e)S)?gfqjjdw+sF3Z}!qq$@@_ghS0*}$Xeza>dfz;#!X=@ z{*B6TId#;6b*M|&h!oLmL#~zCkF#+Qbu_2k{uQ*9(I^cqaNm9L2qX0W!Vs?HN-x9h zSc3hivpk2o)wfU^y+&d(xt0@132NPHROVsS9cf1Ozp|*m&Tt106yXr6RHsn`Mo<}L zQJIdR#yvpY{%7dLx2X5;T>U}HPk$k5d;^9sfjY`>Q58BGw4Kbp=Yb;s4HeK7S{NX0 z9l!l)Ys`EuEe{j zU#dLnt&#`%P=7t@a&AW*K_9A8r|=6rkIMK7>f7)JRjKz#PG%O9a&Wn8^=cZLP>aeW zhMKSwb?H*BM_h+dxah>TN~PHVoe{nx3xy|TatUyRhv@D-aS3Z^zKxRwSIF;i`5#AMXlOsEZo#mAC5%g R(L^HKG;hMkhE>*Z&VRjq!>RxP diff --git a/lang/ta.utf8/LC_MESSAGES/events.mo b/lang/ta.utf8/LC_MESSAGES/events.mo index 98c1b2f02f360239eac7cd181d5c59f1cc6f9346..5c19a63e2fc31b98b1d49b91db8c2c7dca8d0e62 100644 GIT binary patch delta 1649 zcmXZcdrZw?9LMqRL8KfNA-R=`P*kpo3|VQ24x6)F{zzGxxkWZ{=C&pCSFRf?Tb5>- zIsP%`vhhzdqiBt6G55)JY|O^{)9<&Po!9ey&hL4i@ALhhbGoa(Rb8p-6&P-2$D+&z zVGRS!@8ui>L)IQ@;pJ%z|;{akm_Q6tQ3o9RFfu0Zc zGBJUP8Vtv4sDtjHHvWKG@B_zT2&W9g6jYppqp=)gu?BUq3&_iE^EMURQ0w|dJBg2p z4mcYpGoj38yUs)1AP3{nhY47LtMD}Hz|WYD-XUfTZ61!nm8gR&-1%zM`g7P*S)5MX z5?~O)z=k?EjYL%-7UOXoswH`-1ec*I;X|z}K|Q|{wefybscT$Mp_jM;&v?wPVm|Sb z7{|aV2H8x!LO;e+w+!5abMZ2+z)!dev#IYwJdRti1G$6cjWA2Zb*Oa*-S{ppCVq>0 zK5eAgA*{y|qyI^xoQ;oS9Ur_z+HCu&uM#_sx=|ZeVi#`1)zrBhTQC)8#F zx&|?axDCm{VkoN;nuf`oZ~GW5W1n8m8l4y5{a1a+Z$oXq*w%wQ&Vq83CaIju-UAMrk%jjgDgdHKpWV=7WC zdyYEbH!j48@n-AMhx!!-QS+Used3r@T!euF26YT{lP@?I2TpJjT7vDwhwus(O*Gqt z116bm#Y$XlgLsGHtHmHshugmt4@HZ+y`7c5DeljcUPpRK?oe_$`u)jhJFqjk&1!ksJR-C3-l`Y(8E}qy7gNbThFQw~~e8 zhggp*X!siZj(#lQUqoNRCiHmtwUEVf;)LnWA4~8Rus^KbSB&yVl-1rEpRJTwif9=kD=>t`^1+`6~S)S_Po6t&+XG87Uuz+W2 e?Tav<$AanM+xzxTPuvk~i24)TGpI{>81)|w%)t@> delta 1659 zcmXZcduYvJ9LMqR&s?^hjdt9xV{T*a48s;?Vy>IeDVLZ_Lt$>osbAzWuubR31v3cHxqS($=DO~us0Urd_00W@G}m_KzlQWmWj!jk2<)>pWlmGe+>Uu7SoAq zTn23z{6*cgbqB8kov;^iA5=@Gq7s~msze@YT>+|Mn@}6Os8SdEmSQ6DX*}wfRbno2 zZYNK-ltC5~Q4C=+bsK@(F%vIg9)804IDz_RV+pRudL(z7+LdH+5o+B|Kfa68iQl2V zKct)4ZY;x<G7IE3@$M^U=Mjf-96mwaEWjgw8Pkwr z*>ltZKQJ2;`)9ppl8ixQ;9o z*WxLhMZ*{2R}A3{{zdcg1 zS2MpG+ujNc4Y$^;s(Qcps~dr+mig(`W}pO2#tRN1m3=VQk^R{cJ9o8!!iERJ`b t;>gSRdCrRJ;en!-&Z_FONx!-TR$27Qh3M4-(JSSVr74}O9}K#f^bdCv$N~TW diff --git a/lang/ta/LC_MESSAGES/events.mo b/lang/ta/LC_MESSAGES/events.mo index 412b219d4bdf02ce706d67869e7deef4b8cdd9f4..5c19a63e2fc31b98b1d49b91db8c2c7dca8d0e62 100644 GIT binary patch delta 1781 zcmXZcZA_C_6u|LQ5CxUte2<`8l+unQ6J*Vyc z?x)>nyAz^sipUokB5&YHOu`G8j8`!Qhj9Ylz&sqqNtiUndY=pReKS$_S%CU_scjvm z5&Li)ZbP<^;1r3Dy|9;wd?xyEB7TQ@&=u5;AEGXJj`J~zQ?juDHLk*07{qDVhkCIS z$iH0XX$g*?uAAVp5})mgS{vsvp_!G~u0p**6&mQpc^JX<_!a7b|DXq*nIa5j70$+W zs0T;v`CioZM{%sOxQuu>${?MAWLYQ;oGU>SacYw>SfkLA?268o_OZzFe* z)zd|Ca0}|X&+Par))GHJeZM(FWIqmKo6!H&8Qc@7-jH~fx)VSnEDnUARNGAEa0gbx1qM^JT~HOJc4=b zt`++c6G-Sf`iO6qT8S)PY5jn0$L-AbVmdytE!Ku>DJP?ry4sEppqAEu#JZ|slcZ!@}xvw0-)&|CJzPNaPAXpL=7jXKuEeoyr}B<`6Q8lULN3CD*r z?j|NkbL{;zSNuq3z9YSS zQtSQUhz;@AKuXxdb`UVX>Tq3peu6b^1cbT`m>Z&9qcbcP z4G9}+{7{A;m_nQw1Z7|o(GQ9Q&=Er7G(f;CDd9aD2+^-b|Hpfib-(94?epC8oOADe z+<&|OWPet&R75@~5Sf8Ta58>}*?0!+IEGX4SFFGrI2~<;=I;toe^-XOPdV!M%Pbpl z8u2=ugdNBh(p4zQ|G(J9gqw*0%*C%!FZ2WI#`jPcJjQuw<0_hXC2HJ&PhuC&!U1&P z2=XW2^KS``qpq7=WF|hlC~0myj|t7J*3yf5f(CTr8k~!9Y{LVn7yJ_!VQ#SqL-FDq z3|n#Baxd!oVbse0h&6aI$snJ>zo;k8FEK0Nz^91IQCqSaHNhZiCBmrdI#4T?K;3vZ zYN-b;4`3eg2!3dYoWd80eKSpy?=x7z#5Ig!33XeHub~%5a1GwXHe5n|SK%P;#LGzT z;w=+-8Y8Id`mFdHY$E<0_4nmZi0r{3>=gPxYqq)ZZal;nSCKZ$8`M`58$>(t;dDc3>Co!*=`|wMFY$tQFdhRA1gkJs@-)CHF@4{xAmdLLI{HGR2krOdG(u;EAQ;ewoEHZe_ZS~^4G?8boDqZR>yie6NyfD>PkuF%4onB_5?#7zt7nistYz%Z3wjl za++hk3D4Si?A6|$SYl_q&iO)HbF;I>7YsP-13_O?^YcExKOBfe(v79-i*vV1=ESkg T=)TN}&r+LRj`UB}#|!=g1*_$Y diff --git a/lang/uk.utf8/LC_MESSAGES/events.mo b/lang/uk.utf8/LC_MESSAGES/events.mo index 0c314ff57a9b62fae5468e881c5bf1f13394d138..dc1cdf5c47d6e5768054fd86377ece6bc2ec8abc 100644 GIT binary patch delta 1622 zcmXZcTS!z<6vpv2S)(&$nv+^OrrCHcElH68)?_|la$ z%%`FVWJvQNAu13nf}p~O5-jqee6R~h1Qz|j=D;w&z4z?PT5F#sW}la50Xd=8dD~O`_I+b$|ckx+ukL5#yOS9}AJ6ti&C!NioNY z7>F>i5Kp2G>O^gPAGP2i=HnQqW4kDcRdJzhhtdw~l46Kdb- zfD?;sjsZpJSsKgGi#haDaTSKK5nE6PMzIWEBOmjmnq^}evXzBV<8`R@dr=2>VFh+$ z5>TTrErxHe-V{e$?;V|D^}(Lb=v ztR9DOEjp@K6^(VsnbwBNtP`to2sQC1DwAC5T#MT<8M{%L_F)M=aQh!oiOgac(=*K~ zu>nJP5%YBZ0FBKIyhCM>9*mVfgvzWIo3O$4Hb&^rp#s>E6{}1O{!ajP*PU37y{G_R zqXL>jKIY{f%Q@ddG!%I=mf{5@G8;xMoIox3ftr`ZMeE>d)Ll2AO1ckgZ~*-{gPQjn zb#?xnSb{+$S1ZCShej<8Wx5}$unlzucTpvOj|$)~p1>e!5Q|+x9TY`nJc6447FFV3 z$gNp0HCSjSr|tpl$b~Tb7-t)7lO42YJ;Pw(q4AQ@3=lky^yA{0Dq!3%HZXohifCM zf86a~LhbVk3-KeaLm!LRU}XXI-$3IK16#2l)t|y*46;fKxAS!b+fmQJ2h_vne)Dh`un}ao0!4on{e2nahS#|^07UuW6!`v)CQwSEcOKzU@~Fr zphj%QgQx(WU?NT+e{Gval{$`SHNO)5SdSFVno#SCJ7}o%H{1!2P$eA2Z2XLRh~i4G k^d{tcZ18EqX^&^;V70$AKCUcue6VdvAn?C&Hq_($2ft3FbpQYW delta 1618 zcmXZcTS!z<6vpv2p*fmbI%;0B%)F&(MWaGuQX0x+M1g5yPC*I0{K1RFFPo z=1Wl!h=@jD^w2<7FG5L>NM=M>528gxV3Ga5=D;w&z4z?PTI=jN{Y|}1LzkC1tIez~ z&di5r(2E@yiCq|hJ(!1gFc!y9^WLK7O{3O-aex2q8WnFA&3FoiVGi<>6}aQ&@#fe@ z1_BJMz&6xD?Wm0(q85x`4vwJ$o^$(QoVu2N0j6RAQ}6`xF^8{h*o|8E5*7FiYTvIu zCluKt1B!47m0?(dSqA!W1NyNJ8&C%h;#M3-KDNZyI!s6m9qdPq*PzxPMjhON#n^=_ z@tH$InZ8CNDq2$Ts8R=9>oJD@aa{12ox^?fo0HA< z;4p4R=P!*i8b#ENGpz-cSv!{FFlypAR3;hJc{f(!D(pgK+J}WWhw@$8t{JtsAt`de!PVW za2yrTC*)&cJV!t0TP6)fUXMlCi9}|PPz$F}3l>oGVtCLxxD2^2R*Nd>5v;%gjKVq8 zykDqC=gkNun2O|TxtQ+IsHCAxk760NpdP^kRLLh%0sO%>OeGCsu^Xs^22mN0qUOIr zmG~#})GReKl#m~FaHH#abhN=ucc34&!6*iB8uhI67_7in*Fh|%KaZ+Z7N_YM2aqA_ zKvnKOF2^URN(52!CQu1QW>fzR8oBI3uvUZGpaoUh>+bkn*XO7g(k$lUJZhsPUJklk zepLUg+rNg|=N0DRd)$KIEZ&4AxzxXu#xVw}un*P$i20bzDlM$!s|8P^?!Y_LWeex+ zrIMzhGAu>CKWdQTSv~4*Ttxl-USJ<4vH1=hc4(ZU@g4bCV?pQ+bfPv0BC*(KRDjWh zt%LUCA#6qk@DyWk68T5lEUMH?sQD#C9fj3M(d+%Ox7Pf1n%=dAwZUv8GfyL~ZSBqq zl8z=3!U*(AYNGyCD1nTo{*e$B3@ZX5!#{GMp^)tlOF=}?==t)#s%vEVt zi&e;07DJ71MXld~I(R=uaT3e%#{vyy`WvbObGRID;A7~kDg{=7intQBumLqcj@ozw zs?=%6LG;t#jsLjJ^4Ldz*HdOGJdMv{LG|jQ5kbzhEGn}J?8eimiMLUitf0~;JS)AaA7 z0@$*wRGIDgFagxFp1^jTLIrpM70`9$G7rzOo%1b3Ly-?+3x145W@k|g=THl7q2`tI zpmlIJ>RI=qO1cw!@D%#+CTiY2)T8qSO9=*$Tx}IDE6_;NP^PbA7iLk9-~_7Vf1m>R z5Azrx4Pvo_sDq|a8J|PVzlbXFUF4}*U_~jR80z35$M>+H4L)@Sj-xg>hgRC52 z*n?w^(-@`yFRD`YoYsM9WXL{3RqiBu@HN3LB~(KGI_e*!(abIcYiZO5BdF3I za>l=M{0a3zn#TsbjoPS&kAq&W4pcwq^bex;`4t=SDn`)D;?1qRZlD6JAZ#7fkAt`y6~OoC$2sI*+vZWFb`!1UC(wr}q-ZvP zTGzCXhD!grGvQlQ31_huuc2NdcS~`qtlnkCAIehP{oZS?_lvi@Dc6g|Zr@+7cW3Gr zZ1T8UL%EskqRZ}?7b<&Pf2rUdq1! delta 1735 zcmXZce`wTo9LMqZSC{Q>T{qq4oNamPoZHST#i?uVx=wbpZFe51r!&NH*d$XYZl{6? z-!dU83h4w>>kknb5-jClAmSeiwtpI8DG?(gmQF$t$$wgyK40AzzI-2_&*wfr-tYJK zd*5%jf4TkA(HU;FnPq01Rp34>#gEX3pW%ym5*zUwd>L<|=G{Tf`wg{z%KQCaPyZaV zml&_X5^O+zvamNEonx*wG0@FG8Rk$2eTdrlB5FYa8}KG7;D=tngi~LoAIACEjWyVh zT;_6HiFwqzF;w8cqxOAJ;T9vCWLuFV}X%@l?T#PN4!CusXBe(*`k;|TOTY!~S z#eR!t7i#?u)WOGa6@HFEyzbIarngZQn81ZNg)g9QZZWVRD&k7i!Uoj*)u@fvp-SE3 z*^2@C{W$5E4Pl!8)_KgqVSF9kziF(cv6#AXruCsRJBU#nMoqkj%A|@qC-4m{M;BFr z6Bxk@UjJuQA`fsi`d=|?!#LLCQCz}uJ4a(317oNR{I$i>SEDj(#Vr{3{2G(=AE5$h zuPat2h5sjjde#TA1;0QAcmoyCFUV#8aBJawtLA|!@+7{7N07+uB5L6+)Pg@z^Jeg% zb?|cJb+I_Aq#2CiIrQTnsCf@jkM1cd!C=UYT&))CTpF!3l<5{+i+!j^a28eaaZ~`0 zF^56YAQn50I_Nwq;}O*SA5bO!3wdf5TvSY`33YJVa}T=O;1h4)E7S%f*o{A-o^>6A zG2H2S9#_$yL{+MW)AWpE$dDaERqhPV!tYU)7)8w+LnZWIJ@pUKsAU&|wJ2(XK2&Kx z_Qp?nUO|13CU7ZEqBbhymNhya}68uHZI3$T!!JL)PD_)UUuui6R7@O zY{meqw6K-i`aNYHo9ETOz(Ol1fK9;-R Date: Sun, 27 Sep 2026 14:54:04 +0200 Subject: [PATCH 8/8] Give calendar modal links with events, instead of building them from page text --- js/calendar.js | 7 ++++--- .../Controllers/Crud/EventsController.php | 16 +++++++++++++++- templates/default/calendar.html.twig | 2 -- .../Crud/tests/units/EventsController.php | 14 ++++++++++++++ 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/js/calendar.js b/js/calendar.js index ddc521fe..93781f6c 100644 --- a/js/calendar.js +++ b/js/calendar.js @@ -41,10 +41,11 @@ $(function() { //description is built and escaped server side, other values must be displayed as text $modal.find('.header').text(infos.name + ' (' + infos.begin_date_fmt + ' - ' + infos.end_date_fmt + ')'); $modal.find('.content').html(infos.description); + //links are given with the event, edit one only when current user can edit it $edit - .attr('href', options.event_url.replace('PLACEBO', infos.id_event)) - .toggleClass('displaynone', !infos.can_edit); - $booking.attr('href', options.booking_url.replace('PLACEBO', infos.id_event)); + .attr('href', infos.edit_url || '#') + .toggleClass('displaynone', !infos.edit_url); + $booking.attr('href', infos.booking_url); $modal.modal('show'); }, eventMouseEnter: function(info) { diff --git a/lib/GaletteEvents/Controllers/Crud/EventsController.php b/lib/GaletteEvents/Controllers/Crud/EventsController.php index 884d355f..a0a7046b 100644 --- a/lib/GaletteEvents/Controllers/Crud/EventsController.php +++ b/lib/GaletteEvents/Controllers/Crud/EventsController.php @@ -10,6 +10,7 @@ namespace GaletteEvents\Controllers\Crud; +use ArrayObject; use Galette\Repository\Groups; use Galette\Core\Pagination; use GaletteEvents\Filters\EventsList; @@ -168,8 +169,21 @@ public function ajaxCalendar(Request $request, Response $response): Response $filters->end_date_filter = date(__("Y-m-d"), $end); $events = new Events($this->zdb, $this->login, $this->history, $this->preferences, $filters); + $list = $events->getList(false, true); - return $this->withJson($response, $events->getList(false, true)); + //links of the event modal + foreach ($list as $row) { + if (!$row instanceof ArrayObject) { + continue; + } + $id = (string)$row[Event::PK]; + if ($row['can_edit']) { + $row['edit_url'] = $this->routeparser->urlFor('events_event_edit', ['id' => $id]); + } + $row['booking_url'] = $this->routeparser->urlFor('events_booking_add') . '?event=' . $id; + } + + return $this->withJson($response, $list); } // /CRUD - Read diff --git a/templates/default/calendar.html.twig b/templates/default/calendar.html.twig index 9af48bba..2ea410b2 100644 --- a/templates/default/calendar.html.twig +++ b/templates/default/calendar.html.twig @@ -32,8 +32,6 @@ {% block javascripts %} {% set calendar_options = { 'dataurl': url_for("ajax-events_calendar"), - 'event_url': url_for("events_event_edit", {"id": "PLACEBO"}), - 'booking_url': url_for("events_booking_add") ~ '?event=PLACEBO', 'locale': i18n.getWebID(), 'buttons': { 'listDay': {'text': _T("Daily list", "events")}, diff --git a/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php b/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php index 59a7b092..c8c370c2 100644 --- a/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php +++ b/tests/GaletteEvents/Controllers/Crud/tests/units/EventsController.php @@ -318,6 +318,20 @@ public function testCalendarCanEdit(): void $can_edit = array_column($events, 'can_edit', 'name'); ksort($can_edit); $this->assertSame(['Managed event' => true, 'Public event' => false], $can_edit); + + //links of the event modal come with the event + $by_name = array_column($events, null, 'name'); + $managed_id = (string)$by_name['Managed event']['id_event']; + $public_id = (string)$by_name['Public event']['id_event']; + $this->assertSame( + $this->routeparser->urlFor('events_event_edit', ['id' => $managed_id]), + $by_name['Managed event']['edit_url'] + ); + $this->assertArrayNotHasKey('edit_url', $by_name['Public event']); + $this->assertSame( + $this->routeparser->urlFor('events_booking_add') . '?event=' . $public_id, + $by_name['Public event']['booking_url'] + ); } /**