[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.
participants (1)
-
bugzilla-daemon@bugs.koha-community.org