From 3576f7a9c0c54e2c3a7a2c352e0c64af82dedb3b Mon Sep 17 00:00:00 2001 From: Johan Cwiklinski Date: Sun, 27 Sep 2026 18:35:54 +0200 Subject: [PATCH 1/7] Restore removal modal of subscriptions, show free activities price, format amounts, drop invalid autocomplete attributes, reload subscription form from plugin script --- .../Controllers/Crud/ActivitiesController.php | 1 - .../Controllers/Crud/SubscriptionsController.php | 2 -- templates/default/activities.html.twig | 2 +- templates/default/scripts.html.twig | 10 ++++++++++ templates/default/subscription.html.twig | 5 +---- templates/default/subscriptions.html.twig | 5 +++-- .../Crud/tests/units/ActivitiesController.php | 6 +++++- .../Crud/tests/units/SubscriptionsController.php | 10 +++++++++- webroot/activities.js | 16 ++++++++++++++++ 9 files changed, 45 insertions(+), 12 deletions(-) create mode 100644 templates/default/scripts.html.twig create mode 100644 webroot/activities.js diff --git a/lib/GaletteActivities/Controllers/Crud/ActivitiesController.php b/lib/GaletteActivities/Controllers/Crud/ActivitiesController.php index 2806285..c861125 100644 --- a/lib/GaletteActivities/Controllers/Crud/ActivitiesController.php +++ b/lib/GaletteActivities/Controllers/Crud/ActivitiesController.php @@ -155,7 +155,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/GaletteActivities/Controllers/Crud/SubscriptionsController.php b/lib/GaletteActivities/Controllers/Crud/SubscriptionsController.php index a83b0cf..7fb8234 100644 --- a/lib/GaletteActivities/Controllers/Crud/SubscriptionsController.php +++ b/lib/GaletteActivities/Controllers/Crud/SubscriptionsController.php @@ -225,7 +225,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 ( @@ -246,7 +245,6 @@ public function edit(Request $request, Response $response, ?int $id = null, stri array_merge( $route_params, [ - 'autocomplete' => true, 'page_title' => $title, 'subscription' => $subscription, 'activities' => $activities->getList(), diff --git a/templates/default/activities.html.twig b/templates/default/activities.html.twig index f51efa4..fc265d2 100644 --- a/templates/default/activities.html.twig +++ b/templates/default/activities.html.twig @@ -64,7 +64,7 @@ {{ activity.getName() }} {{ activity.getType() }} - {% if activity.getPrice() %}{{ activity.getPrice()|number_format(2) }}{% endif %} + {% if activity.getPrice() is not null %}{{ activity.getPrice()|number_format(2) }}{% endif %} {{ activity.getCreationDate()|date(_T("Y-m-d")) }} {% if activity.getGroup() %}{{ activity.getGroup().getFullName() }}{% endif %} diff --git a/templates/default/scripts.html.twig b/templates/default/scripts.html.twig new file mode 100644 index 0000000..a08eaff --- /dev/null +++ b/templates/default/scripts.html.twig @@ -0,0 +1,10 @@ +{# + # This file is part of Galette Activities plugin (https://galette.eu). + # SPDX-FileCopyrightText: Copyright © 2024-2026 The Galette Team + # SPDX-License-Identifier: GPL-3.0-or-later + #} + +{# plugin pages only #} +{% if cur_route starts with 'activities_' %} + +{% endif %} diff --git a/templates/default/subscription.html.twig b/templates/default/subscription.html.twig index 412c1b5..c2a7a65 100644 --- a/templates/default/subscription.html.twig +++ b/templates/default/subscription.html.twig @@ -103,11 +103,8 @@ {% endblock %} {% block javascripts %} + {{ parent() }} {% endblock %} diff --git a/templates/default/subscriptions.html.twig b/templates/default/subscriptions.html.twig index 4b046ac..bc61d7e 100644 --- a/templates/default/subscriptions.html.twig +++ b/templates/default/subscriptions.html.twig @@ -174,7 +174,7 @@ {% if nb > 0 %} - {{ _T("Found subscriptions total %f", "activities")|replace({'%f': subscriptions.getSum()}) }} + {{ _T("Found subscriptions total %f", "activities")|replace({'%f': subscriptions.getSum()|number_format(2)}) }} {% endif %} @@ -198,7 +198,7 @@ {{ subscription.getSubscriptionDate()|date(_T("Y-m-d")) }} {{ subscription.getEndDate()|date(_T("Y-m-d")) }} - {{ subscription.getAmount() }} + {% if subscription.getAmount() is not null %}{{ subscription.getAmount()|number_format(2) }}{% endif %} @@ -250,6 +250,7 @@ {% endblock %} {% block javascripts %} + {{ parent() }} diff --git a/tests/GaletteActivities/Controllers/Crud/tests/units/ActivitiesController.php b/tests/GaletteActivities/Controllers/Crud/tests/units/ActivitiesController.php index 6aeb19d..f811cff 100644 --- a/tests/GaletteActivities/Controllers/Crud/tests/units/ActivitiesController.php +++ b/tests/GaletteActivities/Controllers/Crud/tests/units/ActivitiesController.php @@ -170,15 +170,18 @@ public function testList(): void $group = $this->createGroup('Climbers'); $this->insertActivity('Climbing', $group->getId(), ['price' => 12.5]); $this->insertActivity('Hiking', null, ['price' => null]); + $this->insertActivity('Diving', null, ['price' => 0]); $test_response = $this->app->handle($this->createRequest('activities_activities')); $this->assertSame(200, $test_response->getStatusCode()); $body = (string)$test_response->getBody(); - $this->assertStringContainsString('2 activities', $body); + $this->assertStringContainsString('3 activities', $body); $this->assertStringContainsString('Climbing', $body); $this->assertStringContainsString('12.50', $body); $this->assertStringContainsString('Climbers', $body); $this->assertStringContainsString('Hiking', $body); + //free activities have a price + $this->assertStringContainsString('0.00', $body); $this->expectNoLogEntry(); } @@ -196,6 +199,7 @@ public function testForms(): void $body = (string)$test_response->getBody(); $this->assertStringContainsString('action="' . $this->routeparser->urlFor('activities_storeactivity_add') . '"', $body); $this->assertStringContainsString('Climbers', $body); + $this->assertStringNotContainsString('autocomplete="1"', $body); $this->expectNoLogEntry(); $test_response = $this->app->handle($this->createRequest('activities_activity_edit', ['id' => (string)$id])); diff --git a/tests/GaletteActivities/Controllers/Crud/tests/units/SubscriptionsController.php b/tests/GaletteActivities/Controllers/Crud/tests/units/SubscriptionsController.php index cf8227f..ee3f90d 100644 --- a/tests/GaletteActivities/Controllers/Crud/tests/units/SubscriptionsController.php +++ b/tests/GaletteActivities/Controllers/Crud/tests/units/SubscriptionsController.php @@ -245,7 +245,10 @@ public function testList(): void $this->assertStringContainsString('Climbing', $body); $this->assertStringContainsString('Hiking', $body); $this->assertStringContainsString($member_one->sfullname, $body); - $this->assertStringContainsString('Found subscriptions total 17.5', $body); + $this->assertStringContainsString('12.50', $body); + $this->assertStringContainsString('Found subscriptions total 17.50', $body); + //removal modal + $this->assertStringContainsString('_removeItems', $body); $this->expectNoLogEntry(); } @@ -306,6 +309,10 @@ public function testReloadForm(): void $test_response = $this->app->handle($this->createRequest('activities_subscription_add', ['id_adh' => (string)$member_one->id])); $this->assertSame(200, $test_response->getStatusCode()); + //form is reloaded by the plugin script, not by inline code + $body = (string)$test_response->getBody(); + $this->assertStringContainsString('activities.js"', $body); + $this->assertStringNotContainsString("$('#activity').on('change'", $body); $this->expectNoLogEntry(); //activity change posts the form without save @@ -344,6 +351,7 @@ public function testEdit(): void $test_response = $this->app->handle($this->createRequest('activities_subscription_edit', ['id' => (string)$id])); $this->assertSame(200, $test_response->getStatusCode()); $this->assertStringContainsString('First comment', (string)$test_response->getBody()); + $this->assertStringNotContainsString('autocomplete="1"', (string)$test_response->getBody()); $this->expectNoLogEntry(); $request = $this->createRequest('activities_storesubscription_edit', [], 'POST') diff --git a/webroot/activities.js b/webroot/activities.js new file mode 100644 index 0000000..b1e4579 --- /dev/null +++ b/webroot/activities.js @@ -0,0 +1,16 @@ +/** + * This file is part of Galette Activities plugin (https://galette.eu). + * SPDX-FileCopyrightText: Copyright © 2024-2026 The Galette Team + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/* Subscription form: choosing another activity reloads the form with its values, without storing */ +var _activitiesSubscriptionActivity = function() { + $('#modifform #activity').on('change', function() { + $(this).closest('form').trigger('submit'); + }); +}; + +$(function() { + _activitiesSubscriptionActivity(); +}); From 9f78648212713987d4aa978efbf3d31f9d9eeb6b Mon Sep 17 00:00:00 2001 From: Johan Cwiklinski Date: Sun, 27 Sep 2026 18:36:43 +0200 Subject: [PATCH 2/7] Type price and amount in numeric fields, with cents --- templates/default/activity.html.twig | 7 ++++++- templates/default/subscription.html.twig | 7 ++++++- .../Controllers/Crud/tests/units/ActivitiesController.php | 1 + .../Crud/tests/units/SubscriptionsController.php | 2 +- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/templates/default/activity.html.twig b/templates/default/activity.html.twig index 10d9b8f..25794e1 100644 --- a/templates/default/activity.html.twig +++ b/templates/default/activity.html.twig @@ -26,11 +26,16 @@ label: activity.getFieldLabel('type') } %} - {% include "components/forms/text.html.twig" with { + {% embed "components/forms/number.html.twig" with { id: 'price', value: activity.getPrice(), label: activity.getFieldLabel('price') } %} + {# cents are allowed #} + {% block element %} + + {% endblock %} + {% endembed %} {% set group_list_values = {(0): _T("Select a group")} %} {% for group in groups %} diff --git a/templates/default/subscription.html.twig b/templates/default/subscription.html.twig index c2a7a65..b6dd706 100644 --- a/templates/default/subscription.html.twig +++ b/templates/default/subscription.html.twig @@ -70,12 +70,17 @@ {{ _T("Financial information", "activities") }}
- {% include "components/forms/text.html.twig" with { + {% embed "components/forms/number.html.twig" with { id: 'payment_amount', value: subscription.getAmount(), label: _T("Amount", "activities"), placeholder: subscription.getAmountFromActivity() } %} + {# cents are allowed #} + {% block element %} + + {% endblock %} + {% endembed %}
{% include "components/forms/payment_types.html.twig" with { diff --git a/tests/GaletteActivities/Controllers/Crud/tests/units/ActivitiesController.php b/tests/GaletteActivities/Controllers/Crud/tests/units/ActivitiesController.php index f811cff..43178df 100644 --- a/tests/GaletteActivities/Controllers/Crud/tests/units/ActivitiesController.php +++ b/tests/GaletteActivities/Controllers/Crud/tests/units/ActivitiesController.php @@ -211,6 +211,7 @@ public function testForms(): void ); $this->assertStringContainsString('value="Climbing"', $body); $this->assertStringContainsString('value="ESC"', $body); + $this->assertStringContainsString('', $body); $this->assertStringContainsString('Indoor', $body); $this->assertMatchesRegularExpression('/getId() . '"\s+selected="selected"/', $body); $this->expectNoLogEntry(); diff --git a/tests/GaletteActivities/Controllers/Crud/tests/units/SubscriptionsController.php b/tests/GaletteActivities/Controllers/Crud/tests/units/SubscriptionsController.php index ee3f90d..4a10a33 100644 --- a/tests/GaletteActivities/Controllers/Crud/tests/units/SubscriptionsController.php +++ b/tests/GaletteActivities/Controllers/Crud/tests/units/SubscriptionsController.php @@ -331,7 +331,7 @@ public function testReloadForm(): void $this->assertSame(200, $test_response->getStatusCode()); $body = (string)$test_response->getBody(); $this->assertMatchesRegularExpression('/assertStringContainsString('placeholder="12.5"', $body); + $this->assertStringContainsString('', $body); $this->assertFalse(isset($this->session->plugin_activities_subscription)); //reloaded form is checked, not stored $this->expectLogEntry(\Analog\Analog::ERROR, 'Subscription date is mandatory'); From 5324d8ed0c5c8d0292c58da79ec481b30d37f4a7 Mon Sep 17 00:00:00 2001 From: Johan Cwiklinski Date: Sun, 27 Sep 2026 18:36:58 +0200 Subject: [PATCH 3/7] Hide icons from assistive technologies --- templates/default/activity.html.twig | 4 ++-- templates/default/subscription.html.twig | 6 +++--- templates/default/subscriptions.html.twig | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/templates/default/activity.html.twig b/templates/default/activity.html.twig index 25794e1..dc95733 100644 --- a/templates/default/activity.html.twig +++ b/templates/default/activity.html.twig @@ -10,7 +10,7 @@
- + {{ _T("General information", "activities") }}
@@ -62,7 +62,7 @@
diff --git a/templates/default/subscription.html.twig b/templates/default/subscription.html.twig index b6dd706..1388930 100644 --- a/templates/default/subscription.html.twig +++ b/templates/default/subscription.html.twig @@ -10,7 +10,7 @@
- + {{ _T("Subscription information", "activities") }}
@@ -66,7 +66,7 @@
- + {{ _T("Financial information", "activities") }}
@@ -100,7 +100,7 @@
diff --git a/templates/default/subscriptions.html.twig b/templates/default/subscriptions.html.twig index bc61d7e..8c8b5dd 100644 --- a/templates/default/subscriptions.html.twig +++ b/templates/default/subscriptions.html.twig @@ -157,7 +157,7 @@