Compare commits

...

95 Commits

Author SHA1 Message Date
Lucas Gass dacce7d3fc
Update release notes for 26.05.01 release
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-07-07 07:47:54 -06:00
Lucas Gass 8f5136e243
Increment version for the 26.05.01 release
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-07-07 07:47:54 -06:00
Lucas Gass bacea9025b
Bug 42795: Do not try to update ES mappings if not using ES patch for main
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-07-07 07:47:53 -06:00
Kyle M Hall 753bc3c0da
Bug 42862: Use current-relative dates in bookingsModalDatePicker_spec.ts
The booking date picker tests fake "today" with cy.clock and create bookings on
hardcoded June 2026 dates. The modal fetches existing bookings from from
the api and that query uses the real current time, not the fake one in the browser.
Once the real date passes the hardcoded dates, the server stops returning those bookings (
they are now in the past ), so the modal sees no conflicts and assertions such as "the date
should have the leadDisable class" fail.

This patch anchors each test's "today" to the start of next month based on the current
date so the bookings always stay in the future and are returned no
matter when the test runs.

The 'any item' test also sets cy.clock before its second page reload
because the freeze does not survive the reload.

Test Plan:
1) On main run:
   yarn cypress run --spec t/cypress/integration/Circulation/bookingsModalDatePicker_spec.ts
2) Note the test fails
3) Apply this patch
4) Run the command again
5) Note all tests pass!

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-07-07 07:47:52 -06:00
Jonathan Druart e00ba8d1aa
Bug 42735: Fix SQL injection
This change fixes an SQL injection in the circulation stats.

Test plan:
0. Apply the patch
1. sudo koha-plack --restart kohadev
2. Go to /cgi-bin/koha/reports/issues_stats.pl
3. Try out a bunch of options
4. Try to break it
5. Note that you just get output and no errors

Signed-off-by: Sanjar Tulkinov Anvar o'g'li <sanjarbiy11@gmail.com>
Signed-off-by: Martin Renvoize <martin.renvoize@openfifth.co.uk>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-07-07 07:47:51 -06:00
Jonathan Druart e54a0d3d41
Bug 42369: Use C4::Context::csv_delimiter for delimiter validation
Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-07-07 07:47:51 -06:00
David Cook b2f42dda9e
Bug 42369: Fix SQL injection
This change fixes SQL injection in bor issues top

Test plan:
0. Apply patch
1. sudo koha-plack --restart kohadev
2. Go to /cgi-bin/koha/reports/bor_issues_top.pl
3. Try out all the different options
4. Try to break it
5. Note that you get output and no errors

Signed-off-by: Sanjar Tulkinov Anvar o'g'li <sanjarbiy11@gmail.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-07-07 07:47:50 -06:00
Jonathan Druart 76a32366c5
Bug 42368: Use C4::Context::csv_delimiter for delimiter validation
Signed-off-by: Martin Renvoize <martin.renvoize@openfifth.co.uk>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-07-07 07:47:49 -06:00
David Cook 4b9ea0c3a9
Bug 42368: Fix SQL injection in issue avg stats
This change fixes SQL injection in issues avg stats

Test plan:
0. Apply the patch
1. sudo koha-plack --restart kohadev
2. Go to /cgi-bin/koha/reports/issues_avg_stats.pl
3. Try out all the different options
4. Try to break the report
5. Note that you always get output instead of errors

Signed-off-by: Sanjar Tulkinov Anvar o'g'li <sanjarbiy11@gmail.com>
Signed-off-by: Martin Renvoize <martin.renvoize@openfifth.co.uk>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-07-07 07:47:49 -06:00
Jonathan Druart ddfb6349d7
Bug 42363: Use C4::Context::csv_delimiter for delimiter validation
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-07-07 07:47:48 -06:00
David Cook 4df08e5129
Bug 42363: Fix SQL injection
This change cixes an SQL injection in cat stats

Test plan:
0. Apply patch
1. sudo koha-plack --restart kohadev
2. Go to /cgi-bin/koha/reports/catalogue_stats.pl
3. Try out different values
4. Try to break the report
5. Note that you just get output and not errors

Signed-off-by: Sanjar Tulkinov Anvar o'g'li <sanjarbiy11@gmail.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-07-07 07:47:47 -06:00
Jonathan Druart a9f2bec7a4
Bug 42360: Move separator validation to C4::Context::csv_delimiter
So we protect other calls

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-07-07 07:47:46 -06:00
David Cook cd8608ab4e
Bug 42360: Also validate sep param
Signed-off-by: Sanjar Tulkinov Anvar o'g'li <sanjarbiy11@gmail.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-07-07 07:47:46 -06:00
David Cook d2e7b1e8e7
Bug 42360: Fix SQL injection
This change fixes an SQL injection in the acq stats.

Test plan:
0. Apply the patch
1. sudo koha-plack --restart kohadev
2. Go to /cgi-bin/koha/reports/acquisitions_stats.pl
3. Try out a bunch of options
4. Try to break it
5. Note that you just get output and no errors
NOTE: In a fresh KTD you likely don't have any actual statistics

Signed-off-by: Sanjar Tulkinov Anvar o'g'li <sanjarbiy11@gmail.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-07-07 07:47:39 -06:00
Jonathan Druart 67ff112866
Bug 42708: (bug 41566 follow-up) Restore display of itemtype images
> - [% UNLESS noItemTypeImages %]
> + if (prefs.noItemTypeImages){

This is wrong!

Test plan:
Go to /cgi-bin/koha/catalogue/detail.pl?biblionumber=4
Notice that with this patch the "Book" icon is displayed
Turn off noItemTypeImages and reload
=> It's now hidden!

Without this patch the behavior is reversed

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Laura_Escamilla <laura.escamilla@bywatersolutions.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:25 -06:00
Julian Maurice 10a3768991
Bug 42741: Fix plural form in lists
Test plan:
1. Go to Lists
2. Create three lists called:
   - Test 0 items
   - Test 1 item
   - Test 2 items
3. Add one item in the "Test 1 item" list and add two items in the "Test
   2 items" list
4. Go to lists and view the list of lists
   --> In the Contents column, "Test 0 items" should be "0 items"
   --> "Test 1 item" should be "1 item"
   --> "Test 2 items" should be "2 items"

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:24 -06:00
Artur Mickiewicz a202ff3d33
Bug 41987: Remove duplicate searchresult-breeding id
The searchresult-breeding id was present on both the wrapper div and
the "no results" alert element, causing duplicate id usage in the DOM.

This patch ensures the id is only used once on the parent container
and keeps the anchor link functional.

Signed-off-by: Artur Mickiewicz <davno_pora@mail.com>
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Brendan Lawlor <blawlor@clamsnet.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:24 -06:00
Laura_Escamilla 946ce25c52
Bug 42234: Add text to checkout history cover image table header
1. Enable at least one cover image service, such as GoogleJackets or
   OPACAmazonCoverImages.
2. Log in to the OPAC as a patron with checkout history.
3. Go to your account > Checkout history.
4. Inspect the checkout history table header.
5. Confirm the cover image column header contains "Cover image".
6. Confirm the table still displays correctly.
7. Confirm sorting/export behavior is unchanged for that column.
8. Sign off and have a wonderful day! :D

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Brendan Lawlor <blawlor@clamsnet.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:23 -06:00
Pedro Amorim 21dd3412f6
Bug 42485: (RM follow-up): Tidy
prove xt/perltidy.t

Signed-off-by: Pedro Amorim <pedro.amorim@openfifth.co.uk>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:23 -06:00
Martin Renvoize 40b9e8abd5
Bug 42485: (QA follow-up) Add explicit JSON::PP import and test coverage
Add explicit `use JSON::PP ()` to Elasticsearch.pm and the test file
to make the dependency on JSON::PP::false visible rather than relying
on YAML::XS loading it as a side effect.

Extend the get_elasticsearch_mappings() test subtest to assert that
date_detection and numeric_detection are disabled at the mapping root.

Signed-off-by: Martin Renvoize <martin.renvoize@openfifth.co.uk>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:22 -06:00
Tomás Cohen Arazi 78850b4a15
Bug 42485: Disable date and numeric detection on ES mappings
When ElasticsearchMARCFormat is set to ARRAY, the marc_data_array
field uses dynamic:true mapping. Elasticsearch auto-detects field
types based on the first document indexed. If a MARC subfield value
looks like a date (e.g. 2024-01-15 in 952$e), ES locks that
subfield to type date. Subsequent records with non-date values in
the same subfield fail to index with a document_parsing_exception.

This patch sets date_detection and numeric_detection to false at
the mapping root level, so ES treats all dynamically mapped fields
as text instead of guessing types.

Test plan:
1. $ ktd --search-engine es8 --name test-es --proxy up -d
   $ ktd --name test-es --wait-ready 180
   $ ktd --name test-es --shell
2. k$ koha-mysql kohadev -e "UPDATE systempreferences
     SET value='ARRAY'
     WHERE variable='ElasticsearchMARCFormat';"
   k$ echo 'flush_all' | nc -q1 memcached 11211
   k$ koha-mysql kohadev -e "DELETE FROM biblio_metadata;
     DELETE FROM items; DELETE FROM biblioitems;
     DELETE FROM biblio;"
   k$ rebuild_elasticsearch.pl -d -r --biblios
3. Add a record with date-like 952$e and index it:
   k$ koha-shell kohadev -p -c 'perl -MC4::Biblio
     -MMARC::Record -MMARC::Field -MKoha::Item -e "
     my \$r = MARC::Record->new();
     \$r->append_fields(
       MARC::Field->new(q{245},q{1},q{0},a=>q{Record one}),
       MARC::Field->new(q{942},q{ },q{ },c=>q{BK}));
     my (\$bn) = C4::Biblio::AddBiblio(\$r, q{});
     Koha::Item->new({biblionumber=>\$bn,
       biblioitemnumber=>\$bn, homebranch=>q{CPL},
       holdingbranch=>q{CPL}, itype=>q{BK},
       booksellerid=>q{2024-01-15}})->store;
     print qq{Added biblio \$bn\n};"'
   k$ rebuild_elasticsearch.pl --biblios -bn <biblionumber>
4. Check the mapping for 952$e:
   k$ curl -s es:9200/koha_kohadev_biblios/_mapping/field/\
     marc_data_array.fields.952.subfields.e
=> FAIL: type is "date" (should be "text")
5. Add a record with non-date 952$e and index it:
   k$ koha-shell kohadev -p -c 'perl -MC4::Biblio
     -MMARC::Record -MMARC::Field -MKoha::Item -e "
     my \$r = MARC::Record->new();
     \$r->append_fields(
       MARC::Field->new(q{245},q{1},q{0},a=>q{Record two}),
       MARC::Field->new(q{942},q{ },q{ },c=>q{BK}));
     my (\$bn) = C4::Biblio::AddBiblio(\$r, q{});
     Koha::Item->new({biblionumber=>\$bn,
       biblioitemnumber=>\$bn, homebranch=>q{CPL},
       holdingbranch=>q{CPL}, itype=>q{BK},
       booksellerid=>q{My Vendor Name}})->store;
     print qq{Added biblio \$bn\n};"'
   k$ rebuild_elasticsearch.pl --biblios -bn <biblionumber> -v -v -v
=> FAIL: document_parsing_exception - failed to parse date field
   [My Vendor Name]
6. Apply this patch, repeat from step 2
7. Repeat step 4:
=> SUCCESS: type is "text"
8. Repeat step 5:
=> SUCCESS: No indexing errors
9. Sign off :-D

Signed-off-by: Andrew Fuerste Henry <andrew@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@openfifth.co.uk>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:22 -06:00
David Cook 0a44bf4e8e
Bug 42612: Change button colours in manage-marc-import.pl
This patches changes the button colours in manage-marc-import.pl
so that "Import this batch into the catalog" is more prominent,
and "Apply different matching rules" is less prominent.

Test plan:
0. Apply the patch
1. Go to a bib record like
http://localhost:8081/cgi-bin/koha/catalogue/detail.pl?biblionumber=29
2. Click "Save" and choose "MARCXML"
3. Go to http://localhost:8081/cgi-bin/koha/tools/stage-marc-import.pl
4. Click "Upload file"
5. Choose "MARCXML" for the "Format:"
6. Change "Check for embedded item record data" to "No"
7. Click "Stage for import"
8. Wait for the staging to complete. This will be show when the status
bar hits "100% Finished" and a "View batch" link appears.
9. Click "View batch"
10. Note that "Import this batch into the catalog" is a prominent yellow
button with black text
11. Note that "Apply different matching rules" is a less prominent dark grey
button with white text

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Brendan Lawlor <blawlor@clamsnet.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:21 -06:00
Owen Leonard ea10c84e80
Bug 42684: Capitalization: No Barcode
This patch corrects the capitalization of the phrase "No Barcode" and
several other instances of incorrect capitalization.

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Laura_Escamilla <laura.escamilla@bywatersolutions.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:21 -06:00
Jonathan Druart 91f2e47f49
Bug 41992: Do not restore pagination offset
When "Save configuration state on page change" is enabled, the page
number is kept in localStorage and restored.

To prevent that we can set the attribute "start" of the state to 0.

Test plan:
Go on a page with several pages, go to another page than the first one
Go the another view and get back
Without this patch the last visited page was preserved when returning to the previous view
With this patch applied the view now defaults to the first page

Note that this does not affect shareable links.

Signed-off-by: Laura_Escamilla <laura.escamilla@bywatersolutions.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:20 -06:00
Owen Leonard efff7c7046
Bug 42229: (follow-up) Restore card number <label> when necessary
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:20 -06:00
Owen Leonard b9bff3256a
Bug 42229: (follow-up) Markup correction
The "Street type" fields had double "name" attributes.

Signed-off-by: Owen Leonard <oleonard@myacpl.org>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:19 -06:00
Laura_Escamilla c416062ef0
Bug 42229: Avoid using form labels for static values in opac-memberentry.tt
The OPAC personal details page uses <label> elements in some places
where no visible form control is present. In these cases, the content
is display-only and the label is not associated with an interactive
field.

Replace those labels with non-form markup for static values while
preserving existing labels for actual form controls.

Test plan:
1. Log in to the OPAC and go to the "Personal details" page
2. Inspect display-only values such as Username and Expiration date
3. Confirm <label> elements are used for content that is not part of a
   form control
4. Apply the patch
5. Log in to the OPAC and go to the "Personal details" page
6. Confirm display-only values such as Username and Expiration date no
   longer use <label> elements
7. Confirm other static display-only values updated by the patch also no
   longer use <label> elements
8. Confirm actual form controls, such as text inputs and selects, still
   have proper associated labels
9. Run an accessibility checker and confirm the related label misuse
   issues are resolved
10. Sign off and have a great day!

Signed-off-by: Owen Leonard <oleonard@myacpl.org>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:19 -06:00
Laura_Escamilla a8e7087ce8
Bug 42232: Add missing legend to action fieldset in OPAC
To test:
1. Log on to the OPAC and go to "Messaging" page.
2. The fieldset that contains the Save/Cancel button is missing a legend.
3. Apply the patch and refresh the "Messaging" page.
4. Notice that the fieldset now contains an accessible legend.
5. Sign off and have a great day!

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:18 -06:00
Laura_Escamilla e07b92e48a
Bug 42233: Add accessible text to empty purchase suggestions table header
The first header cell in the OPAC purchase suggestions table contains
only an icon, leaving the <th> without accessible text. This causes
the column header to be announced unclearly by assistive technology
and can be flagged by accessibility testing as an empty table header.

Add visually hidden text to the header so the column has a meaningful
accessible name while preserving the current visual display.

Test plan:
1. Log in to the OPAC
2. Make a purchase suggestion
3. In the suggestions table, the first <th> contains no text
4. Apply the patch
5. Repeat steps 1-2
6. Inspect the suggestions table header
7. Confirm the first <th> now contains visually hidden text describing
   the checkbox selection column
8. Confirm the info icon still appears and its tooltip still works
9. Run an accessibility checker or inspect the DOM and confirm the
   empty table header issue is resolved

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:18 -06:00
Nick Clemens 183d1cf211
Bug 42245: Prevent preselecting sort values for guarantor search
av-build-dropbox.inc takes a 'default' param

When building the patron we are setting this to the value of sort1, then sort2
This seems to remain cached, and when we build the guarantor search the sort2 value is used as the default
This patch ensures we pass a blank default to the modal

To recreate:
1 - Define 2 values for 'BSort1' in Administration -> Authorised values
2 - Define 2 values for 'BSort2' in Administration -> Authorised values
3 - Find a borrower who is eligible to have a guarantor
4 - Edit patron and assign values to sort 1 and 2 for this borrower and save
5 - Edit patron again and click 'Add guarantor'
6 - Note that sort 2 is populated
7 - Apply patch
8 - Reload borrower
9 - Confirm sort1 and 2 are empty

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:17 -06:00
Laura_Escamilla fda196565d
Bug 42299: Add accessible label to star rating select in OPAC
To test:
1. Set  OpacStarRatings so it shows on the OPAC detail page
2. Notice star ratings has no associated label element
3. Apply the patch and refresh the OPAC detail page you were viewing.
4. Notice that the star ratings now have an accessible label.
5. Sign off and have a great day. :D

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:17 -06:00
Johanna Räisä 07325de908
Bug 42395: Fix missing translations on load_patron_holds_table
This patch adds missing translations for the load_patron_holds_table function.

Sponsored-by: Koha-Suomi Oy
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Brendan Lawlor <blawlor@clamsnet.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:16 -06:00
Saiful Amin 10fc3f3c64
Bug 29587: Test mail option in SMTP servers
Edit: Added CSRF protection.

This patch adds a "Send test email" action to the SMTP servers
administration page. It sends a test message to the address in
the KohaAdminEmailAddress system preference and reports success
or failure to the user.

Test plan:
1. Add a valid SMTP server in Administration → SMTP servers.
2. Set KohaAdminEmailAddress to a valid email address.
3. Apply the patch.
4. Click "Send test email" in the Actions column.
5. Confirm that Koha reports "Test email sent successfully".
6. Edit the SMTP server and change the domain to an invalid one.
7. Click "Send test email" again.
8. Confirm that Koha reports failure.
9. Sign off.

Signed-off-by: Baptiste Wojtkowski <baptiste.wojtkowski@biblibre.com>
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:16 -06:00
Matt Blenkinsop b9d6d16f8e
Bug 41605: Fix incorrect default key
Test plan:
No behavioural change but it is an inconsistency in the code
1) Look in base-resource.js at the newResource computed method
2) Confirm that the code in the first conditional block is looking for 'hasOwnProperty("defaultValue")'
3) Check the new patch and confirm that the code has been changed from 'value: false' to 'defaultValue: false' to match this

There is no behaviour change as boolean fields default to false within the framework but we should remove this inconsistency

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Laura_Escamilla <laura.escamilla@bywatersolutions.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:15 -06:00
Emmi Takkinen c28b9b86ca
Bug 41829: Set correct id to copied Tag editor button
When one copies MARC field, Tag editor button on fields
containing value builder plugin have same id as original
MARC field. This patch sets correct id to these buttons.

To reproduce:
1. Find MARC framework which has value builder plugin
   attached to one of its fields.
2. Navigate to Cataloging -> New record.
3. Navigate to MARC field with plugin attached to it.
4. Inspect fields Tag editor button with browsers developer
   tools.
   -> Check the id of Tag editor button.
5. Copy the field and check id of copied Tag editor button.
   -> Notice that it has the same id as in original field.
6. Apply this patch.
7. Referesh the page, navigate back to field and copy it.
8. Inspect Tag editors id.
   -> Id should now be same as in other copied fields.

Sponsored-by: Koha-Suomi Oy
Signed-off-by: Owen Leonard <oleonard@myacpl.org>
Signed-off-by: Laura_Escamilla <laura.escamilla@bywatersolutions.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:15 -06:00
Jonathan Druart bba0146b3d
Bug 42781: Do not modify window.name
https://developer.mozilla.org/en-US/docs/Web/API/Window/name

Test plan:
0. Do not apply this patch (you can apply the first one)
1. Go to /cgi-bin/koha/members/members-home.pl
2. Open the console
3. type "window.name", it's ""
4. Run a patron search, "d"
5. window.name is now "Duffy, Joann name"
6. Apply this patch, try again
7. window.name is still an empty string

Signed-off-by: Jan Kissig <bibliothek@th-wildau.de>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:14 -06:00
Magnus Enger 7b02715f4f
Bug 42781: Declare 'name' before using it in patron-format.js
The code in koha-tmpl/intranet-tmpl/prog/js/patron-format.js uses
a variable called 'name' without declaring it first. The declaration
was removed in bug 32176. No deterioration of functionality has been
discovered in connection with this, but the declaration should be
restored.

To test:
- Apply the patch.
- HidePatronName = Show
- Look at the staff detail view for a record that has at least one
  item on loan.
- Verify the name of the patron is displayed as expected.

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Jan Kissig <bibliothek@th-wildau.de>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:14 -06:00
Jan Kissig a26800691f
Bug 42844: Fix broken subscription search when using additional fields as seach criteria
This fixes an error when searching for a subscription with an additional field when no result is found by changing the call of SearchSubscriptions to expect an array instead of an hash ref.
Serials.pm, when using filter_by_additional_fields may return an empty array, but the calling function only checked for an hash ref which lead to an error when no result was found.

Testplan:
a) create an additional field for subscriptions: More -> Serials -> Manage subscription fields
   f.e. use an AV CCODE as additional field
   make sure "searchable" is checked
   No subscription should use this additional field by now.
b) go to More -> Serials
c1) if bug 40201 is pushed you can search for that additional field on serials-home
   -> An error stack trace will appear.
c2) otherwise perform an empty search on serials home to end on serials-search. In the search form on the left select that additional field as search criteria.
   -> An error stack trace will appear.
d) add a subscription using that additional field
  -> More -> Serials -> New subscription.
  On step two there is a section for Additional fields. Select f.e. CCODE Fiction
e) redo c1 or c2 using that additonal field value as search criteria.
f) Check that the search result shows your subscription.
g) apply patch and redo c1 or c2 for an additional field value that is not used (f.e. Non-fiction)
h) The search should work now, returning 0 results instead of an error
i) check that searching for a used additional field (f.e. Fiction) still works

Signed-off-by: Michaela Sieber <michaela.sieber@kit.edu>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-15 18:12:05 -06:00
Pedro Amorim 838fa2f78b
Bug 42783: Fix ManageMarcImport_spec.ts
If import_batch_profiles is slow to respond, it'll trigger select.change() in stage-marc-import.tt and change the format to ISO2709 before the form is submitted, causing the error.

cypress run --spec t/cypress/integration/Tools/ManageMarcImport_spec.ts

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-12 09:28:29 -06:00
Lucas Gass b8fab422f4
Bug 42764: (RMaint follow-up) Fix DBIC
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-11 12:56:17 -06:00
Pedro Amorim 2f03758634
Bug 42764: (QA Follow-up): Fix DB update mismatch
perl /kohadevbox/misc4dev/run_tests.pl --run-db-compare-only --compare-with v24.05.00

Signed-off-by: Pedro Amorim <pedro.amorim@openfifth.co.uk>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-11 09:53:41 -06:00
Lucas Gass 2cd11ac987
Bug 42764: DBRev 26.05.00.001
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-11 09:53:41 -06:00
Lucas Gass 606450fd56
Bug 42764: DBIC
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-11 09:53:40 -06:00
Pedro Amorim c5d078eccf
Bug 42764: (QA follow-up): Update DB schema
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-11 09:53:39 -06:00
Pedro Amorim 919b5e9e93
Bug 42764: (QA follow-up): Atomicupate: Fix typo in SQL table comment
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-11 09:53:38 -06:00
Martin Renvoize 9f3cdb665c
Bug 42764: Use inline codespell:ignore for SAN-Ouest Provence in templates
Rather than excluding the entire about.tt files from codespell scanning,
annotate only the specific lines containing the proper noun "Provence"
(SAN-Ouest Provence, a French library co-operative and Koha sponsor) with
an inline TT comment that codespell recognises as a per-line ignore.

This lets codespell continue to check the rest of each file for genuine
spelling mistakes, while still catching accidental "Provence" for
"Province" in any other template not carrying this annotation.

Replaces the file-level exceptions added to Koha::Devel::Files in
favour of the more surgical inline approach.

Test plan:
1. Apply patch
2. Verify "Provence" on the annotated lines produces no codespell output:
   codespell -d --ignore-words .codespell-ignore \
     koha-tmpl/intranet-tmpl/prog/en/modules/about.tt
   => no output
3. Verify the rest of about.tt is still checked by introducing a
   deliberate typo elsewhere in the file and confirming codespell flags it
4. prove xt/author/codespell.t
=> All tests pass

Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-11 09:53:37 -06:00
Martin Renvoize 1c0de7e971
Bug 42764: Fix false positives caused by mixed filetypes in CI failure store
The ci-results repo stores all failures from a single test run as one
flat JSON array, regardless of whether they came from the pl, tt, or js
filetype pass. On the next incremental run, get_files_to_test('pl') reads
that entire list -- including any .tt failures -- and calls
remove_exceptions with the 'pl' context. Since .tt files only appear in
the tt exception list, they survive the filter and get codespell'd in the
pl pass where nothing is configured to exclude them.

The fix filters stored failures by filetype before applying exceptions,
so each pass only re-checks failures that belong to its own type.

Test plan:
1. Apply all patches
2. Add a file to the tt codespell exceptions in Koha::Devel::Files that
   contains a word codespell would flag
3. Introduce a deliberate failure in another file so the ci-results repo
   records the excepted .tt file as a previous failure
4. On the next incremental run, confirm the excepted .tt file is not
   re-tested in the pl or js pass
5. prove xt/author/codespell.t
=> Tests pass; no false positives from cross-filetype re-checks

Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-11 09:53:37 -06:00
Martin Renvoize 952e60e221
Bug 42764: Include filename in codespell test output
Without a test comment, failures appear as bare 'not ok N' lines with
no indication of which file failed or what codespell found.

Passing the filename as the third argument to is() means:
- Every passing test shows: ok N - path/to/file
- Every failing test shows: not ok N - path/to/file

Test plan:
1. Apply patch
2. Introduce a deliberate spelling error in any .pl file
3. prove xt/author/codespell.t
=> Failing line shows the filename and the codespell finding inline,
   without needing to dig into full console logs

Signed-off-by: Martin Renvoize <martin.renvoize@openfifth.co.uk>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-11 09:53:36 -06:00
Martin Renvoize e7dc04a178
Bug 42764: Fix false positives caused by POD letter-code formatting
Two patterns in the codebase produce spurious codespell hits because
codespell tokenises word fragments out of formatted letter codes:

- B<P>rovider in C4/Auth_with_shibboleth.pm produces 'rovider'
- T(ransit), W(aiting), F(inished), P(rocessing) in C4/Reserves.pm
  produce 'ransit', 'aiting', 'inished', 'rocessing'

For the shibboleth POD line the bold-letter markup cannot be simplified
without losing the formatting intent, so a per-line # codespell:ignore
comment is the right suppression.

For the Reserves.pm status table the fix is made at source: the notation
is changed from X(word) to X (Word) so codespell sees the full English
word and no fragment is produced.

Because the per-line comment on the shibboleth line now suppresses
'rovider' directly, the global .codespell-ignore entry for that fragment
is removed as redundant.

Test plan:
1. Apply patch
2. prove xt/author/codespell.t
=> No new codespell failures

Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-11 09:53:35 -06:00
Lucas Gass f6deb07bdf
Bug 42764: Fix spelling errors across the codebase
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-11 09:53:34 -06:00
Martin Renvoize bb7b3aa9a0
Bug 42764: Update .codespell-ignore for valid technical terms
Add words to .codespell-ignore that codespell 2.4.x flags but are
valid technical terms, domain vocabulary, or proper names:

- checkin: core library circulation term (check-in as noun/verb)
- plack: Perl PSGI middleware framework (proper software name)
- requestor: COUNTER 5 standard term used in ERM usage statistics
- laf: EDIFACT 3-letter segment code
- vai/lamba: Unicode script and language names in character set data
- aas: acronym used in Cypress test support files
- carmel: contributor name in about.tt
- prfile: legacy variable abbreviation in C4/Creators/PDF.pm

Test plan:
1. Apply patch
2. prove xt/author/codespell.t
=> Test passes (or only genuine spelling errors remain)

Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-11 09:53:26 -06:00
Owen Leonard f4c0819644
Bug 42518: Capitalization: Refund Payout Receipt
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Laura_Escamilla <laura.escamilla@bywatersolutions.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-10 12:35:45 -06:00
David Nind d2df80f20d
Bug 42695: (follow-up) Format paragraph
Moves the explanation sentence into its own paragraph.

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Laura_Escamilla <laura.escamilla@bywatersolutions.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-10 12:35:44 -06:00
Owen Leonard 6fa6228f73
Bug 42695: Minor language and markup corrections to reports error messages
This patch makes a vew minor corrections to guided_reports_start.tt.

To test apply the patch and go to Reports.

- Try to create an SQL report which uses UPDATE, e.g.
  UPDATE items SET barcode = 1 WHERE itemnumber = 1
- Confirm that the text of the error message reads well and is formatted
  well.

Sponsored-by: Athens County Public Libraries
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Laura_Escamilla <laura.escamilla@bywatersolutions.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-10 12:35:44 -06:00
Owen Leonard 19bc16654a
Bug 42692: Typo: regarless
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Laura_Escamilla <laura.escamilla@bywatersolutions.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-10 12:35:43 -06:00
Owen Leonard 889ab52a33
Bug 42691: Typo: automaticaly
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Laura_Escamilla <laura.escamilla@bywatersolutions.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-10 12:35:37 -06:00
Pedro Amorim 64e4501129
Bug 42705: Fix SCO spec WebBasedSelfCheck setup
cy.login() in beforeEach broke the test in two ways: the intranet staff session cookie bled into the OPAC request (HTTP cookies have no port scope in
browsers), and navigating from intranet→OPAC mid-test hit a cross-origin block in Cypress. The afterEach suffered the same race condition - the syspref POST fired before the login redirect completed.

Replace with cy.request(), which makes HTTP calls at the runner level without touching the browser's current origin. cy.visitOpac() is then the first
browser navigation, so no cross-origin issue arises. A three-step flow satisfies Koha's CSRF middleware:
1) GET the login page to obtain a session and its token
2) POST credentials to authenticate
3) POST to the svc endpoint.

This fixes the #barcode and #patronlogin not found issues

The CSRF token also requires encodeURIComponent() — base64 uses +, which a
URL-encoded form body decodes as a space, silently corrupting the token and causing the login to fail.

This resolves the 403 Forbidden issue

Everything must pass:
$ cypress run --spec t/cypress/integration/OPAC/SCO_spec.ts

as well as npm run cypress open (cypress ui)

ktd selenium:
$ perl /kohadevbox/misc4dev/run_tests.pl --run-only t/cypress/integration/OPAC/SCO_spec.ts

squash

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-09 15:42:26 -06:00
Pedro Amorim 5baf1ce6e0
Bug 42705: Add HttpClient_spec.ts
This fails without the fix patch in this set:
cypress run --spec t/cypress/integration/HttpClient_spec.ts

It passes with the fix

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-09 15:42:26 -06:00
Pedro Amorim 4e87782636
Bug 42705: Make http-client.js handle svc endpoint error
The afterEach calls cy.login() then immediately posts to the syspref endpoint. On CI, the machine is slow enough that the POST fires before the login
redirect completes — no valid session yet — so the endpoint returns a C4::Service auth error in this format:

{ "type": "auth", "message": "expired" }

http-client.js only knew how to parse modern REST API errors (json.error or json.errors[]). Neither field exists here, so json.errors.map(...) crashed with a TypeError instead of surfacing the actual error message.

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-09 15:42:25 -06:00
Lucas Gass 87a552d8a7
Bug 34973: Update yarn.lock
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-09 15:42:19 -06:00
David Cook bcbe93fbea
Bug 42361: Fix SQL injection in catalogue_out.pl
This change removes an SQL injection vulnerability from catalogue_out.pl

Test plan:
0. Apply the patch
1. Go to koha-conf.xml and change the following:
<strict_sql_modes>1</strict_sql_modes>
to:
<strict_sql_modes>0</strict_sql_modes>
2. sudo koha-plack --restart kohadev
3. Go to /cgi-bin/koha/reports/catalogue_out.pl
4. Try out the various options and note no errors occur

Signed-off-by: Sanjar Tulkinov Anvar o'g'li <sanjarbiy11@gmail.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-09 08:18:59 -06:00
Lucas Gass 9122ad9dc6
Bug 42757: Use default suggestor or fallback to librarian
To test:
1. Find a patron
2. From the patron account click the "Purchase suggestions" button
3. Make a suggestion
4. That suggestion is not associated with the patron from step 1
5. APPLY PATCH and restart_all
6. Repeart steps 1 -3. The purchase suggestion suggesedby should be the patron from step 1
7. Go  Acquisitions -> Suggestions -> Add suggestion
8. Make sure when you do it this way the suggestedby is set to the logged-in-user by default

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Martin Renvoize <martin.renvoize@openfifth.co.uk>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:26 -06:00
Lucas Gass eca5b83960
Bug 42750: Add redirect params back and exit after redirect
To test:
1. Find a patron
2. From the patron account click the "Purchase suggestions" button
3. Make a suggestion
4. Your are redirected to suggestion/suggestion.pl
5. APPLY PATCH, restart_all
6. Try again, this time you should be properly redirected back to the patron account: ( members/purchase-suggestions.pl?borrowernumber=X )

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Martin Renvoize <martin.renvoize@openfifth.co.uk>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:25 -06:00
Lucas Gass 885577073c
Bug 42740: Fix suggestion status when editing
To test:
1. Make a purchase suggestion.
2. Set the status to something, anything.
3. Edit that suggestion, notice that the "Status:" is set to 'No Status'
4. Now when you save, they actual status is lost.
5. APPLY PATCH, restart_all
6. Try steps 1 - 3. This time at step 3 the suggestion status should be properly set.
7. Save the suggestion, make sure it saves with the correct status.

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Tomás Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:25 -06:00
Eric Phetteplace 33a8dc5d6f
Bug 42723: Purchase suggestion 500 when EmailPurchaseSuggestions is set to BranchEmailAddress
Testing plan:
- Set EmailPurchaseSuggestions to BranchEmailAddress
- Go to create suggestion on the staff side /suggestion/suggestion.pl?op=add_form
- Create a suggestion with Library: Any
- 500 error: inbound_email_address is not a method of undef
- Apply patch & repeat
- Suggestion created

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:24 -06:00
Lucas Gass 2f08c5b8ae
Bug 42710: Set library to logged in library for new suggestions
To test:
1.  Acquisitions -> Suggestions ->Add suggestion
2.  Notice the under Acquisition information the library is set to Any
3.  APPLY PATCH
4.  Try again, library should be set to the logged in library.
5.  Make a suggestion and set it to some branch other then the logged in branch
6   Edit the suggestion from step 5, ensure that the "Library:" is properly set

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Baptiste Wojtkowski <baptiste.wojtkowski@biblibre.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:23 -06:00
Emily Lamancusa 35e670c886
Bug 42701: Fix editable class on additem.pl
When editing the items on a biblio record, you should be able to select
an item to edit by clicking anywhere on the item row. This functionality
was lost because the "editable" class was not getting added correctly to
the table row. This patch fixes that issue.

To test:
1. Find a biblio record that has at least one item
2. Click on Edit > Manage items
3. In the table that lists editable items, click on any cell of any item
   (other than the Actions button)
--> Nothing happens; the buttons to "Edit item" and "Delete item" do not
    appear as expected
4. Apply patch and refresh the page
5. Repeat step 3
--> The buttons to "Edit item" and "Delete item" appear

Signed-off-by: Barbara Johnson <barbara.johnson@bedfordtx.gov>
Signed-off-by: Laura_Escamilla <laura.escamilla@bywatersolutions.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:22 -06:00
Janusz Kaczmarek dbd51e342c
Bug 42555: (Bug 25314 follow-up) Destroyed labels for customized facets
After applying Bug 25314, customized facets generated from
mappings.yaml are displayed with the technical type_id instead of the
proper label.

Test plan:
==========
1. In KTD with Elasticsearch enabled, add the following to
   admin/searchengine/elasticsearch/mappings.yaml

  su-gen:
    facet_order: 33
    label: Genre/Form
    mappings:
    - facet: 1
      marc_field: 655a
      marc_type: marc21
      sort: 1
      suggestible: ''
    opac: 1
    staff_client: 1
    type: ''

   Reindex with: koha-elasticsearch --rebuild -r -d -b kohadev
2. In the OPAC, at the bottom of the facets area, you should see a
   facet labeled su-gen_id instead of Genre/Form.
3. Apply the patch ; restart_all.
4. The facet should now display the correct label: Genre/Form.

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Martin Renvoize <martin.renvoize@openfifth.co.uk>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:21 -06:00
Owen Leonard c64f707691
Bug 42498: Fix invalid aria attribute in OPAC search results pagination
This patch corrects the aria-current attribute in OPAC search results
pagination. There should be no aria-current attribute on the list item,
and the aria-current value on the link should be "page."

To test, apply the patch and perform a catalog search in the OPAC which
will return multiple pages of results.

View the page source or use the developer console to inspect the HTML of
the active pagination link. It should have an aria-current label with
the value "page." The containing list item should not have an
aria-current label.

Sponsored-by: Athens County Public Libraries
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Laura_Escamilla <laura.escamilla@bywatersolutions.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:21 -06:00
David Nind f545db2179
Bug 42454: Terminology: Use "and" instead of "&" for curbside pickups tab
The "Staged & ready (0)" tab for curbside pickups (Circulation > Holds
and bookings > Curbside pickup) should use "and" instead of "&".

See terminology guidelines for "& (ampersand)" - Only use "&" when part
of a proper noun or a common abbreviation,... Otherwise, use "and":
https://wiki.koha-community.org/wiki/Terminology#characters

Test plan:
1. Enable the CurbsidePickup system preference.
2. Configure curbside pickup for Centerville:
   - Go to Administration > Patrons and circulation > Curbside pickup
   - Set values:
     . Enable: selected
     . Pickup interval: 5
     . Maximum patrons per interval: 1
     . Patron-scheduled pickup: selected
     . Enable for waiting holds only: selected
     . Curbside pickup hours: add from and to hours for some days
     . Click Save configuration
3. Go to Circulation > Holds and bookings > Curbside pickup.
4. Note that there is an '&' in the "Staged & ready (0)" tab title.
5. Apply the patch.
6. Refresh the page.
7. Note that and is spelt in full "Stage and ready (0)".

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Alex Carver [Acerock7] <alex@rcls.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:20 -06:00
Julian Maurice 39a090affe
Bug 42194: Fix redirect after sharing a report to Mana
Bug 34478 removed a '&' by mistake in the redirect URL

Test plan:
1. Setup a local instance of Mana
   (https://gitlab.com/koha-community/koha-mana) with disabled email
   validation (skip_email_validation in config.yml)
2. Connect Koha to this local instance (mana_config in $KOHA_CONF)
3. From Koha Admin interface, create a Mana security token
4. Share a report to Mana
5. You should be redirected to the list of reports with a message saying
   the report was saved successfully

Signed-off-by: Emmanuel Bétemps <e.betemps@gmail.com>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:19 -06:00
Maryse Simard 4112dde941
Bug 42193: Fix the "Suspend Hold" modal in the OPAC
In the OPAC, the "Suspend Hold" modal sometimes shows up as (and acts like) a "Resume Hold" modal. The reason for this is a left over "HOLD.suspend" in the template. "HOLD" should not be used in this template and is set as a side effect of the processing of "holds-table.inc".

Since there is a separate form that exist for the "Resume" action and the modal is only needed for suspension, this patch simply removes the inacurate conditional in the modal definition.

To test :
1. Have at least 2 holds.
2. In the holds table in the OPAC, make sure all holds are active and have a "Suspend" link.
3. Click the "Suspend" link on the newest hold (with the highest reserve_id).
    => The modal is titled "Suspend hold" and submitting it correctly suspends the hold.
4. Click the "Suspend" link on any of the other hold.
    => The modal is titled "Resume hold" and submitting it doesn't suspends the hold.
5. Apply patch
6. Repeat step 4.
    => The modal is titled "Suspend hold" and submitting it correctly suspends the hold.

Signed-off-by: Roman Dolny <roman.dolny@jezuici.pl>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:18 -06:00
Kevin Carnes e6d6a608c3
Bug 42178: Fix close button for remove from bundle
The close button for remove from bundle has not type, so it submits the form.

This patch adds a button type.

Test plan:
1. Apply bug 42177 or add a local use preference for bundlesEnabled set to 1.
2. Edit a record.
3. Modify the leader so that it has a collection bibliographic level.
4. Ensure that is has at least one item.
5. Click Manage bundle next to the item.
6. Click Remove from bundle.
7. Click the Close button.
8. Observe that the form is submitted.
9. Apply the patch.
10. Repeat steps 5-7.
11. Observe that the form is not submitted.
12. Sign off.

Sponsored-by: Lund University Library
Signed-off-by: Laura_Escamilla <laura.escamilla@bywatersolutions.com>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:17 -06:00
Jonathan Druart 5dcec8b803
Bug 42130: ERM - Index biblio when local title is created/updated
The indexation step has been removed by
  commit d2820f57d6
  Bug 34788: (QA follow-up)

Koha/ERM/EHoldings/Title.pm
-            C4::Biblio::ModBiblio( $record, $self->biblio_id, '' );
+            C4::Biblio::ModBiblio( $record, $self->biblio_id, '', { skip_record_index => 1 } );

From the commit message:
2) The background job now uses skip_record_index to avoid queuing indexing jobs for every new biblio and instead queues one job at the end

it's then missing when we add or edit a local title.

Test plan:
1 - Enable ERMModule
2 - Go to ERM
3 - eHoldings->Titles
4 - New title
5 - Populate the form
6 - Check the create bibliographic record box
7 - Save
=> Confirm that the biblio is now indexed
8. Edit the title, modify a value, tick the box, save
=> Confirm that the biblio is now indexed with the new value

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:17 -06:00
Baptiste Wojtkowski adf7b69858
Bug 41998: Fix redirect_with_params
Test plan (main only):
1 - Create a suggestion
2 - Delete the suggestion -> error
3 - Apply patch
4 - Repeat 1&2

Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:16 -06:00
Martin Renvoize dd99a66a4b
Bug 32938: Add ORDRSP message display to basket page
This patch extends the EDIFACT message display functionality on the basket page
to include ORDRSP (Order Response) messages alongside existing QUOTE and ORDERS
messages.

Features added:
- ORDRSP message collection and filtering
- Smart button display logic:
  * Single button for one message type
  * Dropdown for multiple message types (now includes ORDRSP)
- ORDRSP-specific UI elements:
  * Reply icon (fa-reply) indicating response nature
  * "View order response" labeling
  * Integration with existing modal and highlighting system

The ORDRSP messages correctly link to baskets since they are vendor responses
to the original order, following the standard EDI workflow:
ORDERS → ORDRSP → INVOICE

Sponsored-by: OpenFifth <https://openfifth.co.uk/>
Signed-off-by: Hannah Dunne-Howrie <hdunne-howrie@westminster.gov.uk>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:15 -06:00
Martin Renvoize a0611d2809
Bug 32938: Fix ORDRSP message linking to point to baskets instead of invoices
ORDRSP (Order Response) messages are responses to ORDERS messages and should
link to the related basket, not to invoices. This follows the standard EDI
workflow:
1. ORDERS message sent to vendor
2. ORDRSP message received from vendor (order response/confirmation)
3. INVOICE message received later when items shipped

Sponsored-by: OpenFifth <https://openfifth.co.uk/>
Signed-off-by: Hannah Dunne-Howrie <hdunne-howrie@westminster.gov.uk>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:14 -06:00
Owen Leonard 71559d0909
Bug 42441: Remove event attributes from authority merge template
This patch moves a couple of "onclick" event attributes from the
authority merge template, moving the event handling to the JS block.

This patch also fixes the behavior that I assume the click handlers are
meant to have, changing the framework selection. A mismatch of IDs in
the code meant that clicking the radio buttons didn't do anything.

To test, apply the patch and go to Authorities.

- Perform a search for authority records which will return multiple
  results, including records with different heading types (e.g. Personal
  Name, Topical Term, etc.)
- In the "Actions" menu for one of the search results, click "Merge"
- Do the same with another result which has a different heading type.
- On the "Merging records" page you should see a frameowrk dropdown.
- When you click the radio buttons next to your two records to merge the
  framework selection should change to match your selection.

Sponsored-by: Athens County Public Libraries
Signed-off-by: Phil Ringnalda <phil@chetcolibrary.org>

Amended-by: Jonathan Druart
Tidy

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:13 -06:00
Owen Leonard d27639707f
Bug 42154: Bug 38714 hid the "New match check" link in record matching rules
This patch corrects the logic used to determine whether to show the "New
match check" link. I mistakenly changed it to check for the matchpoints
variable instead of the matchchecks variable.

To test, apply the patch and go to Administration -> Record matching
rules.

- Click "New record matching rule" in the toolbar.
- Scroll down to the "Required match checks" section.
- You should see a "New match check" link alongside a "Remove this match
  check" link.
- Go back to the record matching rules main page.
- If necessary, create a rule which doesn't have any match checks.
- In the "Required match checks" section of the edit form you should see
  a "New match check" link, previously hidden by Bug 388714.

Sponsored-by: Athens County Public Libraries
Signed-off-by: David Nind <david@davidnind.com>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:13 -06:00
Marcel de Rooy 1022ad4c13
Bug 42084: (QA follow-up) Simplify
Since this is an intranet svc script (called in intranet js), there
is no need to check the session.

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:12 -06:00
Hammat Wele 78d4c42a61
Bug 42084: Incorrect interface shown in log viewer for system preference changes
The log viewer displays the OPAC interface for system preference changes. Since system preferences cannot be modified from the OPAC, the interface displayed in the logs appears to be incorrect.

To reproduce:

1- Disables plack
    1- sudo koha-plack --disable kohadev
    2- sudo koha-plack --stop kohadev
    3- sudo service apache2 restart
2- Change a system preference from the staff interface.
    1- Go to Administration -> System preferences.
    2- Search for a preference such as AcqCreateItem (any system preference will reproduce the issue).
    3- Change the value of the preference.
    4- Click Save all Acquisitions preferences (or save the preference).
3- Go to the log viewer:
    1- Navigate to Tools -> Log viewer.
    2- Fill the form as follows:
        Librarian: leave empty
        Modules: uncheck everything except System preferences
        Actions: keep All actions selected
        Object: leave empty
        Info: leave empty
        Interface: keep All interfaces
        Display from: choose yesterday
        Display to: leave empty
    3- Click Submit.
        ==>The log entry shows the OPAC interface.
4- Apply the patch
5- Repeat step 1,2,3
    ==>The log entry shows the Staff interface.

Signed-off-by: David Nind <david@davidnind.com>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:11 -06:00
Pedro Amorim 125416a92d
Bug 42733: Add tests
Apply tests patch only, run:
yarn cypress run --spec t/cypress/integration/Tools/ManageMarcImport_spec.ts

Confirm it fails with the same error as Jenkins:
Timed out retrying after 10000ms: `cy.wait()` timed out waiting `10000ms` for the 2nd request to the route: `jobPoll`. No request ever occurred.

Apply fix patch. Run again.

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:10 -06:00
Pedro Amorim 74cf164d32
Bug 42733: Job progress fix
waitForJobFinished previously had no handling for failed jobs or
non-200 responses — if the job API returned anything unexpected,
the recursive cy.wait() would silently stall waiting for a 2nd
poll that never came, producing a confusing timeout. Adds an
explicit "failed" status check and updates the intercept
to reproduce the exact CI failure (Apache returning 503 during
reset_all).

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:10 -06:00
Martin Renvoize f0bb03d6e9
Bug 42726: Add 26.11 release team
Add the 26.11 release team as voted at the development meeting.

Pedro Amorim as Release Manager, with Tomás Cohen Arazi and Martin
Renvoize as RM Assistants. Lisette Scheer as QA Manager with a
19-person QA team. David Cook as Security Release Manager.

Signed-off-by: Martin Renvoize <martin.renvoize@openfifth.co.uk>
Signed-off-by: Owen Leonard <oleonard@myacpl.org>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:09 -06:00
Martin Renvoize 5d12a83751
Bug 42726: Fix 25.11 QA team list to match dashboard
Update the 25.11 QA team to reflect the definitive list from the
dashboard. Remove Aleisha Amohia and Julian Maurice who did not
appear in the final count, and add John Vinke, Matt Blenkinsop,
Alex Carver and Victor Grousset who did. Reorder by descending
QA count.

Signed-off-by: Martin Renvoize <martin.renvoize@openfifth.co.uk>
Signed-off-by: Owen Leonard <oleonard@myacpl.org>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-08 13:53:01 -06:00
Jonathan Druart 7c0880a9ec
Bug 42133: Restore plugins when editing items in batch
It has been broken then fixed then broken again, several times...

This patch fixes 2 problems:
1. The CSRF fix (I think it's coming from there) didn't adjust the 'if show' test and the JS code from plugins was not injected into the template
2. The selector to call the plugin didn't include this view, only the
   add/edit items

Test plan:
Confirm that you can now use cataloging plugins when editing items in
batch

Signed-off-by: Emmi Takkinen <emmi.takkinen@koha-suomi.fi>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-04 15:09:10 -06:00
Owen Leonard caa63ce8e6
Bug 34973: (follow-up) Remove old Font Awesome asset references from SCO and SCI
The self-checkout and self-checkin templates no longer need explicit
inclusion of Font Awesome CSS because it's rolled into _common.scss and
thus sco.scss.

Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-04 15:09:10 -06:00
Owen Leonard df42d81dbe
Bug 34973: (follow-up) Use lib/fontawesome for font location
It makes more sense to use lib/fontawesome/webfonts as the source
directory for Font Awesome font files rather than bootstrap/css/fonts.

Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-04 15:09:09 -06:00
Jonathan Druart 9ee36cea5a
Bug 34973: Adjust opac-curbside-pickups.tt
Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-04 15:09:09 -06:00
Owen Leonard 4c9604d1a7
Bug 34973: Upgrade Font Awesome in the OPAC to 7.2
We are using Font Awesome 6.3 in the OPAC. The current version is 7.2.
Upgrading will eliminate the repeated warnings in the browser console
about "Glyph bbox was incorrect."

The patch adds Font Awesome to the list of packages in node_modules and
moves the Font Awesome SCSS into _common.scss so that it can be bundled
along with Bootstrap and other 3rd party assets.

Despite the fact that _common.scss grabs FA SCSS files directly from
node_modules I've added the FA font files to css/fonts. I was unable to
see how to reference the webfonts directory in
node_modules/@fortawesome.

The many changed .inc and .tt files are a result of a missed aspect of
our upgrade to Bootstrap 5. The "sr-only" class was removed in BS5 but
the Font Awesome CSS included its own "sr-only" class. This made up for
the fact that we missed the required upgrade to BS5's "visually-hidden."
As soon as Font Awesome's "sr-only" was gone all these mistakes were
made visible.

To test, apply the patch and run 'yarn install.'
- Rebuild the OPAC SCSS.
- Clear your browser cache.
- Test many pages in the OPAC to confirm that no icons are missing.
- Check changes to the templates to confirm that "sr-only" has been
  replaced with "visually-hidden."
  - Places where a broken "sr-only" class would be obvious: Star ratings
    on the user summary page, <legend>s on the search history page.

Sponsored-by: Athens County Public Libraries
Signed-off-by: David Nind <david@davidnind.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-04 15:09:08 -06:00
Martin Renvoize 855e7669d4
Bug 41705: (follow-up) Fix for new kohaTable requirements
This bug sat in the queue too long and thus there's coding standard
changes to resolve.

Signed-off-by: Martin Renvoize <martin.renvoize@openfifth.co.uk>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-04 15:09:07 -06:00
Martin Renvoize 6b45fda621
Bug 41705: (follow-up) Hide receipt page buttons when printing
The Print receipt and Close buttons added in the previous patch use
class="no-print", but printreceiptinvoice.css had no @media print rule
for that class — so they appeared in the printed output (e.g. when
saving as PDF or auto-printing in browsers that block popups).

Add a @media print rule so the buttons remain visible on screen but
disappear from the printed receipt.

Test plan:
1. Disable browser popups (Chrome: "Don't allow sites to send pop-ups
   or use redirects").
2. Enable FinePaymentAutoPopup.
3. Complete a POS sale.
4. On the receipt page, choose Print to PDF (or trigger auto-print).
5. Verify the printed/PDF output contains only the receipt body — no
   Print receipt or Close buttons.
6. Verify the buttons remain visible on screen.

Signed-off-by: Andrew Fuerste Henry <andrew@bywatersolutions.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-04 15:09:07 -06:00
Martin Renvoize a5a1eeaa5b
Bug 41705: Use PRG pattern for POS receipt printing to avoid popup blockers
The previous approach triggered popup blockers because the receipt window
was opened via JavaScript after a page reload — browsers treat this as a
non-user-initiated action. This patch reverses the flow: when
FinePaymentAutoPopup is enabled, the payment form submits directly to a
new tab via target="_blank" (a user-initiated action that browsers allow),
the server processes the payment and redirects (303) to the receipt page,
which auto-prints and closes itself, returning focus to the POS tab.

When FinePaymentAutoPopup is disabled, the server redirects back to the
POS page with payment details in the URL (standard PRG), displaying the
existing success banner with print/email receipt buttons.

Changes:
- pos/pay.pl: Implement PRG redirect for both popup and non-popup flows,
  URI-encode redirect parameters, remove session-based state management
- pos/pay.tt: Add target="_blank" when FinePaymentAutoPopup is enabled,
  reset form state after submission via same-scope setTimeout
- pos/printreceipt.pl: Add error handling for missing receipts, pass
  autoprint parameter to template
- pos/printreceipt.tt: Add conditional auto-print, manual print/close
  buttons, error display, and IntranetSlipPrinterJS preference support
- slip-print.inc: Modernize jQuery to vanilla JS, remove obsolete
  Chrome setTimeout hack

Test plan:
1. Enable FinePaymentAutoPopup system preference
2. Go to Point of Sale, add items, and complete a sale
3. Verify receipt opens in a new tab without popup blocker warnings
4. Verify receipt auto-prints and tab closes after printing
5. Verify original POS tab form is reset for next transaction
6. Disable FinePaymentAutoPopup
7. Complete another sale
8. Verify POS page shows success with Print/Email receipt buttons
9. Test receipt printing from other pages (circulation, fees) to
   confirm slip-print.inc change causes no regressions

Sponsored-by: OpenFifth <https://openfifth.co.uk/>
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Andrew Fuerste Henry <andrew@bywatersolutions.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-04 15:09:06 -06:00
Owen Leonard e2f5afe100
Bug 42475: (follow-up) Fix a couple more instances of 'opac'
Signed-off-by: Laura_Escamilla <laura.escamilla@bywatersolutions.com>
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-04 15:09:06 -06:00
Jonathan Druart b860c04197
Bug 42475: Fix opac vs OPAC
Correct "opac" with "OPAC" in the pref file

Test plan:
git grep opac **/*.pref
and confirm that there is no relevant occurrences in the output (i.e.
no strings displayed on the UI)

Signed-off-by: Owen Leonard <oleonard@myacpl.org>
Signed-off-by: Laura_Escamilla <laura.escamilla@bywatersolutions.com>
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
2026-06-04 15:08:59 -06:00
196 changed files with 2798 additions and 653 deletions

View File

@ -1,7 +1,6 @@
ser
thes
nam
rovider
fo
isnt
wither
@ -18,3 +17,12 @@ theses
rouge
connexion
falsy
aas
carmel
checkin
laf
lamba
plack
prfile
requestor
vai

View File

@ -312,7 +312,7 @@ Create some metadata for your koha instance (if you're in a single instance setu
=item 2.
Swap metadata with your Identidy Provider (IdP)
Swap metadata with your Identify Provider (IdP)
=item 3.
@ -365,7 +365,7 @@ Note: The minimum you need here is a <matchpoint> block, containing a valid colu
It should be as simple as that; you should now be able to login via shibboleth in the opac.
If you need more help configuring your B<S>ervice B<P>rovider to authenticate against a chosen B<Id>entity B<P>rovider then it might be worth taking a look at the community wiki L<page|https://wiki.koha-community.org/wiki/Shibboleth_Configuration>
If you need more help configuring your B<S>ervice B<P>rovider to authenticate against a chosen B<Id>entity B<P>rovider then it might be worth taking a look at the community wiki L<page|https://wiki.koha-community.org/wiki/Shibboleth_Configuration> # codespell:ignore
=head1 FUNCTIONS

View File

@ -52,6 +52,10 @@ use Koha::Config::SysPrefs;
use Koha::Config;
use Koha::Database;
# NOTE: The below list should match the corresponding options in the .pref file
# for CSVDelimiter
use constant ALLOWED_CSV_DELIMITERS => ( ';', 'tabulation', ',', '/', '\\', '#' );
=head1 NAME
C4::Context - Maintain and manipulate the context of a Koha script
@ -485,6 +489,13 @@ sub delete_preference {
sub csv_delimiter {
my ( $self, $value ) = @_;
# Validate input against allowed delimiters
if ($value) {
my %allowed = map { $_ => 1 } ALLOWED_CSV_DELIMITERS;
$value = undef unless $allowed{$value};
}
my $delimiter = $value || $self->preference('CSVDelimiter') || ',';
$delimiter = "\t" if $delimiter eq 'tabulation';
return $delimiter;

View File

@ -272,7 +272,7 @@ ADD_LAYOUTS:
This function returns an arrayref whose elements are hashes containing all profiles upon success and 1 upon failure. Errors are logged
to the Apache log. Two parameters are accepted. The first limits the field(s) returned. This parameter should be string of comma separated
fields. ie. "field_1, field_2, ...field_n" The second limits the records returned based on a string containing a valud SQL 'WHERE' filter.
fields. ie. "field_1, field_2, ...field_n" The second limits the records returned based on a string containing a valid SQL 'WHERE' filter.
NOTE: Do not pass in the keyword 'WHERE.'
@ -320,7 +320,7 @@ sub get_all_image_names {
This function returns an arrayref whose elements are hashes containing the batch_ids of current batches along with the item count
for each batch upon success and 1 upon failure. Item counts are stored under the key '_item_count' Errors are logged to the Apache log.
One parameter is accepted which limits the records returned based on a string containing a valud SQL 'WHERE' filter.
One parameter is accepted which limits the records returned based on a string containing a valid SQL 'WHERE' filter.
NOTE: Do not pass in the keyword 'WHERE.'
@ -352,7 +352,7 @@ sub get_batch_summary {
This function returns an arrayref whose elements are hashes containing the label_ids of current labels along with the item count
for each label upon success and 1 upon failure. Item counts are stored under the key '_item_count' Errors are logged to the Apache log.
One parameter is accepted which limits the records returned based on a string containing a valud SQL 'WHERE' filter.
One parameter is accepted which limits the records returned based on a string containing a valid SQL 'WHERE' filter.
NOTE: Do not pass in the keyword 'WHERE.'
@ -405,7 +405,7 @@ sub get_label_summary {
This function returns an arrayref whose elements are hashes containing the label_ids of current cards along with the item count
for each card upon success and 1 upon failure. Item counts are stored under the key '_item_count' Errors are logged to the Apache log.
One parameter is accepted which limits the records returned based on a string containing a valud SQL 'WHERE' filter.
One parameter is accepted which limits the records returned based on a string containing a valid SQL 'WHERE' filter.
NOTE: Do not pass in the keyword 'WHERE.'

View File

@ -51,8 +51,8 @@ This will return a list of all the available delimiters.
sub GetDelimiterChoices {
my $default = C4::Context->preference('CSVDelimiter');
# NOTE: The below list should match the corresponding options in the .pref file
my @dels = ( ';', 'tabulation', ',', '/', '\\', '#' );
# Use the centralized list of allowed delimiters from C4::Context
my @dels = C4::Context::ALLOWED_CSV_DELIMITERS;
return {
values => \@dels,

View File

@ -1,7 +1,7 @@
package C4::Reserves;
# Copyright 2000-2002 Katipo Communications
# 2006 SAN Ouest Provence
# 2006 SAN Ouest Provence # codespell:ignore
# 2007-2010 BibLibre Paul POULAIN
# 2011 Catalyst IT
#
@ -110,10 +110,10 @@ This modules provides some functions to deal with reservations.
- priority >0 : then the reserve is at 1st stage, and not yet affected to any item.
=0 : then the reserve is being dealt
- found : NULL : means the patron requested the 1st available, and we haven't chosen the item
T(ransit) : the reserve is linked to an item but is in transit to the pickup branch
W(aiting) : the reserve is linked to an item, is at the pickup branch, and is waiting on the hold shelf
F(inished) : the reserve has been completed, and is done
P(rocessing) : reserved item has been returned using self-check machine and reserve needs to be confirmed
T (Transit) : the reserve is linked to an item but is in transit to the pickup branch
W (Waiting) : the reserve is linked to an item, is at the pickup branch, and is waiting on the hold shelf
F (Finished) : the reserve has been completed, and is done
P (Processing) : reserved item has been returned using self-check machine and reserve needs to be confirmed
by librarian before notice is send and status changed to waiting.
Applicable only if HoldsNeedProcessingSIP system preference is set.
- itemnumber : empty : the reserve is still unaffected to an item

View File

@ -110,7 +110,7 @@ sub update_data {
$i++;
}
}
say "$i data insered or updated";
say "$i data inserted or updated";
}
=head2 get_report

View File

@ -16,7 +16,7 @@ sub search {
my $start = $params->{start};
my $length = $params->{length};
# If not logged in user, be carreful and set the borrowernumber to 0
# If not logged in user, be careful and set the borrowernumber to 0
# to prevent private lists lack
my $loggedinuser = C4::Context->userenv->{'number'} || 0;

View File

@ -29,7 +29,7 @@ use vars qw{ $VERSION };
# - #4 : the developer version. The 4th number is the database subversion.
# used by developers when the database changes. updatedatabase take care of the changes itself
# and is automatically called by Auth.pm when needed.
$VERSION = "26.05.00.000";
$VERSION = "26.05.01.000";
sub version {
return $VERSION;

View File

@ -23,7 +23,7 @@ use base qw(Koha::Object);
=head1 NAME
Koha::ClassSortRule Koha Classfication Sorting Rule Object class
Koha::ClassSortRule Koha Classification Sorting Rule Object class
=head1 API

View File

@ -26,7 +26,7 @@ my $cache = Koha::Caches->get_instance();
=head1 NAME
Koha::ClassSource - Koha Classfication Source Object class
Koha::ClassSource - Koha Classification Source Object class
=head1 API

View File

@ -25,7 +25,7 @@ use base qw(Koha::Object);
=head1 NAME
Koha::ClassSplitRule Koha Classfication Splitting Rule Object class
Koha::ClassSplitRule Koha Classification Splitting Rule Object class
=head1 API

View File

@ -140,6 +140,7 @@ sub get_files_to_test {
@koha_commit_history;
if ($last_build_commit) {
@files = @{ from_json( read_file("$self->{git_repo_dir}/$self->{test_dir}/$last_build_commit") ) };
@files = grep { $dev_files->get_filetype($_) eq $filetype } @files;
@files = $dev_files->remove_exceptions( \@files, $filetype );
push @files, $dev_files->ls_files( $filetype, "$last_build_commit HEAD" );
} else {

View File

@ -1603,7 +1603,7 @@ Koha::EDI
Returns 1 on success undef on error
Most usual cause of error is a line with no or incorrect budget codes
which woild cause order creation to abort
which would cause order creation to abort
If other correct lines exist these are processed and the erroneous line os logged
=head2 title_level_class

View File

@ -414,7 +414,7 @@ Edifact - Edifact message handler
=head2 service_string_advice
Examines the Service String Advice returns 1 if the default separartors are in use
Examines the Service String Advice returns 1 if the default separators are in use
undef otherwise
=head2 segmentize

View File

@ -149,7 +149,7 @@ sub interchange_header {
$hdr .= $self->interchange_control_reference();
$hdr .= $separator;
# Recipents reference password not usually used in edifact
# Recipients reference password not usually used in edifact
$hdr .= q{+ORDERS}; # application reference
#Edifact does not usually include the following

View File

@ -21,7 +21,7 @@ use Exception::Class (
},
'Koha::Exceptions::Patron::FailedDeleteAnonymousPatron' => {
isa => 'Koha::Exceptions::Patron',
description => "Deleting patron failed, AnonymousPatron is not deleteable"
description => "Deleting patron failed, AnonymousPatron is not deletable"
},
'Koha::Exceptions::Patron::FailedDeleteProtectedPatron' => {
isa => 'Koha::Exceptions::Patron',

View File

@ -56,7 +56,7 @@ Koha::FrameworkPlugin - Facilitate use of plugins in MARC/items editor
This object support two code styles:
- In the new style, the plugin returns a hashref with a builder and a
launcher key pointing to two anynomous subroutines.
launcher key pointing to two anonymous subroutines.
- In the old style, the builder is subroutine plugin_javascript and the
launcher is subroutine plugin. For each plugin the routines are
redefined.

View File

@ -31,7 +31,7 @@ Koha::Item::Templates - Koha Item Template Object set class
=head3 get_available
Returns a hashref with keys 'owned' and 'shared' pointing to Koha::Item::Templats objects
Returns a hashref with keys 'owned' and 'shared' pointing to Koha::Item::Templates objects
representing templates owned by the user or shared to the user respectivetly.
=cut

View File

@ -374,7 +374,7 @@ sub empty {
Koha::Objects->reset();
resets iteration so the next call to next() will start agein
resets iteration so the next call to next() will start again
with the first object in a set.
=cut

View File

@ -55,7 +55,7 @@ sub delete {
my $default = Koha::Patron::Restriction::Types->find( { is_default => 1 } )->code;
# We can't use Koha objects here because Koha::Patron::Debarments
# is not a Koha object. So we'll do it old skool
# is not a Koha object. So we'll do it old school
my $rows = C4::Context->dbh->do(
"UPDATE borrower_debarments SET type = ? WHERE type = ?",
undef, ( $default, $self->code )

View File

@ -594,7 +594,7 @@ LINE: while ( my $borrowerline = <$handle> ) {
my @csvcolumns = $self->prepare_columns({headerrow => $borrowerline, keycol => \%csvkeycol, errors => \@errors, });
Returns an array of all column key and populates a hash of colunm key positions.
Returns an array of all column key and populates a hash of column key positions.
=cut

View File

@ -22,6 +22,7 @@ use Mojo::Base 'Mojolicious::Controller';
use Koha::ERM::EHoldings::Titles;
use Koha::BackgroundJob::CreateEHoldingsFromBiblios;
use Koha::BackgroundJob::ImportKBARTFile;
use Koha::SearchEngine::Indexer;
use Scalar::Util qw( blessed );
use Try::Tiny qw( catch try );
@ -95,6 +96,11 @@ sub add {
my $title = Koha::ERM::EHoldings::Title->new_from_api($body)
->store( { create_linked_biblio => $create_linked_biblio } );
if ($create_linked_biblio) {
my $indexer = Koha::SearchEngine::Indexer->new( { index => $Koha::SearchEngine::BIBLIOS_INDEX } );
$indexer->index_records( $title->biblio_id, "specialUpdate", "biblioserver" );
}
$title->resources($resources);
my @extended_attributes =
@ -161,6 +167,11 @@ sub update {
$title->set_from_api($body)->store( { create_linked_biblio => $create_linked_biblio } );
if ($create_linked_biblio) {
my $indexer = Koha::SearchEngine::Indexer->new( { index => $Koha::SearchEngine::BIBLIOS_INDEX } );
$indexer->index_records( $title->biblio_id, "specialUpdate", "biblioserver" );
}
$title->resources($resources);
my @extended_attributes =
map { { 'id' => $_->{field_id}, 'value' => $_->{value} } } @{$extended_attributes};

View File

@ -75,7 +75,7 @@ SQL snippet for us in reports
is_nullable: 1
size: 6
Koha module this definition is for Circulation, Catalog, Patrons, Acquistions, Accounts)
Koha module this definition is for (Circulation, Catalog, Patrons, Acquisitions, Accounts)
=cut
@ -117,8 +117,8 @@ __PACKAGE__->add_columns(
__PACKAGE__->set_primary_key("id");
# Created by DBIx::Class::Schema::Loader v0.07049 @ 2021-01-21 13:39:29
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:7r8vJ2yWD3yQCyri+uNSRw
# Created by DBIx::Class::Schema::Loader v0.07051 @ 2026-06-11 18:54:31
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:NEd9fYq1gJ8G+SvtDIF8Ng
# You can replace this text with custom content, and it will be preserved on regeneration

View File

@ -58,6 +58,7 @@ use Search::Elasticsearch::Role::Cxn;
}
use Try::Tiny qw( catch try );
use JSON::PP ();
use YAML::XS;
use List::Util qw( sum0 );
@ -272,6 +273,15 @@ sub get_elasticsearch_mappings {
$mappings->{properties}{'match-heading'} = _get_elasticsearch_field_config( 'search', 'text' );
$mappings->{properties}{'subject-heading-thesaurus'} = _get_elasticsearch_field_config( 'search', 'text' );
}
# Disable date and numeric detection to prevent Elasticsearch from
# auto-detecting field types in marc_data_array. Without this, a
# subfield value that looks like a date (e.g. "2024-01-15") causes
# ES to lock that subfield to type "date", and subsequent non-date
# values fail to index. (Bug 42485)
$mappings->{date_detection} = JSON::PP::false;
$mappings->{numeric_detection} = JSON::PP::false;
$all_mappings{ $self->index } = $mappings;
}
$self->sort_fields( \%{ $sort_fields{ $self->index } } );

View File

@ -609,7 +609,7 @@ our $koha_to_index_name = {
};
# Note that sears and aat map to 008/11 values here
# but don't appear in C4/Headin/MARC21 thesaurus
# but don't appear in C4/Heading/MARC21 thesaurus
# because they don't have values in controlled field indicators
# https://www.loc.gov/marc/authority/ad008.html
our $thesaurus_to_value = {

View File

@ -103,8 +103,12 @@ sub store {
my $toaddress;
if ( $emailpurchasesuggestions eq "BranchEmailAddress" ) {
# can be undef for branch=any suggestions
my $library = $result->library;
$toaddress = $library->inbound_email_address;
if ( $library && $library->inbound_email_address ) {
$toaddress = $library->inbound_email_address;
}
} elsif ( $emailpurchasesuggestions eq "KohaAdminEmailAddress" ) {
$toaddress = C4::Context->preference('ReplytoDefault')
|| C4::Context->preference('KohaAdminEmailAddress');

View File

@ -176,7 +176,7 @@ if ( $op eq "" ) {
#import selected lines
$template->param( 'basketno' => $cgiparams->{'basketno'} );
# Budget_id is mandatory for adding an order, we just add a default, the user needs to modify this aftewards
# Budget_id is mandatory for adding an order, we just add a default, the user needs to modify this afterwards
my $budgets = GetBudgets();
if ( scalar @$budgets == 0 ) {
die "No budgets defined, can't continue";

View File

@ -1,7 +1,7 @@
#!/usr/bin/perl
# Copyright 2008 BibLibre, BibLibre, Paul POULAIN
# SAN Ouest Provence
# SAN Ouest Provence # codespell:ignore
#
# This file is part of Koha.
#

View File

@ -91,7 +91,7 @@ else {
# FIXME - we really need a better way to do this consistently
# and across the board, be it bigints, Math::FixedPoint, a
# modernized version of Math::Curency that isn't tied to the system
# modernized version of Math::Currency that isn't tied to the system
# locale, or something else.
$total = sprintf( "%.2f", $total );
$sub_unalloc = sprintf( "%.2f", $sub_unalloc );

View File

@ -107,6 +107,51 @@ if ( $op eq 'cud-add' ) {
reason => 'invalid_id'
};
}
} elsif ( $op eq 'cud-test_email' ) {
my $smtp_server_id = $input->param('smtp_server_id');
my $smtp_server;
$smtp_server = Koha::SMTP::Servers->find($smtp_server_id)
unless !$smtp_server_id;
if ($smtp_server) {
my $test_email_address = C4::Context->preference('KohaAdminEmailAddress');
my $smtp_transport = $smtp_server->transport;
my $params = {
to => $test_email_address,
from => $test_email_address,
sender => $test_email_address,
subject => "Koha SMTP Test",
text_body => "Email is working."
};
my $email = Koha::Email->create($params);
try {
$email->send_or_die( { transport => $smtp_transport } );
push @messages,
{
type => 'message',
code => 'success_on_test'
};
} catch {
push @messages,
{
type => 'alert',
code => 'error_on_test'
};
};
} else {
push @messages,
{
type => 'alert',
code => 'error_on_test',
reason => 'invalid_id'
};
}
$op = 'list';
} elsif ( $op eq 'cud-edit_save' ) {
my $smtp_server_id = $input->param('smtp_server_id');

View File

@ -23,7 +23,7 @@ use C4::Auth qw( get_template_and_user );
use C4::Output qw( output_html_with_http_headers );
# Example of framework plugin new style.
# It should define and return at least one and normally two anynomous
# It should define and return at least one and normally two anonymous
# subroutines in a hash ref.
# REQUEST: If you copy this code to construct a new plugin, please REMOVE
# all comments copied from this file.

View File

@ -1565,30 +1565,31 @@ team:
qa_manager:
name: Martin Renvoize
qa:
- name: Jonathan Druart
- name: Andrew Fuerste-Henry
- name: Marcel de Rooy
- name: Martin Renvoize
- name: Jonathan Druart
- name: Kyle M Hall
- name: Paul Derscheid
- name: Laura Escamilla
- name: Lucas Gass
- name: Tomás Cohen Arazi
- name: Lisette Scheer
- name: Nick Clemens
- name: Paul Derscheid
- name: Emily Lamancusa
- name: David Cook
- name: Matt Blenkinsop
- name: Andrew Fuerste-Henry
- name: Brendan Lawlor
- name: Pedro Amorim
- name: Kyle M Hall
- name: Aleisha Amohia
- name: David Nind
- name: Baptiste Wojtkowski
- name: Jan Kissig
- name: Katrin Fischer
- name: Baptiste Wojtkowski
- name: David Cook
- name: Lisette Scheer
- name: Emily Lamancusa
- name: Jan Kissig
- name: Thomas Klausner
- name: Julian Maurice
- name: Brendan Lawlor
- name: David Nind
- name: Tomás Cohen Arazi
- name: Pedro Amorim
- name: Owen Leonard
- name: John Vinke
- name: Matt Blenkinsop
- name: Alex Carver
- name: Victor Grousset
documentation:
name: David Nind
documentation_team:
@ -1671,3 +1672,82 @@ team:
name: David Nind
newsletter:
name: Michael Kuhn
26.11:
manager:
name: Pedro Amorim
manager_assistants:
- name: Tomás Cohen Arazi
- name: Martin Renvoize
maintainer:
- version: 26.05
name: Lucas Gass
- version: 25.11
name: Baptiste Wojtkowski
- version: 25.05
name: "Wainui Witika-Park (Catalyst IT)"
- version: 24.11
name: Fridolin Somers
maintainer_assistants:
- version: 26.05
name: Jacob O'Mara
- version: 25.05
name: Alex Buckley & Aleisha Amohia (Catalyst IT)
qa_manager:
name: Lisette Scheer
qa:
- name: Lucas Gass
- name: Laura Escamilla
- name: Kyle M Hall
- name: Baptiste Wojtkowski
- name: Victor Grousset
- name: David Cook
- name: Andrew Fuerste-Henry
- name: Brendan Lawlor
- name: Thomas Klausner
- name: Paul Derscheid
- name: Jan Kissig
- name: Jacob O'Mara
- name: Nick Clemens
- name: Tomás Cohen Arazi
- name: Marcel de Rooy
- name: Emily Lamancusa
- name: Aleisha Amohia
- name: Martin Renvoize
- name: David Nind
security_manager:
- name: David Cook
te:
- area: Elasticsearch/OpenSearch
name: Fridolin Somers
- area: SIP2
name: Kyle M Hall
- area: EDI
name: Kyle M Hall
- area: POS
name: Martin Renvoize
bugwrangler:
- name: Michaela Sieber
- name: Laura Escamilla
documentation:
name: Aude Charillon
documentation_team:
- name: Caroline Cyr La Rose
- name: David Nind
- name: Philip Orr
meeting_facilitator:
- name: Paul Derscheid
ktd:
- name: Tomás Cohen Arazi
- name: Jonathan Druart
wiki:
- name: Thomas Dukleth
- name: George Williams
website:
- name: Lawrence O'Regan-Lloyd
newsletter:
name: Michael Kuhn
social_media:
name: David Nind
accessibility_advocates:
- name: Laura Escamilla
- name: Brendan Lawlor

View File

@ -4,7 +4,7 @@ use Koha::Installer::Output qw(say_warning say_success say_info);
return {
bug_number => "33363",
description =>
"Split suggestions_manage into three separate permissions for creating, updating, and deleting suggetions",
"Split suggestions_manage into three separate permissions for creating, updating, and deleting suggestions",
up => sub {
my ($args) = @_;
my ( $dbh, $out ) = @$args{qw(dbh out)};

View File

@ -28,9 +28,17 @@ return {
}, undef, $local_number_map_id
);
my $index_name = $Koha::SearchEngine::Elasticsearch::BIBLIOS_INDEX;
my $indexer = Koha::SearchEngine::Elasticsearch::Indexer->new( { index => $index_name } );
$indexer->update_mappings();
# We do want to update the mappings in the DB in case ES gets switched on
# but just skip the ES engine update if ES not enabled
my $searchengine =
$dbh->selectrow_array(q|SELECT value FROM systempreferences WHERE variable = 'SearchEngine'|);
if ( $searchengine eq 'Elasticsearch' ) {
my $index_name = $Koha::SearchEngine::Elasticsearch::BIBLIOS_INDEX;
my $indexer = Koha::SearchEngine::Elasticsearch::Indexer->new( { index => $index_name } );
$indexer->update_mappings();
} else {
say $out "ES disabled, mappings not updated";
}
say $out "Updated ES mappings to make local-number sortable";
} elsif ( !defined $local_number_map_id ) {
say_warning( $out, "No mapping defined for local-number" );

View File

@ -0,0 +1,21 @@
use Modern::Perl;
use Koha::Installer::Output qw(say_warning say_success say_info);
return {
bug_number => "42764",
description => "Fix typo in reports_dictionary.report_area column comment",
up => sub {
my ($args) = @_;
my ( $dbh, $out ) = @$args{qw(dbh out)};
$dbh->do(
q{
ALTER TABLE `reports_dictionary`
MODIFY COLUMN `report_area` varchar(6) DEFAULT NULL
COMMENT 'Koha module this definition is for (Circulation, Catalog, Patrons, Acquisitions, Accounts)'
}
);
say_success( $out, "Fixed typo in reports_dictionary.report_area column comment" );
},
};

View File

@ -0,0 +1,7 @@
use Modern::Perl;
return {
bug_number => undef,
description => 'Koha 26.05.01 release',
up => sub { },
}

View File

@ -1996,7 +1996,7 @@ tables:
- " <tr></tr>"
- " <tr>"
- " <th colspan=\"2\" class=\"centerednames\">"
- " <h2><u>Refund Payout Receipt</u></h2>"
- " <h2><u>Refund payout receipt</u></h2>"
- " </th>"
- " </tr>"
- " <tr></tr>"

View File

@ -5804,7 +5804,7 @@ CREATE TABLE `reports_dictionary` (
`date_created` datetime DEFAULT NULL COMMENT 'date and time this definition was created',
`date_modified` datetime DEFAULT NULL COMMENT 'date and time this definition was last modified',
`saved_sql` mediumtext DEFAULT NULL COMMENT 'SQL snippet for us in reports',
`report_area` varchar(6) DEFAULT NULL COMMENT 'Koha module this definition is for Circulation, Catalog, Patrons, Acquistions, Accounts)',
`report_area` varchar(6) DEFAULT NULL COMMENT 'Koha module this definition is for (Circulation, Catalog, Patrons, Acquisitions, Accounts)',
PRIMARY KEY (`id`),
KEY `dictionary_area_idx` (`report_area`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

View File

@ -341,3 +341,9 @@ fieldset {
#cataloguing_additem_itemlist {
overflow : visible !important;
}
@media print {
.no-print {
display: none;
}
}

View File

@ -430,7 +430,7 @@
render: function (data, type, row, meta) {
let node = "";
let item_type_description = row._strings.item_type_id ? row._strings.item_type_id.str : row.item_type_id;
if (Koha.prefs.noItemTypeImages) {
if (!Koha.prefs.noItemTypeImages) {
let image_location = item_type_image_locations[row.item_type_id];
node += image_location ? '<img class="itemtype-image" src="%s" alt="" /> '.format(escape_str(image_location), escape_str(item_type_description), escape_str(item_type_description)) : "";
}

View File

@ -78,12 +78,12 @@
[% CASE 'sort1' %]
<li>
<label>Sort 1:</label>
[% PROCESS 'av-build-dropbox.inc' no_id => 1, name="sort1_filter", category="Bsort1", empty=1, size = 20 %]
[% PROCESS 'av-build-dropbox.inc' no_id => 1, name="sort1_filter", default="", category="Bsort1", empty=1, size = 20 %]
</li>
[% CASE 'sort2' %]
<li>
<label>Sort 2:</label>
[% PROCESS 'av-build-dropbox.inc' no_id => 1, name="sort2_filter", category="Bsort2", empty=1, size = 20 %]
[% PROCESS 'av-build-dropbox.inc' no_id => 1, name="sort2_filter", default="", category="Bsort2", empty=1, size = 20 %]
</li>
[% CASE 'search_field' %]
<li> [% INCLUDE patron_fields_dropdown %] </li>

View File

@ -6,12 +6,11 @@
[% Koha.Preference('IntranetSlipPrinterJS') | $raw %]
[% ELSE %]
let autoprint = true;
$( window ).load(function() {
window.addEventListener('load', function() {
window.print();
window.onafterprint = function () {
window.close();
}
setTimeout('window.close()', 1000); //Hack from Chrome < 63
});
[% END %]
</script>

View File

@ -896,7 +896,7 @@
<li> The <a href="http://www.myacpl.org/">Athens County Public Libraries</a>, Ohio, USA (MARC sponsorship, documentation, template maintenance)</li>
<li> <a href="http://www.emn.fr">EMN (Ecole des Mines de Nantes)</a>, France (Suggestions, Stats wizards and improved LDAP sponsorship) </li>
<li> <a href="http://www.mines-paristech.fr">Mines Paristech (previously Ecole Nationale Supérieure des Mines de Paris)</a>, France (bibliographic frameworks, MARC authorities, OPAC basket, Serials sponsorship) </li>
<li> <a href="http://www.mediathequeouestprovence.fr/">SAN-Ouest Provence</a>, France (Koha 3.0 enhancements to patrons and holds modules) </li>
<li> <a href="http://www.mediathequeouestprovence.fr/">SAN-Ouest Provence</a>, France (Koha 3.0 enhancements to patrons and holds modules) [%# codespell:ignore provence %]</li>
<li> The <a href="http://ccfls.org">Crawford County Federated Library System</a>, PA, USA (Koha 3.0 Zebra Integration sponsorship)</li>
<li> The <a href="http://www.geauga.lib.oh.us/">Geauga County Public Library</a>, OH, USA (Koha 3.0 beta testing)</li>
<li> The <a href="http://library.neu.edu.tr">Near East University</a>, Cyprus</li>

View File

@ -126,16 +126,20 @@
[% IF edifact_enabled && edifact_messages.size > 0 %]
[% SET quote_messages = [] %]
[% SET order_messages = [] %]
[% SET ordrsp_messages = [] %]
[% FOR message IN edifact_messages %]
[% IF message.message_type == 'QUOTE' %]
[% quote_messages.push(message) %]
[% ELSIF message.message_type == 'ORDERS' %]
[% order_messages.push(message) %]
[% ELSIF message.message_type == 'ORDRSP' %]
[% ordrsp_messages.push(message) %]
[% END %]
[% END %]
[% IF quote_messages.size > 0 && order_messages.size > 0 %]
<!-- Both quote and order messages exist -->
[% SET total_messages = quote_messages.size + order_messages.size + ordrsp_messages.size %]
[% IF total_messages > 1 %]
<!-- Multiple messages exist - show dropdown -->
<div class="btn-group">
<button class="btn btn-default dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false"> <i class="fa fa-file-text"></i> View EDIFACT interchanges </button>
<ul class="dropdown-menu">
@ -153,6 +157,13 @@
</a>
</li>
[% END %]
[% FOR message IN ordrsp_messages %]
<li>
<a class="dropdown-item view_edifact_message" href="#" data-message-id="[% message.id | html %]" data-basketno="[% basketno | html %]" data-basketname="[% basketname | html %]">
<i class="fa fa-reply"></i> View order response ([% message.transfer_date | $KohaDates %])
</a>
</li>
[% END %]
</ul>
</div>
[% ELSIF quote_messages.size > 0 %]
@ -169,6 +180,13 @@
<i class="fa fa-shopping-cart"></i> View EDIFACT order
</button>
</div>
[% ELSIF ordrsp_messages.size > 0 %]
<!-- Only order response messages exist -->
<div class="btn-group">
<button type="button" class="btn btn-default view_edifact_message" data-message-id="[% ordrsp_messages.0.id | html %]" data-basketno="[% basketno | html %]" data-basketname="[% basketname | html %]">
<i class="fa fa-reply"></i> View EDIFACT order response
</button>
</div>
[% END %]
[% END %]
@ -338,16 +356,20 @@
[% IF edifact_enabled && edifact_messages.size > 0 %]
[% SET quote_messages = [] %]
[% SET order_messages = [] %]
[% SET ordrsp_messages = [] %]
[% FOR message IN edifact_messages %]
[% IF message.message_type == 'QUOTE' %]
[% quote_messages.push(message) %]
[% ELSIF message.message_type == 'ORDERS' %]
[% order_messages.push(message) %]
[% ELSIF message.message_type == 'ORDRSP' %]
[% ordrsp_messages.push(message) %]
[% END %]
[% END %]
[% IF quote_messages.size > 0 && order_messages.size > 0 %]
<!-- Both quote and order interchanges exist -->
[% SET total_messages = quote_messages.size + order_messages.size + ordrsp_messages.size %]
[% IF total_messages > 1 %]
<!-- Multiple messages exist - show dropdown -->
<div class="btn-group">
<button class="btn btn-default dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false"> <i class="fa fa-file-text"></i> View EDIFACT interchanges </button>
<ul class="dropdown-menu">
@ -365,10 +387,17 @@
</a>
</li>
[% END %]
[% FOR message IN ordrsp_messages %]
<li>
<a class="dropdown-item view_edifact_message" href="#" data-message-id="[% message.id | html %]" data-basketno="[% basketno | html %]" data-basketname="[% basketname | html %]">
<i class="fa fa-reply"></i> View order response ([% message.transfer_date | $KohaDates %])
</a>
</li>
[% END %]
</ul>
</div>
[% ELSIF quote_messages.size > 0 %]
<!-- Only quote interchanges exist -->
<!-- Only quote messages exist -->
<div class="btn-group">
<button type="button" class="btn btn-default view_edifact_message" data-message-id="[% quote_messages.0.id | html %]" data-basketno="[% basketno | html %]" data-basketname="[% basketname | html %]">
<i class="fa fa-quote-left"></i> View EDIFACT quote
@ -381,6 +410,13 @@
<i class="fa fa-shopping-cart"></i> View EDIFACT order
</button>
</div>
[% ELSIF ordrsp_messages.size > 0 %]
<!-- Only order response messages exist -->
<div class="btn-group">
<button type="button" class="btn btn-default view_edifact_message" data-message-id="[% ordrsp_messages.0.id | html %]" data-basketno="[% basketno | html %]" data-basketname="[% basketname | html %]">
<i class="fa fa-reply"></i> View EDIFACT order response
</button>
</div>
[% END %]
[% END %]
[% END %]

View File

@ -128,7 +128,7 @@
orderable: true,
render: function (data, type, row, meta) {
let rendered = "";
if (row.type == "QUOTE" || row.type == "ORDERS") {
if (row.type == "QUOTE" || row.type == "ORDERS" || row.type == "ORDRSP") {
if (row.basket_id) {
rendered = '<a href="/cgi-bin/koha/acqui/basket.pl?basketno=' + row.basket_id + '">' + _("Basket") + ": " + row.basket_id + "</a>";
}

View File

@ -72,7 +72,7 @@
[% IF edifact_errors.size > 0 %]
<div class="alert alert-warning">
<h4><i class="fa fa-exclamation-triangle"></i> Processing Errors</h4>
<h4><i class="fa fa-exclamation-triangle"></i> Processing errors</h4>
<ul>
[% FOREACH error IN edifact_errors %]
<li>

View File

@ -327,7 +327,7 @@
<fieldset class="rows" id="match_checks">
<h4>Required match checks</h4>
[% IF ( edit_matching_rule ) %]
[% SET p_style = matchpoints ? 'display:none;' : 'display:block;' %]
[% SET p_style = matchchecks ? 'display:none;' : 'display:block;' %]
<p id="addMatchCheck" style="[% p_style | html %]">
<a href="#" class="btn btn-link" onclick="InsertMatchcheck('mc_1', 'mc_template'); return false;"><i class="fa fa-plus" aria-hidden="true"></i> New match check</a></p
>

View File

@ -99,7 +99,7 @@ Cataloging:
choices:
1: specific item
0: bibliographic record
- as the authoritative item type (for determining circulation and fine rules, for displaying an item type icon on either opac detail or results page, etc).
- as the authoritative item type (for determining circulation and fine rules, for displaying an item type icon on either OPAC detail or results page, etc).
-
- Map the MARC subfields
- pref: itemcallnumber
@ -278,7 +278,7 @@ Cataloging:
- pref: OpacSuppressionByIPRange
class: short
- (Leave blank if not used. Define a range like <code>192.168.</code>.)
- <br />Redirect the opac detail page for suppressed records to
- <br />Redirect the OPAC detail page for suppressed records to
- pref: OpacSuppressionRedirect
choices:
1: "an explanatory page ('This record is blocked')."

View File

@ -369,7 +369,7 @@ Circulation:
now: the current date
- . For automatic renewals see <a href="/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=AutomaticRenewalPeriodBase">AutomaticRenewalPeriodBase.</a>
-
- When renewing checkouts automaticaly, base the new due date on
- When renewing checkouts automatically, base the new due date on
- pref: AutomaticRenewalPeriodBase
choices:
date_due: the old due date of the checkout

View File

@ -83,7 +83,7 @@ Enhanced content:
-
- Access Novelist Select using user profile
- pref: NovelistSelectProfile
- on the opac
- on the OPAC
-
- Access Novelist Select using user profile
- pref: NovelistSelectStaffProfile

View File

@ -32,7 +32,7 @@ Tools:
- Include the stylesheet at
- pref: AllNoticeStylesheet
class: url
- on notices regarless of message transport type. (This should be a complete URL, starting with <code>http://</code>.)
- on notices regardless of message transport type. (This should be a complete URL, starting with <code>http://</code>.)
-
- "Include the following CSS on all notices regardless of message transport:"
- pref: AllNoticeCSS

View File

@ -60,10 +60,14 @@
[% SWITCH m.code %]
[% CASE 'error_on_update' %]
<span>An error occurred trying to open the server for editing. The passed ID is invalid.</span>
[% CASE 'error_on_test' %]
<span>Failed to send test email.</span>
[% CASE 'error_on_insert' %]
<span>An error occurred when adding the server. The library already has an SMTP server set.</span>
[% CASE 'success_on_update' %]
<span>Server updated successfully.</span>
[% CASE 'success_on_test' %]
<span>Test email sent successfully to <em>KohaAdminEmailAddress</em>.</span>
[% CASE 'success_on_insert' %]
<span>Server added successfully.</span>
[% CASE %]
@ -435,6 +439,13 @@
encodeURIComponent(row.name.escapeHtml()) +
'"><i class="fa fa-trash-can" aria-hidden="true"></i> ' +
_("Delete") +
"</a>" +
"\n";
result +=
'<a class="btn btn-default btn-xs submit-form-link" role="button" href="#" data-action="/cgi-bin/koha/admin/smtp_servers.pl" data-method="post" data-op="cud-test_email" data-smtp_server_id="' +
encodeURIComponent(row.smtp_server_id) +
'"><i class="fa fa-check-square" aria-hidden="true"></i> ' +
_("Send test email") +
"</a>";
return result;
},

View File

@ -72,7 +72,7 @@
<legend>Merge reference</legend>
<ol>
<li class="radio"
><input type="radio" value="[% recordid1 | uri %]" checked="checked" id="mergereference1" name="mergereference" onclick="changeFramework('[% frameworkcode1 | html %]')" /><label for="mergereference1"
><input type="radio" value="[% recordid1 | uri %]" checked="checked" id="mergereference1" name="mergereference" class="change_framework" data-framework="[% frameworkcode1 | html %]" /><label for="mergereference1"
>[% title1 | html %] [% FOREACH subtitl1 IN subtitle1 %][% subtitl1 | html %][% END %] (<a
href="/cgi-bin/koha/authorities/detail.pl?authid=[% recordid1 | uri %]"
title="MARC"
@ -83,7 +83,7 @@
></li
>
<li class="radio"
><input type="radio" value="[% recordid2 | uri %]" id="mergereference2" name="mergereference" onclick="changeFramework('[% frameworkcode2 | html %]')" /><label for="mergereference2"
><input type="radio" value="[% recordid2 | uri %]" id="mergereference2" name="mergereference" class="change_framework" data-framework="[% frameworkcode2 | html %]" /><label for="mergereference2"
>[% title2 | html %] [% FOREACH subtitl2 IN subtitle2 %][% subtitl2 | html %][% END %] (<a
href="/cgi-bin/koha/authorities/detail.pl?authid=[% recordid2 | uri %]"
title="MARC"
@ -146,7 +146,7 @@
[% Asset.js("js/authorities.js") | $raw %]
[% Asset.js("js/merge-record.js") | $raw %]
<script nonce="[% Koha.CSPNonce | $raw %]">
// When submiting the form
// When submitting the form
function mergeformsubmit() {
$('#tabs').remove();
}
@ -166,11 +166,15 @@
if( $("#tabs .tab-pane.active").length < 1 ){
$("#tabs a:first").tab("show");
}
$(".change_framework").on("click", function () {
let framework = $(this).data("framework");
changeFramework(framework);
});
});
function changeFramework(fw) {
$("#Frameworks").val(fw);
$("#frameworkcode").val(fw);
}
</script>
[% END %]

View File

@ -1250,7 +1250,7 @@
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-primary">Submit</button>
<button class="btn btn-default" data-bs-dismiss="modal">Close</button>
<button type="button" class="btn btn-default" data-bs-dismiss="modal">Close</button>
</div>
</form>
</div>

View File

@ -297,7 +297,7 @@
</div>
<!-- /.page-section -->
[% ELSE %]
<div class="alert alert-info" id="searchresult-breeding"> [% tx("No reservoir search results for '{query}'", {query = query}) | html %] </div>
<div class="alert alert-info"> [% tx("No reservoir search results for '{query}'", {query = query}) | html %] </div>
[% END # /IF breeding_loop %]
</div>
<!-- /#searchresult-breeding -->

View File

@ -131,7 +131,7 @@
[% END %]
[% END %]
[% IF can_be_edited %]
[% tr_class.push = 'editable' %]
[% tr_class.push('editable') %]
[% END %]
<tr id="row[% item.itemnumber | html %]" class="[% tr_class.join(' ') | html %]" title="[% tr_title | html %]">
[% UNLESS can_be_edited %]

View File

@ -286,7 +286,7 @@
return missing;
}
// When submiting the form
// When submitting the form
function mergeformsubmit() {
var missing = check_mandatory();
var alert_msg = '';

View File

@ -167,7 +167,7 @@
<span>To be staged ([% to_be_staged.count | html %])</span>
[% END %]
[% WRAPPER tab_item tabname= "staged-and-ready" bt_active = staged_and_ready_active %]
<span>Staged & ready ([% staged_and_ready.count | html %])</span>
<span>Staged and ready ([% staged_and_ready.count | html %])</span>
[% END %]
[% WRAPPER tab_item tabname= "patron-is-outside" bt_active = patron_is_outside_active %]
<span>Patron is outside ([% patron_outside.count | html %])</span>

View File

@ -59,7 +59,7 @@
</div>
[% END %]
<form name="payForm" id="payForm" method="post" action="/cgi-bin/koha/pos/pay.pl">
<form name="payForm" id="payForm" method="post" action="/cgi-bin/koha/pos/pay.pl" [% IF Koha.Preference('FinePaymentAutoPopup') %]target="_blank"[% END %]>
[% INCLUDE 'csrf-token.inc' %]
<input type="hidden" name="op" value="cud-pay" />
<div class="row">
@ -240,11 +240,6 @@
</div>
</div>
[% IF payment_id && Koha.Preference('FinePaymentAutoPopup') %]
<!-- Automatic Print Receipt -->
<a id="printReceipt" style="display: none" href="#"></a>
[% END %]
[% MACRO jsinclude BLOCK %]
[% INCLUDE 'format_price.inc' %]
[% INCLUDE 'datatables.inc' %]
@ -522,17 +517,22 @@
})
.appendTo("#payForm");
});
if (Koha.prefs.FinePaymentAutoPopup) {
// Form submits to new tab; reset this page for the next transaction
setTimeout(function () {
sale_kohaTable.api().clear().draw();
$("#tendered").val("");
$("#paid").val(zero_formatted);
$("#change").html(zero_formatted);
$(':input[name="change"]').val(zero_formatted);
checked = false;
}, 0);
}
return true;
}
});
if (payment_id && Koha.prefs.FinePaymentAutoPopup) {
$("#printReceipt").click(function () {
var win = window.open(`/cgi-bin/koha/pos/printreceipt.pl?action=print&accountlines_id=${payment_id}&tendered=${tendered}&change=${change}`, "_blank");
win.focus();
});
$("#printReceipt").click();
}
});
</script>
[% END %]

View File

@ -38,8 +38,41 @@
[% END %]
</div>
[% IF error_msg %]
<div class="alert alert-danger">
<p>[% error_msg | html %]</p>
<button id="close-window" class="btn btn-secondary" onclick="window.close();"> [% t("Close") | html %] </button>
</div>
[% ELSE %]
<div class="no-print" style="margin-top: 20px; text-align: center;">
<button id="print-receipt" class="btn btn-primary"> <i class="fa fa-print"></i> [% t("Print receipt") | html %] </button>
<button id="close-window" class="btn btn-secondary" onclick="window.close();"> [% t("Close") | html %] </button>
</div>
[% END %]
[% MACRO jsinclude BLOCK %]
[% INCLUDE 'slip-print.inc' #printThenClose %]
<script nonce="[% Koha.CSPNonce | $raw %]">
[% IF ( Koha.Preference('IntranetSlipPrinterJS') ) %]
[% Koha.Preference('IntranetSlipPrinterJS') | $raw %]
[% ELSE %]
function doPrint() {
window.print();
}
window.onafterprint = () => {
window.close();
};
window.addEventListener('load', () => {
if ( [% autoprint | html %] == 1 ) {
doPrint();
}
});
document.getElementById('print-receipt')
.addEventListener('click', doPrint);
[% END %]
</script>
[% END %]
[% INCLUDE 'intranet-bottom.inc' %]

View File

@ -247,7 +247,7 @@
<a href="/cgi-bin/koha/reports/guided_reports.pl?op=add_form_sql" class="btn btn-primary">Create report from SQL</a>
[% END %]
<h2>Reports Dictionary</h2>
<h2>Reports dictionary</h2>
<p>Use the reports dictionary to define custom criteria to use in your reports</p>
<a href="/cgi-bin/koha/reports/dictionary.pl?op=list" class="btn btn-primary">View dictionary</a>
[% END # /IF (start) %]
@ -1636,25 +1636,25 @@
[% IF ( errors ) %]
<form action="/cgi-bin/koha/reports/guided_reports.pl" method="get">
<div class="alert alert-warning">
<strong>The following error was encountered:</strong><br />
<h1>The following error was encountered:</h1>
[% FOREACH error IN errors %]
[% IF ( error.duplicate_running_report ) %]
This report is already running. Please wait for it to finish before running it again.
<p>This report is already running. Please wait for it to finish before running it again.</p>
[% ELSIF ( error.total_running_reports_limit_exceeded ) %]
You have too many reports running at the moment. Please wait for some of them to finish before running this report again.
<p>You have too many reports running at the moment. Please wait for some of them to finish before running this report again.</p>
[% ELSIF ( error.sqlerr ) %]
This report contains the SQL keyword <strong>[% error.sqlerr | html %]</strong>.<br />
Use of this keyword is not allowed in Koha reports due to security and data integrity risks. Only SELECT queries are allowed.<br />
Please return to the &quot;Saved Reports&quot; screen and delete this report or retry creating a new one.
<p>This report contains an SQL keyword: <strong>[% error.sqlerr | html %]</strong>. </p>
<p>Use of this keyword is not allowed in Koha reports due to security and data integrity risks. Only SELECT queries are allowed.</p>
<p>Please delete this report or retry creating a new one.</p>
[% ELSIF ( error.queryerr ) %]
<span>The database returned the following error:</span> <br />
[% error.queryerr | html %]<br />Please check the log for further details.
<h2>SQL error:</h2>
<p>[% error.queryerr | html %]</p>
<p>Please check the log for further details.</p>
[% ELSIF ( error.cache_expiry ) %]
Please select a cache expiry less than 30 days.
<p>Please select a cache expiry less than 30 days.</p>
[% ELSIF ( error.passworderr ) %]
The column selection in this report includes a password field.<br />
The report cannot be executed due to security risks.<br />
Please edit this report and ensure no password columns have been selected.
<p>The column selection in this report includes a password field.</p>
<p>The report cannot be executed due to security risks. Please edit this report and ensure no password columns have been selected.</p>
[% ELSE %]
[% END %]

View File

@ -606,7 +606,7 @@
<label for="branchcode">Library:</label>
<select name="branchcode" id="branchcode">
<option value="">Any</option>
[% PROCESS options_for_libraries libraries => Branches.all( selected => suggestion.branchcode ) %]
[% PROCESS options_for_libraries libraries => Branches.all( selected => suggestion.branchcode || default_branch ) %]
</select>
</li>
<li> [% PROCESS funds_dropdown %] </li>

View File

@ -349,7 +349,7 @@
});
});
</script>
[% IF ( show ) %]
[% IF op == 'cud-action' %]
[%- # Loop over fields which may have plugin JavaScript -%]
[%- UNLESS (too_many_items_process) -%]
[%- FOREACH subfield IN subfields -%]

View File

@ -220,7 +220,7 @@
<input type="hidden" name="item_action" value="ignore" />
[% END %]
</ol>
<fieldset class="action"><input type="submit" class="btn btn-primary" value="Apply different matching rules" /></fieldset>
<fieldset class="action"><input type="submit" class="btn btn-secondary" value="Apply different matching rules" /></fieldset>
</fieldset>
</form>
<div>
@ -256,7 +256,7 @@
</fieldset>
[% END %]
<fieldset class="action">
<input type="submit" class="button" name="mainformsubmit" value="Import this batch into the catalog" />
<input type="submit" class="btn btn-primary" name="mainformsubmit" value="Import this batch into the catalog" />
</fieldset>
</form>
<!-- /#import_batch_form -->

View File

@ -15,7 +15,7 @@
"dt_shelfname":
"<a href='/cgi-bin/koha/virtualshelves/shelves.pl?op=view&shelfnumber=[% d.shelfnumber | html %]'>[% d.shelfname | html | $To %]</a>",
"dt_count":
"[% tnx('{count} item', '{count} items', count, { count = d.count }) | $raw %]",
"[% tnx('{count} item', '{count} items', d.count, { count = d.count }) | $raw %]",
"dt_is_shared":
"[% IF d.public %]<span>Public</span>[% ELSIF d.is_shared %]<span>Shared</span>[% ELSE %]<span>Private</span>[% END %]",
"dt_owner":

View File

@ -6,7 +6,7 @@ KOHA.browser = function (searchid, biblionumber) {
var me = this;
if (!searchid) {
// We are generating a clean numeric datetime representation so we can easily compare them using the default javascript lexigraphic sorter.
// We are generating a clean numeric datetime representation so we can easily compare them using the default javascript lexicographic sorter.
searchid = "scs_" + new Date().getTime(); // scs for Staff Client Search
}
me.searchid = searchid;

View File

@ -330,7 +330,7 @@ function CloneField(index, hideMarc, advancedMARCEditor) {
// do nothing if label does not exist.
}
// setting its '+' and '-' buttons
// setting its '+', '-' and 'buttonDot' buttons
try {
var anchors = divs[i].getElementsByTagName("a");
for (var j = 0; j < anchors.length; j++) {
@ -352,6 +352,13 @@ function CloneField(index, hideMarc, advancedMARCEditor) {
divs[i].getAttribute("id") +
"'); return false;"
);
} else if (
anchors[j].getAttribute("id").match(/^buttonDot/)
) {
anchors[j].setAttribute(
"id",
anchors[j].getAttribute("id") + new_key
);
}
}
} catch (e) {
@ -843,12 +850,12 @@ $(document).ready(function () {
// We use delegated event handlers here so that dynamically added elements
// (like when cloning a field or a subfield) respond to these events
// without having to re-attach events manually
$(".marc_editor").on(
$(".marc_editor, .item_edit_form").on(
"click",
".tag_editor.framework_plugin",
callClickPluginEventHandler
);
$(".marc_editor").on(
$(".marc_editor, .item_edit_form").on(
"focusin focusout change mousedown mouseup keydown keyup",
"input.input_marceditor.framework_plugin",
callPluginEventHandler

View File

@ -1251,6 +1251,7 @@ function _dt_save_restore_state(table_settings, external_filter_nodes = {}) {
}
state = _dt_force_visibility(table_settings, this.api(), state);
state.start = 0;
return state;
};

View File

@ -80,7 +80,8 @@ class HttpClient {
let json = JSON.parse(text);
message =
json.error ||
json.errors.map(e => e.message).join("\n") ||
json.errors?.map(e => e.message).join("\n") ||
json.message ||
json;
} else {
message = response.statusText;

View File

@ -1387,17 +1387,17 @@ async function load_patron_holds_table(biblio_id, split_data) {
select += '" disabled="disabled">';
selected = " selected='selected' ";
value = "T";
desc = "In transit";
desc = __("In transit");
} else if (data == i && row.status == "P") {
select += '" disabled="disabled">';
selected = " selected='selected' ";
value = "P";
desc = "In processing";
desc = __("In processing");
} else if (data == i && row.status == "W") {
select += '" disabled="disabled">';
selected = " selected='selected' ";
value = "W";
desc = "Waiting";
desc = __("Waiting");
} else if (data == i && !row.status) {
select += '">';
selected = " selected='selected' ";
@ -1426,13 +1426,19 @@ async function load_patron_holds_table(biblio_id, split_data) {
} else {
if (row.status == "T") {
select +=
'" disabled="disabled"><option value="T" selected="selected">In transit</option></select>';
'" disabled="disabled"><option value="T" selected="selected">' +
__("In transit") +
"</option></select>";
} else if (row.status == "P") {
select +=
'" disabled="disabled"><option value="P" selected="selected">In processing</option></select>';
'" disabled="disabled"><option value="P" selected="selected">' +
__("In processing") +
"</option></select>";
} else if (row.status == "W") {
select +=
'" disabled="disabled"><option value="W" selected="selected">Waiting</option></select>';
'" disabled="disabled"><option value="W" selected="selected">' +
__("Waiting") +
"</option></select>";
} else {
if (
HoldsSplitQueue !== "nothing" &&
@ -1476,7 +1482,9 @@ async function load_patron_holds_table(biblio_id, split_data) {
let buttons =
'<a class="hold-arrow move-hold ' +
table_class +
'" title="Move hold up" href="#" data-move-hold="up" data-priority="' +
'" title="' +
__("Move hold up") +
'" href="#" data-move-hold="up" data-priority="' +
row.priority +
'" reserve_id="' +
row.hold_id +
@ -1484,7 +1492,9 @@ async function load_patron_holds_table(biblio_id, split_data) {
buttons +=
'<a class="hold-arrow move-hold ' +
table_class +
'" title="Move hold to top" href="#" data-move-hold="top" data-priority="' +
'" title="' +
__("Move hold to top") +
'" href="#" data-move-hold="top" data-priority="' +
row.priority +
'" reserve_id="' +
row.hold_id +
@ -1492,7 +1502,9 @@ async function load_patron_holds_table(biblio_id, split_data) {
buttons +=
'<a class="hold-arrow move-hold ' +
table_class +
'" title="Move hold to bottom" href="#" data-move-hold="bottom" data-priority="' +
'" title="' +
__("Move hold to bottom") +
'" href="#" data-move-hold="bottom" data-priority="' +
row.priority +
'" reserve_id="' +
row.hold_id +
@ -1500,7 +1512,9 @@ async function load_patron_holds_table(biblio_id, split_data) {
buttons +=
'<a class="hold-arrow move-hold ' +
table_class +
'" title="Move hold down" href="#" data-move-hold="down" data-priority="' +
'" title="' +
__("Move hold down") +
'" href="#" data-move-hold="down" data-priority="' +
row.priority +
'" reserve_id="' +
row.hold_id +

View File

@ -47,5 +47,9 @@ function updateProgress(job_id, callbacks) {
updateProgress(job_id, callbacks);
}, 1 * 1000);
}
}).fail(function () {
setTimeout(function () {
updateProgress(job_id, callbacks);
}, 1 * 1000);
});
}

View File

@ -20,6 +20,7 @@
"</span>";
}
let name;
var firstname = escape_str(patron.firstname);
var preferred_name = escape_str(patron.preferred_name);
var surname = escape_str(patron.surname);

View File

@ -59,7 +59,7 @@ export default {
name: "can_be_edited",
type: "checkbox",
label: $__("Can be edited"),
value: false,
defaultValue: false,
},
],
});

View File

@ -110,7 +110,7 @@ export default {
},
{
name: "securityCode",
label: $__("Security Code"),
label: $__("Security code"),
required: true,
type: "text",
hideIn: ["List"],

View File

@ -166,8 +166,8 @@ export default {
<thead>
<tr>
<th>${$__("Barcode")}</th>
<th>${$__("Home Library")}</th>
<th>${$__("Holding Library")}</th>
<th>${$__("Home library")}</th>
<th>${$__("Holding library")}</th>
<th>${$__("Action")}</th>
</tr>
</thead>
@ -175,7 +175,7 @@ export default {
result.forEach(item => {
const barcode =
item.external_id || $__("No Barcode");
item.external_id || $__("No barcode");
const home_library =
item.home_library_id?.name ||
item.home_library_id ||
@ -937,14 +937,14 @@ export default {
resourceAttrs: [
{
name: "iso18626_request_id",
label: $__("Supplying Agency Request ID"),
label: $__("Supplying agency request ID"),
type: "text",
hideIn: ["Form"],
group: $__("Request details"),
},
{
name: "iso18626_requesting_agency_id",
label: $__("Requesting Agency"),
label: $__("Requesting agency"),
type: "relationshipSelect",
showElement: {
type: "text",
@ -997,7 +997,7 @@ export default {
},
{
name: "requestingAgencyRequestId",
label: $__("Requesting Agency Request ID"),
label: $__("Requesting agency request ID"),
type: "text",
hideIn: ["List", "Form"],
group: $__("Request details"),

View File

@ -4,7 +4,7 @@
<p>
{{ $__("Customize your dashboard by adding widgets.") }}
<a href="#" id="open-widget-picker" @click="toggleWidgetPicker">
{{ $__("Open Widget Picker") }}
{{ $__("Open widget picker") }}
</a>
</p>
</div>

View File

@ -13,7 +13,7 @@
type="button"
@click="visitOldILLModule"
>
{{ $__("Visit ILL requests (previously ILL Module)") }}
{{ $__("Visit ILL requests (previously ILL module)") }}
</button>
</div>
</template>
@ -157,10 +157,10 @@ export default {
const baseWidget = useBaseWidget(
{
id: "ILLRequests",
name: $__("ILL Requests"),
name: $__("ILL requests"),
icon: "fa fa-download",
description: $__(
"Show ILL requests that need action. It filters requests by status and library. Provides a button to visit the ILL requests (previously ILL Module). This widget is configurable."
"Show ILL requests that need action. It filters requests by status and library. Provides a button to visit the ILL requests (previously ILL module). This widget is configurable."
),
loading: false,
settings: settings,

View File

@ -216,7 +216,7 @@ export default {
return baseElement.accessNestedProperty(valueKey, resource);
}
const displayValue = attr.format(resource[valueKey], resource);
if (displayValue == "Invalid Date") {
if (displayValue == "Invalid date") {
return "";
}
return displayValue || "";

View File

@ -36,7 +36,7 @@ import {
* @param {Boolean} resourceConfig.table.addAdditionalFilters - A flag to indicate whether to add filters to the list component for the datatable.
* @param {Object} resourceConfig.table.filters - The table filters for the resource. Follows the format for the resourceAttrs parameter.
* @param {Function} resourceConfig.afterResourceFetch - A function to call after the resource is fetched. This can be used to edit resource data or fetch additional data
* @param {Boolean} resourceConfig.embedded - A flag to indicate whether the resource is actually being used as a child component of another resource e.g. embedding a list of agreeements into EBSCO package agreements
* @param {Boolean} resourceConfig.embedded - A flag to indicate whether the resource is actually being used as a child component of another resource e.g. embedding a list of agreements into EBSCO package agreements
* @param {String} resourceConfig.extendedAttributesResourceType - The resource type for extended attributes, if applicable.
* @param {String} resourceConfig.extendedAttributesFieldGroup - The field group that you would like the additional fields to be displayed in.
* @param {Function} resourceConfig.defaultToolbarButtons - A function to amend default buttons in the toolbar.

View File

@ -1,3 +1,12 @@
@use "~@fortawesome/fontawesome-free/scss/variables" with (
// koha-tmpl/opac-tmpl/lib/fontawesome/webfonts
$font-path: "../../lib/fontawesome/webfonts"
);
@use "~@fortawesome/fontawesome-free/scss/fontawesome";
@use "~@fortawesome/fontawesome-free/scss/fa" as fa;
@use "~@fortawesome/fontawesome-free/scss/solid" as fa-solid;
@use "~@fortawesome/fontawesome-free/scss/brands" as fa-brands;
/* Bootstrap variable customizations */
:root {
@ -357,7 +366,7 @@ textarea,
&::before {
color: #4466AE;
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
padding-right: .5em;
}
@ -423,7 +432,7 @@ div.dt-button-collection button.dt-button.buttons-columnVisibility::before {
color: #C00;
content: "\f00d";
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
margin-right: .5em;
width: 1em;
}
@ -438,7 +447,7 @@ div.dt-button-collection button.dt-button.buttons-columnVisibility:hover::before
color: #538200;
content: "\f00c";
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
margin-right: .5em;
width: 1em;
}
@ -462,7 +471,7 @@ div.dt-button-collection button.dt-button.buttons-columnVisibility.active:hover:
color: #C00;
content: "\f00d";
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
margin-right: .5em;
width: 1em;
}
@ -476,7 +485,7 @@ div.dt-button-collection button.dt-button.buttons-columnVisibility.active::befor
color: $base-theme-color;
content: "\f00c";
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
margin-right: .5em;
width: 1em;
}
@ -500,7 +509,7 @@ div.dt-button-collection button.dt-button.buttons-print:hover {
div.dt-button-collection button.dt-button.buttons-html5:not( .disabled )::before {
color: #222BAC;
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
margin-right: .5em;
width: 1em;
}
@ -521,7 +530,7 @@ div.dt-button-collection button.dt-button.buttons-print:not( .disabled )::before
color: #222BAC;
content: "\f02f";
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
margin-right: .5em;
width: 1em;
}
@ -664,7 +673,7 @@ div.dt-container .dt-length {
&::before,
&::after {
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
width: 1em;
}
}
@ -879,7 +888,7 @@ table {
&.dt-orderable-desc span.dt-column-order::after,
&.dt-ordering-desc span.dt-column-order::after {
display: block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
font-size: 1rem;
line-height: .5rem;
}

View File

@ -381,7 +381,7 @@
&::before {
content: "\f0da";
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
width: 1em;
}
}
@ -407,7 +407,7 @@
&::before {
content: "\f0d7";
display: inline-block;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
width: 1em;
}
}

View File

@ -496,6 +496,7 @@ th {
margin: 0 2px;
padding: 2px 4px;
text-shadow: 1px 0 1px rgba( 0, 0, 0, .25 );
width: 1.6em;
&.rsssearchicon {
font-size: 70%;
@ -1906,7 +1907,7 @@ nav {
.facet-toggle::before {
color: #5A5A5A;
content: "\f0da";
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
font-size: 90%;
line-height: 1.5em;
padding: 0 0.35em 0 0;
@ -1923,7 +1924,7 @@ nav {
color: #5A5A5A;
content: "\f0c8";
cursor: default;
font-family: "Font Awesome 6 Free";
font-family: "Font Awesome 7 Free";
font-size: 50%;
line-height: 1.5em;
padding: .7em 1em 0 0;
@ -2715,7 +2716,7 @@ $star-selected: #EDB867;
white-space: nowrap;
span,a {
font: normal normal normal 20px/1 "Font Awesome 6 Free";
font: normal normal normal 20px/1 "Font Awesome 7 Free";
-webkit-font-smoothing: antialiased;
margin-right: 2px;
text-decoration: none;

View File

@ -4,7 +4,7 @@
<input type="hidden" name="op" value="cud-pay" />
[% IF ( ACCOUNT_LINES ) %]
<table class="table table-bordered table-striped finestable" id="finestable">
<caption class="sr-only">Your charges</caption>
<caption class="visually-hidden">Your charges</caption>
<thead>
<tr>
[% IF ENABLE_OPAC_PAYMENTS %]<th>&nbsp;</th>[% END %]

View File

@ -19,7 +19,7 @@
var flatpickr_timeformat_string = [% IF Koha.Preference('TimeFormat') == '12hr' %]"G:i K"[% ELSE %]"H:i"[% END %];
var flatpickr_timeformat = [% IF Koha.Preference('TimeFormat') == '12hr' %]false[% ELSE %]true[% END %];
var flatpickr_dateformat_string = "";
var delimter = "";
var delimiter = "";
var altinput_dateformat = "";
switch ( dateformat_pref ){
case "us":

View File

@ -85,8 +85,5 @@
[% Asset.js('js/i18n.js') | $raw %]
[% Asset.js('js/stores.js') | $raw %]
[% Asset.css("lib/fontawesome/css/fontawesome.min.css") | $raw %]
[% Asset.css("lib/fontawesome/css/brands.min.css") | $raw %]
[% Asset.css("lib/fontawesome/css/solid.min.css") | $raw %]
[% PROCESS 'html_helpers.inc' %]
[% KohaPlugins.get_plugins_opac_head | $raw %]

View File

@ -81,7 +81,7 @@
[% CASE 'Languages' %]
<a [% attrs | $raw %] id="facet-languages">Languages</a>
[% CASE %]
<a [% attrs | $raw %] id="facet-[% facets_loo.type_link_value | html %]">[% facets_loo.type_id | html %]</a>
<a [% attrs | $raw %] id="facet-[% facets_loo.type_link_value | html %]">[% facets_loo.label | html %]</a>
[% END %]
<div class="facet-collapse collapse show" id="[% facets_loo.type_id | html %]_collapse">
<ul>

View File

@ -26,8 +26,8 @@
[% END %]
[% FOREACH PAGE_NUMBER IN PAGE_NUMBERS %]
[% IF ( PAGE_NUMBER.highlight ) %]
<li class="page-item active" aria-current="active">
<a class="page-link" href="#" aria-label="Current page: Page [% PAGE_NUMBER.pg | html %]" aria-current="true">[% PAGE_NUMBER.pg | html %]</a>
<li class="page-item active">
<a class="page-link" href="#" aria-label="Current page: Page [% PAGE_NUMBER.pg | html %]" aria-current="page">[% PAGE_NUMBER.pg | html %]</a>
</li>
[% ELSE %]
<li class="page-item">

View File

@ -7,7 +7,7 @@
[%- IF ( starting_location ) %]<span>Shelving location:</span> [%- starting_location | html -%][% END -%]
[%- IF ( starting_homebranch && starting_ccode ) %],[% END %]
[%- IF ( starting_ccode ) %]<span>Collection: [%- starting_ccode | html -%]</span>[% END -%]
<a style="font-size: 75%;" href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% biblionumber | html %]" class="close_shelf">Close shelf browser <span class="sr-only">(Hides shelf browser)</span></a>
<a style="font-size: 75%;" href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% biblionumber | html %]" class="close_shelf">Close shelf browser <span class="visually-hidden">(Hides shelf browser)</span></a>
</h2>
<table class="table" role="presentation ">

View File

@ -174,7 +174,7 @@
<fieldset>
<legend>Picture</legend>
<label for="graphics-type" class="sr-only">Graphics type</label>
<label for="graphics-type" class="visually-hidden">Graphics type</label>
<select id="graphics-type" name="limit" class="subtype">
<option value="">Any</option>
<option value="Graphics-type:a">collage</option>
@ -188,7 +188,7 @@
<option value="Graphics-type:k">technical drawing</option>
<option value="Graphics-type:z">other non-projected graphic type</option>
</select>
<label for="graphics-support" class="sr-only">Graphics support</label>
<label for="graphics-support" class="visually-hidden">Graphics support</label>
<select id="graphics-support" name="limit" class="subtype">
<option value="">Any</option>
<option value="Graphics-support:a">canvas</option>

View File

@ -16,7 +16,7 @@
</div>
</div>
<label class="sr-only" for="star_rating-[% item.itemnumber | html %]">star rating</label>
<label class="visually-hidden" for="star_rating-[% item.itemnumber | html %]">star rating</label>
<select class="star_rating" id="star_rating-[% item.itemnumber | html %]" name="rating" autocomplete="off" data-biblionumber="[% item.biblionumber | html %]" data-context="rating-[% item.itemnumber | html %]">
[% IF ( rating_avg_int == 0 ) %]
<option value="" selected="selected"></option>

View File

@ -6,7 +6,7 @@
<h2>Clubs currently enrolled in</h2>
<table id="clubs-table-enrolled" class="table table-bordered table-striped">
<caption class="sr-only">Clubs</caption>
<caption class="visually-hidden">Clubs</caption>
<thead>
<tr>
<th class="all">Name</th>

View File

@ -6,7 +6,7 @@
<div class="container-fluid">
<form method="get" id="patron-enrollment-form">
<legend class="sr-only">Enrollment</legend>
<legend class="visually-hidden">Enrollment</legend>
<input type="hidden" name="id" value="[% club.id | html %]" />
<input type="hidden" name="borrowernumber" value="[% borrowernumber | html %]" />
<fieldset class="rows">

View File

@ -48,7 +48,7 @@
<div id="labeledmarc">
<table id="marc" class="table table-bordered table-striped">
<caption class="sr-only">MARC details</caption>
<caption class="visually-hidden">MARC details</caption>
[% FOREACH tab0X IN tab0XX %]
<tr><th colspan="2">[% tab0X.tag | html %]</th></tr>
[% FOREACH subfiel IN tab0X.subfield %]

View File

@ -288,7 +288,7 @@
[% ELSE %]
<h1>Logging on to the catalog has not been enabled by the library.</h1>
<ul>
<li>To report this error, you can email the Koha Administrator. <a href="mailto:[% Koha.Preference( 'KohaAdminEmailAddress' ) | uri %]">Email</a></li>
<li>To report this error, you can email the Koha administrator. <a href="mailto:[% Koha.Preference( 'KohaAdminEmailAddress' ) | uri %]">Email</a></li>
<li>Use top menu bar to navigate to another part of Koha.</li>
</ul>
[% END # / IF opacuserlogin %]

View File

@ -63,7 +63,7 @@
[% IF ( total ) %]
<div class="searchresults">
<table class="table table-bordered table-striped">
<caption class="sr-only">Authority search results</caption>
<caption class="visually-hidden">Authority search results</caption>
<thead>
<tr>
<th>Authorized headings</th>

View File

@ -138,7 +138,7 @@
[% ELSE %]
[% check_title = BIBLIO_RESULT.biblionumber %]
[% END %]
<label for="bib[% BIBLIO_RESULT.biblionumber | html %]" class="sr-only">[% check_title | html %]</label>
<label for="bib[% BIBLIO_RESULT.biblionumber | html %]" class="visually-hidden">[% check_title | html %]</label>
<h2>
<input type="checkbox" class="cb" value="[% BIBLIO_RESULT.biblionumber | html %]" name="bib[% BIBLIO_RESULT.biblionumber | html %]" id="bib[% BIBLIO_RESULT.biblionumber | html %]" />
[% INCLUDE 'biblio-title.inc' biblio=BIBLIO_RESULT %]
@ -338,7 +338,7 @@
[% ELSE %]
<form action="/cgi-bin/koha/opac-basket.pl" method="get" name="bookbag_form" id="bookbag_form">
<table id="itemst" class="table table-bordered table-striped">
<caption class="sr-only">Items in your cart</caption>
<caption class="visually-hidden">Items in your cart</caption>
<thead>
<tr>
<th class="noprint no-sort">&nbsp;</th>
@ -357,7 +357,7 @@
[% ELSE %]
[% check_title = BIBLIO_RESULT.biblionumber %]
[% END %]
<label for="bib[% BIBLIO_RESULT.biblionumber | html %]" class="sr-only">[% check_title | html %]</label>
<label for="bib[% BIBLIO_RESULT.biblionumber | html %]" class="visually-hidden">[% check_title | html %]</label>
<input type="checkbox" class="cb" value="[% BIBLIO_RESULT.biblionumber | html %]" name="bib[% BIBLIO_RESULT.biblionumber | html %]" id="bib[% BIBLIO_RESULT.biblionumber | html %]" />
</td>
<td>

View File

@ -43,7 +43,7 @@
<h1>Browse search</h1>
<form method="get">
<legend class="sr-only">Browse search</legend>
<legend class="visually-hidden">Browse search</legend>
<div class="form-row">
<div class="col">
<label for="browse-searchterm">Search for:</label>

View File

@ -58,7 +58,7 @@
[% END %]
<li style="list-style-type: none;">
<table class="table table-bordered table-striped">
<caption class="sr-only">Items in catalog</caption>
<caption class="visually-hidden">Items in catalog</caption>
<tr>
[% FOREACH LEVEL_LOO IN LEVEL_LOOP %]
<td>

View File

@ -62,7 +62,7 @@
[% IF ( course_reserves ) %]
<div class="rows">
<table id="course-items-table" class="table table-bordered table-striped table-condensed">
<caption class="sr-only">Courses</caption>
<caption class="visually-hidden">Courses</caption>
<thead>
<tr>
<th class="anti-the">Title</th>

Some files were not shown because too many files have changed in this diff Show More