[Bug 41129] New: Migrate place_booking.js to a Vue island.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Bug ID: 41129 Summary: Migrate place_booking.js to a Vue island. Initiative type: --- Sponsorship --- status: Product: Koha Version: Main Hardware: All OS: All Status: NEW Severity: enhancement Priority: P5 - low Component: Circulation Assignee: koha-bugs@lists.koha-community.org Reporter: paul.derscheid@lmscloud.de QA Contact: testopia@bugs.koha-community.org CC: gmcharlt@gmail.com, kyle@bywatersolutions.com Since the bookings functionality requires a significant amount of reactivity due to many interdependent inputs to achieve a good UX, this bug is intended to deprecate place_booking.js in favor of a Vue island that makes this much easier. The goal here is to have a Vue based component that is used for the Staff Interface as well as the OPAC to avoid duplication and diverging implementations and also makes it easier to keep track of problems that then don't need to be fixed in two places. -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Circulation| |Bookings function| | Depends on| |29002 Referenced Bugs: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=29002 [Bug 29002] Add ability to book items ahead of time -- You are receiving this mail because: You are watching all bug changes. You are the assignee for the bug.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Patch complexity|--- |Large patch -- You are receiving this mail because: You are watching all bug changes. You are the assignee for the bug.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #1 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 188546 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=188546&action=edit Bug 41129: [DO NOT PUSH] Add BookingModal.vue, remove place_booking.{inc,js} - Migration to Vue - Pinia store integration - Flatpickr calendar integration with constraint highlighting - Multi-step booking form with validation - Availability checking - API adapter pattern (prep for full APIClient migration) Technical notes: The booking adapters currently use fetch() directly but have been structured to facilitate migration to APIClient pattern. Full APIClient migration requires: - BiblioAPIClient for bookable items/pickup locations - CheckoutAPIClient for checkout queries - CirculationRulesAPIClient for rules endpoint - PatronAPIClient.search() method enhancement This work should be completed as a team effort to ensure consistency across the codebase. Test plan: STAFF INTERFACE - Creating Bookings Preparation: - Run yarn js:build to emit the bundles 1. Navigate to a biblio detail page with bookable items 2. Click "Place booking" button 3. Observe the Vue booking modal opens Step 1 - Patron Selection: 4. Type patron name/cardnumber in search field 5. Verify typeahead search returns results 6. Select a patron 7. Verify patron is selected and displays correctly Step 2 - Booking Details: 8. Verify item type dropdown is populated 9. Select an item type 10. Verify pickup location dropdown is populated 11. Select a pickup location 12. If multiple bookable items exist, verify item dropdown appears 13. Select specific item (if applicable) Step 3 - Booking Period: 14. Verify flatpickr calendar opens 15. Verify calendar shows existing bookings, checkouts, and available dates 16. Select a date range 17. Verify date range validation works 18. Verify lead period/trail period restrictions are enforced 19. Verify maximum booking period is enforced 20. Verify constraint highlighting updates correctly when changing item type, specific item, or pickup location Validation Testing: 21. Try to submit without patron - verify error message 22. Try to submit without item type - verify error message 23. Try to submit without pickup location - verify error message 24. Try to submit without date range - verify error message 25. Try to select dates outside allowed range - verify validation Capacity Testing: 26. For item type with limited bookable items, verify capacity warnings 27. Verify zero-capacity items show appropriate message Submitting Bookings: 28. Complete all required fields 29. Click "Place booking" 30. Verify booking is created successfully 31. Verify modal closes 32. Verify booking appears in bookings list STAFF INTERFACE - Editing Bookings 33. Click "Edit" on an existing booking 34. Verify modal opens with pre-filled data (patron, item type, pickup location, date range) 35. Modify the date range 36. Click "Update booking" 37. Verify changes are saved 38. Verify updated booking reflects changes Calendar Navigation: 39. In date picker, navigate between months 40. Verify highlighting persists across navigation 41. Verify availability data loads correctly for new months Error Handling: 42. Disconnect network 43. Try to create a booking 44. Verify appropriate error message displays 45. Restore network and verify subsequent booking attempts work Store State Management: 46. Open booking modal and fill in some fields but don't submit 47. Close modal and re-open it 48. Verify modal state is reset (no data persists inappropriately) Browser Console: 49. Throughout all tests, verify no JavaScript errors in console 50. Verify no warnings about deprecated code Build Process: 51. Run yarn js:build{,:prod} 52. Verify build completes without errors 53. Verify dist files are generated correctly Additional Regression Testing: 54. Test with various system preferences configurations 55. Test with multiple bookable items per biblio 56. Test with various circulation rules configurations 57. Test with different patron categories 58. Test booking constraints at item level vs itemtype level -- You are receiving this mail because: You are watching all bug changes. You are the assignee for the bug.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #2 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Side note: there's some blocks lingering that mimic bootstrap functionality that was missing in 22.11 (where this was ported back to main from). I will remove that next. -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #3 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 188551 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=188551&action=edit Bug 41129: Use Bootstrap 5 Modal API for booking modal - Use Bootstrap Modal API for show/hide/dispose lifecycle - Replace custom modal classes with Bootstrap native classes - Remove custom backdrop CSS - Remove modal-scroll.mjs polyfill - Unify two watchers on props.open into single watcher - Add focus management to prevent aria-hidden warnings -- You are receiving this mail because: You are watching all bug changes. You are the assignee for the bug.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |martin.renvoize@openfifth.c | |o.uk -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Andrew Auld <andrew.auld@openfifth.co.uk> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |andrew.auld@openfifth.co.uk | |, | |jacob.omara@openfifth.co.uk | |, | |matt.blenkinsop@openfifth.c | |o.uk, | |pedro.amorim@openfifth.co.u | |k -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #4 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 189348 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=189348&action=edit Bug 41129: Remove logger call -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #5 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 189350 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=189350&action=edit Bug 41129: Add cypress tests To test: - Run `yarn cypress run --spec t/cypress/integration/Bookings/BookingModal_spec.ts` -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Martin Renvoize (ashimema) <martin.renvoize@openfifth.co.uk> changed: What |Removed |Added ---------------------------------------------------------------------------- Depends on|29002 |40134 Referenced Bugs: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=29002 [Bug 29002] Add ability to book items ahead of time https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=40134 [Bug 40134] Fix and optimise 'Any item' functionality of bookings -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #6 from Martin Renvoize (ashimema) <martin.renvoize@openfifth.co.uk> --- I have a series of fixes, enhancements and most importantly cypress tests submitted in a line down from bug 40134. I intend to rebase the patches here against those to ensure we catch all the cases I fixed there.. many of my pieces are bugfixes so I believe they should go first. Once I've rebased, I'll check the results against the Cypress tests and work on bringing this up to date for, hopefully, an early push in 26.05 -- You are receiving this mail because: You are watching all bug changes. You are the assignee for the bug.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Martin Renvoize (ashimema) <martin.renvoize@openfifth.co.uk> changed: What |Removed |Added ---------------------------------------------------------------------------- Blocks| |35937 Referenced Bugs: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=35937 [Bug 35937] Add hourly support to bookings -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Martin Renvoize (ashimema) <martin.renvoize@openfifth.co.uk> changed: What |Removed |Added ---------------------------------------------------------------------------- Blocks| |37618 Referenced Bugs: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=37618 [Bug 37618] Select patron's, then item's home library by default for pickup location when creating bookings -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Martin Renvoize (ashimema) <martin.renvoize@openfifth.co.uk> changed: What |Removed |Added ---------------------------------------------------------------------------- Blocks| |37363 Referenced Bugs: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=37363 [Bug 37363] Booking dates should respect closed days -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #7 from Martin Renvoize (ashimema) <martin.renvoize@openfifth.co.uk> --- *** Bug 37151 has been marked as a duplicate of this bug. *** -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #8 from Martin Renvoize (ashimema) <martin.renvoize@openfifth.co.uk> --- *** Bug 37153 has been marked as a duplicate of this bug. *** -- You are receiving this mail because: You are watching all bug changes. You are the assignee for the bug.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Martin Renvoize (ashimema) <martin.renvoize@openfifth.co.uk> changed: What |Removed |Added ---------------------------------------------------------------------------- Blocks| |37151 Referenced Bugs: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=37151 [Bug 37151] Add detail on hover for bookings event dots -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Martin Renvoize (ashimema) <martin.renvoize@openfifth.co.uk> changed: What |Removed |Added ---------------------------------------------------------------------------- Blocks| |37153 Referenced Bugs: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=37153 [Bug 37153] Event dots should appear side-by-side rather than stack vertically for bookings picker -- You are receiving this mail because: You are watching all bug changes. You are the assignee for the bug.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Martin Renvoize (ashimema) <martin.renvoize@openfifth.co.uk> changed: What |Removed |Added ---------------------------------------------------------------------------- Depends on|40134 |37707 Referenced Bugs: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=37707 [Bug 37707] Lead/Trail times should work in combination https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=40134 [Bug 40134] Fix and optimise 'Any item' functionality of bookings -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #188546|0 |1 is obsolete| | Attachment #188551|0 |1 is obsolete| | Attachment #189348|0 |1 is obsolete| | Attachment #189350|0 |1 is obsolete| | --- Comment #9 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 193909 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=193909&action=edit Bug 41129: Introduce Vue booking modal and Bootstrap 5 modal wiring Replace the jQuery/TT-based place_booking modal with a Vue 3 SFC component mounted via the island architecture pattern. - Add BookingModal.vue with multi-step form (patron, details, period) - Add Pinia store (stores/bookings.js) for shared booking state - Add flatpickr calendar with constraint highlighting, marker dots, hover feedback bar, and availability computation - Add API adapter layer (lib/adapters/api/) using fetch(), structured for future APIClient migration - Add interval tree and sweep-line processor for efficient overlap detection and unavailability computation - Add composables for availability, validation, capacity guard, constraint highlighting, rules fetching, and flatpickr lifecycle - Use Bootstrap 5 Modal API (show/hide/dispose) for modal lifecycle - Add island.inc, button-place.inc, button-edit.inc entry points - Wire into cat-toolbar.inc, detail.tt, bookings/list.tt, and all catalogue detail views - Add KohaAlert.vue, dayjs.mjs, and apiErrors.js shared utilities - Add rspack.config.js entry for booking-modal-island bundle Technical notes: The booking adapters use fetch() directly but are structured to facilitate migration to the APIClient pattern. Full migration requires BiblioAPIClient, CheckoutAPIClient, CirculationRulesAPI- Client, and PatronAPIClient.search() enhancements — best done as a coordinated effort across the codebase. Test plan: STAFF INTERFACE - Creating Bookings Preparation: - Run yarn js:build to emit the bundles Automated tests: - yarn cypress run --spec 't/cypress/integration/Circulation/bookingsModal*.ts' 1. Navigate to a biblio detail page with bookable items 2. Click "Place booking" button 3. Observe the Vue booking modal opens Step 1 - Patron Selection: 4. Type patron name/cardnumber in search field 5. Verify typeahead search returns results 6. Select a patron 7. Verify patron is selected and displays correctly Step 2 - Booking Details: 8. Verify item type dropdown is populated 9. Select an item type 10. Verify pickup location dropdown is populated 11. Select a pickup location 12. If multiple bookable items exist, verify item dropdown appears 13. Select specific item (if applicable) Step 3 - Booking Period: 14. Verify flatpickr calendar opens 15. Verify calendar shows existing bookings, checkouts, and available dates 16. Select a date range 17. Verify date range validation works 18. Verify lead period/trail period restrictions are enforced 19. Verify maximum booking period is enforced 20. Verify constraint highlighting updates correctly when changing item type, specific item, or pickup location Validation Testing: 21. Try to submit without patron - verify error message 22. Try to submit without item type - verify error message 23. Try to submit without pickup location - verify error message 24. Try to submit without date range - verify error message 25. Try to select dates outside allowed range - verify validation Capacity Testing: 26. For item type with limited bookable items, verify capacity warnings 27. Verify zero-capacity items show appropriate message Submitting Bookings: 28. Complete all required fields 29. Click "Place booking" 30. Verify booking is created successfully 31. Verify modal closes 32. Verify booking appears in bookings list STAFF INTERFACE - Editing Bookings 33. Click "Edit" on an existing booking 34. Verify modal opens with pre-filled data (patron, item type, pickup location, date range) 35. Modify the date range 36. Click "Update booking" 37. Verify changes are saved 38. Verify updated booking reflects changes Calendar Navigation: 39. In date picker, navigate between months 40. Verify highlighting persists across navigation 41. Verify availability data loads correctly for new months Error Handling: 42. Disconnect network 43. Try to create a booking 44. Verify appropriate error message displays 45. Restore network and verify subsequent booking attempts work Store State Management: 46. Open booking modal and fill in some fields but don't submit 47. Close modal and re-open it 48. Verify modal state is reset (no data persists inappropriately) Build Process: 49. Run yarn js:build and yarn js:build:prod 50. Verify build completes without errors 51. Verify dist files are generated correctly -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #10 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 193910 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=193910&action=edit Bug 41129: Add initial Cypress coverage for booking modal - Test modal open/close lifecycle from biblio detail page - Test patron search typeahead and selection - Test item type and pickup location dropdowns - Test flatpickr date range selection and validation - Test booking creation via API with success/error paths - Test edit booking flow with pre-filled form state -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #11 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 193911 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=193911&action=edit Bug 41129: Sync bookings with refactored base and API/embed compatibility Replace the Bookings module with the refactored architecture and adapt API specs for upstream compatibility. Module restructuring: - Split calendar.mjs into focused modules under lib/adapters/calendar/ (events, highlighting, locale, markers, prevention, visibility) - Add BookingDate class (immutable, timezone-aware date wrapper) - Add availability/ sub-modules (date-change, disabled-dates, period-validators, rules, unavailable-map) - Add useFormDefaults composable for pickup and item type defaults - Add conflict-resolution, constraints, highlighting, markers modules - Add hover-feedback module for calendar feedback bar - Convert BookingModal.vue to <script setup lang="ts"> - Manage error state in Pinia store Behavior additions: - Add 3-way payload construction for "any item" bookings - Add editable property to timeline booking items - Show transient success message after booking save - Apply server timezone conversion for timeline dates API/embed compatibility: - Add GET /libraries/{id}/holidays endpoint (Libraries.pm, swagger) - Allow "library" embed on GET /patrons/{id} (patrons.yaml) Test updates: - Move specs to Circulation/ directory, split into Basic, DatePicker, and Timezone specs - Add Vue Select test helpers (vue-select.js) - Validate flatpickr state via instance API instead of DOM classes -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #12 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 193912 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=193912&action=edit Bug 41129: Fix booking modal runtime and test regressions Runtime: - Add missing use C4::Context in Libraries.pm - Use safe DOM construction instead of innerHTML in external-dependents.mjs (booking count update, success message) - Remove reference to undefined BookingDateRangeConstraint syspref - Stub OPAC fetchHolidays (public endpoint does not exist) - Pass UI visibility flags to useBookingValidation as reactive parameter instead of reading from store Type/test corrections: - Remove duplicate ItemType type declaration in bookings.d.ts - Remove overly broad uncaught:exception handler from e2e.js - Stabilise DatePicker spec against flatpickr navigation races - Correct fencepost in max booking period calculation -- You are receiving this mail because: You are watching all bug changes. You are the assignee for the bug.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #13 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 193913 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=193913&action=edit Bug 41129: Remove dead code and consolidate styles and tests Dead code: - Remove uncalled SweepLineProcessor methods (~155 lines) - Remove unused constants, exports, and wrapper functions - Remove unused Cypress flatpickr helper commands - Remove erroneous Vue compiler macro import in BookingTooltip CSS: - Unify two :root blocks and two <style> blocks in BookingModal.vue - Centralise marker dot color variants in BookingModal.vue; remove duplicates from BookingPeriodStep and BookingTooltip - Replace hardcoded #28a745 with --booking-constraint-marker variable Tests: - Consolidate booking modal specs into bookingsModalBasic_spec.ts - Scope _feedbackHideTimer per createOnDayCreate instance - Replace debug console.log with console.warn in list.tt - Document catch blocks in staff-interface.js -- You are receiving this mail because: You are watching all bug changes. You are the assignee for the bug.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #193909|0 |1 is obsolete| | Attachment #193910|0 |1 is obsolete| | Attachment #193911|0 |1 is obsolete| | Attachment #193912|0 |1 is obsolete| | Attachment #193913|0 |1 is obsolete| | --- Comment #14 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 193925 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=193925&action=edit Bug 41129: Introduce Vue booking modal and Bootstrap 5 modal wiring Replace the jQuery/TT-based place_booking modal with a Vue 3 SFC component mounted via the island architecture pattern. Core components: - Add BookingModal.vue (<script setup lang="ts">) with multi-step form (patron, details, period) - Add Pinia store (stores/bookings.js) for shared booking state - Add flatpickr calendar with constraint highlighting, marker dots, hover feedback bar, and availability computation - Use Bootstrap 5 Modal API (show/hide/dispose) for modal lifecycle - Add island.inc, button-place.inc, button-edit.inc entry points - Wire into cat-toolbar.inc, detail.tt, bookings/list.tt, and all catalogue detail views - Add KohaAlert.vue, dayjs.mjs, and apiErrors.js shared utilities - Add rspack.config.js entry for booking-modal-island bundle Module architecture: - Add API adapter layer (lib/adapters/api/) using fetch(), structured for future APIClient migration - Split calendar adapter into focused modules under lib/adapters/calendar/ (events, highlighting, locale, markers, prevention, visibility) - Add BookingDate class (immutable, timezone-aware date wrapper) - Add availability/ sub-modules (date-change, disabled-dates, period-validators, rules, unavailable-map) - Add interval tree and sweep-line processor for efficient overlap detection and unavailability computation - Add composables for availability, validation, capacity guard, constraint highlighting, rules fetching, flatpickr lifecycle, and form defaults - Add conflict-resolution, constraints, highlighting, markers modules - Add hover-feedback module for calendar feedback bar - Manage error state in Pinia store Behavior: - Add 3-way payload construction for "any item" bookings - Add editable property to timeline booking items - Show transient success message after booking save - Apply server timezone conversion for timeline dates API/embed compatibility: - Add GET /libraries/{id}/holidays endpoint (Libraries.pm, swagger) - Allow "library" embed on GET /patrons/{id} (patrons.yaml) Cypress coverage: - Test modal open/close lifecycle from biblio detail page - Test patron search typeahead and selection - Test item type and pickup location dropdowns - Test flatpickr date range selection and validation - Test booking creation via API with success/error paths - Test edit booking flow with pre-filled form state - Add Vue Select test helpers (vue-select.js) - Validate flatpickr state via instance API instead of DOM classes Technical notes: The booking adapters use fetch() directly but are structured to facilitate migration to the APIClient pattern. Full migration requires BiblioAPIClient, CheckoutAPIClient, CirculationRulesAPI- Client, and PatronAPIClient.search() enhancements — best done as a coordinated effort across the codebase. Test plan: STAFF INTERFACE - Creating Bookings Preparation: - Run yarn js:build to emit the bundles Automated tests: - yarn cypress run --spec 't/cypress/integration/Circulation/bookingsModal*.ts' 1. Navigate to a biblio detail page with bookable items 2. Click "Place booking" button 3. Observe the Vue booking modal opens Step 1 - Patron Selection: 4. Type patron name/cardnumber in search field 5. Verify typeahead search returns results 6. Select a patron 7. Verify patron is selected and displays correctly Step 2 - Booking Details: 8. Verify item type dropdown is populated 9. Select an item type 10. Verify pickup location dropdown is populated 11. Select a pickup location 12. If multiple bookable items exist, verify item dropdown appears 13. Select specific item (if applicable) Step 3 - Booking Period: 14. Verify flatpickr calendar opens 15. Verify calendar shows existing bookings, checkouts, and available dates 16. Select a date range 17. Verify date range validation works 18. Verify lead period/trail period restrictions are enforced 19. Verify maximum booking period is enforced 20. Verify constraint highlighting updates correctly when changing item type, specific item, or pickup location Validation Testing: 21. Try to submit without patron - verify error message 22. Try to submit without item type - verify error message 23. Try to submit without pickup location - verify error message 24. Try to submit without date range - verify error message 25. Try to select dates outside allowed range - verify validation Capacity Testing: 26. For item type with limited bookable items, verify capacity warnings 27. Verify zero-capacity items show appropriate message Submitting Bookings: 28. Complete all required fields 29. Click "Place booking" 30. Verify booking is created successfully 31. Verify modal closes 32. Verify booking appears in bookings list STAFF INTERFACE - Editing Bookings 33. Click "Edit" on an existing booking 34. Verify modal opens with pre-filled data (patron, item type, pickup location, date range) 35. Modify the date range 36. Click "Update booking" 37. Verify changes are saved 38. Verify updated booking reflects changes Calendar Navigation: 39. In date picker, navigate between months 40. Verify highlighting persists across navigation 41. Verify availability data loads correctly for new months Error Handling: 42. Disconnect network 43. Try to create a booking 44. Verify appropriate error message displays 45. Restore network and verify subsequent booking attempts work Store State Management: 46. Open booking modal and fill in some fields but don't submit 47. Close modal and re-open it 48. Verify modal state is reset (no data persists inappropriately) Build Process: 49. Run yarn js:build and yarn js:build:prod 50. Verify build completes without errors 51. Verify dist files are generated correctly Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #15 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 193926 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=193926&action=edit Bug 41129: Harden runtime paths and test reliability Runtime: - Add missing use C4::Context in Libraries.pm - Use safe DOM construction instead of innerHTML in external-dependents.mjs (booking count update, success message) - Guard against undefined BookingDateRangeConstraint syspref - Stub OPAC fetchHolidays (public endpoint does not exist) - Pass UI visibility flags to useBookingValidation as reactive parameter instead of reading from store - Simplify island.inc template and add missing TT output filters - Remove unused ItemType type definition from bookings.d.ts Tests: - Correct fencepost in max booking period calculation - Guard DatePicker spec against flatpickr navigation races - Validate via flatpickr instance state instead of DOM classes - Remove broad error suppression from e2e.js support file Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #16 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 193927 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=193927&action=edit Bug 41129: Clean up unused code and consolidate styles Code: - Remove uncalled SweepLineProcessor methods (~155 lines) - Remove unused constants, exports, and wrapper functions - Remove unused unavailableByDateRef from useAvailability - Simplify fixTargetEndDateAvailability wrapper in highlighting CSS: - Unify two :root blocks and two <style> blocks in BookingModal.vue - Centralise marker dot color variants in BookingModal.vue; remove duplicates from BookingPeriodStep and BookingTooltip - Replace hardcoded #28a745 with --booking-constraint-marker variable Tests: - Add test cases for modal state reset, zero-day circulation rule warning, and error handling (409 conflict, 500 server error) - Remove unused flatpickr helper commands and assertion functions Misc: - Scope _feedbackHideTimer per createOnDayCreate instance - Document catch blocks in staff-interface.js - Upgrade debug console.log to console.warn in list.tt Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #17 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 193928 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=193928&action=edit Bug 41129: Allow calendar readiness in "any item" default state - Remove item type and item ID requirement from formPrefilterValid and canProceedToStep3; the "any item" default is valid when bookable items exist - Remove unused store refs and UI flags from useBookingValidation Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #18 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 193929 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=193929&action=edit Bug 41129: Fix booking modal reopen race and add regression test Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are the assignee for the bug. You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Assignee|koha-bugs@lists.koha-commun |paul.derscheid@lmscloud.de |ity.org | -- You are receiving this mail because: You are watching all bug changes. You are the assignee for the bug.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |Needs Signoff Comma delimited| |Büchereizentrale list of Sponsors| |Schleswig-Holstein | |<https://www.bz-sh.de/> Sponsorship status|--- |Sponsored -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #193925|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #193926|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #193927|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #193928|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #193929|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #19 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 195807 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=195807&action=edit Bug 41129: Introduce Vue booking modal and Bootstrap 5 modal wiring Replace the jQuery/TT-based place_booking modal with a Vue 3 SFC component mounted via the island architecture pattern. Core components: - Add BookingModal.vue (<script setup lang="ts">) with multi-step form (patron, details, period) - Add Pinia store (stores/bookings.js) for shared booking state - Add flatpickr calendar with constraint highlighting, marker dots, hover feedback bar, and availability computation - Use Bootstrap 5 Modal API (show/hide/dispose) for modal lifecycle - Add island.inc, button-place.inc, button-edit.inc entry points - Wire into cat-toolbar.inc, detail.tt, bookings/list.tt, and all catalogue detail views - Add KohaAlert.vue, dayjs.mjs, and apiErrors.js shared utilities - Add rspack.config.js entry for booking-modal-island bundle Module architecture: - Add API adapter layer (lib/adapters/api/) using fetch(), structured for future APIClient migration - Split calendar adapter into focused modules under lib/adapters/calendar/ (events, highlighting, locale, markers, prevention, visibility) - Add BookingDate class (immutable, timezone-aware date wrapper) - Add availability/ sub-modules (date-change, disabled-dates, period-validators, rules, unavailable-map) - Add interval tree and sweep-line processor for efficient overlap detection and unavailability computation - Add composables for availability, validation, capacity guard, constraint highlighting, rules fetching, flatpickr lifecycle, and form defaults - Add conflict-resolution, constraints, highlighting, markers modules - Add hover-feedback module for calendar feedback bar - Manage error state in Pinia store Behavior: - Add 3-way payload construction for "any item" bookings - Add editable property to timeline booking items - Show transient success message after booking save - Apply server timezone conversion for timeline dates API/embed compatibility: - Add GET /libraries/{id}/holidays endpoint (Libraries.pm, swagger) - Allow "library" embed on GET /patrons/{id} (patrons.yaml) Cypress coverage: - Test modal open/close lifecycle from biblio detail page - Test patron search typeahead and selection - Test item type and pickup location dropdowns - Test flatpickr date range selection and validation - Test booking creation via API with success/error paths - Test edit booking flow with pre-filled form state - Add Vue Select test helpers (vue-select.js) - Validate flatpickr state via instance API instead of DOM classes Technical notes: The booking adapters use fetch() directly but are structured to facilitate migration to the APIClient pattern. Full migration requires BiblioAPIClient, CheckoutAPIClient, CirculationRulesAPI- Client, and PatronAPIClient.search() enhancements — best done as a coordinated effort across the codebase. Test plan: STAFF INTERFACE - Creating Bookings Preparation: - Run yarn js:build to emit the bundles Automated tests: - yarn cypress run --spec 't/cypress/integration/Circulation/bookingsModal*.ts' 1. Navigate to a biblio detail page with bookable items 2. Click "Place booking" button 3. Observe the Vue booking modal opens Step 1 - Patron Selection: 4. Type patron name/cardnumber in search field 5. Verify typeahead search returns results 6. Select a patron 7. Verify patron is selected and displays correctly Step 2 - Booking Details: 8. Verify item type dropdown is populated 9. Select an item type 10. Verify pickup location dropdown is populated 11. Select a pickup location 12. If multiple bookable items exist, verify item dropdown appears 13. Select specific item (if applicable) Step 3 - Booking Period: 14. Verify flatpickr calendar opens 15. Verify calendar shows existing bookings, checkouts, and available dates 16. Select a date range 17. Verify date range validation works 18. Verify lead period/trail period restrictions are enforced 19. Verify maximum booking period is enforced 20. Verify constraint highlighting updates correctly when changing item type, specific item, or pickup location Validation Testing: 21. Try to submit without patron - verify error message 22. Try to submit without item type - verify error message 23. Try to submit without pickup location - verify error message 24. Try to submit without date range - verify error message 25. Try to select dates outside allowed range - verify validation Capacity Testing: 26. For item type with limited bookable items, verify capacity warnings 27. Verify zero-capacity items show appropriate message Submitting Bookings: 28. Complete all required fields 29. Click "Place booking" 30. Verify booking is created successfully 31. Verify modal closes 32. Verify booking appears in bookings list STAFF INTERFACE - Editing Bookings 33. Click "Edit" on an existing booking 34. Verify modal opens with pre-filled data (patron, item type, pickup location, date range) 35. Modify the date range 36. Click "Update booking" 37. Verify changes are saved 38. Verify updated booking reflects changes Calendar Navigation: 39. In date picker, navigate between months 40. Verify highlighting persists across navigation 41. Verify availability data loads correctly for new months Error Handling: 42. Disconnect network 43. Try to create a booking 44. Verify appropriate error message displays 45. Restore network and verify subsequent booking attempts work Store State Management: 46. Open booking modal and fill in some fields but don't submit 47. Close modal and re-open it 48. Verify modal state is reset (no data persists inappropriately) Build Process: 49. Run yarn js:build and yarn js:build:prod 50. Verify build completes without errors 51. Verify dist files are generated correctly Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #20 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 195808 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=195808&action=edit Bug 41129: Harden runtime paths and test reliability Runtime: - Add missing use C4::Context in Libraries.pm - Use safe DOM construction instead of innerHTML in external-dependents.mjs (booking count update, success message) - Guard against undefined BookingDateRangeConstraint syspref - Stub OPAC fetchHolidays (public endpoint does not exist) - Pass UI visibility flags to useBookingValidation as reactive parameter instead of reading from store - Simplify island.inc template and add missing TT output filters - Remove unused ItemType type definition from bookings.d.ts Tests: - Correct fencepost in max booking period calculation - Guard DatePicker spec against flatpickr navigation races - Validate via flatpickr instance state instead of DOM classes - Remove broad error suppression from e2e.js support file Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #21 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 195809 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=195809&action=edit Bug 41129: Clean up unused code and consolidate styles Code: - Remove uncalled SweepLineProcessor methods (~155 lines) - Remove unused constants, exports, and wrapper functions - Remove unused unavailableByDateRef from useAvailability - Simplify fixTargetEndDateAvailability wrapper in highlighting CSS: - Unify two :root blocks and two <style> blocks in BookingModal.vue - Centralise marker dot color variants in BookingModal.vue; remove duplicates from BookingPeriodStep and BookingTooltip - Replace hardcoded #28a745 with --booking-constraint-marker variable Tests: - Add test cases for modal state reset, zero-day circulation rule warning, and error handling (409 conflict, 500 server error) - Remove unused flatpickr helper commands and assertion functions Misc: - Scope _feedbackHideTimer per createOnDayCreate instance - Document catch blocks in staff-interface.js - Upgrade debug console.log to console.warn in list.tt Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #22 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 195810 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=195810&action=edit Bug 41129: Allow calendar readiness in "any item" default state - Remove item type and item ID requirement from formPrefilterValid and canProceedToStep3; the "any item" default is valid when bookable items exist - Remove unused store refs and UI flags from useBookingValidation Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #23 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 195811 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=195811&action=edit Bug 41129: Fix booking modal reopen race and add regression test Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Comma delimited|Büchereizentrale |Büchereizentrale list of Sponsors|Schleswig-Holstein |Schleswig-Holstein |<https://www.bz-sh.de/> |<https://www.bz-sh.de/> Depends on| |42206, 42207 Referenced Bugs: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=42206 [Bug 42206] Add REST endpoint GET /libraries/{id}/holidays https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=42207 [Bug 42207] Allow library embed on GET /patrons/{patron_id} -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Comma delimited|Büchereizentrale |Büchereizentrale list of Sponsors|Schleswig-Holstein |Schleswig-Holstein |<https://www.bz-sh.de/> |<https://www.bz-sh.de/>, | |Büchereizentrale | |Schleswig-Holstein | |<https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #195807|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #195808|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #195809|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #195810|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #195811|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #24 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 196436 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=196436&action=edit Bug 41129: Introduce Vue booking modal and Bootstrap 5 modal wiring Replace the jQuery/TT-based place_booking modal with a Vue 3 SFC component mounted via the island architecture pattern. Core components: - Add BookingModal.vue (<script setup lang="ts">) with multi-step form (patron, details, period) - Add Pinia store (stores/bookings.js) for shared booking state - Add flatpickr calendar with constraint highlighting, marker dots, hover feedback bar, and availability computation - Use Bootstrap 5 Modal API (show/hide/dispose) for modal lifecycle - Add island.inc, button-place.inc, button-edit.inc entry points - Wire into cat-toolbar.inc, detail.tt, bookings/list.tt, and all catalogue detail views - Add KohaAlert.vue, dayjs.mjs, and apiErrors.js shared utilities - Add rspack.config.js entry for booking-modal-island bundle Module architecture: - Add API adapter layer (lib/adapters/api/) using fetch(), structured for future APIClient migration - Split calendar adapter into focused modules under lib/adapters/calendar/ (events, highlighting, locale, markers, prevention, visibility) - Add BookingDate class (immutable, timezone-aware date wrapper) - Add availability/ sub-modules (date-change, disabled-dates, period-validators, rules, unavailable-map) - Add interval tree and sweep-line processor for efficient overlap detection and unavailability computation - Add composables for availability, validation, capacity guard, constraint highlighting, rules fetching, flatpickr lifecycle, and form defaults - Add conflict-resolution, constraints, highlighting, markers modules - Add hover-feedback module for calendar feedback bar - Manage error state in Pinia store Behavior: - Add 3-way payload construction for "any item" bookings - Add editable property to timeline booking items - Show transient success message after booking save - Apply server timezone conversion for timeline dates API/embed compatibility: - Add GET /libraries/{id}/holidays endpoint (Libraries.pm, swagger) - Allow "library" embed on GET /patrons/{id} (patrons.yaml) Cypress coverage: - Test modal open/close lifecycle from biblio detail page - Test patron search typeahead and selection - Test item type and pickup location dropdowns - Test flatpickr date range selection and validation - Test booking creation via API with success/error paths - Test edit booking flow with pre-filled form state - Add Vue Select test helpers (vue-select.js) - Validate flatpickr state via instance API instead of DOM classes Technical notes: The booking adapters use fetch() directly but are structured to facilitate migration to the APIClient pattern. Full migration requires BiblioAPIClient, CheckoutAPIClient, CirculationRulesAPI- Client, and PatronAPIClient.search() enhancements — best done as a coordinated effort across the codebase. Test plan: STAFF INTERFACE - Creating Bookings Preparation: - Run yarn js:build to emit the bundles Automated tests: - yarn cypress run --spec 't/cypress/integration/Circulation/bookingsModal*.ts' 1. Navigate to a biblio detail page with bookable items 2. Click "Place booking" button 3. Observe the Vue booking modal opens Step 1 - Patron Selection: 4. Type patron name/cardnumber in search field 5. Verify typeahead search returns results 6. Select a patron 7. Verify patron is selected and displays correctly Step 2 - Booking Details: 8. Verify item type dropdown is populated 9. Select an item type 10. Verify pickup location dropdown is populated 11. Select a pickup location 12. If multiple bookable items exist, verify item dropdown appears 13. Select specific item (if applicable) Step 3 - Booking Period: 14. Verify flatpickr calendar opens 15. Verify calendar shows existing bookings, checkouts, and available dates 16. Select a date range 17. Verify date range validation works 18. Verify lead period/trail period restrictions are enforced 19. Verify maximum booking period is enforced 20. Verify constraint highlighting updates correctly when changing item type, specific item, or pickup location Validation Testing: 21. Try to submit without patron - verify error message 22. Try to submit without item type - verify error message 23. Try to submit without pickup location - verify error message 24. Try to submit without date range - verify error message 25. Try to select dates outside allowed range - verify validation Capacity Testing: 26. For item type with limited bookable items, verify capacity warnings 27. Verify zero-capacity items show appropriate message Submitting Bookings: 28. Complete all required fields 29. Click "Place booking" 30. Verify booking is created successfully 31. Verify modal closes 32. Verify booking appears in bookings list STAFF INTERFACE - Editing Bookings 33. Click "Edit" on an existing booking 34. Verify modal opens with pre-filled data (patron, item type, pickup location, date range) 35. Modify the date range 36. Click "Update booking" 37. Verify changes are saved 38. Verify updated booking reflects changes Calendar Navigation: 39. In date picker, navigate between months 40. Verify highlighting persists across navigation 41. Verify availability data loads correctly for new months Error Handling: 42. Disconnect network 43. Try to create a booking 44. Verify appropriate error message displays 45. Restore network and verify subsequent booking attempts work Store State Management: 46. Open booking modal and fill in some fields but don't submit 47. Close modal and re-open it 48. Verify modal state is reset (no data persists inappropriately) Build Process: 49. Run yarn js:build and yarn js:build:prod 50. Verify build completes without errors 51. Verify dist files are generated correctly Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #25 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 196437 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=196437&action=edit Bug 41129: Harden runtime paths and test reliability Runtime: - Add missing use C4::Context in Libraries.pm - Use safe DOM construction instead of innerHTML in external-dependents.mjs (booking count update, success message) - Guard against undefined BookingDateRangeConstraint syspref - Stub OPAC fetchHolidays (public endpoint does not exist) - Pass UI visibility flags to useBookingValidation as reactive parameter instead of reading from store - Simplify island.inc template and add missing TT output filters - Remove unused ItemType type definition from bookings.d.ts Tests: - Correct fencepost in max booking period calculation - Guard DatePicker spec against flatpickr navigation races - Validate via flatpickr instance state instead of DOM classes - Remove broad error suppression from e2e.js support file Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #26 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 196438 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=196438&action=edit Bug 41129: Clean up unused code and consolidate styles Code: - Remove uncalled SweepLineProcessor methods (~155 lines) - Remove unused constants, exports, and wrapper functions - Remove unused unavailableByDateRef from useAvailability - Simplify fixTargetEndDateAvailability wrapper in highlighting CSS: - Unify two :root blocks and two <style> blocks in BookingModal.vue - Centralise marker dot color variants in BookingModal.vue; remove duplicates from BookingPeriodStep and BookingTooltip - Replace hardcoded #28a745 with --booking-constraint-marker variable Tests: - Add test cases for modal state reset, zero-day circulation rule warning, and error handling (409 conflict, 500 server error) - Remove unused flatpickr helper commands and assertion functions Misc: - Scope _feedbackHideTimer per createOnDayCreate instance - Document catch blocks in staff-interface.js - Upgrade debug console.log to console.warn in list.tt Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #27 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 196439 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=196439&action=edit Bug 41129: Allow calendar readiness in "any item" default state - Remove item type and item ID requirement from formPrefilterValid and canProceedToStep3; the "any item" default is valid when bookable items exist - Remove unused store refs and UI flags from useBookingValidation Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #28 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 196440 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=196440&action=edit Bug 41129: Fix booking modal reopen race and add regression test Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #29 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Split out Bugs 42206 and 42207 out of the general bookings modal implementation and deduped. -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #196436|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #196437|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #196438|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #196439|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #196440|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #30 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 196449 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=196449&action=edit Bug 41129: Introduce Vue booking modal and Bootstrap 5 modal wiring Replace the jQuery/TT-based place_booking modal with a Vue 3 SFC component mounted via the island architecture pattern. Core components: - Add BookingModal.vue (<script setup lang="ts">) with multi-step form (patron, details, period) - Add Pinia store (stores/bookings.js) for shared booking state - Add flatpickr calendar with constraint highlighting, marker dots, hover feedback bar, and availability computation - Use Bootstrap 5 Modal API (show/hide/dispose) for modal lifecycle - Add island.inc, button-place.inc, button-edit.inc entry points - Wire into cat-toolbar.inc, detail.tt, bookings/list.tt, and all catalogue detail views - Add KohaAlert.vue, dayjs.mjs, and apiErrors.js shared utilities - Add rspack.config.js entry for booking-modal-island bundle Module architecture: - Add API adapter layer (lib/adapters/api/) using fetch(), structured for future APIClient migration - Split calendar adapter into focused modules under lib/adapters/calendar/ (events, highlighting, locale, markers, prevention, visibility) - Add BookingDate class (immutable, timezone-aware date wrapper) - Add availability/ sub-modules (date-change, disabled-dates, period-validators, rules, unavailable-map) - Add interval tree and sweep-line processor for efficient overlap detection and unavailability computation - Add composables for availability, validation, capacity guard, constraint highlighting, rules fetching, flatpickr lifecycle, and form defaults - Add conflict-resolution, constraints, highlighting, markers modules - Add hover-feedback module for calendar feedback bar - Manage error state in Pinia store Behavior: - Add 3-way payload construction for "any item" bookings - Add editable property to timeline booking items - Show transient success message after booking save - Apply server timezone conversion for timeline dates API/embed compatibility: - Add GET /libraries/{id}/holidays endpoint (Libraries.pm, swagger) - Allow "library" embed on GET /patrons/{id} (patrons.yaml) Cypress coverage: - Test modal open/close lifecycle from biblio detail page - Test patron search typeahead and selection - Test item type and pickup location dropdowns - Test flatpickr date range selection and validation - Test booking creation via API with success/error paths - Test edit booking flow with pre-filled form state - Add Vue Select test helpers (vue-select.js) - Validate flatpickr state via instance API instead of DOM classes Technical notes: The booking adapters use fetch() directly but are structured to facilitate migration to the APIClient pattern. Full migration requires BiblioAPIClient, CheckoutAPIClient, CirculationRulesAPI- Client, and PatronAPIClient.search() enhancements — best done as a coordinated effort across the codebase. Test plan: STAFF INTERFACE - Creating Bookings Preparation: - Run yarn js:build to emit the bundles Automated tests: - yarn cypress run --spec 't/cypress/integration/Circulation/bookingsModal*.ts' 1. Navigate to a biblio detail page with bookable items 2. Click "Place booking" button 3. Observe the Vue booking modal opens Step 1 - Patron Selection: 4. Type patron name/cardnumber in search field 5. Verify typeahead search returns results 6. Select a patron 7. Verify patron is selected and displays correctly Step 2 - Booking Details: 8. Verify item type dropdown is populated 9. Select an item type 10. Verify pickup location dropdown is populated 11. Select a pickup location 12. If multiple bookable items exist, verify item dropdown appears 13. Select specific item (if applicable) Step 3 - Booking Period: 14. Verify flatpickr calendar opens 15. Verify calendar shows existing bookings, checkouts, and available dates 16. Select a date range 17. Verify date range validation works 18. Verify lead period/trail period restrictions are enforced 19. Verify maximum booking period is enforced 20. Verify constraint highlighting updates correctly when changing item type, specific item, or pickup location Validation Testing: 21. Try to submit without patron - verify error message 22. Try to submit without item type - verify error message 23. Try to submit without pickup location - verify error message 24. Try to submit without date range - verify error message 25. Try to select dates outside allowed range - verify validation Capacity Testing: 26. For item type with limited bookable items, verify capacity warnings 27. Verify zero-capacity items show appropriate message Submitting Bookings: 28. Complete all required fields 29. Click "Place booking" 30. Verify booking is created successfully 31. Verify modal closes 32. Verify booking appears in bookings list STAFF INTERFACE - Editing Bookings 33. Click "Edit" on an existing booking 34. Verify modal opens with pre-filled data (patron, item type, pickup location, date range) 35. Modify the date range 36. Click "Update booking" 37. Verify changes are saved 38. Verify updated booking reflects changes Calendar Navigation: 39. In date picker, navigate between months 40. Verify highlighting persists across navigation 41. Verify availability data loads correctly for new months Error Handling: 42. Disconnect network 43. Try to create a booking 44. Verify appropriate error message displays 45. Restore network and verify subsequent booking attempts work Store State Management: 46. Open booking modal and fill in some fields but don't submit 47. Close modal and re-open it 48. Verify modal state is reset (no data persists inappropriately) Build Process: 49. Run yarn js:build and yarn js:build:prod 50. Verify build completes without errors 51. Verify dist files are generated correctly Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #31 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 196450 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=196450&action=edit Bug 41129: Harden runtime paths and test reliability Runtime: - Add missing use C4::Context in Libraries.pm - Use safe DOM construction instead of innerHTML in external-dependents.mjs (booking count update, success message) - Guard against undefined BookingDateRangeConstraint syspref - Stub OPAC fetchHolidays (public endpoint does not exist) - Pass UI visibility flags to useBookingValidation as reactive parameter instead of reading from store - Simplify island.inc template and add missing TT output filters - Remove unused ItemType type definition from bookings.d.ts Tests: - Correct fencepost in max booking period calculation - Guard DatePicker spec against flatpickr navigation races - Validate via flatpickr instance state instead of DOM classes - Remove broad error suppression from e2e.js support file Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #32 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 196451 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=196451&action=edit Bug 41129: Clean up unused code and consolidate styles Code: - Remove uncalled SweepLineProcessor methods (~155 lines) - Remove unused constants, exports, and wrapper functions - Remove unused unavailableByDateRef from useAvailability - Simplify fixTargetEndDateAvailability wrapper in highlighting CSS: - Unify two :root blocks and two <style> blocks in BookingModal.vue - Centralise marker dot color variants in BookingModal.vue; remove duplicates from BookingPeriodStep and BookingTooltip - Replace hardcoded #28a745 with --booking-constraint-marker variable Tests: - Add test cases for modal state reset, zero-day circulation rule warning, and error handling (409 conflict, 500 server error) - Remove unused flatpickr helper commands and assertion functions Misc: - Scope _feedbackHideTimer per createOnDayCreate instance - Document catch blocks in staff-interface.js - Upgrade debug console.log to console.warn in list.tt Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #33 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 196452 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=196452&action=edit Bug 41129: Allow calendar readiness in "any item" default state - Remove item type and item ID requirement from formPrefilterValid and canProceedToStep3; the "any item" default is valid when bookable items exist - Remove unused store refs and UI flags from useBookingValidation Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #34 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 196453 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=196453&action=edit Bug 41129: Fix booking modal reopen race and add regression test Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #35 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 196454 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=196454&action=edit Bug 41129: (follow-up) Migrate staff booking adapter to API clients - Create BiblioAPIClient for biblio sub-resource endpoints (items, bookings, checkouts, pickup_locations) - Create BookingAPIClient for bookings CRUD (create, update) - Create LibraryAPIClient for library holidays endpoint - Create CirculationRulesAPIClient for circulation rules endpoint - Extend PatronAPIClient with headers support on get and new search method for paginated patron lookup - Register all new clients in both API client registries (lazy-loaded main and eager Vue) - Rewrite staff-interface.js adapter to use API clients instead of raw fetch() calls - Keep domain validation (bookingValidation) in adapter layer - OPAC adapter left as-is (uses public endpoints, mostly stubs) Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #36 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 196455 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=196455&action=edit Bug 41129: (follow-up) Use inject() for store access in island - Switch BookingModal.vue from useBookingStore() direct import to inject("bookings") for store access - Aligns with the pattern used by other island components (VendorMenu, AcquisitionsMenu) which receive stores via app.provide() in the island hydration - Child components keep useBookingStore() as Pinia is installed on the app via app.use(pinia) in islands.ts Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #37 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 196456 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=196456&action=edit Bug 41129: (follow-up) Use insertSamplePatron task in Cypress tests - Replace raw SQL INSERT INTO borrowers with the standard insertSamplePatron Cypress task across all 3 booking specs - Remove manual DELETE FROM borrowers cleanup blocks - Let deleteSampleObjects handle patron cleanup in correct dependency order (patrons before libraries), fixing the FK constraint error on test teardown - Inline patron creation in long tests also migrated to insertSamplePatron with deleteSampleObjects cleanup Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #38 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 196457 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=196457&action=edit Bug 41129: (follow-up) Fix incorrect and redundant documentation - Fix module doc: interval tree uses AVL balancing, not red-black - Fix JSDoc: calculateAvailabilityData accepts arrays, not strings - Fix JSDoc: fetchPatron takes patronId, not search term - Fix JSDoc: useAvailability does not return unavailableByDateRef - Fix JSDoc: opac fetchPickupLocations missing @param for patronId - Fix JSDoc: strategies validateStartDateSelection returns boolean indicating blocked (true) or allowed (false) - Fix JSDoc: replace non-standard @exported tag with @public - Fix comment: BookingDate.isBetween plugin is not loaded - Fix comment: lead period applies to all bookings, not "first" - Fix comment: handleBookingDateChange is a pure validation function, not a Flatpickr event handler - Add missing JSDoc on CONSTRAINT_MODE_NORMAL constant - Add stub JSDoc on opac createBooking/updateBooking - Remove stale historical note from conflict-resolution module doc - Remove off-by-one counting comment that mixed conventions - Remove redundant inline comments that restate code Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #39 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 196458 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=196458&action=edit Bug 41129: (follow-up) Disable OPAC island build output - Set OPAC islands rspack entry to empty object to prevent bundle emission while preserving the config for future use - OPAC booking UI is not part of this patchset Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #40 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 196946 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=196946&action=edit Bug 41129: (follow-up) Adapt to holidays â closed_dates endpoint rename - Update LibraryAPIClient method and endpoint path from /holidays to /closed_dates - Update staff-interface adapter to call closed_dates() - Follows Bug 42206 follow-up which renamed the endpoint for consistency with existing sub-resource naming conventions Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #41 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 196947 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=196947&action=edit Bug 41129: (follow-up) Fix Cypress test cleanup and race conditions - Add booking type to deleteSampleObjects with correct deletion order to prevent FK constraint failures - Track bookings and extra patrons in testData so afterEach cleanup handles them even when tests fail early - Wait for patron API response before asserting vue-select pre-population to fix timing-dependent failures - Remove manual in-test cleanup that was unreachable on failure Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #196449|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #196450|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #196451|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #196452|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #196453|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #196454|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #196455|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #196456|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #196457|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #196458|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #196946|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #196947|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #42 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 199038 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=199038&action=edit Bug 41129: Add API clients for booking-related endpoints - Add BiblioAPIClient for biblio sub-resources (items, bookings, checkouts, pickup_locations) - Add BookingAPIClient for bookings CRUD (create, update) - Add LibraryAPIClient for /libraries/{id}/closed_dates - Add CirculationRulesAPIClient for circulation rules lookup - Extend PatronAPIClient with a search() method for paginated patron lookup and accept optional headers on get() - Register the new clients in fetch/api-client.js (lazy) and vue/fetch/api-client.js (eager) Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #43 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 199039 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=199039&action=edit Bug 41129: Add booking domain library and shared utilities - Add lib/booking/BookingDate.mjs (immutable, timezone-aware date wrapper) - Add lib/booking/availability/ (date-change, disabled-dates, index, period-validators, rules, unavailable-map) and the outer lib/booking/availability.mjs barrel - Add lib/booking/algorithms/ (interval-tree, sweep-line-processor) for efficient overlap detection and unavailability computation - Add lib/booking/ logic modules (conflict-resolution, constants, constraints, id-utils, logger, markers, strategies, validation, validation-messages) - Add lib/adapters/api/staff-interface.js and api/opac.js for the per-environment API surface, plus lib/adapters/{form, patron, globals, external-dependents}.mjs for the DOM/legacy shims - Add lib/ui/ helpers (hover-feedback, marker-labels, selection-message, steps) - Add types/ (bookings.d.ts, dayjs-plugins.d.ts, vue-shims.d.ts) and a Bookings-scoped tsconfig.json with allowJs / skipLibCheck and the @koha-vue path alias so vue-tsc reads JSDoc on the .mjs files directly - Add vue/utils/apiErrors.js, validationErrors.js, dayjs.mjs and functions.mjs (shared across the module) - Add Cypress component specs under t/cypress/component/lib/booking/ for createDisableFunction, findFirstBlockingDate, IntervalTree and buildIntervalTree, buildUnavailableByDateMap with addHolidayMarkers, the period validators (calculateMaxEndDate, lead/trail/range-overlap, getAvailableItemsForPeriod), and the rules helpers (calculateMaxBookingPeriod, deriveEffectiveRules, extractBookingConfiguration); pure-function tests with no Vue mount so an algorithmic regression points here directly instead of cascading through the picker DOM Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #44 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 199040 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=199040&action=edit Bug 41129: Add BaseFlatpickr wrapper and booking calendar composable - Add BaseFlatpickr.vue, a domain-agnostic Vue 3 flatpickr wrapper that handles single/range/end-date-only modes, soft and hard severity disabling, range preview, viewport tracking, Koha- configured display format detection, and dynamic l10n bundle loading for the current HTML lang; exposes clear, setDate, instance, and inputElement via defineExpose - Add useBookingCalendarMaps composable that translates booking- domain refs (bookings, checkouts, item, period, rules) into the disabledFn / disabledByDate / markersByDate / classByDate / rangePreviewFn / loanBoundaryTimes maps the wrapper consumes, clamping the constrained range with findFirstBlockingDate - Add the BaseFlatpickr component spec covering single, range, end-date-only, hover preview, anchor-aware highlighting, hard and soft disabling, markers and custom markerRenderer, classByDate, external value, viewport, ready-event payload, and the exposed surface - Add the useBookingCalendarMaps component spec using a renderless ComposableHost that exposes the composable's outputs for direct inspection of disabledByDate / markersByDate / classByDate / rangePreviewFn / loanBoundaryTimes / end-date-only behavior, plus three DOM smoke tests against BaseFlatpickr confirming the outputs still slot into the picker's prop contract - Add Cypress support helpers: component.ts (dayjs global, String format shim, console-hooks wiring), console-hooks.js (shared console.warn-throws guard preserving Error stack/message across the cross-realm boundary), vue-select.js (component test helpers) Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #45 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 199041 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=199041&action=edit Bug 41129: Add Vue booking modal, Pinia store, and island wiring - Add BookingModal.vue (<script setup lang="ts">) orchestrating the multi-step form, plus the step components (BookingPatronStep, BookingDetailsStep, BookingPeriodStep) and BookingTooltip - Add PatronSearchSelect.vue and KohaAlert.vue shared components - Add the setup-style Pinia store under stores/bookings/, sectioned by responsibility along a one-way dep chain (status → data → draft → availability → validation) with an effects section for cross-cutting reactive bridges and an utils/withErrorHandling HOF wrapping per-action loading/error - Add modals/booking/island.inc and the two trigger snippets (button-place.inc, button-edit.inc); wire them into cat-toolbar.inc, bookings/list.tt, and the six catalogue detail views; drop the legacy modals/place_booking.inc - Pass js-date-format.inc through unchanged for the new modal - Add the booking-modal-island entry to rspack.config.js - Add ambient.d.ts for *.css / bootstrap / vue-select shims and configure tsconfig.json: @koha-vue alias, allowJs for JSDoc-typed .mjs flow into TS SFCs, narrow per-feature include scoped to the booking subtree, plus target/lib/module/noEmit/types: [] so tsc runs clean - Hydrate the island via vue/modules/islands.ts, providing the Pinia store under "bookings" for inject() consumption - Add Cypress integration coverage in bookingsModalBasic / bookingsModalDatePicker / bookingsModalTimezone, the BookingPeriodStep component spec, plus support/e2e and support/flatpickr adjustments and the insertData.js helpers Test plan: STAFF INTERFACE - Creating Bookings Preparation: - Run yarn js:build to emit the bundles Automated tests: - yarn cypress run --spec 't/cypress/integration/Circulation/bookingsModal*.ts' - yarn cypress run --component --spec 't/cypress/component/**/*_spec.ts' (covers BaseFlatpickr, useBookingCalendarMaps, BookingPeriodStep and the lib/booking pure-function specs) Test environment setup (preconditions for the manual steps below; cypress sets up its own data and does not need these): Bookable inventory: - Administration > Item types: mark at least one item type as "Bookable" (or use the per-item "Bookable" toggle on the item edit page) - Have a biblio with multiple bookable copies of that item type so the multi-item / item-selection / capacity flows are exercisable Circulation rules (Administration > Circulation and fines rules, applied to the library + item type scope you will test against or to the wildcard row): - bookings_lead_period: non-zero (e.g. 2) so steps 18 and 25 have a lead-time constraint to validate and the hover feedback emits lead-specific messages - bookings_trail_period: non-zero (e.g. 2) so step 18 has a trail buffer to validate - issuelength: a finite value (e.g. 7) so a maxPeriod is derivable and step 19 has a max-booking-period to enforce in the "issuelength" constraint mode - renewalsallowed + renewalperiod: non-zero values to exercise the "issuelength_with_renewals" constraint mode Calendar / holidays: - Tools > Calendar: add at least one closed day inside the visible calendar range for the pickup library so step 15 has a holiday to render (and the hover-feedback "library closed" path runs) Existing data on the test biblio: - Place one booking ahead of time so step 15 has a conflict to render, step 18 exercises lead/trail markers next to a real booking, and the edit flow (steps 33-38) has something to edit - Check out a bookable copy with a due date inside the visible calendar range so the picker shows a checkout interval and the checkout-vs-booking lead handling (Koha::Item->find_booking) participates 1. Navigate to a biblio detail page with bookable items 2. Click "Place booking" button 3. Observe the Vue booking modal opens Step 1 - Patron Selection: 4. Type patron name/cardnumber in search field 5. Verify typeahead search returns results 6. Select a patron 7. Verify patron is selected and displays correctly Step 2 - Booking Details: 8. Verify item type dropdown is populated 9. Select an item type 10. Verify pickup location dropdown is populated 11. Select a pickup location 12. If multiple bookable items exist, verify item dropdown appears 13. Select specific item (if applicable) Step 3 - Booking Period: 14. Verify flatpickr calendar opens 15. Verify calendar shows existing bookings, checkouts, and available dates 16. Select a date range 17. Verify date range validation works 18. Verify lead period/trail period restrictions are enforced 19. Verify maximum booking period is enforced 20. Verify constraint highlighting updates correctly when changing item type, specific item, or pickup location Validation Testing: 21. Try to submit without patron - verify error message 22. Try to submit without item type - verify error message 23. Try to submit without pickup location - verify error message 24. Try to submit without date range - verify error message 25. Try to select dates outside allowed range - verify validation Capacity Testing: 26. For item type with limited bookable items, verify capacity warnings 27. Verify zero-capacity items show appropriate message Submitting Bookings: 28. Complete all required fields 29. Click "Place booking" 30. Verify booking is created successfully 31. Verify modal closes 32. Verify booking appears in bookings list STAFF INTERFACE - Editing Bookings 33. Click "Edit" on an existing booking 34. Verify modal opens with pre-filled data (patron, item type, pickup location, date range) 35. Modify the date range 36. Click "Update booking" 37. Verify changes are saved 38. Verify updated booking reflects changes Calendar Navigation: 39. In date picker, navigate between months 40. Verify highlighting persists across navigation 41. Verify availability data loads correctly for new months Error Handling: 42. Disconnect network 43. Try to create a booking 44. Verify appropriate error message displays 45. Restore network and verify subsequent booking attempts work Store State Management: 46. Open booking modal and fill in some fields but don't submit 47. Close modal and re-open it 48. Verify modal state is reset (no data persists inappropriately) Build Process: 49. Run yarn js:build and yarn js:build:prod 50. Verify build completes without errors 51. Verify dist files are generated correctly Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #46 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 199042 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=199042&action=edit Bug 41129: [DO NOT PUSH] Add dev SQL seed for manual test setup - Marks itemtype BK bookable - Sets bookings_lead_period (2), bookings_trail_period (2), issuelength (7), renewalsallowed (2), renewalperiod (7) at the wildcard circulation_rules scope - Adds a closed day at CPL ten days out for holiday rendering - Idempotent via ON DUPLICATE KEY UPDATE / NOT EXISTS guards; run with: koha-mysql kohadev < bug_41129_seed.sql -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #47 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 199423 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=199423&action=edit Bug 41129: (follow-up) Fall back to setTimeout when requestIdleCallback is missing - Vue island hydration called window.requestIdleCallback directly, which throws TypeError on iOS Safari < 17.4 and prevents the booking-modal-island custom element from being defined; trigger buttons then silently set a property on a plain HTMLElement - Add a module-level scheduleIdle shim that uses requestIdleCallback when available and falls back to setTimeout(cb, 1) otherwise; the hydrate callback never reads the idle deadline, so the fallback is behaviour-equivalent on engines lacking native support Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #199038|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #199039|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #199040|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #199041|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #199042|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #199423|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #48 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 200580 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=200580&action=edit Bug 41129: Add API clients for booking-related endpoints - Add BiblioAPIClient for biblio sub-resources (items, bookings, checkouts, pickup_locations) - Add BookingAPIClient for bookings CRUD (create, update) - Add LibraryAPIClient for /libraries/{id}/closed_dates - Add CirculationRulesAPIClient for circulation rules lookup - Extend PatronAPIClient with a search() method for paginated patron lookup and accept optional headers on get() - Register the new clients in fetch/api-client.js (lazy) and vue/fetch/api-client.js (eager) Test plan: 1. Apply the full series and run: yarn js:build 2. The clients carry no UI of their own; they are exercised end-to-end by the Cypress suites added with the booking modal patch later in this series: npx cypress run --browser electron \ --spec 't/cypress/integration/Circulation/bookingsModalBasic_spec.ts' 3. Regression-check an existing consumer of the shared api-client registries, e.g. open the ERM module and confirm its tables still load Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #49 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 200581 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=200581&action=edit Bug 41129: Add booking domain library and shared utilities - Add lib/booking/BookingDate.js (immutable, timezone-aware date wrapper) - Add lib/booking/availability/ (date-change, disabled-dates, period-validators, rules, unavailable-map) and the outer lib/booking/availability.js barrel - Add lib/booking/algorithms/ (interval-tree, sweep-line-processor) for efficient overlap detection and unavailability computation - Add lib/booking/ logic modules (conflict-resolution, constants, constraints, id-utils, markers, strategies, validation, validation-messages) - Add lib/adapters/api/staff-interface.js and api/opac.js for the per-environment API surface, plus lib/adapters/{form, patron, globals, external-dependents}.js for the DOM/legacy shims - Add lib/ui/ helpers (hover-feedback, marker-labels, selection-message, steps) - Add types/ (bookings.d.ts, dayjs-plugins.d.ts, vue-shims.d.ts) and a Bookings-scoped tsconfig.json with allowJs / skipLibCheck and the @koha-vue path alias so vue-tsc reads JSDoc on the .js files directly - Add vue/utils/apiErrors.js, validationErrors.js, dayjs.js and functions.js (shared across the module) - Add Cypress component specs under t/cypress/component/lib/booking/ for createDisableFunction, findFirstBlockingDate, IntervalTree and buildIntervalTree, buildUnavailableByDateMap with addHolidayMarkers, the period validators (calculateMaxEndDate, lead/trail/range-overlap, getAvailableItemsForPeriod), and the rules helpers (calculateMaxBookingPeriod, deriveEffectiveRules, extractBookingConfiguration); pure-function tests with no Vue mount so an algorithmic regression points here directly instead of cascading through the picker DOM Test plan: 1. Run the pure-function component suites covering this library: npx cypress run --component --browser electron \ --spec 't/cypress/component/lib/booking/**/*_spec.ts' 2. Nothing is wired into a page yet; the booking modal patch later in this series exercises the library end-to-end (see its test plan) Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #50 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 200582 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=200582&action=edit Bug 41129: Add BookingFlatpickr wrapper and booking calendar composable - Add BookingFlatpickr.vue, a Vue 3 flatpickr wrapper that handles single/range/end-date-only modes, soft and hard severity disabling, range preview, viewport tracking, Koha- configured display format detection, and dynamic l10n bundle loading for the current HTML lang; exposes clear, setDate, instance, and inputElement via defineExpose - Do not reuse the existing components/FlatPickrWrapper.vue: it is a thin shell over the global flatpickr_defaults (calendar.inc) wired in dynamically by the form framework (base-element.js) and offers no hook for per-day disabling/markers, range preview, or viewport tracking, plus a string (not Date) value model; extending it would couple that shared form-widget to booking concerns - Add useBookingCalendarMaps composable that translates booking- domain refs (bookings, checkouts, item, period, rules) into the disabledFn / disabledByDate / markersByDate / classByDate / rangePreviewFn / loanBoundaryTimes maps the wrapper consumes, clamping the constrained range with findFirstBlockingDate - Add the BookingFlatpickr component spec covering single, range, end-date-only, hover preview, anchor-aware highlighting, hard and soft disabling, markers and custom markerRenderer, classByDate, external value, viewport, ready-event payload, and the exposed surface - Add the useBookingCalendarMaps component spec using a renderless ComposableHost that exposes the composable's outputs for direct inspection of disabledByDate / markersByDate / classByDate / rangePreviewFn / loanBoundaryTimes / end-date-only behavior, plus three DOM smoke tests against BookingFlatpickr confirming the outputs still slot into the picker's prop contract - Add Cypress support helpers: component.ts (dayjs global, String format shim, console-hooks wiring), console-hooks.js (shared console.warn-throws guard preserving Error stack/message across the cross-realm boundary), vue-select.js (component test helpers) Test plan: 1. Run the component suites added here: npx cypress run --component --browser electron \ --spec 't/cypress/component/BookingFlatpickr_spec.ts,t/cypress/component/useBookingCalendarMaps_spec.ts' 2. The wrapper is not mounted on any staff page until the booking modal patch; manual calendar coverage is part of that patch's test plan (steps 14-20 and 39-41) Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #51 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 200583 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=200583&action=edit Bug 41129: Add Vue booking modal, Pinia store, and island wiring - Add BookingModal.vue (<script setup lang="ts">) orchestrating the multi-step form, plus the step components (BookingPatronStep, BookingDetailsStep, BookingPeriodStep) and BookingTooltip - Add PatronSearchSelect.vue and KohaAlert.vue shared components - Add the setup-style Pinia store under stores/bookings/, sectioned by responsibility along a one-way dep chain (status → data → draft → availability → validation) with an effects section for cross-cutting reactive bridges and an utils/withErrorHandling HOF wrapping per-action loading - Add modals/booking/island.inc and the button-place.inc trigger snippet and wire them into cat-toolbar.inc; point the bookings/list.tt edit buttons and timeline at the island (data-booking-modal / window.openBookingModal); drop the legacy modals/place_booking.inc, js/modals/place_booking.js, and the asset include lines in the six catalogue detail views - Pass js-date-format.inc through unchanged for the new modal - Add the booking-modal-island entry to rspack.config.js - Add ambient.d.ts for *.css / bootstrap / vue-select shims and configure tsconfig.json: @koha-vue alias, allowJs for JSDoc-typed .js flow into TS SFCs, narrow per-feature include scoped to the booking subtree, plus target/lib/module/noEmit/types: [] so tsc runs clean - Hydrate the island via vue/modules/islands.ts, providing the Pinia store under "bookingStore" for inject() consumption - Add Cypress integration coverage in bookingsModalBasic / bookingsModalDatePicker / bookingsModalTimezone, the BookingPeriodStep and bookings-store effects component specs, plus support/e2e and support/flatpickr adjustments and the insertData.js helpers Test plan: STAFF INTERFACE - Creating Bookings Preparation: - Run yarn js:build to emit the bundles Automated tests: - yarn cypress run --spec 't/cypress/integration/Circulation/bookingsModal*.ts' - yarn cypress run --component --spec 't/cypress/component/**/*_spec.ts' (covers BookingFlatpickr, useBookingCalendarMaps, BookingPeriodStep and the lib/booking pure-function specs) Test environment setup (preconditions for the manual steps below; cypress sets up its own data and does not need these): Bookable inventory: - Administration > Item types: mark at least one item type as "Bookable" (or use the per-item "Bookable" toggle on the item edit page) - Have a biblio with multiple bookable copies of that item type so the multi-item / item-selection / capacity flows are exercisable Circulation rules (Administration > Circulation and fines rules, applied to the library + item type scope you will test against or to the wildcard row): - bookings_lead_period: non-zero (e.g. 2) so steps 18 and 25 have a lead-time constraint to validate and the hover feedback emits lead-specific messages - bookings_trail_period: non-zero (e.g. 2) so step 18 has a trail buffer to validate - issuelength: a finite value (e.g. 7) so a maxPeriod is derivable and step 19 has a max-booking-period to enforce in the "issuelength" constraint mode - renewalsallowed + renewalperiod: non-zero values to exercise the "issuelength_with_renewals" constraint mode Calendar / holidays: - Tools > Calendar: add at least one closed day inside the visible calendar range for the pickup library so step 15 has a holiday to render (and the hover-feedback "library closed" path runs) Existing data on the test biblio: - Place one booking ahead of time so step 15 has a conflict to render, step 18 exercises lead/trail markers next to a real booking, and the edit flow (steps 33-38) has something to edit - Check out a bookable copy with a due date inside the visible calendar range so the picker shows a checkout interval and the checkout-vs-booking lead handling (Koha::Item->find_booking) participates 1. Navigate to a biblio detail page with bookable items 2. Click "Place booking" button 3. Observe the Vue booking modal opens Step 1 - Patron Selection: 4. Type patron name/cardnumber in search field 5. Verify typeahead search returns results 6. Select a patron 7. Verify patron is selected and displays correctly Step 2 - Booking Details: 8. Verify item type dropdown is populated 9. Select an item type 10. Verify pickup location dropdown is populated 11. Select a pickup location 12. If multiple bookable items exist, verify item dropdown appears 13. Select specific item (if applicable) Step 3 - Booking Period: 14. Verify flatpickr calendar opens 15. Verify calendar shows existing bookings, checkouts, and available dates 16. Select a date range 17. Verify date range validation works 18. Verify lead period/trail period restrictions are enforced 19. Verify maximum booking period is enforced 20. Verify constraint highlighting updates correctly when changing item type, specific item, or pickup location Validation Testing: 21. Try to submit without patron - verify error message 22. Try to submit without item type - verify error message 23. Try to submit without pickup location - verify error message 24. Try to submit without date range - verify error message 25. Try to select dates outside allowed range - verify validation Capacity Testing: 26. For item type with limited bookable items, verify capacity warnings 27. Verify zero-capacity items show appropriate message Submitting Bookings: 28. Complete all required fields 29. Click "Place booking" 30. Verify booking is created successfully 31. Verify modal closes 32. Verify booking appears in bookings list STAFF INTERFACE - Editing Bookings 33. Click "Edit" on an existing booking 34. Verify modal opens with pre-filled data (patron, item type, pickup location, date range) 35. Modify the date range 36. Click "Update booking" 37. Verify changes are saved 38. Verify updated booking reflects changes Calendar Navigation: 39. In date picker, navigate between months 40. Verify highlighting persists across navigation 41. Verify availability data loads correctly for new months Error Handling: 42. Disconnect network 43. Try to create a booking 44. Verify appropriate error message displays 45. Restore network and verify subsequent booking attempts work Store State Management: 46. Open booking modal and fill in some fields but don't submit 47. Close modal and re-open it 48. Verify modal state is reset (no data persists inappropriately) Build Process: 49. Run yarn js:build and yarn js:build:prod 50. Verify build completes without errors 51. Verify dist files are generated correctly AI/LLM usage: The architecture and design here are my own, refined by hand over a long stretch that began with a manual refactor of place_booking.js. I used AI/LLM assistants throughout to help port the original plain JavaScript to Vue, write boilerplate, and draft and refactor parts of the implementation and tests, and I reviewed, corrected, and integrated everything they produced. This spanned the past year and a succession of models: Anthropic's Opus 4.5 through 4.8 and Fable 5, and OpenAI's GPT-5 to 5.2; the trailer records Opus 4.8, used most recently. Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #52 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 200584 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=200584&action=edit Bug 41129: (follow-up) Fall back to setTimeout when requestIdleCallback is missing - Vue island hydration called window.requestIdleCallback directly, which throws TypeError on iOS Safari < 17.4 and prevents the booking-modal-island custom element from being defined; trigger buttons then silently set a property on a plain HTMLElement - Add a module-level scheduleIdle shim that uses requestIdleCallback when available and falls back to setTimeout(cb, 1) otherwise; the hydrate callback never reads the idle deadline, so the fallback is behaviour-equivalent on engines lacking native support Test plan: 1. yarn js:build 2. Regression (requestIdleCallback present): open a staff catalogue detail page for a biblio with bookable items and confirm "Place booking" still opens the modal 3. Fallback (requestIdleCallback missing): test on iOS Safari < 17.4, or emulate it by injecting `delete window.requestIdleCallback;` as the first inline script of the page (e.g. via DevTools local overrides), reload, and confirm the island still hydrates and the button still opens the modal Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #53 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 200585 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=200585&action=edit Bug 41129: [DO NOT PUSH] Add dev SQL seed for manual test setup - Marks itemtype BK bookable - Sets bookings_lead_period (2), bookings_trail_period (2), issuelength (7), renewalsallowed (2), renewalperiod (7) at the wildcard circulation_rules scope - Adds a closed day at CPL ten days out for holiday rendering - Idempotent via ON DUPLICATE KEY UPDATE / NOT EXISTS guards; run with: koha-mysql kohadev < bug_41129_seed.sql -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Comma delimited|Büchereizentrale |Büchereizentrale list of Sponsors|Schleswig-Holstein |Schleswig-Holstein |<https://www.bz-sh.de/>, |<https://www.bz-sh.de/>, |Büchereizentrale |Büchereizentrale |Schleswig-Holstein |Schleswig-Holstein |<https://www.bz-sh.de/> |<https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #54 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Hi all, I further stripped things out of the patch set that are currently not needed for the scope of this bug to reduce the review surface. The Bookings dir within the Vue directory is still a bit of code to read but nowhere near what it was a few rounds ago. The store methods should be also relatively easy to follow since I grouped and order them a while back. I am aware that some of this is breaking/extending existing Koha conventions, but just throwing everything into a single giant wall of JS makes maintaining this code a nightmare. That's why I split it aggressively. Also added LLM-use notes which got a little convoluted since so many models were used over time, opted for the model in the trailer that last touched the commits and mentioned the rest in the big feature commit in comment #51. As stated, the architecture is my design, so please feel free to tell me where you think it is bad, or where we should align with existing Koha/Vue-patterns more. It's not any LLMs fault :D -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Martin Renvoize (ashimema) <martin.renvoize@openfifth.co.uk> changed: What |Removed |Added ---------------------------------------------------------------------------- Initiative type|--- |Epic Strategic theme|--- |Modernisation Target Milestone|--- |26.11 Blocks| |42959 Referenced Bugs: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=42959 [Bug 42959] Migrate staff interface functionality from CGI controller + Template Toolkit to REST API + Vue.js -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Bug 41129 depends on bug 42206, which changed state. Bug 42206 Summary: Add REST endpoint GET /libraries/{library_id}/closed_dates https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=42206 What |Removed |Added ---------------------------------------------------------------------------- Status|Needs documenting |RESOLVED Resolution|--- |FIXED -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Comma delimited|Büchereizentrale |Büchereizentrale list of Sponsors|Schleswig-Holstein |Schleswig-Holstein |<https://www.bz-sh.de/>, |<https://www.bz-sh.de/>, |Büchereizentrale |Büchereizentrale |Schleswig-Holstein |Schleswig-Holstein |<https://www.bz-sh.de/> |<https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #200580|0 |1 is obsolete| | Attachment #200581|0 |1 is obsolete| | Attachment #200582|0 |1 is obsolete| | Attachment #200583|0 |1 is obsolete| | Attachment #200584|0 |1 is obsolete| | Attachment #200585|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #55 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 201572 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=201572&action=edit Bug 41129: Add booking domain library and shared utilities - Add lib/booking/BookingDate.js (immutable, timezone-aware date wrapper) - Add lib/booking/availability/ (date-change, disabled-dates, period-validators, rules, unavailable-map) and the outer lib/booking/availability.js barrel - Add lib/booking/algorithms/ (interval-tree, sweep-line-processor) for efficient overlap detection and unavailability computation - Add lib/booking/ logic modules (conflict-resolution, constants, constraints, id-utils, markers, strategies, validation, validation-messages) - Add lib/adapters/api/staff-interface.js and api/opac.js for the per-environment API surface, plus lib/adapters/{form, patron, globals, external-dependents}.js for the DOM/legacy shims - Add lib/ui/ helpers (hover-feedback, marker-labels, selection-message, steps) - Add types/ (bookings.d.ts, dayjs-plugins.d.ts, vue-shims.d.ts) and a Bookings-scoped tsconfig.json with allowJs / skipLibCheck and the @koha-vue path alias so vue-tsc reads JSDoc on the .js files directly - Add vue/utils/apiErrors.js, validationErrors.js, dayjs.js and functions.js (shared across the module) - Add Cypress component specs under t/cypress/component/lib/booking/ for createDisableFunction, findFirstBlockingDate, IntervalTree and buildIntervalTree, buildUnavailableByDateMap with addHolidayMarkers, the period validators (calculateMaxEndDate, lead/trail/range-overlap, getAvailableItemsForPeriod), and the rules helpers (calculateMaxBookingPeriod, deriveEffectiveRules, extractBookingConfiguration), the constraint cross-filters (constrainPickupLocations / constrainBookableItems / constrainItemTypes), and the UTC day-boundary contract helpers (toUTCStartOfDayISO / toUTCEndOfDayISO / utcDatePart); pure-function tests with no Vue mount so an algorithmic regression points here directly instead of cascading through the picker DOM Test plan: 1. Run the pure-function component suites covering this library: npx cypress run --component --browser electron \ --spec 't/cypress/component/lib/booking/**/*_spec.ts' 2. Nothing is wired into a page yet; the booking modal patch later in this series exercises the library end-to-end (see its test plan) Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #56 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 201573 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=201573&action=edit Bug 41129: Add API clients for booking-related endpoints - Add BiblioAPIClient for biblio sub-resources (items, bookings, checkouts, pickup_locations) - Add BookingAPIClient for bookings CRUD (create, update) - Add LibraryAPIClient for /libraries/{id}/closed_dates - Add CirculationRulesAPIClient for circulation rules lookup - Extend PatronAPIClient with a search() method for paginated patron lookup and accept optional headers on get() - Register the new clients in fetch/api-client.js (lazy) and vue/fetch/api-client.js (eager) Test plan: 1. Apply the full series and run: yarn js:build 2. The clients carry no UI of their own; they are exercised end-to-end by the Cypress suites added with the booking modal patch later in this series: npx cypress run --browser electron \ --spec 't/cypress/integration/Circulation/bookingsModalBasic_spec.ts' 3. Regression-check an existing consumer of the shared api-client registries, e.g. open the ERM module and confirm its tables still load Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #57 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 201574 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=201574&action=edit Bug 41129: Add BookingFlatpickr wrapper and booking calendar composable - Add BookingFlatpickr.vue, a Vue 3 flatpickr wrapper that handles single/range/end-date-only modes, soft and hard severity disabling, range preview, viewport tracking, Koha- configured display format detection, and dynamic l10n bundle loading for the current HTML lang; exposes clear, setDate, instance, and inputElement via defineExpose - Do not reuse the existing components/FlatPickrWrapper.vue: it is a thin shell over the global flatpickr_defaults (calendar.inc) wired in dynamically by the form framework (base-element.js) and offers no hook for per-day disabling/markers, range preview, or viewport tracking, plus a string (not Date) value model; extending it would couple that shared form-widget to booking concerns - Add useBookingCalendarMaps composable that translates booking- domain refs (bookings, checkouts, item, period, rules) into the disabledFn / disabledByDate / markersByDate / classByDate / rangePreviewFn / loanBoundaryTimes maps the wrapper consumes, clamping the constrained range with findFirstBlockingDate - Add the BookingFlatpickr component spec covering single, range, end-date-only, hover preview, anchor-aware highlighting, hard and soft disabling, markers and custom markerRenderer, classByDate, external value, viewport, ready-event payload, and the exposed surface - Add the useBookingCalendarMaps component spec using a renderless ComposableHost that exposes the composable's outputs for direct inspection of disabledByDate / markersByDate / classByDate / rangePreviewFn / loanBoundaryTimes / end-date-only behavior, plus three DOM smoke tests against BookingFlatpickr confirming the outputs still slot into the picker's prop contract - Add Cypress support helpers: component.ts (dayjs global, String format shim, console-hooks wiring), console-hooks.js (shared console.warn-throws guard preserving Error stack/message across the cross-realm boundary), vue-select.js (component test helpers) Test plan: 1. Run the component suites added here: npx cypress run --component --browser electron \ --spec 't/cypress/component/BookingFlatpickr_spec.ts,t/cypress/component/useBookingCalendarMaps_spec.ts' 2. The wrapper is not mounted on any staff page until the booking modal patch; manual calendar coverage is part of that patch's test plan (steps 14-20 and 39-41) Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #58 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 201575 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=201575&action=edit Bug 41129: Add Vue booking modal, Pinia store, and island wiring - Add BookingModal.vue (<script setup lang="ts">) orchestrating the multi-step form, plus the step components (BookingPatronStep, BookingDetailsStep, BookingPeriodStep) and BookingTooltip - Add PatronSearchSelect.vue and KohaAlert.vue shared components - Add the setup-style Pinia store under stores/bookings/, sectioned by responsibility along a one-way dep chain (status → data → draft → availability → validation) with an effects section for cross-cutting reactive bridges and an utils/withErrorHandling HOF wrapping per-action loading - Add modals/booking/island.inc and the button-place.inc trigger snippet and wire them into cat-toolbar.inc; point the bookings/list.tt edit buttons and timeline at the island (data-booking-modal / window.openBookingModal); drop the legacy modals/place_booking.inc, js/modals/place_booking.js, its calendar styles in staff-global.scss, and the asset include lines in the six catalogue detail views - Pass js-date-format.inc through unchanged for the new modal - Add the booking-modal-island entry to rspack.config.js - Add ambient.d.ts for *.css / bootstrap / vue-select shims and configure tsconfig.json: @koha-vue alias, allowJs for JSDoc-typed .js flow into TS SFCs, narrow per-feature include scoped to the booking subtree, plus target/lib/module/noEmit/types: [] so tsc runs clean - Hydrate the island via vue/modules/islands.ts, providing the Pinia store under "bookingStore" for inject() consumption - Add Cypress integration coverage in bookingsModalBasic / bookingsModalDatePicker / bookingsModalTimezone, the BookingPeriodStep and bookings-store effects and validation component specs, plus support/e2e and support/flatpickr adjustments and the insertData.js helpers Test plan: STAFF INTERFACE - Creating Bookings Preparation: - Run yarn js:build to emit the bundles Automated tests: - yarn cypress run --spec 't/cypress/integration/Circulation/bookingsModal*.ts' - yarn cypress run --component --spec 't/cypress/component/**/*_spec.ts' (covers BookingFlatpickr, useBookingCalendarMaps, BookingPeriodStep and the lib/booking pure-function specs) Test environment setup (preconditions for the manual steps below; cypress sets up its own data and does not need these): Bookable inventory: - Administration > Item types: mark at least one item type as "Bookable" (or use the per-item "Bookable" toggle on the item edit page) - Have a biblio with multiple bookable copies of that item type so the multi-item / item-selection / capacity flows are exercisable Circulation rules (Administration > Circulation and fines rules, applied to the library + item type scope you will test against or to the wildcard row): - bookings_lead_period: non-zero (e.g. 2) so steps 18 and 25 have a lead-time constraint to validate and the hover feedback emits lead-specific messages - bookings_trail_period: non-zero (e.g. 2) so step 18 has a trail buffer to validate - issuelength: a finite value (e.g. 7) so a maxPeriod is derivable and step 19 has a max-booking-period to enforce in the "issuelength" constraint mode - renewalsallowed + renewalperiod: non-zero values to exercise the "issuelength_with_renewals" constraint mode Calendar / holidays: - Tools > Calendar: add at least one closed day inside the visible calendar range for the pickup library so step 15 has a holiday to render (and the hover-feedback "library closed" path runs) Existing data on the test biblio: - Place one booking ahead of time so step 15 has a conflict to render, step 18 exercises lead/trail markers next to a real booking, and the edit flow (steps 33-38) has something to edit - Check out a bookable copy with a due date inside the visible calendar range so the picker shows a checkout interval and the checkout-vs-booking lead handling (Koha::Item->find_booking) participates 1. Navigate to a biblio detail page with bookable items 2. Click "Place booking" button 3. Observe the Vue booking modal opens Step 1 - Patron Selection: 4. Type patron name/cardnumber in search field 5. Verify typeahead search returns results 6. Select a patron 7. Verify patron is selected and displays correctly Step 2 - Booking Details: 8. Verify item type dropdown is populated 9. Select an item type 10. Verify pickup location dropdown is populated 11. Select a pickup location 12. If multiple bookable items exist, verify item dropdown appears 13. Select specific item (if applicable) Step 3 - Booking Period: 14. Verify flatpickr calendar opens 15. Verify calendar shows existing bookings, checkouts, and available dates 16. Select a date range 17. Verify date range validation works 18. Verify lead period/trail period restrictions are enforced 19. Verify maximum booking period is enforced 20. Verify constraint highlighting updates correctly when changing item type, specific item, or pickup location Validation Testing: 21. Try to submit without patron - verify error message 22. Try to submit without item type - verify error message 23. Try to submit without pickup location - verify error message 24. Try to submit without date range - verify error message 25. Try to select dates outside allowed range - verify validation Capacity Testing: 26. For item type with limited bookable items, verify capacity warnings 27. Verify zero-capacity items show appropriate message Submitting Bookings: 28. Complete all required fields 29. Click "Place booking" 30. Verify booking is created successfully 31. Verify modal closes 32. Verify booking appears in bookings list STAFF INTERFACE - Editing Bookings 33. Click "Edit" on an existing booking 34. Verify modal opens with pre-filled data (patron, item type, pickup location, date range) 35. Modify the date range 36. Click "Update booking" 37. Verify changes are saved 38. Verify updated booking reflects changes Calendar Navigation: 39. In date picker, navigate between months 40. Verify highlighting persists across navigation 41. Verify availability data loads correctly for new months Error Handling: 42. Disconnect network 43. Try to create a booking 44. Verify appropriate error message displays 45. Restore network and verify subsequent booking attempts work Store State Management: 46. Open booking modal and fill in some fields but don't submit 47. Close modal and re-open it 48. Verify modal state is reset (no data persists inappropriately) Build Process: 49. Run yarn js:build and yarn js:build:prod 50. Verify build completes without errors 51. Verify dist files are generated correctly AI/LLM usage: The architecture and design here are my own, refined by hand over a long stretch that began with a manual refactor of place_booking.js. I used AI/LLM assistants throughout to help port the original plain JavaScript to Vue, write boilerplate, and draft and refactor parts of the implementation and tests, and I reviewed, corrected, and integrated everything they produced. This spanned the past year and a succession of models: Anthropic's Opus 4.5 through 4.8 and Fable 5, and OpenAI's GPT-5 to 5.2; the trailer records Opus 4.8, used most recently. Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #59 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 201576 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=201576&action=edit Bug 41129: (follow-up) Fall back to setTimeout when requestIdleCallback is missing - Vue island hydration called window.requestIdleCallback directly, which throws TypeError on iOS Safari < 17.4 and prevents the booking-modal-island custom element from being defined; trigger buttons then silently set a property on a plain HTMLElement - Add a module-level scheduleIdle shim that uses requestIdleCallback when available and falls back to setTimeout(cb, 1) otherwise; the hydrate callback never reads the idle deadline, so the fallback is behaviour-equivalent on engines lacking native support Test plan: 1. yarn js:build 2. Regression (requestIdleCallback present): open a staff catalogue detail page for a biblio with bookable items and confirm "Place booking" still opens the modal 3. Fallback (requestIdleCallback missing): test on iOS Safari < 17.4, or emulate it by injecting `delete window.requestIdleCallback;` as the first inline script of the page (e.g. via DevTools local overrides), reload, and confirm the island still hydrates and the button still opens the modal Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #60 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 201577 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=201577&action=edit Bug 41129: [DO NOT PUSH] Add dev SQL seed for manual test setup - Marks itemtype BK bookable - Sets bookings_lead_period (2), bookings_trail_period (2), issuelength (7), renewalsallowed (2), renewalperiod (7) at the wildcard circulation_rules scope - Adds a closed day at CPL ten days out for holiday rendering - Idempotent via ON DUPLICATE KEY UPDATE / NOT EXISTS guards; run with: koha-mysql kohadev < bug_41129_seed.sql -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #61 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Rebased on top of Bug 42862. -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Depends on| |43091 Referenced Bugs: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=43091 [Bug 43091] Staff-only Vue island chunks are emitted into the OPAC dist directory -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Depends on| |43108 Referenced Bugs: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=43108 [Bug 43108] Add a REST API endpoint for a biblio's booking availability over a date range -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #201572|0 |1 is obsolete| | Attachment #201573|0 |1 is obsolete| | Attachment #201574|0 |1 is obsolete| | Attachment #201575|0 |1 is obsolete| | Attachment #201576|0 |1 is obsolete| | Attachment #201577|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #62 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 202173 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=202173&action=edit Bug 41129: Add booking domain library and shared utilities - Add lib/booking/BookingDate.js (immutable, timezone-aware date wrapper) - Add lib/booking/availability/ (date-change, disabled-dates, period-validators, rules, unavailable-map) and the outer lib/booking/availability.js barrel - Add lib/booking/algorithms/ (interval-tree, sweep-line-processor) for efficient overlap detection and unavailability computation - Add lib/booking/ logic modules (conflict-resolution, constants, constraints, id-utils, markers, strategies, validation, validation-messages) - Add lib/adapters/api/staff-interface.js and api/opac.js for the per-environment API surface, plus lib/adapters/{form, patron, globals, external-dependents}.js for the DOM/legacy shims - Add lib/ui/ helpers (hover-feedback, marker-labels, selection-message, steps) - Add types/ (bookings.d.ts, dayjs-plugins.d.ts, vue-shims.d.ts) and a Bookings-scoped tsconfig.json with allowJs / skipLibCheck and the @koha-vue path alias so vue-tsc reads JSDoc on the .js files directly - Add vue/utils/apiErrors.js, validationErrors.js, dayjs.js and functions.js (shared across the module) - Add Cypress component specs under t/cypress/component/lib/booking/ for createDisableFunction, findFirstBlockingDate, IntervalTree and buildIntervalTree, buildUnavailableByDateMap with addHolidayMarkers, the period validators (calculateMaxEndDate, lead/trail/range-overlap, getAvailableItemsForPeriod), and the rules helpers (calculateMaxBookingPeriod, deriveEffectiveRules, extractBookingConfiguration), the constraint cross-filters (constrainPickupLocations / constrainBookableItems / constrainItemTypes), and the UTC day-boundary contract helpers (toUTCStartOfDayISO / toUTCEndOfDayISO / utcDatePart); pure-function tests with no Vue mount so an algorithmic regression points here directly instead of cascading through the picker DOM Test plan: 1. Run the pure-function component suites covering this library: yarn cypress run --component --browser electron \ --spec 't/cypress/component/lib/booking/**/*_spec.ts' 2. Nothing is wired into a page yet; the booking modal patch later in this series exercises the library end-to-end (see its test plan) Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #63 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 202174 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=202174&action=edit Bug 41129: Add API clients for booking-related endpoints - Add BiblioAPIClient for biblio sub-resources (items, bookings, checkouts, pickup_locations) - Add BookingAPIClient for bookings CRUD (create, update) - Add LibraryAPIClient for /libraries/{id}/closed_dates - Add CirculationRulesAPIClient for circulation rules lookup - Extend PatronAPIClient with a search() method for paginated patron lookup and accept optional headers on get() - Register the new clients in fetch/api-client.js (lazy) and vue/fetch/api-client.js (eager) Test plan: 1. Apply the full series and run: yarn js:build 2. The clients carry no UI of their own; they are exercised end-to-end by the Cypress suites added with the booking modal patch later in this series: yarn cypress run --browser electron \ --spec 't/cypress/integration/Circulation/bookingsModalBasic_spec.ts' 3. Regression-check an existing consumer of the shared api-client registries, e.g. open the ERM module and confirm its tables still load Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #64 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 202175 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=202175&action=edit Bug 41129: Add BookingFlatpickr wrapper and booking calendar composable - Add BookingFlatpickr.vue, a Vue 3 flatpickr wrapper that handles single/range/end-date-only modes, soft and hard severity disabling, range preview, viewport tracking, Koha- configured display format detection, and dynamic l10n bundle loading for the current HTML lang; exposes clear, setDate, instance, and inputElement via defineExpose - Do not reuse the existing components/FlatPickrWrapper.vue: it is a thin shell over the global flatpickr_defaults (calendar.inc) wired in dynamically by the form framework (base-element.js) and offers no hook for per-day disabling/markers, range preview, or viewport tracking, plus a string (not Date) value model; extending it would couple that shared form-widget to booking concerns - Add useBookingCalendarMaps composable that translates booking- domain refs (bookings, checkouts, item, period, rules) into the disabledFn / disabledByDate / markersByDate / classByDate / rangePreviewFn / loanBoundaryTimes maps the wrapper consumes, clamping the constrained range with findFirstBlockingDate - Add the BookingFlatpickr component spec covering single, range, end-date-only, hover preview, anchor-aware highlighting, hard and soft disabling, markers and custom markerRenderer, classByDate, external value, viewport, ready-event payload, and the exposed surface - Add the useBookingCalendarMaps component spec using a renderless ComposableHost that exposes the composable's outputs for direct inspection of disabledByDate / markersByDate / classByDate / rangePreviewFn / loanBoundaryTimes / end-date-only behavior, plus three DOM smoke tests against BookingFlatpickr confirming the outputs still slot into the picker's prop contract - Add Cypress support helpers: component.ts (dayjs global, String format shim, console-hooks wiring), console-hooks.js (shared console.warn-throws guard preserving Error stack/message across the cross-realm boundary), vue-select.js (component test helpers) Test plan: 1. Run the component suites added here: yarn cypress run --component --browser electron \ --spec 't/cypress/component/BookingFlatpickr_spec.ts,t/cypress/component/useBookingCalendarMaps_spec.ts' 2. The wrapper is not mounted on any staff page until the booking modal patch; manual calendar coverage is part of that patch's test plan (steps 14-20 and 39-41) Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #65 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 202176 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=202176&action=edit Bug 41129: Add Vue booking modal, Pinia store, and island wiring - Add BookingModal.vue (<script setup lang="ts">) orchestrating the multi-step form, plus the step components (BookingPatronStep, BookingDetailsStep, BookingPeriodStep) and BookingTooltip - Add PatronSearchSelect.vue and KohaAlert.vue shared components - Add the setup-style Pinia store under stores/bookings/, sectioned by responsibility along a one-way dep chain (status → data → draft → availability → validation) with an effects section for cross-cutting reactive bridges and an utils/withErrorHandling HOF wrapping per-action loading - Add modals/booking/island.inc and the button-place.inc trigger snippet and wire them into cat-toolbar.inc; point the bookings/list.tt edit buttons and timeline at the island (data-booking-modal / window.openBookingModal); drop the legacy modals/place_booking.inc, js/modals/place_booking.js, its calendar styles in staff-global.scss, and the asset include lines in the six catalogue detail views - Pass js-date-format.inc through unchanged for the new modal - Add the booking-modal-island entry to rspack.config.js - Add ambient.d.ts for *.css / bootstrap / vue-select shims and configure tsconfig.json: @koha-vue alias, allowJs for JSDoc-typed .js flow into TS SFCs, narrow per-feature include scoped to the booking subtree, plus target/lib/module/noEmit/types: [] so tsc runs clean - Hydrate the island via vue/modules/islands.ts, providing the Pinia store under "bookingStore" for inject() consumption - Add Cypress integration coverage in bookingsModalBasic / bookingsModalDatePicker / bookingsModalTimezone, the BookingPeriodStep and bookings-store effects and validation component specs, plus support/e2e and support/flatpickr adjustments and the insertData.js helpers Test plan: STAFF INTERFACE - Creating Bookings Preparation: - Run yarn js:build to emit the bundles Automated tests: - yarn cypress run --spec 't/cypress/integration/Circulation/bookingsModal*.ts' - yarn cypress run --component --spec 't/cypress/component/**/*_spec.ts' (covers BookingFlatpickr, useBookingCalendarMaps, BookingPeriodStep and the lib/booking pure-function specs) Test environment setup (preconditions for the manual steps below; cypress sets up its own data and does not need these): Bookable inventory: - Administration > Item types: mark at least one item type as "Bookable" (or use the per-item "Bookable" toggle on the item edit page) - Have a biblio with multiple bookable copies of that item type so the multi-item / item-selection / capacity flows are exercisable Circulation rules (Administration > Circulation and fines rules, applied to the library + item type scope you will test against or to the wildcard row): - bookings_lead_period: non-zero (e.g. 2) so steps 18 and 25 have a lead-time constraint to validate and the hover feedback emits lead-specific messages - bookings_trail_period: non-zero (e.g. 2) so step 18 has a trail buffer to validate - issuelength: a finite value (e.g. 7) so a maxPeriod is derivable and step 19 has a max-booking-period to enforce in the "issuelength" constraint mode - renewalsallowed + renewalperiod: non-zero values to exercise the "issuelength_with_renewals" constraint mode Calendar / holidays: - Tools > Calendar: add at least one closed day inside the visible calendar range for the pickup library so step 15 has a holiday to render (and the hover-feedback "library closed" path runs) Existing data on the test biblio: - Place one booking ahead of time so step 15 has a conflict to render, step 18 exercises lead/trail markers next to a real booking, and the edit flow (steps 33-38) has something to edit - Check out a bookable copy with a due date inside the visible calendar range so the picker shows a checkout interval and the checkout-vs-booking lead handling (Koha::Item->find_booking) participates 1. Navigate to a biblio detail page with bookable items 2. Click "Place booking" button 3. Observe the Vue booking modal opens Step 1 - Patron Selection: 4. Type patron name/cardnumber in search field 5. Verify typeahead search returns results 6. Select a patron 7. Verify patron is selected and displays correctly Step 2 - Booking Details: 8. Verify item type dropdown is populated 9. Select an item type 10. Verify pickup location dropdown is populated 11. Select a pickup location 12. If multiple bookable items exist, verify item dropdown appears 13. Select specific item (if applicable) Step 3 - Booking Period: 14. Verify flatpickr calendar opens 15. Verify calendar shows existing bookings, checkouts, and available dates 16. Select a date range 17. Verify date range validation works 18. Verify lead period/trail period restrictions are enforced 19. Verify maximum booking period is enforced 20. Verify constraint highlighting updates correctly when changing item type, specific item, or pickup location Validation Testing: 21. Try to submit without patron - verify error message 22. Try to submit without item type - verify error message 23. Try to submit without pickup location - verify error message 24. Try to submit without date range - verify error message 25. Try to select dates outside allowed range - verify validation Capacity Testing: 26. For item type with limited bookable items, verify capacity warnings 27. Verify zero-capacity items show appropriate message Submitting Bookings: 28. Complete all required fields 29. Click "Place booking" 30. Verify booking is created successfully 31. Verify modal closes 32. Verify booking appears in bookings list STAFF INTERFACE - Editing Bookings 33. Click "Edit" on an existing booking 34. Verify modal opens with pre-filled data (patron, item type, pickup location, date range) 35. Modify the date range 36. Click "Update booking" 37. Verify changes are saved 38. Verify updated booking reflects changes Calendar Navigation: 39. In date picker, navigate between months 40. Verify highlighting persists across navigation 41. Verify availability data loads correctly for new months Error Handling: 42. Disconnect network 43. Try to create a booking 44. Verify appropriate error message displays 45. Restore network and verify subsequent booking attempts work Store State Management: 46. Open booking modal and fill in some fields but don't submit 47. Close modal and re-open it 48. Verify modal state is reset (no data persists inappropriately) Build Process: 49. Run yarn js:build and yarn js:build:prod 50. Verify build completes without errors 51. Verify dist files are generated correctly AI/LLM usage: The architecture and design here are my own, refined by hand over a long stretch that began with a manual refactor of place_booking.js. I used AI/LLM assistants throughout to help port the original plain JavaScript to Vue, write boilerplate, and draft and refactor parts of the implementation and tests, and I reviewed, corrected, and integrated everything they produced. This spanned the past year and a succession of models: Anthropic's Opus 4.5 through 4.8 and Fable 5, and OpenAI's GPT-5 to 5.2; the trailer records Opus 4.8, used most recently. Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #66 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 202177 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=202177&action=edit Bug 41129: (follow-up) Fall back to setTimeout when requestIdleCallback is missing - Vue island hydration called window.requestIdleCallback directly, which throws TypeError on iOS Safari < 17.4 and prevents the booking-modal-island custom element from being defined; trigger buttons then silently set a property on a plain HTMLElement - Add a module-level scheduleIdle shim that uses requestIdleCallback when available and falls back to setTimeout(cb, 1) otherwise; the hydrate callback never reads the idle deadline, so the fallback is behaviour-equivalent on engines lacking native support Test plan: 1. yarn js:build 2. Regression (requestIdleCallback present): open a staff catalogue detail page for a biblio with bookable items and confirm "Place booking" still opens the modal 3. Fallback (requestIdleCallback missing): test on iOS Safari < 17.4, or emulate it by injecting `delete window.requestIdleCallback;` as the first inline script of the page (e.g. via DevTools local overrides), reload, and confirm the island still hydrates and the button still opens the modal Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #67 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 202178 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=202178&action=edit Bug 41129: (follow-up) Make ESLint parse TypeScript Vue SFCs The booking components are the first SFCs using <script setup lang="ts">; vue-eslint-parser needs the typescript-eslint parser for their script blocks, otherwise every such component fails with a parsing error and is skipped by ESLint entirely. - scope a languageOptions block to **/*.vue delegating script parsing to ts.parser (typescript-eslint is already a dependency) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #68 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 202179 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=202179&action=edit Bug 41129: (follow-up) Preserve error details in the fetch HttpClient and make its error dialog optional The staff HttpClient flattens failed responses into a thrown string: the response status and Koha error_code are lost, and the final 'throw Error(error)' stringifies the caught Error so consumers receive 'Error: <message>'. It also unconditionally appends a page-level warning for every failure, so callers that present errors themselves report each failure twice. - attach the response status and the body's error_code to the thrown error and rethrow the object itself instead of stringifying it - accept a per-call config with suppressDefaultErrorDialog for callers that surface errors themselves; default behaviour is unchanged -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #69 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 202180 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=202180&action=edit Bug 41129: [DO NOT PUSH] Add dev SQL seed for manual test setup - Marks itemtype BK bookable - Sets bookings_lead_period (2), bookings_trail_period (2), issuelength (7), renewalsallowed (2), renewalperiod (7) at the wildcard circulation_rules scope - Adds a closed day at CPL ten days out for holiday rendering - Idempotent via ON DUPLICATE KEY UPDATE / NOT EXISTS guards; run with: koha-mysql kohadev < bug_41129_seed.sql -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Comma delimited|Büchereizentrale |Büchereizentrale list of Sponsors|Schleswig-Holstein |Schleswig-Holstein |<https://www.bz-sh.de/>, |<https://www.bz-sh.de/>, |Büchereizentrale |Büchereizentrale |Schleswig-Holstein |Schleswig-Holstein |<https://www.bz-sh.de/> |<https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Martin Renvoize (ashimema) <martin.renvoize@openfifth.co.uk> changed: What |Removed |Added ---------------------------------------------------------------------------- Depends on|42207 | Referenced Bugs: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=42207 [Bug 42207] Allow library embed on GET /patrons/{patron_id} -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Martin Renvoize (ashimema) <martin.renvoize@openfifth.co.uk> changed: What |Removed |Added ---------------------------------------------------------------------------- Depends on| |42790 Referenced Bugs: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=42790 [Bug 42790] Clarify and unify bookings actions to 'Edit, Cancel, Checkout, Extend' shown appropriate per status and permission -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Patch complexity|Large patch |Medium patch Comma delimited|Büchereizentrale |Büchereizentrale list of Sponsors|Schleswig-Holstein |Schleswig-Holstein |<https://www.bz-sh.de/>, |<https://www.bz-sh.de/>, |Büchereizentrale |Büchereizentrale |Schleswig-Holstein |Schleswig-Holstein |<https://www.bz-sh.de/> |<https://www.bz-sh.de/> --- Comment #70 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Current status: Needs Signoff -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Paul Derscheid <paul.derscheid@lmscloud.de> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #202173|0 |1 is obsolete| | Attachment #202174|0 |1 is obsolete| | Attachment #202175|0 |1 is obsolete| | Attachment #202176|0 |1 is obsolete| | Attachment #202177|0 |1 is obsolete| | Attachment #202178|0 |1 is obsolete| | Attachment #202179|0 |1 is obsolete| | Attachment #202180|0 |1 is obsolete| | -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #71 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 203650 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=203650&action=edit Bug 41129: Add client-side booking rules and utilities Add the client-side rules used to determine which booking dates and options are available. - evaluate booking, checkout, lead-period, trail-period, holiday, and maximum booking-period restrictions - convert booking availability responses into item and date indexes - filter items, item types, and pickup locations as the booking context changes - convert calendar dates to library-timezone day boundaries for API requests - build calendar markers and accessible descriptions for date restrictions - add booking type declarations and shared ID and debounce utilities - add component tests for rules, constraints, availability maps, and dates Test plan: 1. Run: `yarn cypress run --component --browser electron --spec 't/cypress/component/lib/booking/**/*_spec.ts'` 2. Verify that all booking rule, constraint, availability-map, and timezone tests pass. Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) Assisted-by: GPT 5.6 (OpenAI) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #72 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 203651 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=203651&action=edit Bug 41129: Add frontend clients for booking workflows Add frontend API clients for the resources needed to create and edit bookings. - add biblio client methods for items, bookings, availability, checkouts, and pickup locations - add clients for circulation rules and library closed dates - add paginated patron search and per-request configuration to existing clients - allow booking create and update requests to receive request configuration - add staff and OPAC adapters for the booking data interface - pass AbortSignal through HttpClient and preserve HTTP status and Koha error codes when a request fails - allow callers that display their own errors to suppress the default dialog - add a translated formatter for errors returned by frontend API clients - document parameters and return values for the added client operations - add component tests for HttpClient and API error formatting Test plan: 1. Run: `yarn cypress run --component --browser electron --spec 't/cypress/component/HttpClient_spec.ts, t/cypress/component/fetch/api-error_spec.ts'` 2. Verify that cancelled requests do not display an error. 3. Verify that failed requests retain their status, code, and message. 4. Verify that suppressing the default dialog does not change the error returned to the caller. 5. Verify the translated messages for unauthorized, forbidden, server, string, and empty errors. Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) Assisted-by: GPT 5.6 (OpenAI) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #73 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 203652 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=203652&action=edit Bug 41129: Add accessible booking calendar and Vue type checking Add a booking date-range picker that presents availability and booking rules in the calendar. - display bookings, checkouts, holidays, lead and trail periods, and booking limits on Flatpickr dates - recalculate item and date availability when the selected range or calendar month changes - retain existing booking ranges while editing - keep restricted dates keyboard-focusable and announce why they cannot be selected - support keyboard selection and day, week, month, and year navigation - exclude Koha's Flatpickr date-shortcut plugins because they bypass booking range validation - add Cypress support and component tests for the calendar and availability maps - enable TypeScript parsing and vue-tsc checking for booking Vue components Test plan: 1. Open the booking modal for a record with a bookable item. 2. Open the booking period calendar and verify that it does not display the Yesterday, Today, and Tomorrow shortcuts. 3. Verify that past dates and dates occupied by a booking or checkout cannot be selected and display the appropriate marker and explanation. 4. Use the keyboard to open the calendar, select a date range, and navigate by day, week, month, and year. 5. Verify that closing the calendar returns focus to the booking period field. 6. Run: `yarn cypress run --component --browser electron --spec 't/cypress/component/BookingCalendar_spec.ts, t/cypress/component/useBookingCalendarMaps_spec.ts'` Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) Assisted-by: GPT 5.6 (OpenAI) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #74 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 203653 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=203653&action=edit Bug 41129: Replace the staff booking modal with Vue Replace the staff interface's jQuery booking modal with a Vue custom-element island. - add components for patron selection, booking details, the booking period, validation messages, the form, and the Bootstrap modal - add a Pinia store for booking data, validation, calendar state, and create and edit workflows - discard responses from superseded requests and cancel patron searches when the form closes - submit create and update requests through the booking API and retain support for CSRF-protected native form submission - add the booking island to catalogue, circulation, and patron pages - update booking tables and the booking timeline to open the Vue modal - refresh page booking counts, tables, timelines, and success messages after a booking is saved - return focus to the control that opened the modal when it closes - format patron ages and calendar marker details with reorderable translations - remove the old place_booking template, JavaScript, and global calendar styles - add component and end-to-end tests for booking creation and editing Test plan: 1. Enable EnableBooking and sign in as a staff user with permission to manage bookings. 2. Create a record with at least two bookable items of different item types and create a patron who can book them. 3. Open the record detail page and select Place booking. 4. Search for and select the patron. Verify that patron ages use the correct singular or plural wording. 5. Verify that pickup location, item type, and item choices become available and that changing one updates the others. 6. Leave the item and item type empty, select an available period, and save an Any item booking. Verify the success message and booking count. 7. Create another booking for a specific item. Verify that existing bookings, checkouts, holidays, and circulation rules restrict the selectable dates. 8. Verify that calendar conflict details present the marker type and barcode as one complete message. 9. Edit each booking from the bookings table or timeline. Change its details and verify that Update changes the existing booking instead of creating another. 10. Open the modal from the catalogue record, circulation, and patron-detail booking views and verify that create and edit actions use the same form. 11. Close and reopen the modal. Verify that the previous draft is cleared and focus returns to the control that opened it. 12. Repeat create, edit, and cancel using only the keyboard and verify that all fields, errors, date restrictions, and modal controls have accessible names. 13. Run the BookingForm, BookingModal, BookingPatronStep, BookingPeriodStep, booking-store, and three Circulation booking-modal Cypress suites. Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: Opus 4.8 (Anthropic) Assisted-by: GPT 5.6 (OpenAI) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #75 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 203654 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=203654&action=edit Bug 41129: Allow assigned unbookable items when editing bookings An item or its effective item type can become unbookable after the item has been assigned to a booking. The availability endpoint then rejects the item, and updating the booking can report a false capacity clash. Allow the assigned item only when excluded_booking_id identifies its booking. Include that item in the capacity calculation, but exclude bookings and checkouts for items outside the resulting item pool. Return a 400 response when an update has a genuine booking clash. Test plan: 1. Create a booking assigned to a specific item. 2. Make the item unbookable and edit the booking. 3. Verify that the assigned item remains selected and its availability request succeeds. 4. Change the booking period and select Update. 5. Verify that the existing booking is updated and no duplicate is created. 6. Repeat the test after making the item's effective item type unbookable. 7. Verify that another unbookable item cannot be selected for the booking. 8. Create a conflicting booking for the assigned item and verify that the update is rejected as a booking clash. 9. Run: `prove -v t/db_dependent/Koha/Biblio.t t/db_dependent/Koha/Biblio/Availability/Booking.t t/db_dependent/api/v1/biblios.t t/db_dependent/api/v1/bookings.t` Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: GPT 5.6 (OpenAI) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 --- Comment #76 from Paul Derscheid <paul.derscheid@lmscloud.de> --- Created attachment 203655 --> https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=203655&action=edit Bug 41129: (follow-up) Fix Preservation test under ES2020 Bug 41129 changes the TypeScript output target to ES2020. The Preservation Trains Cypress spec redeclares the same block-scoped variable, which previously worked only because the default target converted each declaration to var. Reuse the existing variable so the emitted ES2020 remains valid JavaScript and the Preservation suite can load. Test plan: 1. Run: `yarn cypress run --e2e --browser electron --spec 't/cypress/integration/Preservation/Trains.ts'` 2. Confirm that all Preservation Trains tests pass. Sponsored-by: Büchereizentrale Schleswig-Holstein <https://www.bz-sh.de/> Assisted-by: GPT 5.6 (OpenAI) -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Tomás Cohen Arazi (tcohen) <tomascohen@gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |tomascohen@gmail.com Comma delimited|Büchereizentrale |Büchereizentrale list of Sponsors|Schleswig-Holstein |Schleswig-Holstein |<https://www.bz-sh.de/>, |<https://www.bz-sh.de/>, |Büchereizentrale |Büchereizentrale |Schleswig-Holstein |Schleswig-Holstein |<https://www.bz-sh.de/> |<https://www.bz-sh.de/> -- You are receiving this mail because: You are watching all bug changes.
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=41129 Tomás Cohen Arazi (tcohen) <tomascohen@gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Comma delimited|Büchereizentrale |Büchereizentrale list of Sponsors|Schleswig-Holstein |Schleswig-Holstein |<https://www.bz-sh.de/>, |<https://www.bz-sh.de/> |Büchereizentrale | |Schleswig-Holstein | |<https://www.bz-sh.de/> | -- You are receiving this mail because: You are watching all bug changes.
participants (1)
-
bugzilla-daemon@bugs.koha-community.org