commit a530258ff6af7bbff9a5b9fe663d1bcc8dab8db7 Author: Olivia Reynolds Date: Wed Jul 15 10:40:09 2026 +0000 Bug 43089: Allow filtering ILL requests by ILL group This patch integrates the new ILL groups into the ILL requests index page. The branchcodes for each group are included in the template, which are then used in the API request to filter to libraries included in the selected group. Test plan: 1. Enable the system preference "ILLModule". 2. Create the following library group structure (using KTD sample libraries or otherwise): - Group A (ILL Group) - Centerville Library - Group B - Springfield Library - Group C (_not_ ILL group) - Pleasant Valley Library 3. Ensure your user is in the Centerville library. 4. Create three ILL requests from the OPAC, one for each library included in the group structure. - Navigate on the OPAC to /cgi-bin/koha/opac-illrequests.pl?op=add_form&backend=Standard - Choose the relevant destination library, and fill in the rest of the request with arbitrary data. 5. On the intranet, navigate to Interlibrary loans > Requests. 6. Verify all three ILL requests are initially displayed. 7. Verify there is a "Group" filter in the left side-panel. 8. Verify the only available group in this filter is "A". - the current user is not in group B, so it is hidden - group C is not an ILL group, so it is hidden 9. Filter to only showing group A, and verify only the requests to Centerville and Springfield are displayed. 10. Additionally filter the library to Centerville, and verify only Centerville's request is shown. 11. Filter by group A and Pleasant Valley library, and verify no requests are displayed. 12. Swap Centerville and Springfield in the library group structure, so group A now looks like: - Group A (ILL Group) - Springfield Library - Group B - Centerville Library 13. Return to the ILL requests index. 14. Verify you can now filter to either group A or B. 15. Verify filtering by group A shows Centerville and Springfield requests. 15. Verify filtering by group B shows only Centerville requests. 16. Verify clearing the filter resets the group filter to "All groups". Sponsored-by: NHS England commit 195887b1c8ce3607cee6282046f8b2b5f726635b Author: Olivia Reynolds Date: Wed Jul 15 10:39:43 2026 +0000 Bug 43089: Add ILL group feature to library groups page Test plan: 1. Navigate to Administration > Library groups. 2. Create a new group, enabling "Is ILL group". 3. Verify the ILL group feature is shown as enabled in the library groups table. 4. Edit the group, disabling the ILL group feature. 5. Verify the ILL group feature is no longer shown. 6. Edit the group, enabling the ILL group feature. 7. Verify the ILL group feature is shown again. Sponsored-by: NHS England commit 260785f9f23208b15bdbbd66c70348a14409daef Author: Olivia Reynolds Date: Wed Jul 15 10:39:00 2026 +0000 Bug 43089: Specify ft_ill_group is boolean column Sponsored-by: NHS England commit e29fb0d79821d3176ffe81ff052be3096a47db2f Author: Olivia Reynolds Date: Wed Jul 15 10:38:36 2026 +0000 Bug 43089: Regenerate DBIC (DO NOT PUSH) Sponsored-by: NHS England commit 4901cfc73e781de433186d7e39d5250a0a048010 Author: Olivia Reynolds Date: Wed Jul 15 10:38:02 2026 +0000 Bug 43089: Add ft_ill_group column to library_groups Sponsored-by: NHS England commit 13732c70f6ce1ece29301f9e160c7285f1452484 Author: Olivia Reynolds Date: Wed Jul 15 10:40:56 2026 +0000 Bug 43086: Prefill unauthenticated ILL request patron information This patch uses the browser's sessionStorage to save the unauthenticated patron information from ILL request creation. This saves users time if they wish to make multiple requests. Test plan: 1. Enable the system preferences "ILLModule" and "ILLOpacUnauthenticatedRequest". 2. In a logged-out OPAC window, navigate to /cgi-bin/koha/opac-illrequests.pl?op=create 3. Choose the "Standard" provider for the new ILL request. 4. Make any valid request, noting the name, email address, and chosen library used. 5. In the same OPAC session, navigate again to /cgi-bin/koha/opac-illrequests.pl?op=create 6. Choose the "Standard" provider for the new ILL request. 7. Verify that the name, email address, and chosen library are automatically filled with the same values used before. 8. Change the name to a different value. 9. Change the type of request, causing a page load. 10. Verify the changed name is retained, rather than prefilling an incorrect one. Sponsored-by: NHS England commit 4189d42ee63c212deff8702962154625e48a5a98 Author: Tomás Cohen Arazi Date: Tue Jul 21 11:02:29 2026 -0300 Bug 42391: (follow-up) Restore DB exception warnings in Object::store Bug 42391 removed the warn from Koha::Object::store when it moved exception translation to the exception_action hook. This lost useful debugging information from the Plack error logs. This patch restores the warning by adding a try/catch in store() that stringifies and warns the exception before rethrowing. The warning now contains the translated Koha exception message (e.g. 'Broken FK constraint') rather than the raw DBI error, since translation happens before the exception reaches store(). Note: delete() does not warn. Ideally the logging would live in the ExceptionMapper itself (via an injected logger), covering all code paths uniformly. That is a larger refactor tracked separately. Tests that assert on these warnings are updated to match the new message format. Test plan: 1. Apply patch 2. Run: $ ktd --shell k$ prove t/db_dependent/Koha/Object.t \ t/db_dependent/Koha/Objects.t \ t/db_dependent/Koha/Schema/ExceptionMapper.t \ t/db_dependent/Koha/Item.t \ t/db_dependent/Koha/Suggestions.t \ t/db_dependent/Koha/Account.t \ t/db_dependent/Koha/ApiKey.t \ t/db_dependent/Koha/Checkouts/ReturnClaim.t \ t/db_dependent/Circulation/MarkIssueReturned.t \ t/db_dependent/Suggestions.t \ t/db_dependent/Biblio.t => SUCCESS: Tests pass! 3. Sign off :-D Signed-off-by: Pedro Amorim commit 880f33a4bbfb6c05ed7f8a4314eacc01f3be3823 Author: Pedro Amorim Date: Tue Jul 21 14:40:16 2026 +0000 Bug 41604: (follow-up) Wait for the page to be ready before searching in patrons_search.t Bug 41604 made every page do a bit more work when it loads. This Selenium test didn't wait for that work to finish before typing into the search box, so sometimes it searched too early and got the wrong results. This adds a short wait after each page load so the test only searches once the page is actually ready. Introduced by: Bug 41604: Save user decision per column when visibility changes Test plan: prove t/db_dependent/selenium/patrons_search.t Co-Authored-By: Claude Sonnet 5 Signed-off-by: Pedro Amorim commit 037d38b00cd2e4485c0d1334cedd664f9870fd11 Author: Pedro Amorim Date: Mon Jul 20 12:36:17 2026 +0000 Bug 42772: Adjust yarn.lock Signed-off-by: Pedro Amorim commit f89e68c220481511f8ea7f08925e36d16258d828 Author: Jonathan Druart Date: Mon Jun 8 14:51:01 2026 +0200 Bug 42772: Cypress.env => cy.env Warning: The allowCypressEnv configuration option is enabled. This allows any browser code to read values from Cypress.env(). This is insecure and will be removed in a future major version. 1. Replace Cypress.env() calls with cy.env() (for sensitive values) or Cypress.expose() (for public configuration) 2. Set allowCypressEnv: false in your Cypress configuration to disable Cypress.env() Learn more: https://on.cypress.io/cypress-env-migration Signed-off-by: Paul Derscheid Signed-off-by: David Nind Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit 7b307694fa3836326ca8400cd2054561f94d789f Author: Jonathan Druart Date: Thu Jun 4 14:26:12 2026 +0200 Bug 42772: Remove experimentalStudio from config The experimentalStudio option was removed in Cypress version 15.4.0. Cypress Studio is now available for all users. You can safely remove this option from your config. Signed-off-by: Paul Derscheid Signed-off-by: David Nind Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit f357dd41030de4e520be6ddc2acc7e5d94a7249f Author: Jonathan Druart Date: Thu Jun 4 14:25:35 2026 +0200 Bug 42772: Upgrade Cypress to 15.16.0 Signed-off-by: Paul Derscheid Signed-off-by: David Nind Signed-off-by: Martin Renvoize Signed-off-by: Pedro Amorim commit 54fc07f4081edb94bf2d939bb57afe106ac259c9 Author: Kyle M Hall Date: Tue May 5 12:39:16 2026 +0000 Bug 42391: (QA follow-up): Fix unit tests Signed-off-by: Kyle M Hall Signed-off-by: Tomás Cohen Arazi Signed-off-by: Pedro Amorim commit 22d988e8b4102df16425b15c1811b4f8a0306f80 Author: Kyle M Hall Date: Tue May 5 12:08:56 2026 +0000 Bug 42391: (QA follow-up): Clarify exception_action ref-passthrough comment Signed-off-by: Kyle M Hall Signed-off-by: Tomás Cohen Arazi Signed-off-by: Pedro Amorim commit 9c04c7bbb48398ee8829a498701eb71728449611 Author: Kyle M Hall Date: Tue May 5 07:27:03 2026 -0400 Bug 42391: (QA follow-up): Remove unused Try::Tiny from Koha::Item Signed-off-by: Kyle M Hall Signed-off-by: Tomás Cohen Arazi Signed-off-by: Pedro Amorim commit 62e003b88f1ed4e46f6c78c7e2b81d90785bacf0 Author: Tomás Cohen Arazi Date: Thu Apr 16 12:19:01 2026 -0300 Bug 42391: (follow-up) Rename ExceptionTranslator to ExceptionMapper The Koha::Schema::Util:: namespace adds unnecessary nesting for a single-purpose class. This follow-up moves it to Koha::Schema::ExceptionMapper, which sits alongside Koha::Schema itself — a better fit given it's tightly coupled to the Schema's exception_action hook. Changes: - Koha::Schema::Util::ExceptionTranslator → Koha::Schema::ExceptionMapper - Update Koha::Schema to use the new module - Move test file accordingly - Remove now-empty Koha/Schema/Util/ directory Signed-off-by: David Nind Signed-off-by: Kyle M Hall Signed-off-by: Tomás Cohen Arazi Signed-off-by: Pedro Amorim commit 033cfd772c77e1256868d069bf57f7d69a768908 Author: Tomás Cohen Arazi Date: Wed Apr 15 16:56:05 2026 -0300 Bug 42391: (follow-up) Add NotNull, NotInStorage and UnhandledDBError translations Extend the ExceptionTranslator to handle two additional MySQL error patterns: - NOT NULL violations ('Column X cannot be null' and 'X doesn't have a default value') → Koha::Exceptions::Object::NotNull - Not in database errors → Koha::Exceptions::Object::NotInStorage Add Koha::Exceptions::Object::NotNull exception class with a property field identifying the offending column. Add Koha::Exceptions::Object::UnhandledDBError as a catch-all for DBI errors that don't match any known pattern. This closes the gap where unmatched MySQL errors could leak as DBIx::Class::Exception to callers (e.g. templates that no longer catch that type). The exception_action handler now distinguishes three cases: - Koha exception objects (from txn_do re-throws): passed through via 'die $msg' to preserve the original exception type. Without this, txn_do's rollback-and-rethrow would stringify the Koha exception and wrap it in UnhandledDBError, losing the specific type. - DBI errors (prefixed 'DBI Exception:'): translated if possible, otherwise wrapped in UnhandledDBError. - DBIC internal errors (e.g. 'Not in database'): translated if possible, otherwise thrown as DBIx::Class::Exception. Note: NotInStorage translation works for update operations but not for delete-on-detached-Row where DBIC bypasses the Schema's exception_action. Those cases remain DBIx::Class::Exception. Update tests: - OAIServers.t, Z3950Servers.t: assert NotNull with property check - Hold.t: assert NotNull, remove warn suppression hack - Objects.t: update-not-in-storage cases assert NotInStorage - Upload.t: delete-not-in-storage stays DBIx::Class::Exception Signed-off-by: David Nind Signed-off-by: Kyle M Hall Signed-off-by: Tomás Cohen Arazi Signed-off-by: Pedro Amorim commit face3c96d03c950ad9806636fb263b4077668e50 Author: Tomás Cohen Arazi Date: Wed Apr 15 16:46:58 2026 -0300 Bug 42391: (follow-up) Fix Objects.t case 3 to test FK deletion properly The 'Delete a patron that cannot be deleted' test (case 3) was using a stale $r_us object from case 2 (not in storage), so it was not actually testing FK constraint deletion. The assertion on DBIx::Class::Exception passed by accident. This follow-up: - Fetches a fresh Koha::Patron object for case 3 - Clears $e_us/$e_them before the new test - Asserts Koha::Exceptions::Object::FKConstraintDeletion, which is what exception_action now produces for FK deletion errors Signed-off-by: David Nind Signed-off-by: Kyle M Hall Signed-off-by: Tomás Cohen Arazi Signed-off-by: Pedro Amorim commit 66b738f1ebab9a57a0b45ff7b1d8aca6ad617ddb Author: Tomás Cohen Arazi Date: Wed Apr 15 16:43:06 2026 -0300 Bug 42391: Use exception_action to translate DBIC exceptions at the source DBIx::Class provides an exception_action hook that intercepts every throw_exception call before it becomes a DBIx::Class::Exception. By installing this hook on Koha::Schema via a connection() override, all database exceptions are automatically translated into Koha exceptions at the source. This eliminates the need for translate_exception catch blocks in every caller: - Remove try/catch from Koha::Object::store - Remove try/catch from Koha::Object::delete - Remove try/catch from Koha::Item::add_to_bundle - Remove translate_exception convenience method from Koha::Schema - Remove safe_do (already removed in previous follow-up) ExceptionTranslator is refactored to work on plain error message strings instead of DBIx::Class::Exception objects, since exception_action receives the message before wrapping. Unmatched errors fall through to DBIx::Class::Exception->throw() as the default, preserving backward compatibility. The warn $_->{msg} that was in Object::store is no longer needed since exceptions are translated before they propagate. Tests that asserted on that warning (via warning_like) are updated to use throws_ok directly. Test plan: 1. Apply patch 2. Run: $ ktd --shell k$ prove t/db_dependent/Koha/Schema/Util/ExceptionTranslator.t => SUCCESS: Tests pass! k$ prove t/db_dependent/Koha/Object.t => SUCCESS: Tests pass! k$ prove t/db_dependent/Koha/Item.t => SUCCESS: Tests pass! k$ prove t/db_dependent/Koha/Patron/Modifications.t => SUCCESS: Tests pass! 3. Sign off :-D Signed-off-by: David Nind Signed-off-by: Kyle M Hall Signed-off-by: Tomás Cohen Arazi Signed-off-by: Pedro Amorim commit 8bc90cbb5e3c3c89fe1c3600e2a810c48b8098af Author: Owen Leonard Date: Wed Apr 22 09:32:41 2026 -0400 Bug 42440: Remove event attributes from labeled MARC detail template This patch removes a redundant "onchange" event attribute from the framework selection dropdown. This event is already registered in the JS block. The patch also does a little bit of cleanup to the JS: Combining two