@@ -94,7 +94,6 @@ | |||||
"lib/public/js/legacy/utils/handler.js", | "lib/public/js/legacy/utils/handler.js", | ||||
"lib/public/js/legacy/utils/printElement.js", | "lib/public/js/legacy/utils/printElement.js", | ||||
"lib/public/js/legacy/widgets/dialog.js", | "lib/public/js/legacy/widgets/dialog.js", | ||||
"lib/public/js/legacy/widgets/form/fields.js", | |||||
"lib/public/js/legacy/webpage/loaders.js", | "lib/public/js/legacy/webpage/loaders.js", | ||||
"lib/public/js/wn/upload.js", | "lib/public/js/wn/upload.js", | ||||
@@ -135,7 +134,6 @@ | |||||
"lib/public/js/wn/ui/toolbar/bookmarks.js", | "lib/public/js/wn/ui/toolbar/bookmarks.js", | ||||
"lib/public/js/wn/ui/toolbar/toolbar.js", | "lib/public/js/wn/ui/toolbar/toolbar.js", | ||||
"lib/public/js/legacy/widgets/form/fields.js", | |||||
"lib/public/js/legacy/widgets/form/form_dialog.js", | "lib/public/js/legacy/widgets/form/form_dialog.js", | ||||
"lib/public/js/legacy/widgets/form/form_header.js", | "lib/public/js/legacy/widgets/form/form_header.js", | ||||
"lib/public/js/legacy/widgets/form/form.js", | "lib/public/js/legacy/widgets/form/form.js", | ||||
@@ -7,6 +7,17 @@ wn.ui.form.make_control = function(opts) { | |||||
} | } | ||||
} | } | ||||
// old style | |||||
function make_field(docfield, doctype, parent, frm, in_grid, hide_label) { // Factory | |||||
return new wn.ui.form.make_control({ | |||||
df: docfield, | |||||
doctype: doctype, | |||||
parent: parent, | |||||
hide_label: hide_label, | |||||
frm: frm | |||||
}); | |||||
} | |||||
wn.ui.form.Control = Class.extend({ | wn.ui.form.Control = Class.extend({ | ||||
init: function(opts) { | init: function(opts) { | ||||
$.extend(this, opts); | $.extend(this, opts); | ||||
@@ -205,14 +216,22 @@ wn.ui.form.ControlData = wn.ui.form.ControlInput.extend({ | |||||
make_input: function() { | make_input: function() { | ||||
this.$input = $("<"+ this.html_element +">") | this.$input = $("<"+ this.html_element +">") | ||||
.attr("type", this.input_type) | .attr("type", this.input_type) | ||||
.attr("placeholder", this.df.placeholder || "") | |||||
.attr("data-fieldtype", this.df.fieldtype) | |||||
.addClass("col-span-12") | .addClass("col-span-12") | ||||
.prependTo(this.input_area) | .prependTo(this.input_area) | ||||
this.set_input_attributes(); | |||||
this.input = this.$input.get(0); | this.input = this.$input.get(0); | ||||
this.has_input = true; | this.has_input = true; | ||||
this.bind_change_event(); | this.bind_change_event(); | ||||
}, | }, | ||||
set_input_attributes: function() { | |||||
this.$input | |||||
.attr("data-fieldtype", this.df.fieldtype) | |||||
.attr("data-fieldname", this.df.fieldname) | |||||
.attr("placeholder", this.df.placeholder || "") | |||||
if(this.doctype) | |||||
this.$input.attr("data-doctype", this.doctype); | |||||
}, | |||||
bind_change_event: function() { | bind_change_event: function() { | ||||
var me = this; | var me = this; | ||||
this.$input.on("change", this.change || function() { | this.$input.on("change", this.change || function() { | ||||
@@ -505,7 +524,7 @@ wn.ui.form.ControlSelect = wn.ui.form.ControlData.extend({ | |||||
wn.ui.form.ControlLink = wn.ui.form.ControlData.extend({ | wn.ui.form.ControlLink = wn.ui.form.ControlData.extend({ | ||||
make_input: function() { | make_input: function() { | ||||
$('<div class="input-group link-field">\ | $('<div class="input-group link-field">\ | ||||
<input type="text" data-fieldtype="Link">\ | |||||
<input type="text">\ | |||||
<div class="input-group-btn">\ | <div class="input-group-btn">\ | ||||
<button class="btn btn-search" title="Search Link">\ | <button class="btn btn-search" title="Search Link">\ | ||||
<i class="icon-search"></i>\ | <i class="icon-search"></i>\ | ||||
@@ -519,6 +538,7 @@ wn.ui.form.ControlLink = wn.ui.form.ControlData.extend({ | |||||
</div>').appendTo(this.input_area); | </div>').appendTo(this.input_area); | ||||
this.$input_area = $(this.input_area); | this.$input_area = $(this.input_area); | ||||
this.$input = this.$input_area.find('input'); | this.$input = this.$input_area.find('input'); | ||||
this.set_input_attributes(); | |||||
this.input = this.$input.get(0); | this.input = this.$input.get(0); | ||||
this.has_input = true; | this.has_input = true; | ||||
//this.bind_change_event(); | //this.bind_change_event(); | ||||
@@ -80,6 +80,9 @@ wn.editors.BootstrapWYSIWYG = Class.extend({ | |||||
this.$textarea = this.$parent.find(".html-editor"); | this.$textarea = this.$parent.find(".html-editor"); | ||||
this.input = this.$editor.get(0); | this.input = this.$editor.get(0); | ||||
}, | }, | ||||
set_focus: function() { | |||||
this.$editor.focus(); | |||||
}, | |||||
make_bindings: function() { | make_bindings: function() { | ||||
var me = this; | var me = this; | ||||
var fonts = ['Serif', 'Sans', 'Arial', 'Arial Black', 'Courier', | var fonts = ['Serif', 'Sans', 'Arial', 'Arial Black', 'Courier', | ||||
@@ -215,6 +218,9 @@ wn.editors.ACE = Class.extend({ | |||||
get_value: function() { | get_value: function() { | ||||
return this.editor.getSession().getValue(); | return this.editor.getSession().getValue(); | ||||
}, | }, | ||||
set_focus: function() { | |||||
this.editor.focus(); | |||||
}, | |||||
bind_form_load: function() { | bind_form_load: function() { | ||||
var me = this; | var me = this; | ||||
if(cur_frm) { | if(cur_frm) { | ||||
@@ -226,5 +232,8 @@ wn.editors.ACE = Class.extend({ | |||||
}) | }) | ||||
}); | }); | ||||
} | } | ||||
} | |||||
}, | |||||
set_focus: function() { | |||||
this.$editor.focus(); | |||||
}, | |||||
}) | }) |
@@ -127,6 +127,13 @@ wn.ui.form.Grid = Class.extend({ | |||||
}, | }, | ||||
set_value: function(fieldname, value, doc) { | set_value: function(fieldname, value, doc) { | ||||
this.grid_rows_by_docname[doc.name].set_value(fieldname, value); | this.grid_rows_by_docname[doc.name].set_value(fieldname, value); | ||||
}, | |||||
add_new_row: function(idx, callback) { | |||||
wn.model.add_child(this.frm.doc, this.df.options, this.df.fieldname, idx); | |||||
this.refresh(); | |||||
// show | |||||
this.wrapper.find("[data-idx='"+idx+"']").data("grid_row") | |||||
.toggle_view(true, callback); | |||||
} | } | ||||
}); | }); | ||||
@@ -200,10 +207,7 @@ wn.ui.form.GridRow = Class.extend({ | |||||
this.wrapper.find(".grid-insert-row").click(function() { | this.wrapper.find(".grid-insert-row").click(function() { | ||||
var idx = me.doc.idx; | var idx = me.doc.idx; | ||||
me.toggle_view(false); | me.toggle_view(false); | ||||
wn.model.add_child(me.frm.doc, me.grid.df.options, me.grid.df.fieldname, | |||||
me.doc.idx); | |||||
me.grid.refresh(); | |||||
me.grid.wrapper.find("[data-idx='"+idx+"']").data("grid_row").toggle_view(true); | |||||
me.grid.add_new_row(idx); | |||||
return false; | return false; | ||||
}) | }) | ||||
}, | }, | ||||
@@ -259,7 +263,7 @@ wn.ui.form.GridRow = Class.extend({ | |||||
} | } | ||||
}); | }); | ||||
}, | }, | ||||
toggle_view: function(show) { | |||||
toggle_view: function(show, callback) { | |||||
this.doc = locals[this.doc.doctype][this.doc.name]; | this.doc = locals[this.doc.doctype][this.doc.name]; | ||||
// hide other | // hide other | ||||
var open_row = $(".grid-row-open").data("grid_row"), | var open_row = $(".grid-row-open").data("grid_row"), | ||||
@@ -267,13 +271,22 @@ wn.ui.form.GridRow = Class.extend({ | |||||
this.fields = []; | this.fields = []; | ||||
this.fields_dict = {}; | this.fields_dict = {}; | ||||
open_row && open_row != this && open_row.toggle_view(false); | |||||
this.show = show===undefined ? | this.show = show===undefined ? | ||||
show = !this.show : | show = !this.show : | ||||
show | show | ||||
if(show && open_row) { | |||||
if(open_row==this) { | |||||
// already open, do nothing | |||||
callback(); | |||||
return; | |||||
} else { | |||||
// close other views | |||||
open_row.toggle_view(false); | |||||
} | |||||
} | |||||
this.make_columns(); | this.make_columns(); | ||||
this.wrapper.toggleClass("grid-row-open", this.show); | this.wrapper.toggleClass("grid-row-open", this.show); | ||||
@@ -281,10 +294,13 @@ wn.ui.form.GridRow = Class.extend({ | |||||
this.show && this.row.toggle(false); | this.show && this.row.toggle(false); | ||||
this.form_panel.slideToggle(this.show, function() { | this.form_panel.slideToggle(this.show, function() { | ||||
if(!me.show) { | |||||
if(me.show) { | |||||
me.form_area.find(":input:first").focus(); | |||||
} else { | |||||
$(me.form_area).empty(); | $(me.form_area).empty(); | ||||
me.row.toggle(true); | me.row.toggle(true); | ||||
} | } | ||||
callback && callback(); | |||||
}); | }); | ||||
}, | }, | ||||
render_form: function() { | render_form: function() { | ||||
@@ -9,6 +9,7 @@ wn.ui.form.Layout = Class.extend({ | |||||
this.wrapper = $('<div class="form-layout">').appendTo(this.parent); | this.wrapper = $('<div class="form-layout">').appendTo(this.parent); | ||||
this.fields = wn.meta.docfield_list[this.doctype]; | this.fields = wn.meta.docfield_list[this.doctype]; | ||||
this.fields.sort(function(a,b) { return a.idx - b.idx}); | this.fields.sort(function(a,b) { return a.idx - b.idx}); | ||||
this.setup_tabbing(); | |||||
}, | }, | ||||
refresh: function() { | refresh: function() { | ||||
var me = this; | var me = this; | ||||
@@ -80,5 +81,84 @@ wn.ui.form.Layout = Class.extend({ | |||||
} | } | ||||
this.column = null; | this.column = null; | ||||
return this.section; | return this.section; | ||||
} | |||||
}, | |||||
setup_tabbing: function() { | |||||
var me = this; | |||||
this.wrapper.on("keydown", function(ev) { | |||||
if(ev.which==9) { | |||||
var current = $(ev.target), | |||||
doctype = current.attr("data-doctype"), | |||||
fieldname = current.attr("data-fieldname"); | |||||
if(doctype) | |||||
return me.handle_tab(doctype, fieldname); | |||||
} | |||||
}) | |||||
}, | |||||
handle_tab: function(doctype, fieldname) { | |||||
var me = this, | |||||
grid_row = null; | |||||
next = null, | |||||
fields = me.frm.fields, | |||||
in_grid = false; | |||||
// in grid | |||||
if(doctype != me.frm.doctype) { | |||||
grid_row =me.get_open_grid_row() | |||||
fields = grid_row.fields; | |||||
} | |||||
for(var i=0, len=fields.length; i < len; i++) { | |||||
if(fields[i].df.fieldname==fieldname) { | |||||
if(i==len-1) { | |||||
// last field in this group | |||||
if(grid_row) { | |||||
// in grid | |||||
if(grid_row.doc.idx==grid_row.grid.grid_rows.length) { | |||||
// last row, close it and find next field | |||||
grid_row.toggle_view(false, function() { | |||||
me.handle_tab(grid_row.grid.df.parent, grid_row.grid.df.fieldname); | |||||
}) | |||||
} else { | |||||
// next row | |||||
grid_row.grid.grid_rows[grid_row.doc.idx].toggle_view(true); | |||||
} | |||||
} else { | |||||
// last field - to title buttons | |||||
} | |||||
} else { | |||||
me.focus_on_next_field(i, fields); | |||||
} | |||||
break; | |||||
} | |||||
} | |||||
return false; | |||||
}, | |||||
focus_on_next_field: function(start_idx, fields) { | |||||
// loop to find next eligible fields | |||||
for(var ii= start_idx + 1, len = fields.length; ii < len; ii++) { | |||||
if(fields[ii].disp_status=="Write") { | |||||
var next = fields[ii]; | |||||
// next is table, show the table | |||||
if(next.df.fieldtype=="Table") { | |||||
if(!next.grid.grid_rows.length) { | |||||
next.grid.add_new_row(1); | |||||
} else { | |||||
next.grid.grid_rows[0].toggle_view(true); | |||||
} | |||||
} | |||||
else if(next.editor) { | |||||
next.editor.set_focus(); | |||||
} | |||||
else if(next.$input) { | |||||
next.$input.focus(); | |||||
} | |||||
break; | |||||
} | |||||
} | |||||
}, | |||||
get_open_grid_row: function() { | |||||
return $(".grid-row-open").data("grid_row"); | |||||
}, | |||||
}) | }) |
@@ -37,7 +37,7 @@ $.extend(wn.model, { | |||||
for(var fid=0;fid<docfields.length;fid++) { | for(var fid=0;fid<docfields.length;fid++) { | ||||
var f = docfields[fid]; | var f = docfields[fid]; | ||||
if(!in_list(no_value_fields, f.fieldtype) && doc[f.fieldname]==null) { | |||||
if(!in_list(wn.model.no_value_type, f.fieldtype) && doc[f.fieldname]==null) { | |||||
var v = wn.model.get_default_value(f, doc); | var v = wn.model.get_default_value(f, doc); | ||||
if(v) { | if(v) { | ||||
if(in_list(["Int", "Check"], f.fieldtype)) | if(in_list(["Int", "Check"], f.fieldtype)) | ||||