Friday, September 4, 2026
168 changes · master
Enhancements to existing features
Withholding tax residual amounts can now be used more reliably in search filters and automated rules. This makes it easier for teams to find and act on accounting entries based on remaining withholding balances.
Original PR description
This PR adds a `_compute_sql` on `withholding_residual_amount_currency` so that it can be used in domains. task-6182154 Enterprise PR - https://github.com/odoo/enterprise/pull/130274
This update makes two additional phone status icons available in Odoo's web interface: forwarded calls and paused phone state. It helps ensure these call-related statuses can be displayed consistently wherever the interface needs them.
Original PR description
Task-6524528
The VoIP call transfer screen now uses clearer action buttons for direct and attended transfers, while the cancel option has been moved to a back button in the header. This makes the transfer flow easier to understand and helps users choose the right transfer action more quickly.
Original PR description
[Task-6524528](https://www.odoo.com/odoo/project/5778/tasks/6524528)
Invoices sent through Egypt ETA e-invoicing will now be checked for overly long sales or purchase references before submission. This gives users a clearer error message when references exceed the 100-character limit, helping them correct the issue faster and avoid confusing API responses.
Original PR description
… and purchase order reference Currently, when users submit invoices with ref exceeding 100 characters including spaces, the ETA API returns a JSON validation error offering no clear guidance on how to fix the error. Therefore, we are adding a check in _check_move_configuration to add an error if length of ref or invoice_origin is greater than 100 task-6420490 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Website builder record selection buttons can now show custom wording instead of only the default prompt. They also handle simpler selection data by looking up missing record names automatically, making builder components easier to reuse and maintain.
Original PR description
- accept non-default message on button of builder many2many - support only `id` from action with builder many2many This was part of https://github.com/odoo/odoo/pull/258135, but it can be merged independently
The appointment website editor now shows the intended message when a selection list is empty. This makes the configuration experience clearer for users setting up appointment options.
Original PR description
The corresponding commit in community add the `message` props to `BuilderMany2Many`. This commit uses it (instead of the non-existant `defaultMessage`) task-5245362
Website social media links now apply the correct brand colors for more supported platforms. This makes social media blocks look more consistent and polished when businesses add their profile URLs.
Original PR description
Colors for social media are defined with `$o-social-colors` in `addons/website/static/src/scss/primary_variables.scss`. css rules are defined to use these colors for links in "Social Media" snippet, but not all social media have a class defined. Also, some of these social media have a domain that do not match their name. With this change, setting a url of a social media (one added in `s_social_media/000.scss`) will show the icon with the correct color
Odoo now checks self-billed Malaysian e-invoice bill references before sending them to MyInvois. If the reference is over the 50-character limit, users see the issue directly on the Bill Reference field so they can shorten it before submission.
Original PR description
For self billed documents, the bill reference is used as the InternalID (cbc:ID) of the document sent to MyInvois. That field is limited to 50 characters, so a longer reference makes the submission fail with an error coming from MyInvois. Validate the length before sending, so that the issue is reported directly on the "Bill Reference" that needs to be shortened. task-6522168 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Point of Sale product information popup now shows each product's tags below the product header. This helps staff quickly recognize product categories or labels, with tag colors matching the back-office setup.
Original PR description
In this commit: ================== Product tags were not displayed in the POS product information popup. Display the product tags below the product header and use their configured backend color for the badge background. Task-6484273
This update tidies the internal organization of Belgian payroll calculation entries so related items are kept together. It has no expected impact on day-to-day payroll use, but helps reduce maintenance errors in future updates.
Original PR description
Two entries in the common localdict were not together. This was probably due to a mistake during a fw-port or rebase.
The Unplan Orders action is now hidden when the Work Orders setting is disabled. This keeps the manufacturing interface cleaner and prevents users from seeing an option that is not relevant to their current setup.
Original PR description
This improvement hides the Unplan Orders action when the Work Orders option is disabled in the settings. Community PR:- odoo/odoo#282221 TaskID-6453469
This update removes redundant tooltip text from buttons that already have visible labels. It slightly streamlines the interface setup across several Odoo apps without changing what users can do.
Original PR description
*=base_geolocalize,crm,event,l10n_in,mail_group,mrp,project,sale_crm,stock Remove unnecessary "title" attributes from buttons across views where a visible "string" label is present. The button in which string signifies the original purpose does not need title tooltip which adds unnecessary arch overhead without delivering additional value to the user interface. task-6527163 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update adds a dedicated checker to catch risky database query patterns that could lead to SQL injection vulnerabilities. It helps Odoo maintain stronger internal code quality controls while preparing to remove a broader legacy linting dependency.
Original PR description
New linter for sql-injection. The goal is to replace the pylint implementation by a specialized and stricter implementation so that pylint can be removed entirely in https://github.com/odoo/odoo/pull/257457. Findings of this linter are covered in https://github.com/odoo/odoo/pull/282652. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The tooltip for the plus button in the Work Orders planning Kanban view now says "Plan Work Order" instead of "Quick add." This makes the button's purpose clearer for manufacturing users and helps reduce confusion when planning work orders.
Original PR description
- Changed the 'Quick add' tooltip to 'Plan Work Order' for the '+' icon in the Work Orders planning Kanban view, making it clearer to users that the action is used to plan a work order. Task ID - 6515112 Enterprise PR: https://github.com/odoo/enterprise/pull/129793
Website editors now see clearer tooltips explaining font weight choices and how multiple form requirement settings work together. The website builder color picker also displays its hex input with the correct light styling in edit mode, improving readability while editing.
Original PR description
**[IMP] website: clarify builder option tooltips** Clarify (with tooltips) font weight settings and how multiple form requirement values are combined. ---------------- **[FIX] html_builder, html_editor: fix color picker hex input** Before this commit, the `hex` color input was dark in Website edit mode. After this commit, it uses the light color defined by the builder. task-6259086 Forward-Port-Of: odoo/odoo#282923
Several buttons across accounting, databases, payroll, marketing, planning, rental CRM, and barcode screens were simplified by removing redundant hover text where the button already has a visible label. This keeps the interface lighter without changing what users can do.
Original PR description
*=databases,l10n_be_hr_payroll,marketing_automation,planning,sale_renting_crm,stock_barcode Remove unnecessary "title" attributes from buttons across views where a visible "string" label is present. The button in which string signifies the original purpose does not need title tooltip which adds unnecessary arch overhead without delivering additional value to the user interface. task-6527163
Hong Kong payroll salary rules now distinguish non-taxable reimbursements and deductions from taxable ones. This makes payroll entries easier to understand and ensures non-taxable deductions are correctly subtracted from net pay.
Original PR description
The CAP57 structure has two reimbursement and two deduction rules, one pair taxable and one not, all named "Reimbursement" and "Deduction". Rename the non-taxable pair accordingly for clarity. Also compute the non-taxable deduction in Python so it is negated, as the DED category is added to NET. task-6263356
Saudi payroll accounting defaults now align with the redesigned local chart of accounts and its standardized numbering. Medical insurance and Iqama/work permit payroll credits are assigned to more specific prepaid accounts, improving financial classification and reporting accuracy.
Original PR description
- In the related PR, we redesign the Saudi Arabia chart of accounts to follow the standardized 6-digit numbering convention. - Following that re-sequencing, this PR splits the Medical Insurance and Iqama/Work Permit rules' credit account from the old Prepaid Employee Expenses account to the new Prepaid Medical Insurance and Prepaid Sponsorship Fees accounts. Related PR: https://github.com/odoo/odoo/pull/284216 https://github.com/odoo/upgrade/pull/11120 task-6390722
The work order planning view now uses default filters that match the Kanban view. This gives manufacturing teams a more consistent experience when switching between planning and Kanban views.
Original PR description
- Updated the work order planning filter to align with the default filters in the Kanban view. Task ID - 6515112 Community PR: https://github.com/odoo/odoo/pull/285566
The Philippines VAT registration setting has been moved from Enterprise reporting into the core Philippines localization so it can be reused by new official invoice reporting. Existing BIR 2306 and 2307 PDF exports continue to use the same setting without requiring business users to change their workflow.
Original PR description
`l10n_ph_is_vat_registered` lived in `l10n_ph_reports`, but the new BIR CAS invoice report added to core `l10n_ph` also needs it, and core cannot depend on an enterprise module. Move the field and its view exposure to core `l10n_ph`, which `l10n_ph_reports` already depends on, so the BIR 2306/2307 PDF exports keep working unchanged against the same field/column. Community PR: https://github.com/odoo/odoo/pull/282405 Upgrade PR: https://github.com/odoo/upgrade/pull/11029 task-6032311
Resolved issues and error corrections
Portal navigation breadcrumbs were standardized across several customer-facing pages, including the quotes page. This makes the portal experience more consistent and easier for customers to navigate.
Original PR description
Breadcrumbs were added to most portal pages [here][1]. This commit adds breadcrumbs to `/my/quotes` and fixes UI issues to ensure all portal pages with breadcrumbs look the same. [1]: https://github.com/odoo/odoo/commit/123d5876900a73f674a2286e891b2e442f63d93c task-6365169
Features or functions removed from Odoo
This change removes several Odoo modules and related files that had previously been deleted but reappeared unexpectedly. It helps keep the product codebase clean and avoids maintaining unsupported or obsolete functionality.
Original PR description
They got resurrected through foul play and unnatural means, lay them to rest.
Code cleanup and technical improvements
The change centralizes what happens when someone leaves a Discuss or Live Chat channel, making the process more consistent and easier to maintain. It also improves efficiency when handling bounced messages and keeps existing user-facing leave notifications working as expected.
Original PR description
*=im_livechat. - Remove discuss.channel._action_unfollow and call self_member_id.unlink() from action_unfollow, flagging the voluntary leave with a context sentinel so that only that flow posts the leave message - Post the leave message, notify the bus and unsubscribe the partner from an @api.ondelete hook on discuss.channel.member, so that none of it runs when mail is uninstalled - Keep the sub-channel member cleanup in unlink(), skipping the search entirely on an empty recordset - Move the livechat end-date handling to an @api.ondelete hook on discuss.channel.member - Unsubscribe bouncing partners with a single search in _message_receive_bounce instead of one unfollow call per partner - Updated the discuss channel tests to go through action_unfollow task-4715497 https://github.com/odoo/enterprise/pull/121613
Documentation and clarification updates
BWEALTHICS LLC and Alejandro Fernandez have signed Odoo's contributor license agreements. This documents the legal permission needed for their covered contribution to be accepted into the project.
Original PR description
Signs the Odoo Individual and Corporate Contributor License Agreements v1.0, following the procedure in `doc/cla/sign-cla.md`. * `doc/cla/individual/bwealthics.md` for Alejandro Fernandez * `doc/cla/corporate/bwealthics.md` for BWEALTHICS LLC, whose list of contributors currently holds a single entry The email in both files is the git committer email on the contribution this covers, #285503.
The stock replenishment wizard now has clearer help text, visible tooltips, a slightly larger input field, and smoother refresh behavior. These small usability fixes make replenishment tasks easier and less disruptive for users.
Original PR description
bunch of small fixes that can be merged fast - show tooltips - reword tooltip - remove unused libraries - use soft reload - make the input field slightly larger task 6304907 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Custom website snippet previews now display oversized responsive text more accurately in the snippet selection dialog. This helps editors recognize saved snippets without the preview being distorted, while leaving the actual page content unchanged.
Original PR description
Steps to reproduce: - Go to the website editor. - Add a snippet with editable text to the page. - Select the text and set its font size to 144. - Save the edited block as a custom snippet. - Open the…
Steps to reproduce: - Go to the website editor. - Add a snippet with editable text to the page. - Select the text and set its font size to 144. - Save the edited block as a custom snippet. - Open the snippets dialog. - Go to the Custom category. => The custom snippet preview shows the text too large. Before this commit, responsive font sizes using `clamp()` with a `vw` term were rendered too large in the block dialog. The `vw` value was based on the full preview iframe width, while snippets were displayed inside columns. After this commit, the block dialog adjusts `vw` values on cloned `.o_rfs` preview content only, so the preview matches its column width without changing the snippet dropped on the page. task-6303725 | BEFORE (font size -> 144) | AFTER (font size -> 144) | | ------------- | ------------- | | <img width="416" height="409" alt="image" src="https://github.com/user-attachments/assets/e0eb0a4e-eb7b-4ee6-b080-536ea2a75c68" /> | <img width="421" height="272" alt="image" src="https://github.com/user-attachments/assets/6468a234-0966-45c9-9435-e97d9752b794" /> | Forward-Port-Of: odoo/odoo#286228 Forward-Port-Of: odoo/odoo#273257
Fixes a spelling mistake in the website editor’s Instagram video embed option. Users will now see “Instagram” spelled correctly when adding an Instagram reel, making the editor look more polished and professional.
Original PR description
Steps to reproduce: - Edit existing page. - Paste any Instagram reel. - In powerbox Instagram entry is listed as "Embed Intagram Video". Introduced by https://github.com/odoo/odoo/commit/2bae2abd4db704451234b115eb4942dcae7d8afa This commit fixes typo. Forward-Port-Of: odoo/odoo#286529
The demo payment provider now handles refunds correctly after a manually captured payment. This prevents users from getting stuck with a negative authorized amount and keeps refund testing flows reliable.
Original PR description
Issue: --- When using manual capture, you can refund the transaction but it will be only authorized, and you'll then be blocked with a negative authorized amount and the impossibility to refund it. This seems to be specific to demo payment provider. Steps: 1- Enable manual capture on demo provider. 2- Buy a product from shop and checkout and pay. 3- Capture the payment in backend. Then click on post process. 4- Try refund. opw-6413515 Forward-Port-Of: odoo/odoo#286625 Forward-Port-Of: odoo/odoo#282315
This fixes an issue where some already-applied website editor options could be ignored when their priority value was negative. It helps ensure the editor correctly recognizes the selected option, improving reliability for users editing page components.
Original PR description
The function `useSelectableComponent` looked for the selected option by searching for the option with the highest priority among the options that are applied. The search for highest priority implicitely excluded options with negative priority. This case happens with `composite` action when the inner actions have no definition of `getPriority`. This commit initialize the "highest priority found so far" as `-Infinity` instead of 0. task-5245362 Forward-Port-Of: odoo/odoo#286652 Forward-Port-Of: odoo/odoo#286503
This update fixes outdated internal documentation about how temporary records are accessed. It clarifies that these records follow normal access rights and record rules, reducing confusion for teams maintaining or auditing permissions.
Original PR description
Since 6d8688bb124d, TransientModel records use the regular access rights mechanisms instead of being implicitly restricted to their creator. The docstring was not updated with that change and has therefore incorrectly documented creator-only access since 14.0. Forward-Port-Of: odoo/odoo#286374 Forward-Port-Of: odoo/odoo#286251
The onboarding walkthroughs for Rental and Studio were adjusted so automated guided tours run correctly. This helps keep setup guidance reliable for users and prevents validation issues in tour steps.
Original PR description
rental_tour: use stepUtils.saveForm() instead of a manual save click, and add missing isActive:["manual"] twins for autocomplete selection steps. web_studio_new_app_tour: drop two timeout keys rejected by the onboarding step schema.
Belgian payroll attestations now handle employee contracts that do not have an end date. This prevents errors or incorrect occupation information for ongoing contracts, improving payroll document reliability.
Original PR description
A check was missing if the contract end date was false Forward-Port-Of: odoo/enterprise#130410 Forward-Port-Of: odoo/enterprise#130346
The UK CIS report now correctly includes payment information for receipts that use CIS taxes. This ensures businesses get a more complete and accurate view of CIS-related transactions, not just vendor bills.
Original PR description
With the l10n_uk_reports_cis module installed: - Create a vendor bills and add a CIS tax --> This vendor's bills appear correctly in the report. - Create a receipt and add a CIS tax --> This type of bill appears in the report, but the payment is not showing up. opw-6282548 Forward-Port-Of: odoo/enterprise#129395 Forward-Port-Of: odoo/enterprise#124043
This update adds test coverage to ensure spreadsheets exported to Excel keep embedded images correctly. It helps reduce the risk of broken exports for users sharing or downloading spreadsheet documents.
Original PR description
Counterpart of https://github.com/odoo/odoo/pull/279788 Task-6432724 Forward-Port-Of: odoo/enterprise#130172 Forward-Port-Of: odoo/enterprise#126384
This fix removes sample planning data that could fail to load when an optional project planning feature is not installed. It helps ensure the Helpdesk, Field Service, Sales, and Timesheets integration installs reliably without requiring an unrelated module.
Original PR description
…ct on helpdesk intervention Before this commit, `project_id` field in `planning.slot` only exists if `project_forecast` module is installed. However, when `helpdesk_planning_field_service_sale_timesheet` is installed, we cannot guarranty `project_forecast` module is also installed since it is not in the dependencies of `helpdesk_planning_field_service_sale_timesheet` module. This commit just removes the demo data inside `helpdesk_planning_field_service_sale_timesheet` module. Forward-Port-Of: odoo/enterprise#130433
This fixes a small display issue where expanded inventory valuation lines still showed a closed-folder icon. Users now get the correct visual cue when sublines are open, reducing confusion while reviewing stock valuation details.
Original PR description
c5a40a608280 ([IMP] *: apply new icon implementation globally) introduced a typo: it replaced a working `fa-folder#{this.state.displaySublines ? '-open' : ''}-o` with the new icon API and dropped the `s` on the way. Only master carries that rewrite, so this is master-only -- saas-19.4 and older still have the FontAwesome form and are correct there.
Additionally before the commit rewrite the icon was never filled so we drop the fill condition as wellThe map view now uses the record limit defined by the action when no specific map limit is set. This makes map behavior consistent with other views and helps users see the expected number of records.
Original PR description
The map view only considered the `limit` set in the arch, ignoring the one coming from the action (`ir.actions.act_window.limit`), unlike other views (list, kanban) which fall back to it. task-6531776
This fix prevents automated accounting-related processes from failing when they run with elevated permissions on behalf of users who do not have accounting access rights. It helps modules that need accounting reports, such as localization reporting, complete setup or return creation reliably.
Original PR description
This was spotted in a dev branch for master, where we set a default account_opening_date on every company, hence trying to directly create the returns for it. Some modules need to call reports for that (like intrastat l10n), and do it in sudo(). However, even in sudo, a user without the accounting rights still doesn't have the proper group, and it raises an exception. We hence adapt the condition. Forward-Port-Of: odoo/enterprise#130448
This fixes a small visual issue where the side area of kanban cards could have slightly mismatched rounded corners. The update makes card styling more polished and consistent by accounting for the card border when applying corner rounding.
Original PR description
Ensure the aside element gets the right `border-radius` value by taking the `border-width` of the kanban card into account when computing the radius value. task-6537730 | Master (top radius is incorrect due to the border width) | This PR (take the border width into account) | |--------|--------| | <img width="122" height="186" alt="image" src="https://github.com/user-attachments/assets/ec39123d-f874-4374-805e-82371d5ed8d4" /> | <img width="125" height="191" alt="image" src="https://github.com/user-attachments/assets/25ba6513-d1b3-4f18-805d-afa83c152bff" /> |
Fixes visual spacing problems introduced by the Frost design in list, kanban, and search panel views. This keeps the Community interface cleaner and more consistent while moving edition-specific styling to the right place.
Original PR description
Since the introduction of the Frost design, some spacing customizations for the List, Kanban, and Search Panel views have been defined in Community instead of Enterprise, causing spacing issues in…
Since the introduction of the Frost design, some spacing customizations for the List, Kanban, and Search Panel views have been defined in Community instead of Enterprise, causing spacing issues in Community. To fix this, this commit moves the relevant customizations to Enterprise and adapts them accordingly. task-6527607 Requires: - https://github.com/odoo/enterprise/pull/130335 | Before | After | |--------|--------| | <img width="1914" height="769" alt="Screenshot 2026-09-03 at 16 41 22" src="https://github.com/user-attachments/assets/9fa1be40-e3ff-4679-a739-dc86de516607" /> | <img width="1916" height="756" alt="Screenshot 2026-09-03 at 16 39 55" src="https://github.com/user-attachments/assets/6c6530f6-b20f-4339-b1ce-2ac4d7f8b837" /> | | <img width="1915" height="723" alt="Screenshot 2026-09-03 at 16 41 20" src="https://github.com/user-attachments/assets/0f7abbea-d9ab-4850-9d7f-7aae0995321b" /> | <img width="1918" height="753" alt="Screenshot 2026-09-03 at 16 39 46" src="https://github.com/user-attachments/assets/03855cf2-28b5-4b26-9fe2-30a9f9eec3d5" /> | | <img width="1918" height="550" alt="Screenshot 2026-09-03 at 16 41 05" src="https://github.com/user-attachments/assets/c4c6c703-55e9-4653-90c1-c6ce93610c0a" /> | <img width="1917" height="598" alt="Screenshot 2026-09-03 at 16 40 59" src="https://github.com/user-attachments/assets/02af42f0-84ed-457a-870c-8afd3efb0bcd" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change restores the correct table layout in the inventory report after a previous update caused extra columns to appear in the report body. It helps ensure inventory information is displayed clearly and consistently for users reviewing stock reports.
Original PR description
This reverts commit 43add3f72f29c35280869010b897c3c5656f5120. It was adding too many columns in table body after columns were removed from the header in 19.0. opw-6307728 Forward-Port-Of: odoo/odoo#286294
This fixes a visual spacing issue in the control panel actions that could appear when custom actions were added. It helps keep the interface aligned and consistent after recent UI updates.
Original PR description
After the new ui improvements the control panel actions had some styling issues when xpath is used to add new actions. no task id
The VoIP sound upload area now opens the file selector when users click anywhere inside the upload zone, not just on the icon or label. This makes the form behave as users expect and reduces confusion when uploading or recording sounds.
Original PR description
In a sound form, the file selector only opened when clicking directly on the Upload icon or label. Clicking elsewhere inside the drop zone had no effect, although the entire area looked interactive. Use the complete drop zone as the FileUploader toggler and render it as a button. Also show the pointer cursor consistently on the Upload and Record zones.
This fix restores the intended visual spacing in key Enterprise views after design-related styles were placed in the wrong edition. Users should see more consistent layout spacing in list, kanban, and search panel areas, while Community no longer inherits Enterprise-specific spacing behavior.
Original PR description
Since the introduction of the Frost design, some spacing customizations for the List, Kanban, and Search Panel views have been defined in Community instead of Enterprise, causing spacing issues in Community. To fix this, this commit moves the relevant customizations to Enterprise and adapts them accordingly. task-6527607 Requires: - https://github.com/odoo/odoo/pull/286518 | Before | After | |--------|--------| | <img width="400" height="302" alt="Screenshot 2026-09-03 at 16 44 42" src="https://github.com/user-attachments/assets/4872fb70-cc75-4d8b-80d2-6d5ff44fe1b0" /> | <img width="399" height="301" alt="Screenshot 2026-09-03 at 16 44 45" src="https://github.com/user-attachments/assets/92ff245a-7416-4652-98b1-1a90951cc8c3" /> |
This update adjusts how dropdown menus track their target elements as part of the ongoing web platform migration. It prevents pivot table dropdowns from losing required styling or failing to open correctly, improving reliability without changing the user experience.
Original PR description
Remove useLayoutEffect from dropdown.js as part of OWL3 migration.
The website scroll button now keeps a visible focus indicator when people navigate with a keyboard. This improves accessibility by making it clearer which page control is currently selected.
Original PR description
Scroll button had no outline, which is an issue for people navigating with their keyboards. Now, outline is removed with :focus, but not :focus-visible Task-6009931
Selecting a company or contact suggestion now correctly returns the form to its saved state after the record is updated. This prevents users from seeing inactive save or discard buttons after autocomplete has already saved the enriched partner details.
Original PR description
Steps to reproduce: 1) open partner form view 2) type in the name field 3) select a suggestion from the autocomplete dropdown Issue: The record is enriched and saved, but the form still displays the save/discard buttons, and clicking them does nothing. The record dirty indicator is driven by 2 signals 1) `model.root.dirty`, which is cleared by save() call earlier in the onSelect() 2) the state `fieldIsDirty` of the `FormStatusIndicator` The second indicator is set to true when the user types in an input field, and selecting an option never clears it. The `setDirty` prop no longer exists, and therefore was deadcode. This commit emits `FIELD_IS_DIRTY` bus event, which is the only way to update the second indicator. With that, the indicator goes back to saved state once the record is updated. task-6475332 Forward-Port-Of: odoo/odoo#286651 Forward-Port-Of: odoo/odoo#285897
This fixes a crash when generating electronic invoice data in Community Edition without the Enterprise accounting add-on installed. The system now checks whether optional deferred billing date fields are available before using them, helping electronic invoicing work reliably across editions.
Original PR description
The fields `deferred_start_date` and `deferred_end_date` are created by the enterprise addon `account_accountant`, so not having it installed, this crashes with:
```
File "/opt/odoo/auto/addons/account_edi_ubl_cii/models/account_edi_cii.py", line 684, in <listcomp>
billing_start_dates += [move_line.deferred_start_date for move_line in invoice.invoice_line_ids if move_line.deferred_start_date]
AttributeError: 'account.move.line' object has no attribute 'deferred_start_date'
```
This PR protects the access to these fields checking first if they exist.
Bug introduced in the refactoring in #261572.
@Tecnativa TT64359
Forward-Port-Of: odoo/odoo#286245Portal users who follow a project can now reliably open the tasks they are allowed to see, instead of sometimes getting a “not found” error. This improves the customer portal experience by aligning task page access with the task list permissions.
Original PR description
Before this commit, the portal user could have a request not found when he wants to access to a task from a project he follows even if he can access to the task in /my/tasks route. This commit makes sure the read access are checked instead of checking if the user can access to the task thanks to the token since the token if the one of the project. Forward-Port-Of: odoo/odoo#285878
This fix prevents restaurant preparation tickets from failing during installation when the point of sale module has not yet been upgraded. It uses a more stable receipt section that already exists across versions, reducing manual upgrade steps and avoiding issues for customized setups.
Original PR description
The template for the preparation tickets was using an xpath targeting a newly added div element. This raised an error when installing the `pos_restaurant` module while an old version of `point_of_sale` was still in place, since the customer would need to manually upgrade `point_of_sale` first to have that new div element available. We now use receipt-header as the xpath target, which was always present in the template. We also refill `pos_self_order.pos_order_change_receipt` to prevent breaks with custo. --- Report: https://github.com/odoo/odoo/pull/267161#discussion_r3758115362 Forward-Port-Of: odoo/odoo#281768
Live chat visitors will now see the chatbot typing animation while the bot pauses between scripted steps. This makes automated conversations feel more responsive and reduces confusion during short waits.
Original PR description
Before this commit, a chatbot never shows that it is typing: the animated dots between two steps of its script never appear in the livechat. This happens because typingMessage tests this.isTypingUi on the Chatbot record, a getter of discuss.channel.member that Chatbot does not have, so the read is always undefined and no typing message is inserted. This comes from "[IMP] mail: disable isTyping when muted", which renamed the reads of the member field and took the read of the chatbot's own isTyping attribute along. This commit tests isTyping again, so the typing message shows while the script waits between two steps. Forward-Port-Of: odoo/odoo#285930
The Belgian payroll DMFA check no longer fails for flexible employees who do not have a standard work calendar. It now uses their expected weekly hours to validate quarterly work days, helping payroll teams avoid incorrect warnings or blocked processing.
Original PR description
In this other PR (https://github.com/odoo/enterprise/pull/120063) we added a DMFA warning to check that every employee included in a DMFA has worked the correct number of days in the quarter. Since the calendar can change between employees, we were calling a function to tell us for each employee how many days was he supposed to work. However, if an employee is flexible he has no calendar, the function fails. In that case we have the number of hours it's supposed to work per week and we can fallback to that since we know there are exactly 13 weeks in a quarter. Task: 6497142
This fixes a visual inconsistency in the VoIP sound form when dark mode is enabled. The form background and its surrounding header now use matching colors, creating a cleaner and less distracting experience for users.
Original PR description
In dark mode, the sound form background and the header of the node containing it used inconsistent colors.
Financial reports no longer show the unallocated earnings or losses line when its balance is zero across all columns. This keeps trial balance reports cleaner and helps users focus on meaningful figures.
Original PR description
… zero The unallocated earnings/losses line was displayed even when its balance was zero in every column group, cluttering the report with uninformative rows. We therefore filter out lines whose balance is zero across all column groups. Forward-Port-Of: odoo/enterprise#129666 Forward-Port-Of: odoo/enterprise#129129
The VoIP call flow editor now displays correctly when dark mode is enabled. This improves readability and creates a more consistent experience for users working with call flows in darker interface settings.
Original PR description
Before this commit, the call flow editor kept its light background and node colors when dark mode was enabled, resulting in poor contrast and inconsistent styling. This commit adds dark mode styles for the canvas, grid, nodes, connections, ports, selection states, and location indicator.
This fix stops users from creating order boxes directly from printer settings. Order boxes must be linked to a real physical device, helping avoid incorrect setup and operational confusion in point-of-sale self-order flows.
Original PR description
We prevent users from creating oboxes from pos.printer model, as oboxes should be paired with an actual device. Forward-Port-Of: odoo/enterprise#130197 Forward-Port-Of: odoo/enterprise#129960
Added automated checks to ensure time-tracking assistant suggestions are correctly matched to helpdesk tickets and related calendar entries. This reduces the risk of incorrect timesheet links and helps maintain reliable support reporting.
Original PR description
task: 6475133 Forward-Port-Of: odoo/enterprise#130157
This update corrects icon-related issues across the application to improve visual consistency and usability. Users should see clearer, more reliable interface elements, with no expected workflow changes.
This fixes a timing issue in the self-order interface where closing or changing a carousel during a slide could trigger errors in automated flows. The change improves reliability of the self-order experience without altering user-facing features.
Original PR description
Option A (guard in the hook). Disposing a Carousel mid-slide left its queued transition callback running against a nulled `_element`, throwing `TypeError: Illegal invocation` in unrelated self-order tours. Option B. The self-order bundle ships Bootstrap without `web/static/src/libs/bootstrap.js`, so the fix skipping a transition callback whose element is gone never applied here. Costs ~89kB: the patch file needs Tooltip/Dropdown/Modal. runbot-946931 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Opening the generate lot dialog during receiving could show an error because the system tried to use missing information. The update adds safeguards so warehouse users can open the dialog without the warning interrupting their workflow.
Original PR description
When opening the dialog in stock delivery there is an error warning about reading from undefined. This commit adds extra checks to prevent this.
This fixes French electronic invoice exports so that paid invoices automatically include the required due date, matching the payment date. It helps businesses comply with the latest French invoicing validation rules and reduces the risk of rejected invoice files.
Original PR description
According the schematron v1.4, the cbc:DueDate is required when the move is PAID. "[BR-FR-CO-09/BT-23] : Si le cadre de facturation (BT-23) est B2, S2 ou M2, alors la date d’échéance (BT-9) doit être renseignée et correspondre à la date de paiement." no-task --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286263
Sales order lines for timesheet-based services now update remaining hours when relevant unit or availability details change. This helps keep project and service billing information accurate without relying on unrelated timesheet triggers.
Original PR description
The dependencies of _compute_remaining_hours do not match the fields actually used for the computation: it lists analytic_line_ids, which it never uses, and omits both remaining_hours_available, and product_uom. _compute_remaining_hours_available has the same issue: it uses product_uom but only depends on product_id.service_policy. analytic_line_ids, on the other hand, can be dropped: qty_delivered already depends on it, along with its so_line, unit_amount, product_uom_id and project_id, so the timesheet flow keeps triggering the recomputation. This PR fixes the dependencies for both aforementioned compute methods. Task-4748521 Forward-Port-Of: odoo/odoo#285685 Forward-Port-Of: odoo/odoo#284750
Product thumbnails on ecommerce product pages now stay neatly aligned when automatic image cropping is turned off. This improves the shopping experience by keeping thumbnail rows tidy and ensuring product images are centered properly, even when images have very different shapes.
Original PR description
Steps to reproduce: =================== 1. Add several images to a product, one of them much wider than tall. 2. On the product page, set the image ratio to "Disabled". 3. Move the thumbnails below…
Steps to reproduce: =================== 1. Add several images to a product, one of them much wider than tall. 2. On the product page, set the image ratio to "Disabled". 3. Move the thumbnails below the image. => The wide thumbnail sits at the top of its slot, with blank space under it. Root cause: =========== Thumbnails are given a fixed width of 64px and take their height from `aspect-ratio: var(--o-wsale-product-image-ratio)` [1]. With cropping disabled that variable is `auto`, so each thumbnail keeps the shape of its own image and they no longer share a height. They sit in a flex row, which stretches every slot to the height of the tallest one. The image inside keeps its own height and stays at the top of the slot, so a wide image leaves the rest of its slot empty. The slots are only stretched when the images differ in height, which is why the problem needs cropping to be disabled, and why it does not appear when every image is a landscape one. - [1] sized the thumbnails from the image ratio. Fix: ==== Center the thumbnails in the row so each one keeps the height of its own image instead of being stretched to the tallest. Their width stays at 64px, so a row of wide images still takes the same space as before and none of them is pushed out of the container. [1]: 670b1daa2254 opw-6472484 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283246
This fixes date-related tests so they use the same timezone as the Odoo environment. It prevents occasional test failures around midnight in Belgium, improving reliability without changing business functionality.
Original PR description
## Issue By default in Odoo, `datetime.now()` returns the UTC time, which is two hours behind the local time in Belgium. This leads to two tests failing when executed between 00:00 and 02:00 Belgian…
## Issue By default in Odoo, `datetime.now()` returns the UTC time, which is two hours behind the local time in Belgium. This leads to two tests failing when executed between 00:00 and 02:00 Belgian time: `test_ir_sequence_interpolation_dict` and `test_ir_sequence_iso_directives`. The `_interpolate_dict` method (responsible for interpolating the prefix/suffix from the sequences) specifies the tzinfo when calling `datetime.now()`: https://github.com/odoo/odoo/blob/9c67949be529eb86886b3d5bde08e81e048ecfe7/odoo/addons/base/models/ir_sequence.py#L211-L212 Since this is not the case in the tests, the tests evaluate the date using UTC. This creates a two hours difference between the time expected and the time actually used by `next_by_code`. The tests thus fail between 00:00 and 02:00 because the evaluate dates from both `datetime.now` calls differ, leading to a mismatch in the expected prefixes. ## Fix We force the `env.tz` on the `datetime.now()` call, to mimic the behavior from the `_interpolate_dict`. runbot-242662 Forward-Port-Of: odoo/odoo#284955
This fixes a display issue in the website editor where resize controls could be hidden behind the sidebar when editing animated content. Users can now clearly see and resize selected page elements, improving editing accuracy and reducing confusion.
Original PR description
Steps to reproduce: - Drop a few snippets to make the page scrollable - At the bottom, drop the `s_three_columns` snippet - Click on the last Card - Add an animation "onScroll" (Effect - Slide, Intensity - 100) - Scroll top slightly to hide a part of the card behind the sidebar => The resize overlay is partially hidden The elements `.hb-row` have a z-index of 2, so they appear in front of the overlay which has a z-index of 1. It was decided to fully show the overlay to allow resizing. Keeping the overlay visible in front of the sidebar also allow the user to see where animated element is. task-6476269 Forward-Port-Of: odoo/odoo#283842 Forward-Port-Of: odoo/odoo#282796
This fixes a website editor issue where deleting a card's cover image could leave the card in an inconsistent state. Users will no longer encounter broken cover image options or related errors when editing card-based website snippets.
Original PR description
It was possible to remove the image inside a card cover while keeping the figure wrapper. The card option would then still consider that there was a cover image even though the image was gone, which could also lead to a traceback. Steps to reproduce: - Insert the `s_three_columns` snippet - Click on the image of one card - Either press "Enter", "Delete", "Backspace" - Hover the "Cover Image" options => The image is removed but the `<figure>` is still there, so the option is still considered active (leading to a traceback) task-6081728 Forward-Port-Of: odoo/odoo#285131 Forward-Port-Of: odoo/odoo#280086
This fix updates an internal test so it consistently includes the required tax information when checking Indonesian e-Faktur behavior. It helps prevent false build failures and supports more reliable delivery of the localization feature, without changing day-to-day user workflows.
Original PR description
Issue: In some build, when creating the invoice line it did not assign the default tax so it raise an error when downloading efaktur Fix: Assign the tax line manually in the unit test instead of relying on default taxes issue-[946227](https://runbot.odoo.com/odoo/error/946227) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285902
The editor no longer shows a non-working magic wand icon when users open the link popover for an image with a link. This removes a confusing control and makes editing linked images clearer.
Original PR description
**Current behavior before PR:** Steps to reproduce the issue: - Add an image - Add a link to the image - Put cursor just right after the image link so that link popover is opened - Notice that there is a wand icon in link popover to replace title, clicking on it does nothing **Desired behavior after PR:** There should be no replace title icon in popover for image-link. task-6420902 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286119 Forward-Port-Of: odoo/odoo#279076
Fixes an issue where the website builder showed an inaccurate preview when changing header width for a specific boxed header style. This makes the setting apply more reliably and avoids misleading previews for website editors.
Original PR description
The header width option is not previewed properly on the header template `template_header_boxed`. This happens because this template is not compatible with the action `previewableWebsiteConfig` (its width can't be previewed by adding a single class). This commit fixes the problem by using the action `websiteConfig` instead of `previewableWebsiteConfig` when this template is set. task-6420611 Forward-Port-Of: odoo/odoo#286292 Forward-Port-Of: odoo/odoo#282311
This fixes a mismatch between SMS delivery error handling and mass SMS mailings. Mass SMS campaigns now recognize the newer failure reason, preventing affected flows from crashing when that error occurs.
Original PR description
This commit fixes an issue with the addition of a new failure_type in the SMS module via [1]. The corresponding failure_type wasn't added in mass_mailing_sms meaning that some flows could crash if the specific error was set. Now, the new failure_type is added to the module. [1]:https://github.com/odoo/odoo/commit/06bab9a82dae911c26fd5dd329cb43a466d13569 Forward-Port-Of: odoo/odoo#286510
The Vietnam accounting report variants now keep the search bar available when users switch to the VAS general journal or general ledger. This lets users filter account lines by name consistently, matching the standard general ledger behavior.
Original PR description
The standard general ledger enables the search bar, but the VAS general journal (S03a-DN) and general ledger (S03b-DN) variants do not, so the search field disappears as soon as the user switches to one of them and the account lines can no longer be filtered by name. Enable the search bar on both variants to match their root report.
This fix makes an automated restaurant appointment test wait until a cancellation dialog fully closes before ending. It helps prevent intermittent false test failures, improving confidence in release validation without changing user-facing behavior.
Original PR description
Following commit b6a7991a6aaef1be15a27852c2c76737322cdcab, the tour clicks the cancel button (.o_form_button_cancel) to discard unsaved changes. However, as it was the last step of the tour, the test could terminate before the asynchronous discard/dialog closure completed. This caused intermittent test failures with: `AssertionError: Tour finished with a dirty form view being open.` We now add a final step that waits for the dialog to close and the form to no longer be marked as dirty (`body:not(:has(.o_dialog)):not(:has(.o_form_dirty))`) before completing the tour. Forward-Port-Of: odoo/enterprise#129375
Freezing spreadsheet data now creates the expected data protection log entry. This helps businesses keep a clearer audit trail when spreadsheet content is locked or preserved.
Original PR description
Task: 6389096 Forward-Port-Of: odoo/enterprise#130229 Forward-Port-Of: odoo/enterprise#126461
The web test suite now ignores assets that do not have a file-based name instead of failing unexpectedly. This keeps JavaScript regression testing reliable when websites use customized themes or when asset paths are invalid.
Original PR description
### Problem `HootCommon` in `addons/web/tests/test_js.py` calls `.endswith()` on `asset['filename']` in two places without checking it for `None`: ```python filename = asset['filename'] if not…
### Problem
`HootCommon` in `addons/web/tests/test_js.py` calls `.endswith()` on
`asset['filename']` in two places without checking it for `None`:
```python
filename = asset['filename']
if not filename.endswith('.test.js'):
```
```python
if asset['filename'].endswith('.test.js')
```
But `filename` is legitimately `None` for assets backed by an `ir.attachment`
rather than a file on disk. `ir_asset.py::_get_paths` sets it that way on
purpose (the "an attachment url most likely" branch).
### Reproduction
Customise a website theme (which creates an `ir.attachment`-backed asset), then
run the core JS suite. Four tests fail with:
```
AttributeError: 'NoneType' object has no attribute 'endswith'
```
The same happens with a simple typo in a manifest's asset path, which produces
`filename = None` with only a warning — so a one-character mistake turns the
whole JS suite red instead of reporting the typo.
### Fix
An asset with no file on disk cannot be a `.test.js`, so the correct response to
`filename is None` is the same as for any other name that does not end in
`.test.js`: skip it.
The suite is currently red permanently on any database with a customised theme,
which is exactly when it stops being useful as a regression signal.Fixes a storefront issue where changing options on an out-of-stock product could make the "Add to wishlist" button shift position. This keeps the shopping experience visually stable and avoids confusing customers browsing unavailable product variants.
Original PR description
On an out-of-stock product page where we prevent out-of-stock sale, changing the attribute value moves the "Add to wishlist" button Steps to reproduce: 1. Install eCommerce and Inventory 2. Go to Settings > Website > eCommerce > Inventory Defaults and disable the option "Continue Selling" for Out-of-Stock products 3. Go to Inventory > Products, open product Customizable Desk. In the eCommerce tab, disable option "Sell when Out-of-Stock". 4. In the General Information tab, click on the Quantity On Hand and set all quantities to 0 5. Open the product on the eCommerce 6. Change the Legs attribute to Aluminium 7. The "Add to wishlist" button moves Issue: Changing the combination of the product only removes the `#product_stock_availability` element. However, there can be multiple elements that we need to remove. This was introduced in https://github.com/odoo/odoo/commit/6e72f45f78055de762a24e4a24a82a5565346d7a Solution: Reset the previous behavior opw-6507088
The mail app now cleans up its internal data store automatically when the app is closed, preventing leftover test subscriptions. This improves test reliability and reduces the chance of hidden side effects between mail-related tests without changing user-facing behavior.
Original PR description
Before this commit, a mail test that mounts its UI without the `start()` helper never disposes the store, so the subscriptions its records registered outlive the test: the chat hub and composer…
Before this commit, a mail test that mounts its UI without the `start()` helper never disposes the store, so the subscriptions its records registered outlive the test: the chat hub and composer service entries of the shared local storage listener, and one for each `localStorage` field of a record. `@mail/discuss/call/peer_to_peer` mounts with `mountWebClient()`. This happens because nothing in src disposes a store: a deleted record runs its dispose functions from the delete queue, and the store is a singleton nothing deletes, so its own teardown had one caller, the `after()` hook of `start()`. Note that hoot rebuilds the module set of a test file, so such a subscription is collected with its file and the memory of the suite does not grow. This commit registers the teardown on the scope of the app that builds the store, the one services start in and that `makeStore` already reads `useApp()` from, so destroying the app runs the store's dispose functions and the tests need no hook of their own.
The website editor now treats forum information links as regular links instead of buttons. This avoids confusing styling options when editing forum pages and keeps the editing experience clearer across desktop and mobile.
Original PR description
Steps to reproduce: - Go to a forum page. - Open the website editor. - Select the "About this forum" link in the sidebar. => Button styling options are shown for a regular link. Before this commit, forum information links used button classes, which made the editor expose button styling options for them. After this commit, the `btn`, `btn-sm`, and `btn-link` classes are replaced with `small` so the editor treats these elements as regular links on desktop and mobile. task-6259086 Forward-Port-Of: odoo/odoo#283156
This change removes an obsolete browser history update from spreadsheet document navigation. It keeps the routing behavior simpler after a previous change introduced a dedicated way to handle shared links with tokens, with no expected impact on normal users.
Original PR description
the replaceState after loading the router patch became useless when we changed the implementation of https://github.com/odoo/enterprise/pull/114484 in favor of a dedicated route to handle urls with a token instead of an id. Task-6485474
The ESG module now cleans up its unit links correctly during uninstall, preventing a reinstall failure. This improves system reliability for customers who remove and reinstall the ESG app or run upgrade and test workflows.
Original PR description
As `relative_uom_id` is on delete cascade, when uninstalling esg module, `uom.product_uom_kwh` is being removed when `esg.product_uom_j` is removed. When reinstalling esg module, we try to override uom.product_uom_kwh but it does not exist anymore, causing the error: Cannot update missing record. To prevent this error, we need to detach the core kWh unit from our own J unit when uninstalling esg module. runbot-error: [946474](https://runbot.odoo.com/odoo/runbot.build.error/946474) version-19.5
The Helpdesk team card now displays the email alias aligned with the team name. This small visual fix makes the card easier to read and keeps the Helpdesk interface looking consistent.
Original PR description
In this commit, we remove the margin before the mail alias, ensuring aligment within the helpdesk team card. task-6416578 Forward-Port-Of: odoo/enterprise#129865
Kitchen and change receipts now use the POS configuration tied to the order, even when multiple configurations share the same kitchen setup. This helps ensure printed receipts show the right store or register details without affecting standard single-configuration POS printing.
Original PR description
In this commit: ------------------- - Use the first loaded `pos_config` for kitchen when kitchen is common across multiple configs and use the order's associated config when printing a change receipt from the kitchen to ensure the correct config details are printed. - For regular POS printing, this remains unchanged since only one config is loaded. task: 6512063 Related PR: https://github.com/odoo/enterprise/pull/130117
The Belgian payroll fleet module is being removed again because it had previously been deleted but was accidentally brought back and expanded. This keeps the product aligned with the intended module set and avoids maintaining functionality that should no longer be available.
Original PR description
Module was originally deleted in #111407 Module was incorrectly reintroduced in #127537 Module was incorrectly expanded in #128941 Kill it again.
This change removes modules and related translation/assets files that had previously been deleted but accidentally returned. It keeps the product codebase clean and avoids exposing unsupported or obsolete functionality.
Original PR description
They got resurrected through foul play and unnatural means, lay them to rest.
WhatsApp channel owners are now consistently prevented from leaving their own channels, including when removals happen through the member list. Bot and AI agent member cleanup is handled more directly, reducing unnecessary leave messages and making channel membership behavior more reliable.
Original PR description
- Move WhatsApp owner leave guard to discuss.channel.member.unlink() - Unlink bot and AI agent members with post_leave_message=False context task-4715497
Argentina withholding reports now use the shared withholding tax structure, keeping reporting aligned with the refactored tax module. A related Peru withholding payment view issue was also corrected so the screen uses the proper underlying dependency.
Original PR description
We're refactoring the Argentina withholding module to use the generic l10n_account_withholding_tax. This commit adapt the reports to use the generic fields instead. task-5865443
This update refreshes internal code used by several Enterprise web interface components to align with the latest framework standards. It improves maintainability and validation behind the scenes without changing day-to-day user workflows.
Original PR description
See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The purchase approvals flow was updated to work with supplier information provided in a newer format. This keeps approval requests aligned with recent purchasing changes and avoids issues when supplier details come from past purchase activity rather than a saved supplier record.
Original PR description
product.product._select_seller now returns the seller information as a dict instead of a product.supplierinfo record, since a seller can come from the last confirmed purchase order line, which has no record. Community PR: odoo/odoo#279993 task-5456444
This update modernizes the internal setup of the Unsplash image integration in Odoo. It helps keep the feature compatible with the latest web framework standards without changing how users interact with it.
Original PR description
See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The hierarchy view code was updated to use the newer component configuration approach. This keeps the underlying interface code aligned with current standards and helps reduce future maintenance risk without changing user-facing behavior.
Original PR description
See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The map view code was updated to use the current component configuration approach. This keeps the feature aligned with the latest framework standards and helps reduce future maintenance risk without changing user-facing behavior.
Original PR description
See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update modernizes internal Gantt view components used in planning and scheduling screens. It helps keep the interface compatible with the latest framework standards and improves reliability checks without changing visible business workflows.
Original PR description
See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update modernizes internal cohort view code without changing the user experience. It improves validation and removes obsolete definitions, making the module easier to maintain and more reliable for future updates.
Original PR description
See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update standardizes how several Odoo interface components react to record changes, replacing a custom internal mechanism with a common framework approach. It should not change business workflows, but helps make the code easier to maintain and more consistent across apps.
Original PR description
* account,html_editor,mass_mailing,purchase_product_matrix,web Replace `useRecordObserver()` hook with the standard `useEffect()` hook and update callback signatures to access records via `this.props.record`.
This update modernizes internal manufacturing screen components as part of Odoo's Owl 3 platform migration. Users should not see functional changes, but the work helps keep manufacturing views maintainable and compatible with future Odoo improvements.
Original PR description
As part of the Owl 3 migration, this pr aims to replace **onWillUpdateProps** hook with the appropriate Owl 3 alternatives. enterprise: https://github.com/odoo/enterprise/pull/123857 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The social posting features were internally updated to stay compatible with the latest Odoo interface framework. This helps keep social and Twitter-related tools stable during the broader Owl 3 migration, without introducing visible workflow changes for users.
Original PR description
*=twitter As part of the Owl 3 migration, replace onWillUpdateProps hook with the appropriate Owl 3 alternatives.
Several Odoo Enterprise apps were updated to use a standard internal method for reacting to record changes. This keeps the codebase aligned with current practices and should improve long-term maintainability without changing day-to-day user workflows.
Original PR description
* iap_extract,knowledge,timer,web_studio Replace `useRecordObserver()` hook with the standard `useEffect()` hook and update callback signatures to access records via `this.props.record`.
This update modernizes part of the manufacturing work order display so it remains compatible with Odoo's newer web framework. It is an internal technical cleanup with no expected change to day-to-day manufacturing workflows.
Original PR description
As part of the Owl 3 migration, this pr aims to replace **onWillUpdateProps** hook with the appropriate Owl 3 alternatives. community: https://github.com/odoo/odoo/pull/275346
The HTML editor's color picker has been updated to use the latest underlying interface technology. This keeps the feature maintainable and aligned with current platform standards without changing how users work with it.
Original PR description
Replaces `proxy`, `useRef`, and `useLayoutEffect` (from `@web/owl2/utils`) with `signal`, `signal(null, t.ref())`, and `useEffect` from `@odoo/owl`. Also updates `t-custom-ref` → `t-ref` in the XML template. WHY: `useRef`, and `useLayoutEffect` are deprecated in OWL3; signals and `useEffect` are the idiomatic replacements. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update refreshes part of the web interface code to align with the next version of Odoo's underlying UI framework. It is an internal cleanup that helps keep the platform maintainable without changing day-to-day user workflows.
Original PR description
Remove useLayoutEffect from transition.js as part of OWL3 migration.
Updated the web code editor to use newer supported component lifecycle behavior, keeping invalid view markers working reliably after framework changes. This is an internal maintenance change that helps prevent editor errors and preserves existing highlighting behavior for users editing views.
Original PR description
Replaced `useLayoutEffect` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. `useEffect` (OWL3's `effect()`) runs synchronously during `setup()`, before mount, so…
Replaced `useLayoutEffect` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. `useEffect` (OWL3's `effect()`) runs synchronously during `setup()`, before mount, so `this.aceEditor` does not exist yet and calling `highlightInvalidLocators` throws. `onMounted` + `onPatched` mirrors what the OWL2-compat `useLayoutEffect` does internally and runs after the parent `CodeEditor`'s setup builds `this.aceEditor`. The highlighting logic is factored into `applyInvalidLocators()` (called from both hooks) which clears then re-adds markers, preserving the old cleanup-before-reapply behaviour. 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/views/fields/ir_ui_view_ace_field - Highlight invalid locators in inherited ir.ui.view - with invalid locators (WebSuite.test_unit_desktop) - @web/views/fields/ir_ui_view_ace_field - Highlight invalid locators in inherited ir.ui.view - with invalid locators (MobileWebSuite.test_unit_mobile) see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2624603/build/116553950
This update refreshes the stock inventory quantity widget so it continues to respond correctly when users edit counted quantities. It replaces an outdated internal mechanism with a supported approach, helping keep the interface reliable as the underlying framework evolves.
Original PR description
Replaced `useLayoutEffect` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. The single `useLayoutEffect` only attached `keydown` and `blur` listeners to `inputRef.el`,…
Replaced `useLayoutEffect` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. The single `useLayoutEffect` only attached `keydown` and `blur` listeners to `inputRef.el`, making it a natural candidate for `useListener`. However, `inputRef` is an OWL2-compat `useRef` whose `.el` getter reads the backing signal via `untrack`, so a `useListener(() => inputRef.el, ...)` call (which wraps `useEffect`) never subscribed to element changes — the effect ran once at setup when the readonly cell has no `<input>`, and never re-ran when the input appeared on edit, leaving both events unbound. The correct fix is to bind the two handlers once and (re)attach them in `onMounted` + `onPatched`, which run after each DOM patch and cover the input appearing on edit. `addEventListener` is idempotent for the same `(type, listener)` pair. 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: - `@stock/counted_quantity_widget/Test changing the inventory quantity with the widget` - `@stock/counted_quantity_widget/Test setting the inventory quantity to its default value of 0` - `WebSuite.test_unit_desktop` see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2605076/build/115404428
The WhatsApp message composer was updated to use a newer underlying approach required by the platform framework. This helps keep the feature compatible with future Odoo versions without changing the user experience.
Several internal components were updated to use newer framework patterns so they remain compatible with the next OWL version. This should not change day-to-day behavior, but it helps reduce upgrade risk for WhatsApp, accounting reports, and knowledge features.
Original PR description
Replace the manual async pattern (useLayoutEffect + useState + imperative fetch) with asyncComputed, which handles reactive re-fetching and in-flight request cancellation automatically. The placeholder char field no longer needs its own setup() or useState wrapper since the asyncComputed signals are already reactive and accessible directly via env. WHY: useLayoutEffect is deprecated in OWL3. Community PR: https://github.com/odoo/odoo/pull/267675
This update streamlines how the private card setup in Expenses reacts when secure access details become available. It is an internal cleanup intended to make the experience more reliable without changing day-to-day payroll or expense workflows.
Original PR description
Move ephemeralKey out of useState into a class-level signal and replace useLayoutEffect with effect so the iframe setup triggers reactively when the key is set, without relying on a post-render OWL2 hook.
This update modernizes part of the account reports interface by replacing an older internal rendering approach with the newer platform method. It should not change day-to-day behavior, but helps keep the reporting area easier to maintain and ready for future upgrades.
Original PR description
Remove useLayoutEffect from AccountReturnBaseKanbanRenderer. This is a refactoring step to replace owl2 useLayoutEffect with OWL3 native API.
This update modernizes how monetary input fields keep their displayed value in sync, preparing the web interface for the next version of Odoo's frontend framework. It is an internal cleanup with test coverage and should not change day-to-day user behavior.
Original PR description
Replaced `useLayoutEffect` in `MonetaryField` with a reactive `signal` exposed by `useInputField`, and removed the companion `proxy` state and `onInput` handler. `useLayoutEffect` is deprecated in…
Replaced `useLayoutEffect` in `MonetaryField` with a reactive `signal` exposed
by `useInputField`, and removed the companion `proxy` state and `onInput` handler.
`useLayoutEffect` is deprecated in OWL3.
`useInputField` now creates a `signal("")` (named `inputValue`) and calls
`inputValue.set(...)` at every point it owns the displayed text: the native
`onInput` handler, the `onChange` no-change revert, the patch layout-effect
(model/onchange sync), and the `commitChanges` revert. The signal is attached
to the returned ref as `inputRef.value` so all other `useInputField` consumers
are unaffected. `MonetaryField` replaces `this.state.value` with
`this.inputRef.value()` in the template ghost-sizing span and drops the
`onInput` method entirely.
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/views/fields/monetary_field/MonetaryField with currency set by an onchange`
- `WebSuite.test_unit_desktop`
- `MobileWebSuite.test_unit_mobile`
see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2624631/build/116554655The web control panel was updated to use a newer internal approach for managing screen updates. This keeps the interface aligned with the latest platform framework and helps maintain long-term reliability without changing day-to-day user workflows.
Original PR description
Remove useLayoutEffect usage in control_panel.js (throwaway commit, will be squashed).
This change modernizes an internal part of the online course quiz form so it aligns with the latest website framework practices. It should not change the visible learning experience, but helps keep the course website code reliable and easier to maintain.
Original PR description
Commenting out useLayoutEffect to break it on purpose and check test coverage.
The website forum code was updated to use a newer supported approach for handling popup click behavior. This keeps the forum feature aligned with the latest platform standards without changing the user experience.
Original PR description
Replaced \`useLayoutEffect\` with \`useEffect\` because \`useLayoutEffect\` is deprecated in OWL3. Used \`useEffect\` because the original code attached/detached a click listener on a DOM element queried from a reactive ref (\`this.modalRef.el\`). \`useEffect\` auto-tracks reactive dependencies and re-runs whenever they change, making it the natural OWL3 replacement for DOM side effects tied to reactive state. This is a CASE 2 commit. There is test coverage — tests failed when the effect was commented out: - FAIL: TestESLint.test_eslint see runbot build: https://runbot.odoo.com/runbot/batch/2596763/build/114855877
This change updates how action buttons are shown in Data Cleaning recycle records so the screen stays compatible with the latest Odoo interface framework. Users should see the same button behavior as before, with lower maintenance risk going forward.
Original PR description
Replaced `useLayoutEffect` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. `useLayoutEffect` without a dependency array runs after every render (both mount and patch).…
Replaced `useLayoutEffect` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. `useLayoutEffect` without a dependency array runs after every render (both mount and patch). The equivalent OWL3 pattern is `onMounted` (called once after the component is first mounted) + `onPatched` (called after each subsequent patch), both delegating to a shared `syncButtonVisibility` helper. When commenting out the useLayoutEffect there was no error, meaning the code we refactored had no test coverage. I tested personally using the following steps: 1. Enable developer mode (Settings → Activate the developer mode) 2. Go to Settings → Technical → Data Cleaning → Recycle Records (or install/open the Data Cleaning app and navigate to Recycle Records) 3. The list view of recycle records opens 4. Select one or more records that are **active** (not yet discarded): - Verify the "Validate" and "Discard" buttons appear in the action bar - Verify the "Undiscard" button is hidden 5. Select one or more records that are **inactive** (already discarded): - Verify the "Undiscard" button appears in the action bar - Verify "Validate" and "Discard" buttons are hidden 6. Select a mix of active and inactive records: - Verify all three action buttons are hidden (no all-active or all-inactive condition met) see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2596766/build/114855977
This change updates the internal implementation of the Point of Sale order display to align with the newer interface framework. It should not change daily cashier workflows, but it helps keep the system easier to maintain and ready for future upgrades.
Original PR description
Remove useLayoutEffect in order_display component, to be replaced with OWL3 native API.
This update modernizes an internal part of the HTML editor to align with the next version of Odoo's user interface framework. There should be no visible change for users, but it helps keep the editor reliable and easier to maintain during the platform migration.
Original PR description
Remove useLayoutEffect from position_hook.js as part of OWL3 migration.
The API documentation sidebar was updated to use the newer internal page behavior approach instead of an older method. This keeps the documentation area aligned with the latest platform standards while minimizing visible changes for users.
Original PR description
Commented out useLayoutEffect in DocSidebar to identify test coverage before replacing with OWL3 API.
This update simplifies the internal code used by the mass mailing email editor. It should not change how users create or edit mailings, but it helps keep the editor easier to maintain and less prone to future issues.
Original PR description
Remove useLayoutEffect in mass_mailing_html_field.
This update adjusts the HTML editor's overlay behavior as part of preparation for the next Odoo web framework version. It is an internal cleanup that should help maintain compatibility without changing how users work with the editor.
Original PR description
Remove useLayoutEffect from overlay.js as part of OWL3 migration.
This change updates internal web interface code to align with the next version of Odoo's front-end framework. It helps keep the web client maintainable and ready for future upgrades without introducing expected user-facing changes.
Original PR description
Remove useLayoutEffect from numpad_decimal_hook.js as part of OWL3 migration.
The website navigation code was updated as part of the move to the newer OWL3 framework. This is an internal cleanup that helps keep the website module compatible and maintainable without changing visible behavior for users.
Original PR description
Remove useLayoutEffect from navbar.js as part of OWL3 migration.
This update makes a small internal cleanup to the Point of Sale test popup by removing an unnecessary implementation detail. It helps keep the code simpler and easier to maintain without changing the user experience.
Original PR description
Remove useLayoutEffect from test_popup component.
The portal chatter code was modernized to use the latest built-in framework approach instead of an older implementation detail. This is an internal cleanup that helps keep the portal easier to maintain without changing the expected user experience.
Original PR description
Remove useLayoutEffect from portal chatter_patch.js, replacing with OWL3 native API.
This change simplifies part of the Point of Sale timing logic without changing the visible workflow for users. It helps keep the underlying code easier to maintain and less likely to cause interface timing issues in future updates.
Original PR description
Remove useLayoutEffect from time_hook.js in point_of_sale addon.
The Point of Sale customer list screen was updated to use the newer built-in application approach. This is an internal cleanup that helps keep the system easier to maintain without changing the user experience.
Original PR description
Remove useLayoutEffect usage in partner_list.js and replace with OWL3 native API.
The stock module was internally updated to align with the next version of Odoo's web interface technology. This keeps stock-related screens easier to maintain and helps reduce future migration risk, with no expected change to day-to-day user workflows.
Original PR description
Remove useLayoutEffect from json_widget.js as part of OWL3 migration.
The sales progress display was updated internally to align with Odoo's upcoming interface framework changes. This keeps the sales module easier to maintain without changing how users interact with it.
Original PR description
Remove useLayoutEffect usage in sale_progressbar_field.js as part of OWL3 migration.
This change updates the web search bar toggler to use Odoo's newer interface approach. It keeps the user experience the same while simplifying the underlying code for easier maintenance and future upgrades.
Original PR description
Remove useLayoutEffect from search_bar_toggler.js in favor of OWL3 native API.
This update refactors part of the calendar view code as part of an internal cleanup. It is not intended to change business workflows or add user-facing functionality, and the described commit is temporary work that will be consolidated later.
Original PR description
Remove useLayoutEffect in calendar_common_renderer by commenting it out. This is an intentionally-broken throwaway commit that will be squashed in Step 5.
This update simplifies the internal handling of the calendar year view in Odoo's web interface. It should not change what users see, but it helps keep the interface code easier to maintain and less likely to cause future issues.
Original PR description
Remove useLayoutEffect from CalendarYearRenderer (throwaway commit, will be squashed).
This update replaces an outdated internal web mechanism with the newer supported approach. It helps keep drag-and-drop interactions reliable after screen updates while reducing future maintenance risk.
Original PR description
Replaced `useLayoutEffect` supplied as `setupHooks.setup` in the draggable hook builder with a native OWL3 `setup` adapter because `useLayoutEffect` is deprecated in OWL3. The draggable builder…
Replaced `useLayoutEffect` supplied as `setupHooks.setup` in the draggable hook builder with a native OWL3 `setup` adapter because `useLayoutEffect` is deprecated in OWL3. The draggable builder passes effects with a two-argument shape `setup(effect, computeDependencies)` that OWL3's single-callback `useEffect` cannot satisfy directly; a `signal(false)` + reactive `useEffect` approach also fails because the params call site returns fresh array references every call, so `useEffect` never re-runs on patch (it sees no reactive subscription changes). A thin `setup` adapter using `onMounted`/`onPatched`/`onWillUnmount` reproduces the compat lifecycle exactly: deps are compared on every patch and the effect is re-run when they change, ensuring pointerenter/leave listeners are re-attached to new pill DOM after each re-render. The use layoutEffect refactored in this PR had test coverage — below are some tests that failed when the effect was commented out, and are now passing: - PasskeyTestTours.test_passkey_login - WebSuite.test_unit_desktop - TestTOTP.test_totp see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2605257/build/115408516
The product name and description area was internally updated as part of the move to the newer OWL framework. This does not add or remove visible features, but helps keep the product interface easier to maintain and ready for future improvements.
Original PR description
Remove useLayoutEffect in product_name_and_description.js as part of OWL3 migration.
This update simplifies the internal code behind the project task form without changing how users work with tasks. It helps keep the project app easier to maintain and reduces the risk of future technical issues.
Original PR description
Remove useLayoutEffect from project_task_form_controller — throwaway commit to be squashed in Step 5.
The web interface code for resizable panels was internally simplified as part of preparation for the next OWL framework version. This should not change day-to-day behavior, but it helps keep the interface maintainable and ready for future upgrades.
Original PR description
Remove useLayoutEffect usage in resizable_panel.js as part of OWL3 migration.
This update replaces an outdated internal web component mechanism with the supported approach in the newer OWL framework. It helps preserve existing drag-and-drop behavior, such as importing files and opening share dialogs, while reducing future maintenance risk.
Original PR description
Replaced `useLayoutEffect` with `onMounted` and `onPatched` because `useLayoutEffect` is deprecated in OWL3. `useLayoutEffect` was used in `useCustomDropzone` to track when the target element…
Replaced `useLayoutEffect` with `onMounted` and `onPatched` because `useLayoutEffect` is deprecated in OWL3. `useLayoutEffect` was used in `useCustomDropzone` to track when the target element appeared (setting `hasTarget` and calling `updateDropzone`). The straightforward OWL3 equivalent would be `useEffect`, but `useEffect` fires before the DOM patch and only re-runs when a signal read inside its body changes. Since `getTargetEl()` accesses the element via a legacy `.el` getter (which untracks the underlying signal), `useEffect` never re-ran on mount and `hasTarget` remained `false`. Using `onMounted` and `onPatched` instead restores the post-patch, re-run-on-every-render semantics of the original `useLayoutEffect`. The use layoutEffect refactored in this PR had test coverage — below are some tests that failed when the effect was commented out, and are now passing: - @base_import/import_action/Import view/drag-and-drop file support - @web_enterprise/webclient/home_menu/Drop file on HomeMenu should trigger the share target dialog if having share target items see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2624610/build/116554030
The celebratory rainbow effect was updated behind the scenes as part of Odoo's ongoing interface modernization. This keeps the web experience aligned with the next version of the underlying framework without changing how users interact with the feature.
Original PR description
Remove useLayoutEffect from rainbow_man.js as part of OWL3 migration.
The Project app has an internal code cleanup to support Odoo's migration to the newer OWL3 framework. This change should not alter day-to-day behavior, but helps keep the project interface compatible and easier to maintain.
Original PR description
Temporarily commenting out useLayoutEffect usage as part of migration to OWL3 native API.
The user switching component was adjusted internally to support Odoo's upcoming interface technology upgrade. This keeps the feature aligned with the new framework while preserving the current user experience.
Original PR description
Remove useLayoutEffect usage in user_switch.js as part of OWL3 migration.
This change adjusts how a web dashboard graph component handles screen updates, with the goal of simplifying internal code. It should not change day-to-day behavior for users, but it may help keep the web interface easier to maintain.
Original PR description
Remove useLayoutEffect in journal_dashboard_graph_field.js — intentionally broken throwaway commit to be squashed away in Step 5.
This change is a temporary internal cleanup in the web module as part of a broader interface framework migration. It does not introduce a new feature and is not expected to affect business workflows once finalized.
Original PR description
Intentionally broken throwaway commit: comments out useLayoutEffect in dropzone.js as part of the OWL3 migration process. Will be squashed in Step 5.
This change updates the web input field internals to align with the next version of Odoo's interface framework. It helps keep the platform maintainable and ready for future upgrades without changing day-to-day user behavior.
Original PR description
Remove useLayoutEffect usage in input_field_hook.js as part of OWL3 migration.
This change updates internal web interface code as part of preparation for the next OWL framework version. It is a technical cleanup with limited direct business impact, but the pull request notes it is intentionally broken and should not be treated as production-ready.
Original PR description
Commenting out useLayoutEffect usage in draggable_hook_builder.js as part of OWL3 migration. This is an intentionally-broken throwaway commit.
The PDF viewer field was internally updated to align with the platform's next web framework migration. This keeps the feature maintainable without changing the user experience.
Original PR description
Remove useLayoutEffect usage in pdf_viewer_field.js as part of OWL3 migration.
This change updates the web module internals as part of the ongoing migration to the next version of Odoo's web framework. It should not change day-to-day behavior for users, but helps keep the interface maintainable and compatible with future platform improvements.
Original PR description
Remove useLayoutEffect in property_definition.js as part of OWL3 migration.
This update simplifies an internal part of Odoo's web report handling by replacing a lower-level browser timing mechanism. Users should not notice any functional change, but the code becomes easier to maintain and less prone to subtle display timing issues.
Original PR description
Remove useLayoutEffect usage in report_hook.js
This change modernizes the web interface code behind multi-selection buttons by replacing an older internal approach with the platform's newer native capability. It should help keep the interface easier to maintain without changing how users interact with it.
Original PR description
Remove useLayoutEffect from multi_selection_buttons.js in favor of OWL3 native API.
The recruitment skills score gauge was updated to use the newer application framework approach. This is an internal cleanup that helps keep the recruitment interface maintainable without changing the visible hiring workflow.
Original PR description
...
This update keeps the spreadsheet version history side panel working as expected after an underlying framework change. The active version still automatically scrolls into view, helping users navigate revisions without disruption.
Original PR description
Replaced `useLayoutEffect` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. The original `useLayoutEffect` had no dependency function, meaning it ran after every…
Replaced `useLayoutEffect` with `onMounted` + `onPatched` because `useLayoutEffect` is deprecated in OWL3. The original `useLayoutEffect` had no dependency function, meaning it ran after every render. Its body checked `this.props.active` (a plain, non-reactive prop) and called `scrollIntoView` on the item DOM element. Because plain props do not trigger OWL3 `useEffect` re-runs, the faithful translation is `onMounted` (initial render) + `onPatched` (every subsequent re-render), both delegating to a new `scrollActiveIntoView()` helper that preserves the original guard and scroll options. When commenting out the useLayoutEffect there was no error, meaning the code we refactored had no test coverage. I tested personally using the following steps: - Open a spreadsheet document (e.g. via the Documents app or Spreadsheet menu) - Click the version history icon (clock icon) in the top toolbar to open the Version History side panel - Verify that the currently active version item is scrolled into view automatically - Click on an older revision to activate it and confirm it scrolls into view see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2596825/build/114857525
The data cleaning merge list view was updated to use the newer Odoo interface framework approach. This is an internal technical cleanup that preserves existing behavior while improving compatibility with the latest platform version.
Original PR description
Remove useLayoutEffect usage in data_merge_list_view.js to replace with OWL3 native API.
The map view was updated to use newer internal page-loading behavior required by the next version of Odoo's web framework. This keeps the feature maintainable and helps avoid future compatibility issues without changing the user experience.
Original PR description
Replaces useLayoutEffect with onMounted and onPatched WHY: UseLayoutEffect is deprecated in OWL3
This update changes internal page-loading code in the account reports area without changing the visible workflow. It helps keep the screen compatible with newer platform standards while reducing the risk of future maintenance issues.
Original PR description
Remove useLayoutEffect in AccountReturnCheckKanbanController by commenting out the effect body to verify no tests break.
The Documents app was adjusted behind the scenes to align with the next version of Odoo's interface framework. This keeps the document kanban view maintainable and helps reduce migration risk without changing day-to-day user workflows.
Original PR description
Remove useLayoutEffect from documents_kanban_record.js as part of OWL3 migration.
The planning schedule view was adjusted internally to reduce reliance on older interface behavior. This prepares the module for a future framework upgrade while keeping the visible user experience unchanged.
Original PR description
Remove useLayoutEffect from planning_gantt_renderer.js by commenting out its content. This is a first step to replace useLayoutEffect with OWL3 native API.
This internal cleanup makes list and kanban view components react more reliably when their page elements change. It prepares accounting, documents, marketing, social, and studio screens for future performance improvements without changing day-to-day workflows.
Original PR description
Makes listrenderer root reference reactive using signals and update hooks to accept ref or signals. WHY: To remove a useLayoutEffect in a later commit we need to have root reactive Community PR: https://github.com/odoo/odoo/pull/269130
This internal update replaces deprecated interface code in the Data Cleaning list view so it remains compatible with the latest Odoo web framework. Users should see the same Validate, Discard, and Undiscard buttons appear correctly based on selected records, with no expected change in daily workflows.
Original PR description
Replaced `useLayoutEffect` with `onMounted` + `onPatched` (from `@odoo/owl`) because `useLayoutEffect` is deprecated in OWL3. The effect was a bare `useLayoutEffect` with no dependency function, so…
Replaced `useLayoutEffect` with `onMounted` + `onPatched` (from `@odoo/owl`) because `useLayoutEffect` is deprecated in OWL3. The effect was a bare `useLayoutEffect` with no dependency function, so it ran synchronous DOM side-effects after every render — toggling the visibility of the control-panel action buttons (Validate / Discard / Undiscard) based on the active state of the current selection. The faithful OWL3 equivalent of "run after mount and after every re-render" is a single callback registered with both `onMounted` and `onPatched`. I also checked whether `this.model.root.selection` is reactive, to consider replacing the hooks with computed values + a single `useEffect`. It is not: the web relational model pushes updates explicitly via `model.notify()` -> `render()` rather than OWL `reactive()` proxies (`record.selected` is a plain boolean, and `selection` is a plain `records.filter(...)` getter). So `onMounted` + `onPatched` remains the correct faithful replacement. This is a CASE 1 commit. When commenting out the useLayoutEffect there was no error, meaning the code we refactored had no test coverage. I tested personally using the following steps: - Open the Data Cleaning app - Navigate to the Data Cleaning list view (Records menu) - Select one or more records that have `active = true` - Verify that the "Validate" and "Discard" buttons are visible and "Undiscard" is hidden - Select records with `active = false` (archived/discarded) - Verify that "Undiscard" is visible and "Validate"/"Discard" are hidden
The appointment calendar’s internal code was updated to align with Odoo’s newer interface framework. This helps keep the appointment experience reliable and easier to maintain without changing how users schedule or manage appointments.
Original PR description
Remove useLayoutEffect usage in appointment calendar hooks to migrate to OWL3 native API.
The project planning timeline code was updated to use the newer internal framework approach. This is a behind-the-scenes change intended to keep the feature compatible and easier to maintain, with no expected change for day-to-day users.
Original PR description
Commented out useLayoutEffect body to test coverage before replacement with OWL3 API.
The Twitter/X social media integration was updated internally to prepare for a newer interface framework. This helps keep the feature maintainable and reduces future upgrade risk without changing day-to-day user workflows.
Original PR description
Commented out useLayoutEffect calls to test coverage before OWL3 replacement.
This change adjusts internal code for the Sales Commission chart without adding or removing business functionality. It is intended to validate test coverage around the chart behavior, so day-to-day users should not notice a change if existing safeguards are working.
Original PR description
Commenting out useLayoutEffect to break it on purpose, to check if there is test coverage.
A small internal change was made in the Project app's task scheduling view as part of preparation for the next web framework migration. This helps reduce future upgrade risk without changing business functionality for users.
Original PR description
Commented out useLayoutEffect in task_gantt_renderer_common.js to break the effect on purpose, as part of the OWL3 migration process.
The push notification request component was updated to use the newer internal framework approach. This keeps the feature aligned with platform changes and helps maintain reliability without changing the user-facing experience.
Original PR description
Commented out useLayoutEffect to verify test coverage before applying OWL3 replacement.
This update adjusts the Social app’s internal code to align with the next version of Odoo’s front-end framework. It does not change visible features, but helps keep the app maintainable and ready for future upgrades.
Original PR description
Remove useLayoutEffect usage in stream_post_kanban_controller.js as part of OWL3 migration.
The stock barcode form was adjusted to use the newer interface approach required for the next Odoo web framework version. This is an internal cleanup that helps keep barcode inventory workflows stable and maintainable without changing user-facing behavior.
Original PR description
Remove useLayoutEffect usage in stock_barcode_sml_form.js as part of OWL3 migration.
This change updates the enterprise pivot report view to use the newer built-in framework approach instead of an older internal mechanism. It should help keep the reporting interface easier to maintain with minimal visible impact for users.
Original PR description
Remove useLayoutEffect usage in pivot_renderer by replacing with OWL3 native API.
The Documents file viewer was internally updated to align with the next version of Odoo's interface framework. This helps keep the Documents app maintainable and ready for future upgrades without changing day-to-day user behavior.
Original PR description
Remove useLayoutEffect from documents_file_viewer.js as part of OWL3 migration.
The barcode stock movement widget was updated to use the newer platform approach instead of an older internal mechanism. This keeps the inventory barcode experience aligned with the current Odoo framework and helps maintain long-term reliability without changing user workflows.
Original PR description
Remove useLayoutEffect from set_quant_stock_move_line widget and replace with OWL3 native API.
The spreadsheet version history side panel was updated as part of ongoing platform modernization work. This internal change helps keep the feature compatible with the next Odoo web framework version without changing the user experience.
Original PR description
Remove useLayoutEffect usage in version_history_side_panel.js as part of OWL3 migration.
This update refreshes an internal part of the Timesheets grid to align with the latest platform approach. It should not change how users work with timesheets, but helps keep the feature easier to maintain and compatible over time.
Original PR description
Automated PR to replace useLayoutEffect with OWL3 native API in timesheet_grid.
This change updates the enterprise navigation bar internals without adding or removing user-facing features. It is a low-impact maintenance change intended to simplify the implementation and support future work.
Original PR description
Remove useLayoutEffect usage in EnterpriseNavBar. This is an intentionally-broken throwaway commit that will be squashed in a later step.
The report editor was updated to use the platform's newer internal approach for screen update handling. This keeps the Studio report editing experience aligned with the latest framework standards and helps maintain reliability without changing user-facing behavior.
Original PR description
Remove useLayoutEffect usage in report_editor_xml.js and replace with OWL3 native API.
This change updates internal web interface code to use a newer event-listening approach that is compatible with the next version of Odoo's front-end framework. It helps keep expense, mail, accounting, and common web views maintainable without changing day-to-day user workflows.
Original PR description
Replaces useRefListener with useListener which doesn't use a useLayoutEffect under the hood WHY: UseLayoutEffect is deprecated in OWL3 Enterprise PR: https://github.com/odoo/enterprise/pull/119988 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Search pages now keep only the user's active search choices in the browser URL instead of storing extra internal page details. This makes URLs lighter, cleaner, and easier to maintain while preserving normal navigation behavior such as back and forward.
Original PR description
Only the search performed by the user (the active facets) needs to end up in the url, not the whole internal state of the view. Pushing the complete state was heavier than necessary and leaked more detail into the url than a search really is. A lightweight representation of "what the user searched for" already existed, introduced for reapplying a search when working offline. Reusing it here avoids maintaining two different ways to describe a search, and pushed us to make that representation a bit more robust so it can be trusted for both purposes. Finally, deciding what belongs in the url is the search model's responsibility, not the action service's: the model is the one that actually knows what a facet is. Moving that decision there removes an indirection the action service had no real reason to carry.