@@ -148,7 +148,12 @@ def pack(target, sources, no_compress, verbose): | |||||
print "Wrote %s - %sk" % (target, str(int(os.path.getsize(target)/1024))) | print "Wrote %s - %sk" % (target, str(int(os.path.getsize(target)/1024))) | ||||
def html_to_js_template(path, content): | def html_to_js_template(path, content): | ||||
# remove whitespace to a single space | |||||
content = re.sub("\s+", " ", content).replace("'", "\'") | content = re.sub("\s+", " ", content).replace("'", "\'") | ||||
# strip comments | |||||
content = re.sub("(<!--.*?-->)", "", content) | |||||
return """frappe.templates["{key}"] = '{content}';\n""".format(\ | return """frappe.templates["{key}"] = '{content}';\n""".format(\ | ||||
key=path.rsplit("/", 1)[-1][:-5], content=content) | key=path.rsplit("/", 1)[-1][:-5], content=content) | ||||
@@ -122,10 +122,10 @@ frappe.DataImportTool = Class.extend({ | |||||
} | } | ||||
}); | }); | ||||
frappe.pages['data-import-tool'].onload = function(wrapper) { | |||||
frappe.pages['data-import-tool'].on_page_load = function(wrapper) { | |||||
frappe.data_import_tool = new frappe.DataImportTool(wrapper); | frappe.data_import_tool = new frappe.DataImportTool(wrapper); | ||||
} | } | ||||
frappe.pages['data-import-tool'].onshow = function(wrapper) { | |||||
frappe.pages['data-import-tool'].on_page_show = function(wrapper) { | |||||
frappe.data_import_tool && frappe.data_import_tool.set_route_options(); | frappe.data_import_tool && frappe.data_import_tool.set_route_options(); | ||||
} | } |
@@ -1,6 +1,6 @@ | |||||
frappe.provide('frappe.desktop'); | frappe.provide('frappe.desktop'); | ||||
frappe.pages['desktop'].onload = function(wrapper) { | |||||
frappe.pages['desktop'].on_page_load = function(wrapper) { | |||||
frappe.desktop.background = $('<div style="background: none; text-align: center; \ | frappe.desktop.background = $('<div style="background: none; text-align: center; \ | ||||
margin: 0px auto;"> \ | margin: 0px auto;"> \ | ||||
<div id="icon-grid">\ | <div id="icon-grid">\ | ||||
@@ -1,5 +1,5 @@ | |||||
frappe.pages['modules_setup'].onload = function(wrapper) { | |||||
frappe.pages['modules_setup'].on_page_load = function(wrapper) { | |||||
var page = frappe.ui.make_app_page({ | var page = frappe.ui.make_app_page({ | ||||
parent: wrapper, | parent: wrapper, | ||||
title: __('Show or Hide Modules'), | title: __('Show or Hide Modules'), | ||||
@@ -1,4 +1,4 @@ | |||||
frappe.pages['permission-manager'].onload = function(wrapper) { | |||||
frappe.pages['permission-manager'].on_page_load = function(wrapper) { | |||||
var page = frappe.ui.make_app_page({ | var page = frappe.ui.make_app_page({ | ||||
parent: wrapper, | parent: wrapper, | ||||
title: __('Role Permissions Manager'), | title: __('Role Permissions Manager'), | ||||
@@ -1,4 +1,4 @@ | |||||
frappe.pages['user-permissions'].onload = function(wrapper) { | |||||
frappe.pages['user-permissions'].on_page_load = function(wrapper) { | |||||
var page = frappe.ui.make_app_page({ | var page = frappe.ui.make_app_page({ | ||||
parent: wrapper, | parent: wrapper, | ||||
title: __("User Permissions Manager"), | title: __("User Permissions Manager"), | ||||
@@ -3,7 +3,7 @@ | |||||
frappe.provide("frappe.activity"); | frappe.provide("frappe.activity"); | ||||
frappe.pages['activity'].onload = function(wrapper) { | |||||
frappe.pages['activity'].on_page_load = function(wrapper) { | |||||
var me = this; | var me = this; | ||||
frappe.require('assets/frappe/js/lib/flot/jquery.flot.js'); | frappe.require('assets/frappe/js/lib/flot/jquery.flot.js'); | ||||
@@ -1,6 +1,6 @@ | |||||
frappe.provide("frappe.applications"); | frappe.provide("frappe.applications"); | ||||
frappe.pages['applications'].onload = function(parent) { | |||||
frappe.pages['applications'].on_page_load = function(parent) { | |||||
frappe.applications.installer = new frappe.applications.Installer(parent); | frappe.applications.installer = new frappe.applications.Installer(parent); | ||||
}; | }; | ||||
@@ -6,7 +6,7 @@ | |||||
frappe.provide('frappe.desk.pages.messages'); | frappe.provide('frappe.desk.pages.messages'); | ||||
frappe.pages.messages.onload = function(parent) { | |||||
frappe.pages.messages.on_page_load = function(parent) { | |||||
var page = frappe.ui.make_app_page({ | var page = frappe.ui.make_app_page({ | ||||
parent: parent, | parent: parent, | ||||
}); | }); | ||||
@@ -21,7 +21,7 @@ frappe.ui.form.on("Print Format", "edit_format", function(frm) { | |||||
return; | return; | ||||
} | } | ||||
frappe.route_options = { | frappe.route_options = { | ||||
print_format: frm.doc | |||||
print_format: frm | |||||
}; | }; | ||||
frappe.set_route("print-format-builder"); | frappe.set_route("print-format-builder"); | ||||
}); | }); |
@@ -1,20 +1,26 @@ | |||||
.print-format-builder-section, .print-format-builder-add-section { | .print-format-builder-section, .print-format-builder-add-section { | ||||
border: 1px dashed #d1d8dd; | |||||
border: 1px solid #d1d8dd; | |||||
margin: 0px; | margin: 0px; | ||||
margin-bottom: 15px; | margin-bottom: 15px; | ||||
} | } | ||||
.print-format-builder-add-section { | .print-format-builder-add-section { | ||||
border: 1px dashed #d1d8dd; | |||||
text-align: center; | text-align: center; | ||||
padding: 15px; | padding: 15px; | ||||
cursor: pointer; | cursor: pointer; | ||||
} | } | ||||
.print-format-builder-column { | .print-format-builder-column { | ||||
border: 1px dashed #d1d8dd; | |||||
padding: 15px; | padding: 15px; | ||||
margin: 15px 0px; | |||||
margin: 0px -15px 0 -16px; | |||||
background-color: white; | background-color: white; | ||||
min-height: 64px; | min-height: 64px; | ||||
border-left: 1px solid #d1d8dd; | |||||
border-right: 1px solid #d1d8dd; | |||||
} | |||||
.section-column:last-child .print-format-builder-column { | |||||
margin-right: -16px; | |||||
} | } | ||||
.print-format-builder-field { | .print-format-builder-field { | ||||
@@ -22,7 +28,7 @@ | |||||
border: 1px solid #d1d8dd; | border: 1px solid #d1d8dd; | ||||
border-radius: 3px; | border-radius: 3px; | ||||
margin-bottom: 10px; | margin-bottom: 10px; | ||||
height: 34px; | |||||
min-height: 34px; | |||||
} | } | ||||
.print-format-builder-field:last-child { | .print-format-builder-field:last-child { | ||||
@@ -45,5 +51,13 @@ | |||||
.print-format-builder-section-head { | .print-format-builder-section-head { | ||||
cursor: move; | cursor: move; | ||||
padding: 10px 15px; | padding: 10px 15px; | ||||
border-bottom: 1px dashed #d1d8dd; | |||||
border-bottom: 1px solid #d1d8dd; | |||||
} | |||||
.column-selector-row:hover { | |||||
background-color: #fafbfc; | |||||
} | |||||
.column-selector-row .form-control { | |||||
margin-top: 5px; | |||||
} | } |
@@ -1,12 +1,12 @@ | |||||
frappe.pfbuilder = null; | |||||
frappe.pages['print-format-builder'].onload = function(wrapper) { | |||||
frappe.pages['print-format-builder'].on_page_load = function(wrapper) { | |||||
frappe.print_format_builder = new frappe.PrintFormatBuilder(wrapper); | frappe.print_format_builder = new frappe.PrintFormatBuilder(wrapper); | ||||
} | } | ||||
frappe.pages['print-format-builder'].onshow = function(wrapper) { | |||||
frappe.pages['print-format-builder'].on_page_show = function(wrapper) { | |||||
// load a new page | // load a new page | ||||
if(frappe.route_options.print_format != frappe.print_format_builder.print_format) { | |||||
var frm = frappe.route_options.print_format | |||||
if(!frm || !frappe.print_format_builder.doc || | |||||
(frm.doc.name != frappe.print_format_builder.doc.name)) { | |||||
frappe.print_format_builder.refresh(); | frappe.print_format_builder.refresh(); | ||||
} | } | ||||
} | } | ||||
@@ -15,16 +15,14 @@ frappe.PrintFormatBuilder = Class.extend({ | |||||
init: function(parent) { | init: function(parent) { | ||||
this.parent = parent; | this.parent = parent; | ||||
this.make(); | this.make(); | ||||
this.refresh(); | |||||
}, | }, | ||||
refresh: function() { | refresh: function() { | ||||
this.print_format = frappe.route_options.print_format; | |||||
this.visible_columns = {}; | |||||
this.frm = frappe.route_options.print_format; | |||||
if(!this.print_format) { | |||||
this.as_user_to_start_from_print_format(); | |||||
if(!(this.frm && this.frm.doc)) { | |||||
this.ask_user_to_start_from_print_format(); | |||||
} else { | } else { | ||||
this.page.set_title(this.print_format.name); | |||||
this.page.set_title(this.frm.doc.name); | |||||
this.setup_print_format(); | this.setup_print_format(); | ||||
} | } | ||||
}, | }, | ||||
@@ -34,27 +32,43 @@ frappe.PrintFormatBuilder = Class.extend({ | |||||
title: __("Print Format Builder") | title: __("Print Format Builder") | ||||
}); | }); | ||||
}, | }, | ||||
as_user_to_start_from_print_format: function() { | |||||
ask_user_to_start_from_print_format: function() { | |||||
this.page.main.html('<div class="padding"><a class="btn btn-default btn-sm" href="#List/Print Format">' | this.page.main.html('<div class="padding"><a class="btn btn-default btn-sm" href="#List/Print Format">' | ||||
+__("Please create or edit a new Print Format")+'</a></div>'); | +__("Please create or edit a new Print Format")+'</a></div>'); | ||||
this.page.sidebar.html(""); | |||||
this.page.clear_primary_action(); | |||||
}, | }, | ||||
setup_print_format: function() { | setup_print_format: function() { | ||||
var me = this; | var me = this; | ||||
frappe.model.with_doctype(this.print_format.doc_type, function(doctype) { | |||||
me.meta = frappe.get_meta(me.print_format.doc_type); | |||||
frappe.model.with_doctype(this.frm.doc.doc_type, function(doctype) { | |||||
me.meta = frappe.get_meta(me.frm.doc.doc_type); | |||||
me.setup_sidebar(); | me.setup_sidebar(); | ||||
me.render_layout(); | me.render_layout(); | ||||
me.page.set_primary_action(__("Save"), function() { | |||||
me.save_print_format(); | |||||
}); | |||||
}); | }); | ||||
}, | }, | ||||
setup_sidebar: function() { | setup_sidebar: function() { | ||||
var me = this; | var me = this; | ||||
this.page.sidebar.empty(); | this.page.sidebar.empty(); | ||||
// prepend custom HTML field | |||||
var fields = [this.get_custom_html_field()].concat(this.meta.fields); | |||||
$(frappe.render_template("print_format_builder_sidebar", | $(frappe.render_template("print_format_builder_sidebar", | ||||
{fields: this.meta.fields})) | |||||
{fields: fields})) | |||||
.appendTo(this.page.sidebar); | .appendTo(this.page.sidebar); | ||||
this.setup_field_filter(); | this.setup_field_filter(); | ||||
}, | }, | ||||
get_custom_html_field: function() { | |||||
return { | |||||
fieldtype: "Custom HTML", | |||||
fieldname: "_custom_html", | |||||
label: __("Custom HTML") | |||||
} | |||||
}, | |||||
render_layout: function() { | render_layout: function() { | ||||
this.page.main.empty(); | this.page.main.empty(); | ||||
this.prepare_data(); | this.prepare_data(); | ||||
@@ -62,12 +76,13 @@ frappe.PrintFormatBuilder = Class.extend({ | |||||
data: this.layout_data, me: this})) | data: this.layout_data, me: this})) | ||||
.appendTo(this.page.main); | .appendTo(this.page.main); | ||||
this.setup_sortable(); | this.setup_sortable(); | ||||
this.setup_settings(); | |||||
this.setup_section_settings(); | |||||
this.setup_column_selector(); | this.setup_column_selector(); | ||||
this.setup_edit_custom_html(); | |||||
this.setup_add_section(); | this.setup_add_section(); | ||||
}, | }, | ||||
prepare_data: function() { | prepare_data: function() { | ||||
this.data = JSON.parse(this.print_format.format_data || "[]"); | |||||
this.data = JSON.parse(this.frm.doc.format_data || "[]"); | |||||
if(!this.data.length) { | if(!this.data.length) { | ||||
// new layout | // new layout | ||||
this.data = this.meta.fields; | this.data = this.meta.fields; | ||||
@@ -86,6 +101,18 @@ frappe.PrintFormatBuilder = Class.extend({ | |||||
// break the layout into sections and columns | // break the layout into sections and columns | ||||
// so that it is easier to render in a template | // so that it is easier to render in a template | ||||
$.each(this.data, function(i, f) { | $.each(this.data, function(i, f) { | ||||
if(!f.name && f.fieldname) { | |||||
// from format_data (designed format) | |||||
// print_hide should always be false | |||||
if(f.fieldname==="_custom_html") { | |||||
f.label = "Custom HTML"; | |||||
f.fieldtype = "Custom HTML" | |||||
} else { | |||||
f = $.extend(frappe.meta.get_docfield(me.frm.doc.doc_type, | |||||
f.fieldname) || {}, f); | |||||
} | |||||
} | |||||
if(f.fieldtype==="Section Break") { | if(f.fieldtype==="Section Break") { | ||||
section = me.get_new_section(); | section = me.get_new_section(); | ||||
column = null; | column = null; | ||||
@@ -119,14 +146,20 @@ frappe.PrintFormatBuilder = Class.extend({ | |||||
return {fields: []} | return {fields: []} | ||||
}, | }, | ||||
add_table_properties: function(f) { | add_table_properties: function(f) { | ||||
// build table columns and widths in a dict | |||||
// visible_columns | |||||
var me = this; | var me = this; | ||||
this.visible_columns[f.options] = []; | |||||
$.each(frappe.get_meta(f.options).fields, function(i, _f) { | |||||
if(!in_list(["Section Break", "Column Break"], _f.fieldtype) && | |||||
!_f.print_hide && f.label) { | |||||
me.visible_columns[f.options].push(_f.fieldname); | |||||
} | |||||
}); | |||||
if(!f.visible_columns) { | |||||
f.visible_columns = [] | |||||
$.each(frappe.get_meta(f.options).fields, function(i, _f) { | |||||
if(!in_list(["Section Break", "Column Break"], _f.fieldtype) && | |||||
!_f.print_hide && f.label) { | |||||
// column names set as fieldname|width | |||||
f.visible_columns.push({fieldname: _f.fieldname, width: _f.width}); | |||||
} | |||||
}); | |||||
} | |||||
}, | }, | ||||
setup_sortable: function() { | setup_sortable: function() { | ||||
var me = this; | var me = this; | ||||
@@ -163,8 +196,13 @@ frappe.PrintFormatBuilder = Class.extend({ | |||||
// on drop, change the HTML | // on drop, change the HTML | ||||
var $item = $(evt.item); | var $item = $(evt.item); | ||||
if(!$item.hasClass("print-format-builder-field")) { | if(!$item.hasClass("print-format-builder-field")) { | ||||
var fieldname = $item.attr("data-fieldname"), | |||||
field = frappe.meta.get_docfield(me.print_format.doc_type, fieldname); | |||||
var fieldname = $item.attr("data-fieldname"); | |||||
if(fieldname==="_custom_html") { | |||||
var field = me.get_custom_html_field(); | |||||
} else { | |||||
var field = frappe.meta.get_docfield(me.frm.doc.doc_type, fieldname); | |||||
} | |||||
$item.replaceWith(frappe.render_template("print_format_builder_field", | $item.replaceWith(frappe.render_template("print_format_builder_field", | ||||
{field: field, me:me})) | {field: field, me:me})) | ||||
@@ -183,7 +221,7 @@ frappe.PrintFormatBuilder = Class.extend({ | |||||
}) | }) | ||||
}); | }); | ||||
}, | }, | ||||
setup_settings: function() { | |||||
setup_section_settings: function() { | |||||
var me = this; | var me = this; | ||||
this.page.main.on("click", ".section-settings", function() { | this.page.main.on("click", ".section-settings", function() { | ||||
var section = $(this).parent().parent(); | var section = $(this).parent().parent(); | ||||
@@ -194,9 +232,24 @@ frappe.PrintFormatBuilder = Class.extend({ | |||||
title: "Edit Section", | title: "Edit Section", | ||||
fields: [ | fields: [ | ||||
{ | { | ||||
label:__("No of Columns"), fieldname:"no_of_columns", | |||||
fieldtype:"Select", options: ["1", "2", "3"], | |||||
label:__("No of Columns"), | |||||
fieldname:"no_of_columns", | |||||
fieldtype:"Select", | |||||
options: ["1", "2", "3"], | |||||
}, | }, | ||||
{ | |||||
label: __("Remove Section"), | |||||
fieldname: "remove_section", | |||||
fieldtype: "Button", | |||||
click: function() { | |||||
d.hide(); | |||||
section.fadeOut(function() {section.remove()}); | |||||
}, | |||||
input_class: "btn-danger", | |||||
input_css: { | |||||
"margin-top": "20px" | |||||
} | |||||
} | |||||
], | ], | ||||
}); | }); | ||||
@@ -212,7 +265,8 @@ frappe.PrintFormatBuilder = Class.extend({ | |||||
d.show(); | d.show(); | ||||
}) | |||||
return false; | |||||
}); | |||||
}, | }, | ||||
update_columns_in_section: function(section, no_of_columns, new_no_of_columns) { | update_columns_in_section: function(section, no_of_columns, new_no_of_columns) { | ||||
var col_size = 12 / new_no_of_columns, | var col_size = 12 / new_no_of_columns, | ||||
@@ -275,38 +329,134 @@ frappe.PrintFormatBuilder = Class.extend({ | |||||
setup_column_selector: function() { | setup_column_selector: function() { | ||||
var me = this; | var me = this; | ||||
this.page.main.on("click", ".select-columns", function() { | this.page.main.on("click", ".select-columns", function() { | ||||
var parent = $(this).parent(), | |||||
var parent = $(this).parents(".print-format-builder-field:first"), | |||||
doctype = parent.attr("data-doctype"), | doctype = parent.attr("data-doctype"), | ||||
label = parent.attr("data-label"), | label = parent.attr("data-label"), | ||||
columns = parent.attr("data-columns").split(","); | |||||
columns = parent.attr("data-columns").split(",") | |||||
column_names = $.map(columns, function(v) { return v.split("|")[0]; }); | |||||
widths = {}; | |||||
$.each(columns, function(i, v) { | |||||
var parts = v.split("|"); | |||||
widths[parts[0]] = parts[1]; | |||||
}); | |||||
var d = new frappe.ui.Dialog({ | var d = new frappe.ui.Dialog({ | ||||
title: __("Select Table Columns for {0}", [label]), | title: __("Select Table Columns for {0}", [label]), | ||||
}); | }); | ||||
var $body = $(d.body); | |||||
// render checkboxes | // render checkboxes | ||||
$(frappe.render_template("print_format_builder_column_selector", { | $(frappe.render_template("print_format_builder_column_selector", { | ||||
fields: frappe.get_meta(doctype).fields, | fields: frappe.get_meta(doctype).fields, | ||||
columns: columns | |||||
column_names: column_names, | |||||
widths: widths | |||||
})).appendTo(d.body); | })).appendTo(d.body); | ||||
Sortable.create($(d.body).find(".column-selector-list").get(0)); | |||||
Sortable.create($body.find(".column-selector-list").get(0)); | |||||
var get_width_input = function(fieldname) { | |||||
return $body.find(".column-width[data-fieldname='"+ fieldname +"']") | |||||
} | |||||
// update data-columns property on update | // update data-columns property on update | ||||
d.set_primary_action(__("Update"), function() { | d.set_primary_action(__("Update"), function() { | ||||
me.visible_columns[doctype] = []; | |||||
$(d.body).find("input:checked").each(function() { | |||||
me.visible_columns[doctype].push($(this).attr("data-fieldname")); | |||||
var visible_columns = []; | |||||
$body.find("input:checked").each(function() { | |||||
var fieldname = $(this).attr("data-fieldname"), | |||||
width = get_width_input(fieldname).val() || ""; | |||||
visible_columns.push(fieldname + "|" + width); | |||||
}); | }); | ||||
parent.attr("data-columns", me.visible_columns[doctype].join(me.visible_columns[doctype])); | |||||
parent.attr("data-columns", visible_columns.join(",")); | |||||
d.hide(); | |||||
}); | |||||
// enable / disable input based on selection | |||||
$body.on("click", "input[type='checkbox']", function() { | |||||
var disabled = !$(this).prop("checked"), | |||||
input = get_width_input($(this).attr("data-fieldname")); | |||||
input.prop("disabled", disabled); | |||||
if(disabled) input.val(""); | |||||
}); | |||||
d.show(); | |||||
return false; | |||||
}); | |||||
}, | |||||
get_visible_columns_string: function(f) { | |||||
return $.map(f.visible_columns, function(v) { return v.fieldname + "|" + v.width }).join(",") | |||||
}, | |||||
get_no_content: function() { | |||||
return '<div class="text-extra-muted" data-no-content>'+__("Edit to add content")+'</div>' | |||||
}, | |||||
setup_edit_custom_html: function() { | |||||
var me = this; | |||||
this.page.main.on("click", ".edit-html", function() { | |||||
var parent = $(this).parents(".print-format-builder-field:first"), | |||||
$content = parent.find(".html-content"); | |||||
var d = new frappe.ui.Dialog({ | |||||
title: __("Edit Custom HTML"), | |||||
fields: [ | |||||
{ | |||||
fieldname: "content", | |||||
fieldtype: "Text Editor", | |||||
label: "Custom HTML" | |||||
} | |||||
] | |||||
}); | |||||
var content = $content.html(); | |||||
if(content.indexOf("data-no-content")!==-1) content = ""; | |||||
d.set_input("content", content); | |||||
d.set_primary_action(__("Update"), function() { | |||||
$content.html(d.get_value("content")); | |||||
d.hide(); | d.hide(); | ||||
}); | }); | ||||
d.show(); | d.show(); | ||||
return false; | |||||
}); | |||||
}, | |||||
save_print_format: function() { | |||||
var data = [], | |||||
me = this; | |||||
this.page.main.find(".print-format-builder-section").each(function() { | |||||
data.push({"fieldtype": "Section Break"}); | |||||
$(this).find(".print-format-builder-column").each(function() { | |||||
data.push({"fieldtype": "Column Break"}); | |||||
$(this).find(".print-format-builder-field").each(function() { | |||||
var $this = $(this), | |||||
fieldtype = $this.attr("data-fieldtype"), | |||||
df = { | |||||
fieldname: $this.attr("data-fieldname") | |||||
}; | |||||
if(fieldtype==="Table") { | |||||
// append the user selected columns to visible_columns | |||||
var columns = $this.attr("data-columns").split(","); | |||||
df.visible_columns = []; | |||||
$.each(columns, function(i, c) { | |||||
var parts = c.split("|"); | |||||
df.visible_columns.push({fieldname:parts[0], | |||||
width:parts[1]}); | |||||
}); | |||||
} | |||||
if(fieldtype==="Custom HTML") { | |||||
// custom html as HTML field | |||||
df.fieldtype = "HTML"; | |||||
df.options = $this.find(".html-content").html(); | |||||
} | |||||
data.push(df); | |||||
}); | |||||
}); | |||||
}); | }); | ||||
this.frm.doc.format_data = JSON.stringify(data); | |||||
setTimeout(function() { me.frm.save(); }, 100); | |||||
} | } | ||||
}); | }); | ||||
frappe.PrintFormatField = Class.extend({ | |||||
init: function() { } | |||||
}); |
@@ -1,14 +1,31 @@ | |||||
<p class="text-muted">{%= __("Check columns to select, drag to set order.") %}</p> | |||||
<p class="text-muted">{%= __("Check columns to select, drag to set order.") %} | |||||
<br>{%= __("Widths can be set in px or %.") %}</p> | |||||
<div class="row"> | |||||
<div class="col-sm-6"><h4>{%= __("Column") %}</h4></div> | |||||
<div class="col-sm-6 text-right"><h4>{%= __("Width") %}</h4></div> | |||||
</div> | |||||
<div class="column-selector-list"> | <div class="column-selector-list"> | ||||
{% for (i=0; i < fields.length; i++) { var f = fields[i]; %} | {% for (i=0; i < fields.length; i++) { var f = fields[i]; %} | ||||
{% if(!in_list(["Section Break", "Column Break"]) && f.label) { %} | |||||
<div class="checkbox"> | |||||
<label> | |||||
<input type="checkbox" | |||||
{% if(!in_list(["Section Break", "Column Break"]) && f.label) { | |||||
var selected = in_list(column_names, f.fieldname) %} | |||||
<div class="row column-selector-row"> | |||||
<div class="col-sm-6"> | |||||
<div class="checkbox"> | |||||
<label> | |||||
<input type="checkbox" | |||||
data-fieldname="{%= f.fieldname %}" | |||||
{%= selected ? "checked" : "" %}> | |||||
{%= f.label %} | |||||
</label> | |||||
</div> | |||||
</div> | |||||
<div class="col-sm-6 text-right"> | |||||
<input class="form-control column-width input-sm text-right" | |||||
value="{%= widths[f.fieldname] || "" %}" | |||||
data-fieldname="{%= f.fieldname %}" | data-fieldname="{%= f.fieldname %}" | ||||
{% if(in_list(columns, f.fieldname)) { %}checked{% } %}> | |||||
{%= f.label %} | |||||
</label> | |||||
style="width: 100px; display: inline" | |||||
{%= selected ? "" : "disabled" %}> | |||||
</div> | |||||
</div> | </div> | ||||
{% } %} | {% } %} | ||||
{% } %} | {% } %} | ||||
@@ -1,13 +1,23 @@ | |||||
<div class="print-format-builder-field" | <div class="print-format-builder-field" | ||||
data-fieldname="{%= field.fieldname %}" | data-fieldname="{%= field.fieldname %}" | ||||
data-label="{%= field.label %}" | data-label="{%= field.label %}" | ||||
data-fieldtype="{%= field.fieldtype %}" | |||||
{% if(field.fieldtype==="Table") { %} | {% if(field.fieldtype==="Table") { %} | ||||
data-columns="{%= me.visible_columns[field.options].join(",") %}" | |||||
data-columns="{%= me.get_visible_columns_string(field) %}" | |||||
data-doctype="{%= field.options %}" | data-doctype="{%= field.options %}" | ||||
{% } %}> | {% } %}> | ||||
<span>{%= field.label %}</span> | |||||
{% if(field.fieldtype==="Table") { %} | |||||
<span> ({%= __("Table") %})</span> | |||||
<a class="pull-right select-columns btn btn-default btn-xs">Select Columns</a> | |||||
{% if(field.fieldtype==="Custom HTML") { %} | |||||
<div class="text-right"> | |||||
<a class="edit-html btn btn-default btn-xs"> | |||||
{%= __("Edit HTML") %}</a> | |||||
</div> | |||||
<div class="html-content">{%= field.options || me.get_no_content() %}</div> | |||||
{% } else { %} | |||||
<span>{%= field.label %}</span> | |||||
{% if(field.fieldtype==="Table") { %} | |||||
<span> ({%= __("Table") %})</span> | |||||
<a class="pull-right select-columns btn btn-default btn-xs"> | |||||
{%= __("Select Columns") %}</a> | |||||
{% } %} | |||||
{% } %} | {% } %} | ||||
</div> | </div> |
@@ -1,7 +1,8 @@ | |||||
<div class="print-format-builder-section row light-bg"> | <div class="print-format-builder-section row light-bg"> | ||||
<div class="print-format-builder-section-head"> | <div class="print-format-builder-section-head"> | ||||
<a class="section-settings pull-right | <a class="section-settings pull-right | ||||
btn-default btn-xs">Settings</a> | |||||
btn-default btn-xs"> | |||||
<span class="octicon octicon-gear text-muted"></span></a> | |||||
<span class="octicon octicon-three-bars drag-handle"></span> | <span class="octicon octicon-three-bars drag-handle"></span> | ||||
</div> | </div> | ||||
{% for(var j=0; j < section.columns.length; j++) { | {% for(var j=0; j < section.columns.length; j++) { | ||||
@@ -1,4 +1,4 @@ | |||||
<div class="panel-bg" style="padding: 10px; margin-right: -30px;"> | |||||
<div class="panel-bg" style="padding: 10px; margin-right: -15px; margin-bottom: 10px;"> | |||||
<input type="text" class="form-control input-sm filter-fields" name="filter-fields" | <input type="text" class="form-control input-sm filter-fields" name="filter-fields" | ||||
placeholder="{%= __("Filter...") %}"> | placeholder="{%= __("Filter...") %}"> | ||||
</div> | </div> | ||||
@@ -7,7 +7,8 @@ | |||||
{% if(!in_list(["Section Break", "Column Break", "Fold"], f.fieldtype)) { %} | {% if(!in_list(["Section Break", "Column Break", "Fold"], f.fieldtype)) { %} | ||||
<div class="print-format-builder-field-placeholder text-ellipsis" | <div class="print-format-builder-field-placeholder text-ellipsis" | ||||
data-fieldname="{%= f.fieldname %}"> | data-fieldname="{%= f.fieldname %}"> | ||||
<span class="label label-default" | |||||
<span class="btn btn-xs | |||||
{%= (f.fieldtype==="Custom HTML") ? "btn-info" : "btn-default" %}" | |||||
style="cursor: grab; display: inline-block"> | style="cursor: grab; display: inline-block"> | ||||
{%= f.label %} | {%= f.label %} | ||||
</span> | </span> | ||||
@@ -303,10 +303,15 @@ frappe.ui.form.ControlData = frappe.ui.form.ControlInput.extend({ | |||||
.attr("data-fieldtype", this.df.fieldtype) | .attr("data-fieldtype", this.df.fieldtype) | ||||
.attr("data-fieldname", this.df.fieldname) | .attr("data-fieldname", this.df.fieldname) | ||||
.attr("placeholder", this.df.placeholder || "") | .attr("placeholder", this.df.placeholder || "") | ||||
if(this.doctype) | |||||
if(this.doctype) { | |||||
this.$input.attr("data-doctype", this.doctype); | this.$input.attr("data-doctype", this.doctype); | ||||
if(this.df.input_css) | |||||
} | |||||
if(this.df.input_css) { | |||||
this.$input.css(this.df.input_css); | this.$input.css(this.df.input_css); | ||||
} | |||||
if(this.df.input_class) { | |||||
this.$input.addClass(this.df.input_class); | |||||
} | |||||
}, | }, | ||||
set_input: function(val) { | set_input: function(val) { | ||||
this.$input && this.$input.val(this.format_for_input(val)); | this.$input && this.$input.val(this.format_for_input(val)); | ||||
@@ -44,7 +44,7 @@ frappe.ui.form.LinkedWith = Class.extend({ | |||||
return; | return; | ||||
} | } | ||||
this.dialog.onshow = function() { | |||||
this.dialog.on_page_show = function() { | |||||
me.dialog.fields_dict.list.$wrapper.html('<div class="text-muted text-center">' | me.dialog.fields_dict.list.$wrapper.html('<div class="text-muted text-center">' | ||||
+ __("Loading") + '...</div>'); | + __("Loading") + '...</div>'); | ||||
@@ -243,11 +243,13 @@ $.extend(frappe.model, { | |||||
if(doc && doc[fieldname] !== value) { | if(doc && doc[fieldname] !== value) { | ||||
doc[fieldname] = value; | doc[fieldname] = value; | ||||
frappe.model.trigger(fieldname, value, doc); | frappe.model.trigger(fieldname, value, doc); | ||||
setTimeout(function() { console.log(doc[fieldname]) }, 100); | |||||
return true; | return true; | ||||
} else { | } else { | ||||
// execute link triggers (want to reselect to execute triggers) | // execute link triggers (want to reselect to execute triggers) | ||||
if(fieldtype=="Link") | |||||
if(fieldtype=="Link") { | |||||
frappe.model.trigger(fieldname, value, doc); | frappe.model.trigger(fieldname, value, doc); | ||||
} | |||||
} | } | ||||
}, | }, | ||||
@@ -56,16 +56,20 @@ frappe.ui.Dialog = frappe.ui.FieldGroup.extend({ | |||||
console.log("Dialog: unable to focus on first input: " + e); | console.log("Dialog: unable to focus on first input: " + e); | ||||
} | } | ||||
} | } | ||||
me.onshow && me.onshow(); | |||||
me.on_page_show && me.on_page_show(); | |||||
}) | }) | ||||
}, | }, | ||||
get_primary_btn: function() { | get_primary_btn: function() { | ||||
return this.$wrapper.find(".modal-header .btn-primary").removeClass("hide"); | |||||
return this.$wrapper.find(".modal-header .btn-primary"); | |||||
}, | }, | ||||
set_primary_action: function(label, click) { | set_primary_action: function(label, click) { | ||||
return this.get_primary_btn().html(label).click(click); | |||||
this.has_primary_action = true; | |||||
return this.get_primary_btn() | |||||
.removeClass("hide") | |||||
.html(label) | |||||
.click(click); | |||||
}, | }, | ||||
make_head: function() { | make_head: function() { | ||||
var me = this; | var me = this; | ||||
@@ -19,11 +19,10 @@ frappe.ui.FieldGroup = frappe.ui.form.Layout.extend({ | |||||
this.refresh(); | this.refresh(); | ||||
// set default | // set default | ||||
$.each(this.fields_list, function(i, f) { | $.each(this.fields_list, function(i, f) { | ||||
if(f.df["default"]) f.set_input(f.df["default"]); | |||||
if(f.df["default"]) | |||||
f.set_input(f.df["default"]); | |||||
}) | }) | ||||
if(!this.no_submit_on_enter) { | if(!this.no_submit_on_enter) { | ||||
$(this.body).find("[data-fieldtype='Button']").filter(":first") | |||||
.removeClass("btn-default").addClass("btn-primary"); | |||||
this.catch_enter_as_submit(); | this.catch_enter_as_submit(); | ||||
} | } | ||||
} | } | ||||
@@ -33,8 +32,10 @@ frappe.ui.FieldGroup = frappe.ui.form.Layout.extend({ | |||||
var me = this; | var me = this; | ||||
$(this.body).find('input[type="text"], input[type="password"]').keypress(function(e) { | $(this.body).find('input[type="text"], input[type="password"]').keypress(function(e) { | ||||
if(e.which==13) { | if(e.which==13) { | ||||
e.preventDefault(); | |||||
$(me.body).find('.btn-primary:first').click(); | |||||
if(this.has_primary_action) { | |||||
e.preventDefault(); | |||||
this.get_primary_btn().trigger("click"); | |||||
} | |||||
} | } | ||||
}); | }); | ||||
}, | }, | ||||
@@ -108,6 +108,7 @@ frappe.ui.Page = Class.extend({ | |||||
label = this.get_icon_label(icon, label); | label = this.get_icon_label(icon, label); | ||||
} | } | ||||
this.clear_primary_action(); | |||||
this.btn_primary.removeClass("hide").prop("disabled", false).html(label).on("click", click); | this.btn_primary.removeClass("hide").prop("disabled", false).html(label).on("click", click); | ||||
}, | }, | ||||
@@ -120,7 +121,7 @@ frappe.ui.Page = Class.extend({ | |||||
}, | }, | ||||
clear_primary_action: function() { | clear_primary_action: function() { | ||||
this.btn_primary.addClass("hide"); | |||||
this.btn_primary.addClass("hide").unbind("click"); | |||||
}, | }, | ||||
clear_actions: function() { | clear_actions: function() { | ||||
@@ -18,7 +18,7 @@ frappe.ui.misc.about = function() { | |||||
frappe.ui.misc.about_dialog = d; | frappe.ui.misc.about_dialog = d; | ||||
frappe.ui.misc.about_dialog.onshow = function() { | |||||
frappe.ui.misc.about_dialog.on_page_show = function() { | |||||
if(!frappe.versions) { | if(!frappe.versions) { | ||||
frappe.call({ | frappe.call({ | ||||
method: "frappe.get_versions", | method: "frappe.get_versions", | ||||
@@ -148,7 +148,7 @@ frappe.views.CommunicationComposer = Class.extend({ | |||||
} | } | ||||
} | } | ||||
this.dialog.onshow = function() { | |||||
this.dialog.on_page_show = function() { | |||||
if (cur_frm && cur_frm.docname && !me.txt && | if (cur_frm && cur_frm.docname && !me.txt && | ||||
(frappe.last_edited_communication[cur_frm.doctype] || {})[cur_frm.docname]) { | (frappe.last_edited_communication[cur_frm.doctype] || {})[cur_frm.docname]) { | ||||
@@ -20,16 +20,12 @@ frappe.views.Container = Class.extend({ | |||||
$("body").attr("data-route", frappe.get_route_str()); | $("body").attr("data-route", frappe.get_route_str()); | ||||
}); | }); | ||||
}, | }, | ||||
add_page: function(label, onshow, onhide) { | |||||
add_page: function(label) { | |||||
var page = $('<div class="content page-container"></div>') | var page = $('<div class="content page-container"></div>') | ||||
.attr('id', "page-" + label) | .attr('id', "page-" + label) | ||||
.attr("data-page-route", label) | .attr("data-page-route", label) | ||||
.toggle(false) | .toggle(false) | ||||
.appendTo(this.container).get(0); | .appendTo(this.container).get(0); | ||||
if(onshow) | |||||
$(page).bind('show', onshow); | |||||
if(onshow) | |||||
$(page).bind('hide', onhide); | |||||
page.label = label; | page.label = label; | ||||
frappe.pages[label] = page; | frappe.pages[label] = page; | ||||
@@ -78,20 +78,18 @@ frappe.views.Page = Class.extend({ | |||||
frappe.dom.set_style(this.pagedoc.style || ''); | frappe.dom.set_style(this.pagedoc.style || ''); | ||||
} | } | ||||
this.trigger('onload'); | |||||
this.trigger_page_event('on_page_load'); | |||||
// set events | // set events | ||||
$(this.wrapper).bind('show', function() { | |||||
$(this.wrapper).on('show', function() { | |||||
cur_frm = null; | cur_frm = null; | ||||
me.trigger('onshow'); | |||||
me.trigger('refresh'); | |||||
me.trigger_page_event('on_page_show'); | |||||
me.trigger_page_event('refresh'); | |||||
}); | }); | ||||
}, | }, | ||||
trigger: function(eventname) { | |||||
trigger_page_event: function(eventname) { | |||||
var me = this; | var me = this; | ||||
if(pscript[eventname+'_'+this.name]) { | |||||
pscript[eventname+'_'+this.name](me.wrapper); | |||||
} else if(me.wrapper[eventname]) { | |||||
if(me.wrapper[eventname]) { | |||||
me.wrapper[eventname](me.wrapper); | me.wrapper[eventname](me.wrapper); | ||||
} | } | ||||
} | } | ||||
@@ -207,6 +207,9 @@ _f.Frm.prototype.set_value = function(field, value, if_missing) { | |||||
frappe.model.set_value(me.doctype, me.doc.name, f, v); | frappe.model.set_value(me.doctype, me.doc.name, f, v); | ||||
} | } | ||||
} | } | ||||
} else { | |||||
msgprint("Field " + f + " not found."); | |||||
throw "frm.set_value"; | |||||
} | } | ||||
} | } | ||||
@@ -7,10 +7,6 @@ frappe.provide('frappe.utils'); | |||||
frappe.provide('frappe.model'); | frappe.provide('frappe.model'); | ||||
frappe.provide('frappe.user'); | frappe.provide('frappe.user'); | ||||
frappe.provide('frappe.session'); | frappe.provide('frappe.session'); | ||||
frappe.provide('_f'); | |||||
frappe.provide('_p'); | |||||
frappe.provide('_r'); | |||||
frappe.provide('_startup_data') | |||||
frappe.provide('locals') | frappe.provide('locals') | ||||
frappe.provide('locals.DocType') | frappe.provide('locals.DocType') | ||||
@@ -29,8 +25,6 @@ var user_fullname=null; | |||||
var user_email=null; | var user_email=null; | ||||
var user_img = {}; | var user_img = {}; | ||||
var pscript = {}; | |||||
// Name Spaces | // Name Spaces | ||||
// ============ | // ============ | ||||
@@ -43,4 +37,3 @@ var FILTER_SEP = '\1'; | |||||
// API globals | // API globals | ||||
var frms={}; | var frms={}; | ||||
var cur_frm=null; | var cur_frm=null; | ||||
var pscript = {}; |
@@ -32,7 +32,6 @@ function new_doc(doctype, in_form) { | |||||
} | } | ||||
var newdoc = new_doc; | var newdoc = new_doc; | ||||
var pscript={}; | |||||
function loadpage(page_name, call_back, no_history) { | function loadpage(page_name, call_back, no_history) { | ||||
frappe.set_route(page_name); | frappe.set_route(page_name); | ||||
} | } | ||||
@@ -84,7 +84,7 @@ $.extend(_p, { | |||||
); | ); | ||||
}); | }); | ||||
dialog.onshow = function() { | |||||
dialog.on_page_show = function() { | |||||
var $print = dialog.fields_dict.print_format.$input; | var $print = dialog.fields_dict.print_format.$input; | ||||
$print.empty().add_options(cur_frm.print_preview.print_formats); | $print.empty().add_options(cur_frm.print_preview.print_formats); | ||||