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

View File

@ -229,8 +229,10 @@ bricks.FormBase = class extends bricks.Layout {
}
return this.get_formdata();
}
get_formdata(){
var data = new FormData();
var changed = false;
for (var name in this.name_inputs){
if (! this.name_inputs.hasOwnProperty(name)){
continue;
@ -245,23 +247,23 @@ bricks.FormBase = class extends bricks.Layout {
if (d[name] === null){
continue;
}
if (this.origin_data[name] == d[name]){
continue;
}
w.set_formdata(data);
changed = true;
}
this.data = data;
if (changed){
return data;
}
return null
}
async validation(){
var running = new bricks.Running({target:this});
try {
var data;
data = this.get_formdata();
/*
if (this.need_formdata){
data = this.get_formdata();
} else {
data = this.getValue();
}
*/
if (! data) {
running.dismiss();
return;
@ -282,6 +284,14 @@ bricks.FormBase = class extends bricks.Layout {
}
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 {
@ -293,6 +303,7 @@ bricks.InlineForm = class extends bricks.FormBase {
this.fg = new bricks.FieldGroup({});
this.fg.build_fields(this, this, this.opts.fields)
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);
if (! opts.notoolbar)
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:
list_models_url:
input_fields:
input_view:
models:
}
models:[
@ -303,7 +302,7 @@ bricks.LlmIO = class extends bricks.VBox {
async show_input(params){
var box = new bricks.HBox({width:'100%'});
var data = inputdata2dic(params);
console.log('data=', data, 'input_view=', this.input_view);
console.log('data=', data);
var w = new bricks.UserInputView({
width: '100%',
input_fields: this.input_fields,