Saturday, September 19, 2026
10 changes · master
Resolved issues and error corrections
Mail notification items now display more evenly by reducing the timestamp size and centering the unread counter with the preview text. This makes the messaging menu look cleaner and easier to scan without changing the spacing between notifications.
Original PR description
Before this commit, the notification item parts were unbalanced: - datetime was too big - badge counter looks like "about to fall" The badge counter is bigger than the row, therefore the top is aligned with text but the rest is not. This also had the consequence to make the bottom of notification item bigger than the top. This commit fixes the issue by reducing size of datetime and aligning the center of badge counter with text in the row. The spacing between notification items was good so this is kept unchanged. <img width="1656" height="814" alt="livechats-before-after" src="https://github.com/user-attachments/assets/7d7293c9-7f5f-4db6-b7a9-1f7079f69b93" /> Forward-Port-Of: odoo/odoo#289019
This fixes an issue where users could encounter a crash when discarding changes in the mass mailing editor. The change ensures the editor recognizes the correct close-and-discard action, making campaign editing more reliable.
Original PR description
Commit [1] introduced usage of a `discardAndClose` props, but declared it as `discardChanges`. This did not cause any issue because `owl3_compatibility_layer` uses `useProps()` which accepts any props without validation. However, after commit [2] in Odoo 20.0, usage of `useProps` in the `MassMailingBuilder` means that `useProps()` is overwritten, and the component will only accept props that are declared in the schema. This commit fixes the invalid props schema. [1]: https://github.com/odoo/odoo/commit/c6fbfb69c2a59041fc360bb4ddf3b09a1eeaf012 [2]: https://github.com/odoo/odoo/commit/5df880f7ba851abf4151fca2f2af50b1c18afb2c task-6584680 Forward-Port-Of: odoo/odoo#289272 Forward-Port-Of: odoo/odoo#289167
The live chat interface now makes the time a visitor has been waiting for help easier to see by displaying it as a more noticeable badge. A tooltip also explains what the timer means, helping operators understand and prioritize waiting conversations more quickly.
Original PR description
Before this commit, when a livechat is in looking for help, the timer was barely visible next to the language of visitor. This duration is quite important, so the visibility should be made more obvious. Also the duration lacks clarity for people not yet aware what this duration means, and there's no title shown on mouse-hover to state it clearly what this represents. This commit change the visual of timer as a primary badge with reduced opacity, so this is a bit more catchy but not too much. On mouse-hover it now shows a tooltip that clearly tells this represents the duration the livechat has been in looking for help. <img width="1868" height="361" alt="lfh-timer-before-after" src="https://github.com/user-attachments/assets/72508b32-608a-42e5-a8e6-12dc2e02aa5f" /> Forward-Port-Of: odoo/odoo#289031
This fix updates remaining references to an old precision setting name so product quantities use the intended number of decimal places. It helps prevent quantities from being silently rounded to two decimals in affected POS, Jordanian EDI, and stock package workflows.
Original PR description
…al.precision The `decimal.precision` "Product Unit of Measure" was renamed "Product Unit" in 18.1. Some occurences called the old name still exist in the code. This is silently fallbacking on the default 2 decimals from the `precision_get`. See: https://github.com/odoo/odoo/pull/193490 task-none Forward-Port-Of: odoo/odoo#289204 Forward-Port-Of: odoo/odoo#288508
This fix lets websites customize which flag is shown for a language instead of always using the default derived from the locale code. It matters for businesses serving specific regions or preferring local branding, without requiring heavier technical workarounds.
Original PR description
Which flag stands for a language is a presentation choice, not a property of its code. `_compute_field_flag_image_url` derives the URL from the country part of the locale, and a site that wants a…
Which flag stands for a language is a presentation choice, not a property of its code. `_compute_field_flag_image_url` derives the URL from the country part of the locale, and a site that wants a different flag for a language it offers, a regional one or the flag of the country it actually serves rather than the one the code names, has to compute that URL its own way.
That is not possible today. The field passes the compute as the function object:
flag_image_url = fields.Char(compute=_compute_field_flag_image_url)
`determine()` takes the `callable` branch and calls that object with the recordset. A plain function is not bound, so the implementation of `base` runs whatever class the record has: a module that inherits res.lang and defines `_compute_field_flag_image_url` changes nothing, and nothing says so. No error, no warning, and the field keeps answering the same URL. Getting around it means redeclaring the field only to replace its compute, which is more than the situation calls for.
Passing the method name puts the computation back on the MRO and costs nothing else: `Field.get_depends` resolves a string with `resolve_mro` and collects `_depends` from every implementation it finds, so the `@api.depends('code', 'flag_image')` declared here keeps applying, to this implementation and to an override alike.
This is the same kind of fix as #185419, which made the `domain` of a field reachable by an override for the same reason. Two field declarations in the codebase still pass a function object this way; the other is `website.menu.is_mega_menu`, which passes `inverse` the same way and is left alone here.
Forward-Port-Of: odoo/odoo#288686On small screens, Sales quotation lists could show an ellipsis menu next to the New button that opened to an empty dropdown. This fix prevents the hidden upload control from being counted as a visible action on mobile, keeping the toolbar clean while preserving normal upload behavior on desktop.
Original PR description
The views built on `file_upload_list`/`file_upload_kanban` can hide their Upload button and offer the upload elsewhere: Sales does it for its quotations, where it lives in the cog menu…
The views built on `file_upload_list`/`file_upload_kanban` can hide their Upload button and offer the upload elsewhere: Sales does it for its quotations, where it lives in the cog menu (`upload_rfq_cog_menu`). Only the button was dropped though, as the uploader has to stay in the DOM for its file input: both the drop zone and the paste handler reach for it with `querySelector('.document_file_uploader.o_input_file')`.
That left an empty `d-contents` wrapper among the control panel buttons. 928ac7d6fe8f made the control panel fold every button but the first into an ellipsis dropdown on small screens, counting as a button any child that is not `.d-none`/`.o_hidden`. The wrapper matched, so the ellipsis showed up next to "New", and opening it revealed nothing: the menu hides its own first entry, leaving only that same invisible wrapper.
Render the uploader only when its button is visible or the screen is not small. A drop zone and a paste are out of reach on a small screen anyway, so nothing is lost there, and the desktop DOM is untouched.
Steps to reproduce:
- switch the browser to a small screen (< 768px)
- open Sales > Orders > Quotations, in list or kanban
- an ellipsis button sits next to "New"; clicking it opens an empty menu
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
Forward-Port-Of: odoo/odoo#289191This update corrects an internal reference used to determine product quantity decimal precision in field service sales timesheets. It helps ensure quantities use the intended rounding rules instead of silently falling back to a generic default.
Original PR description
The `decimal.precision` "Product Unit of Measure" was renamed "Product Unit" in 18.1. Some occurences called the old name still exist in the code. This is silently fallbacking on the default 2 decimals from the `precision_get`. See: https://github.com/odoo/odoo/pull/193490 task-none Forward-Port-Of: odoo/enterprise#132166 Forward-Port-Of: odoo/enterprise#131709
Engineering Change Order PDF reports now paginate long change tables correctly. This prevents rows from being split or cut off between pages, making printed reports easier to read while keeping the on-screen report behavior unchanged.
Original PR description
The ECO report kept its scrollable overflow when rendered as a PDF. This interfered with pagination and cut a table row at the boundary between two pages. Override the report overflow in PDF mode so its table can flow normally across pages, while preserving the existing HTML overflow behavior. Steps to reproduce: 1. Open an ECO containing enough changes to produce multiple pages. 2. Open the changes report and print it. 3. Inspect the table at the boundary between the first two pages. Before this commit: The last table row on the first page was cut between pages. After this commit: The table content is paginated without cutting the row. Forward-Port-Of: odoo/enterprise#131706
Fixed an issue where adding a note to a new appointment booking in Point of Sale could trigger an error when the user clicked away from the note field. This makes the booking flow smoother and prevents interruptions for staff managing appointments.
Original PR description
Steps: - Open a store with appointments enabled. - Go to the Bookings tab. - Open a new booking form. - Click on the note input, enter some text, and click away. Issue: - A traceback appears when focusing out of the note editor. Fix: - Add `MediaPlugin` to the `htmlField` editor configuration, as the plugin is used by the field when committing local changes via `_commitChanges`. [here](https://github.com/odoo/odoo/blob/saas-19.4/addons/html_editor/static/src/fields/html_field.js#L253) Task-6580877 Forward-Port-Of: odoo/enterprise#132145
Fixed an issue that caused an error when administrators clicked the Import Website button in Website settings. This restores access to the website import flow and prevents an unexpected crash during configuration.
Original PR description
To reproduce: - Connect in Odoo as an administrator - Go to Website / Configuration / Settings - Click on "Import Website" button. It traceback with an `OwlError: Invalid component props (WebsiteGeneratorForm)` error. Followup of odoo/enterprise@44c582b708bd, all props are in fact optional and already handled as such by the component. Forward-Port-Of: odoo/enterprise#132132