# Release Notes - Technical Details Internal companion to `RELEASE_NOTES.md`. Not for customers. - **Range:** `728b92858c5b97d6d8da6d435b7d2d34afd1081b` → `13aa73dddd386e098879b1c27d9fd49381da982e` - **Generated:** 2026-10-06 17:49 UTC - **Merge requests:** 49 - **Commits:** 118 (0 without a merge request) ## Merge requests ### !2421 refactor: upgrade to React 19 - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2421 - Author: Rein de Vries - Commits: - `115fd033` refactor: drop react-helmet-async for React 19 native metadata - `8e2de3bd` refactor: migrate useStables and useActivityFiles to useApiPromisesState - `26d1ebad` refactor: migrate the contact-duplicate pages to useApiPromisesState - `3f88496d` refactor: drop optional chaining from memo dependency arrays - `1e363ae6` refactor: use useApiPromisesState across all ApiPromises call sites - `36456160` feat: add useApiPromisesState hook - `4361d5d7` fixup: fix(watch): replace watch subscription inside useEffect with the useWatch ho - `802e41fd` fix: replace derived-state-via-effect with useMemo in 5 spots - `48bb4ac5` fix(watch): replace watch subscription inside useEffect with the useWatch hook - `fb8fcbeb` fix: replace watch() with useWatch() to fix react-hooks/incompatible-library - `169daf1c` chore: suppress existing react-hooks compiler-rule violations - `ed1242ab` chore: bump eslint-plugin-react-hooks to v7 - `031d3acd` chore: upgrade to React 19 - `cb5a91f7` fix: replace ReactElement<any> with ReactElement after codemod - `4785cb3c` chore: run types-react-codemod preset-19 on src ### !2433 feat(reports): handle null future months in stable occupancy and bold current month - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2433 - Author: Gerben Morsink - Commits: - `224faa11` feat(reports): handle null future months in stable occupancy and bold current month ### !2434 fix(horses): register departure when deleting or marking horse as deceased - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2434 - Author: Gerben Morsink - Commits: - `d9056035` fix(horses): register departure when deleting or marking horse as deceased ### !2436 feat(horses): QR code and NFC tag that open the horse in the app - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2436 - Author: Michel - Commits: - `eac1b8d9` feat(horses): write the QR link to an NFC tag on Android and iOS - `6ef29eaa` feat(horses): add a QR code dialog with PDF download to the horse actions menu - `e1dac76d` feat(horses): add a public QR landing page that opens the horse in the app - `cafa7733` chore(mobile): register the @capacitor/device native plugin - `447389a8` fix(horses): build public horse links with the frontend url in the mobile app ### !2438 feat(activities): date dropdown and a single activity form for the compact and full modal - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2438 - Author: Michel - Commits: - `dd0a2c88` fix(activityEditor): adapt to React 19 types and lint rules - `4966fc90` fix(activityEditor): address MR review comments - `e7552672` feat(activities): open the date dropdown when expanding from the compact date field - `961c9870` feat(activities): morph the compact activity modal into the full modal - `8d912450` refactor(activities): use the shared activity editor on all planning pages - `e18ea9d5` feat(activities): share one activity form between the compact and full modal - `b8418f8e` feat(activities): open the full form from the date field in the compact activity form - `9c73cb4a` feat(activities): move date and recurrence inputs into a dropdown in the full activity form - `4a071bce` feat(activities): add date summary field with dropdown for date inputs ### !2440 fix(subscription): translate 'Additional modules' label - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2440 - Author: Rein de Vries - Closes: [#585](https://gitlab.equinem.com/equinem/equiapp/-/work_items/585) Untranslated words in EquineM App - Commits: - `bd992370` fix(subscription): translate 'Additional modules' label ### !2441 Use inclusive end date when stopping or editing a recurring service - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2441 - Author: Michel - Closes: [#1717](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1717) End date of recurring service is not processed and invoiced correctly - Commits: - `3c529ecf` fix(financial): use inclusive end date when stopping or editing a recurring service ### !2442 feat(contact): include business and person name when copying the address - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2442 - Author: Rein de Vries - Closes: [#594](https://gitlab.equinem.com/equinem/equiapp/-/work_items/594) Button to copy address information to clipboard on contact - Commits: - `4a1946e4` feat(contact): include business and person name when copying the address ### !2443 fix(breedingPlans): use last order receiving date as last insemination date - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2443 - Author: Michel - Commits: - `9b885cac` fix(breedingPlans): use last order receiving date as last insemination date ### !2444 BreedingPlanDetails: sort related orders and mare cycle checks oldest first - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2444 - Author: Michel - Commits: - `a05ccff7` fix(breedingPlanDetails): sort related orders and mare cycle checks oldest first ### !2445 feat(breedingPlanDetails): upload and remove a barrenness certificate - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2445 - Author: Michel - Commits: - `8bb13847` feat(breedingPlanDetails): upload and remove a barrenness certificate ### !2446 fix(feed): sort box numbers numerically in feed schedule - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2446 - Author: Gerben Morsink - Commits: - `92799818` fix(feed): sort box numbers numerically in feed schedule ### !2447 docs(claude): forbid Claude attribution in MR descriptions - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2447 - Author: Gerben Morsink - Commits: - `2b8caed8` docs(claude): forbid Claude attribution in MR descriptions ### !2448 refactor(activityEditor): replace deprecated Portal.Group with floating-ui portals - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2448 - Author: Michel - Commits: - `c8f744db` refactor(ui): position popovers and organization selector with floating-ui - `4844dc28` refactor(ui): replace Headless UI anchor with floating-ui in DropdownMenu and SearchContact - `3dc8ef98` refactor(activityEditor): replace deprecated Portal.Group with floating-ui portals ### !2449 feat(reports): rename KWPN export to Order Export - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2449 - Author: Gerben Morsink - Commits: - `25c0f225` feat(reports): rename KWPN export to Order Export ### !2452 chore(openapi): regenerate client (horse note, refresh token, nullable occupancy) - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2452 - Author: Gerben Morsink - Commits: - `cf975bea` feat(horses): add note and warning columns to horse export - `e5fefaf1` chore(openapi): regenerate client (horse note, refresh token, nullable occupancy) ### !2453 fix(planning): use horse\_uids instead of deprecated horse\_uid on activities - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2453 - Author: Gerben Morsink - Closes: [#1724](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1724) Stop using deprecated horse\_uid on v5 activities; use horse\_uids - Commits: - `d8a8db16` fix(planning): filter the action list on the stables of all horses of an activity - `2a812377` fix(planning): use horse\_uids instead of deprecated horse\_uid on activities ### !2454 fix(webshop): require email in contact address modal - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2454 - Author: Rein de Vries - Closes: [#601](https://gitlab.equinem.com/equinem/equiapp/-/work_items/601) Webshop - Adress of contact change should also have email field - Commits: - `c42c020d` fix(webshop): require email in contact address modal ### !2455 feat(users): add a role filter to the users list - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2455 - Author: Rein de Vries - Labels: Enhancement, Prio:Low, pre-launch - Closes: [#656](https://gitlab.equinem.com/equinem/equiapp/-/work_items/656) Add a "role" filter on "Users" - Commits: - `3e31fe32` feat(users): add a role filter to the users list ### !2456 fix(planning): skip the mare cycle check and stallion mount report without the breeding module - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2456 - Author: Rein de Vries - Labels: Prio:Low - Closes: [#664](https://gitlab.equinem.com/equinem/equiapp/-/work_items/664) Users without breeding module do see mare cycle check card when marking activity - Commits: - `f3f3743e` fix(planning): skip the mare cycle check and stallion mount report without the breeding module ### !2458 feat(horses): show selection checkbox when hovering the row - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2458 - Author: Michel - Commits: - `5a9acbd9` feat(horses): show selection checkbox when hovering the row ### !2459 feat(inputs): add PhoneInput with country code hint for all phone fields - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2459 - Author: Rein de Vries - Commits: - `260e68fa` feat(inputs): add PhoneInput with country code hint for all phone fields ### !2460 fix(subscription): show the actual payment result instead of assuming success - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2460 - Author: Rein de Vries - Closes: [#708](https://gitlab.equinem.com/equinem/equiapp/-/work_items/708) Indicate failed payment on new subscription - Commits: - `61ff13a1` fix(subscription): use location.assign for Mollie redirect - `bf27bd71` fix(subscription): show the actual payment result instead of assuming success ### !2461 fix(rvo): reload report list when the horse filter is cleared - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2461 - Author: Rein de Vries - Closes: [#726](https://gitlab.equinem.com/equinem/equiapp/-/work_items/726) RVO report list needs refresh after a successful report - Commits: - `f800b32e` fix(rvo): reload report list when the horse filter is cleared ### !2462 Chore/update open api 2809 - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2462 - Author: Rein de Vries - Commits: - `fda70804` chore: adapt to OpenApi - `42bf0084` chore: update OpenApi ### !2463 Refactor the horse details page - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2463 - Author: Michel - Commits: - `02f71c0a` fix(planning): avoid invalid li/p nesting in ActionListRow - `6e9bbcf3` feat(horses): add button in the activities tab - `ffa8ad23` feat(horses): replace the start/end badges of planned items with bold text - `92c85c6b` feat(horses): show the activity type category as a badge in the activities filter - `7c10e152` feat(horses): show the note as a blue callout in the general tab - `b7b95ddd` feat(horses): timeline, recurring services and facility reservations in the activities tab - `b44698a6` feat(horses): show a label and dash when a horse has no note or warning - `71ba9fd5` feat(horses): hide the warning text and dragging in the activities tab - `f6eb1d88` fix(date-range-picker): keep the start and end day of a day based quick select - `3ce71982` feat(horses): show a message in the breeding tab for stallions and geldings - `e60aa81c` feat(horses): show the care activities in the care tab - `6767ad04` feat(horses): filter the activities tab on activity type - `cecc68a9` fix(horses): process the review of the horse details page - `4f395ca7` feat(horses): muted uppercase field labels and an amber warning callout in the general tab - `113dfbb1` feat(horses): open graph tags and preview image for shared horse links - `5fe613b1` feat(horses): share a horse directly from a compact modal with share options - `31f37fd3` feat(horses): show the horse details page in tabs - `74f7ea34` feat(financial): preselect a horse when adding a recurring service - `3c3dec30` feat(planning): load the action list activities for a custom date range - `a2af2339` feat(ui): add tabs, flat tiles and other building blocks for the horse details page ### !2465 Fix/invitation and verify email flow - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2465 - Author: Rein de Vries - Commits: - `b510950d` fix(verify-email): treat the allauth 401 as a successful verification - `67d08c81` fix(invitation): show a pending-invitation ping on the mobile menu button - `2ffea449` fix(invitation): redirect back to the invitation after login ### !2466 fix(webshop): match repeat order parent on breeding product type - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2466 - Author: Rein de Vries - Closes: [#1726](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1726) Repeat order links the wrong parent item when the first item has no mare - Commits: - `b9d5ee4d` fix(webshop): match repeat order parent on breeding product type ### !2467 fix(upload): pass serverless host as baseUrl so s3 presign works on mobile - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2467 - Author: Rein de Vries - Labels: Bug, Prio:High - Closes: [#1727](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1727) File uploads fail in the mobile app: S3 presign response is missing url/fields - Commits: - `0af59ec8` fix(upload): pass serverless host as baseUrl so s3 presign works on mobile ### !2468 Resolve "Random logout on reload: rotated refresh token is never persisted" - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2468 - Author: Rein de Vries - Closes: [#1728](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1728) Random logout on reload: rotated refresh token is never persisted - Commits: - `b754d8ef` fix(auth): only adopt a refresh token from another tab when it is the same user - `90cc6583` fix(auth): persist rotated refresh token and serialize refreshes across tabs ### !2469 fix(shipping-product): trim trailing zero decimals on price - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2469 - Author: Rein de Vries - Labels: Prio:High - Closes: [#1716](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1716) Shop setting for the breeding price shows an incorrect price - Commits: - `61ecb387` fix(shipping-product): trim trailing zero decimals on price ### !2470 fix(rvo): merge stable/location columns and show movement counterpart in RVO report list - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2470 - Author: Rein de Vries - Labels: Enhancement, Pareg Migratie, Quick fix - Closes: [#783](https://gitlab.equinem.com/equinem/equiapp/-/work_items/783) RVO Notificationlist, what is stable doing here? - Commits: - `97de05fe` fix(rvo): merge stable/location columns and show movement counterpart in RVO report list ### !2471 fix(rvo): update authorization guide to RVO's new machtiging design - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2471 - Author: Rein de Vries - Labels: Pareg Migratie, Prio:Medium, Quick fix - Closes: [#790](https://gitlab.equinem.com/equinem/equiapp/-/work_items/790) RvO connection explanation updated design - Commits: - `749e5823` fix(rvo): update authorization guide to RVO's new machtiging design ### !2472 fix(horsetelex): import birth date, sex, ids and height alongside pedigree - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2472 - Author: Rein de Vries - Labels: Bug, Prio:Medium, Quick fix - Closes: [#791](https://gitlab.equinem.com/equinem/equiapp/-/work_items/791) Via Stambook zoeken op HorseTelex vult niet alle gegevens aan \[very quick fix\] - Commits: - `fb4fc7ac` fix(horsetelex): import birth date, sex, ids and height alongside pedigree ### !2473 fix(activity-types): drop hidden roles and skip unchanged roles on save - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2473 - Author: Rein de Vries - Closes: [#796](https://gitlab.equinem.com/equinem/equiapp/-/work_items/796) Hidden roles are sent to the API, resulting in weird errors. - Commits: - `7f599e3e` fix(activity-types): drop hidden roles and skip unchanged roles on save ### !2474 fix(feed): rename feeding labels to feeding times - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2474 - Author: Rein de Vries - Closes: [#799](https://gitlab.equinem.com/equinem/equiapp/-/work_items/799) Improve unclear wording and texts - Commits: - `44be2780` fix(feed): rename feeding labels to feeding times ### !2475 fix: remove the ts-ignores for image crop and base64 encode - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2475 - Author: Rein de Vries - Closes: [#801](https://gitlab.equinem.com/equinem/equiapp/-/work_items/801) Fix ESLINT disable line - Commits: - `577d81f3` fix: remove the ts-ignores for image crop and base64 encode ### !2476 refactor(zod): update link for creating Estonia translation - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2476 - Author: Rein de Vries - Commits: - `fa07a5d1` refactor(zod): added link to the correct MR for translation estiona ### !2479 fix(push): reset app badge and clear delivered notifications on app open - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2479 - Author: Rein de Vries - Labels: Enhancement, Prio:Medium - Closes: [#845](https://gitlab.equinem.com/equinem/equiapp/-/work_items/845) Notification badge stays on 1 after a notification. Should reset when opening the app - Commits: - `af174879` fix(push): reset app badge and clear delivered notifications on app open ### !2480 feat: more table sorting - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2480 - Author: Rein de Vries - Closes: [#820](https://gitlab.equinem.com/equinem/equiapp/-/work_items/820) Add sorting feature to several more tables - Commits: - `51e4280d` fix(users): persist sort and filter state for the users list - `1781f7a7` feat(users): add sorting to the users table - `6ca289ac` feat(contacts): add sorting to the contacts table - `99f50b2b` feat(webshop): add sorting to the order list - `d0b6c038` feat(payments): add sorting to the payments table ### !2482 Enhanced order settings page - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2482 - Author: Rein de Vries - Labels: Enhancement - Closes: [#868](https://gitlab.equinem.com/equinem/equiapp/-/work_items/868) Create a new page for insemination stations/requester, [#908](https://gitlab.equinem.com/equinem/equiapp/-/work_items/908) Search for stallion (by name) in the product list - Commits: - `13c8ee41` refactor(shopSettings): rename tab names - `93ce715b` chore(shop): make the add button blue - primairy action - `a6c9dca3` feat(shop): split breeding and shipping products in own tabs - `814323e6` feat(shop): filter and search breeding and shipping products - `e5daf8a3` feat(shop): manage agents/insemination and semen collection stations in shop settings - `4b29b82d` fix(navback): keep query params so filters survive the back link - `845e409e` feat(shop): split shop settings into tabs ### !2483 fix(activities): wrap breeding box number buttons so all boxes are visible - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2483 - Author: Rein de Vries - Closes: [#875](https://gitlab.equinem.com/equinem/equiapp/-/work_items/875) (mareCycleActivity) support more than 6 boxes - Commits: - `f12637b5` fix(activities): wrap breeding box number buttons so all boxes are visible ### !2484 feat(contacts): group default shipping methods by country and warn on mismatch - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2484 - Author: Rein de Vries - Closes: [#886](https://gitlab.equinem.com/equinem/equiapp/-/work_items/886) Default shipping method of contact should take into country of contact - Commits: - `82ace181` feat(contacts): group default shipping methods by country and warn on mismatch ### !2485 multiple fixes for contact Merger - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2485 - Author: Rein de Vries - Labels: Bug - Commits: - `ac386b52` fix(contacts): report form validation errors instead of failing silently - `34e0e1ee` fix(ui): submit the form of a page action that lands in a dropdown menu ### !2487 fix(horses): export date of birth and arrival as ISO dates - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2487 - Author: Gerben Morsink - Closes: [#1732](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1732) Horse export shows wrong date of birth and date of arrival - Commits: - `b0f0eaa6` fix(horses): export date of birth and arrival as ISO dates ### !2491 fix(organization): guard against missing me.stables in the organisation response - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2491 - Author: Rein de Vries - Labels: Bug, Prio:High - Closes: [#1736](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1736) App crashes when the organisation response has no me.stables - Commits: - `1d10baa4` fix(organization): guard against missing me.stables in the organisation response ### !2494 Chore/update open api 0510 - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2494 - Author: Rein de Vries - Commits: - `cf17a736` chore: Adapt to OpenApi changes - `690a5080` chore: update OpenApi ### !2496 feat(breeding): split menu into breeding mares and breeding stallions - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2496 - Author: Michel - Closes: [#1737](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1737) Breedings menu structure - Commits: - `7cf75b60` fix: translation labels - `f62615e8` refactor(shopSettings): merge breeding settings into the other tab - `2954aaba` feat(breeding): split menu into breeding mares and breeding stallions ### !2497 fix(serviceContract): open pricing tab when clicking the service link - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2497 - Author: Michel - Closes: [#1738](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1738) Link to service on service contract needs update - Commits: - `093be5b8` refactor(financialSettings): rename activities tab key to pricing - `a5bf60ab` fix(serviceContract): open pricing tab when clicking the service link ## Left out of the customer release notes OpenAPI schema refreshes and other changes with no customer-visible effect. - !2462 Chore/update open api 2809 (https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2462) - !2494 Chore/update open api 0510 (https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2494)