From 7ca370c0af3240d924910ac52845db647c940f36 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Fri, 29 May 2026 13:52:08 +0800 Subject: [PATCH] fix: improve tabular row click handling - Remove unused event.target.bricks_widget assignment - Add check to prevent clicks on interactive elements (A, BUTTON, INPUT, SELECT, TEXTAREA) from triggering row selection - This ensures toolbar buttons and form inputs inside rows work correctly --- bricks/tabular.js | 7 ++++++- dist/bricks.js | 23 +++++++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/bricks/tabular.js b/bricks/tabular.js index 10bed39..12273e9 100644 --- a/bricks/tabular.js +++ b/bricks/tabular.js @@ -40,7 +40,12 @@ bricks.Tabular = class extends bricks.DataViewer { return row } async record_clicked(row, record, event){ - var r = event.target.bricks_widget; + // Prevent click on interactive elements (links, buttons, inputs) from triggering selection + var target = event.target; + if (target && (target.tagName === 'A' || target.tagName === 'BUTTON' || target.tagName === 'INPUT' || target.tagName === 'SELECT' || target.tagName === 'TEXTAREA')) { + return; + } + var old_select_row = this.select_row; if (old_select_row){ this.select_row = null; diff --git a/dist/bricks.js b/dist/bricks.js index 6ba6505..b186f78 100644 --- a/dist/bricks.js +++ b/dist/bricks.js @@ -3822,15 +3822,28 @@ bricks.Menu = class extends bricks.VScrollPanel { opts.height = '100%'; super(options); this.dom_element.style.display = ""; - this.dom_element.style.backgroundColor = options.bgcolor || "white"; + this.dom_element.style.backgroundColor = options.bgcolor || "transparent"; this.build_title(); this.build_description(); this.user_data = this.opts; + this.is_collapsed = false; this.bind('item_click', this.menu_clicked.bind(this)); this.container = new bricks.VBox({}); this.add_widget(this.container); schedule_once(this.create_children.bind(this, this, 0), 0.1); } + collapse(){ + this.is_collapsed = true; + this.dom_element.classList.add('menu-collapsed'); + } + expand(){ + this.is_collapsed = false; + this.dom_element.classList.remove('menu-collapsed'); + } + toggle_collapse(){ + if (this.is_collapsed) this.expand(); + else this.collapse(); + } create_submenu_container(){ let cp = new bricks.VBox({}); cp.set_style('marginLeft', "15px"); @@ -4007,6 +4020,7 @@ bricks.Menu = class extends bricks.VScrollPanel { iw.menuitem = w; tw.menuitem = w; w.set_css(this.menuitem_css || 'menuitem'); + if (item.label) w.dom_element.title = item.label; return w; } regen_menuitem_event(item, event){ @@ -13018,7 +13032,12 @@ bricks.Tabular = class extends bricks.DataViewer { return row } async record_clicked(row, record, event){ - var r = event.target.bricks_widget; + // Prevent click on interactive elements (links, buttons, inputs) from triggering selection + var target = event.target; + if (target && (target.tagName === 'A' || target.tagName === 'BUTTON' || target.tagName === 'INPUT' || target.tagName === 'SELECT' || target.tagName === 'TEXTAREA')) { + return; + } + var old_select_row = this.select_row; if (old_select_row){ this.select_row = null;