var bricks = window.bricks || {}; bricks.TreeNode = class extends bricks.VBox { constructor(tree, pnode, data){ var opts = { width:'100%', height:'auto', } super(opts); this.tree = tree; this.parent_node = pnode; this.children_loaded = false; this.user_data = data; this.setup_icon_urls() this.is_leaf_field = this.tree.is_leafField || 'is_leaf'; this.is_leaf = this.user_data[this.is_leaf_field]; this.params = bricks.extend({}, this.tree.params) this.params = bricks.extend(this.params, {id:this.user_data[this.tree.opts.idField]}); if (this.tree.opts.typeField){ this.params.type = this.user_data[this.tree.opts.typeField]; } var n = new bricks.HBox({ height:this.tree.row_height, width:'100%' }) n.dom_element.style.margin = bricks.app.charsize * 0.2; this.add_widget(n); n.bind('click', this.tree.node_click_handle.bind(this.tree, this)); this.node_widget = n; schedule_once(this.create_node_content.bind(this,n), 0.01); if (! this.user_data.is_leaf) { this.container = new bricks.VBox({height:'auto'}); this.add_widget(this.container); this.container.dom_element.style.marginLeft = bricks.app.charsize + 'px'; if (this.user_data.children){ this.tree.create_node_children(this, this.user_data.children); } this.container.hide(); } } getValue(){ var v = this.user_data; if (this.container){ var children = []; for (var i=0; i tools.push(f)); } if (tools.length == 0){ return; } toolbar.tools = tools; this.toolbar_w = new bricks.IconTextBar(toolbar); this.add_widget(this.toolbar_w); this.toolbar_w.bind('command', this.toolbar_command.bind(this)) } toolbar_command(event){ var opts = event.params; switch (opts.name){ case 'add': this.add_new_node(); break; case 'delete': this.delete_node(); break; case 'update': this.update_node(); break; default: if (opts.selected_data && ! this.selected_node){ var w = new bricks.Error({title:'Error', message:'No selected node found'}); w.open(); return; } if (opts.checked_data && this.checked_data.length == 0){ var w = new bricks.Error({title:'Error', message:'No checked node found'}); w.open(); return; } var d = {}; if (opts.selected_data){ d = this.selected_node.user_data; } else if (opts.checked_data){ d = this.checked_data; } else { if (this.selected_node){ d = this.selected_node.user_data; } else if (this.checked_data.length>0) { d = this.checked_data[0]; } else { d = this.opts.params; } } d.meta_data = { referer: this.id, title: opts.label, icon: opts.icon } this.dispatch(opts.name, d); break; } } async add_new_node(){ var w = new bricks.ModalForm({ target:this, "width":"80%", "height":"80%", title:'add new node', fields:this.editable.fields }); w.bind('submit', this.new_node_inputed.bind(this)) } async new_node_inputed(event){ var d = event.params; var node = this; if (this.selected_node){ console.log('selected node exists') node = this.selected_node; if (d instanceof FormData){ d.append(this.parentField, node.get_id()); } else { d[this.parentField] = node.get_id(); } } else if (this.opts.params) { if (d instanceof FormData){ d.append(this.parentField, this.opts.params.id); } else { d[this.parentField] = this.opts.params.id; } } if (this.opts.newdata_params){ for (const [k, v] of Object.entries(this.opts.newdata_params)){ if (d instanceof FormData){ d.append(k, v); } else { d[k] = v; } } } if (this.editable.add_url){ var jc = new bricks.HttpJson() var desc = await jc.post(this.editable.add_url, {params:d}); if (desc.widgettype == 'Message'){ var data = desc.options.user_data; this.append_new_subnode(node, data); node.is_leaf = false; if (node != this) node.change_node_type(); } var w = await bricks.widgetBuild(desc, this); w.open(); } else { d[this.idField] = bricks.uuid(); this.append_new_subnode(node, d); } } async create_tree_nodes(node, records){ for (var i=0;i { if (data_keys.includes(k)){ console.log(node.user_data[k], ':', k, ':', data[k]); node.user_data[k] = data[k]; } }); await node.update_content(); } async get_children_data(node){ var jc = new bricks.HttpJson(); var p = bricks.extend({}, this.params); if (node != this){ p.id = node.user_data[this.idField]; } console.log('params=', p); var d = await jc.httpcall(this.opts.dataurl,{ method : this.opts.method || 'GET', params : p }) if (d.length == 0){ node.is_leaf = true; } else { this.user_data = { children:d } this.create_tree_nodes(node, d); } } create_node_children(node, data){ if(!data) return; for (var i=0; i d.id == node.user_data.id); } node.user_data[this.checkField] = stat; if (stat){ console.log('value=', cb.getValue(), 'node=', node); } this.dispatch('check_changed', node.user_data); } } bricks.Factory.register('Tree', bricks.Tree); bricks.Factory.register('EditableTree', bricks.EditableTree);