This commit is contained in:
yumoqing 2025-09-26 07:54:00 +08:00
parent 1b624ff102
commit 8a32666043
4 changed files with 105 additions and 32 deletions

View File

@ -125,6 +125,12 @@ bricks.DataViewer = class extends bricks.VBox {
selected_row:true, selected_row:true,
icon:this.editable.update_icon || bricks_resource('imgs/edit.svg') icon:this.editable.update_icon || bricks_resource('imgs/edit.svg')
}, },
{
name:'clone',
tip:'update selected record',
selected_row:true,
icon:this.editable.clone_icon || bricks_resource('imgs/clonevg')
},
{ {
name:'delete', name:'delete',
tip:'delete selected record', tip:'delete selected record',
@ -164,6 +170,10 @@ bricks.DataViewer = class extends bricks.VBox {
await this.update_record(this.select_row); await this.update_record(this.select_row);
return; return;
} }
if (tdesc.name == 'clone'){
await this.clone_record(this.select_row);
return;
}
if (tdesc.name == 'delete'){ if (tdesc.name == 'delete'){
this.delete_record(this.select_row); this.delete_record(this.select_row);
return; return;
@ -207,7 +217,7 @@ bricks.DataViewer = class extends bricks.VBox {
} }
return fs; return fs;
} }
async build_editform(data){ def build_add_form(){
var hidefields = []; var hidefields = [];
if (!this.data_params){ if (!this.data_params){
this.data_params = {} this.data_params = {}
@ -215,9 +225,6 @@ bricks.DataViewer = class extends bricks.VBox {
var opts = this.opts.editor || {}; var opts = this.opts.editor || {};
opts.widgettype = 'Form'; opts.widgettype = 'Form';
var submit_url = this.editable.new_data_url; var submit_url = this.editable.new_data_url;
if (data) {
submit_url = this.editable.update_data_url;
}
opts.options = { opts.options = {
submit_url: submit_url, submit_url: submit_url,
width: '100%', width: '100%',
@ -226,21 +233,64 @@ bricks.DataViewer = class extends bricks.VBox {
var fs = this.get_hidefields(); var fs = this.get_hidefields();
for (var i=0;i<this.fields.length;i++){ for (var i=0;i<this.fields.length;i++){
var f = bricks.extend({}, this.fields[i]); var f = bricks.extend({}, this.fields[i]);
if (data){
f.value = data[f.name];
}
fs.push(f); fs.push(f);
} }
if (data){ opts.options.fields = fs
fs.push({name:'id', value:data.id, uitype:'hide'}) var formw = new bricks.Form(opts);
return formw;
}
def build_update_form(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;
opts.options = {
submit_url: submit_url,
submit_changed:true,
width: '100%',
height: '100%'
};
var fs = this.get_hidefields();
for (var i=0;i<this.fields.length;i++){
var f = bricks.extend({}, this.fields[i]);
f.value = data[f.name];
fs.push(f);
}
fs.push({name:'id', value:data.id, uitype:'hide'})
opts.options.fields = fs
var formw = new bricks.Form(opts);
return formw;
}
def build_clone_form(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;
opts.options = {
submit_url: submit_url,
width: '100%',
height: '100%'
};
var fs = this.get_hidefields();
for (var i=0;i<this.fields.length;i++){
var f = bricks.extend({}, this.fields[i]);
f.value = data[f.name];
fs.push(f);
} }
opts.options.fields = fs opts.options.fields = fs
var title = "Add record"; var formw = new bricks.Form(opts);
if (data){ return formw;
title = "Edit record"; }
} def build_window(icon, title, form){
var f = new bricks.PopupWindow({ var f = new bricks.PopupWindow({
"title": title, "title": title,
"icon": icon,
"widget":this, "widget":this,
"archor":"cc", "archor":"cc",
"movable":true, "movable":true,
@ -249,18 +299,17 @@ bricks.DataViewer = class extends bricks.VBox {
"width":"90%", "width":"90%",
"height":"70%" "height":"70%"
}); });
var form = await bricks.widgetBuild(opts, this);
form.bind('cancel', f.dismiss.bind(f)); form.bind('cancel', f.dismiss.bind(f));
f.add_widget(form); f.add_widget(form);
f.open(); f.open();
return { return f
win: f,
form:form
}
} }
async add_record(){ async add_record(){
var widgets = await this.build_editform(null); var icon = bricks_resource('imgs/add.svg');
widgets.form.bind('submited', this.add_record_finish.bind(this, widgets.win)); var title = bricks.app.i18n._("Add record");
var form = this.build_add_form();
var win = this.build_window(icon, title, form);
form.bind('submited', this.add_record_finish.bind(this, win));
} }
async add_record_finish(f, event){ async add_record_finish(f, event){
f.dismiss(); f.dismiss();
@ -271,8 +320,11 @@ bricks.DataViewer = class extends bricks.VBox {
} }
async update_record(){ async update_record(){
var record = this.select_row.user_data; var record = this.select_row.user_data;
var widgets = await this.build_editform(record); var icon = bricks_resource('imgs/edit.svg');
widgets.form.bind('submited', this.update_record_finish.bind(this, widgets.win, widgets.form)); var title = bricks.app.i18n._("Update record");
var form = this.build_update_form(record);
var win = this.build_window(icon, title, form);
form.bind('submited', this.update_record_finish.bind(this, win));
} }
async update_record_finish(win, form, event){ async update_record_finish(win, form, event){
await this.renew_record_view(form, this.select_row); await this.renew_record_view(form, this.select_row);
@ -282,6 +334,14 @@ bricks.DataViewer = class extends bricks.VBox {
w.open(); w.open();
win.dismiss(); win.dismiss();
} }
async def clone_record(){
var record = this.select_row.user_data;
var icon = bricks_resource('imgs/clone.svg');
var title = bricks.app.i18n._("Clone record");
var form = this.build_update_form(record);
var win = this.build_window(icon, title, form);
form.bind('submited', this.add_record_finish.bind(this, win));
}
delete_record(row, record){ delete_record(row, record){
var conform_w = new bricks.Conform({ var conform_w = new bricks.Conform({
cwidth:16, cwidth:16,

View File

@ -229,8 +229,10 @@ bricks.FormBase = class extends bricks.Layout {
} }
return this.get_formdata(); return this.get_formdata();
} }
get_formdata(){ get_formdata(){
var data = new FormData(); var data = new FormData();
var changed = false;
for (var name in this.name_inputs){ for (var name in this.name_inputs){
if (! this.name_inputs.hasOwnProperty(name)){ if (! this.name_inputs.hasOwnProperty(name)){
continue; continue;
@ -245,23 +247,23 @@ bricks.FormBase = class extends bricks.Layout {
if (d[name] === null){ if (d[name] === null){
continue; continue;
} }
if (this.origin_data[name] == d[name]){
continue;
}
w.set_formdata(data); w.set_formdata(data);
changed = true;
} }
this.data = data; this.data = data;
return data; if (changed){
return data;
}
return null
} }
async validation(){ async validation(){
var running = new bricks.Running({target:this}); var running = new bricks.Running({target:this});
try { try {
var data; var data;
data = this.get_formdata(); data = this.get_formdata();
/*
if (this.need_formdata){
data = this.get_formdata();
} else {
data = this.getValue();
}
*/
if (! data) { if (! data) {
running.dismiss(); running.dismiss();
return; return;
@ -282,6 +284,14 @@ bricks.FormBase = class extends bricks.Layout {
} }
running.dismiss(); running.dismiss();
} }
save_origin_data(){
this.origin_data = {};
for (var name in this.name_inputs){
var w = this.name_inputs[name];
var d = w.getValue();
this.origin_data[name] = d[name];
}
}
} }
bricks.InlineForm = class extends bricks.FormBase { bricks.InlineForm = class extends bricks.FormBase {
@ -293,6 +303,7 @@ bricks.InlineForm = class extends bricks.FormBase {
this.fg = new bricks.FieldGroup({}); this.fg = new bricks.FieldGroup({});
this.fg.build_fields(this, this, this.opts.fields) this.fg.build_fields(this, this, this.opts.fields)
this.build_toolbar(this.children[0]); this.build_toolbar(this.children[0]);
this.save_origin_data();
} }
} }
@ -381,6 +392,7 @@ bricks.Form = class extends bricks.FormBase {
filler.add_widget(this.body); filler.add_widget(this.body);
if (! opts.notoolbar) if (! opts.notoolbar)
this.build_toolbar(this); this.build_toolbar(this);
this.save_origin_data();
} }
} }

2
bricks/imgs/clone.svg Normal file
View File

@ -0,0 +1,2 @@
<svg t="1758835169250" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6259" width="100% height="100%"><path d="M901 256H317c-33 0-60 27-60 60v584c0 33 27 60 60 60h584c33 0 60-27 60-60V316c0-33-27-60-60-60z m0 643.893a0.901 0.901 0 0 1-0.107 0.107H317.108a0.901 0.901 0 0 1-0.107-0.107V316.108a0.901 0.901 0 0 1 0.107-0.107h583.784V316c0.037 0.031 0.076 0.07 0.108 0.108v583.785z" fill="#ee8080"" p-id="6260"></path>
<path d="M783.5 578h-145V433.578c0-15.188-11.071-28.423-26.138-30.333C594.16 400.938 578.5 415.229 578.5 433v145h-145c-16.5 0-30 13.5-30 30s13.5 30 30 30h145v144.422c0 15.188 11.071 28.423 26.138 30.333C622.84 815.062 638.5 800.771 638.5 783V638h145c16.5 0 30-13.5 30-30s-13.5-30-30-30zM482 124h189c16.5 0 30-13.5 30-30s-13.5-30-30-30H125c-33 0-60 27-60 60v547c0 16.5 13.5 30 30 30s30-13.5 30-30V124h357z" fill="${color}" p-id="6261"></path></svg>

After

Width:  |  Height:  |  Size: 909 B

View File

@ -244,7 +244,6 @@ bricks.LlmIO = class extends bricks.VBox {
user_icon: user_icon:
list_models_url: list_models_url:
input_fields: input_fields:
input_view:
models: models:
} }
models:[ models:[
@ -303,7 +302,7 @@ bricks.LlmIO = class extends bricks.VBox {
async show_input(params){ async show_input(params){
var box = new bricks.HBox({width:'100%'}); var box = new bricks.HBox({width:'100%'});
var data = inputdata2dic(params); var data = inputdata2dic(params);
console.log('data=', data, 'input_view=', this.input_view); console.log('data=', data);
var w = new bricks.UserInputView({ var w = new bricks.UserInputView({
width: '100%', width: '100%',
input_fields: this.input_fields, input_fields: this.input_fields,