From 9bc17fe7ec55e9bd51c01fbc5c7fce2e1ff70da4 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 20 Feb 2025 17:46:50 +0800 Subject: [PATCH] bugfix --- bricks/bricks.js | 37 +++++++++++++---- bricks/input.js | 102 +++++++++++++++++++++++++++++++++++++++++++++- bricks/tabular.js | 4 +- bricks/tree.js | 21 +++++----- bricks/utils.js | 21 ++++++---- 5 files changed, 158 insertions(+), 27 deletions(-) diff --git a/bricks/bricks.js b/bricks/bricks.js index eff0096..6526bb0 100644 --- a/bricks/bricks.js +++ b/bricks/bricks.js @@ -218,18 +218,24 @@ bricks.universal_handler = async function(from_widget, widget, desc, event){ 'desc=', desc, event); } +bricks.default_popup = function(opts){ + var popts = bricks.get_popup_default_options(); + bricks.extend(popts, opts); + return new bricks.Popup(popts); +} +bricks.default_popupwindow = function(opts){ + var popts = bricks.get_popupwindow_default_options(); + bricks.extend(popts, opts); + return new bricks.PopupWindow(popts); +} bricks.buildEventHandler = async function(w, desc, event){ var target; if (desc.target == 'Popup'){ - var popts = bricks.get_popup_default_options(); - var opt1 = desc.popup_options || {}; - bricks.extend(popts, opt1); - target = new bricks.Popup(popts); + target = bricks.default_popup(desc.popup_options || {}); } else if (desc.target == 'PopupWindow') { - var popts = bricks.get_popupwindow_default_options(); - var opt1 = desc.popup_options || {}; - bricks.extend(popts, opt1); - target = new bricks.PopupWindow(popts); + target = bricks.default_popupwindow(desc.popup_options || {}); + } else if ( desc.target instanceof bricks.JsWidget ) { + target = desc.target; } else { target = bricks.getWidgetById(desc.target, w); } @@ -349,6 +355,9 @@ bricks.buildUrlwidgetHandler = function(w, target, rtdata, desc){ } else { rtdata = bricks.extend(rtdata, desc.event_params); options = bricks.apply_data(options, rtdata); + if (desc.params_mapping){ + rtdata = bricks.map(rtdata, desc.params_mapping.mapping, desc.params_mapping.need_others); + } options.params = bricks.extend(params, rtdata); } @@ -361,6 +370,9 @@ bricks.buildUrlwidgetHandler = function(w, target, rtdata, desc){ bricks.buildBricksHandler = function(w, target, rtdata, desc){ var options = objcopy(desc.options||{}); rtdata = bricks.extend(rtdata, inputdata2dic(desc.event_params)); + if (desc.params_mapping){ + rtdata = bricks.map(rtdata, desc.params_mapping.mapping, desc.params_mapping.need_others); + } options = bricks.apply_data(options, rtdata); return _buildWidget.bind(w, target, target, desc.mode || 'replace', options, desc); } @@ -370,6 +382,9 @@ bricks.buildRegisterFunctionHandler = function(w, target, rtdata, desc){ bricks.debug('rfname:', desc.rfname, 'not registed', desc); return null; } + if (desc.params_mapping){ + rtdata = bricks.map(rtdata, desc.params_mapping.mapping, desc.params_mapping.need_others); + } var params = {}; if (desc.params){ bricks.extend(params, desc.params); @@ -391,6 +406,9 @@ bricks.buildMethodHandler = function(w, target, rtdata, desc){ bricks.extend(params, desc.params) bricks.extend(params, rtdata); bricks.extend(params, inputdata2dic(desc.event_params)); + if (desc.params_mapping){ + rtdata = bricks.map(rtdata, desc.params_mapping.mapping, desc.params_mapping.need_others); + } params = bricks.apply_data(params, rtdata); return f.bind(target, params); } @@ -399,6 +417,9 @@ bricks.buildScriptHandler = function(w, target, rtdata, desc){ bricks.extend(params, desc.params) bricks.extend(params, rtdata); bricks.extend(params, inputdata2dic(desc.event_params)); + if (desc.params_mapping){ + rtdata = bricks.map(rtdata, desc.params_mapping.mapping, desc.params_mapping.need_others); + } params = bricks.apply_data(params, rtdata); var AsyncFunction = Object.getPrototypeOf(async function(){}).constructor; var f = new AsyncFunction('params', 'event', desc.script); diff --git a/bricks/input.js b/bricks/input.js index a56feeb..3d0aa66 100644 --- a/bricks/input.js +++ b/bricks/input.js @@ -249,6 +249,105 @@ bricks.UiStr =class extends bricks.UiType { } } +bricks.UiSearch = class extends bricks.HBox { + /* + search_url: + valueField + textField + select_event + popup_options + value, + text + */ + constructor(opts){ + super(opts); + this.uitype = 'search'; + var inputdesc = { + name:this.name, + value:this.text, + readonly:true + } + this.str_in = new bricks.UiStr(inputdesc); + this.search_icon = new bricks.Icon({ + url:bricks_resource('imgs/search.png'), + rate:1.5 + }); + this.str_in.set_css('filler'); + this.search_icon.set_css('clickable'); + this.search_icon.bind('click', this.open_search_window.bind(this)); + this.add_widget(this.str_in); + this.add_widget(this.search_icon); + } + async open_search_window(event){ + var desc = { + "widgettype":"urlwidget", + "options":{ + "url":this.search_url + } + } + var w = await bricks.widgetBuild(desc, this); + var tabular = null; + for (var i=0;i 0){ v = data[0][this.opts.valueField] } if (this.opts.nullable){ @@ -969,3 +1068,4 @@ Input.register('UiPassword', 'password', bricks.UiPassword); Input.register('UiAudio', 'audio', bricks.UiAudio); Input.register('UiVideo', 'video', bricks.UiVideo); Input.register('UiAudioText', 'audiotext', bricks.UiAudioText); +Input.register('UiSearch', 'search', bricks.UiSearch); diff --git a/bricks/tabular.js b/bricks/tabular.js index d9a5f3e..10bed39 100644 --- a/bricks/tabular.js +++ b/bricks/tabular.js @@ -66,7 +66,9 @@ bricks.Tabular = class extends bricks.DataViewer { if (flag){ row.content_widget.show(); row.content_widget.clear_widgets(); - var w = await bricks.widgetBuild(this.content_view, row.content_widget, row.user_data); + var desc = objcopy(this.content_view); + desc = bricks.apply_data(desc, row.user_data); + var w = await bricks.widgetBuild(desc, row.content_widget); if (w){ row.content_widget.add_widget(w); } diff --git a/bricks/tree.js b/bricks/tree.js index 165f3f7..9cada25 100644 --- a/bricks/tree.js +++ b/bricks/tree.js @@ -210,14 +210,14 @@ bricks.Tree = class extends bricks.VScrollPanel { create_toolbar(){ var toolbar = bricks.extend({}, this.toolbar); var tools = []; - if (toolbar.tools){ - toolbar.tools.forEach(f => tools.push(f)); - } if (this.editable){ tools.push({icon:bricks_resource('imgs/add.png'), name:'add'}); tools.push({icon:bricks_resource('imgs/update.png'), name:'update'}); tools.push({icon:bricks_resource('imgs/delete.png'), name:'delete'}); } + if (toolbar.tools){ + toolbar.tools.forEach(f => tools.push(f)); + } if (tools.length == 0){ return; } @@ -239,16 +239,17 @@ bricks.Tree = class extends bricks.VScrollPanel { this.update_node(); break; default: + if ((opts.selected_data || opts.checked_data) && ! this.selected_node){ + w = new bricks.Error({title:'Error', message:'No selected node found'}); + w.open(); + return; + } console.log('opts=', opts); var d = null; if (opts.checked_data){ - d = { - checked_data:JSON.stringify(this.checked_data) - } - } else if (opts.selected_node){ - d = { - selected_data:JSON.stringify(this.selected_node.user_data) - } + d = this.checked_data + } else if (opts.selected_data){ + d = this.selected_node.user_data } this.dispatch(opts.name, d); break; diff --git a/bricks/utils.js b/bricks/utils.js index 8196266..83a1033 100644 --- a/bricks/utils.js +++ b/bricks/utils.js @@ -1,6 +1,18 @@ var bricks = window.bricks || {}; bricks.bug = false; +bricks.map = function(data_source, mapping, need_others){ + ret = {}; + Object.entries(data_source).forEach(([key, value]) => { + if (mapping.hasOwnProperty(key)){ + ret[mapping[key]] = data_source[key]; + } else if (need_others){ + ret[key] = data_source[key]; + } + }); + return ret; +} + bricks.relocate_by_eventpos = function(event, widget){ var ex,ey; var x,y; @@ -390,13 +402,8 @@ var set_max_height = function(w1, w2){ } } var objcopy = function(obj){ - var o = {} - for ( k in obj){ - if (obj.hasOwnProperty(k)){ - o[k] = obj[k]; - } - } - return o; + var s = JSON.stringify(obj); + return JSON.parse(s); } bricks.set_stream_source = async function(target, url, params){