Daily updates from Odoo
Monday, July 20, 2026
7 changes
Code cleanup and technical improvements
The Point of Sale code was updated as part of Odoo's OWL 3 migration, replacing older internal reference patterns with the newer approach. This is an internal modernization that helps keep PoS screens and related localizations maintainable without changing day-to-day user workflows.
Original PR description
pos*: pos_enterprise, l10n_at_pos, l10n_ke_edi_oscu_pos As part of the OWL 3 migration, this commit replaces `useRef` and `t-custom-ref` usages with `t-ref` and signal-based references across the PoS codebase. Task-6343663 Related Community PR: https://github.com/odoo/odoo/pull/272698
The grid view editing logic was updated to use newer platform APIs, replacing deprecated internals. This keeps spreadsheet-like grid inputs working reliably while reducing future maintenance risk as the web framework evolves.
Original PR description
Replaced two `useLayoutEffect` calls in `useInputHook` with OWL3 native APIs (`useListener`, `onMounted`, `onPatched`), since `useLayoutEffect` is deprecated in OWL3. The caller `GridCell` was…
Replaced two `useLayoutEffect` calls in `useInputHook` with OWL3 native APIs (`useListener`, `onMounted`, `onPatched`), since `useLayoutEffect` is deprecated in OWL3. The caller `GridCell` was updated to use `signal.ref()` instead of the compat `useRef`. The first effect attached `input`/`change`/`keydown` listeners to `inputRef.el` — a textbook `useListener` case. However, the compat `useRef` from `@web/owl2/utils` silently untracks the underlying signal on `.el` access, so `useListener(() => inputRef.el, ...)` never re-ran after mount and no listeners were attached. The fix passes the signal ref directly (`useListener(inputRef, ...)`) and upgrades the caller to use `signal.ref()` passed explicitly to the hook. The second effect (bare `useLayoutEffect` re-syncing the DOM value on every render) maps directly to `onMounted` + `onPatched`. The `useLayoutEffect` refactored in this PR had test coverage — below are some tests that failed when the effect was commented out, and are now passing: - `@web_grid/grid_view/grid_view_desktop/editing a value` - `@web_grid/grid_view/grid_view_desktop/Edition navigate with tab/shift+tab and enter key` - `@web_grid/grid_cells/float_time_grid_cell/FloatTimeGridCell in grid view` see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2624595/build/116553684
This change modernizes how scrolling behavior is connected in the Gantt and grid views. It should help keep these views aligned with the latest web framework patterns without changing the visible user experience.
Original PR description
The web `virtual_grid_hook` now attaches its scroll listener via `useListener` on a signal ref instead of `useLayoutEffect` on a compat `useRef`. This PR feeds it a signal ref from both enterprise callers:
- **web_gantt**: `scrollRef` becomes a `signal.ref` bound with `t-ref`; its own scroll `useLayoutEffect` becomes a `useListener` and all `.el` reads become calls. Layout's `contentRef` (now a signal, per the community PR) is adapted to an `{ el }` object ref for the draggable hooks (`useGanttDraggable`/`useGanttSchedulable`), which require an object ref.
- **web_grid**: `contentRef` prop type is now a function (signal) ref.This change keeps Enterprise list views in Web Studio and Data Cleaning compatible with an underlying platform update. It is an internal refactor with no expected change to day-to-day user workflows, helping prevent display or interaction issues after the core update.
Original PR description
That PR migrates the base `web.ListRenderer` `table` ref from the OWL2 compat `useRef`/`t-custom-ref='table'` to a native OWL3 `signal(null)` bound with `t-ref="this.tableRef"`. This PR updates the enterprise modules that still consume the old compat surface: - **web_studio** `ListEditorRenderer`: retargeted both xpath inheritors `//*[@t-custom-ref='table']` → `//*[@t-ref='this.tableRef']`, and `onTableHover` reads `this.tableRef()` instead of `this.tableRef.el`. - **data_cleaning** `DataMergeListRenderer.onGroupRowMouseEnter`: reads `this.tableRef()` instead of `this.tableRef.el`. Companion PR to odoo/odoo#272009.
Spreadsheet autofill for list and pivot data has been reorganized to align with the underlying spreadsheet engine. This is an internal cleanup that should preserve existing behavior while making the feature easier to maintain and slightly more efficient.
Original PR description
### [MOV] spreadsheet_edition: move list/pivot autofill plugins to helpers The list/pivot plugins were transformed into helpers in the last commit, this commit renames the files. ### [REF] spreadsheet_edition: make autofill plugin into a store The o-spreadsheet commit transformed the autofill plugin into a store. This made the necessary adaptations in odoo. Moslty, the list/pivot autofill plugin were changed into helpers that can be called from the autofill process (they had no state nor command handling). Also changed a bit the autofill helpers so we don't re-compile the cell formula when we already have a compiled formula. Task: [6395361](https://www.odoo.com/web#id=6395361&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form)
This update modernizes part of the grid view code to stay compatible with the next version of Odoo's interface framework. It preserves the expected keyboard navigation behavior, including correctly focusing the toggle button when users enter edit mode.
Original PR description
Replaced `useLayoutEffect` with `signal.ref` + `useEffect` because `useLayoutEffect` is deprecated in OWL3. The commented-out effect focused the toggle button when its DOM element became available, using an explicit dep array `[this.buttonRef.el]`. That dep only worked because the compat `useRef().el` getter untracks its underlying signal. Converting `buttonRef` to a real `signal.ref(HTMLButtonElement)` makes `useEffect` auto-subscribe to the ref signal: when edit mode is entered (button rendered under `t-if`) the ref updates, the effect re-runs, and the button is focused — no explicit dep array needed. The useLayoutEffect refactored in this PR had test coverage — below are some tests that failed when the effect was commented out, and are now passing: - `@web_grid/grid_cells/float_toggle_grid_cell/FloatToggleGridCell: keyboard navigation` see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2624596/build/116553766
The accounting reports code was updated to use the newer supported framework approach, reducing the risk of issues when Odoo moves to OWL3. A new automated test was added to confirm report filters continue to update correctly when switching reports.
Original PR description
Replaced `useLayoutEffect` with `useEffect` from `@odoo/owl` because `useLayoutEffect` is deprecated in OWL3. `useEffect` auto-tracks reactive reads inside the callback, so reading `this.controller.cachedFilterOptions?.report_id` directly in the effect body is sufficient to re-run when the report changes — no explicit dependency array is needed. When commenting out the useLayoutEffect there was no error, the code we refactored had NO TEST coverage. A test was written to ensure our fix was correct, and it was tested against the previous useLayoutEffect: - Passed with previous useLayoutEffect. - Failed with previous useLayoutEffect commented. - Passed with our OWL3 replacement.