var bricks = window.bricks || {}; bricks.DataViewer = class extends bricks.VBox { constructor(opts){ opts.width = '100%'; opts.height = '100%'; opts.overflow = 'hidden'; super(opts); this.loader = new bricks.PageDataLoader({ url:this.opts.data_url, params:this.opts.data_params, pagerows:this.opts.page_rows, method:this.opts.data_method, cache_pages:this.opts.cache_limit }); this.old_params = null; this.select_row = null; this.active_item = null; this.loading = false; this.data_offset = 0; this.keyselectable = true; this.bind('row_check_changed', this.show_check_event_data.bind(this)); schedule_once(this.build_all.bind(this), 0.1); } set_key_select_items(){ if (!this.scrollpanel) return; var items = this.scrollpanel.children; this.key_select_items = items.filter(i => i != items[0]); } async build_all(){ this.build_title_widget(); this.build_description_widget(); this.build_toolbar_widget(); this.build_records_area(); await this.build_other(); this.check_changed_row = null; this.scrollpanel.bind('min_threshold', this.load_previous_page.bind(this)); this.scrollpanel.bind('max_threshold', this.load_next_page.bind(this)); await this.render(); this.set_key_select_items(); bricks.debug_obj = this.scrollpanel; } async build_other(){ } async render(params) { params = params || {}; if (params == this.old_params){ return; } this.old_params = params; bricks.debug('params=', params, 'render() called'); var d = await this.loader.loadData(params); if (d){ this.scrollpanel.clear_widgets(); await this.before_data_handle(); await this.dataHandle(d); } else { bricks.debug(params, 'load data return null'); } } async before_data_handle(){ } async dataHandle(d){ var data = d.rows; var page = d.add_page; if (!data){ return; } await this.renderPageData(data, page); if (d.delete_page){ this.delete_page(d.delete_page); } } build_records_area(){ this.filler_widget = new bricks.Filler({}); this.add_widget(this.filler_widget) this.scrollpanel = new bricks.VScrollPanel({}); this.filler_widget.add_widget(this.scrollpanel); } async renderPageData(data, page){ var pos; if (! this.loader.is_max_page(page)){ data.reverse(); pos = this.data_offset; } else { pos = null; } for(var i=0; i { edit_names.push(t.name); }); } if (this.toolbar){ this.toolbar.tools.forEach(t => { if (! edit_names.includes(t.name)){ tbdesc.tools.push(t); } }); } if (tbdesc.tools.length == 0){ return; } this.toolbar_w = new bricks.IconTextBar(tbdesc); this.add_widget(this.toolbar_w); this.toolbar_w.bind('command', this.command_event_handle.bind(this)); } async command_event_handle(event){ var tdesc = event.params; if (tdesc.selected_row && ! this.select_row){ bricks.show_error({title:'Error', message:'need select a row'}); return; } if (tdesc.name == 'add'){ await this.add_record(); return; } if (tdesc.name == 'update'){ await this.update_record(this.select_row); return; } if (tdesc.name == 'delete'){ this.delete_record(this.select_row); return; } var data = null; if (this.select_row){ var r = this.select_row; var data = r.user_data; } console.log(tdesc.name, 'clicked ==================', tdesc.name, data) this.dispatch(tdesc.name, data); } get_edit_fields(){ var fs = this.row_options.fields; this.fields = []; var exclouded = []; if (this.row_options.editexclouded){ exclouded = this.row_options.editexclouded; } fs.forEach(f => { if (!exclouded.includes(f.name)){ this.fields.push(f); } }); } record_check_changed(event){ this.check_changed_row = event.params; this.dispatch('row_check_changed', event.params.user_data); } async renew_record_view(form, row){ var d = form._getValue(); d = form._getValue(); var record = bricks.extend(row.user_data, d); row.renew(record); } get_hidefields(){ var fs = []; var params = this.data_params || {}; for (var k in params){ fs.push({name:k, value:params[k], uitype:'hide'}); } return fs; } async build_editform(data){ var hidefields = []; if (!this.data_params){ this.data_params = {} } var opts = this.opts.editor || {}; opts.widgettype = 'Form'; var submit_url = this.editable.new_data_url; if (data) { submit_url = this.editable.update_data_url; } opts.options = { submit_url: submit_url, width: '100%', height: '100%' }; var fs = this.get_hidefields(); for (var i=0;i