diff options
| author | Aaron Bohy <aab@odoo.com> | 2020-04-20 12:16:16 +0000 |
|---|---|---|
| committer | Aaron Bohy <aab@odoo.com> | 2020-04-22 07:50:00 +0000 |
| commit | ae4c9d1eca5864f0cb9126d3539580fc4ae2cee9 (patch) | |
| tree | e54927cbd812f6ef243acbc59d8ff072cda8f5ac /addons/web/static/src/js | |
| parent | 7c0c947b0e8e60053629f1ad7e5b545060a0a517 (diff) | |
[FIX] web: toggle optional column in list with owl component
Have a list view with an Owl field component (e.g. widget="badge"),
visible. Open the optional field dropdown and make another field
visible.
Before this commit, the '_onToggleOptionalColumn' handler was
executed twice, because two click events where triggered: one on
the label, and one on its associated input (because of the for
attribute, see [1]).
As a consequence, the new field was added, and directly removed
from the view. This could even cause subsequent crashes.
The difference between an Owl component and a legacy widget is
that the Owl component is async (more than a nextTick) as we wait
for the nextAnimationFrame to render. When the rendering is fast
enough (e.g. without Owl components), the click event isn't remap
to the input yet (because we empty the list HTML node), so the
handler is executed only once.
[1] https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label
Issue reported on task 2204306
closes odoo/odoo#49920
X-original-commit: b02d347e8770835ad28a6487071930a904bce101
Signed-off-by: Lucas Perais (lpe) <lpe@odoo.com>
Signed-off-by: Aaron Bohy (aab) <aab@odoo.com>
Diffstat (limited to 'addons/web/static/src/js')
| -rw-r--r-- | addons/web/static/src/js/views/list/list_renderer.js | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/addons/web/static/src/js/views/list/list_renderer.js b/addons/web/static/src/js/views/list/list_renderer.js index 5cf4b022c5d..68a449a9246 100644 --- a/addons/web/static/src/js/views/list/list_renderer.js +++ b/addons/web/static/src/js/views/list/list_renderer.js @@ -1109,6 +1109,11 @@ var ListRenderer = BasicRenderer.extend({ _onToggleOptionalColumn: function (ev) { var self = this; ev.stopPropagation(); + // when the input's label is clicked, the click event is also raised on the + // input itself (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label), + // so this handler is executed twice (except if the rendering is quick enough, + // as when we render, we empty the HTML) + ev.preventDefault(); var input = ev.currentTarget.querySelector('input'); var fieldIndex = this.optionalColumnsEnabled.indexOf(input.name); if (fieldIndex >= 0) { |
