From 1e9d18b38f5a6783b9f266b1e751a2ba5eb441db Mon Sep 17 00:00:00 2001 From: Aungkokolin1997 Date: Mon, 15 Dec 2025 02:25:28 +0000 Subject: [PATCH 01/11] [IMP] web_form_banner: adj to resolve eslint warnings --- .../static/src/js/web_form_banner.esm.js | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/web_form_banner/static/src/js/web_form_banner.esm.js b/web_form_banner/static/src/js/web_form_banner.esm.js index c51144cd2476..8cc076082afc 100644 --- a/web_form_banner/static/src/js/web_form_banner.esm.js +++ b/web_form_banner/static/src/js/web_form_banner.esm.js @@ -1,17 +1,18 @@ -/** @odoo-module **/ // Copyright 2025 Quartile (https://www.quartile.co) // License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -import {patch} from "@web/core/utils/patch"; import {onMounted, onWillUnmount} from "@odoo/owl"; import {FormController} from "@web/views/form/form_controller"; import {Record} from "@web/model/relational_model/record"; +import {patch} from "@web/core/utils/patch"; const recRoot = (c) => (c && c.model && c.model.root) || null; const childSpan = (el) => { try { return (el && el.querySelector(":scope > span")) || null; - } catch {} + } catch { + // Ignore + } const f = el && el.firstElementChild; return f && f.tagName === "SPAN" ? f : null; }; @@ -22,22 +23,30 @@ const setHtml = (el, html) => { const safe = async (fn, fb) => { try { return await fn(); - } catch {} + } catch { + // Ignore + } return fb; }; function normalizeValue(v) { - if (v === null || v === undefined) return v; // Null/undefined + // Null/undefined + if (v === null || v === undefined) return v; const t = typeof v; if (t === "string" || t === "number" || t === "boolean") return v; if (Array.isArray(v)) - return v.length === 2 && typeof v[1] === "string" ? v[0] : [...v]; // M2o id or cloned m2m ids + // M2o id or cloned m2m ids + return v.length === 2 && typeof v[1] === "string" ? v[0] : [...v]; if (t === "object") { - if (typeof v.res_id === "number") return v.res_id; // M2o snapshot - if (typeof v.id === "number") return v.id; // M2o env - if (Array.isArray(v._currentIds)) return [...v._currentIds]; // M2m + // M2o snapshot + if (typeof v.res_id === "number") return v.res_id; + // M2o env + if (typeof v.id === "number") return v.id; + // M2m + if (Array.isArray(v._currentIds)) return [...v._currentIds]; } - return undefined; // Ignore others (e.g., command lists) + // Ignore others (e.g., command lists) + return undefined; } function shrink(data) { const out = {}; @@ -77,7 +86,7 @@ async function refreshBanners(ctrl, extraChanges) { if (!nodes.length) return; const snap = {...shrink(rec.data), ...shrink(extraChanges)}; const names = triggerNames(ctrl); - const vals = !rec.resId ? snap : names.length ? sliceBy(snap, names) : {}; + const vals = rec.resId ? (names.length ? sliceBy(snap, names) : {}) : snap; const orm = ctrl.env.services.orm; for (const el of nodes) { const ruleId = parseInt(el.dataset.ruleId, 10); @@ -98,7 +107,10 @@ async function refreshBanners(ctrl, extraChanges) { function scheduleRefresh(ctrl) { if (ctrl.__wfbSched) return; ctrl.__wfbSched = true; - requestAnimationFrame(() => ((ctrl.__wfbSched = false), refreshBanners(ctrl))); + requestAnimationFrame(() => { + ctrl.__wfbSched = false; + refreshBanners(ctrl); + }); } function tick(ctrl) { @@ -164,7 +176,9 @@ patch(Record.prototype, { const ctrl = this.model.__controller; if (ctrl) tick(ctrl); } - } catch {} + } catch { + // Ignore + } return res; }, }); From a79c1082fa7df53b55a250a73b339f97d3e8deb8 Mon Sep 17 00:00:00 2001 From: LauraCForgeFlow Date: Tue, 13 Jan 2026 10:36:44 +0100 Subject: [PATCH 02/11] [IMP] web_widget_one2many_tree_line_duplicate: make duplicate icon hideable --- .../static/src/list/list_renderer.esm.js | 30 ++++++++++++++++++- .../static/src/list/list_renderer.xml | 28 ++++++++++++++++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/web_widget_one2many_tree_line_duplicate/static/src/list/list_renderer.esm.js b/web_widget_one2many_tree_line_duplicate/static/src/list/list_renderer.esm.js index 34083c4b9425..8311a470df75 100644 --- a/web_widget_one2many_tree_line_duplicate/static/src/list/list_renderer.esm.js +++ b/web_widget_one2many_tree_line_duplicate/static/src/list/list_renderer.esm.js @@ -3,19 +3,47 @@ * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */ import {ListRenderer} from "@web/views/list/list_renderer"; +import {onWillRender} from "@odoo/owl"; import {patch} from "@web/core/utils/patch"; import {serializeDate, serializeDateTime} from "@web/core/l10n/dates"; +import {exprToBoolean} from "@web/core/utils/strings"; +import {browser} from "@web/core/browser/browser"; patch(ListRenderer.prototype, { setup() { super.setup(...arguments); const parent = this.__owl__.parent.parent; - this.displayDuplicateLine = + const key = this.createViewKey(); + this.keyDuplicateLineColumn = `duplicate_line_column,${key}`; + this.duplicateLineAllowed = parent && parent.props && parent.props.fieldInfo && parent.props.fieldInfo.options && parent.props.fieldInfo.options.allow_clone; + this.displayDuplicateLine = + this.duplicateLineAllowed && this.duplicateLineColumn; + onWillRender(() => { + this.duplicateLineColumn = exprToBoolean( + browser.localStorage.getItem(this.keyDuplicateLineColumn), + false + ); + this.displayDuplicateLine = + this.duplicateLineAllowed && this.duplicateLineColumn; + }); + }, + toggleDuplicateLineColumn() { + this.duplicateLineColumn = !this.duplicateLineColumn; + browser.localStorage.setItem( + this.keyDuplicateLineColumn, + this.duplicateLineColumn + ); + this.displayDuplicateLine = + this.duplicateLineAllowed && this.duplicateLineColumn; + this.render(); + }, + get hasActionsColumn() { + return super.hasActionsColumn || Boolean(this.duplicateLineAllowed); }, async onCloneIconClick(record) { const toSkip = this.getFieldsToSkip(); diff --git a/web_widget_one2many_tree_line_duplicate/static/src/list/list_renderer.xml b/web_widget_one2many_tree_line_duplicate/static/src/list/list_renderer.xml index daa56a33ce54..7ad14dbc4aa2 100644 --- a/web_widget_one2many_tree_line_duplicate/static/src/list/list_renderer.xml +++ b/web_widget_one2many_tree_line_duplicate/static/src/list/list_renderer.xml @@ -16,6 +16,33 @@ style="width: 32px; min-width: 32px" /> + + + +