浏览代码

Merge pull request #3350 from netchampfaris/js-remove-globals

Lint and fix JS files
version-14
Makarand Bauskar 8 年前
committed by GitHub
父节点
当前提交
be3cbd53d1
共有 100 个文件被更改,包括 1200 次插入1059 次删除
  1. +9
    -0
      .eslintignore
  2. +119
    -0
      .eslintrc
  3. +1
    -1
      frappe/build.js
  4. +13
    -13
      frappe/core/doctype/communication/communication.js
  5. +1
    -1
      frappe/core/doctype/communication/communication_list.js
  6. +1
    -0
      frappe/core/doctype/doctype/boilerplate/controller_list.js
  7. +1
    -1
      frappe/core/doctype/doctype/doctype.js
  8. +2
    -2
      frappe/core/doctype/error_log/error_log_list.js
  9. +2
    -2
      frappe/core/doctype/error_snapshot/error_snapshot.js
  10. +12
    -12
      frappe/core/doctype/error_snapshot/error_snapshot_list.js
  11. +1
    -1
      frappe/core/doctype/feedback_request/feedback_request.js
  12. +2
    -2
      frappe/core/doctype/feedback_request/feedback_request_list.js
  13. +1
    -1
      frappe/core/doctype/feedback_trigger/feedback_trigger.js
  14. +5
    -5
      frappe/core/doctype/file/file_list.js
  15. +1
    -0
      frappe/core/doctype/report/boilerplate/controller.js
  16. +2
    -2
      frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.js
  17. +6
    -6
      frappe/core/doctype/system_settings/system_settings.js
  18. +11
    -11
      frappe/core/doctype/user/user.js
  19. +3
    -3
      frappe/core/page/data_import_tool/data_import_tool.js
  20. +13
    -13
      frappe/core/page/desktop/desktop.js
  21. +1
    -1
      frappe/core/page/modules_setup/modules_setup.js
  22. +8
    -6
      frappe/core/page/permission_manager/permission_manager.js
  23. +13
    -11
      frappe/core/page/user_permissions/user_permissions.js
  24. +6
    -6
      frappe/core/report/permitted_documents_for_user/permitted_documents_for_user.js
  25. +3
    -3
      frappe/custom/doctype/custom_field/custom_field.js
  26. +5
    -5
      frappe/custom/doctype/customize_form/customize_form.js
  27. +2
    -2
      frappe/custom/doctype/property_setter/property_setter.js
  28. +4
    -4
      frappe/desk/doctype/event/event.js
  29. +1
    -1
      frappe/desk/doctype/kanban_board/kanban_board.js
  30. +2
    -2
      frappe/desk/doctype/todo/todo.js
  31. +3
    -3
      frappe/desk/doctype/todo/todo_list.js
  32. +8
    -7
      frappe/desk/page/activity/activity.js
  33. +1
    -1
      frappe/desk/page/applications/applications.js
  34. +1
    -1
      frappe/desk/page/backups/backups.js
  35. +3
    -3
      frappe/desk/page/chat/chat.js
  36. +1
    -1
      frappe/desk/page/modules/modules.js
  37. +13
    -13
      frappe/desk/page/setup_wizard/setup_wizard.js
  38. +4
    -4
      frappe/email/doctype/auto_email_report/auto_email_report.js
  39. +16
    -17
      frappe/email/doctype/email_account/email_account.js
  40. +2
    -2
      frappe/email/doctype/email_alert/email_alert.js
  41. +2
    -2
      frappe/email/doctype/email_domain/email_domain.js
  42. +4
    -2
      frappe/email/doctype/email_group/email_group.js
  43. +2
    -2
      frappe/email/doctype/email_queue/email_queue_list.js
  44. +2
    -1
      frappe/email/doctype/newsletter/newsletter.js
  45. +4
    -4
      frappe/printing/doctype/print_format/print_format.js
  46. +25
    -25
      frappe/printing/page/print_format_builder/print_format_builder.js
  47. +1
    -1
      frappe/public/js/frappe/assets.js
  48. +1
    -1
      frappe/public/js/frappe/db.js
  49. +2
    -2
      frappe/public/js/frappe/defaults.js
  50. +62
    -61
      frappe/public/js/frappe/desk.js
  51. +55
    -55
      frappe/public/js/frappe/dom.js
  52. +4
    -4
      frappe/public/js/frappe/feedback.js
  53. +48
    -47
      frappe/public/js/frappe/form/control.js
  54. +3
    -2
      frappe/public/js/frappe/form/dashboard.js
  55. +4
    -4
      frappe/public/js/frappe/form/footer/assign_to.js
  56. +14
    -14
      frappe/public/js/frappe/form/footer/attachments.js
  57. +12
    -12
      frappe/public/js/frappe/form/footer/timeline.js
  58. +1
    -1
      frappe/public/js/frappe/form/footer/timeline_item.html
  59. +3
    -9
      frappe/public/js/frappe/form/form_viewers.js
  60. +5
    -5
      frappe/public/js/frappe/form/formatters.js
  61. +36
    -36
      frappe/public/js/frappe/form/grid.js
  62. +12
    -16
      frappe/public/js/frappe/form/layout.js
  63. +58
    -55
      frappe/public/js/frappe/form/link_selector.js
  64. +81
    -78
      frappe/public/js/frappe/form/print.js
  65. +1
    -1
      frappe/public/js/frappe/form/quick_entry.js
  66. +49
    -48
      frappe/public/js/frappe/form/save.js
  67. +4
    -4
      frappe/public/js/frappe/form/script_manager.js
  68. +2
    -2
      frappe/public/js/frappe/form/share.js
  69. +4
    -4
      frappe/public/js/frappe/form/sidebar.js
  70. +3
    -3
      frappe/public/js/frappe/form/toolbar.js
  71. +3
    -3
      frappe/public/js/frappe/form/workflow.js
  72. +6
    -6
      frappe/public/js/frappe/list/list_renderer.js
  73. +6
    -6
      frappe/public/js/frappe/list/list_sidebar.js
  74. +12
    -12
      frappe/public/js/frappe/list/list_view.js
  75. +4
    -4
      frappe/public/js/frappe/misc/common.js
  76. +12
    -14
      frappe/public/js/frappe/misc/datetime.js
  77. +61
    -61
      frappe/public/js/frappe/misc/number_format.js
  78. +34
    -32
      frappe/public/js/frappe/misc/pretty_date.js
  79. +1
    -1
      frappe/public/js/frappe/misc/tools.js
  80. +30
    -23
      frappe/public/js/frappe/misc/user.js
  81. +112
    -113
      frappe/public/js/frappe/misc/utils.js
  82. +22
    -21
      frappe/public/js/frappe/model/create_new.js
  83. +1
    -1
      frappe/public/js/frappe/model/meta.js
  84. +9
    -9
      frappe/public/js/frappe/model/model.js
  85. +5
    -5
      frappe/public/js/frappe/model/perm.js
  86. +2
    -2
      frappe/public/js/frappe/model/workflow.js
  87. +10
    -10
      frappe/public/js/frappe/request.js
  88. +19
    -19
      frappe/public/js/frappe/roles_editor.js
  89. +1
    -1
      frappe/public/js/frappe/router.js
  90. +1
    -1
      frappe/public/js/frappe/socketio_client.js
  91. +2
    -2
      frappe/public/js/frappe/toolbar.js
  92. +1
    -1
      frappe/public/js/frappe/translate.js
  93. +1
    -1
      frappe/public/js/frappe/ui/base_list.js
  94. +8
    -8
      frappe/public/js/frappe/ui/charts.js
  95. +2
    -2
      frappe/public/js/frappe/ui/field_group.js
  96. +14
    -15
      frappe/public/js/frappe/ui/filters/filters.js
  97. +4
    -4
      frappe/public/js/frappe/ui/like.js
  98. +4
    -4
      frappe/public/js/frappe/ui/listing.js
  99. +5
    -7
      frappe/public/js/frappe/ui/messages.js
  100. +1
    -1
      frappe/public/js/frappe/ui/page.js

+ 9
- 0
.eslintignore 查看文件

@@ -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

+ 119
- 0
.eslintrc 查看文件

@@ -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
}
}

+ 1
- 1
frappe/build.js 查看文件

@@ -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') {


+ 13
- 13
frappe/core/doctype/communication/communication.js 查看文件

@@ -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,


+ 1
- 1
frappe/core/doctype/communication/communication_list.js 查看文件

@@ -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
- 0
frappe/core/doctype/doctype/boilerplate/controller_list.js 查看文件

@@ -1,3 +1,4 @@
/* eslint-disable */
frappe.listview_settings['{doctype}'] = {{
add_fields: ["status"],
filters:[["status","=", "Open"]]


+ 1
- 1
frappe/core/doctype/doctype/doctype.js 查看文件

@@ -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);
}


+ 2
- 2
frappe/core/doctype/error_log/error_log_list.js 查看文件

@@ -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"];
}
},


+ 2
- 2
frappe/core/doctype/error_snapshot/error_snapshot.js 查看文件

@@ -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() {


+ 12
- 12
frappe/core/doctype/error_snapshot/error_snapshot_list.js 查看文件

@@ -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,=,"];
}
}
}

+ 1
- 1
frappe/core/doctype/feedback_request/feedback_request.js 查看文件

@@ -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) {


+ 2
- 2
frappe/core/doctype/feedback_request/feedback_request_list.js 查看文件

@@ -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;
}
}
}

+ 1
- 1
frappe/core/doctype/feedback_trigger/feedback_trigger.js 查看文件

@@ -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;
}


+ 5
- 5
frappe/core/doctype/file/file_list.js 查看文件

@@ -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
- 0
frappe/core/doctype/report/boilerplate/controller.js 查看文件

@@ -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": [


+ 2
- 2
frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.js 查看文件

@@ -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) {


+ 6
- 6
frappe/core/doctype/system_settings/system_settings.js 查看文件

@@ -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");
}
});

+ 11
- 11
frappe/core/doctype/user/user.js 查看文件

@@ -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")) {


+ 3
- 3
frappe/core/page/data_import_tool/data_import_tool.js 查看文件

@@ -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;
},


+ 13
- 13
frappe/core/page/desktop/desktop.js 查看文件

@@ -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"));
});


+ 1
- 1
frappe/core/page/modules_setup/modules_setup.js 查看文件

@@ -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');
});


+ 8
- 6
frappe/core/page/permission_manager/permission_manager.js 查看文件

@@ -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();


+ 13
- 11
frappe/core/page/user_permissions/user_permissions.js 查看文件

@@ -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();
}


+ 6
- 6
frappe/core/report/permitted_documents_for_user/permitted_documents_for_user.js 查看文件

@@ -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"
}
]
}

+ 3
- 3
frappe/custom/doctype/custom_field/custom_field.js 查看文件

@@ -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>';


+ 5
- 5
frappe/custom/doctype/customize_form/customize_form.js 查看文件

@@ -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>\


+ 2
- 2
frappe/custom/doctype/property_setter/property_setter.js 查看文件

@@ -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
- 4
frappe/desk/doctype/event/event.js 查看文件

@@ -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);
});
}


+ 1
- 1
frappe/desk/doctype/kanban_board/kanban_board.js 查看文件

@@ -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();


+ 2
- 2
frappe/desk/doctype/todo/todo.js 查看文件

@@ -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,
}
};


+ 3
- 3
frappe/desk/doctype/todo/todo_list.js 查看文件

@@ -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");
},


+ 8
- 7
frappe/desk/page/activity/activity.js 查看文件

@@ -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",


+ 1
- 1
frappe/desk/page/applications/applications.js 查看文件

@@ -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;
}


+ 1
- 1
frappe/desk/page/backups/backups.js 查看文件

@@ -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');
});



+ 3
- 3
frappe/desk/page/chat/chat.js 查看文件

@@ -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") {


+ 1
- 1
frappe/desk/page/modules/modules.js 查看文件

@@ -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;


+ 13
- 13
frappe/desk/page/setup_wizard/setup_wizard.js 查看文件

@@ -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();


+ 4
- 4
frappe/email/doctype/auto_email_report/auto_email_report.js 查看文件

@@ -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') {


+ 16
- 17
frappe/email/doctype/email_account/email_account.js 查看文件

@@ -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");
});
}
}


+ 2
- 2
frappe/email/doctype/email_alert/email_alert.js 查看文件

@@ -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'));
}
}
});


+ 2
- 2
frappe/email/doctype/email_domain/email_domain.js 查看文件

@@ -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



+ 4
- 2
frappe/email/doctype/email_group/email_group.js 查看文件

@@ -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: {


+ 2
- 2
frappe/email/doctype/email_queue/email_queue_list.js 查看文件

@@ -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() {


+ 2
- 1
frappe/email/doctype/newsletter/newsletter.js 查看文件

@@ -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();


+ 4
- 4
frappe/printing/doctype/print_format/print_format.js 查看文件

@@ -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);


+ 25
- 25
frappe/printing/page/print_format_builder/print_format_builder.js 查看文件

@@ -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({
}
});
}
});
});

+ 1
- 1
frappe/public/js/frappe/assets.js 查看文件

@@ -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);


+ 1
- 1
frappe/public/js/frappe/db.js 查看文件

@@ -10,7 +10,7 @@ frappe.db = {
fieldname: fieldname,
filters: filters
},
callback: function(r, rt) {
callback: function(r) {
callback && callback(r.message);
}
});


+ 2
- 2
frappe/public/js/frappe/defaults.js 查看文件

@@ -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;
},


+ 62
- 61
frappe/public/js/frappe/desk.js 查看文件

@@ -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"));
}
}
});


+ 55
- 55
frappe/public/js/frappe/dom.js 查看文件

@@ -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);

+ 4
- 4
frappe/public/js/frappe/feedback.js 查看文件

@@ -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: [
{


+ 48
- 47
frappe/public/js/frappe/form/control.js 查看文件

@@ -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;


+ 3
- 2
frappe/public/js/frappe/form/dashboard.js 查看文件

@@ -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; }



+ 4
- 4
frappe/public/js/frappe/form/footer/assign_to.js 查看文件

@@ -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);


+ 14
- 14
frappe/public/js/frappe/form/footer/attachments.js 查看文件

@@ -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,


+ 12
- 12
frappe/public/js/frappe/form/footer/timeline.js 查看文件

@@ -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,


+ 1
- 1
frappe/public/js/frappe/form/footer/timeline_item.html 查看文件

@@ -41,7 +41,7 @@
</span>
<span class="text-muted" style="font-weight: normal;">
&ndash; {%= 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">


+ 3
- 9
frappe/public/js/frappe/form/form_viewers.js 查看文件

@@ -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),


+ 5
- 5
frappe/public/js/frappe/form/formatters.js 查看文件

@@ -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);
}
};


+ 36
- 36
frappe/public/js/frappe/form/grid.js 查看文件

@@ -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 : "&nbsp;");
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;
}


+ 12
- 16
frappe/public/js/frappe/form/layout.js 查看文件

@@ -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];


+ 58
- 55
frappe/public/js/frappe/form/link_selector.js 查看文件

@@ -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


+ 81
- 78
frappe/public/js/frappe/form/print.js 查看文件

@@ -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);


+ 1
- 1
frappe/public/js/frappe/form/quick_entry.js 查看文件

@@ -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: {


+ 49
- 48
frappe/public/js/frappe/form/save.js 查看文件

@@ -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;


+ 4
- 4
frappe/public/js/frappe/form/script_manager.js 查看文件

@@ -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);


+ 2
- 2
frappe/public/js/frappe/form/share.js 查看文件

@@ -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({


+ 4
- 4
frappe/public/js/frappe/form/sidebar.js 查看文件

@@ -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);
}
}


+ 3
- 3
frappe/public/js/frappe/form/toolbar.js 查看文件

@@ -114,7 +114,7 @@ frappe.ui.form.Toolbar = Class.extend({
// Print
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)
}


+ 3
- 3
frappe/public/js/frappe/form/workflow.js 查看文件

@@ -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;
}



+ 6
- 6
frappe/public/js/frappe/list/list_renderer.js 查看文件

@@ -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);
}


+ 6
- 6
frappe/public/js/frappe/list/list_sidebar.js 查看文件

@@ -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{


+ 12
- 12
frappe/public/js/frappe/list/list_view.js 查看文件

@@ -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();


+ 4
- 4
frappe/public/js/frappe/misc/common.js 查看文件

@@ -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;
});
}


+ 12
- 14
frappe/public/js/frappe/misc/datetime.js 查看文件

@@ -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.')

+ 61
- 61
frappe/public/js/frappe/misc/number_format.js 查看文件

@@ -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;
};
}

+ 34
- 32
frappe/public/js/frappe/misc/pretty_date.js 查看文件

@@ -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

+ 1
- 1
frappe/public/js/frappe/misc/tools.js 查看文件

@@ -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;
}



+ 30
- 23
frappe/public/js/frappe/misc/user.js 查看文件

@@ -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;
}
});



+ 112
- 113
frappe/public/js/frappe/misc/utils.js 查看文件

@@ -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) {


+ 22
- 21
frappe/public/js/frappe/model/create_new.js 查看文件

@@ -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;



+ 1
- 1
frappe/public/js/frappe/model/meta.js 查看文件

@@ -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;


+ 9
- 9
frappe/public/js/frappe/model/model.js 查看文件

@@ -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++) {


+ 5
- 5
frappe/public/js/frappe/model/perm.js 查看文件

@@ -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;


+ 2
- 2
frappe/public/js/frappe/model/workflow.js 查看文件

@@ -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;
}
}


+ 10
- 10
frappe/public/js/frappe/request.js 查看文件

@@ -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);


+ 19
- 19
frappe/public/js/frappe/roles_editor.js 查看文件

@@ -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>';


+ 1
- 1
frappe/public/js/frappe/router.js 查看文件

@@ -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;


+ 1
- 1
frappe/public/js/frappe/socketio_client.js 查看文件

@@ -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());


+ 2
- 2
frappe/public/js/frappe/toolbar.js 查看文件

@@ -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 {


+ 1
- 1
frappe/public/js/frappe/translate.js 查看文件

@@ -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);
}


+ 1
- 1
frappe/public/js/frappe/ui/base_list.js 查看文件

@@ -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 () {


+ 8
- 8
frappe/public/js/frappe/ui/charts.js 查看文件

@@ -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) {


+ 2
- 2
frappe/public/js/frappe/ui/field_group.js 查看文件

@@ -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'] || '');


+ 14
- 15
frappe/public/js/frappe/ui/filters/filters.js 查看文件

@@ -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;
}


+ 4
- 4
frappe/public/js/frappe/ui/like.js 查看文件

@@ -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) {


+ 4
- 4
frappe/public/js/frappe/ui/listing.js 查看文件

@@ -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());


+ 5
- 7
frappe/public/js/frappe/ui/messages.js 查看文件

@@ -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;

+ 1
- 1
frappe/public/js/frappe/ui/page.js 查看文件

@@ -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) {
//


部分文件因为文件数量过多而无法显示

正在加载...
取消
保存