@@ -0,0 +1,9 @@ | |||
frappe/public/js/lib/* | |||
frappe/public/js/frappe/misc/tests/* | |||
frappe/public/js/frappe/views/test_runner.js | |||
frappe/core/doctype/doctype/boilerplate/* | |||
frappe/core/doctype/report/boilerplate/* | |||
frappe/public/js/frappe/class.js | |||
frappe/templates/includes/* | |||
frappe/tests/testcafe/* | |||
frappe/www/website_script.js |
@@ -0,0 +1,119 @@ | |||
{ | |||
"env": { | |||
"browser": true, | |||
"node": true, | |||
"es6": true | |||
}, | |||
"extends": "eslint:recommended", | |||
"rules": { | |||
"indent": [ | |||
"error", | |||
"tab", | |||
{ "SwitchCase": 1 } | |||
], | |||
"linebreak-style": [ | |||
"error", | |||
"unix" | |||
], | |||
"quotes": [ | |||
"off" | |||
], | |||
"semi": [ | |||
"warn", | |||
"always" | |||
], | |||
"no-unused-vars": [ | |||
"warn" | |||
], | |||
"no-redeclare": [ | |||
"warn" | |||
], | |||
"no-console": [ | |||
"warn" | |||
], | |||
"no-extra-boolean-cast": [ | |||
"off" | |||
], | |||
"no-control-regex": [ | |||
"off" | |||
] | |||
}, | |||
"root": true, | |||
"globals": { | |||
"frappe": true, | |||
"$": true, | |||
"jQuery": true, | |||
"moment": true, | |||
"hljs": true, | |||
"Awesomplete": true, | |||
"CalHeatMap": true, | |||
"Sortable": true, | |||
"Showdown": true, | |||
"Taggle": true, | |||
"Gantt": true, | |||
"Slick": true, | |||
"PhotoSwipe": true, | |||
"PhotoSwipeUI_Default": true, | |||
"fluxify": true, | |||
"io": true, | |||
"c3": true, | |||
"__": true, | |||
"_p": true, | |||
"_f": true, | |||
"repl": true, | |||
"Class": true, | |||
"locals": true, | |||
"cint": true, | |||
"cstr": true, | |||
"cur_frm": true, | |||
"cur_dialog": true, | |||
"cur_page": true, | |||
"cur_list": true, | |||
"cur_tree": true, | |||
"msg_dialog": true, | |||
"is_null": true, | |||
"in_list": true, | |||
"has_common": true, | |||
"has_words": true, | |||
"validate_email": true, | |||
"get_number_format": true, | |||
"format_number": true, | |||
"format_currency": true, | |||
"comment_when": true, | |||
"replace_newlines": true, | |||
"open_url_post": true, | |||
"toTitle": true, | |||
"lstrip": true, | |||
"strip": true, | |||
"strip_html": true, | |||
"replace_all": true, | |||
"flt": true, | |||
"precision": true, | |||
"md5": true, | |||
"CREATE": true, | |||
"AMEND": true, | |||
"CANCEL": true, | |||
"copy_dict": true, | |||
"get_number_format_info": true, | |||
"print_table": true, | |||
"Layout": true, | |||
"web_form_settings": true, | |||
"$c": true, | |||
"$a": true, | |||
"$i": true, | |||
"$bg": true, | |||
"$y": true, | |||
"$c_obj": true, | |||
"refresh_many": true, | |||
"refresh_field": true, | |||
"toggle_field": true, | |||
"get_field_obj": true, | |||
"get_query_params": true, | |||
"unhide_field": true, | |||
"hide_field": true, | |||
"set_field_options": true, | |||
"getCookie": true, | |||
"getCookies": true, | |||
"get_url_arg": true | |||
} | |||
} |
@@ -25,7 +25,7 @@ const action = process.argv[2] || '--build'; | |||
if (['--build', '--watch'].indexOf(action) === -1) { | |||
console.log('Invalid argument: ', action); | |||
return; | |||
process.exit(); | |||
} | |||
if (action === '--build') { | |||
@@ -33,7 +33,7 @@ frappe.ui.form.on("Communication", { | |||
if(frm.doc.communication_type == "Feedback") { | |||
frm.add_custom_button(__("Resend"), function() { | |||
feedback = new frappe.utils.Feedback(); | |||
var feedback = new frappe.utils.Feedback(); | |||
feedback.resend_feedback_request(frm.doc); | |||
}); | |||
} | |||
@@ -111,7 +111,7 @@ frappe.ui.form.on("Communication", { | |||
d.set_value("reference_doctype", frm.doc.reference_doctype); | |||
d.set_value("reference_name", frm.doc.reference_name); | |||
d.set_primary_action(__("Relink"), function () { | |||
values = d.get_values(); | |||
var values = d.get_values(); | |||
if (values) { | |||
frappe.confirm( | |||
__('Are you sure you want to relink this communication to {0}?', [values["reference_name"]]), | |||
@@ -130,7 +130,7 @@ frappe.ui.form.on("Communication", { | |||
}); | |||
}, | |||
function () { | |||
show_alert('Document not Relinked') | |||
frappe.show_alert('Document not Relinked') | |||
} | |||
); | |||
} | |||
@@ -139,8 +139,8 @@ frappe.ui.form.on("Communication", { | |||
}, | |||
mark_as_read_unread: function(frm) { | |||
action = frm.doc.seen? "Unread": "Read"; | |||
flag = "(\\SEEN)"; | |||
var action = frm.doc.seen? "Unread": "Read"; | |||
var flag = "(\\SEEN)"; | |||
return frappe.call({ | |||
method: "frappe.email.inbox.create_email_flag_queue", | |||
@@ -154,7 +154,7 @@ frappe.ui.form.on("Communication", { | |||
}, | |||
reply: function(frm) { | |||
args = frm.events.get_mail_args(frm); | |||
var args = frm.events.get_mail_args(frm); | |||
$.extend(args, { | |||
subject: __("Re: {0}", [frm.doc.subject]), | |||
recipients: frm.doc.sender | |||
@@ -164,7 +164,7 @@ frappe.ui.form.on("Communication", { | |||
}, | |||
reply_all: function(frm) { | |||
args = frm.events.get_mail_args(frm) | |||
var args = frm.events.get_mail_args(frm) | |||
$.extend(args, { | |||
subject: __("Re: {0}", [frm.doc.subject]), | |||
recipients: frm.doc.sender, | |||
@@ -174,7 +174,7 @@ frappe.ui.form.on("Communication", { | |||
}, | |||
forward_mail: function(frm) { | |||
args = frm.events.get_mail_args(frm) | |||
var args = frm.events.get_mail_args(frm) | |||
$.extend(args, { | |||
forward: true, | |||
subject: __("Fw: {0}", [frm.doc.subject]), | |||
@@ -184,7 +184,7 @@ frappe.ui.form.on("Communication", { | |||
}, | |||
get_mail_args: function(frm) { | |||
sender_email_id = "" | |||
var sender_email_id = "" | |||
$.each(frappe.boot.email_accounts, function(idx, account) { | |||
if(account.email_account == frm.doc.email_account) { | |||
sender_email_id = account.email_id | |||
@@ -202,11 +202,11 @@ frappe.ui.form.on("Communication", { | |||
add_to_contact: function(frm) { | |||
var me = this; | |||
fullname = frm.doc.sender_full_name || "" | |||
var fullname = frm.doc.sender_full_name || "" | |||
names = fullname.split(" ") | |||
first_name = names[0] | |||
last_name = names.length >= 2? names[names.length - 1]: "" | |||
var names = fullname.split(" ") | |||
var first_name = names[0] | |||
var last_name = names.length >= 2? names[names.length - 1]: "" | |||
frappe.route_options = { | |||
"email_id": frm.doc.sender, | |||
@@ -9,7 +9,7 @@ frappe.listview_settings['Communication'] = { | |||
filters: [["status", "=", "Open"]], | |||
onload: function(list_view) { | |||
method = "frappe.email.inbox.create_email_flag_queue" | |||
var method = "frappe.email.inbox.create_email_flag_queue" | |||
list_view.page.add_menu_item(__("Mark as Read"), function() { | |||
list_view.call_for_selected_items(method, { action: "Read" }) | |||
@@ -1,3 +1,4 @@ | |||
/* eslint-disable */ | |||
frappe.listview_settings['{doctype}'] = {{ | |||
add_fields: ["status"], | |||
filters:[["status","=", "Open"]] | |||
@@ -13,7 +13,7 @@ | |||
frappe.ui.form.on('DocType', { | |||
refresh: function(frm) { | |||
if(frm.is_new() && (user !== "Administrator" || !frappe.boot.developer_mode)) { | |||
if(frm.is_new() && (frappe.session.user !== "Administrator" || !frappe.boot.developer_mode)) { | |||
frm.set_value("custom", 1); | |||
frm.toggle_enable("custom", 0); | |||
} | |||
@@ -1,9 +1,9 @@ | |||
frappe.listview_settings['Error Log'] = { | |||
add_fields: ["seen"], | |||
get_indicator: function(doc) { | |||
if(cint(doc.seen)) { | |||
if(cint(doc.seen)) { | |||
return [__("Seen"), "green", "seen,=,1"]; | |||
} else { | |||
} else { | |||
return [__("Not Seen"), "red", "seen,=,0"]; | |||
} | |||
}, | |||
@@ -1,9 +1,9 @@ | |||
frappe.ui.form.on("Error Snapshot", "load", function(frm){ | |||
frm.set_read_only(true); | |||
frm.set_read_only(true); | |||
}); | |||
frappe.ui.form.on("Error Snapshot", "refresh", function(frm){ | |||
frm.set_df_property("view", "options", frappe.render_template("error_snapshot", {"doc": frm.doc})); | |||
frm.set_df_property("view", "options", frappe.render_template("error_snapshot", {"doc": frm.doc})); | |||
if (frm.doc.relapses) { | |||
frm.add_custom_button(__('Show Relapses'), function() { | |||
@@ -1,14 +1,14 @@ | |||
frappe.listview_settings["Error Snapshot"] = { | |||
add_fields: ["parent_error_snapshot", "relapses", "seen"], | |||
filters:[ | |||
["parent_error_snapshot","=",null], | |||
["seen", "=", false] | |||
], | |||
get_indicator: function(doc){ | |||
if (doc.parent_error_snapshot && doc.parent_error_snapshot.length){ | |||
return [__("Relapsed"), !doc.seen ? "orange" : "blue", "parent_error_snapshot,!=,"]; | |||
} else { | |||
return [__("First Level"), !doc.seen ? "red" : "green", "parent_error_snapshot,=,"]; | |||
} | |||
} | |||
add_fields: ["parent_error_snapshot", "relapses", "seen"], | |||
filters:[ | |||
["parent_error_snapshot","=",null], | |||
["seen", "=", false] | |||
], | |||
get_indicator: function(doc){ | |||
if (doc.parent_error_snapshot && doc.parent_error_snapshot.length){ | |||
return [__("Relapsed"), !doc.seen ? "orange" : "blue", "parent_error_snapshot,!=,"]; | |||
} else { | |||
return [__("First Level"), !doc.seen ? "red" : "green", "parent_error_snapshot,=,"]; | |||
} | |||
} | |||
} |
@@ -3,7 +3,7 @@ | |||
frappe.ui.form.on('Feedback Request', { | |||
refresh: function(frm) { | |||
rating_icons = frappe.render_template("rating_icons", {rating: frm.doc.rating, show_label: false}); | |||
var rating_icons = frappe.render_template("rating_icons", {rating: frm.doc.rating, show_label: false}); | |||
$(frm.fields_dict.feedback_rating.wrapper).html(rating_icons); | |||
if(frm.doc.reference_doctype && frm.doc.reference_name) { | |||
@@ -4,13 +4,13 @@ frappe.listview_settings['Feedback Request'] = { | |||
}, | |||
column_render: { | |||
rating: function(doc) { | |||
html = "" | |||
var html = "" | |||
for (var i = 0; i < 5; i++) { | |||
html += repl("<span class='indicator %(color)s'></span>", | |||
{color: i<doc.rating? "blue": "darkgrey"}) | |||
} | |||
return html | |||
return html; | |||
} | |||
} | |||
} |
@@ -37,7 +37,7 @@ frappe.ui.form.on('Feedback Trigger', { | |||
frappe.model.with_doctype(frm.doc.document_type, function() { | |||
var fields = frappe.get_doc("DocType", frm.doc.document_type).fields; | |||
$.each(fields, function(idx, field) { | |||
if(!inList(frappe.model.no_value_type, field.fieldtype) && field.options == "Email") { | |||
if(!in_list(frappe.model.no_value_type, field.fieldtype) && field.options == "Email") { | |||
frm.options.push(field.label); | |||
frm.fieldname_mapper[field.label] = field.fieldname; | |||
} | |||
@@ -42,12 +42,12 @@ frappe.listview_settings['File'] = { | |||
doclist.list_renderer.settings.setup_dragdrop(doclist); | |||
doclist.$page.on("click", ".list-row-checkbox", function(event) { | |||
doclist.list_renderer.settings.add_menu_item_copy(doclist); | |||
doclist.list_renderer.settings.add_menu_item_copy(doclist); | |||
}) | |||
}, | |||
list_view_doc:function(doclist){ | |||
$(doclist.wrapper).on("click", 'button[list_view_doc="'+doclist.doctype+'"]', function(){ | |||
dialog = frappe.ui.get_upload_dialog({ | |||
$(doclist.wrapper).on("click", 'button[list_view_doc="'+doclist.doctype+'"]', function() { | |||
frappe.ui.get_upload_dialog({ | |||
"args": { | |||
"folder": doclist.current_folder, | |||
"from_form": 1 | |||
@@ -83,7 +83,7 @@ frappe.listview_settings['File'] = { | |||
doclist.page.add_menu_item(__("Import .zip"), function() { | |||
// make upload dialog | |||
dialog = frappe.ui.get_upload_dialog({ | |||
frappe.ui.get_upload_dialog({ | |||
args: { | |||
folder: doclist.current_folder, | |||
from_form: 1 | |||
@@ -197,7 +197,7 @@ frappe.listview_settings['File'] = { | |||
set_primary_action:function(doclist){ | |||
doclist.page.clear_primary_action(); | |||
doclist.page.set_primary_action(__("New"), function() { | |||
dialog = frappe.ui.get_upload_dialog({ | |||
frappe.ui.get_upload_dialog({ | |||
"args": { | |||
"folder": doclist.current_folder, | |||
"from_form": 1 | |||
@@ -1,5 +1,6 @@ | |||
// Copyright (c) 2016, {app_publisher} and contributors | |||
// For license information, please see license.txt | |||
/* eslint-disable */ | |||
frappe.query_reports["{name}"] = {{ | |||
"filters": [ | |||
@@ -39,8 +39,8 @@ frappe.ui.form.on('Role Permission for Page and Report', { | |||
}, | |||
clear_fields: function(frm) { | |||
field = (frm.doc.set_role_for == 'Report') ? 'page' : 'report'; | |||
frm.set_value(field, '') | |||
var field = (frm.doc.set_role_for == 'Report') ? 'page' : 'report'; | |||
frm.set_value(field, ''); | |||
}, | |||
page: function(frm) { | |||
@@ -7,16 +7,16 @@ frappe.ui.form.on("System Settings", "refresh", function(frm) { | |||
$.each(data.message.defaults, function(key, val) { | |||
frm.set_value(key, val); | |||
sys_defaults[key] = val; | |||
frappe.sys_defaults[key] = val; | |||
}) | |||
} | |||
}); | |||
}); | |||
frappe.ui.form.on("System Settings", "enable_password_policy", function(frm) { | |||
if(frm.doc.enable_password_policy == 0){ | |||
frm.set_value("minimum_password_score", ""); | |||
}else{ | |||
frm.set_value("minimum_password_score", "2"); | |||
} | |||
if(frm.doc.enable_password_policy == 0){ | |||
frm.set_value("minimum_password_score", ""); | |||
} else { | |||
frm.set_value("minimum_password_score", "2"); | |||
} | |||
}); |
@@ -18,7 +18,7 @@ frappe.ui.form.on('User', { | |||
}, | |||
onload: function(frm) { | |||
if(has_common(roles, ["Administrator", "System Manager"]) && !frm.doc.__islocal) { | |||
if(has_common(frappe.user_roles, ["Administrator", "System Manager"]) && !frm.doc.__islocal) { | |||
if(!frm.roles_editor) { | |||
var role_area = $('<div style="min-height: 300px">') | |||
.appendTo(frm.fields_dict.roles_html.wrapper); | |||
@@ -35,11 +35,11 @@ frappe.ui.form.on('User', { | |||
refresh: function(frm) { | |||
var doc = frm.doc; | |||
if(doc.name===user && !doc.__unsaved | |||
if(doc.name===frappe.session.user && !doc.__unsaved | |||
&& frappe.all_timezones | |||
&& (doc.language || frappe.boot.user.language) | |||
&& doc.language !== frappe.boot.user.language) { | |||
msgprint(__("Refreshing...")); | |||
frappe.msgprint(__("Refreshing...")); | |||
window.location.reload(); | |||
} | |||
@@ -53,7 +53,7 @@ frappe.ui.form.on('User', { | |||
frappe.set_route("modules_setup"); | |||
}, null, "btn-default") | |||
if(has_common(roles, ["Administrator", "System Manager"])) { | |||
if(has_common(frappe.user_roles, ["Administrator", "System Manager"])) { | |||
frm.add_custom_button(__("Set User Permissions"), function() { | |||
frappe.route_options = { | |||
@@ -79,10 +79,10 @@ frappe.ui.form.on('User', { | |||
frm.roles_editor && frm.roles_editor.show(); | |||
frm.module_editor && frm.module_editor.refresh(); | |||
if(user==doc.name) { | |||
if(frappe.session.user==doc.name) { | |||
// update display settings | |||
if(doc.user_image) { | |||
frappe.boot.user_info[user].image = frappe.utils.get_file_link(doc.user_image); | |||
frappe.boot.user_info[frappe.session.user].image = frappe.utils.get_file_link(doc.user_image); | |||
} | |||
} | |||
} | |||
@@ -102,11 +102,10 @@ frappe.ui.form.on('User', { | |||
if (frappe.route_flags.unsaved===1){ | |||
delete frappe.route_flags.unsaved; | |||
for ( var i=0;i<frm.doc.user_emails.length;i++){ | |||
for ( var i=0;i<frm.doc.user_emails.length;i++) { | |||
frm.doc.user_emails[i].idx=frm.doc.user_emails[i].idx+1; | |||
} | |||
frm.doc.email_account | |||
cur_frm.dirty(); | |||
cur_frm.dirty(); | |||
} | |||
}, | |||
validate: function(frm) { | |||
@@ -116,12 +115,12 @@ frappe.ui.form.on('User', { | |||
}, | |||
enabled: function(frm) { | |||
var doc = frm.doc; | |||
if(!doc.__islocal && has_common(roles, ["Administrator", "System Manager"])) { | |||
if(!doc.__islocal && has_common(frappe.user_roles, ["Administrator", "System Manager"])) { | |||
frm.toggle_display(['sb1', 'sb3', 'modules_access'], doc.enabled); | |||
frm.set_df_property('enabled', 'read_only', 0); | |||
} | |||
if(user!="Administrator") { | |||
if(frappe.session.user!=="Administrator") { | |||
frm.toggle_enable('email', doc.__islocal); | |||
} | |||
}, | |||
@@ -177,6 +176,7 @@ frappe.ModuleEditor = Class.extend({ | |||
}); | |||
}, | |||
bind: function() { | |||
var me = this; | |||
this.wrapper.on("change", ".block-module-check", function() { | |||
var module = $(this).attr('data-module'); | |||
if($(this).prop("checked")) { | |||
@@ -22,7 +22,7 @@ frappe.DataImportTool = Class.extend({ | |||
} | |||
if(in_list(frappe.boot.user.can_import, doctype)) { | |||
this.select.val(doctype).change(); | |||
this.select.val(doctype).change(); | |||
} | |||
frappe.route_options = null; | |||
@@ -129,12 +129,12 @@ frappe.DataImportTool = Class.extend({ | |||
queued: function() { | |||
// async, show queued | |||
msg_dialog.clear(); | |||
msgprint(__("Import Request Queued. This may take a few moments, please be patient.")); | |||
frappe.msgprint(__("Import Request Queued. This may take a few moments, please be patient.")); | |||
}, | |||
running: function() { | |||
// update async status as running | |||
msg_dialog.clear(); | |||
msgprint(__("Importing...")); | |||
frappe.msgprint(__("Importing...")); | |||
me.write_messages([__("Importing")]); | |||
me.has_progress = false; | |||
}, | |||
@@ -74,16 +74,16 @@ $.extend(frappe.desktop, { | |||
// TEMP: test activiation without this message. | |||
return; | |||
if(!frappe.user.has_role('System Manager')) { | |||
return; | |||
} | |||
frappe.call({ | |||
method: 'frappe.core.page.desktop.desktop.get_help_messages', | |||
callback: function(r) { | |||
frappe.desktop.render_help_messages(r.message); | |||
} | |||
}); | |||
// if(!frappe.user.has_role('System Manager')) { | |||
// return; | |||
// } | |||
// frappe.call({ | |||
// method: 'frappe.core.page.desktop.desktop.get_help_messages', | |||
// callback: function(r) { | |||
// frappe.desktop.render_help_messages(r.message); | |||
// } | |||
// }); | |||
}, | |||
@@ -91,7 +91,7 @@ $.extend(frappe.desktop, { | |||
var wrapper = frappe.desktop.wrapper.find('.help-message-wrapper'); | |||
var $help_messages = wrapper.find('.help-messages'); | |||
set_current_message = function(idx) { | |||
var set_current_message = function(idx) { | |||
idx = cint(idx); | |||
wrapper.current_message_idx = idx; | |||
wrapper.find('.left-arrow, .right-arrow').addClass('disabled'); | |||
@@ -166,7 +166,7 @@ $.extend(frappe.desktop, { | |||
} | |||
return false; | |||
} else { | |||
module = frappe.get_module(parent.attr("data-name")); | |||
var module = frappe.get_module(parent.attr("data-name")); | |||
if (module && module.onclick) { | |||
module.onclick(); | |||
return false; | |||
@@ -181,7 +181,7 @@ $.extend(frappe.desktop, { | |||
new Sortable($("#icon-grid").get(0), { | |||
onUpdate: function(event) { | |||
new_order = []; | |||
var new_order = []; | |||
$("#icon-grid .case-wrapper").each(function(i, e) { | |||
new_order.push($(this).attr("data-name")); | |||
}); | |||
@@ -59,7 +59,7 @@ frappe.pages['modules_setup'].on_page_load = function(wrapper) { | |||
}; | |||
// application installer | |||
if(frappe.boot.user.roles.indexOf('System Manager')!==-1) { | |||
if(frappe.user_roles.includes('System Manager')) { | |||
page.add_inner_button('Install Apps', function() { | |||
frappe.set_route('applications'); | |||
}); | |||
@@ -298,7 +298,7 @@ frappe.PermissionEngine = Class.extend({ | |||
r.message = $.map(r.message, function(p) { | |||
return $.format('<a href="#Form/User/{0}">{1}</a>', [p, p]); | |||
}) | |||
msgprint(__("Users with role {0}:", [__(role)]) | |||
frappe.msgprint(__("Users with role {0}:", [__(role)]) | |||
+ "<br>" + r.message.join("<br>")); | |||
} | |||
}) | |||
@@ -324,7 +324,7 @@ frappe.PermissionEngine = Class.extend({ | |||
}, | |||
callback: function(r) { | |||
if(r.exc) { | |||
msgprint(__("Did not remove")); | |||
frappe.msgprint(__("Did not remove")); | |||
} else { | |||
me.refresh(); | |||
} | |||
@@ -380,7 +380,8 @@ frappe.PermissionEngine = Class.extend({ | |||
options:me.options.roles, reqd:1,fieldname:"role"}, | |||
{fieldtype:"Select", label:__("Permission Level"), | |||
options:[0,1,2,3,4,5,6,7,8,9], reqd:1, fieldname: "permlevel", | |||
description: __("Level 0 is for document level permissions, higher levels for field level permissions.")} | |||
description: __("Level 0 is for document level permissions, \ | |||
higher levels for field level permissions.")} | |||
] | |||
}); | |||
if(me.get_doctype()) { | |||
@@ -404,7 +405,7 @@ frappe.PermissionEngine = Class.extend({ | |||
args: args, | |||
callback: function(r) { | |||
if(r.exc) { | |||
msgprint(__("Did not add")); | |||
frappe.msgprint(__("Did not add")); | |||
} else { | |||
me.refresh(); | |||
} | |||
@@ -417,6 +418,7 @@ frappe.PermissionEngine = Class.extend({ | |||
}, | |||
show_user_permission_doctypes: function(d) { | |||
var me = this; | |||
if (!d.dialog) { | |||
var fields = []; | |||
for (var i=0, l=d.linked_doctypes.length; i<l; i++) { | |||
@@ -476,9 +478,9 @@ frappe.PermissionEngine = Class.extend({ | |||
}, | |||
callback: function(r) { | |||
if(r.exc) { | |||
msgprint(__("Did not set")); | |||
frappe.msgprint(__("Did not set")); | |||
} else { | |||
var msg = msgprint(__("Saved!")); | |||
var msg = frappe.msgprint(__("Saved!")); | |||
setTimeout(function() { msg.hide(); }, 3000); | |||
d.user_permission_doctypes = user_permission_doctypes; | |||
dialog.hide(); | |||
@@ -50,9 +50,9 @@ frappe.UserPermissions = Class.extend({ | |||
var me = this; | |||
$(this.wrapper).find(".view-role-permissions").on("click", function() { | |||
frappe.route_options = { doctype: me.get_doctype() || "" }; | |||
frappe.set_route("permission-manager"); | |||
}) | |||
frappe.route_options = { doctype: me.get_doctype() || "" }; | |||
frappe.set_route("permission-manager"); | |||
}) | |||
return frappe.call({ | |||
module:"frappe.core", | |||
@@ -82,7 +82,7 @@ frappe.UserPermissions = Class.extend({ | |||
options: "[Select]" | |||
}); | |||
if(roles.indexOf("System Manager")!==-1) { | |||
if(frappe.user_roles.includes("System Manager")) { | |||
me.download = me.wrapper.page.add_field({ | |||
fieldname: "download", | |||
label: __("Download"), | |||
@@ -141,7 +141,7 @@ frappe.UserPermissions = Class.extend({ | |||
primary_action: function() { | |||
var filedata = d.fields_dict.attach.get_value(); | |||
if(!filedata) { | |||
msgprint(_("Please attach a file")); | |||
frappe.msgprint(__("Please attach a file")); | |||
return; | |||
} | |||
frappe.call({ | |||
@@ -151,7 +151,7 @@ frappe.UserPermissions = Class.extend({ | |||
}, | |||
callback: function(r) { | |||
if(!r.exc) { | |||
msgprint(__("Permissions Updated")); | |||
frappe.msgprint(__("Permissions Updated")); | |||
d.hide(); | |||
} | |||
} | |||
@@ -250,9 +250,11 @@ frappe.UserPermissions = Class.extend({ | |||
$.each([[__("Allow User"), 150], [__("If Document Type"), 150], [__("Is"),150], ["", 50]], | |||
function(i, col) { | |||
$("<th>").html(col[0]).css("width", col[1]+"px") | |||
.appendTo(me.table.find("thead tr")); | |||
}); | |||
$("<th>") | |||
.html(col[0]) | |||
.css("width", col[1]+"px") | |||
.appendTo(me.table.find("thead tr")); | |||
}); | |||
$.each(this.prop_list, function(i, d) { | |||
@@ -288,7 +290,7 @@ frappe.UserPermissions = Class.extend({ | |||
}, | |||
callback: function(r) { | |||
if(r.exc) { | |||
msgprint(__("Did not remove")); | |||
frappe.msgprint(__("Did not remove")); | |||
} else { | |||
me.refresh(); | |||
} | |||
@@ -349,7 +351,7 @@ frappe.UserPermissions = Class.extend({ | |||
args: args, | |||
callback: function(r) { | |||
if(r.exc) { | |||
msgprint(__("Did not add")); | |||
frappe.msgprint(__("Did not add")); | |||
} else { | |||
me.refresh(); | |||
} | |||
@@ -16,7 +16,7 @@ frappe.query_reports["Permitted Documents For User"] = { | |||
"fieldtype": "Link", | |||
"options": "DocType", | |||
"reqd": 1, | |||
"get_query": function() { | |||
"get_query": function () { | |||
return { | |||
"query": "frappe.core.report.permitted_documents_for_user.permitted_documents_for_user.query_doctypes", | |||
"filters": { | |||
@@ -25,10 +25,10 @@ frappe.query_reports["Permitted Documents For User"] = { | |||
} | |||
} | |||
}, | |||
{ | |||
"fieldname": "show_permissions", | |||
"label": __("Show Permissions"), | |||
"fieldtype": "Check" | |||
} | |||
{ | |||
"fieldname": "show_permissions", | |||
"label": __("Show Permissions"), | |||
"fieldtype": "Check" | |||
} | |||
] | |||
} |
@@ -7,10 +7,10 @@ | |||
frappe.ui.form.on('Custom Field', { | |||
setup: function(frm) { | |||
frm.set_query('dt', function(doc) { | |||
filters = [ | |||
var filters = [ | |||
['DocType', 'issingle', '=', 0], | |||
]; | |||
if(user!=="Administrator") { | |||
if(frappe.session.user!=="Administrator") { | |||
filters.push(['DocType', 'module', '!=', 'Core']) | |||
} | |||
return { | |||
@@ -57,7 +57,7 @@ frappe.ui.form.on('Custom Field', { | |||
fieldtype: function(frm) { | |||
if(frm.doc.fieldtype == 'Link') { | |||
frm.fields_dict['options_help'].disp_area.innerHTML = | |||
__('Name of the Document Type (DocType) you want this field to be linked to. e.g. Customer'); | |||
__('Name of the Document Type (DocType) you want this field to be linked to. e.g. Customer'); | |||
} else if(frm.doc.fieldtype == 'Select') { | |||
frm.fields_dict['options_help'].disp_area.innerHTML = | |||
__('Options for select. Each option on a new line.')+' '+__('e.g.:')+'<br>'+__('Option 1')+'<br>'+__('Option 2')+'<br>'+__('Option 3')+'<br>'; | |||
@@ -14,8 +14,8 @@ frappe.ui.form.on("Customize Form", { | |||
['DocType', 'issingle', '=', 0], | |||
['DocType', 'custom', '=', 0], | |||
['DocType', 'name', 'not in', 'DocType, DocField, DocPerm, User, Role, Has Role, \ | |||
Page, Has Role, Module Def, Print Format, Report, Customize Form, \ | |||
Customize Form Field'] | |||
Page, Has Role, Module Def, Print Format, Report, Customize Form, \ | |||
Customize Form Field'] | |||
] | |||
}; | |||
}); | |||
@@ -129,7 +129,7 @@ frappe.ui.form.on("Customize Form Field", { | |||
before_fields_remove: function(frm, doctype, name) { | |||
var row = frappe.get_doc(doctype, name); | |||
if(!(row.is_custom_field || row.__islocal)) { | |||
msgprint(__("Cannot delete standard field. You can hide it if you want")); | |||
frappe.msgprint(__("Cannot delete standard field. You can hide it if you want")); | |||
throw "cannot delete custom field"; | |||
} | |||
}, | |||
@@ -171,7 +171,7 @@ frappe.customize_form.confirm = function(msg, frm) { | |||
method: "reset_to_defaults", | |||
callback: function(r) { | |||
if(r.exc) { | |||
msgprint(r.exc); | |||
frappe.msgprint(r.exc); | |||
} else { | |||
d.hide(); | |||
frappe.customize_form.clear_locals_and_refresh(frm); | |||
@@ -262,7 +262,7 @@ frappe.customize_form.add_fields_help = function(frm) { | |||
<td>\ | |||
Show field if a condition is met<br />\ | |||
Example: <code>eval:doc.status=='Cancelled'</code>\ | |||
on a field like \"reason_for_cancellation\" will reveal \ | |||
on a field like \"reason_for_cancellation\" will reveal \ | |||
\"Reason for Cancellation\" only if the record is Cancelled.\ | |||
</td>\ | |||
</tr>\ | |||
@@ -4,8 +4,8 @@ | |||
$.extend(cur_frm.cscript, { | |||
validate: function(doc) { | |||
if(doc.property_type=='Check' && !in_list(['0','1'], doc.value)) { | |||
msgprint(__('Value for a check field can be either 0 or 1')); | |||
validated = false; | |||
frappe.msgprint(__('Value for a check field can be either 0 or 1')); | |||
frappe.validated = false; | |||
} | |||
} | |||
}) |
@@ -4,8 +4,8 @@ | |||
frappe.ui.form.on("Event", { | |||
onload: function(frm) { | |||
frm.set_query("ref_type", function(txt) { | |||
return { | |||
"filters": { | |||
return { | |||
"filters": { | |||
"issingle": 0, | |||
} | |||
}; | |||
@@ -20,8 +20,8 @@ frappe.ui.form.on("Event", { | |||
}, | |||
repeat_on: function(frm) { | |||
if(frm.doc.repeat_on==="Every Day") { | |||
$.each(["monday", "tuesday", "wednesday", "thursday", "friday", | |||
"saturday", "sunday"], function(i,v) { | |||
["monday", "tuesday", "wednesday", "thursday", | |||
"friday", "saturday", "sunday"].map(function(v) { | |||
frm.set_value(v, 1); | |||
}); | |||
} | |||
@@ -35,7 +35,7 @@ frappe.ui.form.on('Kanban Board', { | |||
field.options && field.options.split('\n').forEach(function(o, i) { | |||
o = o.trim(); | |||
if(!o) return; | |||
d = frm.add_child('columns'); | |||
var d = frm.add_child('columns'); | |||
d.column_name = o; | |||
}); | |||
frm.refresh(); | |||
@@ -3,8 +3,8 @@ | |||
frappe.ui.form.on("ToDo", { | |||
onload: function(frm) { | |||
frm.set_query("reference_type", function(txt) { | |||
return { | |||
"filters": { | |||
return { | |||
"filters": { | |||
"issingle": 0, | |||
} | |||
}; | |||
@@ -1,7 +1,7 @@ | |||
frappe.listview_settings['ToDo'] = { | |||
onload: function(me) { | |||
frappe.route_options = { | |||
"owner": user, | |||
"owner": frappe.session.user, | |||
"status": "Open" | |||
}; | |||
me.page.set_title(__("To Do")); | |||
@@ -14,7 +14,7 @@ frappe.listview_settings['ToDo'] = { | |||
var assign_filter = me.filter_list.get_filter("assigned_by"); | |||
assign_filter && assign_filter.remove(true); | |||
me.filter_list.add_filter(me.doctype, "owner", '=', user); | |||
me.filter_list.add_filter(me.doctype, "owner", '=', frappe.session.user); | |||
me.run(); | |||
}); | |||
@@ -23,7 +23,7 @@ frappe.listview_settings['ToDo'] = { | |||
var assign_filter = me.filter_list.get_filter("owner"); | |||
assign_filter && assign_filter.remove(true); | |||
me.filter_list.add_filter(me.doctype, "assigned_by", '=', user); | |||
me.filter_list.add_filter(me.doctype, "assigned_by", '=', frappe.session.user); | |||
me.run(); | |||
}, ".assigned-to-me"); | |||
}, | |||
@@ -32,7 +32,7 @@ frappe.pages['activity'].on_page_load = function(wrapper) { | |||
}, | |||
show_filters: true, | |||
doctype: "Communication", | |||
get_args: function() { | |||
get_args: function() { | |||
if (frappe.route_options && frappe.route_options.show_likes) { | |||
delete frappe.route_options.show_likes; | |||
return { | |||
@@ -80,7 +80,7 @@ frappe.pages['activity'].on_page_load = function(wrapper) { | |||
this.page.add_menu_item(__('Authentication Log'), function() { | |||
frappe.route_options = { | |||
"user": user | |||
"user": frappe.session.user | |||
} | |||
frappe.set_route('Report', "Authentication Log"); | |||
@@ -147,17 +147,18 @@ frappe.activity.Feed = Class.extend({ | |||
data.feed_type = data.comment_type || data.communication_medium; | |||
}, | |||
add_date_separator: function(row, data) { | |||
var date = dateutil.str_to_obj(data.creation); | |||
var date = frappe.datetime.str_to_obj(data.creation); | |||
var last = frappe.activity.last_feed_date; | |||
if((last && dateutil.obj_to_str(last) != dateutil.obj_to_str(date)) || (!last)) { | |||
var diff = dateutil.get_day_diff(dateutil.get_today(), dateutil.obj_to_str(date)); | |||
if((last && frappe.datetime.obj_to_str(last) != frappe.datetime.obj_to_str(date)) || (!last)) { | |||
var diff = frappe.datetime.get_day_diff(frappe.datetime.get_today(), frappe.datetime.obj_to_str(date)); | |||
var pdate; | |||
if(diff < 1) { | |||
pdate = 'Today'; | |||
} else if(diff < 2) { | |||
pdate = 'Yesterday'; | |||
} else { | |||
pdate = dateutil.global_date_format(date); | |||
pdate = frappe.datetime.global_date_format(date); | |||
} | |||
data.date_sep = pdate; | |||
data.date_class = pdate=='Today' ? "date-indicator blue" : "date-indicator"; | |||
@@ -182,7 +183,7 @@ frappe.activity.render_heatmap = function(page) { | |||
var legend = []; | |||
var max = Math.max.apply(this, $.map(r.message, function(v) { return v })); | |||
var legend = [cint(max/5), cint(max*2/5), cint(max*3/5), cint(max*4/5)]; | |||
heatmap = new CalHeatMap(); | |||
var heatmap = new CalHeatMap(); | |||
heatmap.init({ | |||
itemSelector: ".heatmap", | |||
domain: "month", | |||
@@ -21,7 +21,7 @@ frappe.applications.Installer = Class.extend({ | |||
me.make_page(); | |||
// no apps | |||
if(!keys(apps).length) { | |||
if(!Object.keys(apps).length) { | |||
me.wrapper.html('<div class="text-muted app-listing padding">' + __("No Apps Installed") + '</div>'); | |||
return; | |||
} | |||
@@ -5,7 +5,7 @@ frappe.pages['backups'].on_page_load = function(wrapper) { | |||
single_column: true | |||
}); | |||
page.add_inner_button(__("Set Number of Backups"), function() { | |||
page.add_inner_button(__("Set Number of Backups"), function () { | |||
frappe.set_route('Form', 'System Settings'); | |||
}); | |||
@@ -40,10 +40,10 @@ frappe.Chat = Class.extend({ | |||
setup_realtime: function() { | |||
var me = this; | |||
frappe.realtime.on('new_message', function(comment) { | |||
if(comment.modified_by !== user || comment.communication_type === 'Bot') { | |||
if(comment.modified_by !== frappe.session.user || comment.communication_type === 'Bot') { | |||
if(frappe.get_route()[0] === 'chat') { | |||
var current_contact = $(cur_page.page).find('[data-contact]').data('contact'); | |||
var on_broadcast_page = current_contact === user; | |||
var on_broadcast_page = current_contact === frappe.session.user; | |||
if ((current_contact == comment.owner) | |||
|| (on_broadcast_page && comment.broadcast) | |||
|| current_contact === 'Bot' && comment.communication_type === 'Bot') { | |||
@@ -220,7 +220,7 @@ frappe.Chat = Class.extend({ | |||
if(data.owner==data.reference_name | |||
&& data.communication_type!=="Notification" | |||
&& data.comment_type!=="Bot") { | |||
data.is_public = true; | |||
data.is_public = true; | |||
} | |||
if(data.owner==data.reference_name && data.communication_type !== "Bot") { | |||
@@ -63,7 +63,7 @@ frappe.pages['modules'].on_page_load = function(wrapper) { | |||
module: module_name | |||
}, | |||
callback: function(r) { | |||
m = frappe.get_module(module_name); | |||
var m = frappe.get_module(module_name); | |||
m.data = r.message.data; | |||
process_data(module_name, m.data); | |||
page.section_data[module_name] = m; | |||
@@ -155,7 +155,7 @@ frappe.wiz.Wizard = Class.extend({ | |||
}, 2000); | |||
}, | |||
error: function(r) { | |||
var d = msgprint(__("There were errors.")); | |||
var d = frappe.msgprint(__("There were errors.")); | |||
d.custom_onhide = function() { | |||
frappe.set_route(me.page_name, me.slides.length - 1); | |||
}; | |||
@@ -229,14 +229,14 @@ frappe.wiz.WizardSlide = Class.extend({ | |||
} | |||
this.$body = $(frappe.render_template("setup_wizard_page", { | |||
help: __(this.help), | |||
title:__(this.title), | |||
main_title:__(this.wiz.title), | |||
step: this.id + 1, | |||
name: this.name, | |||
css_class: this.css_class || "", | |||
slides_count: this.wiz.slides.length | |||
})).appendTo(this.$wrapper); | |||
help: __(this.help), | |||
title:__(this.title), | |||
main_title:__(this.wiz.title), | |||
step: this.id + 1, | |||
name: this.name, | |||
css_class: this.css_class || "", | |||
slides_count: this.wiz.slides.length | |||
})).appendTo(this.$wrapper); | |||
this.body = this.$body.find(".form")[0]; | |||
@@ -314,7 +314,7 @@ frappe.wiz.WizardSlide = Class.extend({ | |||
//setup mousefree navigation | |||
this.$body.on('keypress', function(e) { | |||
if(e.which === 13) { | |||
$target = $(e.target); | |||
var $target = $(e.target); | |||
if($target.hasClass('prev-btn')) { | |||
me.prev(); | |||
} else if($target.hasClass('btn-attach')) { | |||
@@ -469,7 +469,7 @@ function load_frappe_slides() { | |||
var data = frappe.wiz.regional_data; | |||
slide.get_input("country").empty() | |||
.add_options([""].concat(keys(data.country_info).sort())); | |||
.add_options([""].concat(Object.keys(data.country_info).sort())); | |||
slide.get_input("currency").empty() | |||
@@ -559,7 +559,7 @@ function load_frappe_slides() { | |||
], | |||
help: __('The first user will become the System Manager (you can change this later).'), | |||
onload: function(slide) { | |||
if(user!=="Administrator") { | |||
if(frappe.session.user!=="Administrator") { | |||
slide.form.fields_dict.password.$wrapper.toggle(false); | |||
slide.form.fields_dict.email.$wrapper.toggle(false); | |||
if(frappe.boot.user.first_name || frappe.boot.user.last_name) { | |||
@@ -580,7 +580,7 @@ function load_frappe_slides() { | |||
}, | |||
css_class: "single-column" | |||
}; | |||
}; | |||
} | |||
frappe.wiz.on("before_load", function() { | |||
load_frappe_slides(); | |||
@@ -27,7 +27,7 @@ frappe.ui.form.on('Auto Email Report', { | |||
"/api/method/frappe.email.doctype.auto_email_report.auto_email_report.download?" | |||
+"name="+encodeURIComponent(frm.doc.name))); | |||
if(!w) { | |||
msgprint(__("Please enable pop-ups")); return; | |||
frappe.msgprint(__("Please enable pop-ups")); return; | |||
} | |||
}); | |||
frm.add_custom_button(__('Send Now'), function() { | |||
@@ -35,7 +35,7 @@ frappe.ui.form.on('Auto Email Report', { | |||
method: 'frappe.email.doctype.auto_email_report.auto_email_report.send_now', | |||
args: {name: frm.doc.name}, | |||
callback: function() { | |||
msgprint(__('Scheduled to send')); | |||
frappe.msgprint(__('Scheduled to send')); | |||
} | |||
}); | |||
}); | |||
@@ -62,13 +62,13 @@ frappe.ui.form.on('Auto Email Report', { | |||
var table = $('<table class="table table-bordered" style="cursor:pointer; margin:0px;"><thead>\ | |||
<tr><th style="width: 50%">'+__('Filter')+'</th><th>'+__('Value')+'</th></tr>\ | |||
</thead><tbody></tbody></table>').appendTo(wrapper); | |||
$('<p class="text-muted small">' + __("Click table to edit") + '</p>').appendTo(wrapper); | |||
$('<p class="text-muted small">' + __("Click table to edit") + '</p>').appendTo(wrapper); | |||
var filters = JSON.parse(frm.doc.filters || '{}'); | |||
var report_filters = frappe.query_reports[frm.doc.report].filters; | |||
frm.set_value('filter_meta', JSON.stringify(report_filters)); | |||
report_filters_list = [] | |||
var report_filters_list = [] | |||
$.each(report_filters, function(key, val){ | |||
// Remove break fieldtype from the filters | |||
if(val.fieldtype != 'Break') { | |||
@@ -18,7 +18,6 @@ frappe.email_defaults = { | |||
"use_imap": 1 | |||
}, | |||
"Sendgrid": { | |||
"enable_outgoing": 0, | |||
"enable_outgoing": 1, | |||
"smtp_server": "smtp.sendgrid.net", | |||
"smtp_port": 587, | |||
@@ -71,7 +70,7 @@ frappe.ui.form.on("Email Account", { | |||
service: function(frm) { | |||
$.each(frappe.email_defaults[frm.doc.service], function(key, value) { | |||
frm.set_value(key, value); | |||
}) | |||
}); | |||
if (!frm.doc.use_imap) { | |||
$.each(frappe.email_defaults_pop[frm.doc.service], function(key, value) { | |||
frm.set_value(key, value); | |||
@@ -94,7 +93,7 @@ frappe.ui.form.on("Email Account", { | |||
}, | |||
enable_incoming: function(frm) { | |||
frm.doc.no_remaining = null //perform full sync | |||
frm.doc.no_remaining = null; //perform full sync | |||
//frm.set_df_property("append_to", "reqd", frm.doc.enable_incoming); | |||
}, | |||
@@ -114,8 +113,8 @@ frappe.ui.form.on("Email Account", { | |||
frm.events.show_gmail_message_for_less_secure_apps(frm); | |||
if(frappe.route_flags.delete_user_from_locals && frappe.route_flags.linked_user) { | |||
delete frappe.route_flags.delete_user_from_locals | |||
delete locals['User'][frappe.route_flags.linked_user] | |||
delete frappe.route_flags.delete_user_from_locals; | |||
delete locals['User'][frappe.route_flags.linked_user]; | |||
} | |||
}, | |||
@@ -134,7 +133,7 @@ frappe.ui.form.on("Email Account", { | |||
update_domain: function(frm){ | |||
if (!frm.doc.email_id && !frm.doc.service){ | |||
return | |||
return; | |||
} | |||
frappe.call({ | |||
@@ -145,17 +144,17 @@ frappe.ui.form.on("Email Account", { | |||
}, | |||
callback: function (r) { | |||
if (r.message) { | |||
frm.events.set_domain_fields(frm, r.message) | |||
frm.events.set_domain_fields(frm, r.message); | |||
} else { | |||
frm.set_value("domain", "") | |||
frm.set_value("domain", ""); | |||
frappe.confirm(__('Email Domain not configured for this account, Create one?'), | |||
function () { | |||
frappe.model.with_doctype("Email Domain", function() { | |||
frappe.route_options = { email_id: frm.doc.email_id }; | |||
frappe.route_flags.return_to_email_account = 1 | |||
frappe.route_flags.return_to_email_account = 1; | |||
var doc = frappe.model.get_new_doc("Email Domain"); | |||
frappe.set_route("Form", "Email Domain", doc.name); | |||
}) | |||
}); | |||
} | |||
); | |||
} | |||
@@ -165,26 +164,26 @@ frappe.ui.form.on("Email Account", { | |||
set_domain_fields: function(frm, args) { | |||
if(!args){ | |||
args = frappe.route_flags.set_domain_values? frappe.route_options: {} | |||
args = frappe.route_flags.set_domain_values? frappe.route_options: {}; | |||
} | |||
for(field in args) { | |||
for(var field in args) { | |||
frm.set_value(field, args[field]); | |||
} | |||
delete frappe.route_flags.set_domain_values | |||
frappe.route_options = {} | |||
delete frappe.route_flags.set_domain_values; | |||
frappe.route_options = {}; | |||
}, | |||
email_sync_option: function(frm) { | |||
// confirm if the ALL sync option is selected | |||
if(frm.doc.email_sync_option == "ALL"){ | |||
msg = __("You are selecting Sync Option as ALL, It will resync all \ | |||
var msg = __("You are selecting Sync Option as ALL, It will resync all \ | |||
read as well as unread message from server. This may also cause the duplication\ | |||
of Communication (emails).") | |||
of Communication (emails)."); | |||
frappe.confirm(msg, null, function() { | |||
frm.set_value("email_sync_option", "UNSEEN") | |||
frm.set_value("email_sync_option", "UNSEEN"); | |||
}); | |||
} | |||
} | |||
@@ -70,9 +70,9 @@ frappe.ui.form.on("Email Alert", { | |||
}, | |||
callback: function(r) { | |||
if(r.message) { | |||
msgprint(r.message); | |||
frappe.msgprint(r.message); | |||
} else { | |||
msgprint(__('No alerts for today')); | |||
frappe.msgprint(__('No alerts for today')); | |||
} | |||
} | |||
}); | |||
@@ -9,8 +9,8 @@ frappe.ui.form.on("Email Domain", { | |||
frm.set_value("domain_name",frm.doc.email_id.split("@")[1]) | |||
} | |||
if (frm.doc.__islocal != 1 && frappe.route_flags.return_to_email_account) { | |||
var route = frappe.get_prev_route() | |||
if (frm.doc.__islocal != 1 && frappe.route_flags.return_to_email_account) { | |||
var route = frappe.get_prev_route(); | |||
delete frappe.route_flags.return_to_email_account; | |||
frappe.route_flags.set_domain_values = true | |||
@@ -10,7 +10,8 @@ frappe.ui.form.on("Email Group", "refresh", function(frm) { | |||
frm.add_custom_button(__("Import Subscribers"), function() { | |||
frappe.prompt({fieldtype:"Select", options: frm.doc.__onload.import_types, | |||
label:__("Import Email From"), fieldname:"doctype", reqd:1}, function(data) { | |||
label:__("Import Email From"), fieldname:"doctype", reqd:1}, | |||
function(data) { | |||
frappe.call({ | |||
method: "frappe.email.doctype.email_group.email_group.import_from", | |||
args: { | |||
@@ -26,7 +27,8 @@ frappe.ui.form.on("Email Group", "refresh", function(frm) { | |||
frm.add_custom_button(__("Add Subscribers"), function() { | |||
frappe.prompt({fieldtype:"Text", | |||
label:__("Email Addresses"), fieldname:"email_list", reqd:1}, function(data) { | |||
label:__("Email Addresses"), fieldname:"email_list", reqd:1}, | |||
function(data) { | |||
frappe.call({ | |||
method: "frappe.email.doctype.email_group.email_group.add_subscribers", | |||
args: { | |||
@@ -1,10 +1,10 @@ | |||
frappe.listview_settings['Email Queue'] = { | |||
get_indicator: function(doc) { | |||
colour = {'Sent': 'green', 'Sending': 'blue', 'Not Sent': 'grey', 'Error': 'red', 'Expired': 'orange'}; | |||
var colour = {'Sent': 'green', 'Sending': 'blue', 'Not Sent': 'grey', 'Error': 'red', 'Expired': 'orange'}; | |||
return [__(doc.status), colour[doc.status], "status,=," + doc.status]; | |||
}, | |||
refresh: function(doclist){ | |||
if (has_common(roles, ["Administrator", "System Manager"])){ | |||
if (has_common(frappe.user_roles, ["Administrator", "System Manager"])){ | |||
if (cint(frappe.defaults.get_default("hold_queue"))){ | |||
doclist.page.clear_inner_toolbar() | |||
doclist.page.add_inner_button(__("Resume Sending"), function() { | |||
@@ -1,10 +1,11 @@ | |||
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors | |||
// License: GNU General Public License v3. See license.txt | |||
/* globals erpnext */ | |||
cur_frm.cscript.refresh = function(doc) { | |||
if(window.erpnext) erpnext.toggle_naming_series(); | |||
if(!doc.__islocal && !cint(doc.email_sent) && !doc.__unsaved | |||
&& inList(frappe.boot.user.can_write, doc.doctype)) { | |||
&& in_list(frappe.boot.user.can_write, doc.doctype)) { | |||
cur_frm.add_custom_button(__('Send'), function() { | |||
return $c_obj(doc, 'send_emails', '', function(r) { | |||
cur_frm.refresh(); | |||
@@ -9,12 +9,12 @@ frappe.ui.form.on("Print Format", { | |||
refresh: function(frm) { | |||
frm.set_intro(""); | |||
frm.toggle_enable(["html", "doc_type", "module"], false); | |||
if (user==="Administrator" || frm.doc.standard==="No") { | |||
if (frappe.session.user==="Administrator" || frm.doc.standard==="No") { | |||
frm.toggle_enable(["html", "doc_type", "module"], true); | |||
frm.enable_save(); | |||
} | |||
if(frm.doc.standard==="Yes" && user !== "Administrator") { | |||
if(frm.doc.standard==="Yes" && frappe.session.user !== "Administrator") { | |||
frm.set_intro(__("Please duplicate this to make changes")); | |||
} | |||
frm.trigger('render_buttons'); | |||
@@ -25,7 +25,7 @@ frappe.ui.form.on("Print Format", { | |||
if(!frm.doc.custom_format) { | |||
frm.add_custom_button(__("Edit Format"), function() { | |||
if(!frm.doc.doc_type) { | |||
msgprint(__("Please select DocType first")); | |||
frappe.msgprint(__("Please select DocType first")); | |||
return; | |||
} | |||
frappe.set_route("print-format-builder", frm.doc.name); | |||
@@ -42,7 +42,7 @@ frappe.ui.form.on("Print Format", { | |||
} | |||
}, | |||
custom_format: function(frm) { | |||
value = frm.doc.custom_format ? 0:1; | |||
var value = frm.doc.custom_format ? 0:1; | |||
frm.set_value('align_labels_left', value); | |||
frm.set_value('show_section_headings', value); | |||
frm.set_value('line_breaks', value); | |||
@@ -123,7 +123,7 @@ frappe.PrintFormatBuilder = Class.extend({ | |||
var doctype = me.doctype_input.get_value(), | |||
name = me.name_input.get_value(); | |||
if(!(doctype && name)) { | |||
msgprint(__("Both DocType and Name required")); | |||
frappe.msgprint(__("Both DocType and Name required")); | |||
return; | |||
} | |||
me.setup_new_print_format(doctype, name); | |||
@@ -272,7 +272,7 @@ frappe.PrintFormatBuilder = Class.extend({ | |||
set_column(); | |||
} else if(!in_list(["Section Break", "Column Break", "Fold"], f.fieldtype) | |||
&& f.label) { | |||
&& f.label) { | |||
if(!column) set_column(); | |||
if(f.fieldtype==="Table") { | |||
@@ -564,7 +564,7 @@ frappe.PrintFormatBuilder = Class.extend({ | |||
section.no_of_columns = 1; | |||
var $section = $(frappe.render_template("print_format_builder_section", | |||
{section: section, me: me})) | |||
{section: section, me: me})) | |||
.appendTo(me.page.main.find(".print-format-builder-layout")) | |||
me.setup_sortable_for_column($section.find(".print-format-builder-column").get(0)); | |||
@@ -587,8 +587,8 @@ frappe.PrintFormatBuilder = Class.extend({ | |||
var parent = $(this).parents(".print-format-builder-field:first"), | |||
doctype = parent.attr("data-doctype"), | |||
label = parent.attr("data-label"), | |||
columns = parent.attr("data-columns").split(",") | |||
column_names = $.map(columns, function(v) { return v.split("|")[0]; }); | |||
columns = parent.attr("data-columns").split(","), | |||
column_names = $.map(columns, function(v) { return v.split("|")[0]; }), | |||
widths = {}; | |||
$.each(columns, function(i, v) { | |||
@@ -622,7 +622,7 @@ frappe.PrintFormatBuilder = Class.extend({ | |||
$.each(doc_fields, function(j, f) { | |||
if (f && !in_list(column_names, f.fieldname) | |||
&& !in_list(["Section Break", "Column Break"], f.fieldtype) && f.label) { | |||
fields.push(f); | |||
fields.push(f); | |||
} | |||
}) | |||
// render checkboxes | |||
@@ -683,26 +683,26 @@ frappe.PrintFormatBuilder = Class.extend({ | |||
get_edit_html_dialog: function(title, label, $content) { | |||
var me = this; | |||
var d = new frappe.ui.Dialog({ | |||
title: title, | |||
fields: [ | |||
{ | |||
fieldname: "content", | |||
fieldtype: "Code", | |||
label: label | |||
}, | |||
{ | |||
fieldname: "help", | |||
fieldtype: "HTML", | |||
options: '<p>' | |||
+ __("You can add dynamic properties from the document by using Jinja templating.") | |||
+ __("For example: If you want to include the document ID, use {0}", ["<code>{{ doc.name }}</code>"]) | |||
+ '</p>' | |||
} | |||
] | |||
}); | |||
title: title, | |||
fields: [ | |||
{ | |||
fieldname: "content", | |||
fieldtype: "Code", | |||
label: label | |||
}, | |||
{ | |||
fieldname: "help", | |||
fieldtype: "HTML", | |||
options: '<p>' | |||
+ __("You can add dynamic properties from the document by using Jinja templating.") | |||
+ __("For example: If you want to include the document ID, use {0}", ["<code>{{ doc.name }}</code>"]) | |||
+ '</p>' | |||
} | |||
] | |||
}); | |||
// set existing content in input | |||
content = $content.data('content') || ""; | |||
var content = $content.data('content') || ""; | |||
if(content.indexOf(me.get_no_content())!==-1) content = ""; | |||
d.set_input("content", content); | |||
@@ -791,4 +791,4 @@ frappe.PrintFormatBuilder = Class.extend({ | |||
} | |||
}); | |||
} | |||
}); | |||
}); |
@@ -45,7 +45,7 @@ frappe.assets = { | |||
}); | |||
// clear assets | |||
for(key in localStorage) { | |||
for(var key in localStorage) { | |||
if(key.indexOf("desk_assets:")===0 || key.indexOf("_page:")===0 | |||
|| key.indexOf("_doctype:")===0 || key.indexOf("preferred_breadcrumbs:")===0) { | |||
localStorage.removeItem(key); | |||
@@ -10,7 +10,7 @@ frappe.db = { | |||
fieldname: fieldname, | |||
filters: filters | |||
}, | |||
callback: function(r, rt) { | |||
callback: function(r) { | |||
callback && callback(r.message); | |||
} | |||
}); | |||
@@ -26,12 +26,12 @@ frappe.defaults = { | |||
return d; | |||
}, | |||
get_global_default: function(key) { | |||
var d = sys_defaults[key]; | |||
var d = frappe.sys_defaults[key]; | |||
if($.isArray(d)) d = d[0]; | |||
return d; | |||
}, | |||
get_global_defaults: function(key) { | |||
var d = sys_defaults[key]; | |||
var d = frappe.sys_defaults[key]; | |||
if(!$.isArray(d)) d = [d]; | |||
return d; | |||
}, | |||
@@ -99,9 +99,9 @@ frappe.Application = Class.extend({ | |||
}); | |||
dialog.get_close_btn().toggle(false); | |||
}); | |||
if (sys_defaults.email_user_password){ | |||
var email_list = sys_defaults.email_user_password.split(','); | |||
for (u in email_list) { | |||
if (frappe.sys_defaults.email_user_password){ | |||
var email_list = frappe.sys_defaults.email_user_password.split(','); | |||
for (var u in email_list) { | |||
if (email_list[u]===frappe.user.name){ | |||
this.set_password(email_list[u]) | |||
} | |||
@@ -144,47 +144,47 @@ frappe.Application = Class.extend({ | |||
} | |||
] | |||
}); | |||
d.get_input("submit").on("click", function() { | |||
//setup spinner | |||
d.hide(); | |||
var s = new frappe.ui.Dialog({ | |||
title: __("Checking one moment"), | |||
fields: [{ | |||
d.get_input("submit").on("click", function() { | |||
//setup spinner | |||
d.hide(); | |||
var s = new frappe.ui.Dialog({ | |||
title: __("Checking one moment"), | |||
fields: [{ | |||
"fieldtype": "HTML", | |||
"fieldname": "checking" | |||
}] | |||
}); | |||
s.fields_dict.checking.$wrapper.html('<i class="fa fa-spinner fa-spin fa-4x"></i>') | |||
s.show(); | |||
frappe.call({ | |||
method: 'frappe.core.doctype.user.user.set_email_password', | |||
args: { | |||
"email_account": email_account[i]["email_account"], | |||
"user": user, | |||
"password": d.get_value("password") | |||
}, | |||
callback: function (passed) | |||
}); | |||
s.fields_dict.checking.$wrapper.html('<i class="fa fa-spinner fa-spin fa-4x"></i>') | |||
s.show(); | |||
frappe.call({ | |||
method: 'frappe.core.doctype.user.user.set_email_password', | |||
args: { | |||
"email_account": email_account[i]["email_account"], | |||
"user": user, | |||
"password": d.get_value("password") | |||
}, | |||
callback: function (passed) | |||
{ | |||
s.hide(); | |||
d.hide();//hide waiting indication | |||
if (!passed["message"]) | |||
{ | |||
s.hide(); | |||
d.hide();//hide waiting indication | |||
if (!passed["message"]) | |||
frappe.show_alert("Login Failed please try again", 5); | |||
me.email_password_prompt(email_account, user, i) | |||
} | |||
else | |||
{ | |||
if (i + 1 < email_account.length) | |||
{ | |||
show_alert("Login Failed please try again", 5); | |||
i = i + 1; | |||
me.email_password_prompt(email_account, user, i) | |||
} | |||
else | |||
{ | |||
if (i + 1 < email_account.length) | |||
{ | |||
i = i + 1; | |||
me.email_password_prompt(email_account, user, i) | |||
} | |||
} | |||
} | |||
}); | |||
} | |||
}); | |||
d.show(); | |||
}); | |||
d.show(); | |||
}, | |||
load_bootinfo: function() { | |||
if(frappe.boot) { | |||
@@ -269,15 +269,18 @@ frappe.Application = Class.extend({ | |||
}, | |||
set_globals: function() { | |||
// for backward compatibility | |||
console.warn('The global `user` has been deprecated. Please use `frappe.session.user` instead.'); | |||
frappe.session.user = frappe.boot.user.name; | |||
frappe.session.user_fullname = frappe.boot.user.name; | |||
user = frappe.boot.user.name; | |||
user_fullname = frappe.user_info(user).fullname; | |||
user_defaults = frappe.boot.user.defaults; | |||
roles = frappe.boot.user.roles; | |||
user_email = frappe.boot.user.email; | |||
sys_defaults = frappe.boot.sysdefaults; | |||
frappe.session.user_email = frappe.boot.user.email; | |||
frappe.session.user_fullname = frappe.user_info().fullname; | |||
console.warn('The global `user_defaults` has been deprecated. Please use `frappe.user_roles` instead.'); | |||
frappe.user_defaults = frappe.boot.user.defaults; | |||
console.warn('The global `roles` has been deprecated. Please use `frappe.user_roles` instead.'); | |||
frappe.user_roles = frappe.boot.user.roles; | |||
console.warn('The global `sys_defaults` has been deprecated. Please use `frappe.sys_defaults` instead.'); | |||
frappe.sys_defaults = frappe.boot.sysdefaults; | |||
frappe.ui.py_date_format = frappe.boot.sysdefaults.date_format.replace('dd', '%d').replace('mm', '%m').replace('yyyy', '%Y'); | |||
frappe.boot.user.last_selected_values = {}; | |||
}, | |||
@@ -285,7 +288,7 @@ frappe.Application = Class.extend({ | |||
// clear cached pages if timestamp is not found | |||
if(localStorage["page_info"]) { | |||
frappe.boot.allowed_pages = []; | |||
page_info = JSON.parse(localStorage["page_info"]); | |||
var page_info = JSON.parse(localStorage["page_info"]); | |||
$.each(frappe.boot.page_info, function(name, p) { | |||
if(!page_info[name] || (page_info[name].modified != p.modified)) { | |||
delete localStorage["_page:" + name]; | |||
@@ -293,19 +296,18 @@ frappe.Application = Class.extend({ | |||
frappe.boot.allowed_pages.push(name); | |||
}); | |||
} else { | |||
frappe.boot.allowed_pages = keys(frappe.boot.page_info); | |||
frappe.boot.allowed_pages = Object.keys(frappe.boot.page_info); | |||
} | |||
localStorage["page_info"] = JSON.stringify(frappe.boot.page_info); | |||
}, | |||
set_as_guest: function() { | |||
// for backward compatibility | |||
user = {name:'Guest'}; | |||
user = 'Guest'; | |||
user_fullname = 'Guest'; | |||
user_defaults = {}; | |||
roles = ['Guest']; | |||
user_email = ''; | |||
sys_defaults = {}; | |||
frappe.session.user = 'Guest'; | |||
frappe.session.user_email = ''; | |||
frappe.session.user_fullname = 'Guest'; | |||
frappe.user_defaults = {}; | |||
frappe.user_roles = ['Guest']; | |||
frappe.sys_defaults = {}; | |||
}, | |||
make_page_container: function() { | |||
if($("#body_div").length) { | |||
@@ -558,20 +560,19 @@ frappe.get_desktop_icons = function(show_hidden, show_global) { | |||
for (var i=0, l=frappe.boot.desktop_icons.length; i < l; i++) { | |||
var m = frappe.boot.desktop_icons[i]; | |||
if ((['Setup', 'Core'].indexOf(m.module_name) === -1) | |||
&& show_module(m)) { | |||
add_to_out(m) | |||
if ((['Setup', 'Core'].indexOf(m.module_name) === -1) && show_module(m)) { | |||
add_to_out(m); | |||
} | |||
} | |||
if(roles.indexOf('System Manager')!=-1) { | |||
if(frappe.user_roles.includes('System Manager')) { | |||
var m = frappe.get_module('Setup'); | |||
if(show_module(m)) add_to_out(m) | |||
if(show_module(m)) add_to_out(m); | |||
} | |||
if(roles.indexOf('Administrator')!=-1) { | |||
if(frappe.user_roles.includes('Administrator')) { | |||
var m = frappe.get_module('Core'); | |||
if(show_module(m)) add_to_out(m) | |||
if(show_module(m)) add_to_out(m); | |||
} | |||
return out; | |||
@@ -589,7 +590,7 @@ frappe.add_to_desktop = function(label, doctype, report) { | |||
}, | |||
callback: function(r) { | |||
if(r.message) { | |||
show_alert(__("Added")); | |||
frappe.show_alert(__("Added")); | |||
} | |||
} | |||
}); | |||
@@ -58,19 +58,19 @@ frappe.dom = { | |||
}, | |||
is_element_in_viewport: function (el) { | |||
//special bonus for those using jQuery | |||
if (typeof jQuery === "function" && el instanceof jQuery) { | |||
el = el[0]; | |||
} | |||
//special bonus for those using jQuery | |||
if (typeof jQuery === "function" && el instanceof jQuery) { | |||
el = el[0]; | |||
} | |||
var rect = el.getBoundingClientRect(); | |||
var rect = el.getBoundingClientRect(); | |||
return ( | |||
rect.top >= 0 | |||
&& rect.left >= 0 | |||
// && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */ | |||
// && rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */ | |||
); | |||
return ( | |||
rect.top >= 0 | |||
&& rect.left >= 0 | |||
// && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */ | |||
// && rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */ | |||
); | |||
}, | |||
set_style: function(txt, id) { | |||
@@ -115,7 +115,7 @@ frappe.dom = { | |||
css: function(ele, s) { | |||
if(ele && s) { | |||
$.extend(ele.style, s); | |||
}; | |||
} | |||
return ele; | |||
}, | |||
freeze: function(msg, css_class) { | |||
@@ -155,7 +155,7 @@ frappe.dom = { | |||
save_selection: function() { | |||
// via http://stackoverflow.com/questions/5605401/insert-link-in-contenteditable-element | |||
if (window.getSelection) { | |||
sel = window.getSelection(); | |||
var sel = window.getSelection(); | |||
if (sel.getRangeAt && sel.rangeCount) { | |||
var ranges = []; | |||
for (var i = 0, len = sel.rangeCount; i < len; ++i) { | |||
@@ -171,7 +171,7 @@ frappe.dom = { | |||
restore_selection: function(savedSel) { | |||
if (savedSel) { | |||
if (window.getSelection) { | |||
sel = window.getSelection(); | |||
var sel = window.getSelection(); | |||
sel.removeAllRanges(); | |||
for (var i = 0, len = savedSel.length; i < len; ++i) { | |||
sel.addRange(savedSel[i]); | |||
@@ -242,48 +242,48 @@ frappe._in = function(source, target) { | |||
})(jQuery); | |||
(function($) { | |||
function pasteIntoInput(el, text) { | |||
el.focus(); | |||
if (typeof el.selectionStart == "number") { | |||
var val = el.value; | |||
var selStart = el.selectionStart; | |||
el.value = val.slice(0, selStart) + text + val.slice(el.selectionEnd); | |||
el.selectionEnd = el.selectionStart = selStart + text.length; | |||
} else if (typeof document.selection != "undefined") { | |||
var textRange = document.selection.createRange(); | |||
textRange.text = text; | |||
textRange.collapse(false); | |||
textRange.select(); | |||
} | |||
} | |||
function pasteIntoInput(el, text) { | |||
el.focus(); | |||
if (typeof el.selectionStart == "number") { | |||
var val = el.value; | |||
var selStart = el.selectionStart; | |||
el.value = val.slice(0, selStart) + text + val.slice(el.selectionEnd); | |||
el.selectionEnd = el.selectionStart = selStart + text.length; | |||
} else if (typeof document.selection != "undefined") { | |||
var textRange = document.selection.createRange(); | |||
textRange.text = text; | |||
textRange.collapse(false); | |||
textRange.select(); | |||
} | |||
} | |||
function allowTabChar(el) { | |||
$(el).keydown(function(e) { | |||
if (e.which == 9) { | |||
pasteIntoInput(this, "\t"); | |||
return false; | |||
} | |||
}); | |||
function allowTabChar(el) { | |||
$(el).keydown(function(e) { | |||
if (e.which == 9) { | |||
pasteIntoInput(this, "\t"); | |||
return false; | |||
} | |||
}); | |||
// For Opera, which only allows suppression of keypress events, not keydown | |||
$(el).keypress(function(e) { | |||
if (e.which == 9) { | |||
return false; | |||
} | |||
}); | |||
} | |||
// For Opera, which only allows suppression of keypress events, not keydown | |||
$(el).keypress(function(e) { | |||
if (e.which == 9) { | |||
return false; | |||
} | |||
}); | |||
} | |||
$.fn.allowTabs = function() { | |||
if (this.jquery) { | |||
this.each(function() { | |||
if (this.nodeType == 1) { | |||
var nodeName = this.nodeName.toLowerCase(); | |||
if (nodeName == "textarea" || (nodeName == "input" && this.type == "text")) { | |||
allowTabChar(this); | |||
} | |||
} | |||
}) | |||
} | |||
return this; | |||
} | |||
$.fn.allowTabs = function() { | |||
if (this.jquery) { | |||
this.each(function() { | |||
if (this.nodeType == 1) { | |||
var nodeName = this.nodeName.toLowerCase(); | |||
if (nodeName == "textarea" || (nodeName == "input" && this.type == "text")) { | |||
allowTabChar(this); | |||
} | |||
} | |||
}) | |||
} | |||
return this; | |||
} | |||
})(jQuery); |
@@ -3,7 +3,7 @@ frappe.provide("frappe.utils") | |||
frappe.utils.Feedback = Class.extend({ | |||
resend_feedback_request: function(doc) { | |||
/* resend the feedback request email */ | |||
args = { | |||
var args = { | |||
reference_name: doc.reference_name, | |||
reference_doctype: doc.reference_doctype, | |||
request: doc.feedback_request, | |||
@@ -14,12 +14,12 @@ frappe.utils.Feedback = Class.extend({ | |||
manual_feedback_request: function(doc) { | |||
var me = this; | |||
args = { | |||
var args = { | |||
reference_doctype: doc.doctype, | |||
reference_name: doc.name | |||
} | |||
if(frappe.boot.feedback_triggers[doc.doctype]) { | |||
feedback_trigger = frappe.boot.feedback_triggers[doc.doctype] | |||
var feedback_trigger = frappe.boot.feedback_triggers[doc.doctype] | |||
$.extend(args, { trigger: feedback_trigger }) | |||
me.get_feedback_request_details(args, false) | |||
} else{ | |||
@@ -43,7 +43,7 @@ frappe.utils.Feedback = Class.extend({ | |||
make_feedback_request_dialog: function(args, is_resend) { | |||
var me = this; | |||
dialog = new frappe.ui.Dialog({ | |||
var dialog = new frappe.ui.Dialog({ | |||
title: __("{0} Feedback Request", [ is_resend? "Resend": "Send" ]), | |||
fields: [ | |||
{ | |||
@@ -18,7 +18,7 @@ frappe.ui.form.Control = Class.extend({ | |||
// if developer_mode=1, show fieldname as tooltip | |||
if(frappe.boot.user && frappe.boot.user.name==="Administrator" && | |||
frappe.boot.developer_mode===1 && this.$wrapper) { | |||
this.$wrapper.attr("title", __(this.df.fieldname)); | |||
this.$wrapper.attr("title", __(this.df.fieldname)); | |||
} | |||
if(this.render_input) { | |||
@@ -75,8 +75,9 @@ frappe.ui.form.Control = Class.extend({ | |||
if (this.doctype && status==="Read" && !this.only_input | |||
&& is_null(frappe.model.get_value(this.doctype, this.docname, this.df.fieldname)) | |||
&& !in_list(["HTML", "Image"], this.df.fieldtype)) { | |||
if(explain) console.log("By Hide Read-only, null fields: None"); | |||
status = "None"; | |||
if(explain) console.log("By Hide Read-only, null fields: None"); | |||
status = "None"; | |||
} | |||
return status; | |||
@@ -189,19 +190,19 @@ frappe.ui.form.ControlImage = frappe.ui.form.Control.extend({ | |||
this.$body = $("<div></div>").appendTo(this.$wrapper) | |||
.css({"margin-bottom": "10px"}) | |||
this.$wrapper.on("refresh", function() { | |||
var doc = null; | |||
me.$body.empty(); | |||
var doc = null; | |||
me.$body.empty(); | |||
var doc = me.get_doc(); | |||
if(doc && me.df.options && doc[me.df.options]) { | |||
me.$img = $("<img src='"+doc[me.df.options]+"' class='img-responsive'>") | |||
.appendTo(me.$body); | |||
} else { | |||
me.$buffer = $("<div class='missing-image'><i class='octicon octicon-circle-slash'></i></div>") | |||
.appendTo(me.$body) | |||
} | |||
return false; | |||
}); | |||
var doc = me.get_doc(); | |||
if(doc && me.df.options && doc[me.df.options]) { | |||
me.$img = $("<img src='"+doc[me.df.options]+"' class='img-responsive'>") | |||
.appendTo(me.$body); | |||
} else { | |||
me.$buffer = $("<div class='missing-image'><i class='octicon octicon-circle-slash'></i></div>") | |||
.appendTo(me.$body) | |||
} | |||
return false; | |||
}); | |||
$('<div class="clearfix"></div>').appendTo(this.$wrapper); | |||
} | |||
}); | |||
@@ -430,7 +431,7 @@ frappe.ui.form.ControlData = frappe.ui.form.ControlInput.extend({ | |||
if (in_list(['Data', 'Link', 'Dynamic Link', 'Password', 'Select', 'Read Only', 'Attach', 'Attach Image'], | |||
this.df.fieldtype)) { | |||
this.$input.attr("maxlength", this.df.length || 140); | |||
this.$input.attr("maxlength", this.df.length || 140); | |||
} | |||
this.set_input_attributes(); | |||
@@ -476,7 +477,7 @@ frappe.ui.form.ControlData = frappe.ui.form.ControlInput.extend({ | |||
callback(""); | |||
return; | |||
} | |||
v1 = '' | |||
var v1 = '' | |||
// phone may start with + and must only have numbers later, '-' and ' ' are stripped | |||
v = v.replace(/ /g, '').replace(/-/g, '').replace(/\(/g, '').replace(/\)/g, ''); | |||
@@ -507,7 +508,7 @@ frappe.ui.form.ControlData = frappe.ui.form.ControlInput.extend({ | |||
var invalid_email = false; | |||
email_list.forEach(function(email) { | |||
if (!validate_email(email)) { | |||
msgprint(__("Invalid Email: {0}", [email])); | |||
frappe.msgprint(__("Invalid Email: {0}", [email])); | |||
invalid_email = true; | |||
} | |||
}); | |||
@@ -671,18 +672,18 @@ frappe.ui.form.ControlDate = frappe.ui.form.ControlData.extend({ | |||
}, | |||
parse: function(value) { | |||
if(value) { | |||
return dateutil.user_to_str(value); | |||
return frappe.datetime.user_to_str(value); | |||
} | |||
}, | |||
format_for_input: function(value) { | |||
if(value) { | |||
return dateutil.str_to_user(value); | |||
return frappe.datetime.str_to_user(value); | |||
} | |||
return ""; | |||
}, | |||
validate: function(value, callback) { | |||
if(value && !dateutil.validate(value)) { | |||
msgprint (__("Date must be in format: {0}", [sys_defaults.date_format || "yyyy-mm-dd"])); | |||
if(value && !frappe.datetime.validate(value)) { | |||
frappe.msgprint(__("Date must be in format: {0}", [frappe.sys_defaults.date_format || "yyyy-mm-dd"])); | |||
callback(""); | |||
return; | |||
} | |||
@@ -733,14 +734,14 @@ frappe.ui.form.ControlDatetime = frappe.ui.form.ControlDate.extend({ | |||
parse: function(value) { | |||
if(value) { | |||
// parse and convert | |||
value = dateutil.convert_to_system_tz(dateutil.user_to_str(value)); | |||
value = frappe.datetime.convert_to_system_tz(frappe.datetime.user_to_str(value)); | |||
} | |||
return value; | |||
}, | |||
format_for_input: function(value) { | |||
if(value) { | |||
// convert and format | |||
value = dateutil.str_to_user(dateutil.convert_to_user_tz(value)); | |||
value = frappe.datetime.str_to_user(frappe.datetime.convert_to_user_tz(value)); | |||
} | |||
return value || ""; | |||
} | |||
@@ -789,16 +790,16 @@ frappe.ui.form.ControlDateRange = frappe.ui.form.ControlData.extend({ | |||
}, | |||
parse: function(value) { | |||
if(value && (value.indexOf(',') !== -1 || value.indexOf('to') !== -1)) { | |||
vals = value.split(/[( to )(,)]/) | |||
from_date = moment(dateutil.user_to_obj(vals[0])).format('YYYY-MM-DD'); | |||
to_date = moment(dateutil.user_to_obj(vals[vals.length-1])).format('YYYY-MM-DD'); | |||
var vals = value.split(/[( to )(,)]/) | |||
var from_date = moment(frappe.datetime.user_to_obj(vals[0])).format('YYYY-MM-DD'); | |||
var to_date = moment(frappe.datetime.user_to_obj(vals[vals.length-1])).format('YYYY-MM-DD'); | |||
return [from_date, to_date]; | |||
} | |||
}, | |||
format_for_input: function(value,value2) { | |||
if(value && value2) { | |||
value = dateutil.str_to_user(value); | |||
value2 = dateutil.str_to_user(value2); | |||
value = frappe.datetime.str_to_user(value); | |||
value2 = frappe.datetime.str_to_user(value2); | |||
return value + " to " + value2 | |||
} | |||
return ""; | |||
@@ -1025,7 +1026,7 @@ frappe.ui.form.ControlAttach = frappe.ui.form.ControlData.extend({ | |||
me.dialog.hide(); | |||
me.frm.save(); | |||
} else { | |||
msgprint(__("Please attach a file or set a URL")); | |||
frappe.msgprint(__("Please attach a file or set a URL")); | |||
} | |||
}, | |||
callback: function(attachment, r) { | |||
@@ -1346,7 +1347,7 @@ frappe.ui.form.ControlLink = frappe.ui.form.ControlData.extend({ | |||
return true; | |||
}, | |||
item: function (item, input) { | |||
d = this.get_item(item.value); | |||
var d = this.get_item(item.value); | |||
if(!d.label) { d.label = d.value; } | |||
var _label = (me.translate_values) ? __(d.label) : d.label; | |||
@@ -1408,7 +1409,7 @@ frappe.ui.form.ControlLink = frappe.ui.form.ControlData.extend({ | |||
value: "create_new__link_option", | |||
action: me.new_doc | |||
}) | |||
}; | |||
} | |||
// advanced search | |||
r.results.push({ | |||
label: "<span class='text-primary link-option'>" | |||
@@ -1591,7 +1592,7 @@ frappe.ui.form.ControlDynamicLink = frappe.ui.form.ControlLink.extend({ | |||
} | |||
var options = frappe.model.get_value(this.df.parent, this.docname, this.df.options); | |||
// if(!options) { | |||
// msgprint(__("Please set {0} first", | |||
// frappe.msgprint(__("Please set {0} first", | |||
// [frappe.meta.get_docfield(this.df.parent, this.df.options, this.docname).label])); | |||
// } | |||
return options; | |||
@@ -1797,7 +1798,7 @@ frappe.ui.form.ControlTextEditor = frappe.ui.form.ControlCode.extend({ | |||
me.editor.summernote('insertImage', selected); | |||
me.image_dialog.hide(); | |||
} else { | |||
msgprint(__("Please attach a file or set a URL")); | |||
frappe.msgprint(__("Please attach a file or set a URL")); | |||
} | |||
}, | |||
callback: function(attachment, r) { | |||
@@ -1908,9 +1909,9 @@ frappe.ui.form.ControlSignature = frappe.ui.form.ControlData.extend({ | |||
// make jSignature field | |||
this.$pad = $('<div class="signature-field"></div>') | |||
.appendTo(me.wrapper) | |||
.jSignature({height:300, width: "100%", "lineWidth": 0.8}) | |||
.on('change', this.on_save_sign.bind(this)); | |||
.appendTo(me.wrapper) | |||
.jSignature({height:300, width: "100%", "lineWidth": 0.8}) | |||
.on('change', this.on_save_sign.bind(this)); | |||
this.img_wrapper = $(`<div class="signature-display"> | |||
<div class="missing-image attach-missing-image"> | |||
@@ -1938,7 +1939,7 @@ frappe.ui.form.ControlSignature = frappe.ui.form.ControlData.extend({ | |||
this.set_editable(this.get_status()=="Write"); | |||
this.load_pad(); | |||
if(this.get_status()=="Read") { | |||
$(this.disp_area).toggle(false); | |||
$(this.disp_area).toggle(false); | |||
} | |||
}, | |||
set_image: function(value) { | |||
@@ -1976,15 +1977,15 @@ frappe.ui.form.ControlSignature = frappe.ui.form.ControlData.extend({ | |||
} | |||
}, | |||
set_editable: function(editable) { | |||
this.$pad.toggle(editable); | |||
this.img_wrapper.toggle(!editable); | |||
this.$btnWrapper.toggle(editable); | |||
if (editable) { | |||
this.$btnWrapper.addClass('editing'); | |||
} | |||
else { | |||
this.$btnWrapper.removeClass('editing'); | |||
} | |||
this.$pad.toggle(editable); | |||
this.img_wrapper.toggle(!editable); | |||
this.$btnWrapper.toggle(editable); | |||
if (editable) { | |||
this.$btnWrapper.addClass('editing'); | |||
} | |||
else { | |||
this.$btnWrapper.removeClass('editing'); | |||
} | |||
}, | |||
set_my_value: function(value) { | |||
if (this.saving || this.loading) return; | |||
@@ -259,7 +259,7 @@ frappe.ui.form.Dashboard = Class.extend({ | |||
group.items.forEach(function(item) { items.push(item); }); | |||
}); | |||
method = this.data.method || 'frappe.desk.notifications.get_open_count'; | |||
var method = this.data.method || 'frappe.desk.notifications.get_open_count'; | |||
frappe.call({ | |||
type: "GET", | |||
@@ -359,7 +359,7 @@ frappe.ui.form.Dashboard = Class.extend({ | |||
} else { | |||
heatmap_message.addClass('hidden'); | |||
} | |||
} | |||
} | |||
}, | |||
add_indicator: function(label, color) { | |||
@@ -370,6 +370,7 @@ frappe.ui.form.Dashboard = Class.extend({ | |||
// set colspan | |||
var indicators = this.stats_area_row.find('.indicator-column'); | |||
var n_indicators = indicators.length + 1; | |||
var colspan; | |||
if(n_indicators > 4) { colspan = 3 } | |||
else { colspan = 12 / n_indicators; } | |||
@@ -55,13 +55,13 @@ frappe.ui.form.AssignTo = Class.extend({ | |||
</li>', info)) | |||
.insertBefore(this.parent.find('.add-assignment')); | |||
if(d[i].owner===user) { | |||
if(d[i].owner===frappe.session.user) { | |||
me.primary_action = this.frm.page.add_menu_item(__("Assignment Complete"), function() { | |||
me.remove(user); | |||
me.remove(frappe.session.user); | |||
}, "fa fa-check", "btn-success") | |||
} | |||
if(!(d[i].owner === user || me.frm.perm[0].write)) { | |||
if(!(d[i].owner === frappe.session.user || me.frm.perm[0].write)) { | |||
me.parent.find('a.close').remove(); | |||
} | |||
} | |||
@@ -164,7 +164,7 @@ frappe.ui.form.AssignToDialog = Class.extend({ | |||
toggle_myself: function(myself) { | |||
var me = this; | |||
if($(myself).prop("checked")) { | |||
me.set_value("assign_to", user); | |||
me.set_value("assign_to", frappe.session.user); | |||
me.set_value("notify", 0); | |||
me.get_field("notify").$wrapper.toggle(false); | |||
me.get_field("assign_to").$wrapper.toggle(false); | |||
@@ -18,7 +18,7 @@ frappe.ui.form.Attachments = Class.extend({ | |||
}, | |||
max_reached: function() { | |||
// no of attachments | |||
var n = keys(this.get_attachments()).length; | |||
var n = Object.keys(this.get_attachments()).length; | |||
// button if the number of attachments is less than max | |||
if(n < this.frm.meta.max_attachments || !this.frm.meta.max_attachments) { | |||
@@ -135,7 +135,7 @@ frappe.ui.form.Attachments = Class.extend({ | |||
callback: function(r,rt) { | |||
if(r.exc) { | |||
if(!r._server_messages) | |||
msgprint(__("There were errors")); | |||
frappe.msgprint(__("There were errors")); | |||
return; | |||
} | |||
me.remove_fileid(fileid); | |||
@@ -207,13 +207,13 @@ frappe.ui.form.Attachments = Class.extend({ | |||
}); | |||
frappe.ui.get_upload_dialog = function(opts){ | |||
dialog = new frappe.ui.Dialog({ | |||
title: __('Upload Attachment'), | |||
var dialog = new frappe.ui.Dialog({ | |||
title: __('Upload Attachment'), | |||
no_focus: true, | |||
fields: [ | |||
fields: [ | |||
{fieldtype: "Section Break"}, | |||
{"fieldtype": "Link" , "fieldname": "file" , "label": __("Select uploaded file"), "options": "File"}, | |||
], | |||
], | |||
}); | |||
var btn = dialog.set_primary_action(__("Attach")); | |||
@@ -224,22 +224,22 @@ frappe.ui.get_upload_dialog = function(opts){ | |||
var fd = dialog.fields_dict; | |||
$(fd.file.input).change(function() { | |||
frappe.call({ | |||
frappe.call({ | |||
'method': 'frappe.client.get_value', | |||
'args': { | |||
'doctype': 'File', | |||
'fieldname': ['file_url','file_name','is_private'], | |||
'filters': { | |||
'name': dialog.get_value("file") | |||
} | |||
'doctype': 'File', | |||
'fieldname': ['file_url','file_name','is_private'], | |||
'filters': { | |||
'name': dialog.get_value("file") | |||
} | |||
}, | |||
callback: function(r){ | |||
if(!r.message) return; | |||
dialog.$wrapper.find('[name="file_url"]').val(r.message.file_url); | |||
dialog.$wrapper.find('[name="file_url"]').val(r.message.file_url); | |||
dialog.$wrapper.find('.private-file input').prop('checked', r.message.is_private); | |||
opts.args.filename = r.message.file_name | |||
} | |||
}); | |||
}); | |||
}); | |||
frappe.upload.make({ | |||
parent: upload_area, | |||
@@ -76,10 +76,10 @@ frappe.ui.form.Timeline = Class.extend({ | |||
setup_email_button: function() { | |||
var me = this; | |||
selector = this.frm.doctype === "Communication"? ".btn-reply-email": ".btn-new-email" | |||
var selector = this.frm.doctype === "Communication"? ".btn-reply-email": ".btn-new-email" | |||
this.email_button = this.wrapper.find(selector) | |||
.on("click", function() { | |||
args = { | |||
var args = { | |||
doc: me.frm.doc, | |||
frm: me.frm, | |||
recipients: me.get_recipient() | |||
@@ -116,13 +116,13 @@ frappe.ui.form.Timeline = Class.extend({ | |||
var communications = this.get_communications(true); | |||
$.each(communications.sort(function(a, b) { return a.creation > b.creation ? -1 : 1 }), | |||
function(i, c) { | |||
if(c.content) { | |||
c.frm = me.frm; | |||
me.render_timeline_item(c); | |||
} | |||
}); | |||
communications | |||
.sort((a, b) => a.creation > b.creation ? -1 : 1) | |||
.filter(c => c.content) | |||
.forEach(c => { | |||
c.frm = me.frm; | |||
me.render_timeline_item(c); | |||
}); | |||
// more btn | |||
if (this.more===undefined && communications.length===20) { | |||
@@ -309,7 +309,7 @@ frappe.ui.form.Timeline = Class.extend({ | |||
c._liked_by = JSON.parse(c._liked_by || "[]"); | |||
} | |||
c.liked_by_user = c._liked_by.indexOf(user)!==-1; | |||
c.liked_by_user = c._liked_by.indexOf(frappe.session.user)!==-1; | |||
} | |||
} | |||
@@ -453,7 +453,7 @@ frappe.ui.form.Timeline = Class.extend({ | |||
p[0], me.frm.docname); | |||
if(df && !df.hidden) { | |||
field_display_status = frappe.perm.get_field_display_status(df, | |||
var field_display_status = frappe.perm.get_field_display_status(df, | |||
null, me.frm.perm); | |||
if(field_display_status === 'Read' || field_display_status === 'Write') { | |||
@@ -535,7 +535,7 @@ frappe.ui.form.Timeline = Class.extend({ | |||
reference_doctype: this.frm.doctype, | |||
reference_name: this.frm.docname, | |||
content: comment, | |||
sender: user | |||
sender: frappe.session.user | |||
} | |||
}, | |||
btn: btn, | |||
@@ -41,7 +41,7 @@ | |||
</span> | |||
<span class="text-muted" style="font-weight: normal;"> | |||
– {%= data.comment_on %}</span> | |||
{% if(inList(["Communication", "Feedback"], data.communication_type)) { %} | |||
{% if(in_list(["Communication", "Feedback"], data.communication_type)) { %} | |||
{% if (frappe.model.can_read(\'Communication\')) { %} | |||
<a href="#Form/{%= data.doctype %}/{%= data.name %}" | |||
class="text-muted"> | |||
@@ -43,9 +43,9 @@ frappe.ui.form.Viewers = Class.extend({ | |||
if (data_updated && new_users.length) { | |||
// new user viewing this document, who wasn't viewing in the past | |||
if (new_users.length===1) { | |||
show_alert(__("{0} is currently viewing this document", [new_users[0]])); | |||
frappe.show_alert(__("{0} is currently viewing this document", [new_users[0]])); | |||
} else { | |||
show_alert(__("{0} are currently viewing this document", [frappe.utils.comma_and(new_users)])); | |||
frappe.show_alert(__("{0} are currently viewing this document", [frappe.utils.comma_and(new_users)])); | |||
} | |||
} | |||
@@ -56,15 +56,9 @@ frappe.ui.form.set_viewers = function(data) { | |||
var doctype = data.doctype; | |||
var docname = data.docname; | |||
var past_viewers = (frappe.model.get_docinfo(doctype, docname).viewers || {}).past || []; | |||
var new_viewers = []; | |||
var viewers = data.viewers || []; | |||
for (i=0, l=viewers.length; i < l; i++) { | |||
var username = viewers[i]; | |||
if (past_viewers.indexOf(username)===-1) { | |||
new_viewers.push(username); | |||
} | |||
} | |||
var new_viewers = viewers.filter(viewer => !past_viewers.includes(viewer)); | |||
frappe.model.set_docinfo(doctype, docname, "viewers", { | |||
past: past_viewers.concat(new_viewers), | |||
@@ -99,7 +99,7 @@ frappe.form.formatters = { | |||
}, | |||
Date: function(value) { | |||
if (value) { | |||
value = dateutil.str_to_user(value); | |||
value = frappe.datetime.str_to_user(value); | |||
// handle invalid date | |||
if (value==="Invalid date") { | |||
value = null; | |||
@@ -110,7 +110,7 @@ frappe.form.formatters = { | |||
}, | |||
Datetime: function(value) { | |||
if(value) { | |||
var m = moment(dateutil.convert_to_user_tz(value)); | |||
var m = moment(frappe.datetime.convert_to_user_tz(value)); | |||
if(frappe.boot.sysdefaults.time_zone) { | |||
m = m.tz(frappe.boot.sysdefaults.time_zone); | |||
} | |||
@@ -182,7 +182,7 @@ frappe.form.formatters = { | |||
return "<pre>" + (value==null ? "" : $("<div>").text(value).html()) + "</pre>" | |||
}, | |||
WorkflowState: function(value) { | |||
workflow_state = frappe.get_doc("Workflow State", value); | |||
var workflow_state = frappe.get_doc("Workflow State", value); | |||
if(workflow_state) { | |||
return repl("<span class='label label-%(style)s' \ | |||
data-workflow-state='%(value)s'\ | |||
@@ -217,7 +217,7 @@ frappe.format = function(value, df, options, doc) { | |||
df._options = doc ? doc[df.options] : null; | |||
} | |||
formatter = df.formatter || frappe.form.get_formatter(fieldtype); | |||
var formatter = df.formatter || frappe.form.get_formatter(fieldtype); | |||
var formatted = formatter(value, df, options, doc); | |||
@@ -231,7 +231,7 @@ frappe.get_format_helper = function(doc) { | |||
var helper = { | |||
get_formatted: function(fieldname) { | |||
var df = frappe.meta.get_docfield(doc.doctype, fieldname); | |||
if(!df) { console.log("fieldname not found: " + fieldname); }; | |||
if(!df) { console.log("fieldname not found: " + fieldname); } | |||
return frappe.format(doc[fieldname], df, {inline:1}, doc); | |||
} | |||
}; | |||
@@ -31,7 +31,7 @@ frappe.ui.form.Grid = Class.extend({ | |||
this.multiple_set = false; | |||
if(this.frm && 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]; | |||
this.template = this.frm.meta.__form_grid_templates[this.df.fieldname]; | |||
} | |||
this.is_grid = true; | |||
@@ -72,7 +72,7 @@ frappe.ui.form.Grid = Class.extend({ | |||
setup_check: function() { | |||
var me = this; | |||
this.wrapper.on('click', '.grid-row-check', function(e) { | |||
$check = $(this); | |||
var $check = $(this); | |||
if($check.parents('.grid-heading-row:first').length!==0) { | |||
// select all? | |||
var checked = $check.prop('checked'); | |||
@@ -102,7 +102,7 @@ frappe.ui.form.Grid = Class.extend({ | |||
}); | |||
}, | |||
select_row: function(name) { | |||
me.grid_rows_by_docname[name].select(); | |||
this.grid_rows_by_docname[name].select(); | |||
}, | |||
refresh_remove_rows_button: function() { | |||
this.remove_rows_button.toggleClass('hide', | |||
@@ -345,11 +345,11 @@ frappe.ui.form.Grid = Class.extend({ | |||
this.refresh(); | |||
}, | |||
toggle_enable: function(fieldname, enable) { | |||
this.get_docfield(fieldname).read_only = enable ? 0 : 1;; | |||
this.get_docfield(fieldname).read_only = enable ? 0 : 1; | |||
this.refresh(); | |||
}, | |||
toggle_display: function(fieldname, show) { | |||
this.get_docfield(fieldname).hidden = show ? 0 : 1;; | |||
this.get_docfield(fieldname).hidden = show ? 0 : 1; | |||
this.refresh(); | |||
}, | |||
get_docfield: function(fieldname) { | |||
@@ -428,27 +428,25 @@ frappe.ui.form.Grid = Class.extend({ | |||
&& (this.editable_fields || df.in_list_view) | |||
&& (this.frm && this.frm.get_perm(df.permlevel, "read") || !this.frm) | |||
&& !in_list(frappe.model.layout_fields, df.fieldtype)) { | |||
if(df.columns) { | |||
df.colsize=df.columns; | |||
} | |||
else { | |||
var colsize=2; | |||
switch(df.fieldtype){ | |||
case"Text": | |||
case"Small Text": | |||
colsize=3; | |||
break; | |||
case"Check": | |||
colsize=1 | |||
} | |||
df.colsize=colsize | |||
} | |||
total_colsize += df.colsize | |||
if(total_colsize > 11) | |||
return false; | |||
this.visible_columns.push([df, df.colsize]); | |||
if(df.columns) { | |||
df.colsize=df.columns; | |||
} | |||
else { | |||
var colsize = 2; | |||
switch(df.fieldtype) { | |||
case "Text": | |||
case "Small Text": colsize = 3; break; | |||
case"Check": colsize = 1; | |||
} | |||
df.colsize = colsize; | |||
} | |||
total_colsize += df.colsize; | |||
if(total_colsize > 11) | |||
return false; | |||
this.visible_columns.push([df, df.colsize]); | |||
} | |||
} | |||
// redistribute if total-col size is less than 12 | |||
@@ -586,7 +584,7 @@ frappe.ui.form.Grid = Class.extend({ | |||
// add data | |||
$.each(me.frm.doc[me.df.fieldname] || [], function(i, d) { | |||
row = []; | |||
var row = []; | |||
$.each(data[2], function(i, fieldname) { | |||
var value = d[fieldname]; | |||
@@ -759,9 +757,10 @@ frappe.ui.form.GridRow = Class.extend({ | |||
// index (1, 2, 3 etc) | |||
if(!this.row_index) { | |||
var txt = (this.doc ? this.doc.idx : " "); | |||
this.row_index = $('<div class="row-index sortable-handle col col-xs-1">' + | |||
this.row_check_html + | |||
' <span>' + txt + '</span></div>') | |||
this.row_index = $( | |||
`<div class="row-index sortable-handle col col-xs-1"> | |||
${this.row_check_html} | |||
<span>${txt}</span></div>`) | |||
.appendTo(this.row) | |||
.on('click', function(e) { | |||
if(!$(e.target).hasClass('grid-row-check')) { | |||
@@ -852,7 +851,7 @@ frappe.ui.form.GridRow = Class.extend({ | |||
add_class += (["Check"].indexOf(df.fieldtype)!==-1) ? | |||
" text-center": ""; | |||
$col = $('<div class="col grid-static-col col-xs-'+colsize+' '+add_class+'"></div>') | |||
var $col = $('<div class="col grid-static-col col-xs-'+colsize+' '+add_class+'"></div>') | |||
.attr("data-fieldname", df.fieldname) | |||
.attr("data-fieldtype", df.fieldtype) | |||
.data("df", df) | |||
@@ -861,7 +860,7 @@ frappe.ui.form.GridRow = Class.extend({ | |||
if(frappe.ui.form.editable_row===me) { | |||
return; | |||
} | |||
out = me.toggle_editable_row(); | |||
var out = me.toggle_editable_row(); | |||
var col = this; | |||
setTimeout(function() { | |||
$(col).find('input[type="Text"]:first').focus(); | |||
@@ -890,7 +889,7 @@ frappe.ui.form.GridRow = Class.extend({ | |||
if(frappe.ui.form.editable_row | |||
&& frappe.ui.form.editable_row !== this) { | |||
frappe.ui.form.editable_row.toggle_editable_row(false); | |||
}; | |||
} | |||
this.row.toggleClass('editable-row', true); | |||
@@ -942,15 +941,15 @@ frappe.ui.form.GridRow = Class.extend({ | |||
field.get_query = this.grid.get_field(df.fieldname).get_query; | |||
field.refresh(); | |||
if(field.$input) { | |||
field.$input.addClass('input-sm'); | |||
field.$input | |||
.addClass('input-sm') | |||
.attr('data-col-idx', column.column_index) | |||
.attr('placeholder', __(df.label)); | |||
// flag list input | |||
if (this.columns_list && this.columns_list.slice(-1)[0]===column) { | |||
field.$input.attr('data-last-input', 1); | |||
} | |||
// flag list input | |||
if (this.columns_list && this.columns_list.slice(-1)[0]===column) { | |||
field.$input.attr('data-last-input', 1); | |||
} | |||
} | |||
this.set_arrow_keys(field); | |||
@@ -964,6 +963,7 @@ frappe.ui.form.GridRow = Class.extend({ | |||
var me = this; | |||
if(field.$input) { | |||
field.$input.on('keydown', function(e) { | |||
var { TAB, UP_ARROW, DOWN_ARROW } = frappe.ui.keyCode; | |||
if(!in_list([TAB, UP_ARROW, DOWN_ARROW], e.which)) { | |||
return; | |||
} | |||
@@ -54,18 +54,14 @@ frappe.ui.form.Layout = Class.extend({ | |||
this.make_section(); | |||
} | |||
$.each(this.fields, function(i, df) { | |||
switch(df.fieldtype) { | |||
case "Fold": | |||
me.make_page(df); | |||
break; | |||
case "Section Break": | |||
me.make_section(df); | |||
break; | |||
case "Column Break": | |||
me.make_column(df); | |||
break; | |||
default: | |||
me.make_field(df); | |||
if(df.fieldtype === "Fold") { | |||
me.make_page(df); | |||
} else if (df.fieldtype === "Section Break") { | |||
me.make_section(df); | |||
} else if (df.fieldtype === "Column Break") { | |||
me.make_column(df); | |||
} else { | |||
me.make_field(df); | |||
} | |||
}); | |||
@@ -225,7 +221,7 @@ frappe.ui.form.Layout = Class.extend({ | |||
if(me.frm) { | |||
fieldobj.perm = me.frm.perm; | |||
} | |||
}; | |||
} | |||
refresh && fieldobj.refresh && fieldobj.refresh(); | |||
} | |||
}, | |||
@@ -249,7 +245,7 @@ frappe.ui.form.Layout = Class.extend({ | |||
}, | |||
handle_tab: function(doctype, fieldname, shift) { | |||
var me = this, | |||
grid_row = null; | |||
grid_row = null, | |||
prev = null, | |||
fields = me.fields_list, | |||
in_grid = false, | |||
@@ -357,7 +353,7 @@ frappe.ui.form.Layout = Class.extend({ | |||
// build dependants' dictionary | |||
var has_dep = false; | |||
for(fkey in this.fields_list) { | |||
for(var fkey in this.fields_list) { | |||
var f = this.fields_list[fkey]; | |||
f.dependencies_clear = true; | |||
if(f.df.depends_on) { | |||
@@ -409,7 +405,7 @@ frappe.ui.form.Layout = Class.extend({ | |||
if(expression.substr(0,5)=='eval:') { | |||
out = eval(expression.substr(5)); | |||
} else if(expression.substr(0,3)=='fn:' && me.frm) { | |||
} else if(expression.substr(0,3)=='fn:' && this.frm) { | |||
out = this.frm.script_manager.trigger(expression.substr(3), this.doctype, this.docname); | |||
} else { | |||
var value = doc[expression]; | |||
@@ -2,22 +2,24 @@ | |||
// MIT License. See license.txt | |||
frappe.ui.form.LinkSelector = Class.extend({ | |||
init: function(opts) { | |||
init: function (opts) { | |||
/* help: Options: doctype, get_query, target */ | |||
$.extend(this, opts); | |||
var me = this; | |||
if(this.doctype!="[Select]") { | |||
frappe.model.with_doctype(this.doctype, function(r) { | |||
if (this.doctype != "[Select]") { | |||
frappe.model.with_doctype(this.doctype, function (r) { | |||
me.make(); | |||
}); | |||
} else { | |||
this.make(); | |||
} | |||
}, | |||
make: function() { | |||
make: function () { | |||
var me = this; | |||
this.dialog = new frappe.ui.Dialog({ | |||
title: __("Select {0}", [(this.doctype=='[Select]') ? __("value") : __(this.doctype)]), | |||
title: __("Select {0}", [(this.doctype == '[Select]') ? __("value") : __(this.doctype)]), | |||
fields: [ | |||
{ | |||
fieldtype: "Data", fieldname: "txt", label: __("Beginning with"), | |||
@@ -28,46 +30,45 @@ frappe.ui.form.LinkSelector = Class.extend({ | |||
} | |||
], | |||
primary_action_label: __("Search"), | |||
primary_action: function() { | |||
primary_action: function () { | |||
me.search(); | |||
} | |||
}); | |||
me = this; | |||
if(this.txt) | |||
if (this.txt) | |||
this.dialog.fields_dict.txt.set_input(this.txt); | |||
this.dialog.get_input("txt").on("keypress", function(e) { | |||
if(e.which===13) { | |||
this.dialog.get_input("txt").on("keypress", function (e) { | |||
if (e.which === 13) { | |||
me.search(); | |||
} | |||
}); | |||
this.dialog.show(); | |||
this.search(); | |||
}, | |||
search: function() { | |||
search: function () { | |||
var args = { | |||
txt: this.dialog.fields_dict.txt.get_value(), | |||
searchfield: "name" | |||
}, | |||
me = this; | |||
txt: this.dialog.fields_dict.txt.get_value(), | |||
searchfield: "name" | |||
}; | |||
var me = this; | |||
if(this.target.set_custom_query) { | |||
if (this.target.set_custom_query) { | |||
this.target.set_custom_query(args); | |||
} | |||
// load custom query from grid | |||
if(this.target.is_grid && this.target.fieldinfo[this.fieldname] | |||
if (this.target.is_grid && this.target.fieldinfo[this.fieldname] | |||
&& this.target.fieldinfo[this.fieldname].get_query) { | |||
$.extend(args, | |||
this.target.fieldinfo[this.fieldname].get_query(cur_frm.doc)); | |||
this.target.fieldinfo[this.fieldname].get_query(cur_frm.doc)); | |||
} | |||
frappe.link_search(this.doctype, args, function(r) { | |||
frappe.link_search(this.doctype, args, function (r) { | |||
var parent = me.dialog.fields_dict.results.$wrapper; | |||
parent.empty(); | |||
if(r.values.length) { | |||
$.each(r.values, function(i, v) { | |||
if (r.values.length) { | |||
$.each(r.values, function (i, v) { | |||
var row = $(repl('<div class="row link-select-row">\ | |||
<div class="col-xs-4">\ | |||
<b><a href="#">%(name)s</a></b></div>\ | |||
@@ -80,56 +81,58 @@ frappe.ui.form.LinkSelector = Class.extend({ | |||
row.find("a") | |||
.attr('data-value', v[0]) | |||
.click(function() { | |||
var value = $(this).attr("data-value"); | |||
var $link = this; | |||
if(me.target.is_grid) { | |||
// set in grid | |||
me.set_in_grid(value); | |||
} else { | |||
if(me.target.doctype) | |||
me.target.parse_validate_and_set_in_model(value); | |||
else { | |||
me.target.set_input(value); | |||
me.target.$input.trigger("change"); | |||
.click(function () { | |||
var value = $(this).attr("data-value"); | |||
var $link = this; | |||
if (me.target.is_grid) { | |||
// set in grid | |||
me.set_in_grid(value); | |||
} else { | |||
if (me.target.doctype) | |||
me.target.parse_validate_and_set_in_model(value); | |||
else { | |||
me.target.set_input(value); | |||
me.target.$input.trigger("change"); | |||
} | |||
me.dialog.hide(); | |||
} | |||
me.dialog.hide(); | |||
} | |||
return false; | |||
}) | |||
return false; | |||
}) | |||
}) | |||
} else { | |||
$('<p><br><span class="text-muted">' + __("No Results") + '</span>' | |||
+ (frappe.model.can_create(me.doctype) ? | |||
('<br><br><a class="new-doc btn btn-default btn-sm">' | |||
+ __("Make a new {0}", [__(me.doctype)]) + "</a>") : '') | |||
+ '</p>').appendTo(parent).find(".new-doc").click(function() { | |||
+ __("Make a new {0}", [__(me.doctype)]) + "</a>") : '') | |||
+ '</p>').appendTo(parent).find(".new-doc").click(function () { | |||
me.target.new_doc(); | |||
}); | |||
} | |||
}, this.dialog.get_primary_btn()); | |||
}, | |||
set_in_grid: function(value) { | |||
set_in_grid: function (value) { | |||
var me = this, updated = false; | |||
if(this.qty_fieldname) { | |||
frappe.prompt({fieldname:"qty", fieldtype:"Float", label:"Qty", | |||
"default": 1, reqd: 1}, function(data) { | |||
$.each(me.target.frm.doc[me.target.df.fieldname] || [], function(i, d) { | |||
if(d[me.fieldname]===value) { | |||
if (this.qty_fieldname) { | |||
frappe.prompt({ | |||
fieldname: "qty", fieldtype: "Float", label: "Qty", | |||
"default": 1, reqd: 1 | |||
}, function (data) { | |||
$.each(me.target.frm.doc[me.target.df.fieldname] || [], function (i, d) { | |||
if (d[me.fieldname] === value) { | |||
frappe.model.set_value(d.doctype, d.name, me.qty_fieldname, data.qty); | |||
show_alert(__("Added {0} ({1})", [value, d[me.qty_fieldname]])); | |||
frappe.show_alert(__("Added {0} ({1})", [value, d[me.qty_fieldname]])); | |||
updated = true; | |||
return false; | |||
} | |||
}); | |||
if(!updated) { | |||
if (!updated) { | |||
var d = me.target.add_new_row(); | |||
frappe.model.set_value(d.doctype, d.name, me.fieldname, value); | |||
frappe.after_ajax(function() { | |||
setTimeout(function() { | |||
frappe.after_ajax(function () { | |||
setTimeout(function () { | |||
frappe.model.set_value(d.doctype, d.name, me.qty_fieldname, data.qty); | |||
show_alert(__("Added {0} ({1})", [value, data.qty])); | |||
frappe.show_alert(__("Added {0} ({1})", [value, data.qty])); | |||
}, 100); | |||
}); | |||
} | |||
@@ -137,19 +140,19 @@ frappe.ui.form.LinkSelector = Class.extend({ | |||
} else { | |||
var d = me.target.add_new_row(); | |||
frappe.model.set_value(d.doctype, d.name, me.fieldname, value); | |||
show_alert(__("{0} added", [value])); | |||
frappe.show_alert(__("{0} added", [value])); | |||
} | |||
} | |||
}); | |||
frappe.link_search = function(doctype, args, callback, btn) { | |||
if(!args) { | |||
frappe.link_search = function (doctype, args, callback, btn) { | |||
if (!args) { | |||
args = { | |||
txt: '' | |||
} | |||
} | |||
args.doctype = doctype; | |||
if(!args.searchfield) { | |||
if (!args.searchfield) { | |||
args.searchfield = 'name'; | |||
} | |||
@@ -157,7 +160,7 @@ frappe.link_search = function(doctype, args, callback, btn) { | |||
method: "frappe.desk.search.search_widget", | |||
type: "GET", | |||
args: args, | |||
callback: function(r) { | |||
callback: function (r) { | |||
callback && callback(r); | |||
}, | |||
btn: btn | |||
@@ -1,26 +1,26 @@ | |||
frappe.provide("frappe.ui.form"); | |||
frappe.ui.form.PrintPreview = Class.extend({ | |||
init: function(opts) { | |||
init: function (opts) { | |||
$.extend(this, opts); | |||
this.make(); | |||
this.bind_events(); | |||
}, | |||
make: function() { | |||
make: function () { | |||
this.wrapper = this.frm.page.add_view("print", frappe.render_template("print_layout", {})); | |||
// only system manager can edit | |||
this.wrapper.find(".btn-print-edit").toggle(frappe.user.has_role("System Manager")); | |||
}, | |||
bind_events: function() { | |||
bind_events: function () { | |||
var me = this; | |||
this.wrapper.find(".btn-print-close").click(function() { | |||
this.wrapper.find(".btn-print-close").click(function () { | |||
me.frm.hide_print(); | |||
}); | |||
// hide print view on pressing escape, only if there is no focus on any input | |||
$(document).on("keydown", function(e) { | |||
if (e.which===27 && me.frm && e.target===document.body) { | |||
$(document).on("keydown", function (e) { | |||
if (e.which === 27 && me.frm && e.target === document.body) { | |||
me.frm.hide_print(); | |||
} | |||
}); | |||
@@ -28,78 +28,81 @@ frappe.ui.form.PrintPreview = Class.extend({ | |||
this.print_formats = frappe.meta.get_print_formats(this.frm.meta.name); | |||
this.print_letterhead = this.wrapper | |||
.find(".print-letterhead") | |||
.on("change", function() { me.print_sel.trigger("change"); }) | |||
.on("change", function () { me.print_sel.trigger("change"); }) | |||
.prop("checked", cint( | |||
(frappe.model.get_doc(":Print Settings", "Print Settings") | |||
|| {with_letterhead: 1}).with_letterhead) ? true : false); | |||
|| { with_letterhead: 1 }).with_letterhead) ? true : false); | |||
this.print_sel = this.wrapper | |||
.find(".print-preview-select") | |||
.on("change", function() { | |||
.on("change", function () { | |||
me.multilingual_preview() | |||
}); | |||
//On selection of language get code and pass it to preview method | |||
this.language_sel = this.wrapper | |||
.find(".languages") | |||
.on("change", function(){ | |||
.on("change", function () { | |||
me.lang_code = me.language_sel.val() | |||
me.multilingual_preview() | |||
}); | |||
this.wrapper.find(".btn-print-print").click(function() { | |||
if(me.is_old_style()) { | |||
this.wrapper.find(".btn-print-print").click(function () { | |||
if (me.is_old_style()) { | |||
me.print_old_style(); | |||
} else { | |||
me.printit(); | |||
} | |||
}); | |||
this.wrapper.find(".btn-print-preview").click(function() { | |||
if(me.is_old_style()) { | |||
this.wrapper.find(".btn-print-preview").click(function () { | |||
if (me.is_old_style()) { | |||
me.new_page_preview_old_style(); | |||
} else { | |||
me.new_page_preview(); | |||
} | |||
}); | |||
this.wrapper.find(".btn-download-pdf").click(function() { | |||
if(!me.is_old_style()) { | |||
this.wrapper.find(".btn-download-pdf").click(function () { | |||
if (!me.is_old_style()) { | |||
var w = window.open( | |||
frappe.urllib.get_full_url("/api/method/frappe.utils.print_format.download_pdf?" | |||
+"doctype="+encodeURIComponent(me.frm.doc.doctype) | |||
+"&name="+encodeURIComponent(me.frm.doc.name) | |||
+"&format="+me.selected_format() | |||
+"&no_letterhead="+(me.with_letterhead() ? "0" : "1") | |||
+(me.lang_code ? ("&_lang="+me.lang_code) : ""))); | |||
if(!w) { | |||
msgprint(__("Please enable pop-ups")); return; | |||
+ "doctype=" + encodeURIComponent(me.frm.doc.doctype) | |||
+ "&name=" + encodeURIComponent(me.frm.doc.name) | |||
+ "&format=" + me.selected_format() | |||
+ "&no_letterhead=" + (me.with_letterhead() ? "0" : "1") | |||
+ (me.lang_code ? ("&_lang=" + me.lang_code) : "")) | |||
); | |||
if (!w) { | |||
frappe.msgprint(__("Please enable pop-ups")); return; | |||
} | |||
} | |||
}); | |||
this.wrapper.find(".btn-print-edit").on("click", function() { | |||
this.wrapper.find(".btn-print-edit").on("click", function () { | |||
var print_format = me.get_print_format(); | |||
if(print_format && print_format.name) { | |||
if(print_format.print_format_builder) { | |||
if (print_format && print_format.name) { | |||
if (print_format.print_format_builder) { | |||
frappe.set_route("print-format-builder", print_format.name); | |||
} else { | |||
frappe.set_route("Form", "Print Format", print_format.name); | |||
} | |||
} else { | |||
// start a new print format | |||
frappe.prompt({fieldname:"print_format_name", fieldtype:"Data", reqd: 1, | |||
label:"New Print Format Name"}, function(data) { | |||
frappe.route_options = { | |||
make_new: true, | |||
doctype: me.frm.doctype, | |||
name: data.print_format_name | |||
}; | |||
frappe.set_route("print-format-builder"); | |||
frappe.prompt({ | |||
fieldname: "print_format_name", fieldtype: "Data", reqd: 1, | |||
label: "New Print Format Name" | |||
}, function (data) { | |||
frappe.route_options = { | |||
make_new: true, | |||
doctype: me.frm.doctype, | |||
name: data.print_format_name | |||
}; | |||
frappe.set_route("print-format-builder"); | |||
}, __("New Custom Print Format"), __("Start")); | |||
} | |||
}); | |||
}, | |||
set_user_lang: function(){ | |||
set_user_lang: function () { | |||
this.lang_code = this.frm.doc.language; | |||
// Load all languages in the field | |||
this.language_sel.empty() | |||
@@ -107,9 +110,9 @@ frappe.ui.form.PrintPreview = Class.extend({ | |||
.val(this.lang_code); | |||
this.preview(); | |||
}, | |||
multilingual_preview: function(){ | |||
multilingual_preview: function () { | |||
var me = this; | |||
if(this.is_old_style()) { | |||
if (this.is_old_style()) { | |||
me.wrapper.find(".btn-download-pdf").toggle(false); | |||
me.set_style(); | |||
me.preview_old_style(); | |||
@@ -118,30 +121,30 @@ frappe.ui.form.PrintPreview = Class.extend({ | |||
me.preview(); | |||
} | |||
}, | |||
preview: function() { | |||
preview: function () { | |||
var me = this; | |||
this.get_print_html(function(out) { | |||
this.get_print_html(function (out) { | |||
me.wrapper.find(".print-format").html(out.html); | |||
me.set_style(out.style); | |||
}); | |||
}, | |||
printit: function() { | |||
printit: function () { | |||
this.new_page_preview(true); | |||
}, | |||
new_page_preview: function(printit) { | |||
new_page_preview: function (printit) { | |||
var me = this; | |||
var w = window.open(frappe.urllib.get_full_url("/printview?" | |||
+"doctype="+encodeURIComponent(me.frm.doc.doctype) | |||
+"&name="+encodeURIComponent(me.frm.doc.name) | |||
+(printit ? "&trigger_print=1" : "") | |||
+"&format="+me.selected_format() | |||
+"&no_letterhead="+(me.with_letterhead() ? "0" : "1") | |||
+(me.lang_code ? ("&_lang="+me.lang_code) : ""))); | |||
if(!w) { | |||
msgprint(__("Please enable pop-ups")); return; | |||
+ "doctype=" + encodeURIComponent(me.frm.doc.doctype) | |||
+ "&name=" + encodeURIComponent(me.frm.doc.name) | |||
+ (printit ? "&trigger_print=1" : "") | |||
+ "&format=" + me.selected_format() | |||
+ "&no_letterhead=" + (me.with_letterhead() ? "0" : "1") | |||
+ (me.lang_code ? ("&_lang=" + me.lang_code) : ""))); | |||
if (!w) { | |||
frappe.msgprint(__("Please enable pop-ups")); return; | |||
} | |||
}, | |||
get_print_html: function(callback) { | |||
get_print_html: function (callback) { | |||
frappe.call({ | |||
method: "frappe.www.printview.get_html_and_style", | |||
args: { | |||
@@ -150,21 +153,21 @@ frappe.ui.form.PrintPreview = Class.extend({ | |||
no_letterhead: !this.with_letterhead() ? 1 : 0, | |||
_lang: this.lang_code | |||
}, | |||
callback: function(r) { | |||
if(!r.exc) { | |||
callback: function (r) { | |||
if (!r.exc) { | |||
callback(r.message); | |||
} | |||
} | |||
}); | |||
}, | |||
preview_old_style: function() { | |||
preview_old_style: function () { | |||
var me = this; | |||
this.with_old_style({ | |||
format: me.print_sel.val(), | |||
callback: function(html) { | |||
callback: function (html) { | |||
me.wrapper.find(".print-format").html('<div class="alert alert-warning">' | |||
+__("Warning: This Print Format is in old style and cannot be generated via the API.") | |||
+'</div>' | |||
+ __("Warning: This Print Format is in old style and cannot be generated via the API.") | |||
+ '</div>' | |||
+ html); | |||
}, | |||
no_letterhead: !this.with_letterhead(), | |||
@@ -172,75 +175,75 @@ frappe.ui.form.PrintPreview = Class.extend({ | |||
no_heading: true | |||
}); | |||
}, | |||
refresh_print_options: function() { | |||
refresh_print_options: function () { | |||
this.print_formats = frappe.meta.get_print_formats(this.frm.doctype); | |||
return this.print_sel | |||
.empty().add_options(this.print_formats); | |||
}, | |||
with_old_style: function(opts) { | |||
frappe.require("/assets/js/print_format_v3.min.js", function() { | |||
with_old_style: function (opts) { | |||
frappe.require("/assets/js/print_format_v3.min.js", function () { | |||
_p.build(opts.format, opts.callback, opts.no_letterhead, opts.only_body, opts.no_heading); | |||
}); | |||
}, | |||
print_old_style: function() { | |||
print_old_style: function () { | |||
var me = this; | |||
frappe.require("/assets/js/print_format_v3.min.js", function() { | |||
frappe.require("/assets/js/print_format_v3.min.js", function () { | |||
_p.build(me.print_sel.val(), _p.go, | |||
!me.with_letterhead()); | |||
}); | |||
}, | |||
new_page_preview_old_style: function() { | |||
new_page_preview_old_style: function () { | |||
var me = this; | |||
frappe.require("/assets/js/print_format_v3.min.js", function() { | |||
frappe.require("/assets/js/print_format_v3.min.js", function () { | |||
_p.build(me.print_sel.val(), _p.preview, !me.with_letterhead()); | |||
}); | |||
}, | |||
selected_format: function() { | |||
selected_format: function () { | |||
return this.print_sel.val() || this.frm.meta.default_print_format || "Standard"; | |||
}, | |||
is_old_style: function(format) { | |||
return this.get_print_format(format).print_format_type==="Client"; | |||
is_old_style: function (format) { | |||
return this.get_print_format(format).print_format_type === "Client"; | |||
}, | |||
get_print_format: function(format) { | |||
get_print_format: function (format) { | |||
if (!format) { | |||
format = this.selected_format(); | |||
} | |||
if(locals["Print Format"] && locals["Print Format"][format]) { | |||
if (locals["Print Format"] && locals["Print Format"][format]) { | |||
return locals["Print Format"][format] | |||
} else { | |||
return {} | |||
} | |||
}, | |||
with_letterhead: function() { | |||
with_letterhead: function () { | |||
return this.print_letterhead.is(":checked") ? 1 : 0; | |||
}, | |||
set_style: function(style) { | |||
set_style: function (style) { | |||
frappe.dom.set_style(style || frappe.boot.print_css, "print-style"); | |||
} | |||
}); | |||
frappe.ui.get_print_settings = function(pdf, callback, letter_head) { | |||
frappe.ui.get_print_settings = function (pdf, callback, letter_head) { | |||
var print_settings = locals[":Print Settings"]["Print Settings"]; | |||
var default_letter_head = locals[":Company"] && frappe.defaults.get_default('company') | |||
? locals[":Company"][frappe.defaults.get_default('company')]["default_letter_head"] | |||
: ''; | |||
columns = [{ | |||
var columns = [{ | |||
fieldtype: "Check", | |||
fieldname: "with_letter_head", | |||
label: __("With Letter head") | |||
},{ | |||
}, { | |||
fieldtype: "Select", | |||
fieldname: "letter_head", | |||
label: __("Letter Head"), | |||
depends_on: "with_letter_head", | |||
options: $.map(frappe.boot.letter_heads, function(i,d){ return d }), | |||
options: $.map(frappe.boot.letter_heads, function (i, d) { return d }), | |||
default: letter_head || default_letter_head | |||
}]; | |||
if(pdf) { | |||
if (pdf) { | |||
columns.push({ | |||
fieldtype: "Select", | |||
fieldname: "orientation", | |||
@@ -250,12 +253,12 @@ frappe.ui.get_print_settings = function(pdf, callback, letter_head) { | |||
}) | |||
} | |||
frappe.prompt(columns, function(data) { | |||
frappe.prompt(columns, function (data) { | |||
var data = $.extend(print_settings, data); | |||
if(!data.with_letter_head) { | |||
if (!data.with_letter_head) { | |||
data.letter_head = null; | |||
} | |||
if(data.letter_head) { | |||
if (data.letter_head) { | |||
data.letter_head = frappe.boot.letter_heads[print_settings.letter_head]; | |||
} | |||
callback(data); | |||
@@ -66,7 +66,7 @@ frappe.ui.form.quick_entry = function(doctype, success) { | |||
if(data) { | |||
dialog.working = true; | |||
values = update_doc(); | |||
var values = update_doc(); | |||
frappe.call({ | |||
method: "frappe.client.insert", | |||
args: { | |||
@@ -3,7 +3,7 @@ | |||
frappe.provide("frappe.ui.form"); | |||
frappe.ui.form.save = function(frm, action, callback, btn) { | |||
frappe.ui.form.save = function (frm, action, callback, btn) { | |||
$(btn).prop("disabled", true); | |||
// specified here because there are keyboard shortcuts to save | |||
@@ -17,14 +17,14 @@ frappe.ui.form.save = function(frm, action, callback, btn) { | |||
var freeze_message = working_label ? __(working_label) : ""; | |||
var save = function() { | |||
check_name(function() { | |||
var save = function () { | |||
check_name(function () { | |||
$(frm.wrapper).addClass('validated-form'); | |||
if(check_mandatory()) { | |||
if (check_mandatory()) { | |||
_call({ | |||
method: "frappe.desk.form.save.savedocs", | |||
args: { doc: frm.doc, action:action}, | |||
callback: function(r) { | |||
args: { doc: frm.doc, action: action }, | |||
callback: function (r) { | |||
$(document).trigger("save", [frm.doc]); | |||
callback(r); | |||
}, | |||
@@ -38,7 +38,7 @@ frappe.ui.form.save = function(frm, action, callback, btn) { | |||
}; | |||
var cancel = function() { | |||
var cancel = function () { | |||
var args = { | |||
doctype: frm.doc.doctype, | |||
name: frm.doc.name | |||
@@ -46,7 +46,7 @@ frappe.ui.form.save = function(frm, action, callback, btn) { | |||
// update workflow state value if workflow exists | |||
var workflow_state_fieldname = frappe.workflow.get_state_fieldname(frm.doctype); | |||
if(workflow_state_fieldname) { | |||
if (workflow_state_fieldname) { | |||
$.extend(args, { | |||
workflow_state_fieldname: workflow_state_fieldname, | |||
workflow_state: frm.doc[workflow_state_fieldname] | |||
@@ -57,7 +57,7 @@ frappe.ui.form.save = function(frm, action, callback, btn) { | |||
_call({ | |||
method: "frappe.desk.form.save.cancel", | |||
args: args, | |||
callback: function(r) { | |||
callback: function (r) { | |||
$(document).trigger("save", [frm.doc]); | |||
callback(r); | |||
}, | |||
@@ -66,17 +66,17 @@ frappe.ui.form.save = function(frm, action, callback, btn) { | |||
}); | |||
}; | |||
var check_name = function(callback) { | |||
var check_name = function (callback) { | |||
var doc = frm.doc; | |||
var meta = locals.DocType[doc.doctype]; | |||
if(doc.__islocal && (meta && meta.autoname | |||
&& meta.autoname.toLowerCase()=='prompt')) { | |||
var d = frappe.prompt(__("Name"), function(values) { | |||
if (doc.__islocal && (meta && meta.autoname | |||
&& meta.autoname.toLowerCase() == 'prompt')) { | |||
var d = frappe.prompt(__("Name"), function (values) { | |||
var newname = values.value; | |||
if(newname) { | |||
if (newname) { | |||
doc.__newname = strip(newname); | |||
} else { | |||
msgprint(__("Name is required")); | |||
frappe.msgprint(__("Name is required")); | |||
throw "name required"; | |||
} | |||
@@ -84,11 +84,11 @@ frappe.ui.form.save = function(frm, action, callback, btn) { | |||
}, __('Enter the name of the new {0}', [doc.doctype]), __("Create")); | |||
if(doc.__newname) { | |||
if (doc.__newname) { | |||
d.set_value("value", doc.__newname); | |||
} | |||
d.onhide = function() { | |||
d.onhide = function () { | |||
$(btn).prop("disabled", false); | |||
} | |||
} else { | |||
@@ -96,36 +96,36 @@ frappe.ui.form.save = function(frm, action, callback, btn) { | |||
} | |||
}; | |||
var check_mandatory = function() { | |||
var check_mandatory = function () { | |||
var me = this; | |||
var has_errors = false; | |||
frm.scroll_set = false; | |||
if(frm.doc.docstatus==2) return true; // don't check for cancel | |||
if (frm.doc.docstatus == 2) return true; // don't check for cancel | |||
$.each(frappe.model.get_all_docs(frm.doc), function(i, doc) { | |||
$.each(frappe.model.get_all_docs(frm.doc), function (i, doc) { | |||
var error_fields = []; | |||
var folded = false; | |||
$.each(frappe.meta.docfield_list[doc.doctype] || [], function(i, docfield) { | |||
if(docfield.fieldname) { | |||
$.each(frappe.meta.docfield_list[doc.doctype] || [], function (i, docfield) { | |||
if (docfield.fieldname) { | |||
var df = frappe.meta.get_docfield(doc.doctype, | |||
docfield.fieldname, frm.doc.name); | |||
if(df.fieldtype==="Fold") { | |||
if (df.fieldtype === "Fold") { | |||
folded = frm.layout.folded; | |||
} | |||
if(df.reqd && !frappe.model.has_value(doc.doctype, doc.name, df.fieldname)) { | |||
if (df.reqd && !frappe.model.has_value(doc.doctype, doc.name, df.fieldname)) { | |||
has_errors = true; | |||
error_fields[error_fields.length] = __(df.label); | |||
// scroll to field | |||
if(!me.scroll_set) { | |||
if (!me.scroll_set) { | |||
scroll_to(doc.parentfield || df.fieldname); | |||
} | |||
if(folded) { | |||
if (folded) { | |||
frm.layout.unfold(); | |||
folded = false; | |||
} | |||
@@ -133,8 +133,8 @@ frappe.ui.form.save = function(frm, action, callback, btn) { | |||
} | |||
}); | |||
if(error_fields.length) { | |||
if(doc.parenttype) { | |||
if (error_fields.length) { | |||
if (doc.parenttype) { | |||
var message = __('Mandatory fields required in table {0}, Row {1}', | |||
[__(frappe.meta.docfield_map[doc.parenttype][doc.parentfield].label).bold(), doc.idx]); | |||
} else { | |||
@@ -142,7 +142,7 @@ frappe.ui.form.save = function(frm, action, callback, btn) { | |||
} | |||
message = message + '<br><br><ul><li>' + error_fields.join('</li><li>') + "</ul>"; | |||
msgprint({ | |||
frappe.msgprint({ | |||
message: message, | |||
indicator: 'red', | |||
title: __('Missing Fields') | |||
@@ -153,15 +153,15 @@ frappe.ui.form.save = function(frm, action, callback, btn) { | |||
return !has_errors; | |||
}; | |||
var scroll_to = function(fieldname) { | |||
var scroll_to = function (fieldname) { | |||
var f = cur_frm.fields_dict[fieldname]; | |||
if(f) { | |||
if (f) { | |||
$(document).scrollTop($(f.wrapper).offset().top - 60); | |||
} | |||
frm.scroll_set = true; | |||
}; | |||
var _call = function(opts) { | |||
var _call = function (opts) { | |||
// opts = { | |||
// method: "some server method", | |||
// args: {args to be passed}, | |||
@@ -170,7 +170,7 @@ frappe.ui.form.save = function(frm, action, callback, btn) { | |||
// } | |||
$(opts.btn).prop("disabled", true); | |||
if(frappe.ui.form.is_saving) { | |||
if (frappe.ui.form.is_saving) { | |||
// this is likely to happen if the user presses the shortcut cmd+s for a longer duration or uses double click | |||
// no need to show this to user, as they can see "Saving" in freeze message | |||
console.log("Already saving. Please wait a few moments.") | |||
@@ -184,49 +184,50 @@ frappe.ui.form.save = function(frm, action, callback, btn) { | |||
method: opts.method, | |||
args: opts.args, | |||
btn: opts.btn, | |||
callback: function(r) { | |||
callback: function (r) { | |||
opts.callback && opts.callback(r); | |||
}, | |||
always: function(r) { | |||
always: function (r) { | |||
frappe.ui.form.is_saving = false; | |||
if(r) { | |||
if (r) { | |||
var doc = r.docs && r.docs[0]; | |||
if(doc) { | |||
if (doc) { | |||
frappe.ui.form.update_calling_link(doc); | |||
} | |||
} | |||
} | |||
} | |||
}) | |||
}; | |||
if(action==="cancel") { | |||
if (action === "cancel") { | |||
cancel(); | |||
} else { | |||
save(); | |||
} | |||
} | |||
frappe.ui.form.update_calling_link = function(newdoc) { | |||
if(frappe._from_link && newdoc.doctype===frappe._from_link.df.options) { | |||
frappe.ui.form.update_calling_link = function (newdoc) { | |||
if (frappe._from_link && newdoc.doctype === frappe._from_link.df.options) { | |||
var doc = frappe.get_doc(frappe._from_link.doctype, frappe._from_link.docname); | |||
// set value | |||
if (doc && doc.parentfield){ | |||
if (doc && doc.parentfield) { | |||
//update values for child table | |||
$.each(frappe._from_link.frm.fields_dict[doc.parentfield].grid.grid_rows, function(index, field) { | |||
if(field.doc && field.doc.name===frappe._from_link.docname){ | |||
$.each(frappe._from_link.frm.fields_dict[doc.parentfield].grid.grid_rows, function (index, field) { | |||
if (field.doc && field.doc.name === frappe._from_link.docname) { | |||
frappe._from_link.set_value(newdoc.name); | |||
}}); | |||
} | |||
}); | |||
} else { | |||
frappe._from_link.set_value(newdoc.name); | |||
} | |||
} | |||
// refresh field | |||
frappe._from_link.refresh(); | |||
// if from form, switch | |||
if(frappe._from_link.frm) { | |||
if (frappe._from_link.frm) { | |||
frappe.set_route("Form", frappe._from_link.frm.doctype, frappe._from_link.frm.docname); | |||
setTimeout(function() { frappe.utils.scroll_to(frappe._from_link_scrollY); }, 100); | |||
setTimeout(function () { frappe.utils.scroll_to(frappe._from_link_scrollY); }, 100); | |||
} | |||
frappe._from_link = null; | |||
@@ -70,7 +70,7 @@ frappe.ui.form.ScriptManager = Class.extend({ | |||
var me = this; | |||
doctype = doctype || this.frm.doctype; | |||
name = name || this.frm.docname; | |||
handlers = this.get_handlers(event_name, doctype, name, callback); | |||
var handlers = this.get_handlers(event_name, doctype, name, callback); | |||
if(callback) handlers.push(callback); | |||
return $.when.apply($, $.map(handlers, function(fn) { return fn(); })); | |||
@@ -114,8 +114,8 @@ frappe.ui.form.ScriptManager = Class.extend({ | |||
} | |||
function setup_add_fetch(df) { | |||
if((in_list(['Data', 'Read Only', 'Text', 'Small Text', | |||
'Text Editor', 'Code'], df.fieldtype) || df.read_only==1) | |||
if((['Data', 'Read Only', 'Text', 'Small Text', | |||
'Text Editor', 'Code'].includes(df.fieldtype) || df.read_only==1) | |||
&& df.options && df.options.indexOf(".")!=-1) { | |||
var parts = df.options.split("."); | |||
me.frm.add_fetch(parts[0], parts[1], df.fieldname); | |||
@@ -138,7 +138,7 @@ frappe.ui.form.ScriptManager = Class.extend({ | |||
this.trigger('setup'); | |||
}, | |||
log_error: function(caller, e) { | |||
show_alert("Error in Client Script."); | |||
frappe.show_alert("Error in Client Script."); | |||
console.group && console.group(); | |||
console.log("----- error in client script -----"); | |||
console.log("method: " + caller); | |||
@@ -117,7 +117,7 @@ frappe.ui.form.Share = Class.extend({ | |||
options: "User", | |||
filters: { | |||
"user_type": "System User", | |||
"name": ["!=", user] | |||
"name": ["!=", frappe.session.user] | |||
} | |||
}, | |||
only_input: true, | |||
@@ -163,7 +163,7 @@ frappe.ui.form.Share = Class.extend({ | |||
$(d.body).find(".edit-share").on("click", function() { | |||
var user = $(this).parents(".shared-user:first").attr("data-user") || "", | |||
value = $(this).prop("checked") ? 1 : 0, | |||
property = $(this).attr("name") | |||
property = $(this).attr("name"), | |||
everyone = cint($(this).parents(".shared-user:first").attr("data-everyone")); | |||
frappe.call({ | |||
@@ -58,10 +58,10 @@ frappe.ui.form.Sidebar = Class.extend({ | |||
this.frm.tags && this.frm.tags.refresh(this.frm.doc._user_tags); | |||
this.sidebar.find(".modified-by").html(__("{0} edited this {1}", | |||
["<strong>" + frappe.user.full_name(this.frm.doc.modified_by) + "</strong>", | |||
"<br>" + comment_when(this.frm.doc.modified)])); | |||
"<br>" + comment_when(this.frm.doc.modified)])); | |||
this.sidebar.find(".created-by").html(__("{0} created this {1}", | |||
["<strong>" + frappe.user.full_name(this.frm.doc.owner) + "</strong>", | |||
"<br>" + comment_when(this.frm.doc.creation)])); | |||
"<br>" + comment_when(this.frm.doc.creation)])); | |||
this.refresh_like(); | |||
this.setup_ratings(); | |||
@@ -151,11 +151,11 @@ frappe.ui.form.Sidebar = Class.extend({ | |||
}, | |||
setup_ratings: function() { | |||
_ratings = this.frm.get_docinfo().rating || 0; | |||
var _ratings = this.frm.get_docinfo().rating || 0; | |||
if(_ratings) { | |||
this.ratings.removeClass("hide"); | |||
rating_icons = frappe.render_template("rating_icons", {rating: _ratings, show_label: false}); | |||
var rating_icons = frappe.render_template("rating_icons", {rating: _ratings, show_label: false}); | |||
this.ratings.find(".rating-icons").html(rating_icons); | |||
} | |||
} | |||
@@ -114,7 +114,7 @@ frappe.ui.form.Toolbar = Class.extend({ | |||
if(!is_submittable || docstatus == 1 || | |||
(allow_print_for_cancelled && docstatus == 2)|| | |||
(allow_print_for_draft && docstatus == 0)) { | |||
(allow_print_for_draft && docstatus == 0)) { | |||
if(frappe.model.can_print(null, me.frm)) { | |||
this.page.add_menu_item(__("Print"), function() { | |||
me.frm.print_doc();}, true); | |||
@@ -159,7 +159,7 @@ frappe.ui.form.Toolbar = Class.extend({ | |||
me.frm.savetrash();}, true); | |||
} | |||
if(in_list(roles, "System Manager")) { | |||
if(frappe.user_roles.includes("System Manager")) { | |||
this.page.add_menu_item(__("Customize"), function() { | |||
frappe.set_route("Form", "Customize Form", { | |||
doc_type: me.frm.doctype | |||
@@ -178,7 +178,7 @@ frappe.ui.form.Toolbar = Class.extend({ | |||
if(!this.frm.doc.__unsaved) { | |||
if(is_submittable && docstatus == 1) { | |||
this.page.add_menu_item(__("Request Feedback"), function() { | |||
feedback = new frappe.utils.Feedback(); | |||
var feedback = new frappe.utils.Feedback(); | |||
feedback.manual_feedback_request(me.frm.doc); | |||
}, true) | |||
} | |||
@@ -73,7 +73,7 @@ frappe.ui.form.States = Class.extend({ | |||
} | |||
$.each(frappe.workflow.get_transitions(this.frm.doctype, state), function(i, d) { | |||
if(in_list(roles, d.allowed)) { | |||
if(frappe.user_roles.includes(d.allowed)) { | |||
added = true; | |||
me.frm.page.add_action_item(__(d.action), function() { | |||
var action = d.action; | |||
@@ -112,10 +112,10 @@ frappe.ui.form.States = Class.extend({ | |||
} else if(new_docstatus==2 && me.frm.doc.docstatus==1) { | |||
me.frm.savecancel(null, success, on_error); | |||
} else { | |||
msgprint(__("Document Status transition from ") + me.frm.doc.docstatus + " " | |||
frappe.msgprint(__("Document Status transition from ") + me.frm.doc.docstatus + " " | |||
+ __("to") + | |||
new_docstatus + " " + __("is not allowed.")); | |||
msgprint(__("Document Status transition from {0} to {1} is not allowed", [me.frm.doc.docstatus, new_docstatus])); | |||
frappe.msgprint(__("Document Status transition from {0} to {1} is not allowed", [me.frm.doc.docstatus, new_docstatus])); | |||
return false; | |||
} | |||
@@ -108,8 +108,8 @@ frappe.views.ListRenderer = Class.extend({ | |||
} | |||
// enabled / disabled | |||
if (frappe.meta.has_field(this.doctype, 'enabled')) { add_field('enabled'); }; | |||
if (frappe.meta.has_field(this.doctype, 'disabled')) { add_field('disabled'); }; | |||
if (frappe.meta.has_field(this.doctype, 'enabled')) { add_field('enabled'); } | |||
if (frappe.meta.has_field(this.doctype, 'disabled')) { add_field('disabled'); } | |||
// add workflow field (as priority) | |||
this.workflow_state_fieldname = frappe.workflow.get_state_fieldname(this.doctype); | |||
@@ -133,7 +133,7 @@ frappe.views.ListRenderer = Class.extend({ | |||
add_field(df.options.split(':')[1]); | |||
} else { | |||
add_field(df.options); | |||
}; | |||
} | |||
} | |||
} | |||
}); | |||
@@ -424,7 +424,7 @@ frappe.views.ListRenderer = Class.extend({ | |||
this.prepare_when(data, data.modified); | |||
// nulls as strings | |||
for (key in data) { | |||
for (var key in data) { | |||
if (data[key] == null) { | |||
data[key] = ''; | |||
} | |||
@@ -485,8 +485,8 @@ frappe.views.ListRenderer = Class.extend({ | |||
prepare_when: function (data, date_str) { | |||
if (!date_str) date_str = data.modified; | |||
// when | |||
data.when = (dateutil.str_to_user(date_str)).split(' ')[0]; | |||
var diff = dateutil.get_diff(dateutil.get_today(), date_str.split(' ')[0]); | |||
data.when = (frappe.datetime.str_to_user(date_str)).split(' ')[0]; | |||
var diff = frappe.datetime.get_diff(frappe.datetime.get_today(), date_str.split(' ')[0]); | |||
if (diff === 0) { | |||
data.when = comment_when(date_str); | |||
} | |||
@@ -212,7 +212,7 @@ frappe.views.ListSidebar = Class.extend({ | |||
.then(function() { | |||
d.hide(); | |||
}, function(err) { | |||
msgprint(err); | |||
frappe.msgprint(err); | |||
}); | |||
} | |||
}); | |||
@@ -273,15 +273,15 @@ frappe.views.ListSidebar = Class.extend({ | |||
var $dropdown = this.page.sidebar.find('.email-account-dropdown'); | |||
var divider = false; | |||
if(has_common(roles, ["System Manager", "Administrator"])) { | |||
if(has_common(frappe.user_roles, ["System Manager", "Administrator"])) { | |||
$('<li class="new-email-account"><a>'+ __("New Email Account") +'</a></li>') | |||
.appendTo($dropdown) | |||
} | |||
accounts = frappe.boot.email_accounts; | |||
var accounts = frappe.boot.email_accounts; | |||
accounts.forEach(function(account) { | |||
email_account = (account.email_id == "All Accounts")? "All Accounts": account.email_account; | |||
var email_account = (account.email_id == "All Accounts")? "All Accounts": account.email_account; | |||
var route = ["List", "Communication", "Inbox", email_account].join('/'); | |||
if(!divider) { | |||
$('<li role="separator" class="divider"></li>').appendTo($dropdown); | |||
@@ -318,9 +318,9 @@ frappe.views.ListSidebar = Class.extend({ | |||
me.defined_category = r.message; | |||
if (r.message.defined_cat ){ | |||
me.defined_category = r.message.defined_cat | |||
me.cats = {}; | |||
me.cats = {}; | |||
//structure the tag categories | |||
for (i in me.defined_category){ | |||
for (var i in me.defined_category){ | |||
if (me.cats[me.defined_category[i].category]===undefined){ | |||
me.cats[me.defined_category[i].category]=[me.defined_category[i].tag]; | |||
}else{ | |||
@@ -302,7 +302,7 @@ frappe.views.ListView = frappe.ui.BaseList.extend({ | |||
set_filters: function (filters) { | |||
var me = this; | |||
$.each(filters, function (i, f) { | |||
hidden = false | |||
var hidden = false | |||
if (f.length === 3) { | |||
f = [me.doctype, f[0], f[1], f[2]] | |||
} else if (f.length === 5) { | |||
@@ -377,7 +377,7 @@ frappe.views.ListView = frappe.ui.BaseList.extend({ | |||
if (this.list_renderer.settings.list_view_doc) { | |||
this.list_renderer.settings.list_view_doc(this); | |||
} else { | |||
doctype = this.list_renderer.no_result_doctype? this.list_renderer.no_result_doctype: this.doctype | |||
var doctype = this.list_renderer.no_result_doctype? this.list_renderer.no_result_doctype: this.doctype | |||
$(this.wrapper).on('click', `button[list_view_doc='${doctype}']`, function () { | |||
if (me.list_renderer.make_new_doc) | |||
me.list_renderer.make_new_doc() | |||
@@ -563,18 +563,18 @@ frappe.views.ListView = frappe.ui.BaseList.extend({ | |||
return order_by; | |||
}, | |||
assigned_to_me: function () { | |||
this.filter_list.add_filter(this.doctype, '_assign', 'like', '%' + user + '%'); | |||
this.filter_list.add_filter(this.doctype, '_assign', 'like', '%' + frappe.session.user + '%'); | |||
this.run(); | |||
}, | |||
liked_by_me: function () { | |||
this.filter_list.add_filter(this.doctype, '_liked_by', 'like', '%' + user + '%'); | |||
this.filter_list.add_filter(this.doctype, '_liked_by', 'like', '%' + frappe.session.user + '%'); | |||
this.run(); | |||
}, | |||
remove_liked_by_me: function () { | |||
this.filter_list.get_filter('_liked_by').remove(); | |||
}, | |||
is_star_filtered: function () { | |||
return this.filter_list.filter_exists(this.doctype, '_liked_by', 'like', '%' + user + '%'); | |||
return this.filter_list.filter_exists(this.doctype, '_liked_by', 'like', '%' + frappe.session.user + '%'); | |||
}, | |||
init_menu: function () { | |||
var me = this; | |||
@@ -606,7 +606,7 @@ frappe.views.ListView = frappe.ui.BaseList.extend({ | |||
}); | |||
}, true); | |||
} | |||
if (roles.includes('System Manager')) { | |||
if (frappe.user_roles.includes('System Manager')) { | |||
this.page.add_menu_item(__('Role Permissions Manager'), function () { | |||
frappe.set_route('permission-manager', { | |||
doctype: me.doctype | |||
@@ -627,7 +627,7 @@ frappe.views.ListView = frappe.ui.BaseList.extend({ | |||
frappe.add_to_desktop(me.doctype, me.doctype); | |||
}, true); | |||
if (roles.includes('System Manager') && frappe.boot.developer_mode === 1) { | |||
if (frappe.user_roles.includes('System Manager') && frappe.boot.developer_mode === 1) { | |||
// edit doctype | |||
this.page.add_menu_item(__('Edit DocType'), function () { | |||
frappe.set_route('Form', 'DocType', me.doctype); | |||
@@ -683,7 +683,7 @@ frappe.views.ListView = frappe.ui.BaseList.extend({ | |||
return !is_submittable || doc.docstatus === 1 || | |||
(allow_print_for_cancelled && doc.docstatus == 2) || | |||
(allow_print_for_draft && doc.docstatus == 0) || | |||
roles.includes('Administrator') | |||
frappe.user_roles.includes('Administrator') | |||
}).map(function (doc) { | |||
return doc.name | |||
}); | |||
@@ -708,11 +708,11 @@ frappe.views.ListView = frappe.ui.BaseList.extend({ | |||
}); | |||
dialog.set_primary_action(__('Print'), function () { | |||
args = dialog.get_values(); | |||
var args = dialog.get_values(); | |||
if (!args) return; | |||
var default_print_format = locals.DocType[me.doctype].default_print_format; | |||
with_letterhead = args.with_letterhead ? 1 : 0; | |||
print_format = args.print_sel ? args.print_sel : default_print_format; | |||
var with_letterhead = args.with_letterhead ? 1 : 0; | |||
var print_format = args.print_sel ? args.print_sel : default_print_format; | |||
var json_string = JSON.stringify(valid_docs); | |||
var w = window.open('/api/method/frappe.utils.print_format.download_multi_pdf?' | |||
@@ -725,7 +725,7 @@ frappe.views.ListView = frappe.ui.BaseList.extend({ | |||
} | |||
}); | |||
print_formats = frappe.meta.get_print_formats(me.doctype); | |||
var print_formats = frappe.meta.get_print_formats(me.doctype); | |||
dialog.fields_dict.print_sel.$input.empty().add_options(print_formats); | |||
dialog.show(); | |||
@@ -30,7 +30,7 @@ frappe.avatar = function(user, css_class, title) { | |||
return repl('<span class="avatar %(css_class)s" title="%(title)s">\ | |||
<span class="avatar-frame" style="background-image: url(%(image)s)"\ | |||
title="%(title)s"></span></span>', { | |||
title="%(title)s"></span></span>', { | |||
image: image, | |||
title: title, | |||
abbr: user_info.abbr, | |||
@@ -93,7 +93,7 @@ frappe.get_gravatar = function(email_id) { | |||
function repl(s, dict) { | |||
if(s==null)return ''; | |||
for(key in dict) { | |||
for(var key in dict) { | |||
s = s.split("%("+key+")s").join(dict[key]); | |||
} | |||
return s; | |||
@@ -162,8 +162,8 @@ function getCookies() { | |||
c.match(/(?:^|\s+)([!#$%&'*+\-.0-9A-Z^`a-z|~]+)=([!#$%&'*+\-.0-9A-Z^`a-z|~]*|"(?:[\x20-\x7E\x80\xFF]|\\[\x00-\x7F])*")(?=\s*[,;]|$)/g).map(function($0, $1) { | |||
var name = $0, | |||
value = $1.charAt(0) === '"' | |||
? $1.substr(1, -1).replace(/\\(.)/g, "$1") | |||
: $1; | |||
? $1.substr(1, -1).replace(/\\(.)/g, "$1") | |||
: $1; | |||
cookies[name] = value; | |||
}); | |||
} | |||
@@ -10,8 +10,8 @@ frappe.provide("frappe.datetime"); | |||
$.extend(frappe.datetime, { | |||
convert_to_user_tz: function(date, format) { | |||
// format defaults to true | |||
if(sys_defaults.time_zone) { | |||
var date_obj = moment.tz(date, sys_defaults.time_zone).local(); | |||
if(frappe.sys_defaults.time_zone) { | |||
var date_obj = moment.tz(date, frappe.sys_defaults.time_zone).local(); | |||
} else { | |||
var date_obj = moment(date); | |||
} | |||
@@ -22,8 +22,8 @@ $.extend(frappe.datetime, { | |||
convert_to_system_tz: function(date, format) { | |||
// format defaults to true | |||
if(sys_defaults.time_zone) { | |||
var date_obj = moment(date).tz(sys_defaults.time_zone); | |||
if(frappe.sys_defaults.time_zone) { | |||
var date_obj = moment(date).tz(frappe.sys_defaults.time_zone); | |||
} else { | |||
var date_obj = moment(date); | |||
} | |||
@@ -32,8 +32,8 @@ $.extend(frappe.datetime, { | |||
}, | |||
is_timezone_same: function() { | |||
if(sys_defaults.time_zone) { | |||
return moment().tz(sys_defaults.time_zone).utcOffset() === moment().utcOffset(); | |||
if(frappe.sys_defaults.time_zone) { | |||
return moment().tz(frappe.sys_defaults.time_zone).utcOffset() === moment().utcOffset(); | |||
} else { | |||
return true; | |||
} | |||
@@ -48,7 +48,7 @@ $.extend(frappe.datetime, { | |||
}, | |||
obj_to_user: function(d) { | |||
return moment(d).format(dateutil.get_user_fmt().toUpperCase()); | |||
return moment(d).format(frappe.datetime.get_user_fmt().toUpperCase()); | |||
}, | |||
get_diff: function(d1, d2) { | |||
@@ -88,12 +88,12 @@ $.extend(frappe.datetime, { | |||
}, | |||
get_user_fmt: function() { | |||
return sys_defaults.date_format || "yyyy-mm-dd"; | |||
return frappe.sys_defaults.date_format || "yyyy-mm-dd"; | |||
}, | |||
str_to_user: function(val, no_time_str) { | |||
if(!val) return ""; | |||
var user_fmt = dateutil.get_user_fmt().toUpperCase(); | |||
var user_fmt = frappe.datetime.get_user_fmt().toUpperCase(); | |||
if(typeof val !== "string" || val.indexOf(" ")===-1) { | |||
return moment(val).format(user_fmt); | |||
} else { | |||
@@ -110,7 +110,7 @@ $.extend(frappe.datetime, { | |||
}, | |||
user_to_str: function(val, no_time_str) { | |||
var user_fmt = dateutil.get_user_fmt().toUpperCase(); | |||
var user_fmt = frappe.datetime.get_user_fmt().toUpperCase(); | |||
var system_fmt = "YYYY-MM-DD"; | |||
if(val.indexOf(" ")!==-1) { | |||
@@ -124,7 +124,7 @@ $.extend(frappe.datetime, { | |||
}, | |||
user_to_obj: function(d) { | |||
return dateutil.str_to_obj(dateutil.user_to_str(d)); | |||
return frappe.datetime.str_to_obj(frappe.datetime.user_to_str(d)); | |||
}, | |||
global_date_format: function(d) { | |||
@@ -155,6 +155,4 @@ $.extend(frappe.datetime, { | |||
}); | |||
// globals (deprecate) | |||
var date = dateutil = frappe.datetime; | |||
var get_today = frappe.datetime.get_today; | |||
console.warn('The globals `dateutil` and `get_today` are deprecated. Please use `frappe.datetime` instead.') |
@@ -1,55 +1,55 @@ | |||
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors | |||
// MIT License. See license.txt | |||
if(!window.frappe) window.frappe = {}; | |||
if (!window.frappe) window.frappe = {}; | |||
function flt(v, decimals, number_format) { | |||
if(v==null || v=='')return 0; | |||
if (v == null || v == '') return 0; | |||
if(typeof v!=="number") { | |||
if (typeof v !== "number") { | |||
v = v + ""; | |||
// strip currency symbol if exists | |||
if(v.indexOf(" ")!=-1) { | |||
if (v.indexOf(" ") != -1) { | |||
// using slice(1).join(" ") because space could also be a group separator | |||
parts = v.split(" "); | |||
var parts = v.split(" "); | |||
v = isNaN(parseFloat(parts[0])) ? parts.slice(parts.length - 1).join(" ") : v; | |||
} | |||
v = strip_number_groups(v, number_format); | |||
v=parseFloat(v); | |||
if(isNaN(v)) | |||
v=0; | |||
v = parseFloat(v); | |||
if (isNaN(v)) | |||
v = 0; | |||
} | |||
if(decimals!=null) | |||
if (decimals != null) | |||
return _round(v, decimals); | |||
return v; | |||
} | |||
function cint(v, def) { | |||
if(v===true) | |||
if (v === true) | |||
return 1; | |||
if(v===false) | |||
if (v === false) | |||
return 0; | |||
v=v+''; | |||
if(v!=="0")v=lstrip(v, ['0']); | |||
v=parseInt(v); | |||
if(isNaN(v))v=def===undefined?0:def; | |||
v = v + ''; | |||
if (v !== "0") v = lstrip(v, ['0']); | |||
v = parseInt(v); | |||
if (isNaN(v)) v = def === undefined ? 0 : def; | |||
return v; | |||
} | |||
function strip_number_groups(v, number_format) { | |||
if(!number_format) number_format = get_number_format(); | |||
if (!number_format) number_format = get_number_format(); | |||
var info = get_number_format_info(number_format); | |||
// strip groups (,) | |||
var group_regex = new RegExp(info.group_sep==="." ? "\\." : info.group_sep, "g"); | |||
var group_regex = new RegExp(info.group_sep === "." ? "\\." : info.group_sep, "g"); | |||
v = v.replace(group_regex, ""); | |||
// replace decimal separator with (.) | |||
if (info.decimal_str!=="." && info.decimal_str!=="") { | |||
if (info.decimal_str !== "." && info.decimal_str !== "") { | |||
var decimal_regex = new RegExp(info.decimal_str, "g"); | |||
v = v.replace(decimal_regex, "."); | |||
} | |||
@@ -59,32 +59,32 @@ function strip_number_groups(v, number_format) { | |||
frappe.number_format_info = { | |||
"#,###.##": {decimal_str:".", group_sep:","}, | |||
"#.###,##": {decimal_str:",", group_sep:"."}, | |||
"# ###.##": {decimal_str:".", group_sep:" "}, | |||
"# ###,##": {decimal_str:",", group_sep:" "}, | |||
"#'###.##": {decimal_str:".", group_sep:"'"}, | |||
"#, ###.##": {decimal_str:".", group_sep:", "}, | |||
"#,##,###.##": {decimal_str:".", group_sep:","}, | |||
"#,###.###": {decimal_str:".", group_sep:","}, | |||
"#.###": {decimal_str:"", group_sep:"."}, | |||
"#,###": {decimal_str:"", group_sep:","}, | |||
"#,###.##": { decimal_str: ".", group_sep: "," }, | |||
"#.###,##": { decimal_str: ",", group_sep: "." }, | |||
"# ###.##": { decimal_str: ".", group_sep: " " }, | |||
"# ###,##": { decimal_str: ",", group_sep: " " }, | |||
"#'###.##": { decimal_str: ".", group_sep: "'" }, | |||
"#, ###.##": { decimal_str: ".", group_sep: ", " }, | |||
"#,##,###.##": { decimal_str: ".", group_sep: "," }, | |||
"#,###.###": { decimal_str: ".", group_sep: "," }, | |||
"#.###": { decimal_str: "", group_sep: "." }, | |||
"#,###": { decimal_str: "", group_sep: "," }, | |||
} | |||
window.format_number = function(v, format, decimals){ | |||
window.format_number = function (v, format, decimals) { | |||
if (!format) { | |||
format = get_number_format(); | |||
if(decimals == null) decimals = cint(frappe.defaults.get_default("float_precision")) || 3; | |||
if (decimals == null) decimals = cint(frappe.defaults.get_default("float_precision")) || 3; | |||
} | |||
info = get_number_format_info(format); | |||
var info = get_number_format_info(format); | |||
// Fix the decimal first, toFixed will auto fill trailing zero. | |||
if (decimals == null) decimals = info.precision; | |||
v = flt(v, decimals, format); | |||
if(v<0) var is_negative = true; | |||
if (v < 0) var is_negative = true; | |||
v = Math.abs(v); | |||
v = v.toFixed(decimals); | |||
@@ -98,23 +98,23 @@ window.format_number = function(v, format, decimals){ | |||
var integer = part[0]; | |||
var str = ''; | |||
var offset = integer.length % group_position; | |||
for (var i=integer.length; i>=0; i--) { | |||
for (var i = integer.length; i >= 0; i--) { | |||
var l = replace_all(str, info.group_sep, "").length; | |||
if(format=="#,##,###.##" && str.indexOf(",")!=-1) { // INR | |||
if (format == "#,##,###.##" && str.indexOf(",") != -1) { // INR | |||
group_position = 2; | |||
l += 1; | |||
} | |||
str += integer.charAt(i); | |||
if (l && !((l+1) % group_position) && i!=0 ) { | |||
if (l && !((l + 1) % group_position) && i != 0) { | |||
str += info.group_sep; | |||
} | |||
} | |||
part[0] = str.split("").reverse().join(""); | |||
} | |||
if(part[0]+""=="") { | |||
part[0]="0"; | |||
if (part[0] + "" == "") { | |||
part[0] = "0"; | |||
} | |||
// join decimal | |||
@@ -131,18 +131,18 @@ function format_currency(v, currency, decimals) { | |||
decimals = frappe.boot.sysdefaults.currency_precision || null; | |||
} | |||
if(symbol) | |||
if (symbol) | |||
return symbol + " " + format_number(v, format, decimals); | |||
else | |||
return format_number(v, format, decimals); | |||
} | |||
function get_currency_symbol(currency) { | |||
if(frappe.boot) { | |||
if(frappe.boot.sysdefaults.hide_currency_symbol=="Yes") | |||
if (frappe.boot) { | |||
if (frappe.boot.sysdefaults.hide_currency_symbol == "Yes") | |||
return null; | |||
if(!currency) | |||
if (!currency) | |||
currency = frappe.boot.sysdefaults.currency; | |||
return frappe.model.get_value(":Currency", currency, "symbol") || currency; | |||
@@ -159,8 +159,8 @@ function get_number_format(currency) { | |||
function get_number_format_info(format) { | |||
var info = frappe.number_format_info[format]; | |||
if(!info) { | |||
info = {decimal_str:".", group_sep:","}; | |||
if (!info) { | |||
info = { decimal_str: ".", group_sep: "," }; | |||
} | |||
// get the precision from the number format | |||
@@ -171,13 +171,13 @@ function get_number_format_info(format) { | |||
function _round(num, precision) { | |||
var is_negative = num < 0 ? true : false; | |||
var d = cint(precision); | |||
var m = Math.pow(10, d); | |||
var n = +(d ? Math.abs(num) * m : Math.abs(num)).toFixed(8); // Avoid rounding errors | |||
var i = Math.floor(n), f = n - i; | |||
var r = ((!precision && f == 0.5) ? ((i % 2 == 0) ? i : i + 1) : Math.round(n)); | |||
r = d ? r / m : r; | |||
return is_negative ? -r : r; | |||
var d = cint(precision); | |||
var m = Math.pow(10, d); | |||
var n = +(d ? Math.abs(num) * m : Math.abs(num)).toFixed(8); // Avoid rounding errors | |||
var i = Math.floor(n), f = n - i; | |||
var r = ((!precision && f == 0.5) ? ((i % 2 == 0) ? i : i + 1) : Math.round(n)); | |||
r = d ? r / m : r; | |||
return is_negative ? -r : r; | |||
} | |||
@@ -187,20 +187,20 @@ function roundNumber(num, precision) { | |||
} | |||
function precision(fieldname, doc) { | |||
if(cur_frm){ | |||
if(!doc) doc = cur_frm.doc; | |||
if (cur_frm) { | |||
if (!doc) doc = cur_frm.doc; | |||
var df = frappe.meta.get_docfield(doc.doctype, fieldname, doc.parent || doc.name); | |||
if(!df) console.log(fieldname + ": could not find docfield in method precision()"); | |||
if (!df) console.log(fieldname + ": could not find docfield in method precision()"); | |||
return frappe.meta.get_field_precision(df, doc); | |||
}else{ | |||
} else { | |||
return frappe.boot.sysdefaults.float_precision | |||
} | |||
} | |||
function in_list(list, item) { | |||
if(!list) return false; | |||
for(var i=0, j=list.length; i<j; i++) | |||
if(list[i]==item) return true; | |||
if (!list) return false; | |||
for (var i = 0, j = list.length; i < j; i++) | |||
if (list[i] == item) return true; | |||
return false; | |||
} | |||
@@ -214,15 +214,15 @@ function remainder(numerator, denominator, precision) { | |||
} | |||
return flt(_remainder, precision); | |||
}; | |||
} | |||
function round_based_on_smallest_currency_fraction(value, currency, precision) { | |||
var smallest_currency_fraction_value = flt(frappe.model.get_value(":Currency", | |||
currency, "smallest_currency_fraction_value")) | |||
if(smallest_currency_fraction_value) { | |||
if (smallest_currency_fraction_value) { | |||
var remainder_val = remainder(value, smallest_currency_fraction_value, precision); | |||
if(remainder_val > (smallest_currency_fraction_value / 2)) { | |||
if (remainder_val > (smallest_currency_fraction_value / 2)) { | |||
value += (smallest_currency_fraction_value - remainder_val); | |||
} else { | |||
value -= remainder_val; | |||
@@ -231,4 +231,4 @@ function round_based_on_smallest_currency_fraction(value, currency, precision) { | |||
value = Math.round(value); | |||
} | |||
return value; | |||
}; | |||
} |
@@ -1,28 +1,28 @@ | |||
// moment strings for translation | |||
function prettyDate(time, mini){ | |||
if(!time) { | |||
function prettyDate(time, mini) { | |||
if (!time) { | |||
time = new Date(); | |||
} | |||
if(moment) { | |||
if(window.sys_defaults && sys_defaults.time_zone) { | |||
var ret = moment.tz(time, sys_defaults.time_zone).locale(frappe.boot.lang).fromNow(mini); | |||
if (moment) { | |||
if (frappe.sys_defaults && frappe.sys_defaults.time_zone) { | |||
var ret = moment.tz(time, frappe.sys_defaults.time_zone).locale(frappe.boot.lang).fromNow(mini); | |||
} else { | |||
var ret = moment(time).locale(frappe.boot.lang).fromNow(mini); | |||
} | |||
if(mini) { | |||
if(ret === moment().locale(frappe.boot.lang).fromNow(mini)) { | |||
if (mini) { | |||
if (ret === moment().locale(frappe.boot.lang).fromNow(mini)) { | |||
ret = __("now"); | |||
} else { | |||
var parts = ret.split(" "); | |||
if(parts.length > 1) { | |||
if(parts[0]==="a" || parts[0]==="an") { | |||
if (parts.length > 1) { | |||
if (parts[0] === "a" || parts[0] === "an") { | |||
parts[0] = 1; | |||
} | |||
if(parts[1].substr(0, 2)==="mo"){ | |||
if (parts[1].substr(0, 2) === "mo") { | |||
ret = parts[0] + " M"; | |||
} else { | |||
ret = parts[0] + " " + parts[1].substr(0, 1); | |||
ret = parts[0] + " " + parts[1].substr(0, 1); | |||
} | |||
} | |||
} | |||
@@ -30,48 +30,50 @@ function prettyDate(time, mini){ | |||
} | |||
return ret; | |||
} else { | |||
if(!time) return '' | |||
if (!time) return '' | |||
var date = time; | |||
if(typeof(time)=="string") | |||
date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ").replace(/\.[0-9]*/, "")); | |||
if (typeof (time) == "string") | |||
date = new Date((time || "").replace(/-/g, "/").replace(/[TZ]/g, " ").replace(/\.[0-9]*/, "")); | |||
var diff = (((new Date()).getTime() - date.getTime()) / 1000), | |||
day_diff = Math.floor(diff / 86400); | |||
day_diff = Math.floor(diff / 86400); | |||
if ( isNaN(day_diff) || day_diff < 0 ) | |||
if (isNaN(day_diff) || day_diff < 0) | |||
return ''; | |||
return when = day_diff == 0 && ( | |||
diff < 60 && __("just now") || | |||
diff < 120 && __("1 minute ago") || | |||
diff < 3600 && __("{0} minutes ago", [Math.floor( diff / 60 )]) || | |||
diff < 7200 && __("1 hour ago") || | |||
diff < 86400 && ("{0} hours ago", [Math.floor( diff / 3600 )])) || | |||
var when = day_diff == 0 && ( | |||
diff < 60 && __("just now") || | |||
diff < 120 && __("1 minute ago") || | |||
diff < 3600 && __("{0} minutes ago", [Math.floor(diff / 60)]) || | |||
diff < 7200 && __("1 hour ago") || | |||
diff < 86400 && ("{0} hours ago", [Math.floor(diff / 3600)])) || | |||
day_diff == 1 && __("Yesterday") || | |||
day_diff < 7 && __("{0} days ago", day_diff) || | |||
day_diff < 31 && __("{0} weeks ago", [Math.ceil( day_diff / 7 )]) || | |||
day_diff < 365 && __("{0} months ago", [Math.ceil( day_diff / 30)]) || | |||
__("> {0} year(s) ago", [Math.floor( day_diff / 365 )]); | |||
day_diff < 31 && __("{0} weeks ago", [Math.ceil(day_diff / 7)]) || | |||
day_diff < 365 && __("{0} months ago", [Math.ceil(day_diff / 30)]) || | |||
__("> {0} year(s) ago", [Math.floor(day_diff / 365)]); | |||
return when; | |||
} | |||
} | |||
var comment_when = function(datetime, mini) { | |||
var comment_when = function (datetime, mini) { | |||
var timestamp = frappe.datetime.str_to_user ? | |||
frappe.datetime.str_to_user(datetime) : datetime; | |||
return '<span class="frappe-timestamp ' | |||
+(mini ? " mini" : "" ) + '" data-timestamp="'+datetime | |||
+'" title="'+timestamp+'">' | |||
+ (mini ? " mini" : "") + '" data-timestamp="' + datetime | |||
+ '" title="' + timestamp + '">' | |||
+ prettyDate(datetime, mini) + '</span>'; | |||
}; | |||
frappe.provide("frappe.datetime"); | |||
frappe.datetime.refresh_when = function() { | |||
if(jQuery) { | |||
$(".frappe-timestamp").each(function() { | |||
frappe.datetime.refresh_when = function () { | |||
if (jQuery) { | |||
$(".frappe-timestamp").each(function () { | |||
$(this).html(prettyDate($(this).attr("data-timestamp"), $(this).hasClass("mini"))); | |||
}); | |||
} | |||
} | |||
setInterval(function() { frappe.datetime.refresh_when() }, 60000); // refresh every minute | |||
setInterval(function () { frappe.datetime.refresh_when() }, 60000); // refresh every minute |
@@ -5,7 +5,7 @@ frappe.provide("frappe.tools"); | |||
frappe.tools.downloadify = function(data, roles, title) { | |||
if(roles && roles.length && !has_common(roles, roles)) { | |||
msgprint(__("Export not allowed. You need {0} role to export.", [frappe.utils.comma_or(roles)])); | |||
frappe.msgprint(__("Export not allowed. You need {0} role to export.", [frappe.utils.comma_or(roles)])); | |||
return; | |||
} | |||
@@ -5,7 +5,7 @@ | |||
frappe.user_info = function(uid) { | |||
if(!uid) | |||
uid = user; | |||
uid = frappe.session.user; | |||
if(uid.toLowerCase()==="bot") { | |||
return { | |||
@@ -57,7 +57,7 @@ frappe.provide('frappe.user'); | |||
$.extend(frappe.user, { | |||
name: 'Guest', | |||
full_name: function(uid) { | |||
return uid===user ? | |||
return uid === frappe.session.user ? | |||
__("You") : | |||
frappe.user_info(uid).fullname; | |||
}, | |||
@@ -77,35 +77,29 @@ $.extend(frappe.user, { | |||
}, | |||
get_desktop_items: function() { | |||
// hide based on permission | |||
modules_list = $.map(frappe.boot.desktop_icons, function(icon) { | |||
var modules_list = $.map(frappe.boot.desktop_icons, function(icon) { | |||
var m = icon.module_name; | |||
var type = frappe.modules[m] && frappe.modules[m].type; | |||
if(frappe.boot.user.allow_modules.indexOf(m) === -1) return null; | |||
var ret = null; | |||
switch(type) { | |||
case "module": | |||
if(frappe.boot.user.allow_modules.indexOf(m)!=-1 || frappe.modules[m].is_help) | |||
ret = m; | |||
break; | |||
case "page": | |||
if(frappe.boot.allowed_pages.indexOf(frappe.modules[m].link)!=-1) | |||
ret = m; | |||
break; | |||
case "list": | |||
if(frappe.model.can_read(frappe.modules[m]._doctype)) | |||
ret = m; | |||
break; | |||
case "view": | |||
if (type === "module") { | |||
if(frappe.boot.user.allow_modules.indexOf(m)!=-1 || frappe.modules[m].is_help) | |||
ret = m; | |||
break; | |||
case "setup": | |||
if(frappe.user.has_role("System Manager") || frappe.user.has_role("Administrator")) | |||
ret = m; | |||
break; | |||
default: | |||
} else if (type === "page") { | |||
if(frappe.boot.allowed_pages.indexOf(frappe.modules[m].link)!=-1) | |||
ret = m; | |||
} else if (type === "list") { | |||
if(frappe.model.can_read(frappe.modules[m]._doctype)) | |||
ret = m; | |||
} else if (type === "view") { | |||
ret = m; | |||
} else if (type === "setup") { | |||
if(frappe.user.has_role("System Manager") || frappe.user.has_role("Administrator")) | |||
ret = m; | |||
} else { | |||
ret = m; | |||
} | |||
return ret; | |||
@@ -147,6 +141,19 @@ $.extend(frappe.user, { | |||
quote: quote | |||
}); | |||
} | |||
}, | |||
/* Normally frappe.user is an object | |||
* having properties and methods. | |||
* But in the following case | |||
* | |||
* if (frappe.user === 'Administrator') | |||
* | |||
* frappe.user will cast to a string | |||
* returning frappe.user.name | |||
*/ | |||
toString: function() { | |||
return this.name; | |||
} | |||
}); | |||
@@ -5,13 +5,13 @@ frappe.provide('frappe.utils'); | |||
frappe.utils = { | |||
get_random: function(len) { | |||
var text = ""; | |||
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; | |||
var text = ""; | |||
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; | |||
for( var i=0; i < len; i++ ) | |||
text += possible.charAt(Math.floor(Math.random() * possible.length)); | |||
for( var i=0; i < len; i++ ) | |||
text += possible.charAt(Math.floor(Math.random() * possible.length)); | |||
return text; | |||
return text; | |||
}, | |||
get_file_link: function(filename) { | |||
filename = cstr(filename); | |||
@@ -122,7 +122,7 @@ frappe.utils = { | |||
return [dict[filters]] | |||
} | |||
$.each(dict, function(i, d) { | |||
for(key in filters) { | |||
for(var key in filters) { | |||
if($.isArray(filters[key])) { | |||
if(filters[key][0]=="in") { | |||
if(filters[key][1].indexOf(d[key])==-1) | |||
@@ -242,7 +242,6 @@ frappe.utils = { | |||
break; | |||
default: | |||
return false; | |||
break; | |||
} | |||
// test regExp if not null | |||
@@ -288,7 +287,7 @@ frappe.utils = { | |||
}; | |||
if(!compare_type) | |||
compare_type = typeof list[0][key]==="string" ? "string" : "number"; | |||
compare_type = typeof list[0][key]==="string" ? "string" : "number"; | |||
list.sort(sort_fn[compare_type]); | |||
@@ -349,20 +348,20 @@ frappe.utils = { | |||
if (!arr1 || !arr2) { | |||
return false; | |||
} | |||
if (arr1.length != arr2.length) { | |||
if (arr1.length != arr2.length) { | |||
return false; | |||
} | |||
for (var i = 0; i < arr1.length; i++) { | |||
if ($.isArray(arr1[i])) { | |||
if (!frappe.utils.arrays_equal(arr1[i], arr2[i])) { | |||
for (var i = 0; i < arr1.length; i++) { | |||
if ($.isArray(arr1[i])) { | |||
if (!frappe.utils.arrays_equal(arr1[i], arr2[i])) { | |||
return false; | |||
} | |||
} | |||
else if (arr1[i] !== arr2[i]) { | |||
} | |||
else if (arr1[i] !== arr2[i]) { | |||
return false; | |||
} | |||
} | |||
return true; | |||
} | |||
return true; | |||
}, | |||
intersection: function(a, b) { | |||
@@ -411,13 +410,13 @@ frappe.utils = { | |||
var tempH = tempImg.height; | |||
if (tempW > tempH) { | |||
if (tempW > max_width) { | |||
tempH *= max_width / tempW; | |||
tempW = max_width; | |||
tempH *= max_width / tempW; | |||
tempW = max_width; | |||
} | |||
} else { | |||
if (tempH > max_height) { | |||
tempW *= max_height / tempH; | |||
tempH = max_height; | |||
tempW *= max_height / tempH; | |||
tempH = max_height; | |||
} | |||
} | |||
@@ -431,88 +430,88 @@ frappe.utils = { | |||
} | |||
}, | |||
csv_to_array: function (strData, strDelimiter) { | |||
// Check to see if the delimiter is defined. If not, | |||
// then default to comma. | |||
strDelimiter = (strDelimiter || ","); | |||
csv_to_array: function (strData, strDelimiter) { | |||
// Check to see if the delimiter is defined. If not, | |||
// then default to comma. | |||
strDelimiter = (strDelimiter || ","); | |||
// Create a regular expression to parse the CSV values. | |||
var objPattern = new RegExp( | |||
( | |||
// Delimiters. | |||
"(\\" + strDelimiter + "|\\r?\\n|\\r|^)" + | |||
// Create a regular expression to parse the CSV values. | |||
var objPattern = new RegExp( | |||
( | |||
// Delimiters. | |||
"(\\" + strDelimiter + "|\\r?\\n|\\r|^)" + | |||
// Quoted fields. | |||
"(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" + | |||
// Quoted fields. | |||
"(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" + | |||
// Standard fields. | |||
"([^\"\\" + strDelimiter + "\\r\\n]*))" | |||
), | |||
"gi" | |||
); | |||
// Standard fields. | |||
"([^\"\\" + strDelimiter + "\\r\\n]*))" | |||
), | |||
"gi" | |||
); | |||
// Create an array to hold our data. Give the array | |||
// a default empty first row. | |||
var arrData = [[]]; | |||
// Create an array to hold our data. Give the array | |||
// a default empty first row. | |||
var arrData = [[]]; | |||
// Create an array to hold our individual pattern | |||
// matching groups. | |||
var arrMatches = null; | |||
// Create an array to hold our individual pattern | |||
// matching groups. | |||
var arrMatches = null; | |||
// Keep looping over the regular expression matches | |||
// until we can no longer find a match. | |||
while (arrMatches = objPattern.exec( strData )){ | |||
// Keep looping over the regular expression matches | |||
// until we can no longer find a match. | |||
while ((arrMatches = objPattern.exec( strData ))){ | |||
// Get the delimiter that was found. | |||
var strMatchedDelimiter = arrMatches[ 1 ]; | |||
// Get the delimiter that was found. | |||
var strMatchedDelimiter = arrMatches[ 1 ]; | |||
// Check to see if the given delimiter has a length | |||
// (is not the start of string) and if it matches | |||
// field delimiter. If id does not, then we know | |||
// that this delimiter is a row delimiter. | |||
if ( | |||
strMatchedDelimiter.length && | |||
strMatchedDelimiter !== strDelimiter | |||
){ | |||
// Check to see if the given delimiter has a length | |||
// (is not the start of string) and if it matches | |||
// field delimiter. If id does not, then we know | |||
// that this delimiter is a row delimiter. | |||
if ( | |||
strMatchedDelimiter.length && | |||
strMatchedDelimiter !== strDelimiter | |||
){ | |||
// Since we have reached a new row of data, | |||
// add an empty row to our data array. | |||
arrData.push( [] ); | |||
// Since we have reached a new row of data, | |||
// add an empty row to our data array. | |||
arrData.push( [] ); | |||
} | |||
} | |||
var strMatchedValue; | |||
var strMatchedValue; | |||
// Now that we have our delimiter out of the way, | |||
// let's check to see which kind of value we | |||
// captured (quoted or unquoted). | |||
if (arrMatches[ 2 ]){ | |||
// Now that we have our delimiter out of the way, | |||
// let's check to see which kind of value we | |||
// captured (quoted or unquoted). | |||
if (arrMatches[ 2 ]){ | |||
// We found a quoted value. When we capture | |||
// this value, unescape any double quotes. | |||
strMatchedValue = arrMatches[ 2 ].replace( | |||
new RegExp( "\"\"", "g" ), | |||
"\"" | |||
); | |||
// We found a quoted value. When we capture | |||
// this value, unescape any double quotes. | |||
strMatchedValue = arrMatches[ 2 ].replace( | |||
new RegExp( "\"\"", "g" ), | |||
"\"" | |||
); | |||
} else { | |||
} else { | |||
// We found a non-quoted value. | |||
strMatchedValue = arrMatches[ 3 ]; | |||
// We found a non-quoted value. | |||
strMatchedValue = arrMatches[ 3 ]; | |||
} | |||
} | |||
// Now that we have our value string, let's add | |||
// it to the data array. | |||
arrData[ arrData.length - 1 ].push( strMatchedValue ); | |||
} | |||
// Now that we have our value string, let's add | |||
// it to the data array. | |||
arrData[ arrData.length - 1 ].push( strMatchedValue ); | |||
} | |||
// Return the parsed data. | |||
return( arrData ); | |||
}, | |||
// Return the parsed data. | |||
return( arrData ); | |||
}, | |||
warn_page_name_change: function(frm) { | |||
frappe.msgprint("Note: Changing the Page Name will break previous URL to this page."); | |||
@@ -588,42 +587,42 @@ frappe.utils = { | |||
// String.prototype.includes polyfill | |||
// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/includes | |||
if (!String.prototype.includes) { | |||
String.prototype.includes = function(search, start) { | |||
'use strict'; | |||
if (typeof start !== 'number') { | |||
start = 0; | |||
} | |||
if (start + search.length > this.length) { | |||
return false; | |||
} else { | |||
return this.indexOf(search, start) !== -1; | |||
} | |||
}; | |||
String.prototype.includes = function (search, start) { | |||
'use strict'; | |||
if (typeof start !== 'number') { | |||
start = 0; | |||
} | |||
if (start + search.length > this.length) { | |||
return false; | |||
} else { | |||
return this.indexOf(search, start) !== -1; | |||
} | |||
}; | |||
} | |||
// Array.prototype.includes polyfill | |||
// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/includes | |||
if (!Array.prototype.includes) { | |||
Object.defineProperty(Array.prototype, 'includes', { | |||
value: function(searchElement, fromIndex) { | |||
if (this == null) { | |||
throw new TypeError('"this" is null or not defined'); | |||
} | |||
var o = Object(this); | |||
var len = o.length >>> 0; | |||
if (len === 0) { | |||
return false; | |||
} | |||
var n = fromIndex | 0; | |||
var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); | |||
while (k < len) { | |||
if (o[k] === searchElement) { | |||
return true; | |||
} | |||
k++; | |||
} | |||
return false; | |||
} | |||
}); | |||
Object.defineProperty(Array.prototype, 'includes', { | |||
value: function(searchElement, fromIndex) { | |||
if (this == null) { | |||
throw new TypeError('"this" is null or not defined'); | |||
} | |||
var o = Object(this); | |||
var len = o.length >>> 0; | |||
if (len === 0) { | |||
return false; | |||
} | |||
var n = fromIndex | 0; | |||
var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); | |||
while (k < len) { | |||
if (o[k] === searchElement) { | |||
return true; | |||
} | |||
k++; | |||
} | |||
return false; | |||
} | |||
}); | |||
} | |||
// Array de duplicate | |||
if (!Array.prototype.uniqBy) { | |||
@@ -15,7 +15,7 @@ $.extend(frappe.model, { | |||
name: frappe.model.get_new_name(doctype), | |||
__islocal: 1, | |||
__unsaved: 1, | |||
owner: user | |||
owner: frappe.session.user | |||
}; | |||
frappe.model.set_default_values(doc, parent_doc); | |||
@@ -103,7 +103,8 @@ $.extend(frappe.model, { | |||
updated.push(f.fieldname); | |||
} else if(f.fieldtype == "Select" && f.options && typeof f.options === 'string' | |||
&& !in_list(["[Select]", "Loading..."], f.options)) { | |||
doc[f.fieldname] = f.options.split("\n")[0]; | |||
doc[f.fieldname] = f.options.split("\n")[0]; | |||
} | |||
} | |||
} | |||
@@ -140,7 +141,7 @@ $.extend(frappe.model, { | |||
if(!df.ignore_user_permissions) { | |||
// 2 - look in user defaults | |||
user_defaults = frappe.defaults.get_user_defaults(df.options); | |||
var user_defaults = frappe.defaults.get_user_defaults(df.options); | |||
if (user_defaults && user_defaults.length===1) { | |||
// Use User Permission value when only when it has a single value | |||
user_default = user_defaults[0]; | |||
@@ -171,13 +172,13 @@ $.extend(frappe.model, { | |||
return frappe.session.user; | |||
} else if (df["default"] == "user_fullname") { | |||
return user_fullname; | |||
return frappe.session.user_fullname; | |||
} else if (df["default"] == "Today") { | |||
return dateutil.get_today(); | |||
return frappe.datetime.get_today(); | |||
} else if ((df["default"] || "").toLowerCase() === "now") { | |||
return dateutil.now_datetime(); | |||
return frappe.datetime.now_datetime(); | |||
} else if (df["default"][0]===":") { | |||
var boot_doc = frappe.model.get_default_from_boot_docs(df, doc, parent_doc); | |||
@@ -198,7 +199,7 @@ $.extend(frappe.model, { | |||
} | |||
} else if (df.fieldtype=="Time") { | |||
return dateutil.now_time(); | |||
return frappe.datetime.now_time(); | |||
} | |||
}, | |||
@@ -252,21 +253,24 @@ $.extend(frappe.model, { | |||
// dont copy name and blank fields | |||
var df = frappe.meta.get_docfield(doc.doctype, key); | |||
if(df && key.substr(0,2)!='__' | |||
if (df && key.substr(0, 2) != '__' | |||
&& !in_list(no_copy_list, key) | |||
&& !(df && (!from_amend && cint(df.no_copy)==1))) { | |||
var value = doc[key] || []; | |||
if(df.fieldtype==="Table") { | |||
for(var i=0, j=value.length; i<j; i++) { | |||
var d = value[i]; | |||
frappe.model.copy_doc(d, from_amend, newdoc, df.fieldname); | |||
} | |||
} else { | |||
newdoc[key] = doc[key]; | |||
&& !(df && (!from_amend && cint(df.no_copy) == 1))) { | |||
var value = doc[key] || []; | |||
if (df.fieldtype === "Table") { | |||
for (var i = 0, j = value.length; i < j; i++) { | |||
var d = value[i]; | |||
frappe.model.copy_doc(d, from_amend, newdoc, df.fieldname); | |||
} | |||
} else { | |||
newdoc[key] = doc[key]; | |||
} | |||
} | |||
} | |||
var user = frappe.session.user; | |||
newdoc.__islocal = 1; | |||
newdoc.docstatus = 0; | |||
newdoc.owner = user; | |||
@@ -309,7 +313,7 @@ $.extend(frappe.model, { | |||
frappe.create_routes = {}; | |||
frappe.new_doc = function (doctype, opts) { | |||
if(opts && $.isPlainObject(opts)) { frappe.route_options = opts; }; | |||
if(opts && $.isPlainObject(opts)) { frappe.route_options = opts; } | |||
frappe.model.with_doctype(doctype, function() { | |||
if(frappe.create_routes[doctype]) { | |||
frappe.set_route(frappe.create_routes[doctype]); | |||
@@ -331,7 +335,4 @@ frappe.new_doc = function (doctype, opts) { | |||
}); | |||
} | |||
// globals for backward compatibility | |||
window.new_doc = frappe.new_doc; | |||
@@ -173,7 +173,7 @@ $.extend(frappe.meta, { | |||
get_parentfield: function(parent_dt, child_dt) { | |||
var df = (frappe.get_doc("DocType", parent_dt).fields || []).filter(function(d) | |||
{ return d.fieldtype==="Table" && options===child_dt }) | |||
{ return d.fieldtype==="Table" && d.options===child_dt }) | |||
if(!df.length) | |||
throw "parentfield not found for " + parent_dt + ", " + child_dt; | |||
return df[0].fieldname; | |||
@@ -5,7 +5,7 @@ frappe.provide('frappe.model'); | |||
$.extend(frappe.model, { | |||
no_value_type: ['Section Break', 'Column Break', 'HTML', 'Table', | |||
'Button', 'Image', 'Fold', 'Heading'], | |||
'Button', 'Image', 'Fold', 'Heading'], | |||
layout_fields: ['Section Break', 'Column Break', 'Fold'], | |||
@@ -77,7 +77,7 @@ $.extend(frappe.model, { | |||
if(d.fieldname==fieldname) return d; | |||
}); | |||
if(!docfield.length) { | |||
msgprint(__("Unknown Column: {0}", [fieldname])); | |||
frappe.msgprint(__("Unknown Column: {0}", [fieldname])); | |||
} | |||
return docfield[0]; | |||
}, | |||
@@ -103,7 +103,7 @@ $.extend(frappe.model, { | |||
freeze: true, | |||
callback: function(r) { | |||
if(r.exc) { | |||
msgprint(__("Unable to load: {0}", [__(doctype)])); | |||
frappe.msgprint(__("Unable to load: {0}", [__(doctype)])); | |||
throw "No doctype"; | |||
} | |||
if(r.message=="use_cache") { | |||
@@ -235,7 +235,7 @@ $.extend(frappe.model, { | |||
can_import: function(doctype, frm) { | |||
// system manager can always import | |||
if(roles.indexOf("System Manager")!==-1) return true; | |||
if(frappe.user_roles.includes("System Manager")) return true; | |||
if(frm) return frm.perm[0].import===1; | |||
return frappe.boot.user.can_import.indexOf(doctype)!==-1; | |||
@@ -243,7 +243,7 @@ $.extend(frappe.model, { | |||
can_export: function(doctype, frm) { | |||
// system manager can always export | |||
if(roles.indexOf("System Manager")!==-1) return true; | |||
if(frappe.user_roles.includes("System Manager")) return true; | |||
if(frm) return frm.perm[0].export===1; | |||
return frappe.boot.user.can_export.indexOf(doctype)!==-1; | |||
@@ -268,7 +268,7 @@ $.extend(frappe.model, { | |||
can_set_user_permissions: function(doctype, frm) { | |||
// system manager can always set user permissions | |||
if(roles.indexOf("System Manager")!==-1) return true; | |||
if(frappe.user_roles.includes("System Manager")) return true; | |||
if(frm) return frm.perm[0].set_user_permissions===1; | |||
return frappe.boot.user.can_set_user_permissions.indexOf(doctype)!==-1; | |||
@@ -359,7 +359,7 @@ $.extend(frappe.model, { | |||
*/ | |||
/* example: frappe.model.on("Customer", "age", function(fieldname, value, doc) { | |||
if(doc.age < 16) { | |||
msgprint("Warning, Customer must atleast be 16 years old."); | |||
frappe.msgprint("Warning, Customer must atleast be 16 years old."); | |||
raise "CustomerAgeError"; | |||
} | |||
}) */ | |||
@@ -385,7 +385,7 @@ $.extend(frappe.model, { | |||
// doctype-level | |||
run(frappe.model.events[doc.doctype]['*']); | |||
}; | |||
} | |||
}, | |||
get_doc: function(doctype, name) { | |||
@@ -541,7 +541,7 @@ $.extend(frappe.model, { | |||
get_all_docs: function(doc) { | |||
var all = [doc]; | |||
for(key in doc) { | |||
for(var key in doc) { | |||
if($.isArray(doc[key])) { | |||
var children = doc[key]; | |||
for (var i=0, l=children.length; i < l; i++) { | |||
@@ -45,7 +45,7 @@ $.extend(frappe.perm, { | |||
return perm; | |||
} | |||
if (user==="Administrator" || roles.indexOf("Administrator")!==-1) { | |||
if (frappe.session.user === "Administrator" || frappe.user_roles.includes("Administrator")) { | |||
perm[0].read = 1; | |||
} | |||
@@ -62,7 +62,7 @@ $.extend(frappe.perm, { | |||
// if owner | |||
if(!$.isEmptyObject(perm[0].if_owner)) { | |||
if(doc.owner===user) { | |||
if(doc.owner === frappe.session.user) { | |||
$.extend(perm[0], perm[0].if_owner); | |||
} else { | |||
// not owner, remove permissions | |||
@@ -78,7 +78,7 @@ $.extend(frappe.perm, { | |||
if(docinfo && docinfo.shared) { | |||
for(var i=0; i<docinfo.shared.length; i++) { | |||
var s = docinfo.shared[i]; | |||
if(s.user===user) { | |||
if(s.user === frappe.session.user) { | |||
perm[0]["read"] = perm[0]["read"] || s.read; | |||
perm[0]["write"] = perm[0]["write"] || s.write; | |||
perm[0]["share"] = perm[0]["share"] || s.share; | |||
@@ -109,7 +109,7 @@ $.extend(frappe.perm, { | |||
$.each(meta.permissions || [], function(i, p) { | |||
// if user has this role | |||
if(roles.indexOf(p.role)!==-1) { | |||
if(frappe.user_roles.includes(p.role)) { | |||
var permlevel = cint(p.permlevel); | |||
if(!perm[permlevel]) { | |||
perm[permlevel] = {}; | |||
@@ -198,7 +198,7 @@ $.extend(frappe.perm, { | |||
} | |||
if (perm[0].if_owner && perm[0].read) { | |||
match_rules.push({"Owner": user}); | |||
match_rules.push({"Owner": frappe.session.user}); | |||
} | |||
return match_rules; | |||
@@ -44,7 +44,7 @@ frappe.workflow = { | |||
return frappe.get_children(frappe.workflow.workflows[doctype], "transitions", { | |||
state:state, action:action})[0].next_state; | |||
}, | |||
is_read_only: function(doctype, name) { | |||
is_read_only: function(doctype, name) { | |||
var state_fieldname = frappe.workflow.get_state_fieldname(doctype); | |||
if(state_fieldname) { | |||
var doc = locals[doctype][name]; | |||
@@ -58,7 +58,7 @@ frappe.workflow = { | |||
var allow_edit = state ? frappe.workflow.get_document_state(doctype, state).allow_edit : null; | |||
if(roles.indexOf(allow_edit)==-1) { | |||
if(!frappe.user_roles.includes(allow_edit)) { | |||
return true; | |||
} | |||
} | |||
@@ -71,10 +71,10 @@ frappe.request.call = function(opts) { | |||
frappe.app.redirect_to_login(); | |||
} else { | |||
frappe.app.handle_session_expired(); | |||
}; | |||
} | |||
}, | |||
404: function(xhr) { | |||
msgprint({title:__("Not found"), indicator:'red', | |||
frappe.msgprint({title:__("Not found"), indicator:'red', | |||
message: __('The resource you are looking for is not available')}); | |||
}, | |||
403: function(xhr) { | |||
@@ -108,11 +108,11 @@ frappe.request.call = function(opts) { | |||
}, | |||
508: function(xhr) { | |||
frappe.utils.play_sound("error"); | |||
msgprint({title:__('Please try again'), indicator:'red', | |||
frappe.msgprint({title:__('Please try again'), indicator:'red', | |||
message:__("Another transaction is blocking this one. Please try again in a few seconds.")}); | |||
}, | |||
413: function(data, xhr) { | |||
msgprint({indicator:'red', title:__('File too big'), message:__("File size exceeded the maximum allowed size of {0} MB", | |||
frappe.msgprint({indicator:'red', title:__('File too big'), message:__("File size exceeded the maximum allowed size of {0} MB", | |||
[(frappe.boot.max_file_size || 5242880) / 1048576])}); | |||
}, | |||
417: function(xhr) { | |||
@@ -133,12 +133,12 @@ frappe.request.call = function(opts) { | |||
}, | |||
500: function(xhr) { | |||
frappe.utils.play_sound("error"); | |||
msgprint({message:__("Server Error: Please check your server logs or contact tech support."), title:__('Something went wrong'), indicator: 'red'}); | |||
frappe.msgprint({message:__("Server Error: Please check your server logs or contact tech support."), title:__('Something went wrong'), indicator: 'red'}); | |||
opts.error_callback && opts.error_callback(); | |||
frappe.request.report_error(xhr, opts); | |||
}, | |||
504: function(xhr) { | |||
msgprint(__("Request Timed Out")) | |||
frappe.msgprint(__("Request Timed Out")) | |||
opts.error_callback && opts.error_callback(); | |||
} | |||
}; | |||
@@ -217,7 +217,7 @@ frappe.request.prepare = function(opts) { | |||
if(opts.freeze) frappe.dom.freeze(opts.freeze_message); | |||
// stringify args if required | |||
for(key in opts.args) { | |||
for(var key in opts.args) { | |||
if(opts.args[key] && ($.isPlainObject(opts.args[key]) || $.isArray(opts.args[key]))) { | |||
opts.args[key] = JSON.stringify(opts.args[key]); | |||
} | |||
@@ -274,7 +274,7 @@ frappe.request.cleanup = function(opts, r) { | |||
} else { | |||
console.log(r.exc); | |||
} | |||
}; | |||
} | |||
// debug messages | |||
if(r._debug_messages) { | |||
@@ -330,7 +330,7 @@ frappe.request.report_error = function(xhr, request_opts) { | |||
request_opts = frappe.request.cleanup_request_opts(request_opts); | |||
var msg_dialog = msgprint({message:error_message, indicator:'red'}); | |||
msg_dialog = frappe.msgprint({message:error_message, indicator:'red'}); | |||
msg_dialog.msg_area.find(".report-btn") | |||
.toggle(error_report_email ? true : false) | |||
@@ -361,7 +361,7 @@ frappe.request.report_error = function(xhr, request_opts) { | |||
message: error_report_message, | |||
doc: { | |||
doctype: "User", | |||
name: user | |||
name: frappe.session.user | |||
} | |||
}); | |||
communication_composer.dialog.$wrapper.css("z-index", cint(msg_dialog.$wrapper.css("z-index")) + 1); | |||
@@ -26,23 +26,23 @@ frappe.RoleEditor = Class.extend({ | |||
role_toolbar.find(".btn-add") | |||
.html(__('Add all roles')) | |||
.on("click", function() { | |||
$(me.wrapper).find('input[type="checkbox"]').each(function(i, check) { | |||
if(!$(check).is(":checked")) { | |||
check.checked = true; | |||
} | |||
.on("click", function () { | |||
$(me.wrapper).find('input[type="checkbox"]').each(function (i, check) { | |||
if (!$(check).is(":checked")) { | |||
check.checked = true; | |||
} | |||
}); | |||
}); | |||
}); | |||
role_toolbar.find(".btn-remove") | |||
.html(__('Clear all roles')) | |||
.on("click", function() { | |||
$(me.wrapper).find('input[type="checkbox"]').each(function(i, check) { | |||
if($(check).is(":checked")) { | |||
check.checked = false; | |||
} | |||
$(me.wrapper).find('input[type="checkbox"]').each(function(i, check) { | |||
if($(check).is(":checked")) { | |||
check.checked = false; | |||
} | |||
}); | |||
}); | |||
}); | |||
$.each(this.roles, function(i, role) { | |||
$(me.wrapper).append(repl('<div class="user-role" \ | |||
@@ -70,10 +70,10 @@ frappe.RoleEditor = Class.extend({ | |||
// set user roles as checked | |||
$.each((me.frm.doc.roles || []), function(i, user_role) { | |||
var checkbox = $(me.wrapper) | |||
.find('[data-user-role="'+user_role.role+'"] input[type="checkbox"]').get(0); | |||
if(checkbox) checkbox.checked = true; | |||
}); | |||
var checkbox = $(me.wrapper) | |||
.find('[data-user-role="'+user_role.role+'"] input[type="checkbox"]').get(0); | |||
if(checkbox) checkbox.checked = true; | |||
}); | |||
}, | |||
set_roles_in_table: function() { | |||
var opts = this.get_roles(); | |||
@@ -82,9 +82,9 @@ frappe.RoleEditor = Class.extend({ | |||
var me = this; | |||
$.each((me.frm.doc.roles || []), function(i, user_role) { | |||
existing_roles_map[user_role.role] = user_role.name; | |||
existing_roles_list.push(user_role.role); | |||
}); | |||
existing_roles_map[user_role.role] = user_role.name; | |||
existing_roles_list.push(user_role.role); | |||
}); | |||
// remove unchecked roles | |||
$.each(opts.unchecked_roles, function(i, role) { | |||
@@ -155,7 +155,7 @@ frappe.RoleEditor = Class.extend({ | |||
var perm = r.message[i]; | |||
// if permission -> icon | |||
for(key in perm) { | |||
for(var key in perm) { | |||
if(key!='parent' && key!='permlevel') { | |||
if(perm[key]) { | |||
perm[key] = '<i class="fa fa-check"></i>'; | |||
@@ -120,7 +120,7 @@ frappe.set_route = function() { | |||
if(params.length===1 && $.isArray(params[0])) { | |||
params = params[0]; | |||
} | |||
route = $.map(params, function(a) { | |||
var route = $.map(params, function(a) { | |||
if($.isPlainObject(a)) { | |||
frappe.route_options = a; | |||
return null; | |||
@@ -18,7 +18,7 @@ frappe.socket = { | |||
//Enable secure option when using HTTPS | |||
if (window.location.protocol == "https:") { | |||
frappe.socket.socket = io.connect(frappe.socket.get_host(), {secure: true}); | |||
frappe.socket.socket = io.connect(frappe.socket.get_host(), {secure: true}); | |||
} | |||
else if (window.location.protocol == "http:") { | |||
frappe.socket.socket = io.connect(frappe.socket.get_host()); | |||
@@ -56,8 +56,8 @@ frappe.get_form_sidebar_extension = function() { | |||
var template = '<ul class="list-unstyled sidebar-menu">\ | |||
<li class="usage-stats">\ | |||
<a href="#usage-info" class="text-muted">{{ usage.total }}MB ({{ usage.total_used_percent }}%) used</a></li>\ | |||
</ul>'; | |||
<a href="#usage-info" class="text-muted">{{ usage.total }}MB ({{ usage.total_used_percent }}%) used</a></li>\ | |||
</ul>'; | |||
usage.sidebar_usage_html = frappe.render(template, { 'usage': usage }, "form_sidebar_usage"); | |||
} else { | |||
@@ -8,7 +8,7 @@ frappe._ = function(txt, replace) { | |||
return txt; | |||
if(typeof(txt) != "string") | |||
return txt; | |||
ret = frappe._messages[txt.replace(/\n/g, "")] || txt; | |||
var ret = frappe._messages[txt.replace(/\n/g, "")] || txt; | |||
if(replace && typeof(replace) === "object") { | |||
ret = $.format(ret, replace); | |||
} | |||
@@ -173,7 +173,7 @@ frappe.ui.BaseList = Class.extend({ | |||
// default filter for submittable doctype | |||
if (frappe.model.is_submittable(this.doctype)) { | |||
this.filter_list.add_filter(this.doctype, "docstatus", "!=", 2); | |||
}; | |||
} | |||
}, | |||
clear: function () { | |||
@@ -18,8 +18,8 @@ frappe.ui.Chart = Class.extend({ | |||
if(this.opts.data && ((this.opts.data.columns && this.opts.data.columns.length >= 1) | |||
|| (this.opts.data.rows && this.opts.data.rows.length >= 1))) { | |||
this.chart = this.render_chart(); | |||
this.show_chart(true); | |||
this.chart = this.render_chart(); | |||
this.show_chart(true); | |||
} | |||
return this.chart; | |||
@@ -28,11 +28,11 @@ frappe.ui.Chart = Class.extend({ | |||
render_chart: function() { | |||
var chart_dict = { | |||
bindto: '#' + this.opts.bind_to, | |||
data: {}, | |||
data: {}, | |||
axis: { | |||
x: { | |||
type: this.opts.x_type || 'category' // this needed to load string x value | |||
}, | |||
x: { | |||
type: this.opts.x_type || 'category' // this needed to load string x value | |||
}, | |||
y: { | |||
padding: { bottom: 10 } | |||
} | |||
@@ -62,11 +62,11 @@ frappe.ui.Chart = Class.extend({ | |||
chart_dict.axis.x.tick.culling = {max: 15}; | |||
chart_dict.axis.x.tick.format = frappe.boot.sysdefaults.date_format | |||
.replace('yyyy', '%Y').replace('mm', '%m').replace('dd', '%d'); | |||
}; | |||
} | |||
// set color | |||
if(!chart_dict.data.colors && chart_dict.data.columns) { | |||
colors = ['#4E50A6', '#7679FB', '#A3A5FC', '#925191', '#5D3EA4', '#8D5FFA', | |||
var colors = ['#4E50A6', '#7679FB', '#A3A5FC', '#925191', '#5D3EA4', '#8D5FFA', | |||
'#5E3AA8', '#7B933D', '#4F8EA8']; | |||
chart_dict.data.colors = {}; | |||
chart_dict.data.columns.forEach(function(d, i) { | |||
@@ -74,7 +74,7 @@ frappe.ui.FieldGroup = frappe.ui.form.Layout.extend({ | |||
} | |||
} | |||
if(errors.length && !ignore_errors) { | |||
msgprint({ | |||
frappe.msgprint({ | |||
title: __('Missing Values Required'), | |||
message: __('Following fields have missing values:') + | |||
'<br><br><ul><li>' + errors.join('<li>') + '</ul>', | |||
@@ -106,7 +106,7 @@ frappe.ui.FieldGroup = frappe.ui.form.Layout.extend({ | |||
} | |||
}, | |||
clear: function() { | |||
for(key in this.fields_dict) { | |||
for(var key in this.fields_dict) { | |||
var f = this.fields_dict[key]; | |||
if(f && f.set_input) { | |||
f.set_input(f.df['default'] || ''); | |||
@@ -105,7 +105,7 @@ frappe.ui.FilterList = Class.extend({ | |||
// This gives a predictable stats order | |||
me.wrapper.find(".filter-stat").empty(); | |||
$.each(me.stats, function (i, v) { | |||
me.render_filters(v, (r.message|| {})[v.name]); | |||
me.render_filters(v, (r.message|| {})[v.name]); | |||
}); | |||
} | |||
}); | |||
@@ -149,8 +149,8 @@ frappe.ui.FilterList = Class.extend({ | |||
} | |||
if(options.length>0) { | |||
for (i in stat) { | |||
for (o in options) { | |||
for (var i in stat) { | |||
for (var o in options) { | |||
if (stat[i][0] == options[o].value) { | |||
if (field.name=="docstatus") { | |||
labels[i] = options[o].label | |||
@@ -353,7 +353,7 @@ frappe.ui.FilterList = Class.extend({ | |||
fieldname: fieldname, | |||
condition: condition, | |||
value: value | |||
}); | |||
}); | |||
this.filters.push(filter); | |||
@@ -460,8 +460,7 @@ frappe.ui.Filter = Class.extend({ | |||
? __("values separated by commas") | |||
: __("use % as wildcard"))+'</div>'); | |||
} else { | |||
me.set_field(me.field.df.parent, me.field.df.fieldname, null, | |||
condition); | |||
me.set_field(me.field.df.parent, me.field.df.fieldname, null, condition); | |||
} | |||
}); | |||
@@ -512,7 +511,7 @@ frappe.ui.Filter = Class.extend({ | |||
var original_docfield = me.fieldselect.fields_by_name[doctype][fieldname]; | |||
if(!original_docfield) { | |||
msgprint(__("Field {0} is not selectable.", [fieldname])); | |||
frappe.msgprint(__("Field {0} is not selectable.", [fieldname])); | |||
return; | |||
} | |||
@@ -784,7 +783,7 @@ frappe.ui.FieldSelect = Class.extend({ | |||
// old style | |||
if(doctype.indexOf(".")!==-1) { | |||
parts = doctype.split("."); | |||
var parts = doctype.split("."); | |||
doctype = parts[0]; | |||
fieldname = parts[1]; | |||
} | |||
@@ -857,14 +856,14 @@ frappe.ui.FieldSelect = Class.extend({ | |||
var label = __(df.label) + ' (' + __(df.parent) + ')'; | |||
var table = df.parent; | |||
} | |||
if(frappe.model.no_value_type.indexOf(df.fieldtype)==-1 && | |||
if(frappe.model.no_value_type.indexOf(df.fieldtype) == -1 && | |||
!(me.fields_by_name[df.parent] && me.fields_by_name[df.parent][df.fieldname])) { | |||
this.options.push({ | |||
label: label, | |||
value: table + "." + df.fieldname, | |||
fieldname: df.fieldname, | |||
doctype: df.parent | |||
}) | |||
this.options.push({ | |||
label: label, | |||
value: table + "." + df.fieldname, | |||
fieldname: df.fieldname, | |||
doctype: df.parent | |||
}); | |||
if(!me.fields_by_name[df.parent]) me.fields_by_name[df.parent] = {}; | |||
me.fields_by_name[df.parent][df.fieldname] = df; | |||
} | |||
@@ -3,7 +3,7 @@ | |||
frappe.ui.is_liked = function(doc) { | |||
var liked = frappe.ui.get_liked_by(doc); | |||
return liked.indexOf(user)===-1 ? false : true; | |||
return liked.indexOf(frappe.session.user)===-1 ? false : true; | |||
} | |||
frappe.ui.get_liked_by = function(doc) { | |||
@@ -47,10 +47,10 @@ frappe.ui.toggle_like = function($btn, doctype, name, callback) { | |||
var doc = locals[doctype] && locals[doctype][name]; | |||
if(doc) { | |||
var liked_by = JSON.parse(doc._liked_by || "[]"), | |||
idx = liked_by.indexOf(user); | |||
idx = liked_by.indexOf(frappe.session.user); | |||
if(add==="Yes") { | |||
if(idx===-1) | |||
liked_by.push(user); | |||
liked_by.push(frappe.session.user); | |||
} else { | |||
if(idx!==-1) { | |||
liked_by = liked_by.slice(0,idx).concat(liked_by.slice(idx+1)) | |||
@@ -98,7 +98,7 @@ frappe.ui.setup_like_popover = function($parent, selector) { | |||
placement: "right", | |||
content: function() { | |||
var liked_by = JSON.parse($wrapper.attr('data-liked-by') || "[]"); | |||
var user = frappe.session.user; | |||
// hack | |||
if ($wrapper.find(".not-liked").length) { | |||
if (liked_by.indexOf(user)!==-1) { | |||
@@ -80,7 +80,7 @@ frappe.ui.Listing = Class.extend({ | |||
return this.page.add_menu_item(label, click, icon) | |||
} else { | |||
this.wrapper.find('.list-toolbar-wrapper').removeClass("hide"); | |||
$button = $('<button class="btn btn-default"></button>') | |||
var $button = $('<button class="btn btn-default"></button>') | |||
.appendTo(this.wrapper.find('.list-toolbar')) | |||
.html((icon ? ("<i class='"+icon+"'></i> ") : "") + label) | |||
.click(click); | |||
@@ -166,7 +166,7 @@ frappe.ui.Listing = Class.extend({ | |||
}); | |||
if(frappe.model.is_submittable(this.doctype)) { | |||
this.filter_list.add_filter(this.doctype, "docstatus", "!=", 2); | |||
}; | |||
} | |||
}, | |||
clear: function() { | |||
@@ -246,7 +246,7 @@ frappe.ui.Listing = Class.extend({ | |||
save_list_settings_locally: function(args) { | |||
if(this.opts.save_list_settings && this.doctype && !this.docname) { | |||
// save list settings locally | |||
list_settings = frappe.model.list_settings[this.doctype]; | |||
var list_settings = frappe.model.list_settings[this.doctype]; | |||
if(!list_settings) { | |||
return | |||
@@ -409,7 +409,7 @@ frappe.ui.Listing = Class.extend({ | |||
}, | |||
set_filter: function(fieldname, label, no_run, no_duplicate, parent) { | |||
var filter = this.filter_list.get_filter(fieldname); | |||
doctype = parent && this.doctype != parent? parent: this.doctype | |||
var doctype = parent && this.doctype != parent? parent: this.doctype | |||
if(filter) { | |||
var v = cstr(filter.field.get_parsed_value()); | |||
@@ -18,7 +18,7 @@ frappe.throw = function(msg) { | |||
msg = {message: msg, title: __('Error')}; | |||
} | |||
if(!msg.indicator) msg.indicator = 'red'; | |||
msgprint(msg); | |||
frappe.msgprint(msg); | |||
throw new Error(msg.message); | |||
} | |||
@@ -77,6 +77,7 @@ frappe.prompt = function(fields, callback, title, primary_label) { | |||
return d; | |||
} | |||
console.warn('The globals `msgprint` and `show_alert` has been deprecated. Please use `frappe.msgprint` and `frappe.show_alert` instead.'); | |||
var msg_dialog=null; | |||
frappe.msgprint = function(msg, title) { | |||
if(!msg) return; | |||
@@ -221,8 +222,6 @@ frappe.verify_password = function(callback) { | |||
}, __("Verify Password"), __("Verify")) | |||
} | |||
var msgprint = frappe.msgprint; | |||
frappe.show_progress = function(title, count, total) { | |||
if(frappe.cur_progress && frappe.cur_progress.title === title | |||
&& frappe.cur_progress.$wrapper.is(":visible")) { | |||
@@ -233,8 +232,8 @@ frappe.show_progress = function(title, count, total) { | |||
}); | |||
dialog.progress = $('<div class="progress"><div class="progress-bar"></div></div>') | |||
.appendTo(dialog.body); | |||
dialog.progress_bar = dialog.progress.css({"margin-top": "10px"}) | |||
.find(".progress-bar"); | |||
dialog.progress_bar = dialog.progress.css({"margin-top": "10px"}) | |||
.find(".progress-bar"); | |||
dialog.$wrapper.removeClass("fade"); | |||
dialog.show(); | |||
frappe.cur_progress = dialog; | |||
@@ -260,6 +259,7 @@ frappe.show_alert = function(message, seconds=7) { | |||
$('<div id="dialog-container"><div id="alert-container"></div></div>').appendTo('body'); | |||
} | |||
var message_html; | |||
if(message.indicator) { | |||
message_html = $('<span class="indicator ' + message.indicator + '"></span>').append(message.message); | |||
} else { | |||
@@ -286,5 +286,3 @@ frappe.show_alert = function(message, seconds=7) { | |||
return div; | |||
} | |||
// for backward compatibility | |||
var show_alert = frappe.show_alert; |
@@ -317,7 +317,7 @@ frappe.ui.Page = Class.extend({ | |||
return this.$title_area.find(".title-icon") | |||
.html('<i class="'+icon+' fa-fw"></i> ') | |||
.toggle(true); | |||
}, | |||
}, | |||
add_help_button: function(txt) { | |||
// | |||