Thursday, October 9, 2025
6 changes · saas-18.4
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
This update strengthens quality checks for the self-ordering point-of-sale experience by adding automated test coverage for key screens, data models, and service behavior. It also reorganizes some internal test setup so future changes can be validated more safely and with fewer naming conflicts.
Original PR description
- Isolated `printer` service into a standalone file to avoid naming conflicts with `point_of_sale` during tests. - Introduced `setupSelfPosEnv` to mock and bootstrap the self-order testing environment. - Add Hoot test coverage for core components, models, and service logic Task-4945633 Forward-Port-Of: odoo/odoo#220537
This update improves the internal test tools used for the website editor so tests wait for the sidebar to finish loading and updating before continuing. This helps reduce flaky test results and gives teams more confidence that website builder changes are validated reliably.
Original PR description
We need a helper to wait enough