diff --git a/frappe/public/css/form_grid.css b/frappe/public/css/form_grid.css index 14f45b5989..07985a78a7 100644 --- a/frappe/public/css/form_grid.css +++ b/frappe/public/css/form_grid.css @@ -54,6 +54,19 @@ margin-left: -15px; float: left; } +.editable-row { + margin-right: 15px !important; +} +.editable-row .row-index { + margin-top: 7px; +} +.editable-row .close { + padding: 3px 7px; + margin-right: -20px; +} +.editable-row .col { + padding: 0px 7.5px; +} .row-data > .row { margin-left: 15px; } @@ -63,6 +76,9 @@ .grid-row p { margin-bottom: 5px; } +.grid-row .frappe-control { + margin-bottom: 0px; +} .grid-row .col-sm-6 .editor-toolbar-text-group, .grid-row .col-sm-6 .editor-toolbar-align-group { display: none; diff --git a/frappe/public/js/frappe/form/control.js b/frappe/public/js/frappe/form/control.js index c8530937b4..34e8bd5ddb 100644 --- a/frappe/public/js/frappe/form/control.js +++ b/frappe/public/js/frappe/form/control.js @@ -114,7 +114,7 @@ frappe.ui.form.Control = Class.extend({ } }, set_model_value: function(value) { - if(this.frm) { + if(this.doctype && this.docname) { if(frappe.model.set_value(this.doctype, this.docname, this.df.fieldname, value, this.df.fieldtype)) { this.last_value = value; diff --git a/frappe/public/js/frappe/form/grid.js b/frappe/public/js/frappe/form/grid.js index 9ab2a26637..e8e8a2808a 100644 --- a/frappe/public/js/frappe/form/grid.js +++ b/frappe/public/js/frappe/form/grid.js @@ -16,12 +16,20 @@ frappe.ui.form.Grid = Class.extend({ $.extend(this, opts); this.fieldinfo = {}; this.doctype = this.df.options; + this.meta = frappe.get_meta(this.doctype); this.template = null; this.multiple_set = false; if(this.frm.meta.__form_grid_templates && this.frm.meta.__form_grid_templates[this.df.fieldname]) { this.template = this.frm.meta.__form_grid_templates[this.df.fieldname]; } + + // set rows editable if less that 4 fields and no text, image, button, html field + if(this.meta.fields.length < 4 && !has_common(['Text', 'Small Text', 'Image', + 'Text Editor', 'HTML', 'Section Break', 'Column Break'], + $.map(this.meta.fields, function(f) { return f.fieldtype }))) { + this.editable_rows = true; + } this.is_grid = true; }, make: function() { @@ -44,13 +52,15 @@ frappe.ui.form.Grid = Class.extend({ }, make_head: function() { // labels - this.header_row = new frappe.ui.form.GridRow({ - parent: $(this.parent).find(".grid-heading-row"), - parent_df: this.df, - docfields: this.docfields, - frm: this.frm, - grid: this - }); + if(!this.header_row) { + this.header_row = new frappe.ui.form.GridRow({ + parent: $(this.parent).find(".grid-heading-row"), + parent_df: this.df, + docfields: this.docfields, + frm: this.frm, + grid: this + }); + } }, refresh: function(force) { !this.wrapper && this.make(); @@ -58,6 +68,10 @@ frappe.ui.form.Grid = Class.extend({ $rows = $(me.parent).find(".rows"), data = this.get_data(); + if(frappe.utils.is_xs()) { + this.editable_rows = false; + } + if (this.frm && this.frm.docname) { // use doc specific docfield object this.df = frappe.meta.get_docfield(this.frm.doctype, this.df.fieldname, this.frm.docname); @@ -81,21 +95,42 @@ frappe.ui.form.Grid = Class.extend({ } else { // redraw var _scroll_y = $(document).scrollTop(); - this.wrapper.find(".grid-row").remove(); + this.make_head(); - this.grid_rows = []; + + if(!this.grid_rows) { + this.grid_rows = []; + } + if(this.grid_rows.length > data.length) { + // remove extra rows + for(var i=data.length; i < this.grid_rows.length; i++) { + var grid_row = this.grid_rows[i]; + grid_row.wrapper.remove(); + } + this.grid_rows.splice(data.length); + } + this.grid_rows_by_docname = {}; + for(var ri in data) { var d = data[ri]; - var grid_row = new frappe.ui.form.GridRow({ - parent: $rows, - parent_df: this.df, - docfields: this.docfields, - doc: d, - frm: this.frm, - grid: this - }); - this.grid_rows.push(grid_row) + + if(this.grid_rows[ri]) { + var grid_row = this.grid_rows[ri]; + grid_row.doc = d; + grid_row.refresh(); + } else { + var grid_row = new frappe.ui.form.GridRow({ + parent: $rows, + parent_df: this.df, + docfields: this.docfields, + doc: d, + frm: this.frm, + grid: this + }); + this.grid_rows.push(grid_row) + } + this.grid_rows_by_docname[d.name] = grid_row; } @@ -122,8 +157,9 @@ frappe.ui.form.Grid = Class.extend({ this.wrapper.find(".grid-footer").toggle(false); } - if(this.is_sortable()) { + if(this.is_sortable() && !this.sortable_setup_done) { this.make_sortable($rows); + this.sortable_setup_done = true; } this.last_display_status = this.display_status; @@ -215,7 +251,7 @@ frappe.ui.form.Grid = Class.extend({ this.frm.script_manager.trigger(this.df.fieldname + "_add", d.doctype, d.name); this.refresh(); - if(show) { + if(show && !this.editable_rows) { if(idx) { this.wrapper.find("[data-idx='"+idx+"']").data("grid_row") .toggle_view(true, callback); @@ -369,6 +405,9 @@ frappe.ui.form.Grid = Class.extend({ frappe.ui.form.GridRow = Class.extend({ init: function(opts) { + this.fields_dict = {}; + this.on_grid_fields_dict = {}; + this.columns = {}; $.extend(this, opts); this.make(); }, @@ -377,8 +416,10 @@ frappe.ui.form.GridRow = Class.extend({ this.wrapper = $('
').appendTo(this.parent).data("grid_row", this); this.row = $('').appendTo(this.wrapper) .on("click", function() { - me.toggle_view(); - return false; + if(!me.grid.editable_rows) { + me.toggle_view(); + return false; + } }); this.set_row_index(); @@ -403,7 +444,7 @@ frappe.ui.form.GridRow = Class.extend({ this.frm.script_manager.trigger("before_" + this.grid.df.fieldname + "_remove", this.doc.doctype, this.doc.name); - this.wrapper.toggle(false); + //this.wrapper.toggle(false); frappe.model.clear_doc(this.doc.doctype, this.doc.name); this.frm.script_manager.trigger(this.grid.df.fieldname + "_remove", @@ -418,26 +459,33 @@ frappe.ui.form.GridRow = Class.extend({ this.grid.add_new_row(idx, null, show); }, refresh: function() { - if(this.doc) + if(this.doc) { this.doc = locals[this.doc.doctype][this.doc.name]; - + } // re write columns this.grid.static_display_template = null; - this.make_static_display(); + this.make_static_display(true); // refersh form fields if(this.get_open_form()) { this.layout && this.layout.refresh(this.doc); } }, - make_static_display: function() { + make_static_display: function(refresh) { var me = this; - this.row.empty(); - $('