Browse Source

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

Lint and fix JS files
version-14
Makarand Bauskar 8 years ago
committed by GitHub
parent
commit
be3cbd53d1
100 changed files with 1200 additions and 1059 deletions
  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 View File

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

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

@@ -25,7 +25,7 @@ const action = process.argv[2] || '--build';


if (['--build', '--watch'].indexOf(action) === -1) { if (['--build', '--watch'].indexOf(action) === -1) {
console.log('Invalid argument: ', action); console.log('Invalid argument: ', action);
return;
process.exit();
} }


if (action === '--build') { if (action === '--build') {


+ 13
- 13
frappe/core/doctype/communication/communication.js View File

@@ -33,7 +33,7 @@ frappe.ui.form.on("Communication", {


if(frm.doc.communication_type == "Feedback") { if(frm.doc.communication_type == "Feedback") {
frm.add_custom_button(__("Resend"), function() { frm.add_custom_button(__("Resend"), function() {
feedback = new frappe.utils.Feedback();
var feedback = new frappe.utils.Feedback();
feedback.resend_feedback_request(frm.doc); 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_doctype", frm.doc.reference_doctype);
d.set_value("reference_name", frm.doc.reference_name); d.set_value("reference_name", frm.doc.reference_name);
d.set_primary_action(__("Relink"), function () { d.set_primary_action(__("Relink"), function () {
values = d.get_values();
var values = d.get_values();
if (values) { if (values) {
frappe.confirm( frappe.confirm(
__('Are you sure you want to relink this communication to {0}?', [values["reference_name"]]), __('Are you sure you want to relink this communication to {0}?', [values["reference_name"]]),
@@ -130,7 +130,7 @@ frappe.ui.form.on("Communication", {
}); });
}, },
function () { 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) { 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({ return frappe.call({
method: "frappe.email.inbox.create_email_flag_queue", method: "frappe.email.inbox.create_email_flag_queue",
@@ -154,7 +154,7 @@ frappe.ui.form.on("Communication", {
}, },


reply: function(frm) { reply: function(frm) {
args = frm.events.get_mail_args(frm);
var args = frm.events.get_mail_args(frm);
$.extend(args, { $.extend(args, {
subject: __("Re: {0}", [frm.doc.subject]), subject: __("Re: {0}", [frm.doc.subject]),
recipients: frm.doc.sender recipients: frm.doc.sender
@@ -164,7 +164,7 @@ frappe.ui.form.on("Communication", {
}, },


reply_all: function(frm) { reply_all: function(frm) {
args = frm.events.get_mail_args(frm)
var args = frm.events.get_mail_args(frm)
$.extend(args, { $.extend(args, {
subject: __("Re: {0}", [frm.doc.subject]), subject: __("Re: {0}", [frm.doc.subject]),
recipients: frm.doc.sender, recipients: frm.doc.sender,
@@ -174,7 +174,7 @@ frappe.ui.form.on("Communication", {
}, },


forward_mail: function(frm) { forward_mail: function(frm) {
args = frm.events.get_mail_args(frm)
var args = frm.events.get_mail_args(frm)
$.extend(args, { $.extend(args, {
forward: true, forward: true,
subject: __("Fw: {0}", [frm.doc.subject]), subject: __("Fw: {0}", [frm.doc.subject]),
@@ -184,7 +184,7 @@ frappe.ui.form.on("Communication", {
}, },


get_mail_args: function(frm) { get_mail_args: function(frm) {
sender_email_id = ""
var sender_email_id = ""
$.each(frappe.boot.email_accounts, function(idx, account) { $.each(frappe.boot.email_accounts, function(idx, account) {
if(account.email_account == frm.doc.email_account) { if(account.email_account == frm.doc.email_account) {
sender_email_id = account.email_id sender_email_id = account.email_id
@@ -202,11 +202,11 @@ frappe.ui.form.on("Communication", {


add_to_contact: function(frm) { add_to_contact: function(frm) {
var me = this; 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 = { frappe.route_options = {
"email_id": frm.doc.sender, "email_id": frm.doc.sender,


+ 1
- 1
frappe/core/doctype/communication/communication_list.js View File

@@ -9,7 +9,7 @@ frappe.listview_settings['Communication'] = {
filters: [["status", "=", "Open"]], filters: [["status", "=", "Open"]],


onload: function(list_view) { 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.page.add_menu_item(__("Mark as Read"), function() {
list_view.call_for_selected_items(method, { action: "Read" }) list_view.call_for_selected_items(method, { action: "Read" })


+ 1
- 0
frappe/core/doctype/doctype/boilerplate/controller_list.js View File

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


+ 1
- 1
frappe/core/doctype/doctype/doctype.js View File

@@ -13,7 +13,7 @@


frappe.ui.form.on('DocType', { frappe.ui.form.on('DocType', {
refresh: function(frm) { 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.set_value("custom", 1);
frm.toggle_enable("custom", 0); frm.toggle_enable("custom", 0);
} }


+ 2
- 2
frappe/core/doctype/error_log/error_log_list.js View File

@@ -1,9 +1,9 @@
frappe.listview_settings['Error Log'] = { frappe.listview_settings['Error Log'] = {
add_fields: ["seen"], add_fields: ["seen"],
get_indicator: function(doc) { get_indicator: function(doc) {
if(cint(doc.seen)) {
if(cint(doc.seen)) {
return [__("Seen"), "green", "seen,=,1"]; return [__("Seen"), "green", "seen,=,1"];
} else {
} else {
return [__("Not Seen"), "red", "seen,=,0"]; return [__("Not Seen"), "red", "seen,=,0"];
} }
}, },


+ 2
- 2
frappe/core/doctype/error_snapshot/error_snapshot.js View File

@@ -1,9 +1,9 @@
frappe.ui.form.on("Error Snapshot", "load", function(frm){ 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){ 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) { if (frm.doc.relapses) {
frm.add_custom_button(__('Show Relapses'), function() { frm.add_custom_button(__('Show Relapses'), function() {


+ 12
- 12
frappe/core/doctype/error_snapshot/error_snapshot_list.js View File

@@ -1,14 +1,14 @@
frappe.listview_settings["Error Snapshot"] = { 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 View File

@@ -3,7 +3,7 @@


frappe.ui.form.on('Feedback Request', { frappe.ui.form.on('Feedback Request', {
refresh: function(frm) { 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); $(frm.fields_dict.feedback_rating.wrapper).html(rating_icons);


if(frm.doc.reference_doctype && frm.doc.reference_name) { if(frm.doc.reference_doctype && frm.doc.reference_name) {


+ 2
- 2
frappe/core/doctype/feedback_request/feedback_request_list.js View File

@@ -4,13 +4,13 @@ frappe.listview_settings['Feedback Request'] = {
}, },
column_render: { column_render: {
rating: function(doc) { rating: function(doc) {
html = ""
var html = ""
for (var i = 0; i < 5; i++) { for (var i = 0; i < 5; i++) {
html += repl("<span class='indicator %(color)s'></span>", html += repl("<span class='indicator %(color)s'></span>",
{color: i<doc.rating? "blue": "darkgrey"}) {color: i<doc.rating? "blue": "darkgrey"})
} }


return html
return html;
} }
} }
} }

+ 1
- 1
frappe/core/doctype/feedback_trigger/feedback_trigger.js View File

@@ -37,7 +37,7 @@ frappe.ui.form.on('Feedback Trigger', {
frappe.model.with_doctype(frm.doc.document_type, function() { frappe.model.with_doctype(frm.doc.document_type, function() {
var fields = frappe.get_doc("DocType", frm.doc.document_type).fields; var fields = frappe.get_doc("DocType", frm.doc.document_type).fields;
$.each(fields, function(idx, field) { $.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.options.push(field.label);
frm.fieldname_mapper[field.label] = field.fieldname; frm.fieldname_mapper[field.label] = field.fieldname;
} }


+ 5
- 5
frappe/core/doctype/file/file_list.js View File

@@ -42,12 +42,12 @@ frappe.listview_settings['File'] = {
doclist.list_renderer.settings.setup_dragdrop(doclist); doclist.list_renderer.settings.setup_dragdrop(doclist);


doclist.$page.on("click", ".list-row-checkbox", function(event) { 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){ 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": { "args": {
"folder": doclist.current_folder, "folder": doclist.current_folder,
"from_form": 1 "from_form": 1
@@ -83,7 +83,7 @@ frappe.listview_settings['File'] = {


doclist.page.add_menu_item(__("Import .zip"), function() { doclist.page.add_menu_item(__("Import .zip"), function() {
// make upload dialog // make upload dialog
dialog = frappe.ui.get_upload_dialog({
frappe.ui.get_upload_dialog({
args: { args: {
folder: doclist.current_folder, folder: doclist.current_folder,
from_form: 1 from_form: 1
@@ -197,7 +197,7 @@ frappe.listview_settings['File'] = {
set_primary_action:function(doclist){ set_primary_action:function(doclist){
doclist.page.clear_primary_action(); doclist.page.clear_primary_action();
doclist.page.set_primary_action(__("New"), function() { doclist.page.set_primary_action(__("New"), function() {
dialog = frappe.ui.get_upload_dialog({
frappe.ui.get_upload_dialog({
"args": { "args": {
"folder": doclist.current_folder, "folder": doclist.current_folder,
"from_form": 1 "from_form": 1


+ 1
- 0
frappe/core/doctype/report/boilerplate/controller.js View File

@@ -1,5 +1,6 @@
// Copyright (c) 2016, {app_publisher} and contributors // Copyright (c) 2016, {app_publisher} and contributors
// For license information, please see license.txt // For license information, please see license.txt
/* eslint-disable */


frappe.query_reports["{name}"] = {{ frappe.query_reports["{name}"] = {{
"filters": [ "filters": [


+ 2
- 2
frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.js View File

@@ -39,8 +39,8 @@ frappe.ui.form.on('Role Permission for Page and Report', {
}, },


clear_fields: function(frm) { 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) { page: function(frm) {


+ 6
- 6
frappe/core/doctype/system_settings/system_settings.js View File

@@ -7,16 +7,16 @@ frappe.ui.form.on("System Settings", "refresh", function(frm) {


$.each(data.message.defaults, function(key, val) { $.each(data.message.defaults, function(key, val) {
frm.set_value(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) { 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 View File

@@ -18,7 +18,7 @@ frappe.ui.form.on('User', {


}, },
onload: function(frm) { 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) { if(!frm.roles_editor) {
var role_area = $('<div style="min-height: 300px">') var role_area = $('<div style="min-height: 300px">')
.appendTo(frm.fields_dict.roles_html.wrapper); .appendTo(frm.fields_dict.roles_html.wrapper);
@@ -35,11 +35,11 @@ frappe.ui.form.on('User', {
refresh: function(frm) { refresh: function(frm) {
var doc = frm.doc; var doc = frm.doc;


if(doc.name===user && !doc.__unsaved
if(doc.name===frappe.session.user && !doc.__unsaved
&& frappe.all_timezones && frappe.all_timezones
&& (doc.language || frappe.boot.user.language) && (doc.language || frappe.boot.user.language)
&& doc.language !== frappe.boot.user.language) { && doc.language !== frappe.boot.user.language) {
msgprint(__("Refreshing..."));
frappe.msgprint(__("Refreshing..."));
window.location.reload(); window.location.reload();
} }


@@ -53,7 +53,7 @@ frappe.ui.form.on('User', {
frappe.set_route("modules_setup"); frappe.set_route("modules_setup");
}, null, "btn-default") }, 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() { frm.add_custom_button(__("Set User Permissions"), function() {
frappe.route_options = { frappe.route_options = {
@@ -79,10 +79,10 @@ frappe.ui.form.on('User', {
frm.roles_editor && frm.roles_editor.show(); frm.roles_editor && frm.roles_editor.show();
frm.module_editor && frm.module_editor.refresh(); frm.module_editor && frm.module_editor.refresh();


if(user==doc.name) {
if(frappe.session.user==doc.name) {
// update display settings // update display settings
if(doc.user_image) { 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){ if (frappe.route_flags.unsaved===1){
delete frappe.route_flags.unsaved; 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.user_emails[i].idx=frm.doc.user_emails[i].idx+1;
} }
frm.doc.email_account
cur_frm.dirty();
cur_frm.dirty();
} }
}, },
validate: function(frm) { validate: function(frm) {
@@ -116,12 +115,12 @@ frappe.ui.form.on('User', {
}, },
enabled: function(frm) { enabled: function(frm) {
var doc = frm.doc; 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.toggle_display(['sb1', 'sb3', 'modules_access'], doc.enabled);
frm.set_df_property('enabled', 'read_only', 0); frm.set_df_property('enabled', 'read_only', 0);
} }


if(user!="Administrator") {
if(frappe.session.user!=="Administrator") {
frm.toggle_enable('email', doc.__islocal); frm.toggle_enable('email', doc.__islocal);
} }
}, },
@@ -177,6 +176,7 @@ frappe.ModuleEditor = Class.extend({
}); });
}, },
bind: function() { bind: function() {
var me = this;
this.wrapper.on("change", ".block-module-check", function() { this.wrapper.on("change", ".block-module-check", function() {
var module = $(this).attr('data-module'); var module = $(this).attr('data-module');
if($(this).prop("checked")) { if($(this).prop("checked")) {


+ 3
- 3
frappe/core/page/data_import_tool/data_import_tool.js View File

@@ -22,7 +22,7 @@ frappe.DataImportTool = Class.extend({
} }


if(in_list(frappe.boot.user.can_import, doctype)) { if(in_list(frappe.boot.user.can_import, doctype)) {
this.select.val(doctype).change();
this.select.val(doctype).change();
} }


frappe.route_options = null; frappe.route_options = null;
@@ -129,12 +129,12 @@ frappe.DataImportTool = Class.extend({
queued: function() { queued: function() {
// async, show queued // async, show queued
msg_dialog.clear(); 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() { running: function() {
// update async status as running // update async status as running
msg_dialog.clear(); msg_dialog.clear();
msgprint(__("Importing..."));
frappe.msgprint(__("Importing..."));
me.write_messages([__("Importing")]); me.write_messages([__("Importing")]);
me.has_progress = false; me.has_progress = false;
}, },


+ 13
- 13
frappe/core/page/desktop/desktop.js View File

@@ -74,16 +74,16 @@ $.extend(frappe.desktop, {
// TEMP: test activiation without this message. // TEMP: test activiation without this message.
return; 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 wrapper = frappe.desktop.wrapper.find('.help-message-wrapper');
var $help_messages = wrapper.find('.help-messages'); var $help_messages = wrapper.find('.help-messages');


set_current_message = function(idx) {
var set_current_message = function(idx) {
idx = cint(idx); idx = cint(idx);
wrapper.current_message_idx = idx; wrapper.current_message_idx = idx;
wrapper.find('.left-arrow, .right-arrow').addClass('disabled'); wrapper.find('.left-arrow, .right-arrow').addClass('disabled');
@@ -166,7 +166,7 @@ $.extend(frappe.desktop, {
} }
return false; return false;
} else { } else {
module = frappe.get_module(parent.attr("data-name"));
var module = frappe.get_module(parent.attr("data-name"));
if (module && module.onclick) { if (module && module.onclick) {
module.onclick(); module.onclick();
return false; return false;
@@ -181,7 +181,7 @@ $.extend(frappe.desktop, {


new Sortable($("#icon-grid").get(0), { new Sortable($("#icon-grid").get(0), {
onUpdate: function(event) { onUpdate: function(event) {
new_order = [];
var new_order = [];
$("#icon-grid .case-wrapper").each(function(i, e) { $("#icon-grid .case-wrapper").each(function(i, e) {
new_order.push($(this).attr("data-name")); new_order.push($(this).attr("data-name"));
}); });


+ 1
- 1
frappe/core/page/modules_setup/modules_setup.js View File

@@ -59,7 +59,7 @@ frappe.pages['modules_setup'].on_page_load = function(wrapper) {
}; };


// application installer // 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() { page.add_inner_button('Install Apps', function() {
frappe.set_route('applications'); frappe.set_route('applications');
}); });


+ 8
- 6
frappe/core/page/permission_manager/permission_manager.js View File

@@ -298,7 +298,7 @@ frappe.PermissionEngine = Class.extend({
r.message = $.map(r.message, function(p) { r.message = $.map(r.message, function(p) {
return $.format('<a href="#Form/User/{0}">{1}</a>', [p, 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>")); + "<br>" + r.message.join("<br>"));
} }
}) })
@@ -324,7 +324,7 @@ frappe.PermissionEngine = Class.extend({
}, },
callback: function(r) { callback: function(r) {
if(r.exc) { if(r.exc) {
msgprint(__("Did not remove"));
frappe.msgprint(__("Did not remove"));
} else { } else {
me.refresh(); me.refresh();
} }
@@ -380,7 +380,8 @@ frappe.PermissionEngine = Class.extend({
options:me.options.roles, reqd:1,fieldname:"role"}, options:me.options.roles, reqd:1,fieldname:"role"},
{fieldtype:"Select", label:__("Permission Level"), {fieldtype:"Select", label:__("Permission Level"),
options:[0,1,2,3,4,5,6,7,8,9], reqd:1, fieldname: "permlevel", 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()) { if(me.get_doctype()) {
@@ -404,7 +405,7 @@ frappe.PermissionEngine = Class.extend({
args: args, args: args,
callback: function(r) { callback: function(r) {
if(r.exc) { if(r.exc) {
msgprint(__("Did not add"));
frappe.msgprint(__("Did not add"));
} else { } else {
me.refresh(); me.refresh();
} }
@@ -417,6 +418,7 @@ frappe.PermissionEngine = Class.extend({
}, },


show_user_permission_doctypes: function(d) { show_user_permission_doctypes: function(d) {
var me = this;
if (!d.dialog) { if (!d.dialog) {
var fields = []; var fields = [];
for (var i=0, l=d.linked_doctypes.length; i<l; i++) { for (var i=0, l=d.linked_doctypes.length; i<l; i++) {
@@ -476,9 +478,9 @@ frappe.PermissionEngine = Class.extend({
}, },
callback: function(r) { callback: function(r) {
if(r.exc) { if(r.exc) {
msgprint(__("Did not set"));
frappe.msgprint(__("Did not set"));
} else { } else {
var msg = msgprint(__("Saved!"));
var msg = frappe.msgprint(__("Saved!"));
setTimeout(function() { msg.hide(); }, 3000); setTimeout(function() { msg.hide(); }, 3000);
d.user_permission_doctypes = user_permission_doctypes; d.user_permission_doctypes = user_permission_doctypes;
dialog.hide(); dialog.hide();


+ 13
- 11
frappe/core/page/user_permissions/user_permissions.js View File

@@ -50,9 +50,9 @@ frappe.UserPermissions = Class.extend({
var me = this; var me = this;


$(this.wrapper).find(".view-role-permissions").on("click", function() { $(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({ return frappe.call({
module:"frappe.core", module:"frappe.core",
@@ -82,7 +82,7 @@ frappe.UserPermissions = Class.extend({
options: "[Select]" options: "[Select]"
}); });


if(roles.indexOf("System Manager")!==-1) {
if(frappe.user_roles.includes("System Manager")) {
me.download = me.wrapper.page.add_field({ me.download = me.wrapper.page.add_field({
fieldname: "download", fieldname: "download",
label: __("Download"), label: __("Download"),
@@ -141,7 +141,7 @@ frappe.UserPermissions = Class.extend({
primary_action: function() { primary_action: function() {
var filedata = d.fields_dict.attach.get_value(); var filedata = d.fields_dict.attach.get_value();
if(!filedata) { if(!filedata) {
msgprint(_("Please attach a file"));
frappe.msgprint(__("Please attach a file"));
return; return;
} }
frappe.call({ frappe.call({
@@ -151,7 +151,7 @@ frappe.UserPermissions = Class.extend({
}, },
callback: function(r) { callback: function(r) {
if(!r.exc) { if(!r.exc) {
msgprint(__("Permissions Updated"));
frappe.msgprint(__("Permissions Updated"));
d.hide(); d.hide();
} }
} }
@@ -250,9 +250,11 @@ frappe.UserPermissions = Class.extend({


$.each([[__("Allow User"), 150], [__("If Document Type"), 150], [__("Is"),150], ["", 50]], $.each([[__("Allow User"), 150], [__("If Document Type"), 150], [__("Is"),150], ["", 50]],
function(i, col) { 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) { $.each(this.prop_list, function(i, d) {
@@ -288,7 +290,7 @@ frappe.UserPermissions = Class.extend({
}, },
callback: function(r) { callback: function(r) {
if(r.exc) { if(r.exc) {
msgprint(__("Did not remove"));
frappe.msgprint(__("Did not remove"));
} else { } else {
me.refresh(); me.refresh();
} }
@@ -349,7 +351,7 @@ frappe.UserPermissions = Class.extend({
args: args, args: args,
callback: function(r) { callback: function(r) {
if(r.exc) { if(r.exc) {
msgprint(__("Did not add"));
frappe.msgprint(__("Did not add"));
} else { } else {
me.refresh(); me.refresh();
} }


+ 6
- 6
frappe/core/report/permitted_documents_for_user/permitted_documents_for_user.js View File

@@ -16,7 +16,7 @@ frappe.query_reports["Permitted Documents For User"] = {
"fieldtype": "Link", "fieldtype": "Link",
"options": "DocType", "options": "DocType",
"reqd": 1, "reqd": 1,
"get_query": function() {
"get_query": function () {
return { return {
"query": "frappe.core.report.permitted_documents_for_user.permitted_documents_for_user.query_doctypes", "query": "frappe.core.report.permitted_documents_for_user.permitted_documents_for_user.query_doctypes",
"filters": { "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 View File

@@ -7,10 +7,10 @@
frappe.ui.form.on('Custom Field', { frappe.ui.form.on('Custom Field', {
setup: function(frm) { setup: function(frm) {
frm.set_query('dt', function(doc) { frm.set_query('dt', function(doc) {
filters = [
var filters = [
['DocType', 'issingle', '=', 0], ['DocType', 'issingle', '=', 0],
]; ];
if(user!=="Administrator") {
if(frappe.session.user!=="Administrator") {
filters.push(['DocType', 'module', '!=', 'Core']) filters.push(['DocType', 'module', '!=', 'Core'])
} }
return { return {
@@ -57,7 +57,7 @@ frappe.ui.form.on('Custom Field', {
fieldtype: function(frm) { fieldtype: function(frm) {
if(frm.doc.fieldtype == 'Link') { if(frm.doc.fieldtype == 'Link') {
frm.fields_dict['options_help'].disp_area.innerHTML = 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') { } else if(frm.doc.fieldtype == 'Select') {
frm.fields_dict['options_help'].disp_area.innerHTML = 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>'; __('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 View File

@@ -14,8 +14,8 @@ frappe.ui.form.on("Customize Form", {
['DocType', 'issingle', '=', 0], ['DocType', 'issingle', '=', 0],
['DocType', 'custom', '=', 0], ['DocType', 'custom', '=', 0],
['DocType', 'name', 'not in', 'DocType, DocField, DocPerm, User, Role, Has Role, \ ['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) { before_fields_remove: function(frm, doctype, name) {
var row = frappe.get_doc(doctype, name); var row = frappe.get_doc(doctype, name);
if(!(row.is_custom_field || row.__islocal)) { 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"; throw "cannot delete custom field";
} }
}, },
@@ -171,7 +171,7 @@ frappe.customize_form.confirm = function(msg, frm) {
method: "reset_to_defaults", method: "reset_to_defaults",
callback: function(r) { callback: function(r) {
if(r.exc) { if(r.exc) {
msgprint(r.exc);
frappe.msgprint(r.exc);
} else { } else {
d.hide(); d.hide();
frappe.customize_form.clear_locals_and_refresh(frm); frappe.customize_form.clear_locals_and_refresh(frm);
@@ -262,7 +262,7 @@ frappe.customize_form.add_fields_help = function(frm) {
<td>\ <td>\
Show field if a condition is met<br />\ Show field if a condition is met<br />\
Example: <code>eval:doc.status=='Cancelled'</code>\ 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.\ \"Reason for Cancellation\" only if the record is Cancelled.\
</td>\ </td>\
</tr>\ </tr>\


+ 2
- 2
frappe/custom/doctype/property_setter/property_setter.js View File

@@ -4,8 +4,8 @@
$.extend(cur_frm.cscript, { $.extend(cur_frm.cscript, {
validate: function(doc) { validate: function(doc) {
if(doc.property_type=='Check' && !in_list(['0','1'], doc.value)) { 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 View File

@@ -4,8 +4,8 @@
frappe.ui.form.on("Event", { frappe.ui.form.on("Event", {
onload: function(frm) { onload: function(frm) {
frm.set_query("ref_type", function(txt) { frm.set_query("ref_type", function(txt) {
return {
"filters": {
return {
"filters": {
"issingle": 0, "issingle": 0,
} }
}; };
@@ -20,8 +20,8 @@ frappe.ui.form.on("Event", {
}, },
repeat_on: function(frm) { repeat_on: function(frm) {
if(frm.doc.repeat_on==="Every Day") { 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); frm.set_value(v, 1);
}); });
} }


+ 1
- 1
frappe/desk/doctype/kanban_board/kanban_board.js View File

@@ -35,7 +35,7 @@ frappe.ui.form.on('Kanban Board', {
field.options && field.options.split('\n').forEach(function(o, i) { field.options && field.options.split('\n').forEach(function(o, i) {
o = o.trim(); o = o.trim();
if(!o) return; if(!o) return;
d = frm.add_child('columns');
var d = frm.add_child('columns');
d.column_name = o; d.column_name = o;
}); });
frm.refresh(); frm.refresh();


+ 2
- 2
frappe/desk/doctype/todo/todo.js View File

@@ -3,8 +3,8 @@
frappe.ui.form.on("ToDo", { frappe.ui.form.on("ToDo", {
onload: function(frm) { onload: function(frm) {
frm.set_query("reference_type", function(txt) { frm.set_query("reference_type", function(txt) {
return {
"filters": {
return {
"filters": {
"issingle": 0, "issingle": 0,
} }
}; };


+ 3
- 3
frappe/desk/doctype/todo/todo_list.js View File

@@ -1,7 +1,7 @@
frappe.listview_settings['ToDo'] = { frappe.listview_settings['ToDo'] = {
onload: function(me) { onload: function(me) {
frappe.route_options = { frappe.route_options = {
"owner": user,
"owner": frappe.session.user,
"status": "Open" "status": "Open"
}; };
me.page.set_title(__("To Do")); me.page.set_title(__("To Do"));
@@ -14,7 +14,7 @@ frappe.listview_settings['ToDo'] = {
var assign_filter = me.filter_list.get_filter("assigned_by"); var assign_filter = me.filter_list.get_filter("assigned_by");
assign_filter && assign_filter.remove(true); 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(); me.run();
}); });


@@ -23,7 +23,7 @@ frappe.listview_settings['ToDo'] = {
var assign_filter = me.filter_list.get_filter("owner"); var assign_filter = me.filter_list.get_filter("owner");
assign_filter && assign_filter.remove(true); 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(); me.run();
}, ".assigned-to-me"); }, ".assigned-to-me");
}, },


+ 8
- 7
frappe/desk/page/activity/activity.js View File

@@ -32,7 +32,7 @@ frappe.pages['activity'].on_page_load = function(wrapper) {
}, },
show_filters: true, show_filters: true,
doctype: "Communication", doctype: "Communication",
get_args: function() {
get_args: function() {
if (frappe.route_options && frappe.route_options.show_likes) { if (frappe.route_options && frappe.route_options.show_likes) {
delete frappe.route_options.show_likes; delete frappe.route_options.show_likes;
return { return {
@@ -80,7 +80,7 @@ frappe.pages['activity'].on_page_load = function(wrapper) {


this.page.add_menu_item(__('Authentication Log'), function() { this.page.add_menu_item(__('Authentication Log'), function() {
frappe.route_options = { frappe.route_options = {
"user": user
"user": frappe.session.user
} }


frappe.set_route('Report', "Authentication Log"); frappe.set_route('Report', "Authentication Log");
@@ -147,17 +147,18 @@ frappe.activity.Feed = Class.extend({
data.feed_type = data.comment_type || data.communication_medium; data.feed_type = data.comment_type || data.communication_medium;
}, },
add_date_separator: function(row, data) { 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; 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) { if(diff < 1) {
pdate = 'Today'; pdate = 'Today';
} else if(diff < 2) { } else if(diff < 2) {
pdate = 'Yesterday'; pdate = 'Yesterday';
} else { } else {
pdate = dateutil.global_date_format(date);
pdate = frappe.datetime.global_date_format(date);
} }
data.date_sep = pdate; data.date_sep = pdate;
data.date_class = pdate=='Today' ? "date-indicator blue" : "date-indicator"; data.date_class = pdate=='Today' ? "date-indicator blue" : "date-indicator";
@@ -182,7 +183,7 @@ frappe.activity.render_heatmap = function(page) {
var legend = []; var legend = [];
var max = Math.max.apply(this, $.map(r.message, function(v) { return v })); 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)]; 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({ heatmap.init({
itemSelector: ".heatmap", itemSelector: ".heatmap",
domain: "month", domain: "month",


+ 1
- 1
frappe/desk/page/applications/applications.js View File

@@ -21,7 +21,7 @@ frappe.applications.Installer = Class.extend({
me.make_page(); me.make_page();


// no apps // 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>'); me.wrapper.html('<div class="text-muted app-listing padding">' + __("No Apps Installed") + '</div>');
return; return;
} }


+ 1
- 1
frappe/desk/page/backups/backups.js View File

@@ -5,7 +5,7 @@ frappe.pages['backups'].on_page_load = function(wrapper) {
single_column: true 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'); frappe.set_route('Form', 'System Settings');
}); });




+ 3
- 3
frappe/desk/page/chat/chat.js View File

@@ -40,10 +40,10 @@ frappe.Chat = Class.extend({
setup_realtime: function() { setup_realtime: function() {
var me = this; var me = this;
frappe.realtime.on('new_message', function(comment) { 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') { if(frappe.get_route()[0] === 'chat') {
var current_contact = $(cur_page.page).find('[data-contact]').data('contact'); 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) if ((current_contact == comment.owner)
|| (on_broadcast_page && comment.broadcast) || (on_broadcast_page && comment.broadcast)
|| current_contact === 'Bot' && comment.communication_type === 'Bot') { || current_contact === 'Bot' && comment.communication_type === 'Bot') {
@@ -220,7 +220,7 @@ frappe.Chat = Class.extend({
if(data.owner==data.reference_name if(data.owner==data.reference_name
&& data.communication_type!=="Notification" && data.communication_type!=="Notification"
&& data.comment_type!=="Bot") { && data.comment_type!=="Bot") {
data.is_public = true;
data.is_public = true;
} }


if(data.owner==data.reference_name && data.communication_type !== "Bot") { if(data.owner==data.reference_name && data.communication_type !== "Bot") {


+ 1
- 1
frappe/desk/page/modules/modules.js View File

@@ -63,7 +63,7 @@ frappe.pages['modules'].on_page_load = function(wrapper) {
module: module_name module: module_name
}, },
callback: function(r) { callback: function(r) {
m = frappe.get_module(module_name);
var m = frappe.get_module(module_name);
m.data = r.message.data; m.data = r.message.data;
process_data(module_name, m.data); process_data(module_name, m.data);
page.section_data[module_name] = m; page.section_data[module_name] = m;


+ 13
- 13
frappe/desk/page/setup_wizard/setup_wizard.js View File

@@ -155,7 +155,7 @@ frappe.wiz.Wizard = Class.extend({
}, 2000); }, 2000);
}, },
error: function(r) { error: function(r) {
var d = msgprint(__("There were errors."));
var d = frappe.msgprint(__("There were errors."));
d.custom_onhide = function() { d.custom_onhide = function() {
frappe.set_route(me.page_name, me.slides.length - 1); 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", { 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]; this.body = this.$body.find(".form")[0];


@@ -314,7 +314,7 @@ frappe.wiz.WizardSlide = Class.extend({
//setup mousefree navigation //setup mousefree navigation
this.$body.on('keypress', function(e) { this.$body.on('keypress', function(e) {
if(e.which === 13) { if(e.which === 13) {
$target = $(e.target);
var $target = $(e.target);
if($target.hasClass('prev-btn')) { if($target.hasClass('prev-btn')) {
me.prev(); me.prev();
} else if($target.hasClass('btn-attach')) { } else if($target.hasClass('btn-attach')) {
@@ -469,7 +469,7 @@ function load_frappe_slides() {
var data = frappe.wiz.regional_data; var data = frappe.wiz.regional_data;


slide.get_input("country").empty() 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() 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).'), help: __('The first user will become the System Manager (you can change this later).'),
onload: function(slide) { onload: function(slide) {
if(user!=="Administrator") {
if(frappe.session.user!=="Administrator") {
slide.form.fields_dict.password.$wrapper.toggle(false); slide.form.fields_dict.password.$wrapper.toggle(false);
slide.form.fields_dict.email.$wrapper.toggle(false); slide.form.fields_dict.email.$wrapper.toggle(false);
if(frappe.boot.user.first_name || frappe.boot.user.last_name) { if(frappe.boot.user.first_name || frappe.boot.user.last_name) {
@@ -580,7 +580,7 @@ function load_frappe_slides() {
}, },
css_class: "single-column" css_class: "single-column"
}; };
};
}


frappe.wiz.on("before_load", function() { frappe.wiz.on("before_load", function() {
load_frappe_slides(); load_frappe_slides();


+ 4
- 4
frappe/email/doctype/auto_email_report/auto_email_report.js View File

@@ -27,7 +27,7 @@ frappe.ui.form.on('Auto Email Report', {
"/api/method/frappe.email.doctype.auto_email_report.auto_email_report.download?" "/api/method/frappe.email.doctype.auto_email_report.auto_email_report.download?"
+"name="+encodeURIComponent(frm.doc.name))); +"name="+encodeURIComponent(frm.doc.name)));
if(!w) { if(!w) {
msgprint(__("Please enable pop-ups")); return;
frappe.msgprint(__("Please enable pop-ups")); return;
} }
}); });
frm.add_custom_button(__('Send Now'), function() { 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', method: 'frappe.email.doctype.auto_email_report.auto_email_report.send_now',
args: {name: frm.doc.name}, args: {name: frm.doc.name},
callback: function() { 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>\ var table = $('<table class="table table-bordered" style="cursor:pointer; margin:0px;"><thead>\
<tr><th style="width: 50%">'+__('Filter')+'</th><th>'+__('Value')+'</th></tr>\ <tr><th style="width: 50%">'+__('Filter')+'</th><th>'+__('Value')+'</th></tr>\
</thead><tbody></tbody></table>').appendTo(wrapper); </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 filters = JSON.parse(frm.doc.filters || '{}');
var report_filters = frappe.query_reports[frm.doc.report].filters; var report_filters = frappe.query_reports[frm.doc.report].filters;
frm.set_value('filter_meta', JSON.stringify(report_filters)); frm.set_value('filter_meta', JSON.stringify(report_filters));


report_filters_list = []
var report_filters_list = []
$.each(report_filters, function(key, val){ $.each(report_filters, function(key, val){
// Remove break fieldtype from the filters // Remove break fieldtype from the filters
if(val.fieldtype != 'Break') { if(val.fieldtype != 'Break') {


+ 16
- 17
frappe/email/doctype/email_account/email_account.js View File

@@ -18,7 +18,6 @@ frappe.email_defaults = {
"use_imap": 1 "use_imap": 1
}, },
"Sendgrid": { "Sendgrid": {
"enable_outgoing": 0,
"enable_outgoing": 1, "enable_outgoing": 1,
"smtp_server": "smtp.sendgrid.net", "smtp_server": "smtp.sendgrid.net",
"smtp_port": 587, "smtp_port": 587,
@@ -71,7 +70,7 @@ frappe.ui.form.on("Email Account", {
service: function(frm) { service: function(frm) {
$.each(frappe.email_defaults[frm.doc.service], function(key, value) { $.each(frappe.email_defaults[frm.doc.service], function(key, value) {
frm.set_value(key, value); frm.set_value(key, value);
})
});
if (!frm.doc.use_imap) { if (!frm.doc.use_imap) {
$.each(frappe.email_defaults_pop[frm.doc.service], function(key, value) { $.each(frappe.email_defaults_pop[frm.doc.service], function(key, value) {
frm.set_value(key, value); frm.set_value(key, value);
@@ -94,7 +93,7 @@ frappe.ui.form.on("Email Account", {
}, },


enable_incoming: function(frm) { 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); //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); frm.events.show_gmail_message_for_less_secure_apps(frm);


if(frappe.route_flags.delete_user_from_locals && frappe.route_flags.linked_user) { 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){ update_domain: function(frm){
if (!frm.doc.email_id && !frm.doc.service){ if (!frm.doc.email_id && !frm.doc.service){
return
return;
} }


frappe.call({ frappe.call({
@@ -145,17 +144,17 @@ frappe.ui.form.on("Email Account", {
}, },
callback: function (r) { callback: function (r) {
if (r.message) { if (r.message) {
frm.events.set_domain_fields(frm, r.message)
frm.events.set_domain_fields(frm, r.message);
} else { } else {
frm.set_value("domain", "")
frm.set_value("domain", "");
frappe.confirm(__('Email Domain not configured for this account, Create one?'), frappe.confirm(__('Email Domain not configured for this account, Create one?'),
function () { function () {
frappe.model.with_doctype("Email Domain", function() { frappe.model.with_doctype("Email Domain", function() {
frappe.route_options = { email_id: frm.doc.email_id }; 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"); var doc = frappe.model.get_new_doc("Email Domain");
frappe.set_route("Form", "Email Domain", doc.name); frappe.set_route("Form", "Email Domain", doc.name);
})
});
} }
); );
} }
@@ -165,26 +164,26 @@ frappe.ui.form.on("Email Account", {


set_domain_fields: function(frm, args) { set_domain_fields: function(frm, args) {
if(!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]); 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) { email_sync_option: function(frm) {
// confirm if the ALL sync option is selected // confirm if the ALL sync option is selected


if(frm.doc.email_sync_option == "ALL"){ 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\ 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() { 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 View File

@@ -70,9 +70,9 @@ frappe.ui.form.on("Email Alert", {
}, },
callback: function(r) { callback: function(r) {
if(r.message) { if(r.message) {
msgprint(r.message);
frappe.msgprint(r.message);
} else { } else {
msgprint(__('No alerts for today'));
frappe.msgprint(__('No alerts for today'));
} }
} }
}); });


+ 2
- 2
frappe/email/doctype/email_domain/email_domain.js View File

@@ -9,8 +9,8 @@ frappe.ui.form.on("Email Domain", {
frm.set_value("domain_name",frm.doc.email_id.split("@")[1]) 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; delete frappe.route_flags.return_to_email_account;
frappe.route_flags.set_domain_values = true frappe.route_flags.set_domain_values = true




+ 4
- 2
frappe/email/doctype/email_group/email_group.js View File

@@ -10,7 +10,8 @@ frappe.ui.form.on("Email Group", "refresh", function(frm) {


frm.add_custom_button(__("Import Subscribers"), function() { frm.add_custom_button(__("Import Subscribers"), function() {
frappe.prompt({fieldtype:"Select", options: frm.doc.__onload.import_types, 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({ frappe.call({
method: "frappe.email.doctype.email_group.email_group.import_from", method: "frappe.email.doctype.email_group.email_group.import_from",
args: { args: {
@@ -26,7 +27,8 @@ frappe.ui.form.on("Email Group", "refresh", function(frm) {


frm.add_custom_button(__("Add Subscribers"), function() { frm.add_custom_button(__("Add Subscribers"), function() {
frappe.prompt({fieldtype:"Text", 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({ frappe.call({
method: "frappe.email.doctype.email_group.email_group.add_subscribers", method: "frappe.email.doctype.email_group.email_group.add_subscribers",
args: { args: {


+ 2
- 2
frappe/email/doctype/email_queue/email_queue_list.js View File

@@ -1,10 +1,10 @@
frappe.listview_settings['Email Queue'] = { frappe.listview_settings['Email Queue'] = {
get_indicator: function(doc) { 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]; return [__(doc.status), colour[doc.status], "status,=," + doc.status];
}, },
refresh: function(doclist){ 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"))){ if (cint(frappe.defaults.get_default("hold_queue"))){
doclist.page.clear_inner_toolbar() doclist.page.clear_inner_toolbar()
doclist.page.add_inner_button(__("Resume Sending"), function() { doclist.page.add_inner_button(__("Resume Sending"), function() {


+ 2
- 1
frappe/email/doctype/newsletter/newsletter.js View File

@@ -1,10 +1,11 @@
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
// License: GNU General Public License v3. See license.txt // License: GNU General Public License v3. See license.txt
/* globals erpnext */


cur_frm.cscript.refresh = function(doc) { cur_frm.cscript.refresh = function(doc) {
if(window.erpnext) erpnext.toggle_naming_series(); if(window.erpnext) erpnext.toggle_naming_series();
if(!doc.__islocal && !cint(doc.email_sent) && !doc.__unsaved 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() { cur_frm.add_custom_button(__('Send'), function() {
return $c_obj(doc, 'send_emails', '', function(r) { return $c_obj(doc, 'send_emails', '', function(r) {
cur_frm.refresh(); cur_frm.refresh();


+ 4
- 4
frappe/printing/doctype/print_format/print_format.js View File

@@ -9,12 +9,12 @@ frappe.ui.form.on("Print Format", {
refresh: function(frm) { refresh: function(frm) {
frm.set_intro(""); frm.set_intro("");
frm.toggle_enable(["html", "doc_type", "module"], false); 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.toggle_enable(["html", "doc_type", "module"], true);
frm.enable_save(); 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.set_intro(__("Please duplicate this to make changes"));
} }
frm.trigger('render_buttons'); frm.trigger('render_buttons');
@@ -25,7 +25,7 @@ frappe.ui.form.on("Print Format", {
if(!frm.doc.custom_format) { if(!frm.doc.custom_format) {
frm.add_custom_button(__("Edit Format"), function() { frm.add_custom_button(__("Edit Format"), function() {
if(!frm.doc.doc_type) { if(!frm.doc.doc_type) {
msgprint(__("Please select DocType first"));
frappe.msgprint(__("Please select DocType first"));
return; return;
} }
frappe.set_route("print-format-builder", frm.doc.name); frappe.set_route("print-format-builder", frm.doc.name);
@@ -42,7 +42,7 @@ frappe.ui.form.on("Print Format", {
} }
}, },
custom_format: function(frm) { 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('align_labels_left', value);
frm.set_value('show_section_headings', value); frm.set_value('show_section_headings', value);
frm.set_value('line_breaks', value); frm.set_value('line_breaks', value);


+ 25
- 25
frappe/printing/page/print_format_builder/print_format_builder.js View File

@@ -123,7 +123,7 @@ frappe.PrintFormatBuilder = Class.extend({
var doctype = me.doctype_input.get_value(), var doctype = me.doctype_input.get_value(),
name = me.name_input.get_value(); name = me.name_input.get_value();
if(!(doctype && name)) { if(!(doctype && name)) {
msgprint(__("Both DocType and Name required"));
frappe.msgprint(__("Both DocType and Name required"));
return; return;
} }
me.setup_new_print_format(doctype, name); me.setup_new_print_format(doctype, name);
@@ -272,7 +272,7 @@ frappe.PrintFormatBuilder = Class.extend({
set_column(); set_column();


} else if(!in_list(["Section Break", "Column Break", "Fold"], f.fieldtype) } else if(!in_list(["Section Break", "Column Break", "Fold"], f.fieldtype)
&& f.label) {
&& f.label) {
if(!column) set_column(); if(!column) set_column();


if(f.fieldtype==="Table") { if(f.fieldtype==="Table") {
@@ -564,7 +564,7 @@ frappe.PrintFormatBuilder = Class.extend({
section.no_of_columns = 1; section.no_of_columns = 1;


var $section = $(frappe.render_template("print_format_builder_section", 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")) .appendTo(me.page.main.find(".print-format-builder-layout"))


me.setup_sortable_for_column($section.find(".print-format-builder-column").get(0)); 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"), var parent = $(this).parents(".print-format-builder-field:first"),
doctype = parent.attr("data-doctype"), doctype = parent.attr("data-doctype"),
label = parent.attr("data-label"), label = parent.attr("data-label"),
columns = parent.attr("data-columns").split(",")
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 = {}; widths = {};


$.each(columns, function(i, v) { $.each(columns, function(i, v) {
@@ -622,7 +622,7 @@ frappe.PrintFormatBuilder = Class.extend({
$.each(doc_fields, function(j, f) { $.each(doc_fields, function(j, f) {
if (f && !in_list(column_names, f.fieldname) if (f && !in_list(column_names, f.fieldname)
&& !in_list(["Section Break", "Column Break"], f.fieldtype) && f.label) { && !in_list(["Section Break", "Column Break"], f.fieldtype) && f.label) {
fields.push(f);
fields.push(f);
} }
}) })
// render checkboxes // render checkboxes
@@ -683,26 +683,26 @@ frappe.PrintFormatBuilder = Class.extend({
get_edit_html_dialog: function(title, label, $content) { get_edit_html_dialog: function(title, label, $content) {
var me = this; var me = this;
var d = new frappe.ui.Dialog({ 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 // set existing content in input
content = $content.data('content') || "";
var content = $content.data('content') || "";
if(content.indexOf(me.get_no_content())!==-1) content = ""; if(content.indexOf(me.get_no_content())!==-1) content = "";
d.set_input("content", content); d.set_input("content", content);


@@ -791,4 +791,4 @@ frappe.PrintFormatBuilder = Class.extend({
} }
}); });
} }
});
});

+ 1
- 1
frappe/public/js/frappe/assets.js View File

@@ -45,7 +45,7 @@ frappe.assets = {
}); });


// clear assets // clear assets
for(key in localStorage) {
for(var key in localStorage) {
if(key.indexOf("desk_assets:")===0 || key.indexOf("_page:")===0 if(key.indexOf("desk_assets:")===0 || key.indexOf("_page:")===0
|| key.indexOf("_doctype:")===0 || key.indexOf("preferred_breadcrumbs:")===0) { || key.indexOf("_doctype:")===0 || key.indexOf("preferred_breadcrumbs:")===0) {
localStorage.removeItem(key); localStorage.removeItem(key);


+ 1
- 1
frappe/public/js/frappe/db.js View File

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


+ 2
- 2
frappe/public/js/frappe/defaults.js View File

@@ -26,12 +26,12 @@ frappe.defaults = {
return d; return d;
}, },
get_global_default: function(key) { get_global_default: function(key) {
var d = sys_defaults[key];
var d = frappe.sys_defaults[key];
if($.isArray(d)) d = d[0]; if($.isArray(d)) d = d[0];
return d; return d;
}, },
get_global_defaults: function(key) { get_global_defaults: function(key) {
var d = sys_defaults[key];
var d = frappe.sys_defaults[key];
if(!$.isArray(d)) d = [d]; if(!$.isArray(d)) d = [d];
return d; return d;
}, },


+ 62
- 61
frappe/public/js/frappe/desk.js View File

@@ -99,9 +99,9 @@ frappe.Application = Class.extend({
}); });
dialog.get_close_btn().toggle(false); 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){ if (email_list[u]===frappe.user.name){
this.set_password(email_list[u]) 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", "fieldtype": "HTML",
"fieldname": "checking" "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) 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() { load_bootinfo: function() {
if(frappe.boot) { if(frappe.boot) {
@@ -269,15 +269,18 @@ frappe.Application = Class.extend({
}, },


set_globals: function() { 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 = 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.ui.py_date_format = frappe.boot.sysdefaults.date_format.replace('dd', '%d').replace('mm', '%m').replace('yyyy', '%Y');
frappe.boot.user.last_selected_values = {}; frappe.boot.user.last_selected_values = {};
}, },
@@ -285,7 +288,7 @@ frappe.Application = Class.extend({
// clear cached pages if timestamp is not found // clear cached pages if timestamp is not found
if(localStorage["page_info"]) { if(localStorage["page_info"]) {
frappe.boot.allowed_pages = []; 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) { $.each(frappe.boot.page_info, function(name, p) {
if(!page_info[name] || (page_info[name].modified != p.modified)) { if(!page_info[name] || (page_info[name].modified != p.modified)) {
delete localStorage["_page:" + name]; delete localStorage["_page:" + name];
@@ -293,19 +296,18 @@ frappe.Application = Class.extend({
frappe.boot.allowed_pages.push(name); frappe.boot.allowed_pages.push(name);
}); });
} else { } 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); localStorage["page_info"] = JSON.stringify(frappe.boot.page_info);
}, },
set_as_guest: function() { 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() { make_page_container: function() {
if($("#body_div").length) { 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++) { for (var i=0, l=frappe.boot.desktop_icons.length; i < l; i++) {
var m = frappe.boot.desktop_icons[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'); 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'); var m = frappe.get_module('Core');
if(show_module(m)) add_to_out(m)
if(show_module(m)) add_to_out(m);
} }


return out; return out;
@@ -589,7 +590,7 @@ frappe.add_to_desktop = function(label, doctype, report) {
}, },
callback: function(r) { callback: function(r) {
if(r.message) { if(r.message) {
show_alert(__("Added"));
frappe.show_alert(__("Added"));
} }
} }
}); });


+ 55
- 55
frappe/public/js/frappe/dom.js View File

@@ -58,19 +58,19 @@ frappe.dom = {
}, },
is_element_in_viewport: function (el) { 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) { set_style: function(txt, id) {
@@ -115,7 +115,7 @@ frappe.dom = {
css: function(ele, s) { css: function(ele, s) {
if(ele && s) { if(ele && s) {
$.extend(ele.style, s); $.extend(ele.style, s);
};
}
return ele; return ele;
}, },
freeze: function(msg, css_class) { freeze: function(msg, css_class) {
@@ -155,7 +155,7 @@ frappe.dom = {
save_selection: function() { save_selection: function() {
// via http://stackoverflow.com/questions/5605401/insert-link-in-contenteditable-element // via http://stackoverflow.com/questions/5605401/insert-link-in-contenteditable-element
if (window.getSelection) { if (window.getSelection) {
sel = window.getSelection();
var sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) { if (sel.getRangeAt && sel.rangeCount) {
var ranges = []; var ranges = [];
for (var i = 0, len = sel.rangeCount; i < len; ++i) { for (var i = 0, len = sel.rangeCount; i < len; ++i) {
@@ -171,7 +171,7 @@ frappe.dom = {
restore_selection: function(savedSel) { restore_selection: function(savedSel) {
if (savedSel) { if (savedSel) {
if (window.getSelection) { if (window.getSelection) {
sel = window.getSelection();
var sel = window.getSelection();
sel.removeAllRanges(); sel.removeAllRanges();
for (var i = 0, len = savedSel.length; i < len; ++i) { for (var i = 0, len = savedSel.length; i < len; ++i) {
sel.addRange(savedSel[i]); sel.addRange(savedSel[i]);
@@ -242,48 +242,48 @@ frappe._in = function(source, target) {
})(jQuery); })(jQuery);


(function($) { (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); })(jQuery);

+ 4
- 4
frappe/public/js/frappe/feedback.js View File

@@ -3,7 +3,7 @@ frappe.provide("frappe.utils")
frappe.utils.Feedback = Class.extend({ frappe.utils.Feedback = Class.extend({
resend_feedback_request: function(doc) { resend_feedback_request: function(doc) {
/* resend the feedback request email */ /* resend the feedback request email */
args = {
var args = {
reference_name: doc.reference_name, reference_name: doc.reference_name,
reference_doctype: doc.reference_doctype, reference_doctype: doc.reference_doctype,
request: doc.feedback_request, request: doc.feedback_request,
@@ -14,12 +14,12 @@ frappe.utils.Feedback = Class.extend({
manual_feedback_request: function(doc) { manual_feedback_request: function(doc) {
var me = this; var me = this;


args = {
var args = {
reference_doctype: doc.doctype, reference_doctype: doc.doctype,
reference_name: doc.name reference_name: doc.name
} }
if(frappe.boot.feedback_triggers[doc.doctype]) { 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 }) $.extend(args, { trigger: feedback_trigger })
me.get_feedback_request_details(args, false) me.get_feedback_request_details(args, false)
} else{ } else{
@@ -43,7 +43,7 @@ frappe.utils.Feedback = Class.extend({


make_feedback_request_dialog: function(args, is_resend) { make_feedback_request_dialog: function(args, is_resend) {
var me = this; var me = this;
dialog = new frappe.ui.Dialog({
var dialog = new frappe.ui.Dialog({
title: __("{0} Feedback Request", [ is_resend? "Resend": "Send" ]), title: __("{0} Feedback Request", [ is_resend? "Resend": "Send" ]),
fields: [ fields: [
{ {


+ 48
- 47
frappe/public/js/frappe/form/control.js View File

@@ -18,7 +18,7 @@ frappe.ui.form.Control = Class.extend({
// if developer_mode=1, show fieldname as tooltip // if developer_mode=1, show fieldname as tooltip
if(frappe.boot.user && frappe.boot.user.name==="Administrator" && if(frappe.boot.user && frappe.boot.user.name==="Administrator" &&
frappe.boot.developer_mode===1 && this.$wrapper) { 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) { if(this.render_input) {
@@ -75,8 +75,9 @@ frappe.ui.form.Control = Class.extend({
if (this.doctype && status==="Read" && !this.only_input if (this.doctype && status==="Read" && !this.only_input
&& is_null(frappe.model.get_value(this.doctype, this.docname, this.df.fieldname)) && is_null(frappe.model.get_value(this.doctype, this.docname, this.df.fieldname))
&& !in_list(["HTML", "Image"], this.df.fieldtype)) { && !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; return status;
@@ -189,19 +190,19 @@ frappe.ui.form.ControlImage = frappe.ui.form.Control.extend({
this.$body = $("<div></div>").appendTo(this.$wrapper) this.$body = $("<div></div>").appendTo(this.$wrapper)
.css({"margin-bottom": "10px"}) .css({"margin-bottom": "10px"})
this.$wrapper.on("refresh", function() { 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); $('<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'], if (in_list(['Data', 'Link', 'Dynamic Link', 'Password', 'Select', 'Read Only', 'Attach', 'Attach Image'],
this.df.fieldtype)) { this.df.fieldtype)) {
this.$input.attr("maxlength", this.df.length || 140);
this.$input.attr("maxlength", this.df.length || 140);
} }


this.set_input_attributes(); this.set_input_attributes();
@@ -476,7 +477,7 @@ frappe.ui.form.ControlData = frappe.ui.form.ControlInput.extend({
callback(""); callback("");
return; return;
} }
v1 = ''
var v1 = ''
// phone may start with + and must only have numbers later, '-' and ' ' are stripped // phone may start with + and must only have numbers later, '-' and ' ' are stripped
v = v.replace(/ /g, '').replace(/-/g, '').replace(/\(/g, '').replace(/\)/g, ''); 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; var invalid_email = false;
email_list.forEach(function(email) { email_list.forEach(function(email) {
if (!validate_email(email)) { if (!validate_email(email)) {
msgprint(__("Invalid Email: {0}", [email]));
frappe.msgprint(__("Invalid Email: {0}", [email]));
invalid_email = true; invalid_email = true;
} }
}); });
@@ -671,18 +672,18 @@ frappe.ui.form.ControlDate = frappe.ui.form.ControlData.extend({
}, },
parse: function(value) { parse: function(value) {
if(value) { if(value) {
return dateutil.user_to_str(value);
return frappe.datetime.user_to_str(value);
} }
}, },
format_for_input: function(value) { format_for_input: function(value) {
if(value) { if(value) {
return dateutil.str_to_user(value);
return frappe.datetime.str_to_user(value);
} }
return ""; return "";
}, },
validate: function(value, callback) { 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(""); callback("");
return; return;
} }
@@ -733,14 +734,14 @@ frappe.ui.form.ControlDatetime = frappe.ui.form.ControlDate.extend({
parse: function(value) { parse: function(value) {
if(value) { if(value) {
// parse and convert // 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; return value;
}, },
format_for_input: function(value) { format_for_input: function(value) {
if(value) { if(value) {
// convert and format // 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 || ""; return value || "";
} }
@@ -789,16 +790,16 @@ frappe.ui.form.ControlDateRange = frappe.ui.form.ControlData.extend({
}, },
parse: function(value) { parse: function(value) {
if(value && (value.indexOf(',') !== -1 || value.indexOf('to') !== -1)) { 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]; return [from_date, to_date];
} }
}, },
format_for_input: function(value,value2) { format_for_input: function(value,value2) {
if(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 value + " to " + value2
} }
return ""; return "";
@@ -1025,7 +1026,7 @@ frappe.ui.form.ControlAttach = frappe.ui.form.ControlData.extend({
me.dialog.hide(); me.dialog.hide();
me.frm.save(); me.frm.save();
} else { } else {
msgprint(__("Please attach a file or set a URL"));
frappe.msgprint(__("Please attach a file or set a URL"));
} }
}, },
callback: function(attachment, r) { callback: function(attachment, r) {
@@ -1346,7 +1347,7 @@ frappe.ui.form.ControlLink = frappe.ui.form.ControlData.extend({
return true; return true;
}, },
item: function (item, input) { item: function (item, input) {
d = this.get_item(item.value);
var d = this.get_item(item.value);
if(!d.label) { d.label = d.value; } if(!d.label) { d.label = d.value; }


var _label = (me.translate_values) ? __(d.label) : d.label; 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", value: "create_new__link_option",
action: me.new_doc action: me.new_doc
}) })
};
}
// advanced search // advanced search
r.results.push({ r.results.push({
label: "<span class='text-primary link-option'>" 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); var options = frappe.model.get_value(this.df.parent, this.docname, this.df.options);
// if(!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])); // [frappe.meta.get_docfield(this.df.parent, this.df.options, this.docname).label]));
// } // }
return options; return options;
@@ -1797,7 +1798,7 @@ frappe.ui.form.ControlTextEditor = frappe.ui.form.ControlCode.extend({
me.editor.summernote('insertImage', selected); me.editor.summernote('insertImage', selected);
me.image_dialog.hide(); me.image_dialog.hide();
} else { } else {
msgprint(__("Please attach a file or set a URL"));
frappe.msgprint(__("Please attach a file or set a URL"));
} }
}, },
callback: function(attachment, r) { callback: function(attachment, r) {
@@ -1908,9 +1909,9 @@ frappe.ui.form.ControlSignature = frappe.ui.form.ControlData.extend({


// make jSignature field // make jSignature field
this.$pad = $('<div class="signature-field"></div>') 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"> this.img_wrapper = $(`<div class="signature-display">
<div class="missing-image attach-missing-image"> <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.set_editable(this.get_status()=="Write");
this.load_pad(); this.load_pad();
if(this.get_status()=="Read") { if(this.get_status()=="Read") {
$(this.disp_area).toggle(false);
$(this.disp_area).toggle(false);
} }
}, },
set_image: function(value) { set_image: function(value) {
@@ -1976,15 +1977,15 @@ frappe.ui.form.ControlSignature = frappe.ui.form.ControlData.extend({
} }
}, },
set_editable: function(editable) { 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) { set_my_value: function(value) {
if (this.saving || this.loading) return; if (this.saving || this.loading) return;


+ 3
- 2
frappe/public/js/frappe/form/dashboard.js View File

@@ -259,7 +259,7 @@ frappe.ui.form.Dashboard = Class.extend({
group.items.forEach(function(item) { items.push(item); }); 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({ frappe.call({
type: "GET", type: "GET",
@@ -359,7 +359,7 @@ frappe.ui.form.Dashboard = Class.extend({
} else { } else {
heatmap_message.addClass('hidden'); heatmap_message.addClass('hidden');
} }
}
}
}, },


add_indicator: function(label, color) { add_indicator: function(label, color) {
@@ -370,6 +370,7 @@ frappe.ui.form.Dashboard = Class.extend({
// set colspan // set colspan
var indicators = this.stats_area_row.find('.indicator-column'); var indicators = this.stats_area_row.find('.indicator-column');
var n_indicators = indicators.length + 1; var n_indicators = indicators.length + 1;
var colspan;
if(n_indicators > 4) { colspan = 3 } if(n_indicators > 4) { colspan = 3 }
else { colspan = 12 / n_indicators; } else { colspan = 12 / n_indicators; }




+ 4
- 4
frappe/public/js/frappe/form/footer/assign_to.js View File

@@ -55,13 +55,13 @@ frappe.ui.form.AssignTo = Class.extend({
</li>', info)) </li>', info))
.insertBefore(this.parent.find('.add-assignment')); .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.primary_action = this.frm.page.add_menu_item(__("Assignment Complete"), function() {
me.remove(user);
me.remove(frappe.session.user);
}, "fa fa-check", "btn-success") }, "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(); me.parent.find('a.close').remove();
} }
} }
@@ -164,7 +164,7 @@ frappe.ui.form.AssignToDialog = Class.extend({
toggle_myself: function(myself) { toggle_myself: function(myself) {
var me = this; var me = this;
if($(myself).prop("checked")) { if($(myself).prop("checked")) {
me.set_value("assign_to", user);
me.set_value("assign_to", frappe.session.user);
me.set_value("notify", 0); me.set_value("notify", 0);
me.get_field("notify").$wrapper.toggle(false); me.get_field("notify").$wrapper.toggle(false);
me.get_field("assign_to").$wrapper.toggle(false); me.get_field("assign_to").$wrapper.toggle(false);


+ 14
- 14
frappe/public/js/frappe/form/footer/attachments.js View File

@@ -18,7 +18,7 @@ frappe.ui.form.Attachments = Class.extend({
}, },
max_reached: function() { max_reached: function() {
// no of attachments // 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 // button if the number of attachments is less than max
if(n < this.frm.meta.max_attachments || !this.frm.meta.max_attachments) { 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) { callback: function(r,rt) {
if(r.exc) { if(r.exc) {
if(!r._server_messages) if(!r._server_messages)
msgprint(__("There were errors"));
frappe.msgprint(__("There were errors"));
return; return;
} }
me.remove_fileid(fileid); me.remove_fileid(fileid);
@@ -207,13 +207,13 @@ frappe.ui.form.Attachments = Class.extend({
}); });


frappe.ui.get_upload_dialog = function(opts){ 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, no_focus: true,
fields: [
fields: [
{fieldtype: "Section Break"}, {fieldtype: "Section Break"},
{"fieldtype": "Link" , "fieldname": "file" , "label": __("Select uploaded file"), "options": "File"}, {"fieldtype": "Link" , "fieldname": "file" , "label": __("Select uploaded file"), "options": "File"},
],
],
}); });


var btn = dialog.set_primary_action(__("Attach")); var btn = dialog.set_primary_action(__("Attach"));
@@ -224,22 +224,22 @@ frappe.ui.get_upload_dialog = function(opts){


var fd = dialog.fields_dict; var fd = dialog.fields_dict;
$(fd.file.input).change(function() { $(fd.file.input).change(function() {
frappe.call({
frappe.call({
'method': 'frappe.client.get_value', 'method': 'frappe.client.get_value',
'args': { '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){ callback: function(r){
if(!r.message) return; 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); dialog.$wrapper.find('.private-file input').prop('checked', r.message.is_private);
opts.args.filename = r.message.file_name opts.args.filename = r.message.file_name
} }
});
});
}); });
frappe.upload.make({ frappe.upload.make({
parent: upload_area, parent: upload_area,


+ 12
- 12
frappe/public/js/frappe/form/footer/timeline.js View File

@@ -76,10 +76,10 @@ frappe.ui.form.Timeline = Class.extend({


setup_email_button: function() { setup_email_button: function() {
var me = this; 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) this.email_button = this.wrapper.find(selector)
.on("click", function() { .on("click", function() {
args = {
var args = {
doc: me.frm.doc, doc: me.frm.doc,
frm: me.frm, frm: me.frm,
recipients: me.get_recipient() recipients: me.get_recipient()
@@ -116,13 +116,13 @@ frappe.ui.form.Timeline = Class.extend({


var communications = this.get_communications(true); 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 // more btn
if (this.more===undefined && communications.length===20) { 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 = 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); p[0], me.frm.docname);


if(df && !df.hidden) { 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); null, me.frm.perm);


if(field_display_status === 'Read' || field_display_status === 'Write') { 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_doctype: this.frm.doctype,
reference_name: this.frm.docname, reference_name: this.frm.docname,
content: comment, content: comment,
sender: user
sender: frappe.session.user
} }
}, },
btn: btn, btn: btn,


+ 1
- 1
frappe/public/js/frappe/form/footer/timeline_item.html View File

@@ -41,7 +41,7 @@
</span> </span>
<span class="text-muted" style="font-weight: normal;"> <span class="text-muted" style="font-weight: normal;">
&ndash; {%= data.comment_on %}</span> &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\')) { %} {% if (frappe.model.can_read(\'Communication\')) { %}
<a href="#Form/{%= data.doctype %}/{%= data.name %}" <a href="#Form/{%= data.doctype %}/{%= data.name %}"
class="text-muted"> class="text-muted">


+ 3
- 9
frappe/public/js/frappe/form/form_viewers.js View File

@@ -43,9 +43,9 @@ frappe.ui.form.Viewers = Class.extend({
if (data_updated && new_users.length) { if (data_updated && new_users.length) {
// new user viewing this document, who wasn't viewing in the past // new user viewing this document, who wasn't viewing in the past
if (new_users.length===1) { 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 { } 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 doctype = data.doctype;
var docname = data.docname; var docname = data.docname;
var past_viewers = (frappe.model.get_docinfo(doctype, docname).viewers || {}).past || []; var past_viewers = (frappe.model.get_docinfo(doctype, docname).viewers || {}).past || [];
var new_viewers = [];
var viewers = data.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", { frappe.model.set_docinfo(doctype, docname, "viewers", {
past: past_viewers.concat(new_viewers), past: past_viewers.concat(new_viewers),


+ 5
- 5
frappe/public/js/frappe/form/formatters.js View File

@@ -99,7 +99,7 @@ frappe.form.formatters = {
}, },
Date: function(value) { Date: function(value) {
if (value) { if (value) {
value = dateutil.str_to_user(value);
value = frappe.datetime.str_to_user(value);
// handle invalid date // handle invalid date
if (value==="Invalid date") { if (value==="Invalid date") {
value = null; value = null;
@@ -110,7 +110,7 @@ frappe.form.formatters = {
}, },
Datetime: function(value) { Datetime: function(value) {
if(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) { if(frappe.boot.sysdefaults.time_zone) {
m = m.tz(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>" return "<pre>" + (value==null ? "" : $("<div>").text(value).html()) + "</pre>"
}, },
WorkflowState: function(value) { WorkflowState: function(value) {
workflow_state = frappe.get_doc("Workflow State", value);
var workflow_state = frappe.get_doc("Workflow State", value);
if(workflow_state) { if(workflow_state) {
return repl("<span class='label label-%(style)s' \ return repl("<span class='label label-%(style)s' \
data-workflow-state='%(value)s'\ data-workflow-state='%(value)s'\
@@ -217,7 +217,7 @@ frappe.format = function(value, df, options, doc) {
df._options = doc ? doc[df.options] : null; 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); var formatted = formatter(value, df, options, doc);


@@ -231,7 +231,7 @@ frappe.get_format_helper = function(doc) {
var helper = { var helper = {
get_formatted: function(fieldname) { get_formatted: function(fieldname) {
var df = frappe.meta.get_docfield(doc.doctype, 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); return frappe.format(doc[fieldname], df, {inline:1}, doc);
} }
}; };


+ 36
- 36
frappe/public/js/frappe/form/grid.js View File

@@ -31,7 +31,7 @@ frappe.ui.form.Grid = Class.extend({
this.multiple_set = false; this.multiple_set = false;
if(this.frm && this.frm.meta.__form_grid_templates if(this.frm && this.frm.meta.__form_grid_templates
&& this.frm.meta.__form_grid_templates[this.df.fieldname]) { && 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; this.is_grid = true;
@@ -72,7 +72,7 @@ frappe.ui.form.Grid = Class.extend({
setup_check: function() { setup_check: function() {
var me = this; var me = this;
this.wrapper.on('click', '.grid-row-check', function(e) { this.wrapper.on('click', '.grid-row-check', function(e) {
$check = $(this);
var $check = $(this);
if($check.parents('.grid-heading-row:first').length!==0) { if($check.parents('.grid-heading-row:first').length!==0) {
// select all? // select all?
var checked = $check.prop('checked'); var checked = $check.prop('checked');
@@ -102,7 +102,7 @@ frappe.ui.form.Grid = Class.extend({
}); });
}, },
select_row: function(name) { select_row: function(name) {
me.grid_rows_by_docname[name].select();
this.grid_rows_by_docname[name].select();
}, },
refresh_remove_rows_button: function() { refresh_remove_rows_button: function() {
this.remove_rows_button.toggleClass('hide', this.remove_rows_button.toggleClass('hide',
@@ -345,11 +345,11 @@ frappe.ui.form.Grid = Class.extend({
this.refresh(); this.refresh();
}, },
toggle_enable: function(fieldname, enable) { 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(); this.refresh();
}, },
toggle_display: function(fieldname, show) { toggle_display: function(fieldname, show) {
this.get_docfield(fieldname).hidden = show ? 0 : 1;;
this.get_docfield(fieldname).hidden = show ? 0 : 1;
this.refresh(); this.refresh();
}, },
get_docfield: function(fieldname) { get_docfield: function(fieldname) {
@@ -428,27 +428,25 @@ frappe.ui.form.Grid = Class.extend({
&& (this.editable_fields || df.in_list_view) && (this.editable_fields || df.in_list_view)
&& (this.frm && this.frm.get_perm(df.permlevel, "read") || !this.frm) && (this.frm && this.frm.get_perm(df.permlevel, "read") || !this.frm)
&& !in_list(frappe.model.layout_fields, df.fieldtype)) { && !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 // redistribute if total-col size is less than 12
@@ -586,7 +584,7 @@ frappe.ui.form.Grid = Class.extend({


// add data // add data
$.each(me.frm.doc[me.df.fieldname] || [], function(i, d) { $.each(me.frm.doc[me.df.fieldname] || [], function(i, d) {
row = [];
var row = [];
$.each(data[2], function(i, fieldname) { $.each(data[2], function(i, fieldname) {
var value = d[fieldname]; var value = d[fieldname];


@@ -759,9 +757,10 @@ frappe.ui.form.GridRow = Class.extend({
// index (1, 2, 3 etc) // index (1, 2, 3 etc)
if(!this.row_index) { if(!this.row_index) {
var txt = (this.doc ? this.doc.idx : "&nbsp;"); 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) .appendTo(this.row)
.on('click', function(e) { .on('click', function(e) {
if(!$(e.target).hasClass('grid-row-check')) { if(!$(e.target).hasClass('grid-row-check')) {
@@ -852,7 +851,7 @@ frappe.ui.form.GridRow = Class.extend({
add_class += (["Check"].indexOf(df.fieldtype)!==-1) ? add_class += (["Check"].indexOf(df.fieldtype)!==-1) ?
" text-center": ""; " 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-fieldname", df.fieldname)
.attr("data-fieldtype", df.fieldtype) .attr("data-fieldtype", df.fieldtype)
.data("df", df) .data("df", df)
@@ -861,7 +860,7 @@ frappe.ui.form.GridRow = Class.extend({
if(frappe.ui.form.editable_row===me) { if(frappe.ui.form.editable_row===me) {
return; return;
} }
out = me.toggle_editable_row();
var out = me.toggle_editable_row();
var col = this; var col = this;
setTimeout(function() { setTimeout(function() {
$(col).find('input[type="Text"]:first').focus(); $(col).find('input[type="Text"]:first').focus();
@@ -890,7 +889,7 @@ frappe.ui.form.GridRow = Class.extend({
if(frappe.ui.form.editable_row if(frappe.ui.form.editable_row
&& frappe.ui.form.editable_row !== this) { && frappe.ui.form.editable_row !== this) {
frappe.ui.form.editable_row.toggle_editable_row(false); frappe.ui.form.editable_row.toggle_editable_row(false);
};
}


this.row.toggleClass('editable-row', true); 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.get_query = this.grid.get_field(df.fieldname).get_query;
field.refresh(); field.refresh();
if(field.$input) { if(field.$input) {
field.$input.addClass('input-sm');
field.$input field.$input
.addClass('input-sm')
.attr('data-col-idx', column.column_index) .attr('data-col-idx', column.column_index)
.attr('placeholder', __(df.label)); .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); this.set_arrow_keys(field);
@@ -964,6 +963,7 @@ frappe.ui.form.GridRow = Class.extend({
var me = this; var me = this;
if(field.$input) { if(field.$input) {
field.$input.on('keydown', function(e) { 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)) { if(!in_list([TAB, UP_ARROW, DOWN_ARROW], e.which)) {
return; return;
} }


+ 12
- 16
frappe/public/js/frappe/form/layout.js View File

@@ -54,18 +54,14 @@ frappe.ui.form.Layout = Class.extend({
this.make_section(); this.make_section();
} }
$.each(this.fields, function(i, df) { $.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) { if(me.frm) {
fieldobj.perm = me.frm.perm; fieldobj.perm = me.frm.perm;
} }
};
}
refresh && fieldobj.refresh && fieldobj.refresh(); refresh && fieldobj.refresh && fieldobj.refresh();
} }
}, },
@@ -249,7 +245,7 @@ frappe.ui.form.Layout = Class.extend({
}, },
handle_tab: function(doctype, fieldname, shift) { handle_tab: function(doctype, fieldname, shift) {
var me = this, var me = this,
grid_row = null;
grid_row = null,
prev = null, prev = null,
fields = me.fields_list, fields = me.fields_list,
in_grid = false, in_grid = false,
@@ -357,7 +353,7 @@ frappe.ui.form.Layout = Class.extend({
// build dependants' dictionary // build dependants' dictionary
var has_dep = false; var has_dep = false;


for(fkey in this.fields_list) {
for(var fkey in this.fields_list) {
var f = this.fields_list[fkey]; var f = this.fields_list[fkey];
f.dependencies_clear = true; f.dependencies_clear = true;
if(f.df.depends_on) { if(f.df.depends_on) {
@@ -409,7 +405,7 @@ frappe.ui.form.Layout = Class.extend({


if(expression.substr(0,5)=='eval:') { if(expression.substr(0,5)=='eval:') {
out = eval(expression.substr(5)); 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); out = this.frm.script_manager.trigger(expression.substr(3), this.doctype, this.docname);
} else { } else {
var value = doc[expression]; var value = doc[expression];


+ 58
- 55
frappe/public/js/frappe/form/link_selector.js View File

@@ -2,22 +2,24 @@
// MIT License. See license.txt // MIT License. See license.txt


frappe.ui.form.LinkSelector = Class.extend({ frappe.ui.form.LinkSelector = Class.extend({
init: function(opts) {
init: function (opts) {
/* help: Options: doctype, get_query, target */ /* help: Options: doctype, get_query, target */
$.extend(this, opts); $.extend(this, opts);


var me = this; 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(); me.make();
}); });
} else { } else {
this.make(); this.make();
} }
}, },
make: function() {
make: function () {
var me = this;

this.dialog = new frappe.ui.Dialog({ 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: [ fields: [
{ {
fieldtype: "Data", fieldname: "txt", label: __("Beginning with"), fieldtype: "Data", fieldname: "txt", label: __("Beginning with"),
@@ -28,46 +30,45 @@ frappe.ui.form.LinkSelector = Class.extend({
} }
], ],
primary_action_label: __("Search"), primary_action_label: __("Search"),
primary_action: function() {
primary_action: function () {
me.search(); me.search();
} }
}); });
me = this;


if(this.txt)
if (this.txt)
this.dialog.fields_dict.txt.set_input(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(); me.search();
} }
}); });
this.dialog.show(); this.dialog.show();
this.search(); this.search();
}, },
search: function() {
search: function () {
var args = { 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); this.target.set_custom_query(args);
} }


// load custom query from grid // 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) { && this.target.fieldinfo[this.fieldname].get_query) {
$.extend(args, $.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; var parent = me.dialog.fields_dict.results.$wrapper;
parent.empty(); 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">\ var row = $(repl('<div class="row link-select-row">\
<div class="col-xs-4">\ <div class="col-xs-4">\
<b><a href="#">%(name)s</a></b></div>\ <b><a href="#">%(name)s</a></b></div>\
@@ -80,56 +81,58 @@ frappe.ui.form.LinkSelector = Class.extend({


row.find("a") row.find("a")
.attr('data-value', v[0]) .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 { } else {
$('<p><br><span class="text-muted">' + __("No Results") + '</span>' $('<p><br><span class="text-muted">' + __("No Results") + '</span>'
+ (frappe.model.can_create(me.doctype) ? + (frappe.model.can_create(me.doctype) ?
('<br><br><a class="new-doc btn btn-default btn-sm">' ('<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(); me.target.new_doc();
}); });
} }
}, this.dialog.get_primary_btn()); }, this.dialog.get_primary_btn());


}, },
set_in_grid: function(value) {
set_in_grid: function (value) {
var me = this, updated = false; 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); 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; updated = true;
return false; return false;
} }
}); });
if(!updated) {
if (!updated) {
var d = me.target.add_new_row(); var d = me.target.add_new_row();
frappe.model.set_value(d.doctype, d.name, me.fieldname, value); 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); 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); }, 100);
}); });
} }
@@ -137,19 +140,19 @@ frappe.ui.form.LinkSelector = Class.extend({
} else { } else {
var d = me.target.add_new_row(); var d = me.target.add_new_row();
frappe.model.set_value(d.doctype, d.name, me.fieldname, value); 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 = { args = {
txt: '' txt: ''
} }
} }
args.doctype = doctype; args.doctype = doctype;
if(!args.searchfield) {
if (!args.searchfield) {
args.searchfield = 'name'; args.searchfield = 'name';
} }


@@ -157,7 +160,7 @@ frappe.link_search = function(doctype, args, callback, btn) {
method: "frappe.desk.search.search_widget", method: "frappe.desk.search.search_widget",
type: "GET", type: "GET",
args: args, args: args,
callback: function(r) {
callback: function (r) {
callback && callback(r); callback && callback(r);
}, },
btn: btn btn: btn


+ 81
- 78
frappe/public/js/frappe/form/print.js View File

@@ -1,26 +1,26 @@
frappe.provide("frappe.ui.form"); frappe.provide("frappe.ui.form");


frappe.ui.form.PrintPreview = Class.extend({ frappe.ui.form.PrintPreview = Class.extend({
init: function(opts) {
init: function (opts) {
$.extend(this, opts); $.extend(this, opts);
this.make(); this.make();
this.bind_events(); this.bind_events();
}, },
make: function() {
make: function () {
this.wrapper = this.frm.page.add_view("print", frappe.render_template("print_layout", {})); this.wrapper = this.frm.page.add_view("print", frappe.render_template("print_layout", {}));


// only system manager can edit // only system manager can edit
this.wrapper.find(".btn-print-edit").toggle(frappe.user.has_role("System Manager")); this.wrapper.find(".btn-print-edit").toggle(frappe.user.has_role("System Manager"));
}, },
bind_events: function() {
bind_events: function () {
var me = this; var me = this;
this.wrapper.find(".btn-print-close").click(function() {
this.wrapper.find(".btn-print-close").click(function () {
me.frm.hide_print(); me.frm.hide_print();
}); });


// hide print view on pressing escape, only if there is no focus on any input // 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(); 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_formats = frappe.meta.get_print_formats(this.frm.meta.name);
this.print_letterhead = this.wrapper this.print_letterhead = this.wrapper
.find(".print-letterhead") .find(".print-letterhead")
.on("change", function() { me.print_sel.trigger("change"); })
.on("change", function () { me.print_sel.trigger("change"); })
.prop("checked", cint( .prop("checked", cint(
(frappe.model.get_doc(":Print Settings", "Print Settings") (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 this.print_sel = this.wrapper
.find(".print-preview-select") .find(".print-preview-select")
.on("change", function() {
.on("change", function () {
me.multilingual_preview() me.multilingual_preview()
}); });


//On selection of language get code and pass it to preview method //On selection of language get code and pass it to preview method
this.language_sel = this.wrapper this.language_sel = this.wrapper
.find(".languages") .find(".languages")
.on("change", function(){
.on("change", function () {
me.lang_code = me.language_sel.val() me.lang_code = me.language_sel.val()
me.multilingual_preview() 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(); me.print_old_style();
} else { } else {
me.printit(); 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(); me.new_page_preview_old_style();
} else { } else {
me.new_page_preview(); 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( var w = window.open(
frappe.urllib.get_full_url("/api/method/frappe.utils.print_format.download_pdf?" 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(); 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); frappe.set_route("print-format-builder", print_format.name);
} else { } else {
frappe.set_route("Form", "Print Format", print_format.name); frappe.set_route("Form", "Print Format", print_format.name);
} }
} else { } else {
// start a new print format // 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")); }, __("New Custom Print Format"), __("Start"));
} }
}); });
}, },
set_user_lang: function(){
set_user_lang: function () {
this.lang_code = this.frm.doc.language; this.lang_code = this.frm.doc.language;
// Load all languages in the field // Load all languages in the field
this.language_sel.empty() this.language_sel.empty()
@@ -107,9 +110,9 @@ frappe.ui.form.PrintPreview = Class.extend({
.val(this.lang_code); .val(this.lang_code);
this.preview(); this.preview();
}, },
multilingual_preview: function(){
multilingual_preview: function () {
var me = this; var me = this;
if(this.is_old_style()) {
if (this.is_old_style()) {
me.wrapper.find(".btn-download-pdf").toggle(false); me.wrapper.find(".btn-download-pdf").toggle(false);
me.set_style(); me.set_style();
me.preview_old_style(); me.preview_old_style();
@@ -118,30 +121,30 @@ frappe.ui.form.PrintPreview = Class.extend({
me.preview(); me.preview();
} }
}, },
preview: function() {
preview: function () {
var me = this; var me = this;
this.get_print_html(function(out) {
this.get_print_html(function (out) {
me.wrapper.find(".print-format").html(out.html); me.wrapper.find(".print-format").html(out.html);
me.set_style(out.style); me.set_style(out.style);
}); });
}, },
printit: function() {
printit: function () {
this.new_page_preview(true); this.new_page_preview(true);
}, },
new_page_preview: function(printit) {
new_page_preview: function (printit) {
var me = this; var me = this;
var w = window.open(frappe.urllib.get_full_url("/printview?" 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({ frappe.call({
method: "frappe.www.printview.get_html_and_style", method: "frappe.www.printview.get_html_and_style",
args: { args: {
@@ -150,21 +153,21 @@ frappe.ui.form.PrintPreview = Class.extend({
no_letterhead: !this.with_letterhead() ? 1 : 0, no_letterhead: !this.with_letterhead() ? 1 : 0,
_lang: this.lang_code _lang: this.lang_code
}, },
callback: function(r) {
if(!r.exc) {
callback: function (r) {
if (!r.exc) {
callback(r.message); callback(r.message);
} }
} }
}); });
}, },
preview_old_style: function() {
preview_old_style: function () {
var me = this; var me = this;
this.with_old_style({ this.with_old_style({
format: me.print_sel.val(), format: me.print_sel.val(),
callback: function(html) {
callback: function (html) {
me.wrapper.find(".print-format").html('<div class="alert alert-warning">' 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); + html);
}, },
no_letterhead: !this.with_letterhead(), no_letterhead: !this.with_letterhead(),
@@ -172,75 +175,75 @@ frappe.ui.form.PrintPreview = Class.extend({
no_heading: true no_heading: true
}); });
}, },
refresh_print_options: function() {
refresh_print_options: function () {
this.print_formats = frappe.meta.get_print_formats(this.frm.doctype); this.print_formats = frappe.meta.get_print_formats(this.frm.doctype);
return this.print_sel return this.print_sel
.empty().add_options(this.print_formats); .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); _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; 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, _p.build(me.print_sel.val(), _p.go,
!me.with_letterhead()); !me.with_letterhead());
}); });
}, },
new_page_preview_old_style: function() {
new_page_preview_old_style: function () {
var me = this; 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()); _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"; 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) { if (!format) {
format = this.selected_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] return locals["Print Format"][format]
} else { } else {
return {} return {}
} }
}, },
with_letterhead: function() {
with_letterhead: function () {
return this.print_letterhead.is(":checked") ? 1 : 0; 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.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 print_settings = locals[":Print Settings"]["Print Settings"];


var default_letter_head = locals[":Company"] && frappe.defaults.get_default('company') var default_letter_head = locals[":Company"] && frappe.defaults.get_default('company')
? locals[":Company"][frappe.defaults.get_default('company')]["default_letter_head"] ? locals[":Company"][frappe.defaults.get_default('company')]["default_letter_head"]
: ''; : '';


columns = [{
var columns = [{
fieldtype: "Check", fieldtype: "Check",
fieldname: "with_letter_head", fieldname: "with_letter_head",
label: __("With Letter head") label: __("With Letter head")
},{
}, {
fieldtype: "Select", fieldtype: "Select",
fieldname: "letter_head", fieldname: "letter_head",
label: __("Letter Head"), label: __("Letter Head"),
depends_on: "with_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 default: letter_head || default_letter_head
}]; }];


if(pdf) {
if (pdf) {
columns.push({ columns.push({
fieldtype: "Select", fieldtype: "Select",
fieldname: "orientation", 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); var data = $.extend(print_settings, data);
if(!data.with_letter_head) {
if (!data.with_letter_head) {
data.letter_head = null; data.letter_head = null;
} }
if(data.letter_head) {
if (data.letter_head) {
data.letter_head = frappe.boot.letter_heads[print_settings.letter_head]; data.letter_head = frappe.boot.letter_heads[print_settings.letter_head];
} }
callback(data); callback(data);


+ 1
- 1
frappe/public/js/frappe/form/quick_entry.js View File

@@ -66,7 +66,7 @@ frappe.ui.form.quick_entry = function(doctype, success) {


if(data) { if(data) {
dialog.working = true; dialog.working = true;
values = update_doc();
var values = update_doc();
frappe.call({ frappe.call({
method: "frappe.client.insert", method: "frappe.client.insert",
args: { args: {


+ 49
- 48
frappe/public/js/frappe/form/save.js View File

@@ -3,7 +3,7 @@


frappe.provide("frappe.ui.form"); 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); $(btn).prop("disabled", true);


// specified here because there are keyboard shortcuts to save // 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 freeze_message = working_label ? __(working_label) : "";


var save = function() {
check_name(function() {
var save = function () {
check_name(function () {
$(frm.wrapper).addClass('validated-form'); $(frm.wrapper).addClass('validated-form');
if(check_mandatory()) {
if (check_mandatory()) {
_call({ _call({
method: "frappe.desk.form.save.savedocs", 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]); $(document).trigger("save", [frm.doc]);
callback(r); callback(r);
}, },
@@ -38,7 +38,7 @@ frappe.ui.form.save = function(frm, action, callback, btn) {


}; };


var cancel = function() {
var cancel = function () {
var args = { var args = {
doctype: frm.doc.doctype, doctype: frm.doc.doctype,
name: frm.doc.name name: frm.doc.name
@@ -46,7 +46,7 @@ frappe.ui.form.save = function(frm, action, callback, btn) {


// update workflow state value if workflow exists // update workflow state value if workflow exists
var workflow_state_fieldname = frappe.workflow.get_state_fieldname(frm.doctype); var workflow_state_fieldname = frappe.workflow.get_state_fieldname(frm.doctype);
if(workflow_state_fieldname) {
if (workflow_state_fieldname) {
$.extend(args, { $.extend(args, {
workflow_state_fieldname: workflow_state_fieldname, workflow_state_fieldname: workflow_state_fieldname,
workflow_state: frm.doc[workflow_state_fieldname] workflow_state: frm.doc[workflow_state_fieldname]
@@ -57,7 +57,7 @@ frappe.ui.form.save = function(frm, action, callback, btn) {
_call({ _call({
method: "frappe.desk.form.save.cancel", method: "frappe.desk.form.save.cancel",
args: args, args: args,
callback: function(r) {
callback: function (r) {
$(document).trigger("save", [frm.doc]); $(document).trigger("save", [frm.doc]);
callback(r); 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 doc = frm.doc;
var meta = locals.DocType[doc.doctype]; 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; var newname = values.value;
if(newname) {
if (newname) {
doc.__newname = strip(newname); doc.__newname = strip(newname);
} else { } else {
msgprint(__("Name is required"));
frappe.msgprint(__("Name is required"));
throw "name 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")); }, __('Enter the name of the new {0}', [doc.doctype]), __("Create"));


if(doc.__newname) {
if (doc.__newname) {
d.set_value("value", doc.__newname); d.set_value("value", doc.__newname);
} }


d.onhide = function() {
d.onhide = function () {
$(btn).prop("disabled", false); $(btn).prop("disabled", false);
} }
} else { } 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 me = this;
var has_errors = false; var has_errors = false;
frm.scroll_set = 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 error_fields = [];
var folded = false; 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, var df = frappe.meta.get_docfield(doc.doctype,
docfield.fieldname, frm.doc.name); docfield.fieldname, frm.doc.name);


if(df.fieldtype==="Fold") {
if (df.fieldtype === "Fold") {
folded = frm.layout.folded; 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; has_errors = true;
error_fields[error_fields.length] = __(df.label); error_fields[error_fields.length] = __(df.label);


// scroll to field // scroll to field
if(!me.scroll_set) {
if (!me.scroll_set) {
scroll_to(doc.parentfield || df.fieldname); scroll_to(doc.parentfield || df.fieldname);
} }


if(folded) {
if (folded) {
frm.layout.unfold(); frm.layout.unfold();
folded = false; 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}', var message = __('Mandatory fields required in table {0}, Row {1}',
[__(frappe.meta.docfield_map[doc.parenttype][doc.parentfield].label).bold(), doc.idx]); [__(frappe.meta.docfield_map[doc.parenttype][doc.parentfield].label).bold(), doc.idx]);
} else { } 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>"; message = message + '<br><br><ul><li>' + error_fields.join('</li><li>') + "</ul>";
msgprint({
frappe.msgprint({
message: message, message: message,
indicator: 'red', indicator: 'red',
title: __('Missing Fields') title: __('Missing Fields')
@@ -153,15 +153,15 @@ frappe.ui.form.save = function(frm, action, callback, btn) {
return !has_errors; return !has_errors;
}; };


var scroll_to = function(fieldname) {
var scroll_to = function (fieldname) {
var f = cur_frm.fields_dict[fieldname]; var f = cur_frm.fields_dict[fieldname];
if(f) {
if (f) {
$(document).scrollTop($(f.wrapper).offset().top - 60); $(document).scrollTop($(f.wrapper).offset().top - 60);
} }
frm.scroll_set = true; frm.scroll_set = true;
}; };


var _call = function(opts) {
var _call = function (opts) {
// opts = { // opts = {
// method: "some server method", // method: "some server method",
// args: {args to be passed}, // args: {args to be passed},
@@ -170,7 +170,7 @@ frappe.ui.form.save = function(frm, action, callback, btn) {
// } // }
$(opts.btn).prop("disabled", true); $(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 // 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 // no need to show this to user, as they can see "Saving" in freeze message
console.log("Already saving. Please wait a few moments.") 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, method: opts.method,
args: opts.args, args: opts.args,
btn: opts.btn, btn: opts.btn,
callback: function(r) {
callback: function (r) {
opts.callback && opts.callback(r); opts.callback && opts.callback(r);
}, },
always: function(r) {
always: function (r) {
frappe.ui.form.is_saving = false; frappe.ui.form.is_saving = false;
if(r) {
if (r) {
var doc = r.docs && r.docs[0]; var doc = r.docs && r.docs[0];
if(doc) {
if (doc) {
frappe.ui.form.update_calling_link(doc); frappe.ui.form.update_calling_link(doc);
}
}
} }
} }
}) })
}; };


if(action==="cancel") {
if (action === "cancel") {
cancel(); cancel();
} else { } else {
save(); 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); var doc = frappe.get_doc(frappe._from_link.doctype, frappe._from_link.docname);
// set value // set value
if (doc && doc.parentfield){
if (doc && doc.parentfield) {
//update values for child table //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); frappe._from_link.set_value(newdoc.name);
}});
}
});
} else { } else {
frappe._from_link.set_value(newdoc.name); frappe._from_link.set_value(newdoc.name);
}
}


// refresh field // refresh field
frappe._from_link.refresh(); frappe._from_link.refresh();


// if from form, switch // 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); 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; frappe._from_link = null;


+ 4
- 4
frappe/public/js/frappe/form/script_manager.js View File

@@ -70,7 +70,7 @@ frappe.ui.form.ScriptManager = Class.extend({
var me = this; var me = this;
doctype = doctype || this.frm.doctype; doctype = doctype || this.frm.doctype;
name = name || this.frm.docname; 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); if(callback) handlers.push(callback);


return $.when.apply($, $.map(handlers, function(fn) { return fn(); })); return $.when.apply($, $.map(handlers, function(fn) { return fn(); }));
@@ -114,8 +114,8 @@ frappe.ui.form.ScriptManager = Class.extend({
} }


function setup_add_fetch(df) { 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) { && df.options && df.options.indexOf(".")!=-1) {
var parts = df.options.split("."); var parts = df.options.split(".");
me.frm.add_fetch(parts[0], parts[1], df.fieldname); me.frm.add_fetch(parts[0], parts[1], df.fieldname);
@@ -138,7 +138,7 @@ frappe.ui.form.ScriptManager = Class.extend({
this.trigger('setup'); this.trigger('setup');
}, },
log_error: function(caller, e) { log_error: function(caller, e) {
show_alert("Error in Client Script.");
frappe.show_alert("Error in Client Script.");
console.group && console.group(); console.group && console.group();
console.log("----- error in client script -----"); console.log("----- error in client script -----");
console.log("method: " + caller); console.log("method: " + caller);


+ 2
- 2
frappe/public/js/frappe/form/share.js View File

@@ -117,7 +117,7 @@ frappe.ui.form.Share = Class.extend({
options: "User", options: "User",
filters: { filters: {
"user_type": "System User", "user_type": "System User",
"name": ["!=", user]
"name": ["!=", frappe.session.user]
} }
}, },
only_input: true, only_input: true,
@@ -163,7 +163,7 @@ frappe.ui.form.Share = Class.extend({
$(d.body).find(".edit-share").on("click", function() { $(d.body).find(".edit-share").on("click", function() {
var user = $(this).parents(".shared-user:first").attr("data-user") || "", var user = $(this).parents(".shared-user:first").attr("data-user") || "",
value = $(this).prop("checked") ? 1 : 0, value = $(this).prop("checked") ? 1 : 0,
property = $(this).attr("name")
property = $(this).attr("name"),
everyone = cint($(this).parents(".shared-user:first").attr("data-everyone")); everyone = cint($(this).parents(".shared-user:first").attr("data-everyone"));


frappe.call({ frappe.call({


+ 4
- 4
frappe/public/js/frappe/form/sidebar.js View File

@@ -58,10 +58,10 @@ frappe.ui.form.Sidebar = Class.extend({
this.frm.tags && this.frm.tags.refresh(this.frm.doc._user_tags); this.frm.tags && this.frm.tags.refresh(this.frm.doc._user_tags);
this.sidebar.find(".modified-by").html(__("{0} edited this {1}", this.sidebar.find(".modified-by").html(__("{0} edited this {1}",
["<strong>" + frappe.user.full_name(this.frm.doc.modified_by) + "</strong>", ["<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}", this.sidebar.find(".created-by").html(__("{0} created this {1}",
["<strong>" + frappe.user.full_name(this.frm.doc.owner) + "</strong>", ["<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.refresh_like();
this.setup_ratings(); this.setup_ratings();
@@ -151,11 +151,11 @@ frappe.ui.form.Sidebar = Class.extend({
}, },


setup_ratings: function() { setup_ratings: function() {
_ratings = this.frm.get_docinfo().rating || 0;
var _ratings = this.frm.get_docinfo().rating || 0;


if(_ratings) { if(_ratings) {
this.ratings.removeClass("hide"); 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); this.ratings.find(".rating-icons").html(rating_icons);
} }
} }


+ 3
- 3
frappe/public/js/frappe/form/toolbar.js View File

@@ -114,7 +114,7 @@ frappe.ui.form.Toolbar = Class.extend({
// Print // Print
if(!is_submittable || docstatus == 1 || if(!is_submittable || docstatus == 1 ||
(allow_print_for_cancelled && docstatus == 2)|| (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)) { if(frappe.model.can_print(null, me.frm)) {
this.page.add_menu_item(__("Print"), function() { this.page.add_menu_item(__("Print"), function() {
me.frm.print_doc();}, true); me.frm.print_doc();}, true);
@@ -159,7 +159,7 @@ frappe.ui.form.Toolbar = Class.extend({
me.frm.savetrash();}, true); me.frm.savetrash();}, true);
} }


if(in_list(roles, "System Manager")) {
if(frappe.user_roles.includes("System Manager")) {
this.page.add_menu_item(__("Customize"), function() { this.page.add_menu_item(__("Customize"), function() {
frappe.set_route("Form", "Customize Form", { frappe.set_route("Form", "Customize Form", {
doc_type: me.frm.doctype doc_type: me.frm.doctype
@@ -178,7 +178,7 @@ frappe.ui.form.Toolbar = Class.extend({
if(!this.frm.doc.__unsaved) { if(!this.frm.doc.__unsaved) {
if(is_submittable && docstatus == 1) { if(is_submittable && docstatus == 1) {
this.page.add_menu_item(__("Request Feedback"), function() { 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); feedback.manual_feedback_request(me.frm.doc);
}, true) }, true)
} }


+ 3
- 3
frappe/public/js/frappe/form/workflow.js View File

@@ -73,7 +73,7 @@ frappe.ui.form.States = Class.extend({
} }


$.each(frappe.workflow.get_transitions(this.frm.doctype, state), function(i, d) { $.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; added = true;
me.frm.page.add_action_item(__(d.action), function() { me.frm.page.add_action_item(__(d.action), function() {
var action = d.action; var action = d.action;
@@ -112,10 +112,10 @@ frappe.ui.form.States = Class.extend({
} else if(new_docstatus==2 && me.frm.doc.docstatus==1) { } else if(new_docstatus==2 && me.frm.doc.docstatus==1) {
me.frm.savecancel(null, success, on_error); me.frm.savecancel(null, success, on_error);
} else { } else {
msgprint(__("Document Status transition from ") + me.frm.doc.docstatus + " "
frappe.msgprint(__("Document Status transition from ") + me.frm.doc.docstatus + " "
+ __("to") + + __("to") +
new_docstatus + " " + __("is not allowed.")); 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; return false;
} }




+ 6
- 6
frappe/public/js/frappe/list/list_renderer.js View File

@@ -108,8 +108,8 @@ frappe.views.ListRenderer = Class.extend({
} }


// enabled / disabled // 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) // add workflow field (as priority)
this.workflow_state_fieldname = frappe.workflow.get_state_fieldname(this.doctype); 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]); add_field(df.options.split(':')[1]);
} else { } else {
add_field(df.options); add_field(df.options);
};
}
} }
} }
}); });
@@ -424,7 +424,7 @@ frappe.views.ListRenderer = Class.extend({
this.prepare_when(data, data.modified); this.prepare_when(data, data.modified);


// nulls as strings // nulls as strings
for (key in data) {
for (var key in data) {
if (data[key] == null) { if (data[key] == null) {
data[key] = ''; data[key] = '';
} }
@@ -485,8 +485,8 @@ frappe.views.ListRenderer = Class.extend({
prepare_when: function (data, date_str) { prepare_when: function (data, date_str) {
if (!date_str) date_str = data.modified; if (!date_str) date_str = data.modified;
// when // 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) { if (diff === 0) {
data.when = comment_when(date_str); data.when = comment_when(date_str);
} }


+ 6
- 6
frappe/public/js/frappe/list/list_sidebar.js View File

@@ -212,7 +212,7 @@ frappe.views.ListSidebar = Class.extend({
.then(function() { .then(function() {
d.hide(); d.hide();
}, function(err) { }, 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 $dropdown = this.page.sidebar.find('.email-account-dropdown');
var divider = false; 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>') $('<li class="new-email-account"><a>'+ __("New Email Account") +'</a></li>')
.appendTo($dropdown) .appendTo($dropdown)
} }


accounts = frappe.boot.email_accounts;
var accounts = frappe.boot.email_accounts;


accounts.forEach(function(account) { 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('/'); var route = ["List", "Communication", "Inbox", email_account].join('/');
if(!divider) { if(!divider) {
$('<li role="separator" class="divider"></li>').appendTo($dropdown); $('<li role="separator" class="divider"></li>').appendTo($dropdown);
@@ -318,9 +318,9 @@ frappe.views.ListSidebar = Class.extend({
me.defined_category = r.message; me.defined_category = r.message;
if (r.message.defined_cat ){ if (r.message.defined_cat ){
me.defined_category = r.message.defined_cat me.defined_category = r.message.defined_cat
me.cats = {};
me.cats = {};
//structure the tag categories //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){ if (me.cats[me.defined_category[i].category]===undefined){
me.cats[me.defined_category[i].category]=[me.defined_category[i].tag]; me.cats[me.defined_category[i].category]=[me.defined_category[i].tag];
}else{ }else{


+ 12
- 12
frappe/public/js/frappe/list/list_view.js View File

@@ -302,7 +302,7 @@ frappe.views.ListView = frappe.ui.BaseList.extend({
set_filters: function (filters) { set_filters: function (filters) {
var me = this; var me = this;
$.each(filters, function (i, f) { $.each(filters, function (i, f) {
hidden = false
var hidden = false
if (f.length === 3) { if (f.length === 3) {
f = [me.doctype, f[0], f[1], f[2]] f = [me.doctype, f[0], f[1], f[2]]
} else if (f.length === 5) { } else if (f.length === 5) {
@@ -377,7 +377,7 @@ frappe.views.ListView = frappe.ui.BaseList.extend({
if (this.list_renderer.settings.list_view_doc) { if (this.list_renderer.settings.list_view_doc) {
this.list_renderer.settings.list_view_doc(this); this.list_renderer.settings.list_view_doc(this);
} else { } 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 () { $(this.wrapper).on('click', `button[list_view_doc='${doctype}']`, function () {
if (me.list_renderer.make_new_doc) if (me.list_renderer.make_new_doc)
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; return order_by;
}, },
assigned_to_me: function () { 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(); this.run();
}, },
liked_by_me: function () { 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(); this.run();
}, },
remove_liked_by_me: function () { remove_liked_by_me: function () {
this.filter_list.get_filter('_liked_by').remove(); this.filter_list.get_filter('_liked_by').remove();
}, },
is_star_filtered: function () { 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 () { init_menu: function () {
var me = this; var me = this;
@@ -606,7 +606,7 @@ frappe.views.ListView = frappe.ui.BaseList.extend({
}); });
}, true); }, true);
} }
if (roles.includes('System Manager')) {
if (frappe.user_roles.includes('System Manager')) {
this.page.add_menu_item(__('Role Permissions Manager'), function () { this.page.add_menu_item(__('Role Permissions Manager'), function () {
frappe.set_route('permission-manager', { frappe.set_route('permission-manager', {
doctype: me.doctype doctype: me.doctype
@@ -627,7 +627,7 @@ frappe.views.ListView = frappe.ui.BaseList.extend({
frappe.add_to_desktop(me.doctype, me.doctype); frappe.add_to_desktop(me.doctype, me.doctype);
}, true); }, 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 // edit doctype
this.page.add_menu_item(__('Edit DocType'), function () { this.page.add_menu_item(__('Edit DocType'), function () {
frappe.set_route('Form', 'DocType', me.doctype); frappe.set_route('Form', 'DocType', me.doctype);
@@ -683,7 +683,7 @@ frappe.views.ListView = frappe.ui.BaseList.extend({
return !is_submittable || doc.docstatus === 1 || return !is_submittable || doc.docstatus === 1 ||
(allow_print_for_cancelled && doc.docstatus == 2) || (allow_print_for_cancelled && doc.docstatus == 2) ||
(allow_print_for_draft && doc.docstatus == 0) || (allow_print_for_draft && doc.docstatus == 0) ||
roles.includes('Administrator')
frappe.user_roles.includes('Administrator')
}).map(function (doc) { }).map(function (doc) {
return doc.name return doc.name
}); });
@@ -708,11 +708,11 @@ frappe.views.ListView = frappe.ui.BaseList.extend({
}); });


dialog.set_primary_action(__('Print'), function () { dialog.set_primary_action(__('Print'), function () {
args = dialog.get_values();
var args = dialog.get_values();
if (!args) return; if (!args) return;
var default_print_format = locals.DocType[me.doctype].default_print_format; 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 json_string = JSON.stringify(valid_docs);
var w = window.open('/api/method/frappe.utils.print_format.download_multi_pdf?' 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.fields_dict.print_sel.$input.empty().add_options(print_formats);


dialog.show(); dialog.show();


+ 4
- 4
frappe/public/js/frappe/misc/common.js View File

@@ -30,7 +30,7 @@ frappe.avatar = function(user, css_class, title) {


return repl('<span class="avatar %(css_class)s" title="%(title)s">\ return repl('<span class="avatar %(css_class)s" title="%(title)s">\
<span class="avatar-frame" style="background-image: url(%(image)s)"\ <span class="avatar-frame" style="background-image: url(%(image)s)"\
title="%(title)s"></span></span>', {
title="%(title)s"></span></span>', {
image: image, image: image,
title: title, title: title,
abbr: user_info.abbr, abbr: user_info.abbr,
@@ -93,7 +93,7 @@ frappe.get_gravatar = function(email_id) {


function repl(s, dict) { function repl(s, dict) {
if(s==null)return ''; if(s==null)return '';
for(key in dict) {
for(var key in dict) {
s = s.split("%("+key+")s").join(dict[key]); s = s.split("%("+key+")s").join(dict[key]);
} }
return s; 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) { 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, var name = $0,
value = $1.charAt(0) === '"' value = $1.charAt(0) === '"'
? $1.substr(1, -1).replace(/\\(.)/g, "$1")
: $1;
? $1.substr(1, -1).replace(/\\(.)/g, "$1")
: $1;
cookies[name] = value; cookies[name] = value;
}); });
} }


+ 12
- 14
frappe/public/js/frappe/misc/datetime.js View File

@@ -10,8 +10,8 @@ frappe.provide("frappe.datetime");
$.extend(frappe.datetime, { $.extend(frappe.datetime, {
convert_to_user_tz: function(date, format) { convert_to_user_tz: function(date, format) {
// format defaults to true // 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 { } else {
var date_obj = moment(date); var date_obj = moment(date);
} }
@@ -22,8 +22,8 @@ $.extend(frappe.datetime, {
convert_to_system_tz: function(date, format) { convert_to_system_tz: function(date, format) {
// format defaults to true // 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 { } else {
var date_obj = moment(date); var date_obj = moment(date);
} }
@@ -32,8 +32,8 @@ $.extend(frappe.datetime, {
}, },


is_timezone_same: function() { 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 { } else {
return true; return true;
} }
@@ -48,7 +48,7 @@ $.extend(frappe.datetime, {
}, },


obj_to_user: function(d) { 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) { get_diff: function(d1, d2) {
@@ -88,12 +88,12 @@ $.extend(frappe.datetime, {
}, },


get_user_fmt: function() { 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) { str_to_user: function(val, no_time_str) {
if(!val) return ""; 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) { if(typeof val !== "string" || val.indexOf(" ")===-1) {
return moment(val).format(user_fmt); return moment(val).format(user_fmt);
} else { } else {
@@ -110,7 +110,7 @@ $.extend(frappe.datetime, {
}, },


user_to_str: function(val, no_time_str) { 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"; var system_fmt = "YYYY-MM-DD";


if(val.indexOf(" ")!==-1) { if(val.indexOf(" ")!==-1) {
@@ -124,7 +124,7 @@ $.extend(frappe.datetime, {
}, },


user_to_obj: function(d) { 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) { 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 View File

@@ -1,55 +1,55 @@
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
// MIT License. See license.txt // MIT License. See license.txt


if(!window.frappe) window.frappe = {};
if (!window.frappe) window.frappe = {};


function flt(v, decimals, number_format) { 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 + ""; v = v + "";


// strip currency symbol if exists // 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 // 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 = isNaN(parseFloat(parts[0])) ? parts.slice(parts.length - 1).join(" ") : v;
} }


v = strip_number_groups(v, number_format); 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 _round(v, decimals);
return v; return v;
} }


function cint(v, def) { function cint(v, def) {
if(v===true)
if (v === true)
return 1; return 1;
if(v===false)
if (v === false)
return 0; 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; return v;
} }


function strip_number_groups(v, number_format) { 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); var info = get_number_format_info(number_format);


// strip groups (,) // 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, ""); v = v.replace(group_regex, "");


// replace decimal separator with (.) // 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"); var decimal_regex = new RegExp(info.decimal_str, "g");
v = v.replace(decimal_regex, "."); v = v.replace(decimal_regex, ".");
} }
@@ -59,32 +59,32 @@ function strip_number_groups(v, number_format) {




frappe.number_format_info = { 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) { if (!format) {
format = get_number_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. // Fix the decimal first, toFixed will auto fill trailing zero.
if (decimals == null) decimals = info.precision; if (decimals == null) decimals = info.precision;


v = flt(v, decimals, format); v = flt(v, decimals, format);


if(v<0) var is_negative = true;
if (v < 0) var is_negative = true;
v = Math.abs(v); v = Math.abs(v);


v = v.toFixed(decimals); v = v.toFixed(decimals);
@@ -98,23 +98,23 @@ window.format_number = function(v, format, decimals){
var integer = part[0]; var integer = part[0];
var str = ''; var str = '';
var offset = integer.length % group_position; 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; var l = replace_all(str, info.group_sep, "").length;
if(format=="#,##,###.##" && str.indexOf(",")!=-1) { // INR
if (format == "#,##,###.##" && str.indexOf(",") != -1) { // INR
group_position = 2; group_position = 2;
l += 1; l += 1;
} }


str += integer.charAt(i); str += integer.charAt(i);


if (l && !((l+1) % group_position) && i!=0 ) {
if (l && !((l + 1) % group_position) && i != 0) {
str += info.group_sep; str += info.group_sep;
} }
} }
part[0] = str.split("").reverse().join(""); part[0] = str.split("").reverse().join("");
} }
if(part[0]+""=="") {
part[0]="0";
if (part[0] + "" == "") {
part[0] = "0";
} }


// join decimal // join decimal
@@ -131,18 +131,18 @@ function format_currency(v, currency, decimals) {
decimals = frappe.boot.sysdefaults.currency_precision || null; decimals = frappe.boot.sysdefaults.currency_precision || null;
} }


if(symbol)
if (symbol)
return symbol + " " + format_number(v, format, decimals); return symbol + " " + format_number(v, format, decimals);
else else
return format_number(v, format, decimals); return format_number(v, format, decimals);
} }


function get_currency_symbol(currency) { 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; return null;


if(!currency)
if (!currency)
currency = frappe.boot.sysdefaults.currency; currency = frappe.boot.sysdefaults.currency;


return frappe.model.get_value(":Currency", currency, "symbol") || 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) { function get_number_format_info(format) {
var info = frappe.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 // get the precision from the number format
@@ -171,13 +171,13 @@ function get_number_format_info(format) {


function _round(num, precision) { function _round(num, precision) {
var is_negative = num < 0 ? true : false; 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) { 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); 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); return frappe.meta.get_field_precision(df, doc);
}else{
} else {
return frappe.boot.sysdefaults.float_precision return frappe.boot.sysdefaults.float_precision
} }
} }


function in_list(list, item) { 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; return false;
} }


@@ -214,15 +214,15 @@ function remainder(numerator, denominator, precision) {
} }


return flt(_remainder, precision); return flt(_remainder, precision);
};
}


function round_based_on_smallest_currency_fraction(value, currency, precision) { function round_based_on_smallest_currency_fraction(value, currency, precision) {
var smallest_currency_fraction_value = flt(frappe.model.get_value(":Currency", var smallest_currency_fraction_value = flt(frappe.model.get_value(":Currency",
currency, "smallest_currency_fraction_value")) 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); 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); value += (smallest_currency_fraction_value - remainder_val);
} else { } else {
value -= remainder_val; value -= remainder_val;
@@ -231,4 +231,4 @@ function round_based_on_smallest_currency_fraction(value, currency, precision) {
value = Math.round(value); value = Math.round(value);
} }
return value; return value;
};
}

+ 34
- 32
frappe/public/js/frappe/misc/pretty_date.js View File

@@ -1,28 +1,28 @@
// moment strings for translation // moment strings for translation


function prettyDate(time, mini){
if(!time) {
function prettyDate(time, mini) {
if (!time) {
time = new Date(); 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 { } else {
var ret = moment(time).locale(frappe.boot.lang).fromNow(mini); 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"); ret = __("now");
} else { } else {
var parts = ret.split(" "); 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; parts[0] = 1;
} }
if(parts[1].substr(0, 2)==="mo"){
if (parts[1].substr(0, 2) === "mo") {
ret = parts[0] + " M"; ret = parts[0] + " M";
} else { } 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; return ret;
} else { } else {
if(!time) return ''
if (!time) return ''
var date = time; 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), 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 '';


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 == 1 && __("Yesterday") ||
day_diff < 7 && __("{0} days ago", day_diff) || 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 ? var timestamp = frappe.datetime.str_to_user ?
frappe.datetime.str_to_user(datetime) : datetime; frappe.datetime.str_to_user(datetime) : datetime;
return '<span class="frappe-timestamp ' return '<span class="frappe-timestamp '
+(mini ? " mini" : "" ) + '" data-timestamp="'+datetime
+'" title="'+timestamp+'">'
+ (mini ? " mini" : "") + '" data-timestamp="' + datetime
+ '" title="' + timestamp + '">'
+ prettyDate(datetime, mini) + '</span>'; + prettyDate(datetime, mini) + '</span>';
}; };


frappe.provide("frappe.datetime"); 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"))); $(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 View File

@@ -5,7 +5,7 @@ frappe.provide("frappe.tools");


frappe.tools.downloadify = function(data, roles, title) { frappe.tools.downloadify = function(data, roles, title) {
if(roles && roles.length && !has_common(roles, roles)) { 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; return;
} }




+ 30
- 23
frappe/public/js/frappe/misc/user.js View File

@@ -5,7 +5,7 @@


frappe.user_info = function(uid) { frappe.user_info = function(uid) {
if(!uid) if(!uid)
uid = user;
uid = frappe.session.user;


if(uid.toLowerCase()==="bot") { if(uid.toLowerCase()==="bot") {
return { return {
@@ -57,7 +57,7 @@ frappe.provide('frappe.user');
$.extend(frappe.user, { $.extend(frappe.user, {
name: 'Guest', name: 'Guest',
full_name: function(uid) { full_name: function(uid) {
return uid===user ?
return uid === frappe.session.user ?
__("You") : __("You") :
frappe.user_info(uid).fullname; frappe.user_info(uid).fullname;
}, },
@@ -77,35 +77,29 @@ $.extend(frappe.user, {
}, },
get_desktop_items: function() { get_desktop_items: function() {
// hide based on permission // 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 m = icon.module_name;
var type = frappe.modules[m] && frappe.modules[m].type; var type = frappe.modules[m] && frappe.modules[m].type;


if(frappe.boot.user.allow_modules.indexOf(m) === -1) return null; if(frappe.boot.user.allow_modules.indexOf(m) === -1) return null;


var ret = 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; 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; 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; return ret;
@@ -147,6 +141,19 @@ $.extend(frappe.user, {
quote: quote 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 View File

@@ -5,13 +5,13 @@ frappe.provide('frappe.utils');


frappe.utils = { frappe.utils = {
get_random: function(len) { 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) { get_file_link: function(filename) {
filename = cstr(filename); filename = cstr(filename);
@@ -122,7 +122,7 @@ frappe.utils = {
return [dict[filters]] return [dict[filters]]
} }
$.each(dict, function(i, d) { $.each(dict, function(i, d) {
for(key in filters) {
for(var key in filters) {
if($.isArray(filters[key])) { if($.isArray(filters[key])) {
if(filters[key][0]=="in") { if(filters[key][0]=="in") {
if(filters[key][1].indexOf(d[key])==-1) if(filters[key][1].indexOf(d[key])==-1)
@@ -242,7 +242,6 @@ frappe.utils = {
break; break;
default: default:
return false; return false;
break;
} }


// test regExp if not null // test regExp if not null
@@ -288,7 +287,7 @@ frappe.utils = {
}; };


if(!compare_type) 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]); list.sort(sort_fn[compare_type]);


@@ -349,20 +348,20 @@ frappe.utils = {
if (!arr1 || !arr2) { if (!arr1 || !arr2) {
return false; return false;
} }
if (arr1.length != arr2.length) {
if (arr1.length != arr2.length) {
return false; 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; return false;
} }
}
else if (arr1[i] !== arr2[i]) {
}
else if (arr1[i] !== arr2[i]) {
return false; return false;
} }
}
return true;
}
return true;
}, },


intersection: function(a, b) { intersection: function(a, b) {
@@ -411,13 +410,13 @@ frappe.utils = {
var tempH = tempImg.height; var tempH = tempImg.height;
if (tempW > tempH) { if (tempW > tempH) {
if (tempW > max_width) { if (tempW > max_width) {
tempH *= max_width / tempW;
tempW = max_width;
tempH *= max_width / tempW;
tempW = max_width;
} }
} else { } else {
if (tempH > max_height) { 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) { warn_page_name_change: function(frm) {
frappe.msgprint("Note: Changing the Page Name will break previous URL to this page."); frappe.msgprint("Note: Changing the Page Name will break previous URL to this page.");
@@ -588,42 +587,42 @@ frappe.utils = {
// String.prototype.includes polyfill // String.prototype.includes polyfill
// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/includes // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/includes
if (!String.prototype.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 // Array.prototype.includes polyfill
// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/includes // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
if (!Array.prototype.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 // Array de duplicate
if (!Array.prototype.uniqBy) { if (!Array.prototype.uniqBy) {


+ 22
- 21
frappe/public/js/frappe/model/create_new.js View File

@@ -15,7 +15,7 @@ $.extend(frappe.model, {
name: frappe.model.get_new_name(doctype), name: frappe.model.get_new_name(doctype),
__islocal: 1, __islocal: 1,
__unsaved: 1, __unsaved: 1,
owner: user
owner: frappe.session.user
}; };
frappe.model.set_default_values(doc, parent_doc); frappe.model.set_default_values(doc, parent_doc);


@@ -103,7 +103,8 @@ $.extend(frappe.model, {
updated.push(f.fieldname); updated.push(f.fieldname);
} else if(f.fieldtype == "Select" && f.options && typeof f.options === 'string' } else if(f.fieldtype == "Select" && f.options && typeof f.options === 'string'
&& !in_list(["[Select]", "Loading..."], f.options)) { && !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) { if(!df.ignore_user_permissions) {
// 2 - look in user defaults // 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) { if (user_defaults && user_defaults.length===1) {
// Use User Permission value when only when it has a single value // Use User Permission value when only when it has a single value
user_default = user_defaults[0]; user_default = user_defaults[0];
@@ -171,13 +172,13 @@ $.extend(frappe.model, {
return frappe.session.user; return frappe.session.user;


} else if (df["default"] == "user_fullname") { } else if (df["default"] == "user_fullname") {
return user_fullname;
return frappe.session.user_fullname;


} else if (df["default"] == "Today") { } else if (df["default"] == "Today") {
return dateutil.get_today();
return frappe.datetime.get_today();


} else if ((df["default"] || "").toLowerCase() === "now") { } else if ((df["default"] || "").toLowerCase() === "now") {
return dateutil.now_datetime();
return frappe.datetime.now_datetime();


} else if (df["default"][0]===":") { } else if (df["default"][0]===":") {
var boot_doc = frappe.model.get_default_from_boot_docs(df, doc, parent_doc); 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") { } 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 // dont copy name and blank fields
var df = frappe.meta.get_docfield(doc.doctype, key); 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) && !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.__islocal = 1;
newdoc.docstatus = 0; newdoc.docstatus = 0;
newdoc.owner = user; newdoc.owner = user;
@@ -309,7 +313,7 @@ $.extend(frappe.model, {


frappe.create_routes = {}; frappe.create_routes = {};
frappe.new_doc = function (doctype, opts) { 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() { frappe.model.with_doctype(doctype, function() {
if(frappe.create_routes[doctype]) { if(frappe.create_routes[doctype]) {
frappe.set_route(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 View File

@@ -173,7 +173,7 @@ $.extend(frappe.meta, {


get_parentfield: function(parent_dt, child_dt) { get_parentfield: function(parent_dt, child_dt) {
var df = (frappe.get_doc("DocType", parent_dt).fields || []).filter(function(d) 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) if(!df.length)
throw "parentfield not found for " + parent_dt + ", " + child_dt; throw "parentfield not found for " + parent_dt + ", " + child_dt;
return df[0].fieldname; return df[0].fieldname;


+ 9
- 9
frappe/public/js/frappe/model/model.js View File

@@ -5,7 +5,7 @@ frappe.provide('frappe.model');


$.extend(frappe.model, { $.extend(frappe.model, {
no_value_type: ['Section Break', 'Column Break', 'HTML', 'Table', no_value_type: ['Section Break', 'Column Break', 'HTML', 'Table',
'Button', 'Image', 'Fold', 'Heading'],
'Button', 'Image', 'Fold', 'Heading'],


layout_fields: ['Section Break', 'Column Break', 'Fold'], layout_fields: ['Section Break', 'Column Break', 'Fold'],


@@ -77,7 +77,7 @@ $.extend(frappe.model, {
if(d.fieldname==fieldname) return d; if(d.fieldname==fieldname) return d;
}); });
if(!docfield.length) { if(!docfield.length) {
msgprint(__("Unknown Column: {0}", [fieldname]));
frappe.msgprint(__("Unknown Column: {0}", [fieldname]));
} }
return docfield[0]; return docfield[0];
}, },
@@ -103,7 +103,7 @@ $.extend(frappe.model, {
freeze: true, freeze: true,
callback: function(r) { callback: function(r) {
if(r.exc) { if(r.exc) {
msgprint(__("Unable to load: {0}", [__(doctype)]));
frappe.msgprint(__("Unable to load: {0}", [__(doctype)]));
throw "No doctype"; throw "No doctype";
} }
if(r.message=="use_cache") { if(r.message=="use_cache") {
@@ -235,7 +235,7 @@ $.extend(frappe.model, {


can_import: function(doctype, frm) { can_import: function(doctype, frm) {
// system manager can always import // 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; if(frm) return frm.perm[0].import===1;
return frappe.boot.user.can_import.indexOf(doctype)!==-1; return frappe.boot.user.can_import.indexOf(doctype)!==-1;
@@ -243,7 +243,7 @@ $.extend(frappe.model, {


can_export: function(doctype, frm) { can_export: function(doctype, frm) {
// system manager can always export // 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; if(frm) return frm.perm[0].export===1;
return frappe.boot.user.can_export.indexOf(doctype)!==-1; return frappe.boot.user.can_export.indexOf(doctype)!==-1;
@@ -268,7 +268,7 @@ $.extend(frappe.model, {


can_set_user_permissions: function(doctype, frm) { can_set_user_permissions: function(doctype, frm) {
// system manager can always set user permissions // 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; if(frm) return frm.perm[0].set_user_permissions===1;
return frappe.boot.user.can_set_user_permissions.indexOf(doctype)!==-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) { /* example: frappe.model.on("Customer", "age", function(fieldname, value, doc) {
if(doc.age < 16) { 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"; raise "CustomerAgeError";
} }
}) */ }) */
@@ -385,7 +385,7 @@ $.extend(frappe.model, {


// doctype-level // doctype-level
run(frappe.model.events[doc.doctype]['*']); run(frappe.model.events[doc.doctype]['*']);
};
}
}, },


get_doc: function(doctype, name) { get_doc: function(doctype, name) {
@@ -541,7 +541,7 @@ $.extend(frappe.model, {


get_all_docs: function(doc) { get_all_docs: function(doc) {
var all = [doc]; var all = [doc];
for(key in doc) {
for(var key in doc) {
if($.isArray(doc[key])) { if($.isArray(doc[key])) {
var children = doc[key]; var children = doc[key];
for (var i=0, l=children.length; i < l; i++) { for (var i=0, l=children.length; i < l; i++) {


+ 5
- 5
frappe/public/js/frappe/model/perm.js View File

@@ -45,7 +45,7 @@ $.extend(frappe.perm, {
return perm; return perm;
} }


if (user==="Administrator" || roles.indexOf("Administrator")!==-1) {
if (frappe.session.user === "Administrator" || frappe.user_roles.includes("Administrator")) {
perm[0].read = 1; perm[0].read = 1;
} }


@@ -62,7 +62,7 @@ $.extend(frappe.perm, {


// if owner // if owner
if(!$.isEmptyObject(perm[0].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); $.extend(perm[0], perm[0].if_owner);
} else { } else {
// not owner, remove permissions // not owner, remove permissions
@@ -78,7 +78,7 @@ $.extend(frappe.perm, {
if(docinfo && docinfo.shared) { if(docinfo && docinfo.shared) {
for(var i=0; i<docinfo.shared.length; i++) { for(var i=0; i<docinfo.shared.length; i++) {
var s = docinfo.shared[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]["read"] = perm[0]["read"] || s.read;
perm[0]["write"] = perm[0]["write"] || s.write; perm[0]["write"] = perm[0]["write"] || s.write;
perm[0]["share"] = perm[0]["share"] || s.share; perm[0]["share"] = perm[0]["share"] || s.share;
@@ -109,7 +109,7 @@ $.extend(frappe.perm, {


$.each(meta.permissions || [], function(i, p) { $.each(meta.permissions || [], function(i, p) {
// if user has this role // if user has this role
if(roles.indexOf(p.role)!==-1) {
if(frappe.user_roles.includes(p.role)) {
var permlevel = cint(p.permlevel); var permlevel = cint(p.permlevel);
if(!perm[permlevel]) { if(!perm[permlevel]) {
perm[permlevel] = {}; perm[permlevel] = {};
@@ -198,7 +198,7 @@ $.extend(frappe.perm, {
} }


if (perm[0].if_owner && perm[0].read) { if (perm[0].if_owner && perm[0].read) {
match_rules.push({"Owner": user});
match_rules.push({"Owner": frappe.session.user});
} }


return match_rules; return match_rules;


+ 2
- 2
frappe/public/js/frappe/model/workflow.js View File

@@ -44,7 +44,7 @@ frappe.workflow = {
return frappe.get_children(frappe.workflow.workflows[doctype], "transitions", { return frappe.get_children(frappe.workflow.workflows[doctype], "transitions", {
state:state, action:action})[0].next_state; 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); var state_fieldname = frappe.workflow.get_state_fieldname(doctype);
if(state_fieldname) { if(state_fieldname) {
var doc = locals[doctype][name]; 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; 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; return true;
} }
} }


+ 10
- 10
frappe/public/js/frappe/request.js View File

@@ -71,10 +71,10 @@ frappe.request.call = function(opts) {
frappe.app.redirect_to_login(); frappe.app.redirect_to_login();
} else { } else {
frappe.app.handle_session_expired(); frappe.app.handle_session_expired();
};
}
}, },
404: function(xhr) { 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')}); message: __('The resource you are looking for is not available')});
}, },
403: function(xhr) { 403: function(xhr) {
@@ -108,11 +108,11 @@ frappe.request.call = function(opts) {
}, },
508: function(xhr) { 508: function(xhr) {
frappe.utils.play_sound("error"); 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.")}); message:__("Another transaction is blocking this one. Please try again in a few seconds.")});
}, },
413: function(data, xhr) { 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])}); [(frappe.boot.max_file_size || 5242880) / 1048576])});
}, },
417: function(xhr) { 417: function(xhr) {
@@ -133,12 +133,12 @@ frappe.request.call = function(opts) {
}, },
500: function(xhr) { 500: function(xhr) {
frappe.utils.play_sound("error"); 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(); opts.error_callback && opts.error_callback();
frappe.request.report_error(xhr, opts); frappe.request.report_error(xhr, opts);
}, },
504: function(xhr) { 504: function(xhr) {
msgprint(__("Request Timed Out"))
frappe.msgprint(__("Request Timed Out"))
opts.error_callback && opts.error_callback(); opts.error_callback && opts.error_callback();
} }
}; };
@@ -217,7 +217,7 @@ frappe.request.prepare = function(opts) {
if(opts.freeze) frappe.dom.freeze(opts.freeze_message); if(opts.freeze) frappe.dom.freeze(opts.freeze_message);


// stringify args if required // 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]))) { if(opts.args[key] && ($.isPlainObject(opts.args[key]) || $.isArray(opts.args[key]))) {
opts.args[key] = JSON.stringify(opts.args[key]); opts.args[key] = JSON.stringify(opts.args[key]);
} }
@@ -274,7 +274,7 @@ frappe.request.cleanup = function(opts, r) {
} else { } else {
console.log(r.exc); console.log(r.exc);
} }
};
}


// debug messages // debug messages
if(r._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); 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") msg_dialog.msg_area.find(".report-btn")
.toggle(error_report_email ? true : false) .toggle(error_report_email ? true : false)
@@ -361,7 +361,7 @@ frappe.request.report_error = function(xhr, request_opts) {
message: error_report_message, message: error_report_message,
doc: { doc: {
doctype: "User", doctype: "User",
name: user
name: frappe.session.user
} }
}); });
communication_composer.dialog.$wrapper.css("z-index", cint(msg_dialog.$wrapper.css("z-index")) + 1); communication_composer.dialog.$wrapper.css("z-index", cint(msg_dialog.$wrapper.css("z-index")) + 1);


+ 19
- 19
frappe/public/js/frappe/roles_editor.js View File

@@ -26,23 +26,23 @@ frappe.RoleEditor = Class.extend({


role_toolbar.find(".btn-add") role_toolbar.find(".btn-add")
.html(__('Add all roles')) .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") role_toolbar.find(".btn-remove")
.html(__('Clear all roles')) .html(__('Clear all roles'))
.on("click", function() { .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) { $.each(this.roles, function(i, role) {
$(me.wrapper).append(repl('<div class="user-role" \ $(me.wrapper).append(repl('<div class="user-role" \
@@ -70,10 +70,10 @@ frappe.RoleEditor = Class.extend({


// set user roles as checked // set user roles as checked
$.each((me.frm.doc.roles || []), function(i, user_role) { $.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() { set_roles_in_table: function() {
var opts = this.get_roles(); var opts = this.get_roles();
@@ -82,9 +82,9 @@ frappe.RoleEditor = Class.extend({
var me = this; var me = this;


$.each((me.frm.doc.roles || []), function(i, user_role) { $.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 // remove unchecked roles
$.each(opts.unchecked_roles, function(i, role) { $.each(opts.unchecked_roles, function(i, role) {
@@ -155,7 +155,7 @@ frappe.RoleEditor = Class.extend({
var perm = r.message[i]; var perm = r.message[i];


// if permission -> icon // if permission -> icon
for(key in perm) {
for(var key in perm) {
if(key!='parent' && key!='permlevel') { if(key!='parent' && key!='permlevel') {
if(perm[key]) { if(perm[key]) {
perm[key] = '<i class="fa fa-check"></i>'; perm[key] = '<i class="fa fa-check"></i>';


+ 1
- 1
frappe/public/js/frappe/router.js View File

@@ -120,7 +120,7 @@ frappe.set_route = function() {
if(params.length===1 && $.isArray(params[0])) { if(params.length===1 && $.isArray(params[0])) {
params = params[0]; params = params[0];
} }
route = $.map(params, function(a) {
var route = $.map(params, function(a) {
if($.isPlainObject(a)) { if($.isPlainObject(a)) {
frappe.route_options = a; frappe.route_options = a;
return null; return null;


+ 1
- 1
frappe/public/js/frappe/socketio_client.js View File

@@ -18,7 +18,7 @@ frappe.socket = {


//Enable secure option when using HTTPS //Enable secure option when using HTTPS
if (window.location.protocol == "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:") { else if (window.location.protocol == "http:") {
frappe.socket.socket = io.connect(frappe.socket.get_host()); frappe.socket.socket = io.connect(frappe.socket.get_host());


+ 2
- 2
frappe/public/js/frappe/toolbar.js View File

@@ -56,8 +56,8 @@ frappe.get_form_sidebar_extension = function() {


var template = '<ul class="list-unstyled sidebar-menu">\ var template = '<ul class="list-unstyled sidebar-menu">\
<li class="usage-stats">\ <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"); usage.sidebar_usage_html = frappe.render(template, { 'usage': usage }, "form_sidebar_usage");


} else { } else {


+ 1
- 1
frappe/public/js/frappe/translate.js View File

@@ -8,7 +8,7 @@ frappe._ = function(txt, replace) {
return txt; return txt;
if(typeof(txt) != "string") if(typeof(txt) != "string")
return txt; return txt;
ret = frappe._messages[txt.replace(/\n/g, "")] || txt;
var ret = frappe._messages[txt.replace(/\n/g, "")] || txt;
if(replace && typeof(replace) === "object") { if(replace && typeof(replace) === "object") {
ret = $.format(ret, replace); ret = $.format(ret, replace);
} }


+ 1
- 1
frappe/public/js/frappe/ui/base_list.js View File

@@ -173,7 +173,7 @@ frappe.ui.BaseList = Class.extend({
// default filter for submittable doctype // default filter for submittable doctype
if (frappe.model.is_submittable(this.doctype)) { if (frappe.model.is_submittable(this.doctype)) {
this.filter_list.add_filter(this.doctype, "docstatus", "!=", 2); this.filter_list.add_filter(this.doctype, "docstatus", "!=", 2);
};
}
}, },


clear: function () { clear: function () {


+ 8
- 8
frappe/public/js/frappe/ui/charts.js View File

@@ -18,8 +18,8 @@ frappe.ui.Chart = Class.extend({


if(this.opts.data && ((this.opts.data.columns && this.opts.data.columns.length >= 1) 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.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; return this.chart;
@@ -28,11 +28,11 @@ frappe.ui.Chart = Class.extend({
render_chart: function() { render_chart: function() {
var chart_dict = { var chart_dict = {
bindto: '#' + this.opts.bind_to, bindto: '#' + this.opts.bind_to,
data: {},
data: {},
axis: { 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: { y: {
padding: { bottom: 10 } 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.culling = {max: 15};
chart_dict.axis.x.tick.format = frappe.boot.sysdefaults.date_format chart_dict.axis.x.tick.format = frappe.boot.sysdefaults.date_format
.replace('yyyy', '%Y').replace('mm', '%m').replace('dd', '%d'); .replace('yyyy', '%Y').replace('mm', '%m').replace('dd', '%d');
};
}


// set color // set color
if(!chart_dict.data.colors && chart_dict.data.columns) { 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']; '#5E3AA8', '#7B933D', '#4F8EA8'];
chart_dict.data.colors = {}; chart_dict.data.colors = {};
chart_dict.data.columns.forEach(function(d, i) { chart_dict.data.columns.forEach(function(d, i) {


+ 2
- 2
frappe/public/js/frappe/ui/field_group.js View File

@@ -74,7 +74,7 @@ frappe.ui.FieldGroup = frappe.ui.form.Layout.extend({
} }
} }
if(errors.length && !ignore_errors) { if(errors.length && !ignore_errors) {
msgprint({
frappe.msgprint({
title: __('Missing Values Required'), title: __('Missing Values Required'),
message: __('Following fields have missing values:') + message: __('Following fields have missing values:') +
'<br><br><ul><li>' + errors.join('<li>') + '</ul>', '<br><br><ul><li>' + errors.join('<li>') + '</ul>',
@@ -106,7 +106,7 @@ frappe.ui.FieldGroup = frappe.ui.form.Layout.extend({
} }
}, },
clear: function() { clear: function() {
for(key in this.fields_dict) {
for(var key in this.fields_dict) {
var f = this.fields_dict[key]; var f = this.fields_dict[key];
if(f && f.set_input) { if(f && f.set_input) {
f.set_input(f.df['default'] || ''); f.set_input(f.df['default'] || '');


+ 14
- 15
frappe/public/js/frappe/ui/filters/filters.js View File

@@ -105,7 +105,7 @@ frappe.ui.FilterList = Class.extend({
// This gives a predictable stats order // This gives a predictable stats order
me.wrapper.find(".filter-stat").empty(); me.wrapper.find(".filter-stat").empty();
$.each(me.stats, function (i, v) { $.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) { 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 (stat[i][0] == options[o].value) {
if (field.name=="docstatus") { if (field.name=="docstatus") {
labels[i] = options[o].label labels[i] = options[o].label
@@ -353,7 +353,7 @@ frappe.ui.FilterList = Class.extend({
fieldname: fieldname, fieldname: fieldname,
condition: condition, condition: condition,
value: value value: value
});
});


this.filters.push(filter); this.filters.push(filter);


@@ -460,8 +460,7 @@ frappe.ui.Filter = Class.extend({
? __("values separated by commas") ? __("values separated by commas")
: __("use % as wildcard"))+'</div>'); : __("use % as wildcard"))+'</div>');
} else { } 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]; var original_docfield = me.fieldselect.fields_by_name[doctype][fieldname];
if(!original_docfield) { if(!original_docfield) {
msgprint(__("Field {0} is not selectable.", [fieldname]));
frappe.msgprint(__("Field {0} is not selectable.", [fieldname]));
return; return;
} }


@@ -784,7 +783,7 @@ frappe.ui.FieldSelect = Class.extend({


// old style // old style
if(doctype.indexOf(".")!==-1) { if(doctype.indexOf(".")!==-1) {
parts = doctype.split(".");
var parts = doctype.split(".");
doctype = parts[0]; doctype = parts[0];
fieldname = parts[1]; fieldname = parts[1];
} }
@@ -857,14 +856,14 @@ frappe.ui.FieldSelect = Class.extend({
var label = __(df.label) + ' (' + __(df.parent) + ')'; var label = __(df.label) + ' (' + __(df.parent) + ')';
var table = 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])) { !(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] = {}; if(!me.fields_by_name[df.parent]) me.fields_by_name[df.parent] = {};
me.fields_by_name[df.parent][df.fieldname] = df; me.fields_by_name[df.parent][df.fieldname] = df;
} }


+ 4
- 4
frappe/public/js/frappe/ui/like.js View File

@@ -3,7 +3,7 @@


frappe.ui.is_liked = function(doc) { frappe.ui.is_liked = function(doc) {
var liked = frappe.ui.get_liked_by(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) { 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]; var doc = locals[doctype] && locals[doctype][name];
if(doc) { if(doc) {
var liked_by = JSON.parse(doc._liked_by || "[]"), var liked_by = JSON.parse(doc._liked_by || "[]"),
idx = liked_by.indexOf(user);
idx = liked_by.indexOf(frappe.session.user);
if(add==="Yes") { if(add==="Yes") {
if(idx===-1) if(idx===-1)
liked_by.push(user);
liked_by.push(frappe.session.user);
} else { } else {
if(idx!==-1) { if(idx!==-1) {
liked_by = liked_by.slice(0,idx).concat(liked_by.slice(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", placement: "right",
content: function() { content: function() {
var liked_by = JSON.parse($wrapper.attr('data-liked-by') || "[]"); var liked_by = JSON.parse($wrapper.attr('data-liked-by') || "[]");
var user = frappe.session.user;
// hack // hack
if ($wrapper.find(".not-liked").length) { if ($wrapper.find(".not-liked").length) {
if (liked_by.indexOf(user)!==-1) { if (liked_by.indexOf(user)!==-1) {


+ 4
- 4
frappe/public/js/frappe/ui/listing.js View File

@@ -80,7 +80,7 @@ frappe.ui.Listing = Class.extend({
return this.page.add_menu_item(label, click, icon) return this.page.add_menu_item(label, click, icon)
} else { } else {
this.wrapper.find('.list-toolbar-wrapper').removeClass("hide"); 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')) .appendTo(this.wrapper.find('.list-toolbar'))
.html((icon ? ("<i class='"+icon+"'></i> ") : "") + label) .html((icon ? ("<i class='"+icon+"'></i> ") : "") + label)
.click(click); .click(click);
@@ -166,7 +166,7 @@ frappe.ui.Listing = Class.extend({
}); });
if(frappe.model.is_submittable(this.doctype)) { if(frappe.model.is_submittable(this.doctype)) {
this.filter_list.add_filter(this.doctype, "docstatus", "!=", 2); this.filter_list.add_filter(this.doctype, "docstatus", "!=", 2);
};
}
}, },


clear: function() { clear: function() {
@@ -246,7 +246,7 @@ frappe.ui.Listing = Class.extend({
save_list_settings_locally: function(args) { save_list_settings_locally: function(args) {
if(this.opts.save_list_settings && this.doctype && !this.docname) { if(this.opts.save_list_settings && this.doctype && !this.docname) {
// save list settings locally // save list settings locally
list_settings = frappe.model.list_settings[this.doctype];
var list_settings = frappe.model.list_settings[this.doctype];


if(!list_settings) { if(!list_settings) {
return return
@@ -409,7 +409,7 @@ frappe.ui.Listing = Class.extend({
}, },
set_filter: function(fieldname, label, no_run, no_duplicate, parent) { set_filter: function(fieldname, label, no_run, no_duplicate, parent) {
var filter = this.filter_list.get_filter(fieldname); 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) { if(filter) {
var v = cstr(filter.field.get_parsed_value()); var v = cstr(filter.field.get_parsed_value());


+ 5
- 7
frappe/public/js/frappe/ui/messages.js View File

@@ -18,7 +18,7 @@ frappe.throw = function(msg) {
msg = {message: msg, title: __('Error')}; msg = {message: msg, title: __('Error')};
} }
if(!msg.indicator) msg.indicator = 'red'; if(!msg.indicator) msg.indicator = 'red';
msgprint(msg);
frappe.msgprint(msg);
throw new Error(msg.message); throw new Error(msg.message);
} }


@@ -77,6 +77,7 @@ frappe.prompt = function(fields, callback, title, primary_label) {
return d; 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; var msg_dialog=null;
frappe.msgprint = function(msg, title) { frappe.msgprint = function(msg, title) {
if(!msg) return; if(!msg) return;
@@ -221,8 +222,6 @@ frappe.verify_password = function(callback) {
}, __("Verify Password"), __("Verify")) }, __("Verify Password"), __("Verify"))
} }


var msgprint = frappe.msgprint;

frappe.show_progress = function(title, count, total) { frappe.show_progress = function(title, count, total) {
if(frappe.cur_progress && frappe.cur_progress.title === title if(frappe.cur_progress && frappe.cur_progress.title === title
&& frappe.cur_progress.$wrapper.is(":visible")) { && 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>') dialog.progress = $('<div class="progress"><div class="progress-bar"></div></div>')
.appendTo(dialog.body); .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.$wrapper.removeClass("fade");
dialog.show(); dialog.show();
frappe.cur_progress = dialog; 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'); $('<div id="dialog-container"><div id="alert-container"></div></div>').appendTo('body');
} }


var message_html;
if(message.indicator) { if(message.indicator) {
message_html = $('<span class="indicator ' + message.indicator + '"></span>').append(message.message); message_html = $('<span class="indicator ' + message.indicator + '"></span>').append(message.message);
} else { } else {
@@ -286,5 +286,3 @@ frappe.show_alert = function(message, seconds=7) {
return div; return div;
} }


// for backward compatibility
var show_alert = frappe.show_alert;

+ 1
- 1
frappe/public/js/frappe/ui/page.js View File

@@ -317,7 +317,7 @@ frappe.ui.Page = Class.extend({
return this.$title_area.find(".title-icon") return this.$title_area.find(".title-icon")
.html('<i class="'+icon+' fa-fw"></i> ') .html('<i class="'+icon+' fa-fw"></i> ')
.toggle(true); .toggle(true);
},
},


add_help_button: function(txt) { add_help_button: function(txt) {
// //


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save