Daily updates from Odoo
Friday, July 3, 2026
8 changes
Code cleanup and technical improvements
This update aligns several Enterprise apps with the latest underlying Odoo web interface changes. It helps keep features such as Gantt views, Studio, Documents, Sign, Social, Planning, and related workflows working reliably after the platform upgrade.
Original PR description
## `t-ref` → Owl 3 signals — enterprise companion Enterprise side of the codebase-wide Owl 2 → Owl 3 ref-semantics migration. Pairs with the consolidated community PR. Single squashed commit (16 files): xpath rewrites for removed `t-custom-ref` attributes, ref reads converted to the signal call form, and patch/subclass reusers adapted across `web_gantt`, `web_studio`, `documents`, `ai`, `sign`, `social`, `l10n_ke_edi_oscu_pos`, `planning`, `hr_holidays_gantt`. ### Notes - Rebased onto current enterprise `master` (2026-06-10). - Community PR: odoo/odoo#269265
This update removes outdated code related to a previous Gantt chart progress bar redesign. The progress bar component is no longer needed in the current layout, so these files have been deleted to streamline the system and improve efficiency. This is a routine maintenance task.
Original PR description
Cleans up residual dead code left over from the progress bar redesign in https://github.com/odoo/enterprise/pull/118045. Since the `GanttRowProgressBar` component is no longer referenced anywhere in the new layout architecture, its corresponding files have been deleted. Forward-Port-Of: odoo/enterprise#122142
This update removes an outdated technique for autofocusing elements within the View Editor component. The change utilizes a more modern, reactive approach to ensure the element correctly focuses when needed, improving the user experience. Comprehensive testing confirms this update resolves a previous issue.
Original PR description
Replaced `useLayoutEffect` with `signal.ref(HTMLDivElement)` + `useEffect` because `useLayoutEffect` is deprecated in OWL3. The effect drove autofocus on the Property component's root element,…
Replaced `useLayoutEffect` with `signal.ref(HTMLDivElement)` + `useEffect` because `useLayoutEffect` is deprecated in OWL3.
The effect drove autofocus on the Property component's root element, triggered both when the DOM element became available and when `env.viewEditorModel.activeNodeXpath` changed. This matches the canonical `signal.ref()` + `useEffect` pattern: converting `useRef('root')` (from `@web/owl2/utils`) to a `signal.ref(HTMLDivElement)` class field makes the element a reactive signal, so `useEffect` auto-subscribes to it and re-runs whenever the element appears. The second dependency is read via `void` inside the callback to force subscription without changing the logic.
The useLayoutEffect refactored in this PR has test coverage — below are some tests that failed when the effect was commented out, and are now passing:
- @web_studio/view_editors/interactive_editor_sidebar/autofocus field label in the sidebar
- @web_studio/view_editors/interactive_editor_sidebar/update sidebar after edition
- WebSuite.test_unit_desktop
see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2602195/build/115250521This update replaces outdated `useLayoutEffect` code with modern, native React event handling (`onMounted` and `onWillUnmount`) across several Odoo modules. This improves stability and performance, aligning with the latest OWL3 compatibility standards. The changes address potential bugs and simplify the codebase for easier maintenance.
Original PR description
## Summary Part of the incremental OWL3 migration removing `useLayoutEffect` from `@web/owl2/utils`, which relies on the OWL2 compatibility shim and is deprecated in OWL3. The pattern replaced is…
## Summary Part of the incremental OWL3 migration removing `useLayoutEffect` from `@web/owl2/utils`, which relies on the OWL2 compatibility shim and is deprecated in OWL3. The pattern replaced is always the same: `useLayoutEffect` with a static or stable-ref dependency was used solely to attach DOM event listeners after mount and clean them up before unmount. In all cases, `onMounted` + `onWillUnmount` from `@odoo/owl` is the correct native replacement — the effect runs once, the ref is stable, and no reactive re-run is needed. ## Commits - **web_gantt**: `useMultiHover` — replaces per-element `pointerenter`/ `pointerleave` listeners (re-queried on every patch) with a single event delegation pair (`pointerover`/`pointerout`) on the container. Simpler and handles dynamic DOM children for free. - **hr_referral**: Bootstrap carousel `slide.bs.carousel` listener — also migrates `carouselRef` from `useRef` to a signal (`t-ref`) and `reachedEnd` from a proxy state to a signal. Fixes a latent bug where `bind(this)` was called twice (once in `addEventListener`, once in `removeEventListener`), making the removal a silent no-op. - **social_facebook/instagram/linkedin**: Click listeners on comment and like buttons queried via `querySelector` — identical structure across the three social kanban patches, straightforward one-to-one swap.
This update replaces an outdated coding technique (`useLayoutEffect`) with a more modern approach (`useListener`) for handling the AI chat feature. This change ensures compatibility with the latest Odoo version (OWL3) and improves the stability of the codebase. The update includes thorough testing to guarantee continued functionality.
Original PR description
Replaced `useLayoutEffect` with `useListener` because `useLayoutEffect` is deprecated in OWL3. The commented-out effect was a pure event-subscription pattern: its body only called…
Replaced `useLayoutEffect` with `useListener` because `useLayoutEffect` is deprecated in OWL3.
The commented-out effect was a pure event-subscription pattern: its body only called `this.env.bus.addEventListener('AI:OPEN_AI_CHAT', openAiChat)` with a cleanup returning `this.env.bus.removeEventListener`, and its dependency function returned an empty array (register once on mount, unregister on destroy). `useListener(this.env.bus, 'AI:OPEN_AI_CHAT', openAiChat)` is an exact 1:1 replacement — it internally wraps `useEffect` with a null-guard and a `removeEventListener` cleanup, preserving the exact add/remove lifecycle without any dep-array bookkeeping.
The `useLayoutEffect` refactored in this PR has test coverage — below are some tests that failed when the effect was commented out, and are now passing:
- TestAIDraftUI.test_ai_draft_chatter_button (Post install test_ai)
- TestAIDraftUI.test_ai_draft_chatter_button (test_discuss_full_enterprise)
- TestAIDraftUI.test_ai_draft_chatter_button (test_mail_enterprise)
see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2604770/build/115379831This update removes outdated code (`useLayoutEffect`) that was causing issues with the sign process. The changes replaced these calls with more modern React hooks, ensuring better performance and stability. Additionally, a related refactoring addressed compatibility issues with older Odoo versions.
Original PR description
Replaced 4 `useLayoutEffect` calls with `onMounted` (3 cases) and `useEffect` (1 case) because `useLayoutEffect` is deprecated in OWL3. 3 of the 4 effects run once at mount with an empty dependency…
Replaced 4 `useLayoutEffect` calls with `onMounted` (3 cases) and `useEffect` (1 case) because `useLayoutEffect` is deprecated in OWL3. 3 of the 4 effects run once at mount with an empty dependency array, making `onMounted` the natural fit. The remaining effect tracked `this.state.documentsWithUnsignedItems` and `this.state.openedDocumentIndex` — the state is a reactive proxy mutated via Set in-place, which would break with signals. `useEffect` auto-tracks reactive reads and preserves the exact same reactive behaviour. Note: `usePublicRefuseButton` was refactored to accept a `component` parameter instead of calling `useComponent()`, which only exists in the OWL2 compat layer `@web/owl2/utils` and is not available in OWL3. The useLayoutEffect refactored in this PR has test coverage — below are some tests that failed when the effect was commented out, and are now passing: - `@sign/document_backend/simple rendering`: getDataFromHTML step not received - `@sign/signable_sign_request/simple rendering`: getDataFromHTML step not received - `TestPortalSignFlow.test_portal_sign_document`: .o_sign_sign_item_navigator not found see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2596833/build/114857629
This update streamlines the process of setting up test environments for Odoo modules. By separating environment configuration from app creation, it simplifies future updates and makes it easier to remove test environments. This change improves the reliability and maintainability of our automated testing.
Original PR description
* account_reports,documents,documents_spreadsheet,knowledge,obox,room, sign,sign_itsme,spreadsheet_dashboard_edition,spreadsheet_edition, test_spreadsheet_edition,web_studio This commit splits the app/component creation and the env creation at user pov by changing how we populate the env in tests. Now, we have to configure the env before creating the app. This will make the env removal easier in the future.
This update adjusts the Point of Sale (POS) modules and related components to align with the new OWL 3 properties syntax. This change ensures compatibility with evolving standards and improves the system's ability to handle data related to POS transactions.
Original PR description
In this commit: =============== - Update `point_of_sale` and related modules to use the OWL 3 props syntax. Task-6260271 Related Community PR: https://github.com/odoo/odoo/pull/270730