Thursday, October 9, 2025
24 changes
4 changes
Enhancements to existing features
Website editor selections are now kept within the currently focused content area, preventing accidental selection of an entire snippet or page section. This makes editing multi-column snippets more predictable and reduces unwanted changes while using mouse selection or Ctrl+A.
Original PR description
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
The website builder now keeps text selection limited to the currently edited section, preventing accidental selection of an entire snippet when users press Ctrl+A or drag with the mouse. This makes editing multi-column layouts more predictable while preserving existing link handling behavior in edge cases.
Original PR description
Reproduction: 1. drag and drop a column snippet in website 2. click on one of the column and press ctrl+A, everything is selected 3. similarly the selection with mouse also can cross the whole…
Reproduction: 1. drag and drop a column snippet in website 2. click on one of the column and press ctrl+A, everything is selected 3. similarly the selection with mouse also can cross the whole snippet After this commit: Selection is now restricted to the element bound by the current container. This is achieved by setting the target element’s `contenteditable` attribute to `true` and its parent’s to `false`. These changes are reverted whenever `change_current_options_containers_listeners` is dispatched, and also during destory, ensuring that the `contenteditable` manipulation only applies dynamically while editing in the website builder. Special cases: 1. If the bound element is already `contenteditable="false"`, we do not modify the attribute to avoid unwanted changes. 2. If there is only one option container (e.g., the outermost container of a snippet), we do not alter the `contenteditable` attribute. This is because the outer section is naturally set as `contenteditable="false"`. Restriction is only needed when there are multiple option containers and an inner one is selected. Predicate in addition to isContentEditable: We introduce `is_element_editable_predicates` to determine if an element is editable, taking into account possible restrictions. Since the parent of the currently bound option container is set to `contenteditable="false"`, elements outside the bound element cannot be normalized. Using this predicate alongside `isContentEditable` ensures these elements are still considered editable when appropriate. This is a rare edge case, as typically only elements within the bound container are edited. See test change 1 for details. Test changes: 1. Link normalization checks if the link element is not unremovable and stops normalization if it is. In the `website_media_iframe_video` tour, there is a case where the link to be normalized is outside the bound option container. The new predicate is used for proper normalization in this scenario. 2. The PR is designed to minimize test breakage. If tests involve only one option container, the new contenteditable manipulation logic does not affect them. 3. A new test for this contenteditable manipulation is added. task-4901968 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The website builder now keeps text selections within the currently edited content block instead of allowing users to accidentally select the whole editing area. This makes editing pages more predictable when using mouse selection, touch selection, or Select All shortcuts.
Original PR description
Before this commit: we can select the whole editing area in website builder by mouse selection or ctrl+a After this commit: when we do selection, the selection is checked that if it's inside the…
Before this commit: we can select the whole editing area in website builder by mouse selection or ctrl+a After this commit: when we do selection, the selection is checked that if it's inside the current element bond to the blue container. if the selection is out of the container, we reset the selection to keep it inside. In this commit, we introduced a new plugin in the html_builder to restrict the selections to the closest div element or p element. We also moved the click listener in builder_options_plugin.js to properly update the blue container to properly align with the restricted selection. We have the restriction function called on event keydown, mouseup and touchend. The listeners are set this way to avoid unnecessary selection restriction during the selection making. The keydown event is to handle ctrl+a to select the whole block and then restrict it. The mouseup and touchend handle the cases where we make the seleciton by mouse or touch. We introduced two concepts SPECIAL_BLOCK_WITH_TEXT_IN_NON_DIV and UNCROSSABLR_ELEMENTS. In general cases, we restrict the selection to the closes div element. However, for special blocks in SPECIAL_BLOCK_WITH_TEXT_IN_NON_DIV, we restrict selection in closest p element. UNCROSSABLR_ELEMENTS can be defined by tag name or classes. They are the elements that the selection should not cross, these elements can appear in a div element and the restricted selection should stop before crossing them. When we do select all, we first check if we should select the whole div element or the p element, then we extend the selection to one direction + correct the selection on UNCROSSABLR_ELEMENTS, then we do the same for the other direction. When we make selection by mouse, we first check if the current selection is beyond the div or p element it should be and we set the selection inside if it is. Then we check inside the div or p element, if there are UNCROSSABLR_ELEMENTS, we correct the selection by stopping the selection ahead of them. task-4901968 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Peppol configuration screen now remains available even if the service status check fails. This allows users to continue important actions such as unregistering instead of being blocked by a temporary service lookup problem.
Original PR description
Handle `api/peppol/2/get_services` errors gracefully, without blocking critical section of peppol functionnal flow (deletion). If the API endpoint for services returns an error (which should not be affecting any users), the whole peppol config wizard is no longer accessible. The users will therefore not be able to unregister. Note that with this change, if we get an API error, all services will be marked as disabled (which is fair, and better than displaying an API request error) no-task Forward-Port-Of: odoo/odoo#228800
1 change
Enhancements to existing features
The Peppol configuration screen now remains available even if the external service list cannot be loaded. This lets users continue important actions such as unregistering instead of being blocked by a temporary service error.
Original PR description
Handle `api/peppol/2/get_services` errors gracefully, without blocking critical section of peppol functionnal flow (deletion). If the API endpoint for services returns an error (which should not be affecting any users), the whole peppol config wizard is no longer accessible. The users will therefore not be able to unregister. Note that with this change, if we get an API error, all services will be marked as disabled (which is fair, and better than displaying an API request error) no-task Forward-Port-Of: odoo/odoo#228800
10 changes
Enhancements to existing features
Belgian payroll now uses a clearer residency status with Resident, Non-Resident, and Frontalier options. For Frontaliers, withholding tax exemption is applied automatically and locked in the interface, reducing manual errors while keeping flexibility for other employees.
Original PR description
- Add l10n_be_resident_situation field with 3 options: Resident, Non-Resident, Frontalier - Compute no_withholding_taxes automatically for Frontaliers with readonly UI behavior - Maintain backward compatibility with computed is_non_resident field - Update employee and contract template views to use new selection field - Update test data to use new field structure Frontaliers now automatically get no withholding taxes with a disabled checkbox, while Residents and Non-Residents can still manually control the setting. task-4936512
9 changes
Enhancements to existing features
When a user opens a project without their own top bar setup, Odoo now uses the project manager's configuration as a fallback. This helps keep project actions visible and consistent without requiring every user to configure the top bar manually.
Original PR description
If the current user doesn't have a top bar configuration yet for a given project, we fallback on the top bar configuration of the project manager to show the actions. task-5072899 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A new filter helps users quickly find salary offers that are waiting for their signature. This makes it easier to focus on pending actions and replaces an older default filter with the clearer, dedicated option.
Original PR description
Add filter for 'Waiting For Me' in salary offer search view, returning only offers with signature expected (half signed). Also context filter replaced with the newly introduced one Task ID: 5031087
Users can now duplicate existing records even when creating brand-new records is disabled. This gives businesses more precise control, allowing teams to reuse approved records while still preventing unrestricted new entries.
Original PR description
*: documents, web_studio This commit allows record duplication even when creation is disabled (create="0"). Duplication permissions should depend only on specific duplication rules (e.g., duplicate attribute) and server-side access rights — not on the create attribute. This makes sense in cases where users are allowed to duplicate existing records but not create new ones from scratch. task-5131124
The VoIP call history and softphone views now show clear icons when calls include recordings or AI-generated transcriptions. This helps users quickly identify which past conversations have supporting audio or text records available for review.
Original PR description
Task-4962728
Work entries now show where they came from, such as schedules, time off, planning, attendance, or manual creation. Access to work entries is also aligned with HR and payroll roles, helping teams review payroll-related records with clearer ownership and permissions.
Original PR description
- added Source field in `hr_work_entry_view_form` which takes value from:
- `resource_calendar_id` if the work entry has been generated from the working schedule
- `leave_id` if the work entry has been generated from a time off
- `planning_slot_id` if the work entry has been generated from a planning
- `attendance_id` if the work entry has been generated from attendance
- Manual if the work entry has been generated manually
- removed the expand button in the `hr_work_entry` pop up
- added inherited views for `hr_work_entry_view_form` in `hr_work_entry_attendance` and `hr_work_entry_palnning` to show corresponding fields
- changed access of the work entries smart button to be only `group_hr_manager` and then change to `group_hr_payroll_user` when payroll is installed
- removed access to work entries from `group_hr_manager` when payroll is installed
Task [link](https://www.odoo.com/odoo/project.task/5118852)
task-5118852Financial reports now use parent accounts to group and present accounting data, replacing the previous account group approach. This makes reports such as trial balance, aged partner balance, asset reports, and localizations more consistent and easier to interpret for finance teams.
Original PR description
WIP: implement parent account in reports Task: [5055586](https://www.odoo.com/odoo/project/967/tasks/5055586)
Cashiers can now use a dedicated Food Platform button on the POS ticket screen to quickly view orders received through UrbanPiper. This makes it easier to separate third-party delivery orders from in-store sales, while replacing the previous UrbanPiper search filter with a clearer workflow.
Original PR description
In this commit: =============== - Added a "Food Platform" filter button on the ticket screen to show only orders received from UrbanPiper. This helps cashiers quickly identify and manage third-party food platform orders separately from in-store orders. - Removed the UrbanPiper search filter since a dedicated filter button has now been added on the ticket screen for managing UrbanPiper orders. Task-5033759 Related PR: https://github.com/odoo/odoo/pull/224217
Payroll salary rules can now be created without assigning them to a category. This simplifies payroll setup by avoiding unnecessary one-off categories and makes salary rule management easier for teams.
Original PR description
**Issue** To simplify salary rule configuration and reduce unnecessary records the salary rule category field is made non-mandatory, to avoid creating categories that contain only a single rule and making the setup easier to manage. Task ID: 5126314
This update changes Bangladesh payroll benefits so they are handled as employee properties rather than fixed payroll inputs. It makes benefit setup more flexible and helps payroll calculations retrieve configured values more reliably.
Payroll users can now generate payslip PDFs more conveniently from list views, with small batches created immediately. Printed payslips are also saved directly on the employee payslip record, making documents easier to find and manage.
The Documents folder action menu now opens immediately instead of waiting for all actions to load, with a spinner shown during loading. Selecting embedded folder actions also feels faster because changes appear right away, while server updates are batched to reduce delays and unnecessary calls.
Original PR description
The cogwheel which holds the folder actions was slow to open because it loads the actions at startup. To speedup it up, we backport the fix odoo/enterprise#90124 that allows the cogwheel to be open while loading the actions (instead of waiting that the actions are loaded). We also add a spinner while it is being loaded. When selecting action to embed for the folder, it was slow as well. To solve the problem, we toggle the action immediately (not waiting the answer of the server) and roll it back in case of failure. Finally, to limit the number of calls to the server, we only reload the search model if there are no pending toggle of action. So if you activate for example 5 actions in a row and the connection is slow enough, the search model will only be reloaded once instead of 5 times (when the 5 actions are toggled). Task-4828503 Forward-Port-Of: odoo/enterprise#94141
The HTML editor now supports simple Markdown-style shortcuts to create blockquotes and separators while typing. Separator placement has also been improved so inserted lines appear in the expected position based on where the cursor is, making content editing faster and more predictable.
Original PR description
### Desired behavior after PR is merged: - Adjust separator insertion logic based on cursor position: ```html <div>/separator[]</div> → before <div>/separator[]abc</div> → before <div>ab/separator[]c</div> → after <div>abc/separator[]</div> → after ``` - Refactor markdown shortcuts implementation by introducing `shorthands` resource containing objects with pattern and commandId keys. - In the shortcut_plugin, bind an onInput handler to process input events and match precedingText against the defined patterns, triggering the corresponding commands when matched. - Add support for > (blockquote) and --- (separator) markdown shortcuts. - Separator insertion behavior: ```html <div>--- []</div> → before <div>--- []abc</div> → before ``` task-4908567 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A new test action on the IoT Box record helps users quickly check whether required communication methods are working. It also triggers a network quality check, making it easier to diagnose client-site connectivity issues before they disrupt device operations.
Original PR description
In order to ease debugging at client's, we introduce a test button on the IoT Box record that will first test communication protocols and display a notification for each non-working protocol, then request a network quality check on the IoT Box (ping to odoo.com + ping to gateway). Community PR: odoo/odoo#229655 Task: 5130809
The IoT system can now quickly check connection quality and show whether network performance is fast, normal, slow, or unreachable. This helps consultants diagnose connectivity issues more easily when working with IoT Boxes and receipt printing.
Original PR description
In order to ease network checks for consultants, we added a quick latency and packet loss check, formatting the output as "slow"/"normal"/ "fast" or "unreachable". We also add a way to test each protocol (webrtc, longpolling, websocket) and to check latency/packet lost, in order to add a `Test` button on the IoT Box record. Enterprise PR: odoo/enterprise#96298 Task: 5130809
Employee records now reliably show selected company cars in the activity history when contracts are signed, even when the contract version was already prepared. Offer summaries also include the selected car and bike names, making compensation details clearer for employees and HR teams.
Original PR description
As when signing the employee contract, the version related to that contract is already created and we just set the version active, the value of the car does not change, so the tracking is not triggered and it's not added into the chatter. This PR force the car_id and ordered_car_id to be tracked by adding the initial value the employee precommit tracking values, before the version is activated (so before the employee get the new values from the newly active version). Also, this PR adds the selected car and bike names to the offer summary. Task-4962922 Forward-Port-Of: odoo/enterprise#90915
Meeting participants can now see when the chat has unread messages directly from the meeting view. A grey dot highlights unread chat activity, while a red badge shows the number of important unread messages, helping users notice and respond to chat updates faster.
Original PR description
With this commit, meeting chat action in the discuss call meeting view now shows a badge when it has unread messages: - shows grey dot when chat has unread but no important messages. - shows red badge when it has important messages, and counter is the number of important messages in the chat. This makes it easier to know when there's new content in chat and incite user to open the chat in the meeting view. <img width="1022" height="912" alt="Screenshot 2025-10-06 at 18 32 38" src="https://github.com/user-attachments/assets/020c9dbb-99b4-43e3-95c5-1679be8c7649" />
Point of Sale users can no longer accidentally change the quantity of a discount line or apply an extra discount to it from the numpad. They can still adjust the discount line price directly, with the amount keeping the correct positive or negative sign, making discount handling clearer and less error-prone.
Original PR description
In this commit: ======= - We are restricting the user from updating the quantity of the discount line and adding the extra discount on the discount line from the numpad. - Users can update the discount line price using the numpad, which will reflect the sign (positive or negative) of the order line price. task-4941627
This update enriches the Hong Kong payroll demo setup with more realistic employees, payslips, and pay runs. It makes it easier for users and evaluators to explore payroll scenarios such as MPF and end-of-year payments without extensive manual configuration.
Original PR description
Currently, the demo data in the HK payroll modules are quite weak, and it requires a lot of configuration if a user wants to test the features (MPF, EOY pay, ...) In this PR, we are improving this by adding more payslips and payruns, updating some of the employees data and so on. task-5079595