From 3c1db7881a3839b8752283a4c47a4f1a374f7aa2 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Tue, 21 Dec 2021 15:43:10 +0530 Subject: [PATCH 0001/1251] fix: Maintain document signature in Document Key table --- frappe/core/doctype/communication/mixins.py | 2 +- frappe/core/doctype/document_key/__init__.py | 0 .../core/doctype/document_key/document_key.js | 8 +++ .../doctype/document_key/document_key.json | 65 +++++++++++++++++++ .../core/doctype/document_key/document_key.py | 8 +++ .../doctype/document_key/test_document_key.py | 8 +++ frappe/model/document.py | 15 +++++ frappe/www/printview.py | 2 +- 8 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 frappe/core/doctype/document_key/__init__.py create mode 100644 frappe/core/doctype/document_key/document_key.js create mode 100644 frappe/core/doctype/document_key/document_key.json create mode 100644 frappe/core/doctype/document_key/document_key.py create mode 100644 frappe/core/doctype/document_key/test_document_key.py diff --git a/frappe/core/doctype/communication/mixins.py b/frappe/core/doctype/communication/mixins.py index b6d8070d00..1d1d162728 100644 --- a/frappe/core/doctype/communication/mixins.py +++ b/frappe/core/doctype/communication/mixins.py @@ -149,7 +149,7 @@ class CommunicationEmailMixin: "doctype": self.reference_doctype, "name": self.reference_name, "print_format": print_format, - "key": get_parent_doc(self).get_signature() + "key": get_parent_doc(self).get_new_document_key() }) def get_outgoing_email_account(self): diff --git a/frappe/core/doctype/document_key/__init__.py b/frappe/core/doctype/document_key/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/core/doctype/document_key/document_key.js b/frappe/core/doctype/document_key/document_key.js new file mode 100644 index 0000000000..e8bda74ad2 --- /dev/null +++ b/frappe/core/doctype/document_key/document_key.js @@ -0,0 +1,8 @@ +// Copyright (c) 2021, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Document Key', { + // refresh: function(frm) { + + // } +}); diff --git a/frappe/core/doctype/document_key/document_key.json b/frappe/core/doctype/document_key/document_key.json new file mode 100644 index 0000000000..780432a730 --- /dev/null +++ b/frappe/core/doctype/document_key/document_key.json @@ -0,0 +1,65 @@ +{ + "actions": [], + "allow_rename": 1, + "autoname": "format:DOCUMENT-KEY-{########}", + "creation": "2021-12-20 03:34:58.744797", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "reference_doctype", + "reference_docname", + "key" + ], + "fields": [ + { + "fieldname": "reference_doctype", + "fieldtype": "Link", + "label": "Reference Document Type", + "options": "DocType", + "read_only": 1, + "search_index": 1 + }, + { + "fieldname": "reference_docname", + "fieldtype": "Dynamic Link", + "label": "Reference Document Name", + "options": "reference_doctype", + "read_only": 1, + "search_index": 1 + }, + { + "fieldname": "key", + "fieldtype": "Data", + "label": "Key", + "read_only": 1 + } + ], + "in_create": 1, + "index_web_pages_for_search": 1, + "links": [], + "modified": "2021-12-20 04:24:19.320505", + "modified_by": "Administrator", + "module": "Core", + "name": "Document Key", + "naming_rule": "Expression", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "read_only": 1, + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/frappe/core/doctype/document_key/document_key.py b/frappe/core/doctype/document_key/document_key.py new file mode 100644 index 0000000000..3440545db6 --- /dev/null +++ b/frappe/core/doctype/document_key/document_key.py @@ -0,0 +1,8 @@ +# Copyright (c) 2021, Frappe Technologies and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + +class DocumentKey(Document): + pass diff --git a/frappe/core/doctype/document_key/test_document_key.py b/frappe/core/doctype/document_key/test_document_key.py new file mode 100644 index 0000000000..5930ce72b4 --- /dev/null +++ b/frappe/core/doctype/document_key/test_document_key.py @@ -0,0 +1,8 @@ +# Copyright (c) 2021, Frappe Technologies and Contributors +# See license.txt + +# import frappe +import unittest + +class TestDocumentKey(unittest.TestCase): + pass diff --git a/frappe/model/document.py b/frappe/model/document.py index bbba9b1492..8cbb3d5975 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -1271,6 +1271,21 @@ class Document(BaseDocument): """Returns signature (hash) for private URL.""" return hashlib.sha224(get_datetime_str(self.creation).encode()).hexdigest() + def get_new_document_key(self): + doc = frappe.new_doc("Document Key") + doc.reference_doctype = self.doctype + doc.reference_docname = self.name + doc.key = frappe.generate_hash(length=32) + doc.insert(ignore_permissions=True) + return doc.key + + def is_document_key_valid(self, key): + return frappe.db.exists("Document Key", { + "reference_doctype": self.doctype, + "reference_docname": self.name, + "key": key + }) + def get_liked_by(self): liked_by = getattr(self, "_liked_by", None) if liked_by: diff --git a/frappe/www/printview.py b/frappe/www/printview.py index 569ebe27d6..549e69ff3b 100644 --- a/frappe/www/printview.py +++ b/frappe/www/printview.py @@ -227,7 +227,7 @@ def get_rendered_raw_commands(doc, name=None, print_format=None, meta=None, lang def validate_print_permission(doc): if frappe.form_dict.get("key"): - if frappe.form_dict.key == doc.get_signature(): + if doc.is_document_key_valid(frappe.form_dict.key): return for ptype in ("read", "print"): From 499625a85f7165f648a3e93c7e36d8015f43a027 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Mon, 27 Dec 2021 23:45:21 +0530 Subject: [PATCH 0002/1251] fix: Allow old signature as well --- frappe/www/printview.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frappe/www/printview.py b/frappe/www/printview.py index 549e69ff3b..4251a448bc 100644 --- a/frappe/www/printview.py +++ b/frappe/www/printview.py @@ -230,6 +230,9 @@ def validate_print_permission(doc): if doc.is_document_key_valid(frappe.form_dict.key): return + if frappe.form_dict.key == doc.get_signature(): + return + for ptype in ("read", "print"): if (not frappe.has_permission(doc.doctype, ptype, doc) and not frappe.has_website_permission(doc)): From 64985a5d1a21911c93ea4d82798cd6481199fd59 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Tue, 28 Dec 2021 15:19:01 +0530 Subject: [PATCH 0003/1251] feat: Document key expiry --- frappe/core/doctype/doctype/doctype.json | 13 +++++++++- .../doctype/document_key/document_key.json | 25 +++++++++++++++++-- .../core/doctype/document_key/document_key.py | 16 ++++++++++-- .../customize_form/customize_form.json | 11 +++++++- frappe/exceptions.py | 1 + frappe/hooks.py | 1 + frappe/model/document.py | 6 +++-- 7 files changed, 65 insertions(+), 8 deletions(-) diff --git a/frappe/core/doctype/doctype/doctype.json b/frappe/core/doctype/doctype/doctype.json index 03e3b65ea1..9a777c740a 100644 --- a/frappe/core/doctype/doctype/doctype.json +++ b/frappe/core/doctype/doctype/doctype.json @@ -5,6 +5,7 @@ "creation": "2013-02-18 13:36:19", "description": "DocType is a Table / Form in the application.", "doctype": "DocType", + "document_key_expiry": 90, "document_type": "Document", "engine": "InnoDB", "field_order": [ @@ -56,6 +57,7 @@ "color", "show_preview_popup", "show_name_in_global_search", + "document_key_expiry", "email_settings_sb", "default_email_template", "column_break_51", @@ -582,6 +584,13 @@ "fieldname": "document_states_section", "fieldtype": "Section Break", "label": "Document States" + }, + { + "default": "90", + "description": "Set number of days after which a document key will be expired", + "fieldname": "document_key_expiry", + "fieldtype": "Int", + "label": "Document Key Expiry (in Days)" } ], "icon": "fa fa-bolt", @@ -663,10 +672,11 @@ "link_fieldname": "reference_doctype" } ], - "modified": "2021-12-09 14:53:10.717788", + "modified": "2021-12-28 03:19:19.033347", "modified_by": "Administrator", "module": "Core", "name": "DocType", + "naming_rule": "Set by user", "owner": "Administrator", "permissions": [ { @@ -696,5 +706,6 @@ "show_name_in_global_search": 1, "sort_field": "modified", "sort_order": "DESC", + "states": [], "track_changes": 1 } \ No newline at end of file diff --git a/frappe/core/doctype/document_key/document_key.json b/frappe/core/doctype/document_key/document_key.json index 780432a730..b9f26b2a7e 100644 --- a/frappe/core/doctype/document_key/document_key.json +++ b/frappe/core/doctype/document_key/document_key.json @@ -4,12 +4,15 @@ "autoname": "format:DOCUMENT-KEY-{########}", "creation": "2021-12-20 03:34:58.744797", "doctype": "DocType", + "document_key_expiry": 90, "editable_grid": 1, "engine": "InnoDB", "field_order": [ "reference_doctype", "reference_docname", - "key" + "key", + "expires_on", + "status" ], "fields": [ { @@ -33,12 +36,30 @@ "fieldtype": "Data", "label": "Key", "read_only": 1 + }, + { + "fieldname": "expires_on", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Expires On", + "read_only": 1 + }, + { + "default": "Active", + "fieldname": "status", + "fieldtype": "Select", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Status", + "options": "Active\nExpired", + "read_only": 1, + "search_index": 1 } ], "in_create": 1, "index_web_pages_for_search": 1, "links": [], - "modified": "2021-12-20 04:24:19.320505", + "modified": "2021-12-28 00:43:57.811188", "modified_by": "Administrator", "module": "Core", "name": "Document Key", diff --git a/frappe/core/doctype/document_key/document_key.py b/frappe/core/doctype/document_key/document_key.py index 3440545db6..5b8fefcb80 100644 --- a/frappe/core/doctype/document_key/document_key.py +++ b/frappe/core/doctype/document_key/document_key.py @@ -1,8 +1,20 @@ # Copyright (c) 2021, Frappe Technologies and contributors # For license information, please see license.txt -# import frappe +import frappe from frappe.model.document import Document class DocumentKey(Document): - pass + def before_insert(self): + self.key = frappe.generate_hash(length=32) + if not self.expires_on: + meta = frappe.get_meta("DocType", self.reference_doctype) + self.expires_on = frappe.utils.add_days(None, days=meta.get("document_key_expiry") or 90) + + +def expire_document_keys(): + # called from hooks + frappe.db.set_value("Document Key", { + "expired_on": ["<", frappe.utils.nowdate()], + "status": "Active" + }, "status", "Expired") \ No newline at end of file diff --git a/frappe/custom/doctype/customize_form/customize_form.json b/frappe/custom/doctype/customize_form/customize_form.json index bdf95ad351..b1c67345d9 100644 --- a/frappe/custom/doctype/customize_form/customize_form.json +++ b/frappe/custom/doctype/customize_form/customize_form.json @@ -3,6 +3,7 @@ "autoname": "DL.####", "creation": "2013-01-29 17:55:08", "doctype": "DocType", + "document_key_expiry": 90, "document_type": "Document", "editable_grid": 1, "engine": "InnoDB", @@ -31,6 +32,7 @@ "default_print_format", "column_break_29", "show_preview_popup", + "document_key_expiry", "email_settings_section", "default_email_template", "column_break_26", @@ -296,6 +298,13 @@ "fieldtype": "Table", "label": "States", "options": "DocType State" + }, + { + "default": "90", + "description": "Set number of days after which a document key will be expired", + "fieldname": "document_key_expiry", + "fieldtype": "Int", + "label": "Document Key Expiry (in Days)" } ], "hide_toolbar": 1, @@ -304,7 +313,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2021-12-14 16:45:04.308690", + "modified": "2021-12-28 00:30:47.840699", "modified_by": "Administrator", "module": "Custom", "name": "Customize Form", diff --git a/frappe/exceptions.py b/frappe/exceptions.py index 8449425bc1..8993539603 100644 --- a/frappe/exceptions.py +++ b/frappe/exceptions.py @@ -82,6 +82,7 @@ class DocstatusTransitionError(ValidationError): pass class TimestampMismatchError(ValidationError): pass class EmptyTableError(ValidationError): pass class LinkExistsError(ValidationError): pass +class LinkExpiredError(ValidationError): pass class InvalidEmailAddressError(ValidationError): pass class InvalidNameError(ValidationError): pass class InvalidPhoneNumberError(ValidationError): pass diff --git a/frappe/hooks.py b/frappe/hooks.py index 4895c97200..d729e2ab55 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -241,6 +241,7 @@ scheduler_events = { "frappe.email.doctype.unhandled_email.unhandled_email.remove_old_unhandled_emails", "frappe.core.doctype.prepared_report.prepared_report.delete_expired_prepared_reports", "frappe.core.doctype.log_settings.log_settings.run_log_clean_up", + "frappe.core.doctype.document_key.document_key.expire_document_keys", "frappe.website.doctype.personal_data_deletion_request.personal_data_deletion_request.process_data_deletion_request" ], "daily_long": [ diff --git a/frappe/model/document.py b/frappe/model/document.py index 8cbb3d5975..ec83f5f7b0 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -1271,11 +1271,12 @@ class Document(BaseDocument): """Returns signature (hash) for private URL.""" return hashlib.sha224(get_datetime_str(self.creation).encode()).hexdigest() - def get_new_document_key(self): + @frappe.whitelist() + def get_new_document_key(self, expires_on=None): doc = frappe.new_doc("Document Key") doc.reference_doctype = self.doctype doc.reference_docname = self.name - doc.key = frappe.generate_hash(length=32) + doc.expires_on = expires_on doc.insert(ignore_permissions=True) return doc.key @@ -1283,6 +1284,7 @@ class Document(BaseDocument): return frappe.db.exists("Document Key", { "reference_doctype": self.doctype, "reference_docname": self.name, + "status": "Active", "key": key }) From d08a332a85c0013125936f2c98fed9be352eccab Mon Sep 17 00:00:00 2001 From: Noah Jacob Date: Thu, 30 Dec 2021 14:50:33 +0530 Subject: [PATCH 0004/1251] feat: Phone Field Control Type --- frappe/boot.py | 7 + frappe/core/doctype/docfield/docfield.json | 1085 +++++++++-------- .../doctype/custom_field/custom_field.json | 4 +- .../customize_form_field.json | 4 +- frappe/database/mariadb/database.py | 3 +- frappe/database/postgres/database.py | 3 +- frappe/model/__init__.py | 3 +- frappe/model/base_document.py | 12 + frappe/model/meta.py | 3 + .../public/js/frappe/form/controls/control.js | 1 + .../public/js/frappe/form/controls/phone.js | 159 +++ .../js/frappe/phone_picker/phone_picker.js | 92 ++ frappe/public/js/frappe/utils/utils.js | 13 + frappe/public/scss/common/controls.scss | 1 + frappe/public/scss/common/phone_picker.scss | 119 ++ 15 files changed, 960 insertions(+), 549 deletions(-) create mode 100644 frappe/public/js/frappe/form/controls/phone.js create mode 100644 frappe/public/js/frappe/phone_picker/phone_picker.js create mode 100644 frappe/public/scss/common/phone_picker.scss diff --git a/frappe/boot.py b/frappe/boot.py index cf2b914436..026c0d6f16 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -58,6 +58,7 @@ def get_bootinfo(): bootinfo.home_folder = frappe.db.get_value("File", {"is_home_folder": 1}) bootinfo.navbar_settings = get_navbar_settings() bootinfo.notification_settings = get_notification_settings() + get_country_codes(bootinfo) # ipinfo if frappe.session.data.get('ipinfo'): @@ -324,3 +325,9 @@ def get_desk_settings(): def get_notification_settings(): return frappe.get_cached_doc('Notification Settings', frappe.session.user) + +def get_country_codes(bootinfo): + country_codes = { + "United States": {"isd":"+1","code":"us" }, + "India": {"isd":"+91","code":"in" }} + bootinfo.country_codes = frappe._dict(country_codes) diff --git a/frappe/core/doctype/docfield/docfield.json b/frappe/core/doctype/docfield/docfield.json index 6910d615d3..56c3ff6037 100644 --- a/frappe/core/doctype/docfield/docfield.json +++ b/frappe/core/doctype/docfield/docfield.json @@ -1,543 +1,544 @@ { - "actions": [], - "autoname": "hash", - "creation": "2013-02-22 01:27:33", - "doctype": "DocType", - "document_type": "Setup", - "editable_grid": 1, - "engine": "InnoDB", - "field_order": [ - "label_and_type", - "label", - "fieldtype", - "fieldname", - "precision", - "length", - "non_negative", - "hide_days", - "hide_seconds", - "reqd", - "search_index", - "column_break_18", - "options", - "defaults_section", - "default", - "column_break_6", - "fetch_from", - "fetch_if_empty", - "visibility_section", - "hidden", - "bold", - "allow_in_quick_entry", - "translatable", - "print_hide", - "print_hide_if_no_value", - "report_hide", - "column_break_28", - "depends_on", - "collapsible", - "collapsible_depends_on", - "hide_border", - "list__search_settings_section", - "in_list_view", - "in_standard_filter", - "in_preview", - "column_break_35", - "in_filter", - "in_global_search", - "permissions", - "read_only", - "allow_on_submit", - "ignore_user_permissions", - "allow_bulk_edit", - "column_break_13", - "permlevel", - "ignore_xss_filter", - "constraints_section", - "unique", - "no_copy", - "set_only_once", - "remember_last_selected_value", - "column_break_38", - "mandatory_depends_on", - "read_only_depends_on", - "display", - "print_width", - "width", - "max_height", - "columns", - "column_break_22", - "description", - "oldfieldname", - "oldfieldtype" - ], - "fields": [{ - "fieldname": "label_and_type", - "fieldtype": "Section Break" - }, - { - "bold": 1, - "fieldname": "label", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Label", - "oldfieldname": "label", - "oldfieldtype": "Data", - "print_width": "163", - "search_index": 1, - "width": "163" - }, - { - "bold": 1, - "default": "Data", - "fieldname": "fieldtype", - "fieldtype": "Select", - "in_list_view": 1, - "label": "Type", - "oldfieldname": "fieldtype", - "oldfieldtype": "Select", - "options": "Attach\nAttach Image\nBarcode\nButton\nCheck\nCode\nColor\nColumn Break\nCurrency\nData\nDate\nDatetime\nDuration\nDynamic Link\nFloat\nFold\nGeolocation\nHeading\nHTML\nHTML Editor\nIcon\nImage\nInt\nLink\nLong Text\nMarkdown Editor\nPassword\nPercent\nRead Only\nRating\nSection Break\nSelect\nSmall Text\nTable\nTable MultiSelect\nText\nText Editor\nTime\nSignature\nTab Break", - "reqd": 1, - "search_index": 1 - }, - { - "bold": 1, - "fieldname": "fieldname", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Name", - "oldfieldname": "fieldname", - "oldfieldtype": "Data", - "search_index": 1 - }, - { - "default": "0", - "depends_on": "eval:!in_list([\"Section Break\", \"Column Break\", \"Button\", \"HTML\"], doc.fieldtype)", - "fieldname": "reqd", - "fieldtype": "Check", - "in_list_view": 1, - "label": "Mandatory", - "oldfieldname": "reqd", - "oldfieldtype": "Check", - "print_width": "50px", - "width": "50px" - }, - { - "depends_on": "eval:in_list([\"Float\", \"Currency\", \"Percent\"], doc.fieldtype)", - "description": "Set non-standard precision for a Float or Currency field", - "fieldname": "precision", - "fieldtype": "Select", - "label": "Precision", - "options": "\n0\n1\n2\n3\n4\n5\n6\n7\n8\n9", - "print_hide": 1 - }, - { - "depends_on": "eval:in_list(['Data', 'Link', 'Dynamic Link', 'Password', 'Select', 'Read Only', 'Attach', 'Attach Image', 'Int'], doc.fieldtype)", - "fieldname": "length", - "fieldtype": "Int", - "label": "Length" - }, - { - "default": "0", - "fieldname": "search_index", - "fieldtype": "Check", - "label": "Index", - "oldfieldname": "search_index", - "oldfieldtype": "Check", - "print_width": "50px", - "width": "50px" - }, - { - "default": "0", - "fieldname": "in_list_view", - "fieldtype": "Check", - "label": "In List View", - "print_width": "70px", - "width": "70px" - }, - { - "default": "0", - "fieldname": "in_standard_filter", - "fieldtype": "Check", - "label": "In List Filter" - }, - { - "default": "0", - "depends_on": "eval:([\"Data\", \"Select\", \"Table\", \"Text\", \"Text Editor\", \"Link\", \"Small Text\", \"Long Text\", \"Read Only\", \"Heading\", \"Dynamic Link\"].indexOf(doc.fieldtype) !== -1)", - "fieldname": "in_global_search", - "fieldtype": "Check", - "label": "In Global Search" - }, - { - "default": "0", - "depends_on": "eval:!in_list(['Table', 'Table MultiSelect'], doc.fieldtype);", - "fieldname": "in_preview", - "fieldtype": "Check", - "label": "In Preview" - }, - { - "default": "0", - "fieldname": "allow_in_quick_entry", - "fieldtype": "Check", - "label": "Allow in Quick Entry" - }, - { - "default": "0", - "fieldname": "bold", - "fieldtype": "Check", - "label": "Bold" - }, - { - "default": "0", - "depends_on": "eval:['Data', 'Select', 'Text', 'Small Text', 'Text Editor'].includes(doc.fieldtype)", - "fieldname": "translatable", - "fieldtype": "Check", - "label": "Translatable" - }, - { - "default": "0", - "depends_on": "eval:doc.fieldtype===\"Section Break\"", - "fieldname": "collapsible", - "fieldtype": "Check", - "label": "Collapsible", - "length": 255 - }, - { - "depends_on": "eval:doc.fieldtype==\"Section Break\" && doc.collapsible", - "fieldname": "collapsible_depends_on", - "fieldtype": "Code", - "label": "Collapsible Depends On (JS)", - "max_height": "3rem", - "options": "JS" - }, - { - "fieldname": "column_break_6", - "fieldtype": "Column Break" - }, - { - "description": "For Links, enter the DocType as range.\nFor Select, enter list of Options, each on a new line.", - "fieldname": "options", - "fieldtype": "Small Text", - "in_list_view": 1, - "label": "Options", - "oldfieldname": "options", - "oldfieldtype": "Text" - }, - { - "fieldname": "default", - "fieldtype": "Small Text", - "label": "Default", - "max_height": "3rem", - "oldfieldname": "default", - "oldfieldtype": "Text" - }, - { - "fieldname": "fetch_from", - "fieldtype": "Small Text", - "label": "Fetch From" - }, - { - "default": "0", - "fieldname": "fetch_if_empty", - "fieldtype": "Check", - "label": "Fetch only if value is not set" - }, - { - "fieldname": "permissions", - "fieldtype": "Section Break", - "label": "Permissions" - }, - { - "fieldname": "depends_on", - "fieldtype": "Code", - "label": "Display Depends On (JS)", - "length": 255, - "max_height": "3rem", - "oldfieldname": "depends_on", - "oldfieldtype": "Data", - "options": "JS" - }, - { - "default": "0", - "fieldname": "hidden", - "fieldtype": "Check", - "label": "Hidden", - "oldfieldname": "hidden", - "oldfieldtype": "Check", - "print_width": "50px", - "width": "50px" - }, - { - "default": "0", - "fieldname": "read_only", - "fieldtype": "Check", - "label": "Read Only", - "print_width": "50px", - "width": "50px" - }, - { - "default": "0", - "fieldname": "unique", - "fieldtype": "Check", - "label": "Unique" - }, - { - "default": "0", - "fieldname": "set_only_once", - "fieldtype": "Check", - "label": "Set only once" - }, - { - "default": "0", - "depends_on": "eval: doc.fieldtype == \"Table\"", - "fieldname": "allow_bulk_edit", - "fieldtype": "Check", - "label": "Allow Bulk Edit" - }, - { - "fieldname": "column_break_13", - "fieldtype": "Column Break" - }, - { - "default": "0", - "fieldname": "permlevel", - "fieldtype": "Int", - "label": "Perm Level", - "oldfieldname": "permlevel", - "oldfieldtype": "Int", - "print_width": "50px", - "width": "50px" - }, - { - "default": "0", - "fieldname": "ignore_user_permissions", - "fieldtype": "Check", - "label": "Ignore User Permissions" - }, - { - "default": "0", - "depends_on": "eval: parent.is_submittable", - "fieldname": "allow_on_submit", - "fieldtype": "Check", - "label": "Allow on Submit", - "oldfieldname": "allow_on_submit", - "oldfieldtype": "Check", - "print_width": "50px", - "width": "50px" - }, - { - "default": "0", - "fieldname": "report_hide", - "fieldtype": "Check", - "label": "Report Hide", - "oldfieldname": "report_hide", - "oldfieldtype": "Check", - "print_width": "50px", - "width": "50px" - }, - { - "default": "0", - "depends_on": "eval:(doc.fieldtype == 'Link')", - "fieldname": "remember_last_selected_value", - "fieldtype": "Check", - "label": "Remember Last Selected Value" - }, - { - "default": "0", - "description": "Don't HTML Encode HTML tags like <script> or just characters like < or >, as they could be intentionally used in this field", - "fieldname": "ignore_xss_filter", - "fieldtype": "Check", - "label": "Ignore XSS Filter" - }, - { - "fieldname": "display", - "fieldtype": "Section Break", - "label": "Display" - }, - { - "default": "0", - "fieldname": "in_filter", - "fieldtype": "Check", - "label": "In Filter", - "oldfieldname": "in_filter", - "oldfieldtype": "Check", - "print_width": "50px", - "width": "50px" - }, - { - "default": "0", - "fieldname": "no_copy", - "fieldtype": "Check", - "label": "No Copy", - "oldfieldname": "no_copy", - "oldfieldtype": "Check", - "print_width": "50px", - "width": "50px" - }, - { - "default": "0", - "fieldname": "print_hide", - "fieldtype": "Check", - "label": "Print Hide", - "oldfieldname": "print_hide", - "oldfieldtype": "Check", - "print_width": "50px", - "width": "50px" - }, - { - "default": "0", - "depends_on": "eval:[\"Int\", \"Float\", \"Currency\", \"Percent\"].indexOf(doc.fieldtype)!==-1", - "fieldname": "print_hide_if_no_value", - "fieldtype": "Check", - "label": "Print Hide If No Value" - }, - { - "fieldname": "print_width", - "fieldtype": "Data", - "label": "Print Width", - "length": 10 - }, - { - "fieldname": "width", - "fieldtype": "Data", - "label": "Width", - "length": 10, - "oldfieldname": "width", - "oldfieldtype": "Data", - "print_width": "50px", - "width": "50px" - }, - { - "description": "Number of columns for a field in a List View or a Grid (Total Columns should be less than 11)", - "fieldname": "columns", - "fieldtype": "Int", - "label": "Columns" - }, - { - "fieldname": "column_break_22", - "fieldtype": "Column Break" - }, - { - "fieldname": "description", - "fieldtype": "Small Text", - "in_list_view": 1, - "label": "Description", - "oldfieldname": "description", - "oldfieldtype": "Text", - "print_width": "300px", - "width": "300px" - }, - { - "fieldname": "oldfieldname", - "fieldtype": "Data", - "hidden": 1, - "oldfieldname": "oldfieldname", - "oldfieldtype": "Data" - }, - { - "fieldname": "oldfieldtype", - "fieldtype": "Data", - "hidden": 1, - "oldfieldname": "oldfieldtype", - "oldfieldtype": "Data" - }, - { - "fieldname": "mandatory_depends_on", - "fieldtype": "Code", - "label": "Mandatory Depends On (JS)", - "max_height": "3rem", - "options": "JS" - }, - { - "fieldname": "read_only_depends_on", - "fieldtype": "Code", - "label": "Read Only Depends On (JS)", - "max_height": "3rem", - "options": "JS" - }, - { - "fieldname": "column_break_38", - "fieldtype": "Column Break" - }, - { - "default": "0", - "depends_on": "eval:doc.fieldtype=='Duration'", - "fieldname": "hide_days", - "fieldtype": "Check", - "label": "Hide Days" - }, - { - "default": "0", - "depends_on": "eval:doc.fieldtype=='Duration'", - "fieldname": "hide_seconds", - "fieldtype": "Check", - "label": "Hide Seconds" - }, - { - "default": "0", - "depends_on": "eval:doc.fieldtype=='Section Break'", - "fieldname": "hide_border", - "fieldtype": "Check", - "label": "Hide Border" - }, - { - "default": "0", - "depends_on": "eval:in_list([\"Int\", \"Float\", \"Currency\"], doc.fieldtype)", - "fieldname": "non_negative", - "fieldtype": "Check", - "label": "Non Negative" - }, - { - "fieldname": "column_break_18", - "fieldtype": "Column Break" - }, - { - "fieldname": "defaults_section", - "fieldtype": "Section Break", - "label": "Defaults", - "max_height": "2rem" - }, - { - "fieldname": "visibility_section", - "fieldtype": "Section Break", - "label": "Visibility" - }, - { - "fieldname": "column_break_28", - "fieldtype": "Column Break" - }, - { - "fieldname": "constraints_section", - "fieldtype": "Section Break", - "label": "Constraints" - }, - { - "fieldname": "max_height", - "fieldtype": "Data", - "label": "Max Height", - "length": 10 - }, - { - "fieldname": "list__search_settings_section", - "fieldtype": "Section Break", - "label": "List / Search Settings" - }, - { - "fieldname": "column_break_35", - "fieldtype": "Column Break" - } - ], - "idx": 1, - "index_web_pages_for_search": 1, - "istable": 1, - "links": [], - "modified": "2021-09-04 19:41:23.684094", - "modified_by": "Administrator", - "module": "Core", - "name": "DocField", - "naming_rule": "Random", - "owner": "Administrator", - "permissions": [], - "sort_field": "modified", - "sort_order": "ASC" -} \ No newline at end of file + "actions": [], + "autoname": "hash", + "creation": "2013-02-22 01:27:33", + "doctype": "DocType", + "document_type": "Setup", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "label_and_type", + "label", + "fieldtype", + "fieldname", + "precision", + "length", + "non_negative", + "hide_days", + "hide_seconds", + "reqd", + "search_index", + "column_break_18", + "options", + "defaults_section", + "default", + "column_break_6", + "fetch_from", + "fetch_if_empty", + "visibility_section", + "hidden", + "bold", + "allow_in_quick_entry", + "translatable", + "print_hide", + "print_hide_if_no_value", + "report_hide", + "column_break_28", + "depends_on", + "collapsible", + "collapsible_depends_on", + "hide_border", + "list__search_settings_section", + "in_list_view", + "in_standard_filter", + "in_preview", + "column_break_35", + "in_filter", + "in_global_search", + "permissions", + "read_only", + "allow_on_submit", + "ignore_user_permissions", + "allow_bulk_edit", + "column_break_13", + "permlevel", + "ignore_xss_filter", + "constraints_section", + "unique", + "no_copy", + "set_only_once", + "remember_last_selected_value", + "column_break_38", + "mandatory_depends_on", + "read_only_depends_on", + "display", + "print_width", + "width", + "max_height", + "columns", + "column_break_22", + "description", + "oldfieldname", + "oldfieldtype" + ], + "fields": [ + { + "fieldname": "label_and_type", + "fieldtype": "Section Break" + }, + { + "bold": 1, + "fieldname": "label", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Label", + "oldfieldname": "label", + "oldfieldtype": "Data", + "print_width": "163", + "search_index": 1, + "width": "163" + }, + { + "bold": 1, + "default": "Data", + "fieldname": "fieldtype", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Type", + "oldfieldname": "fieldtype", + "oldfieldtype": "Select", + "options": "Attach\nAttach Image\nBarcode\nButton\nCheck\nCode\nColor\nColumn Break\nCurrency\nData\nDate\nDatetime\nDuration\nDynamic Link\nFloat\nFold\nGeolocation\nHeading\nHTML\nHTML Editor\nIcon\nImage\nInt\nLink\nLong Text\nMarkdown Editor\nPassword\nPercent\nPhone\nRead Only\nRating\nSection Break\nSelect\nSmall Text\nTable\nTable MultiSelect\nText\nText Editor\nTime\nSignature\nTab Break", + "reqd": 1, + "search_index": 1 + }, + { + "bold": 1, + "fieldname": "fieldname", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Name", + "oldfieldname": "fieldname", + "oldfieldtype": "Data", + "search_index": 1 + }, + { + "default": "0", + "depends_on": "eval:!in_list([\"Section Break\", \"Column Break\", \"Button\", \"HTML\"], doc.fieldtype)", + "fieldname": "reqd", + "fieldtype": "Check", + "in_list_view": 1, + "label": "Mandatory", + "oldfieldname": "reqd", + "oldfieldtype": "Check", + "print_width": "50px", + "width": "50px" + }, + { + "depends_on": "eval:in_list([\"Float\", \"Currency\", \"Percent\"], doc.fieldtype)", + "description": "Set non-standard precision for a Float or Currency field", + "fieldname": "precision", + "fieldtype": "Select", + "label": "Precision", + "options": "\n0\n1\n2\n3\n4\n5\n6\n7\n8\n9", + "print_hide": 1 + }, + { + "depends_on": "eval:in_list(['Data', 'Link', 'Dynamic Link', 'Password', 'Select', 'Read Only', 'Attach', 'Attach Image', 'Int'], doc.fieldtype)", + "fieldname": "length", + "fieldtype": "Int", + "label": "Length" + }, + { + "default": "0", + "fieldname": "search_index", + "fieldtype": "Check", + "label": "Index", + "oldfieldname": "search_index", + "oldfieldtype": "Check", + "print_width": "50px", + "width": "50px" + }, + { + "default": "0", + "fieldname": "in_list_view", + "fieldtype": "Check", + "label": "In List View", + "print_width": "70px", + "width": "70px" + }, + { + "default": "0", + "fieldname": "in_standard_filter", + "fieldtype": "Check", + "label": "In List Filter" + }, + { + "default": "0", + "depends_on": "eval:([\"Data\", \"Select\", \"Table\", \"Text\", \"Text Editor\", \"Link\", \"Small Text\", \"Long Text\", \"Read Only\", \"Heading\", \"Dynamic Link\"].indexOf(doc.fieldtype) !== -1)", + "fieldname": "in_global_search", + "fieldtype": "Check", + "label": "In Global Search" + }, + { + "default": "0", + "depends_on": "eval:!in_list(['Table', 'Table MultiSelect'], doc.fieldtype);", + "fieldname": "in_preview", + "fieldtype": "Check", + "label": "In Preview" + }, + { + "default": "0", + "fieldname": "allow_in_quick_entry", + "fieldtype": "Check", + "label": "Allow in Quick Entry" + }, + { + "default": "0", + "fieldname": "bold", + "fieldtype": "Check", + "label": "Bold" + }, + { + "default": "0", + "depends_on": "eval:['Data', 'Select', 'Text', 'Small Text', 'Text Editor'].includes(doc.fieldtype)", + "fieldname": "translatable", + "fieldtype": "Check", + "label": "Translatable" + }, + { + "default": "0", + "depends_on": "eval:doc.fieldtype===\"Section Break\"", + "fieldname": "collapsible", + "fieldtype": "Check", + "label": "Collapsible", + "length": 255 + }, + { + "depends_on": "eval:doc.fieldtype==\"Section Break\" && doc.collapsible", + "fieldname": "collapsible_depends_on", + "fieldtype": "Code", + "label": "Collapsible Depends On (JS)", + "max_height": "3rem", + "options": "JS" + }, + { + "fieldname": "column_break_6", + "fieldtype": "Column Break" + }, + { + "description": "For Links, enter the DocType as range.\nFor Select, enter list of Options, each on a new line.", + "fieldname": "options", + "fieldtype": "Small Text", + "in_list_view": 1, + "label": "Options", + "oldfieldname": "options", + "oldfieldtype": "Text" + }, + { + "fieldname": "default", + "fieldtype": "Small Text", + "label": "Default", + "max_height": "3rem", + "oldfieldname": "default", + "oldfieldtype": "Text" + }, + { + "fieldname": "fetch_from", + "fieldtype": "Small Text", + "label": "Fetch From" + }, + { + "default": "0", + "fieldname": "fetch_if_empty", + "fieldtype": "Check", + "label": "Fetch only if value is not set" + }, + { + "fieldname": "permissions", + "fieldtype": "Section Break", + "label": "Permissions" + }, + { + "fieldname": "depends_on", + "fieldtype": "Code", + "label": "Display Depends On (JS)", + "length": 255, + "max_height": "3rem", + "oldfieldname": "depends_on", + "oldfieldtype": "Data", + "options": "JS" + }, + { + "default": "0", + "fieldname": "hidden", + "fieldtype": "Check", + "label": "Hidden", + "oldfieldname": "hidden", + "oldfieldtype": "Check", + "print_width": "50px", + "width": "50px" + }, + { + "default": "0", + "fieldname": "read_only", + "fieldtype": "Check", + "label": "Read Only", + "print_width": "50px", + "width": "50px" + }, + { + "default": "0", + "fieldname": "unique", + "fieldtype": "Check", + "label": "Unique" + }, + { + "default": "0", + "fieldname": "set_only_once", + "fieldtype": "Check", + "label": "Set only once" + }, + { + "default": "0", + "depends_on": "eval: doc.fieldtype == \"Table\"", + "fieldname": "allow_bulk_edit", + "fieldtype": "Check", + "label": "Allow Bulk Edit" + }, + { + "fieldname": "column_break_13", + "fieldtype": "Column Break" + }, + { + "default": "0", + "fieldname": "permlevel", + "fieldtype": "Int", + "label": "Perm Level", + "oldfieldname": "permlevel", + "oldfieldtype": "Int", + "print_width": "50px", + "width": "50px" + }, + { + "default": "0", + "fieldname": "ignore_user_permissions", + "fieldtype": "Check", + "label": "Ignore User Permissions" + }, + { + "default": "0", + "depends_on": "eval: parent.is_submittable", + "fieldname": "allow_on_submit", + "fieldtype": "Check", + "label": "Allow on Submit", + "oldfieldname": "allow_on_submit", + "oldfieldtype": "Check", + "print_width": "50px", + "width": "50px" + }, + { + "default": "0", + "fieldname": "report_hide", + "fieldtype": "Check", + "label": "Report Hide", + "oldfieldname": "report_hide", + "oldfieldtype": "Check", + "print_width": "50px", + "width": "50px" + }, + { + "default": "0", + "depends_on": "eval:(doc.fieldtype == 'Link')", + "fieldname": "remember_last_selected_value", + "fieldtype": "Check", + "label": "Remember Last Selected Value" + }, + { + "default": "0", + "description": "Don't HTML Encode HTML tags like <script> or just characters like < or >, as they could be intentionally used in this field", + "fieldname": "ignore_xss_filter", + "fieldtype": "Check", + "label": "Ignore XSS Filter" + }, + { + "fieldname": "display", + "fieldtype": "Section Break", + "label": "Display" + }, + { + "default": "0", + "fieldname": "in_filter", + "fieldtype": "Check", + "label": "In Filter", + "oldfieldname": "in_filter", + "oldfieldtype": "Check", + "print_width": "50px", + "width": "50px" + }, + { + "default": "0", + "fieldname": "no_copy", + "fieldtype": "Check", + "label": "No Copy", + "oldfieldname": "no_copy", + "oldfieldtype": "Check", + "print_width": "50px", + "width": "50px" + }, + { + "default": "0", + "fieldname": "print_hide", + "fieldtype": "Check", + "label": "Print Hide", + "oldfieldname": "print_hide", + "oldfieldtype": "Check", + "print_width": "50px", + "width": "50px" + }, + { + "default": "0", + "depends_on": "eval:[\"Int\", \"Float\", \"Currency\", \"Percent\"].indexOf(doc.fieldtype)!==-1", + "fieldname": "print_hide_if_no_value", + "fieldtype": "Check", + "label": "Print Hide If No Value" + }, + { + "fieldname": "print_width", + "fieldtype": "Data", + "label": "Print Width", + "length": 10 + }, + { + "fieldname": "width", + "fieldtype": "Data", + "label": "Width", + "length": 10, + "oldfieldname": "width", + "oldfieldtype": "Data", + "print_width": "50px", + "width": "50px" + }, + { + "description": "Number of columns for a field in a List View or a Grid (Total Columns should be less than 11)", + "fieldname": "columns", + "fieldtype": "Int", + "label": "Columns" + }, + { + "fieldname": "column_break_22", + "fieldtype": "Column Break" + }, + { + "fieldname": "description", + "fieldtype": "Small Text", + "in_list_view": 1, + "label": "Description", + "oldfieldname": "description", + "oldfieldtype": "Text", + "print_width": "300px", + "width": "300px" + }, + { + "fieldname": "oldfieldname", + "fieldtype": "Data", + "hidden": 1, + "oldfieldname": "oldfieldname", + "oldfieldtype": "Data" + }, + { + "fieldname": "oldfieldtype", + "fieldtype": "Data", + "hidden": 1, + "oldfieldname": "oldfieldtype", + "oldfieldtype": "Data" + }, + { + "fieldname": "mandatory_depends_on", + "fieldtype": "Code", + "label": "Mandatory Depends On (JS)", + "max_height": "3rem", + "options": "JS" + }, + { + "fieldname": "read_only_depends_on", + "fieldtype": "Code", + "label": "Read Only Depends On (JS)", + "max_height": "3rem", + "options": "JS" + }, + { + "fieldname": "column_break_38", + "fieldtype": "Column Break" + }, + { + "default": "0", + "depends_on": "eval:doc.fieldtype=='Duration'", + "fieldname": "hide_days", + "fieldtype": "Check", + "label": "Hide Days" + }, + { + "default": "0", + "depends_on": "eval:doc.fieldtype=='Duration'", + "fieldname": "hide_seconds", + "fieldtype": "Check", + "label": "Hide Seconds" + }, + { + "default": "0", + "depends_on": "eval:doc.fieldtype=='Section Break'", + "fieldname": "hide_border", + "fieldtype": "Check", + "label": "Hide Border" + }, + { + "default": "0", + "depends_on": "eval:in_list([\"Int\", \"Float\", \"Currency\"], doc.fieldtype)", + "fieldname": "non_negative", + "fieldtype": "Check", + "label": "Non Negative" + }, + { + "fieldname": "column_break_18", + "fieldtype": "Column Break" + }, + { + "fieldname": "defaults_section", + "fieldtype": "Section Break", + "label": "Defaults", + "max_height": "2rem" + }, + { + "fieldname": "visibility_section", + "fieldtype": "Section Break", + "label": "Visibility" + }, + { + "fieldname": "column_break_28", + "fieldtype": "Column Break" + }, + { + "fieldname": "constraints_section", + "fieldtype": "Section Break", + "label": "Constraints" + }, + { + "fieldname": "max_height", + "fieldtype": "Data", + "label": "Max Height", + "length": 10 + }, + { + "fieldname": "list__search_settings_section", + "fieldtype": "Section Break", + "label": "List / Search Settings" + }, + { + "fieldname": "column_break_35", + "fieldtype": "Column Break" + } + ], + "idx": 1, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2021-12-26 23:39:38.341443", + "modified_by": "Administrator", + "module": "Core", + "name": "DocField", + "naming_rule": "Random", + "owner": "Administrator", + "permissions": [], + "sort_field": "modified", + "sort_order": "ASC" +} diff --git a/frappe/custom/doctype/custom_field/custom_field.json b/frappe/custom/doctype/custom_field/custom_field.json index 235f11aad8..516daf3521 100644 --- a/frappe/custom/doctype/custom_field/custom_field.json +++ b/frappe/custom/doctype/custom_field/custom_field.json @@ -120,7 +120,7 @@ "label": "Field Type", "oldfieldname": "fieldtype", "oldfieldtype": "Select", - "options": "Attach\nAttach Image\nBarcode\nButton\nCheck\nCode\nColor\nColumn Break\nCurrency\nData\nDate\nDatetime\nDuration\nDynamic Link\nFloat\nFold\nGeolocation\nHeading\nHTML\nHTML Editor\nIcon\nImage\nInt\nLink\nLong Text\nMarkdown Editor\nPassword\nPercent\nRead Only\nRating\nSection Break\nSelect\nSmall Text\nTable\nTable MultiSelect\nText\nText Editor\nTime\nSignature\nTab Break", + "options": "Attach\nAttach Image\nBarcode\nButton\nCheck\nCode\nColor\nColumn Break\nCurrency\nData\nDate\nDatetime\nDuration\nDynamic Link\nFloat\nFold\nGeolocation\nHeading\nHTML\nHTML Editor\nIcon\nImage\nInt\nLink\nLong Text\nMarkdown Editor\nPassword\nPercent\nPhone\nRead Only\nRating\nSection Break\nSelect\nSmall Text\nTable\nTable MultiSelect\nText\nText Editor\nTime\nSignature\nTab Break", "reqd": 1 }, { @@ -455,4 +455,4 @@ "sort_field": "modified", "sort_order": "ASC", "track_changes": 1 -} \ No newline at end of file +} diff --git a/frappe/custom/doctype/customize_form_field/customize_form_field.json b/frappe/custom/doctype/customize_form_field/customize_form_field.json index 986b99a7af..971bc51f96 100644 --- a/frappe/custom/doctype/customize_form_field/customize_form_field.json +++ b/frappe/custom/doctype/customize_form_field/customize_form_field.json @@ -82,7 +82,7 @@ "label": "Type", "oldfieldname": "fieldtype", "oldfieldtype": "Select", - "options": "Attach\nAttach Image\nBarcode\nButton\nCheck\nCode\nColor\nColumn Break\nCurrency\nData\nDate\nDatetime\nDuration\nDynamic Link\nFloat\nFold\nGeolocation\nHeading\nHTML\nHTML Editor\nIcon\nImage\nInt\nLink\nLong Text\nMarkdown Editor\nPassword\nPercent\nRating\nRead Only\nSection Break\nSelect\nSignature\nSmall Text\nTable\nTable MultiSelect\nText\nText Editor\nTime\nTab Break", + "options": "Attach\nAttach Image\nBarcode\nButton\nCheck\nCode\nColor\nColumn Break\nCurrency\nData\nDate\nDatetime\nDuration\nDynamic Link\nFloat\nFold\nGeolocation\nHeading\nHTML\nHTML Editor\nIcon\nImage\nInt\nLink\nLong Text\nMarkdown Editor\nPassword\nPercent\nPhone\nRating\nRead Only\nSection Break\nSelect\nSignature\nSmall Text\nTable\nTable MultiSelect\nText\nText Editor\nTime\nTab Break", "reqd": 1, "search_index": 1 }, @@ -436,4 +436,4 @@ "permissions": [], "sort_field": "modified", "sort_order": "ASC" -} \ No newline at end of file +} diff --git a/frappe/database/mariadb/database.py b/frappe/database/mariadb/database.py index 2f6d640743..5e838db842 100644 --- a/frappe/database/mariadb/database.py +++ b/frappe/database/mariadb/database.py @@ -52,7 +52,8 @@ class MariaDBDatabase(Database): 'Barcode': ('longtext', ''), 'Geolocation': ('longtext', ''), 'Duration': ('decimal', '21,9'), - 'Icon': ('varchar', self.VARCHAR_LEN) + 'Icon': ('varchar', self.VARCHAR_LEN), + 'Phone': ('varchar', self.VARCHAR_LEN) } def get_connection(self): diff --git a/frappe/database/postgres/database.py b/frappe/database/postgres/database.py index bfa5515111..71b5918d4a 100644 --- a/frappe/database/postgres/database.py +++ b/frappe/database/postgres/database.py @@ -62,7 +62,8 @@ class PostgresDatabase(Database): 'Barcode': ('text', ''), 'Geolocation': ('text', ''), 'Duration': ('decimal', '21,9'), - 'Icon': ('varchar', self.VARCHAR_LEN) + 'Icon': ('varchar', self.VARCHAR_LEN), + 'Phone': ('varchar', self.VARCHAR_LEN) } def get_connection(self): diff --git a/frappe/model/__init__.py b/frappe/model/__init__.py index b460db29a7..00486d3d87 100644 --- a/frappe/model/__init__.py +++ b/frappe/model/__init__.py @@ -35,7 +35,8 @@ data_fieldtypes = ( 'Barcode', 'Geolocation', 'Duration', - 'Icon' + 'Icon', + 'Phone' ) no_value_fields = ( diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index 1826cca9a3..ac87e564ac 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -11,6 +11,7 @@ from frappe.model import display_fieldtypes from frappe.utils import (cint, flt, now, cstr, strip_html, sanitize_html, sanitize_email, cast_fieldtype) from frappe.utils.html_utils import unescape_html +import phonenumbers as ph max_positive_value = { 'smallint': 2 ** 15, @@ -652,6 +653,17 @@ class BaseDocument(object): from frappe.core.doctype.user.user import STANDARD_USERS # data_field options defined in frappe.model.data_field_options + for phone_field in self.meta.get_phone_fields(): + phone = self.get(phone_field.fieldname) + try: + phone = ph.parse(phone) + except Exception as e: + if e.error_type == 1: + frappe.throw(_("The entered value is not a phone number."), title="Invalid Number") + frappe.throw(_("Please select a country code."), title = _("Country Code Required")) + if not ph.is_valid_number(phone): + frappe.throw('This is not a valid phone number', title = "Invalid Number") + for data_field in self.meta.get_data_fields(): data = self.get(data_field.fieldname) data_field_options = data_field.get("options") diff --git a/frappe/model/meta.py b/frappe/model/meta.py index cd0d8e0f3a..7430c35946 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -130,6 +130,9 @@ class Meta(Document): def get_data_fields(self): return self.get("fields", {"fieldtype": "Data"}) + def get_phone_fields(self): + return self.get("fields", {"fieldtype": "Phone"}) + def get_dynamic_link_fields(self): if not hasattr(self, '_dynamic_link_fields'): self._dynamic_link_fields = self.get("fields", {"fieldtype": "Dynamic Link"}) diff --git a/frappe/public/js/frappe/form/controls/control.js b/frappe/public/js/frappe/form/controls/control.js index bd04938e35..578ddd3276 100644 --- a/frappe/public/js/frappe/form/controls/control.js +++ b/frappe/public/js/frappe/form/controls/control.js @@ -40,6 +40,7 @@ import './multiselect_list'; import './rating'; import './duration'; import './icon'; +import './phone' frappe.ui.form.make_control = function (opts) { var control_class_name = "Control" + opts.df.fieldtype.replace(/ /g, ""); diff --git a/frappe/public/js/frappe/form/controls/phone.js b/frappe/public/js/frappe/form/controls/phone.js new file mode 100644 index 0000000000..c00c966539 --- /dev/null +++ b/frappe/public/js/frappe/form/controls/phone.js @@ -0,0 +1,159 @@ + +import Picker from '../../phone_picker/phone_picker'; + +frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlData { + + make_input() { + super.make_input(); + this.make_icon_input(); + this.input_events(); + } + + input_events() { + // Replaces code when selected and removes previously selected. + this.picker.on_change = (country) => { + const country_code = frappe.boot.country_codes[country].code; + const country_isd = frappe.boot.country_codes[country].isd; + this.selected_icon.find('use').attr('href', '#'+country_code) + this.$icon = this.selected_icon.find('svg'); + if (this.$icon.hasClass('icon-sm')) { + this.$icon.removeClass('icon-sm'); + this.selected_icon.find('svg').addClass('flag-md') + } + if (!this.$isd.length) { + this.selected_icon.append($(` ${country_isd}`)) + } else { + this.$isd.text(country_isd) + } + // this.selected_icon.text('+' + this.get_country(country)) + if(this.$input.val()) { + this.set_formatted_input(this.get_country(country) +'-'+ this.$input.val()) + } + }; + + this.$wrapper.find('.selected-phone').on('click', (e) => { + this.$wrapper.popover('toggle'); + e.stopPropagation(); + + $('body').on('click.phone-popover', (ev) => { + if (!$(ev.target).parents().is('.popover')) { + this.$wrapper.popover('hide'); + } + }); + $(window).on('hashchange.phone-popover', () => { + this.$wrapper.popover('hide'); + }); + }); + } + + make_icon_input() { + let picker_wrapper = $('
'); + this.picker = new Picker({ + parent: picker_wrapper, + countries: frappe.boot.country_codes + }); + + this.$wrapper.popover({ + trigger: 'manual', + offset: `${-this.$wrapper.width() / 4.5}, 5`, + boundary: 'viewport', + placement: 'bottom', + template: ` +
+
+
+
+ `, + content: () => picker_wrapper, + html: true + }).on('show.bs.popover', () => { + setTimeout(() => { + this.picker.refresh(); + }, 10); + }).on('hidden.bs.popover', () => { + $('body').off('click.phone-popover'); + $(window).off('hashchange.phone-popover'); + }); + + // Default icon when nothing is selected. + this.selected_icon = this.$wrapper.find('.selected-phone'); + let input_value = this.get_input_value() + if (!this.selected_icon.length) { + this.selected_icon = $(`
${frappe.utils.icon("down", "sm")}
`); + this.selected_icon.insertAfter(this.$input); + this.selected_icon.append($(``)) + this.$isd = this.selected_icon.find('.country'); + if(input_value && input_value.split("-").length == 2) { + this.$isd.text(this.value.split("-")[0]) + } + } + } + + refresh() { + super.refresh(); + + // Previously opened doc values get fetched. + if(!this.value && this.frm.is_new()) { + this.$input.val(""); + this.$wrapper.find('.country').text("") + this.selected_icon.find('use').attr('href', '#icon-down') + this.flag = this.selected_icon.find('svg'); + let has_flag = this.flag.hasClass('flag-md'); + if (has_flag) { + this.flag.toggleClass('flag-md'); + this.flag.toggleClass('icon-sm'); + } + } + + if(this.value && this.value.split("-").length == 2) { + let isd = this.value.split("-")[0]; + let country_data = frappe.boot.country_codes; + + for (const country in country_data) { + if (Object.values(country_data[country]).includes(isd)) { + let code = country_data[country].code; + this.change_flag(code); + } + } + this.picker.set_country(isd); + this.picker.refresh(); + if (this.picker.country && this.picker.country !== this.$isd.text()) { + this.$isd.length && this.$isd.text(isd) + } + } + } + + + set_formatted_input(value) { + if(value && value.includes('-')) { + this.set_model_value(value) + } else if(this.$isd.text().trim() && this.value) { + let code_number = this.$isd.text() + '-' + value; + this.set_model_value(code_number) + } + this.$input && value && this.$input.val(value.split("-").pop()) + } + + reset_icon() { + + } + + change_flag(country_code) { + this.selected_icon.find('use').attr('href', '#'+country_code) + this.$icon = this.selected_icon.find('svg'); + if (this.$icon.hasClass('icon-sm')) { + this.$icon.removeClass('icon-sm'); + this.selected_icon.find('svg').addClass('flag-md') + } + } + + get_country(country=null) { + const country_codes = frappe.boot.country_codes; + return country_codes[country].isd; + } + get_country_flag(country) { + const country_codes = frappe.boot.country_codes; + let code = country_codes[country].code; + return frappe.utils.flag(code, "md") + } +}; diff --git a/frappe/public/js/frappe/phone_picker/phone_picker.js b/frappe/public/js/frappe/phone_picker/phone_picker.js new file mode 100644 index 0000000000..12285cca7e --- /dev/null +++ b/frappe/public/js/frappe/phone_picker/phone_picker.js @@ -0,0 +1,92 @@ +class Picker { + constructor(opts) { + this.parent = opts.parent; + this.width = opts.width; + this.height = opts.height; + this.country = opts.country; + opts.country && this.set_country(opts.country); + this.countries = opts.countries; + this.setup_picker(); + } + + refresh() { + this.update_icon_selected(true); + } + + setup_picker() { + this.icon_picker_wrapper = $(` +
+
+ + ${frappe.utils.icon('search', "sm")} +
+
+
+
+
+ `); + this.parent.append(this.icon_picker_wrapper); + this.icon_wrapper = this.icon_picker_wrapper.find('.phones'); + this.search_input = this.icon_picker_wrapper.find('.search-phones > input'); + this.refresh(); + this.setup_icons(); + } + + setup_icons() { + + Object.entries(this.countries).forEach(([country, info]) => { + let $country = $(`
${frappe.utils.flag(info.code, "md")}${country}
`); + this.icon_wrapper.append($country); + const set_values = () => { + this.set_country(country); + this.update_icon_selected(); + }; + $country.on('click', () => { + set_values(); + }); + $country.hover(() => { + $country.toggleClass("bg-gray-100"); + }); + this.search_input.keydown((e) => { + const key_code = e.keyCode; + if ([13, 32].includes(key_code)) { + e.preventDefault(); + set_values(); + } + }); + this.search_input.keyup((e) => { + e.preventDefault(); + this.filter_icons(); + }); + + this.search_input.on('search', () => { + this.filter_icons(); + }); + }); + } + + filter_icons() { + let value = this.search_input.val(); + if (!value) { + this.icon_wrapper.find(".phone-wrapper").removeClass('hidden'); + } else { + this.icon_wrapper.find(".phone-wrapper").addClass('hidden'); + this.icon_wrapper.find(`.phone-wrapper[id*='${value}']`).removeClass('hidden'); + } + } + + update_icon_selected(silent) { + !silent && this.on_change && this.on_change(this.get_country()); + } + + set_country(country) { + this.country = country || ''; + } + + get_country() { + if (!this.country) return frappe.utils.icon("down", "sm") + return this.country; + } +} + +export default Picker; diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index 2baff996c6..8b3dc80ce6 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -1156,6 +1156,19 @@ Object.assign(frappe.utils, { `; }, + flag(icon_name, size="sm", icon_class="", icon_style="", svg_class="") { + let size_class = ""; + + if (typeof size == "object") { + icon_style += ` width: ${size.width}; height: ${size.height}`; + } else { + size_class = `flag-${size}`; + } + return ` + + `; + }, + make_chart(wrapper, custom_options={}) { let chart_args = { type: 'bar', diff --git a/frappe/public/scss/common/controls.scss b/frappe/public/scss/common/controls.scss index 954916c911..15fd493096 100644 --- a/frappe/public/scss/common/controls.scss +++ b/frappe/public/scss/common/controls.scss @@ -2,6 +2,7 @@ @import "color_picker"; @import "icon_picker"; @import "datepicker"; +@import "phone_picker"; // password .form-control[data-fieldtype="Password"] { diff --git a/frappe/public/scss/common/phone_picker.scss b/frappe/public/scss/common/phone_picker.scss new file mode 100644 index 0000000000..74a61cbbe8 --- /dev/null +++ b/frappe/public/scss/common/phone_picker.scss @@ -0,0 +1,119 @@ +.phone-picker { + font-size: var(--text-xs); + color: var(--text-muted); + --phone-picker-width: 210px; + width: var(--phone-picker-width); + .phones { + margin-top: 10px; + display: flex; + flex-wrap: wrap; + overflow-y: scroll; + max-height: 210px; + cursor: pointer; + + /* Hide scrollbar for IE, Edge and Firefox */ + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ + + /* Hide scrollbar for Chrome, Safari and Opera */ + &::-webkit-scrollbar { + display: none; + } + + .phone-wrapper { + display: flex; + width: 210px; + height: 30px; + text-align: center; + align-items: center; + border-radius: 0.375rem; + padding: 0.5rem; + + .country { + display: flex; + margin-left: 0.6rem; + flex-grow: 1; + } + } + } + + .search-phones { + position: relative; + + input[type='search'] { + height: inherit; + padding-left: 30px; + } + + .search-phone { + position: absolute; + top: 7px; + left: 7px; + } + } +} +.phone-picker-popover { + left: -20px !important; + .picker-arrow { + left: 15px !important; + } +} +.frappe-control[data-fieldtype='Phone'] + { + input { + padding-left: 70px; + } + .selected-phone { + display: flex; + cursor: pointer; + width: 52px; + height: 18px; + border-radius: 5px; + position: absolute; + top: calc(50% + 2.6px); + left: 8px; + content: ' '; + + .country { + display: flex; + margin-left: 0.6rem; + flex-grow: 1; + } + + } + .like-disabled-input { + .phone-value { + padding-left: 25px; + } + .selected-phone { + top: 20%; + cursor: default; + } + } +} + +.data-row.row { + .selected-phone { + top: calc(50% - 11px); + z-index: 2; + } +} + +.bg-gray-100 { + --tw-bg-opacity: 1; + background-color: rgba(244,245,246,var(--tw-bg-opacity)); +} + +.dt-cell__content { + .selected-phone { + display: contents; + } +} + +.dt-cell__edit, .filter-field { + .selected-phone { + top: 5px !important; + } +} + + From 5cc1da476dcac0952c24aeafbc7d68e57d768ebc Mon Sep 17 00:00:00 2001 From: Noah Jacob Date: Thu, 30 Dec 2021 14:41:54 +0530 Subject: [PATCH 0005/1251] chore: added svg file for country flags --- frappe/public/icons/timeless/flags.svg | 18341 +++++++++++++++++++++++ frappe/www/app.html | 1 + 2 files changed, 18342 insertions(+) create mode 100644 frappe/public/icons/timeless/flags.svg diff --git a/frappe/public/icons/timeless/flags.svg b/frappe/public/icons/timeless/flags.svg new file mode 100644 index 0000000000..d57fda3d0e --- /dev/null +++ b/frappe/public/icons/timeless/flags.svg @@ -0,0 +1,18341 @@ + + diff --git a/frappe/www/app.html b/frappe/www/app.html index 68a6dc8e86..8fcaf581e2 100644 --- a/frappe/www/app.html +++ b/frappe/www/app.html @@ -26,6 +26,7 @@ {% include "public/icons/timeless/symbol-defs.svg" %} + {% include "public/icons/timeless/flags.svg" %}
From aa84930dac68776f013a2c442f80c242d72a880d Mon Sep 17 00:00:00 2001 From: Noah Jacob Date: Thu, 30 Dec 2021 15:12:54 +0530 Subject: [PATCH 0006/1251] fix: made the search for country case insensitive --- frappe/public/js/frappe/phone_picker/phone_picker.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/phone_picker/phone_picker.js b/frappe/public/js/frappe/phone_picker/phone_picker.js index 12285cca7e..0d9910e9a2 100644 --- a/frappe/public/js/frappe/phone_picker/phone_picker.js +++ b/frappe/public/js/frappe/phone_picker/phone_picker.js @@ -35,7 +35,7 @@ class Picker { setup_icons() { Object.entries(this.countries).forEach(([country, info]) => { - let $country = $(`
${frappe.utils.flag(info.code, "md")}${country}
`); + let $country = $(`
${frappe.utils.flag(info.code, "md")}${country}
`); this.icon_wrapper.append($country); const set_values = () => { this.set_country(country); @@ -49,7 +49,7 @@ class Picker { }); this.search_input.keydown((e) => { const key_code = e.keyCode; - if ([13, 32].includes(key_code)) { + if ([13].includes(key_code)) { e.preventDefault(); set_values(); } @@ -71,7 +71,7 @@ class Picker { this.icon_wrapper.find(".phone-wrapper").removeClass('hidden'); } else { this.icon_wrapper.find(".phone-wrapper").addClass('hidden'); - this.icon_wrapper.find(`.phone-wrapper[id*='${value}']`).removeClass('hidden'); + this.icon_wrapper.find(`.phone-wrapper[id*='${value.toLowerCase()}']`).removeClass('hidden'); } } From 3521cc97f137a981df07c3ac3683a2fcd83c04fd Mon Sep 17 00:00:00 2001 From: Noah Jacob Date: Mon, 3 Jan 2022 10:09:28 +0530 Subject: [PATCH 0007/1251] fix: exclude flags in icon picker --- frappe/public/js/frappe/form/controls/icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/controls/icon.js b/frappe/public/js/frappe/form/controls/icon.js index 7ab2e11f24..000731fa52 100644 --- a/frappe/public/js/frappe/form/controls/icon.js +++ b/frappe/public/js/frappe/form/controls/icon.js @@ -11,7 +11,7 @@ frappe.ui.form.ControlIcon = class ControlIcon extends frappe.ui.form.ControlDat get_all_icons() { frappe.symbols = []; $("#frappe-symbols > symbol[id]").each(function() { - frappe.symbols.push(this.id.replace('icon-', '')); + this.id.includes('icon-') && frappe.symbols.push(this.id.replace('icon-', '')); }); } From 6f8a53cdfdedddf7d31298c559458396bd8e9d43 Mon Sep 17 00:00:00 2001 From: Noah Jacob Date: Mon, 3 Jan 2022 10:11:44 +0530 Subject: [PATCH 0008/1251] fix(ui): added isd code in the picker --- .../js/frappe/phone_picker/phone_picker.js | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/frappe/public/js/frappe/phone_picker/phone_picker.js b/frappe/public/js/frappe/phone_picker/phone_picker.js index 0d9910e9a2..9e60acc257 100644 --- a/frappe/public/js/frappe/phone_picker/phone_picker.js +++ b/frappe/public/js/frappe/phone_picker/phone_picker.js @@ -14,7 +14,7 @@ class Picker { } setup_picker() { - this.icon_picker_wrapper = $(` + this.phone_picker_wrapper = $(`
@@ -25,18 +25,19 @@ class Picker {
`); - this.parent.append(this.icon_picker_wrapper); - this.icon_wrapper = this.icon_picker_wrapper.find('.phones'); - this.search_input = this.icon_picker_wrapper.find('.search-phones > input'); + this.parent.append(this.phone_picker_wrapper); + this.phone_wrapper = this.phone_picker_wrapper.find('.phones'); + this.search_input = this.phone_picker_wrapper.find('.search-phones > input'); this.refresh(); - this.setup_icons(); + this.setup_countries(); } - setup_icons() { + setup_countries() { Object.entries(this.countries).forEach(([country, info]) => { - let $country = $(`
${frappe.utils.flag(info.code, "md")}${country}
`); - this.icon_wrapper.append($country); + let $country = $(`
${frappe.utils.flag(info.code, "md")} + ${country} (${info.isd})
`); + this.phone_wrapper.append($country); const set_values = () => { this.set_country(country); this.update_icon_selected(); @@ -68,10 +69,10 @@ class Picker { filter_icons() { let value = this.search_input.val(); if (!value) { - this.icon_wrapper.find(".phone-wrapper").removeClass('hidden'); + this.phone_wrapper.find(".phone-wrapper").removeClass('hidden'); } else { - this.icon_wrapper.find(".phone-wrapper").addClass('hidden'); - this.icon_wrapper.find(`.phone-wrapper[id*='${value.toLowerCase()}']`).removeClass('hidden'); + this.phone_wrapper.find(".phone-wrapper").addClass('hidden'); + this.phone_wrapper.find(`.phone-wrapper[id*='${value.toLowerCase()}']`).removeClass('hidden'); } } From eb314f2e959baf5f0fee3eafba8063c17eda6bf2 Mon Sep 17 00:00:00 2001 From: Noah Jacob Date: Mon, 3 Jan 2022 13:18:09 +0530 Subject: [PATCH 0009/1251] chore: updated country_info.json with iso codes --- frappe/boot.py | 5 +- frappe/geo/country_info.json | 738 +++++++++++++++++++++++------------ 2 files changed, 493 insertions(+), 250 deletions(-) diff --git a/frappe/boot.py b/frappe/boot.py index 026c0d6f16..4b764dabfc 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -17,6 +17,7 @@ from frappe.social.doctype.energy_point_log.energy_point_log import get_energy_p from frappe.model.base_document import get_controller from frappe.social.doctype.post.post import frequently_visited_links from frappe.core.doctype.navbar_settings.navbar_settings import get_navbar_settings, get_app_logo +from frappe.geo.country_info import get_all def get_bootinfo(): """build and return boot info""" @@ -327,7 +328,5 @@ def get_notification_settings(): return frappe.get_cached_doc('Notification Settings', frappe.session.user) def get_country_codes(bootinfo): - country_codes = { - "United States": {"isd":"+1","code":"us" }, - "India": {"isd":"+91","code":"in" }} + country_codes = get_all() bootinfo.country_codes = frappe._dict(country_codes) diff --git a/frappe/geo/country_info.json b/frappe/geo/country_info.json index 7ffdf0a8bf..72e3e0ba24 100644 --- a/frappe/geo/country_info.json +++ b/frappe/geo/country_info.json @@ -8,7 +8,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Kabul" - ] + ], + "iso": "+93" }, "Albania": { "code": "al", @@ -20,7 +21,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Tirane" - ] + ], + "iso": "+355" }, "Algeria": { "code": "dz", @@ -32,11 +34,13 @@ "number_format": "#,###.##", "timezones": [ "Africa/Algiers" - ] + ], + "iso": "+213" }, "American Samoa": { "code": "as", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+1684" }, "Andorra": { "code": "ad", @@ -48,7 +52,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Andorra" - ] + ], + "iso": "+376" }, "Angola": { "code": "ao", @@ -60,7 +65,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Luanda" - ] + ], + "iso": "+244" }, "Anguilla": { "code": "ai", @@ -72,7 +78,8 @@ "number_format": "#,###.##", "timezones": [ "America/Anguilla" - ] + ], + "iso": "+1264" }, "Antarctica": { "code": "aq", @@ -88,7 +95,8 @@ "Antarctica/Rothera", "Antarctica/Syowa", "Antarctica/Vostok" - ] + ], + "iso": "+672" }, "Antigua and Barbuda": { "code": "ag", @@ -100,7 +108,8 @@ "number_format": "#,###.##", "timezones": [ "America/Antigua" - ] + ], + "iso": "+1268" }, "Argentina": { "code": "ar", @@ -123,7 +132,8 @@ "America/Argentina/San_Luis", "America/Argentina/Tucuman", "America/Argentina/Ushuaia" - ] + ], + "iso": "+54" }, "Armenia": { "code": "am", @@ -135,7 +145,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Yerevan" - ] + ], + "iso": "+374" }, "Aruba": { "code": "aw", @@ -147,7 +158,8 @@ "number_format": "#,###.##", "timezones": [ "America/Aruba" - ] + ], + "iso": "+297" }, "Australia": { "code": "au", @@ -170,7 +182,8 @@ "Australia/Melbourne", "Australia/Perth", "Australia/Sydney" - ] + ], + "iso": "+61" }, "Austria": { "code": "at", @@ -182,7 +195,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Vienna" - ] + ], + "iso": "+43" }, "Azerbaijan": { "code": "az", @@ -192,7 +206,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Baku" - ] + ], + "iso": "+994" }, "Bahamas": { "code": "bs", @@ -201,7 +216,8 @@ "number_format": "#,###.##", "timezones": [ "America/Nassau" - ] + ], + "iso": "+1242" }, "Bahrain": { "code": "bh", @@ -213,7 +229,8 @@ "number_format": "#,###.###", "timezones": [ "Asia/Bahrain" - ] + ], + "iso": "+973" }, "Bangladesh": { "code": "bd", @@ -225,7 +242,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Dhaka" - ] + ], + "iso": "+880" }, "Barbados": { "code": "bb", @@ -237,7 +255,8 @@ "number_format": "#,###.##", "timezones": [ "America/Barbados" - ] + ], + "iso": "+1246" }, "Belarus": { "code": "by", @@ -247,7 +266,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Minsk" - ] + ], + "iso": "+375" }, "Belgium": { "code": "be", @@ -259,7 +279,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Brussels" - ] + ], + "iso": "+32" }, "Belize": { "code": "bz", @@ -272,7 +293,8 @@ "number_format": "#,###.##", "timezones": [ "America/Belize" - ] + ], + "iso": "+501" }, "Benin": { "code": "bj", @@ -284,7 +306,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Porto-Novo" - ] + ], + "iso": "+229" }, "Bermuda": { "code": "bm", @@ -296,7 +319,8 @@ "number_format": "#,###.##", "timezones": [ "Atlantic/Bermuda" - ] + ], + "iso": "+1441" }, "Bhutan": { "code": "bt", @@ -308,13 +332,15 @@ "number_format": "#,###.##", "timezones": [ "Asia/Thimphu" - ] + ], + "iso": "+975" }, "Bolivia, Plurinational State of": { "code": "bo", "currency": "BOB", "currency_name": "Boliviano", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+591" }, "Bonaire, Sint Eustatius and Saba": { "code": "bq", @@ -329,7 +355,8 @@ "number_format": "#.###,##", "timezones": [ "Europe/Sarajevo" - ] + ], + "iso": "+387" }, "Botswana": { "code": "bw", @@ -341,11 +368,13 @@ "number_format": "#,###.##", "timezones": [ "Africa/Gaborone" - ] + ], + "iso": "+267" }, "Bouvet Island": { "code": "bv", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+47" }, "Brazil": { "code": "br", @@ -372,7 +401,8 @@ "America/Rio_Branco", "America/Santarem", "America/Sao_Paulo" - ] + ], + "iso": "+55" }, "British Indian Ocean Territory": { "code": "io", @@ -382,7 +412,8 @@ "number_format": "#,###.##", "timezones": [ "Indian/Chagos" - ] + ], + "iso": "+246" }, "Brunei Darussalam": { "code": "bn", @@ -391,7 +422,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Brunei" - ] + ], + "iso": "+673" }, "Bulgaria": { "code": "bg", @@ -403,7 +435,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Sofia" - ] + ], + "iso": "+359" }, "Burkina Faso": { "code": "bf", @@ -415,7 +448,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Ouagadougou" - ] + ], + "iso": "+226" }, "Burundi": { "code": "bi", @@ -427,7 +461,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Bujumbura" - ] + ], + "iso": "+257" }, "Cambodia": { "code": "kh", @@ -439,7 +474,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Phnom_Penh" - ] + ], + "iso": "+855" }, "Cameroon": { "code": "cm", @@ -451,7 +487,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Douala" - ] + ], + "iso": "+237" }, "Canada": { "code": "ca", @@ -491,7 +528,8 @@ "America/Whitehorse", "America/Winnipeg", "America/Yellowknife" - ] + ], + "iso": "+1" }, "Cape Verde": { "code": "cv", @@ -503,7 +541,8 @@ "number_format": "#,###.##", "timezones": [ "Atlantic/Cape_Verde" - ] + ], + "iso": "+238" }, "Cayman Islands": { "code": "ky", @@ -515,7 +554,8 @@ "number_format": "#,###.##", "timezones": [ "America/Cayman" - ] + ], + "iso": "+ 345" }, "Central African Republic": { "code": "cf", @@ -527,7 +567,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Bangui" - ] + ], + "iso": "+236" }, "Chad": { "code": "td", @@ -539,7 +580,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Ndjamena" - ] + ], + "iso": "+235" }, "Chile": { "code": "cl", @@ -552,7 +594,8 @@ "timezones": [ "America/Santiago", "Pacific/Easter" - ] + ], + "iso": "+56" }, "China": { "code": "cn", @@ -568,14 +611,16 @@ "Asia/Kashgar", "Asia/Shanghai", "Asia/Urumqi" - ] + ], + "iso": "+86" }, "Christmas Island": { "code": "cx", "number_format": "#,###.##", "timezones": [ "Indian/Christmas" - ] + ], + "iso": "+61" }, "Cocos (Keeling) Islands": { "code": "cc", @@ -585,7 +630,8 @@ "number_format": "#,###.##", "timezones": [ "Indian/Cocos" - ] + ], + "iso": "+61" }, "Colombia": { "code": "co", @@ -597,7 +643,8 @@ "number_format": "#.###,##", "timezones": [ "America/Bogota" - ] + ], + "iso": "+57" }, "Comoros": { "code": "km", @@ -609,7 +656,8 @@ "number_format": "#,###.##", "timezones": [ "Indian/Comoro" - ] + ], + "iso": "+269" }, "Congo": { "code": "cg", @@ -618,7 +666,8 @@ "currency_name": "Central African CFA Franc", "currency_symbol": "FCFA", "currency_fraction": "Centime", - "currency_fraction_units": 100 + "currency_fraction_units": 100, + "iso": "+242" }, "Congo, The Democratic Republic of the": { "code": "cd", @@ -627,7 +676,8 @@ "currency_name": "Congolese franc", "currency_symbol": "FC", "currency_fraction": "Centime", - "currency_fraction_units": 100 + "currency_fraction_units": 100, + "iso": "+243" }, "Cook Islands": { "code": "ck", @@ -637,7 +687,8 @@ "number_format": "#,###.##", "timezones": [ "Pacific/Rarotonga" - ] + ], + "iso": "+682" }, "Costa Rica": { "code": "cr", @@ -649,7 +700,8 @@ "number_format": "#.###,##", "timezones": [ "America/Costa_Rica" - ] + ], + "iso": "+506" }, "Croatia": { "code": "hr", @@ -661,7 +713,8 @@ "number_format": "#.###,##", "timezones": [ "Europe/Zagreb" - ] + ], + "iso": "+385" }, "Cuba": { "code": "cu", @@ -673,7 +726,8 @@ "number_format": "#,###.##", "timezones": [ "America/Havana" - ] + ], + "iso": "+53" }, "Cura\u00e7ao": { "code": "cw", @@ -692,7 +746,8 @@ "number_format": "#.###,##", "timezones": [ "Asia/Nicosia" - ] + ], + "iso": "+357" }, "Czech Republic": { "code": "cz", @@ -704,7 +759,8 @@ "number_format": "#.###,##", "timezones": [ "Europe/Prague" - ] + ], + "iso": "+420" }, "Denmark": { "code": "dk", @@ -716,7 +772,8 @@ "number_format": "#.###,##", "timezones": [ "Europe/Copenhagen" - ] + ], + "iso": "+45" }, "Djibouti": { "code": "dj", @@ -728,7 +785,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Djibouti" - ] + ], + "iso": "+253" }, "Dominica": { "code": "dm", @@ -740,7 +798,8 @@ "number_format": "#,###.##", "timezones": [ "America/Dominica" - ] + ], + "iso": "+1767" }, "Dominican Republic": { "code": "do", @@ -752,7 +811,8 @@ "number_format": "#,###.##", "timezones": [ "America/Santo_Domingo" - ] + ], + "iso": "+1849" }, "Ecuador": { "code": "ec", @@ -763,7 +823,8 @@ "timezones": [ "America/Guayaquil", "Pacific/Galapagos" - ] + ], + "iso": "+593" }, "Egypt": { "code": "eg", @@ -775,7 +836,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Cairo" - ] + ], + "iso": "+20" }, "El Salvador": { "code": "sv", @@ -789,7 +851,8 @@ "number_format": "#,###.##", "timezones": [ "America/El_Salvador" - ] + ], + "iso": "+503" }, "Equatorial Guinea": { "code": "gq", @@ -801,7 +864,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Malabo" - ] + ], + "iso": "+240" }, "Eritrea": { "code": "er", @@ -813,7 +877,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Asmara" - ] + ], + "iso": "+291" }, "Estonia": { "code": "ee", @@ -825,7 +890,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Tallinn" - ] + ], + "iso": "+372" }, "Ethiopia": { "code": "et", @@ -837,13 +903,15 @@ "number_format": "#,###.##", "timezones": [ "Africa/Addis_Ababa" - ] + ], + "iso": "+251" }, "Falkland Islands (Malvinas)": { "code": "fk", "currency": "FKP", "currency_name": "Falkland Islands Pound", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+500" }, "Faroe Islands": { "code": "fo", @@ -853,7 +921,8 @@ "number_format": "#,###.##", "timezones": [ "Atlantic/Faroe" - ] + ], + "iso": "+298" }, "Fiji": { "code": "fj", @@ -865,7 +934,8 @@ "number_format": "#,###.##", "timezones": [ "Pacific/Fiji" - ] + ], + "iso": "+679" }, "Finland": { "code": "fi", @@ -877,7 +947,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Helsinki" - ] + ], + "iso": "+358" }, "France": { "code": "fr", @@ -890,14 +961,16 @@ "date_format": "dd/mm/yyyy", "timezones": [ "Europe/Paris" - ] + ], + "iso": "+33" }, "French Guiana": { "code": "gf", "number_format": "#,###.##", "timezones": [ "America/Cayenne" - ] + ], + "iso": "+594" }, "French Polynesia": { "code": "pf", @@ -909,11 +982,13 @@ "Pacific/Gambier", "Pacific/Marquesas", "Pacific/Tahiti" - ] + ], + "iso": "+689" }, "French Southern Territories": { "code": "tf", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+262" }, "Gabon": { "code": "ga", @@ -925,7 +1000,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Libreville" - ] + ], + "iso": "+241" }, "Gambia": { "code": "gm", @@ -934,7 +1010,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Banjul" - ] + ], + "iso": "+220" }, "Georgia": { "code": "ge", @@ -944,7 +1021,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Tbilisi" - ] + ], + "iso": "+995" }, "Germany": { "code": "de", @@ -956,7 +1034,8 @@ "number_format": "#.###,##", "timezones": [ "Europe/Berlin" - ] + ], + "iso": "+49" }, "Ghana": { "code": "gh", @@ -967,7 +1046,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Accra" - ] + ], + "iso": "+233" }, "Gibraltar": { "code": "gi", @@ -979,7 +1059,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Gibraltar" - ] + ], + "iso": "+350" }, "Greece": { "code": "gr", @@ -991,7 +1072,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Athens" - ] + ], + "iso": "+30" }, "Greenland": { "code": "gl", @@ -1001,7 +1083,8 @@ "America/Godthab", "America/Scoresbysund", "America/Thule" - ] + ], + "iso": "+299" }, "Grenada": { "code": "gd", @@ -1013,21 +1096,24 @@ "number_format": "#,###.##", "timezones": [ "America/Grenada" - ] + ], + "iso": "+1473" }, "Guadeloupe": { "code": "gp", "number_format": "#,###.##", "timezones": [ "America/Guadeloupe" - ] + ], + "iso": "+590" }, "Guam": { "code": "gu", "number_format": "#,###.##", "timezones": [ "Pacific/Guam" - ] + ], + "iso": "+1671" }, "Guatemala": { "code": "gt", @@ -1039,7 +1125,8 @@ "number_format": "#,###.##", "timezones": [ "America/Guatemala" - ] + ], + "iso": "+502" }, "Guernsey": { "code": "gg", @@ -1049,7 +1136,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/London" - ] + ], + "iso": "+44" }, "Guinea": { "code": "gn", @@ -1061,7 +1149,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Conakry" - ] + ], + "iso": "+224" }, "Guinea-Bissau": { "code": "gw", @@ -1073,7 +1162,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Bissau" - ] + ], + "iso": "+245" }, "Guyana": { "code": "gy", @@ -1085,7 +1175,8 @@ "number_format": "#,###.##", "timezones": [ "America/Guyana" - ] + ], + "iso": "+592" }, "Haiti": { "code": "ht", @@ -1098,15 +1189,18 @@ "timezones": [ "America/Guatemala", "America/Port-au-Prince" - ] + ], + "iso": "+509" }, "Heard Island and McDonald Islands": { "code": "hm", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+0" }, "Holy See (Vatican City State)": { "code": "va", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+379" }, "Honduras": { "code": "hn", @@ -1118,7 +1212,8 @@ "number_format": "#,###.##", "timezones": [ "America/Tegucigalpa" - ] + ], + "iso": "+504" }, "Hong Kong": { "code": "hk", @@ -1130,7 +1225,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Hong_Kong" - ] + ], + "iso": "+852" }, "Hungary": { "code": "hu", @@ -1143,7 +1239,8 @@ "number_format": "#.###", "timezones": [ "Europe/Budapest" - ] + ], + "iso": "+36" }, "Iceland": { "code": "is", @@ -1155,7 +1252,8 @@ "number_format": "#.###", "timezones": [ "Atlantic/Reykjavik" - ] + ], + "iso": "+354" }, "India": { "code": "in", @@ -1167,7 +1265,8 @@ "number_format": "#,##,###.##", "timezones": [ "Asia/Kolkata" - ] + ], + "iso": "+91" }, "Indonesia": { "code": "id", @@ -1182,7 +1281,8 @@ "Asia/Jayapura", "Asia/Makassar", "Asia/Pontianak" - ] + ], + "iso": "+62" }, "Iran": { "code": "ir", @@ -1192,7 +1292,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Tehran" - ] + ], + "iso": "+98" }, "Iraq": { "code": "iq", @@ -1204,7 +1305,8 @@ "number_format": "#,###.###", "timezones": [ "Asia/Baghdad" - ] + ], + "iso": "+964" }, "Ireland": { "code": "ie", @@ -1216,7 +1318,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Dublin" - ] + ], + "iso": "+353" }, "Isle of Man": { "code": "im", @@ -1226,7 +1329,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/London" - ] + ], + "iso": "+44" }, "Israel": { "code": "il", @@ -1238,7 +1342,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Jerusalem" - ] + ], + "iso": "+972" }, "Italy": { "code": "it", @@ -1251,7 +1356,8 @@ "date_format": "dd/mm/yyyy", "timezones": [ "Europe/Rome" - ] + ], + "iso": "+39" }, "Ivory Coast": { "code": "ci", @@ -1263,7 +1369,8 @@ "number_format": "#,###.##", "timeszones": [ "Africa/Abidjan" - ] + ], + "iso": "+225" }, "Jamaica": { "code": "jm", @@ -1275,7 +1382,8 @@ "number_format": "#,###.##", "timezones": [ "America/Jamaica" - ] + ], + "iso": "+1876" }, "Japan": { "code": "jp", @@ -1287,7 +1395,8 @@ "number_format": "#,###", "timezones": [ "Asia/Tokyo" - ] + ], + "iso": "+81" }, "Jersey": { "code": "je", @@ -1297,7 +1406,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/London" - ] + ], + "iso": "+44" }, "Jordan": { "code": "jo", @@ -1309,7 +1419,8 @@ "number_format": "#,###.###", "timezones": [ "Asia/Amman" - ] + ], + "iso": "+962" }, "Kazakhstan": { "code": "kz", @@ -1325,7 +1436,8 @@ "Asia/Aqtobe", "Asia/Oral", "Asia/Qyzylorda" - ] + ], + "iso": "+7" }, "Kenya": { "code": "ke", @@ -1337,7 +1449,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Nairobi" - ] + ], + "iso": "+254" }, "Kiribati": { "code": "ki", @@ -1349,19 +1462,22 @@ "Pacific/Enderbury", "Pacific/Kiritimati", "Pacific/Tarawa" - ] + ], + "iso": "+686" }, "Korea, Democratic Peoples Republic of": { "code": "kp", "currency": "KPW", "currency_name": "North Korean Won", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+850" }, "Korea, Republic of": { "code": "kr", "currency": "KRW", "currency_name": "Won", - "number_format": "#,###" + "number_format": "#,###", + "iso": "+82" }, "Kuwait": { "code": "kw", @@ -1373,7 +1489,8 @@ "number_format": "#,###.###", "timezones": [ "Asia/Kuwait" - ] + ], + "iso": "+965" }, "Kyrgyzstan": { "code": "kg", @@ -1385,16 +1502,18 @@ "number_format": "#,###.##", "timezones": [ "Asia/Bishkek" - ] + ], + "iso": "+996" }, "Lao Peoples Democratic Republic": { "code": "la", "currency": "LAK", "currency_name": "Kip", "number_format": "#,###.##", - "timezones":[ - "Asia/Vientiane" - ] + "timezones": [ + "Asia/Vientiane" + ], + "iso": "+856" }, "Latvia": { "code": "lv", @@ -1406,7 +1525,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Riga" - ] + ], + "iso": "+371" }, "Lebanon": { "code": "lb", @@ -1418,7 +1538,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Beirut" - ] + ], + "iso": "+961" }, "Lesotho": { "code": "ls", @@ -1430,7 +1551,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Maseru" - ] + ], + "iso": "+266" }, "Liberia": { "code": "lr", @@ -1442,7 +1564,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Monrovia" - ] + ], + "iso": "+231" }, "Libya": { "code": "ly", @@ -1454,7 +1577,8 @@ "number_format": "#,###.###", "timezones": [ "Africa/Tripoli" - ] + ], + "iso": "+218" }, "Liechtenstein": { "code": "li", @@ -1464,7 +1588,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Vaduz" - ] + ], + "iso": "+423" }, "Lithuania": { "code": "lt", @@ -1477,7 +1602,8 @@ "number_format": "# ###,##", "timezones": [ "Europe/Vilnius" - ] + ], + "iso": "+370" }, "Luxembourg": { "code": "lu", @@ -1489,13 +1615,15 @@ "number_format": "#,###.##", "timezones": [ "Europe/Luxembourg" - ] + ], + "iso": "+352" }, "Macao": { "code": "mo", "currency": "MOP", "currency_name": "Pataca", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+853" }, "Macedonia": { "code": "mk", @@ -1504,7 +1632,8 @@ "currency_fraction_units": 100, "currency_name": "Denar", "currency_symbol": "\u0434\u0435\u043d", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+389" }, "Madagascar": { "code": "mg", @@ -1514,7 +1643,8 @@ "number_format": "#,###.##", "timezones": [ "Indian/Antananarivo" - ] + ], + "iso": "+261" }, "Malawi": { "code": "mw", @@ -1526,7 +1656,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Blantyre" - ] + ], + "iso": "+265" }, "Malaysia": { "code": "my", @@ -1539,7 +1670,8 @@ "timezones": [ "Asia/Kuala_Lumpur", "Asia/Kuching" - ] + ], + "iso": "+60" }, "Maldives": { "code": "mv", @@ -1551,7 +1683,8 @@ "number_format": "#,###.##", "timezones": [ "Indian/Maldives" - ] + ], + "iso": "+960" }, "Mali": { "code": "ml", @@ -1563,7 +1696,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Bamako" - ] + ], + "iso": "+223" }, "Malta": { "code": "mt", @@ -1575,7 +1709,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Malta" - ] + ], + "iso": "+356" }, "Marshall Islands": { "code": "mh", @@ -1586,14 +1721,16 @@ "timezones": [ "Pacific/Kwajalein", "Pacific/Majuro" - ] + ], + "iso": "+692" }, "Martinique": { "code": "mq", "number_format": "#,###.##", "timezones": [ "America/Martinique" - ] + ], + "iso": "+596" }, "Mauritania": { "code": "mr", @@ -1605,7 +1742,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Nouakchott" - ] + ], + "iso": "+222" }, "Mauritius": { "code": "mu", @@ -1617,14 +1755,16 @@ "number_format": "#,###", "timezones": [ "Indian/Mauritius" - ] + ], + "iso": "+230" }, "Mayotte": { "code": "yt", "number_format": "#,###.##", "timezones": [ "Indian/Mayotte" - ] + ], + "iso": "+262" }, "Mexico": { "code": "mx", @@ -1647,17 +1787,20 @@ "America/Ojinaga", "America/Santa_Isabel", "America/Tijuana" - ] + ], + "iso": "+52" }, "Micronesia, Federated States of": { "code": "fm", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+691" }, "Moldova, Republic of": { "code": "md", "currency": "MDL", "currency_name": "Moldovan Leu", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+373" }, "Monaco": { "code": "mc", @@ -1669,7 +1812,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Monaco" - ] + ], + "iso": "+377" }, "Mongolia": { "code": "mn", @@ -1684,7 +1828,8 @@ "Asia/Choibalsan", "Asia/Hovd", "Asia/Ulaanbaatar" - ] + ], + "iso": "+976" }, "Montenegro": { "code": "me", @@ -1696,7 +1841,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Belgrade" - ] + ], + "iso": "+382" }, "Montserrat": { "code": "ms", @@ -1708,7 +1854,8 @@ "number_format": "#,###.##", "timezones": [ "America/Montserrat" - ] + ], + "iso": "+1664" }, "Morocco": { "code": "ma", @@ -1720,7 +1867,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Casablanca" - ] + ], + "iso": "+212" }, "Mozambique": { "code": "mz", @@ -1731,7 +1879,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Maputo" - ] + ], + "iso": "+258" }, "Myanmar": { "code": "mm", @@ -1740,7 +1889,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Rangoon" - ] + ], + "iso": "+95" }, "Namibia": { "code": "na", @@ -1752,7 +1902,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Windhoek" - ] + ], + "iso": "+264" }, "Nauru": { "code": "nr", @@ -1762,7 +1913,8 @@ "number_format": "#,###.##", "timezones": [ "Pacific/Nauru" - ] + ], + "iso": "+674" }, "Nepal": { "code": "np", @@ -1774,7 +1926,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Kathmandu" - ] + ], + "iso": "+977" }, "Netherlands": { "code": "nl", @@ -1786,7 +1939,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Amsterdam" - ] + ], + "iso": "+31" }, "New Caledonia": { "code": "nc", @@ -1796,7 +1950,8 @@ "number_format": "#,###.##", "timezones": [ "Pacific/Noumea" - ] + ], + "iso": "+687" }, "New Zealand": { "code": "nz", @@ -1809,7 +1964,8 @@ "timezones": [ "Pacific/Auckland", "Pacific/Chatham" - ] + ], + "iso": "+64" }, "Nicaragua": { "code": "ni", @@ -1821,7 +1977,8 @@ "number_format": "#,###.##", "timezones": [ "America/Managua" - ] + ], + "iso": "+505" }, "Niger": { "code": "ne", @@ -1833,7 +1990,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Niamey" - ] + ], + "iso": "+227" }, "Nigeria": { "code": "ng", @@ -1845,7 +2003,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Lagos" - ] + ], + "iso": "+234" }, "Niue": { "code": "nu", @@ -1855,21 +2014,24 @@ "number_format": "#,###.##", "timezones": [ "Pacific/Niue" - ] + ], + "iso": "+683" }, "Norfolk Island": { "code": "nf", "number_format": "#,###.##", "timezones": [ "Pacific/Norfolk" - ] + ], + "iso": "+672" }, "Northern Mariana Islands": { "code": "mp", "number_format": "#,###.##", "timezones": [ "Pacific/Saipan" - ] + ], + "iso": "+1670" }, "Norway": { "code": "no", @@ -1881,7 +2043,8 @@ "number_format": "#.###,##", "timezones": [ "Europe/Oslo" - ] + ], + "iso": "+47" }, "Oman": { "code": "om", @@ -1893,7 +2056,8 @@ "number_format": "#,###.###", "timezones": [ "Asia/Muscat" - ] + ], + "iso": "+968" }, "Pakistan": { "code": "pk", @@ -1905,7 +2069,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Karachi" - ] + ], + "iso": "+92" }, "Palau": { "code": "pw", @@ -1916,11 +2081,13 @@ "number_format": "#,###.##", "timezones": [ "Pacific/Palau" - ] + ], + "iso": "+680" }, "Palestinian Territory, Occupied": { "code": "ps", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+970" }, "Panama": { "code": "pa", @@ -1930,7 +2097,8 @@ "number_format": "#,###.##", "timezones": [ "America/Panama" - ] + ], + "iso": "+507" }, "Papua New Guinea": { "code": "pg", @@ -1942,7 +2110,8 @@ "number_format": "#,###.##", "timezones": [ "Pacific/Port_Moresby" - ] + ], + "iso": "+675" }, "Paraguay": { "code": "py", @@ -1954,7 +2123,8 @@ "number_format": "#,###.##", "timezones": [ "America/Asuncion" - ] + ], + "iso": "+595" }, "Peru": { "code": "pe", @@ -1966,7 +2136,8 @@ "number_format": "#,###.##", "timezones": [ "America/Lima" - ] + ], + "iso": "+51" }, "Philippines": { "code": "ph", @@ -1979,14 +2150,16 @@ "number_format": "#,###.##", "timezones": [ "Asia/Manila" - ] + ], + "iso": "+63" }, "Pitcairn": { "code": "pn", "number_format": "#,###.##", "timezones": [ "Pacific/Pitcairn" - ] + ], + "iso": "+64" }, "Poland": { "code": "pl", @@ -1997,7 +2170,8 @@ "number_format": "#.###,##", "timezones": [ "Europe/Warsaw" - ] + ], + "iso": "+48" }, "Portugal": { "code": "pt", @@ -2011,14 +2185,16 @@ "Atlantic/Azores", "Atlantic/Madeira", "Europe/Lisbon" - ] + ], + "iso": "+351" }, "Puerto Rico": { "code": "pr", "number_format": "#,###.##", "timezones": [ "America/Puerto_Rico" - ] + ], + "iso": "+1939" }, "Qatar": { "code": "qa", @@ -2030,7 +2206,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Qatar" - ] + ], + "iso": "+974" }, "Romania": { "code": "ro", @@ -2042,13 +2219,15 @@ "number_format": "#,###.##", "timezones": [ "Europe/Bucharest" - ] + ], + "iso": "+40" }, "Russian Federation": { "code": "ru", "currency": "RUB", "currency_name": "Russian Ruble", - "number_format": "#.###,##" + "number_format": "#.###,##", + "iso": "+7" }, "Rwanda": { "code": "rw", @@ -2060,21 +2239,25 @@ "number_format": "#,###.##", "timezones": [ "Africa/Kigali" - ] + ], + "iso": "+250" }, "R\u00e9union": { "code": "re", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+262" }, "Saint Barth\u00e9lemy": { "code": "bl", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+590" }, "Saint Helena, Ascension and Tristan da Cunha": { "code": "sh", "currency": "SHP", "currency_name": "Saint Helena Pound", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+290" }, "Saint Kitts and Nevis": { "code": "kn", @@ -2086,7 +2269,8 @@ "number_format": "#,###.##", "timezones": [ "America/St_Kitts" - ] + ], + "iso": "+1869" }, "Saint Lucia": { "code": "lc", @@ -2098,15 +2282,18 @@ "number_format": "#,###.##", "timezones": [ "America/St_Lucia" - ] + ], + "iso": "+1758" }, "Saint Martin (French part)": { "code": "mf", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+590" }, "Saint Pierre and Miquelon": { "code": "pm", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+508" }, "Saint Vincent and the Grenadines": { "code": "vc", @@ -2118,7 +2305,8 @@ "number_format": "#,###.##", "timezones": [ "America/St_Vincent" - ] + ], + "iso": "+1784" }, "Samoa": { "code": "ws", @@ -2130,7 +2318,8 @@ "number_format": "#,###.##", "timezones": [ "Pacific/Apia" - ] + ], + "iso": "+685" }, "San Marino": { "code": "sm", @@ -2142,13 +2331,15 @@ "number_format": "#,###.##", "timezones": [ "Europe/Rome" - ] + ], + "iso": "+378" }, "Sao Tome and Principe": { "code": "st", "currency": "STD", "currency_name": "Dobra", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+239" }, "Saudi Arabia": { "code": "sa", @@ -2160,7 +2351,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Riyadh" - ] + ], + "iso": "+966" }, "Senegal": { "code": "sn", @@ -2172,7 +2364,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Dakar" - ] + ], + "iso": "+221" }, "Serbia": { "code": "rs", @@ -2184,7 +2377,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Belgrade" - ] + ], + "iso": "+381" }, "Seychelles": { "code": "sc", @@ -2196,7 +2390,8 @@ "number_format": "#,###.##", "timezones": [ "Indian/Mahe" - ] + ], + "iso": "+248" }, "Sierra Leone": { "code": "sl", @@ -2208,7 +2403,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Freetown" - ] + ], + "iso": "+232" }, "Singapore": { "code": "sg", @@ -2220,7 +2416,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Singapore" - ] + ], + "iso": "+65" }, "Sint Maarten (Dutch part)": { "code": "sx", @@ -2236,7 +2433,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Bratislava" - ] + ], + "iso": "+421" }, "Slovenia": { "code": "si", @@ -2248,7 +2446,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Belgrade" - ] + ], + "iso": "+386" }, "Solomon Islands": { "code": "sb", @@ -2260,7 +2459,8 @@ "number_format": "#,###.##", "timezones": [ "Pacific/Guadalcanal" - ] + ], + "iso": "+677" }, "Somalia": { "code": "so", @@ -2272,7 +2472,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Mogadishu" - ] + ], + "iso": "+252" }, "South Africa": { "code": "za", @@ -2285,14 +2486,16 @@ "number_format": "# ###.##", "timezones": [ "Africa/Johannesburg" - ] + ], + "iso": "+27" }, "South Georgia and the South Sandwich Islands": { "code": "gs", "currency_fraction": "Penny", "currency_fraction_units": 100, "currency_symbol": "\u00a3", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+500" }, "South Sudan": { "code": "ss", @@ -2302,7 +2505,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Juba" - ] + ], + "iso": "+211" }, "Spain": { "code": "es", @@ -2316,7 +2520,8 @@ "Africa/Ceuta", "Atlantic/Canary", "Europe/Madrid" - ] + ], + "iso": "+34" }, "Sri Lanka": { "code": "lk", @@ -2328,7 +2533,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Colombo" - ] + ], + "iso": "+94" }, "Sudan": { "code": "sd", @@ -2338,7 +2544,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Khartoum" - ] + ], + "iso": "+249" }, "Suriname": { "code": "sr", @@ -2349,11 +2556,13 @@ "number_format": "#,###.##", "timezones": [ "America/Paramaribo" - ] + ], + "iso": "+597" }, "Svalbard and Jan Mayen": { "code": "sj", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+47" }, "Swaziland": { "code": "sz", @@ -2365,7 +2574,8 @@ "number_format": "#, ###.##", "timezones": [ "Africa/Mbabane" - ] + ], + "iso": "+268" }, "Sweden": { "code": "se", @@ -2377,7 +2587,8 @@ "number_format": "#.###,##", "timezones": [ "Europe/Stockholm" - ] + ], + "iso": "+46" }, "Switzerland": { "code": "ch", @@ -2390,19 +2601,22 @@ "number_format": "#'###.##", "timezones": [ "Europe/Zurich" - ] + ], + "iso": "+41" }, "Syria": { "code": "sy", "currency": "SYP", "currency_name": "Syrian Pound", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+963" }, "Taiwan": { "code": "tw", "currency": "TWD", "date_format": "yyyy-mm-dd", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+886" }, "Tajikistan": { "code": "tj", @@ -2412,13 +2626,15 @@ "number_format": "#,###.##", "timezones": [ "Asia/Dushanbe" - ] + ], + "iso": "+992" }, "Tanzania": { "code": "tz", "currency": "TZS", "currency_name": "Tanzanian Shilling", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+255" }, "Thailand": { "code": "th", @@ -2430,11 +2646,13 @@ "number_format": "#,###.##", "timezones": [ "Asia/Bangkok" - ] + ], + "iso": "+66" }, "Timor-Leste": { "code": "tl", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+670" }, "Togo": { "code": "tg", @@ -2446,14 +2664,16 @@ "number_format": "#,###.##", "timezones": [ "Africa/Lome" - ] + ], + "iso": "+228" }, "Tokelau": { "code": "tk", "number_format": "#,###.##", "timezones": [ "Pacific/Fakaofo" - ] + ], + "iso": "+690" }, "Tonga": { "code": "to", @@ -2465,7 +2685,8 @@ "number_format": "#,###.##", "timezones": [ "Pacific/Tongatapu" - ] + ], + "iso": "+676" }, "Trinidad and Tobago": { "code": "tt", @@ -2477,7 +2698,8 @@ "number_format": "#,###.##", "timezones": [ "America/Port_of_Spain" - ] + ], + "iso": "+1868" }, "Tunisia": { "code": "tn", @@ -2489,7 +2711,8 @@ "number_format": "#,###.###", "timezones": [ "Africa/Tunis" - ] + ], + "iso": "+216" }, "Turkey": { "code": "tr", @@ -2500,7 +2723,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/Istanbul" - ] + ], + "iso": "+90" }, "Turkmenistan": { "code": "tm", @@ -2512,14 +2736,16 @@ "number_format": "#,###.##", "timezones": [ "Asia/Ashgabat" - ] + ], + "iso": "+993" }, "Turks and Caicos Islands": { "code": "tc", "currency_fraction": "Cent", "currency_fraction_units": 100, "currency_symbol": "$", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+1649" }, "Tuvalu": { "code": "tv", @@ -2529,7 +2755,8 @@ "number_format": "#,###.##", "timezones": [ "Pacific/Funafuti" - ] + ], + "iso": "+688" }, "Uganda": { "code": "ug", @@ -2541,7 +2768,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Kampala" - ] + ], + "iso": "+256" }, "Ukraine": { "code": "ua", @@ -2556,7 +2784,8 @@ "Europe/Simferopol", "Europe/Uzhgorod", "Europe/Zaporozhye" - ] + ], + "iso": "+380" }, "United Arab Emirates": { "code": "ae", @@ -2568,7 +2797,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Dubai" - ] + ], + "iso": "+971" }, "United Kingdom": { "code": "gb", @@ -2580,7 +2810,8 @@ "number_format": "#,###.##", "timezones": [ "Europe/London" - ] + ], + "iso": "+44" }, "United States": { "code": "us", @@ -2623,7 +2854,8 @@ "America/Sitka", "America/Yakutat", "Pacific/Honolulu" - ] + ], + "iso": "+1" }, "United States Minor Outlying Islands": { "code": "um", @@ -2639,7 +2871,8 @@ "number_format": "#.###,##", "timezones": [ "America/Montevideo" - ] + ], + "iso": "+598" }, "Uzbekistan": { "code": "uz", @@ -2652,7 +2885,8 @@ "timezones": [ "Asia/Samarkand", "Asia/Tashkent" - ] + ], + "iso": "+998" }, "Vanuatu": { "code": "vu", @@ -2664,7 +2898,8 @@ "number_format": "#,###", "timezones": [ "Pacific/Efate" - ] + ], + "iso": "+678" }, "Venezuela, Bolivarian Republic of": { "code": "ve", @@ -2672,28 +2907,33 @@ "currency": "VEF", "currency_symbol": "Bs.", "currency_fraction": "Centimos", - "currency_fraction_units": 100 + "currency_fraction_units": 100, + "iso": "+58" }, "Vietnam": { "code": "vn", "currency": "VND", "currency_name": "Dong", - "number_format": "#.###" + "number_format": "#.###", + "iso": "+84" }, "Virgin Islands, British": { "code": "vg", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+1284" }, "Virgin Islands, U.S.": { "code": "vi", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+1340" }, "Wallis and Futuna": { "code": "wf", "currency_fraction": "Centime", "currency_fraction_units": 100, "currency_symbol": "Fr", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+681" }, "Western Sahara": { "code": "eh", @@ -2713,7 +2953,8 @@ "number_format": "#,###.##", "timezones": [ "Asia/Aden" - ] + ], + "iso": "+967" }, "Zambia": { "code": "zm", @@ -2725,7 +2966,8 @@ "number_format": "#,###.##", "timezones": [ "Africa/Lusaka" - ] + ], + "iso": "+260" }, "Zimbabwe": { "code": "zw", @@ -2737,10 +2979,12 @@ "number_format": "# ###.##", "timezones": [ "Africa/Harare" - ] + ], + "iso": "+263" }, "\u00c5land Islands": { "code": "ax", - "number_format": "#,###.##" + "number_format": "#,###.##", + "iso": "+358" } -} +} \ No newline at end of file From 596a7c28278515ae7263f11b7c5109b84a186025 Mon Sep 17 00:00:00 2001 From: Noah Jacob Date: Mon, 3 Jan 2022 13:19:33 +0530 Subject: [PATCH 0010/1251] fix(ui): inconsistent flag size in the field --- frappe/public/js/frappe/form/controls/phone.js | 9 ++------- frappe/public/js/frappe/phone_picker/phone_picker.js | 6 ++++-- frappe/public/scss/common/phone_picker.scss | 11 ++++++----- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/frappe/public/js/frappe/form/controls/phone.js b/frappe/public/js/frappe/form/controls/phone.js index c00c966539..c5191ee224 100644 --- a/frappe/public/js/frappe/form/controls/phone.js +++ b/frappe/public/js/frappe/form/controls/phone.js @@ -13,7 +13,7 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD // Replaces code when selected and removes previously selected. this.picker.on_change = (country) => { const country_code = frappe.boot.country_codes[country].code; - const country_isd = frappe.boot.country_codes[country].isd; + const country_isd = frappe.boot.country_codes[country].iso; this.selected_icon.find('use').attr('href', '#'+country_code) this.$icon = this.selected_icon.find('svg'); if (this.$icon.hasClass('icon-sm')) { @@ -25,7 +25,6 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD } else { this.$isd.text(country_isd) } - // this.selected_icon.text('+' + this.get_country(country)) if(this.$input.val()) { this.set_formatted_input(this.get_country(country) +'-'+ this.$input.val()) } @@ -134,10 +133,6 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD this.$input && value && this.$input.val(value.split("-").pop()) } - reset_icon() { - - } - change_flag(country_code) { this.selected_icon.find('use').attr('href', '#'+country_code) this.$icon = this.selected_icon.find('svg'); @@ -149,7 +144,7 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD get_country(country=null) { const country_codes = frappe.boot.country_codes; - return country_codes[country].isd; + return country_codes[country].iso; } get_country_flag(country) { const country_codes = frappe.boot.country_codes; diff --git a/frappe/public/js/frappe/phone_picker/phone_picker.js b/frappe/public/js/frappe/phone_picker/phone_picker.js index 9e60acc257..f12ddf46ec 100644 --- a/frappe/public/js/frappe/phone_picker/phone_picker.js +++ b/frappe/public/js/frappe/phone_picker/phone_picker.js @@ -33,10 +33,12 @@ class Picker { } setup_countries() { - Object.entries(this.countries).forEach(([country, info]) => { + if (!info.iso) { + return + } let $country = $(`
${frappe.utils.flag(info.code, "md")} - ${country} (${info.isd})
`); + ${country} (${info.iso})
`); this.phone_wrapper.append($country); const set_values = () => { this.set_country(country); diff --git a/frappe/public/scss/common/phone_picker.scss b/frappe/public/scss/common/phone_picker.scss index 74a61cbbe8..a80d9aa83e 100644 --- a/frappe/public/scss/common/phone_picker.scss +++ b/frappe/public/scss/common/phone_picker.scss @@ -1,7 +1,7 @@ .phone-picker { font-size: var(--text-xs); color: var(--text-muted); - --phone-picker-width: 210px; + --phone-picker-width: 250px; width: var(--phone-picker-width); .phones { margin-top: 10px; @@ -22,7 +22,7 @@ .phone-wrapper { display: flex; - width: 210px; + width: 250px; height: 30px; text-align: center; align-items: center; @@ -61,13 +61,13 @@ .frappe-control[data-fieldtype='Phone'] { input { - padding-left: 70px; + padding-left: 80px; } .selected-phone { display: flex; cursor: pointer; - width: 52px; - height: 18px; + width: 66px; + height: 20px; border-radius: 5px; position: absolute; top: calc(50% + 2.6px); @@ -77,6 +77,7 @@ .country { display: flex; margin-left: 0.6rem; + align-items: flex-end; flex-grow: 1; } From 934d34084ef11bc3737d6ef55c1ab06219c8d529 Mon Sep 17 00:00:00 2001 From: Noah Jacob Date: Mon, 3 Jan 2022 15:07:03 +0530 Subject: [PATCH 0011/1251] fix(ui): increased width of popover --- frappe/public/scss/common/phone_picker.scss | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frappe/public/scss/common/phone_picker.scss b/frappe/public/scss/common/phone_picker.scss index a80d9aa83e..631090f145 100644 --- a/frappe/public/scss/common/phone_picker.scss +++ b/frappe/public/scss/common/phone_picker.scss @@ -1,7 +1,7 @@ .phone-picker { font-size: var(--text-xs); color: var(--text-muted); - --phone-picker-width: 250px; + --phone-picker-width: 290px; width: var(--phone-picker-width); .phones { margin-top: 10px; @@ -22,7 +22,7 @@ .phone-wrapper { display: flex; - width: 250px; + width: 290px; height: 30px; text-align: center; align-items: center; @@ -33,6 +33,7 @@ display: flex; margin-left: 0.6rem; flex-grow: 1; + width: 290px; } } } @@ -53,6 +54,7 @@ } } .phone-picker-popover { + max-width: 325px; left: -20px !important; .picker-arrow { left: 15px !important; From 3010d537bbe0a8c2b41a08581f59867904074511 Mon Sep 17 00:00:00 2001 From: Noah Jacob Date: Mon, 3 Jan 2022 16:19:14 +0530 Subject: [PATCH 0012/1251] test: UI test for Phone Control --- cypress/integration/control_phone.js | 57 +++++++++++++++++++ .../public/js/frappe/form/controls/phone.js | 2 +- 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 cypress/integration/control_phone.js diff --git a/cypress/integration/control_phone.js b/cypress/integration/control_phone.js new file mode 100644 index 0000000000..684e0d7d99 --- /dev/null +++ b/cypress/integration/control_phone.js @@ -0,0 +1,57 @@ +context('Control Phone', () => { + before(() => { + cy.login(); + cy.visit('/app/website'); + }); + + function get_dialog_with_phone(s) { + return cy.dialog({ + title: 'Phone', + fields: [{ + 'fieldname': 'phone', + 'fieldtype': 'Phone', + }] + }); + } + + it('should set flag and data', () => { + get_dialog_with_phone().as('dialog'); + cy.get('.selected-phone').click(); + cy.get('.phone-picker .phone-wrapper[id="afghanistan"]').click(); + cy.get('.phone-picker .phone-wrapper[id="india"]').click(); + cy.get('.selected-phone .country').should('have.text', '+91') + cy.get('.selected-phone > .icon > use').should('have.attr', 'href').and('include', '#in') + + let phone_number = '9312672712' + cy.get('.selected-phone').click().first(); + cy.get('.frappe-control[data-fieldname=phone] input') + .first() + .click(); + cy.get('.frappe-control[data-fieldname=phone]') + .findByRole('textbox') + .first() + .type(phone_number); + + cy.get('.frappe-control[data-fieldname=phone] input').first().should('have.value', phone_number); + cy.get('.frappe-control[data-fieldname=phone] input').first().blur(); + cy.get('@dialog').then(dialog => { + let value = dialog.fields_dict.phone.value; + expect(value).to.equal('+91-' + phone_number); + }); + }); + + it('case insensitive search for country and clear search', () => { + let search_text = 'india'; + cy.get('.selected-phone').click().first(); + cy.get('.phone-picker').findByRole('searchbox').click().type(search_text); + cy.get('.phone-section .phone-wrapper:not(.hidden)').then(i => { + cy.get(`.phone-section .phone-wrapper[id*='${search_text.toLowerCase()}']`).then(countries => { + expect(i.length).to.equal(countries.length); + }); + }); + + cy.get('.phone-picker').findByRole('searchbox').clear().blur(); + cy.get('.phone-section .phone-wrapper').should('not.have.class', 'hidden'); + }); + +}); diff --git a/frappe/public/js/frappe/form/controls/phone.js b/frappe/public/js/frappe/form/controls/phone.js index c5191ee224..98764bc76c 100644 --- a/frappe/public/js/frappe/form/controls/phone.js +++ b/frappe/public/js/frappe/form/controls/phone.js @@ -92,7 +92,7 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD super.refresh(); // Previously opened doc values get fetched. - if(!this.value && this.frm.is_new()) { + if(!this.value) { this.$input.val(""); this.$wrapper.find('.country').text("") this.selected_icon.find('use').attr('href', '#icon-down') From 849dadf6e12e415c8a292b6efb3a585d3ccd9ecd Mon Sep 17 00:00:00 2001 From: Noah Jacob Date: Wed, 5 Jan 2022 16:55:10 +0530 Subject: [PATCH 0013/1251] chore: updated requirements.txt --- requirements.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/requirements.txt b/requirements.txt index 671f6ced11..5a985985e4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -75,3 +75,5 @@ zxcvbn-python~=4.4.24 tenacity~=8.0.1 cairocffi==1.2.0 WeasyPrint==52.5 +phonenumbers==8.12.40 + From 224c91f92ce3b9b541e0e0f6f5929cdc0c4b23ff Mon Sep 17 00:00:00 2001 From: Noah Jacob Date: Fri, 7 Jan 2022 12:14:07 +0530 Subject: [PATCH 0014/1251] refactor: using flagcdn instead of flags.svg --- frappe/public/icons/timeless/flags.svg | 18341 ---------------- .../public/js/frappe/form/controls/phone.js | 81 +- .../js/frappe/phone_picker/phone_picker.js | 5 +- frappe/public/js/frappe/utils/utils.js | 6 +- frappe/public/scss/common/phone_picker.scss | 8 + frappe/www/app.html | 1 - 6 files changed, 57 insertions(+), 18385 deletions(-) delete mode 100644 frappe/public/icons/timeless/flags.svg diff --git a/frappe/public/icons/timeless/flags.svg b/frappe/public/icons/timeless/flags.svg deleted file mode 100644 index d57fda3d0e..0000000000 --- a/frappe/public/icons/timeless/flags.svg +++ /dev/null @@ -1,18341 +0,0 @@ - - diff --git a/frappe/public/js/frappe/form/controls/phone.js b/frappe/public/js/frappe/form/controls/phone.js index 98764bc76c..bf5a865d02 100644 --- a/frappe/public/js/frappe/form/controls/phone.js +++ b/frappe/public/js/frappe/form/controls/phone.js @@ -14,19 +14,22 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD this.picker.on_change = (country) => { const country_code = frappe.boot.country_codes[country].code; const country_isd = frappe.boot.country_codes[country].iso; - this.selected_icon.find('use').attr('href', '#'+country_code) + this.change_flag(country_code); this.$icon = this.selected_icon.find('svg'); - if (this.$icon.hasClass('icon-sm')) { - this.$icon.removeClass('icon-sm'); - this.selected_icon.find('svg').addClass('flag-md') + this.$flag = this.selected_icon.find('img'); + if (!this.$icon.hasClass('hide')){ + this.$icon.toggleClass('hide'); + } + if (!this.$flag.length) { + this.selected_icon.prepend(this.get_country_flag(country)); } if (!this.$isd.length) { - this.selected_icon.append($(` ${country_isd}`)) + this.selected_icon.append($(` ${country_isd}`)); } else { - this.$isd.text(country_isd) + this.$isd.text(country_isd); } if(this.$input.val()) { - this.set_formatted_input(this.get_country(country) +'-'+ this.$input.val()) + this.set_formatted_input(this.get_country(country) +'-'+ this.$input.val()); } }; @@ -76,14 +79,14 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD // Default icon when nothing is selected. this.selected_icon = this.$wrapper.find('.selected-phone'); - let input_value = this.get_input_value() + let input_value = this.get_input_value(); if (!this.selected_icon.length) { this.selected_icon = $(`
${frappe.utils.icon("down", "sm")}
`); this.selected_icon.insertAfter(this.$input); - this.selected_icon.append($(``)) + this.selected_icon.append($(``)); this.$isd = this.selected_icon.find('.country'); if(input_value && input_value.split("-").length == 2) { - this.$isd.text(this.value.split("-")[0]) + this.$isd.text(this.value.split("-")[0]); } } } @@ -94,26 +97,15 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD // Previously opened doc values get fetched. if(!this.value) { this.$input.val(""); - this.$wrapper.find('.country').text("") - this.selected_icon.find('use').attr('href', '#icon-down') - this.flag = this.selected_icon.find('svg'); - let has_flag = this.flag.hasClass('flag-md'); - if (has_flag) { - this.flag.toggleClass('flag-md'); - this.flag.toggleClass('icon-sm'); + this.$wrapper.find('.country').text(""); + if (this.selected_icon.find('svg').hasClass('hide')) { + this.selected_icon.find('svg').toggleClass('hide'); + this.selected_icon.find('img').addClass('hide'); } } - if(this.value && this.value.split("-").length == 2) { let isd = this.value.split("-")[0]; - let country_data = frappe.boot.country_codes; - - for (const country in country_data) { - if (Object.values(country_data[country]).includes(isd)) { - let code = country_data[country].code; - this.change_flag(code); - } - } + this.get_country_code_and_change_flag(isd); this.picker.set_country(isd); this.picker.refresh(); if (this.picker.country && this.picker.country !== this.$isd.text()) { @@ -125,30 +117,45 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD set_formatted_input(value) { if(value && value.includes('-')) { - this.set_model_value(value) + this.set_model_value(value); + this.$input.val(value.split("-").pop()); } else if(this.$isd.text().trim() && this.value) { let code_number = this.$isd.text() + '-' + value; - this.set_model_value(code_number) + this.set_model_value(code_number); } - this.$input && value && this.$input.val(value.split("-").pop()) } change_flag(country_code) { - this.selected_icon.find('use').attr('href', '#'+country_code) - this.$icon = this.selected_icon.find('svg'); - if (this.$icon.hasClass('icon-sm')) { - this.$icon.removeClass('icon-sm'); - this.selected_icon.find('svg').addClass('flag-md') - } + this.selected_icon.find('img').attr('src', 'https://flagcdn.com/h20/'+country_code+'.png') + this.$icon = this.selected_icon.find('img'); + // this.$icon.hasClass('hide') && this.$icon.toggleClass('hide'); } - get_country(country=null) { + // country_code for India is 'in' + get_country_code_and_change_flag(isd) { + let country_data = frappe.boot.country_codes; + let flag = this.selected_icon.find('img'); + for (const country in country_data) { + if (Object.values(country_data[country]).includes(isd)) { + let code = country_data[country].code; + flag = this.selected_icon.find('img'); + if (!flag.length) { + this.selected_icon.prepend(this.get_country_flag(country)); + this.selected_icon.find('svg').addClass('hide'); + } + else { + this.change_flag(code); + } + } + } + } + get_country(country) { const country_codes = frappe.boot.country_codes; return country_codes[country].iso; } get_country_flag(country) { const country_codes = frappe.boot.country_codes; let code = country_codes[country].code; - return frappe.utils.flag(code, "md") + return frappe.utils.flag(code); } }; diff --git a/frappe/public/js/frappe/phone_picker/phone_picker.js b/frappe/public/js/frappe/phone_picker/phone_picker.js index f12ddf46ec..7270fe63a1 100644 --- a/frappe/public/js/frappe/phone_picker/phone_picker.js +++ b/frappe/public/js/frappe/phone_picker/phone_picker.js @@ -37,7 +37,7 @@ class Picker { if (!info.iso) { return } - let $country = $(`
${frappe.utils.flag(info.code, "md")} + let $country = $(`
${frappe.utils.flag(info.code)} ${country} (${info.iso})
`); this.phone_wrapper.append($country); const set_values = () => { @@ -49,7 +49,7 @@ class Picker { }); $country.hover(() => { $country.toggleClass("bg-gray-100"); - }); + }); this.search_input.keydown((e) => { const key_code = e.keyCode; if ([13].includes(key_code)) { @@ -87,7 +87,6 @@ class Picker { } get_country() { - if (!this.country) return frappe.utils.icon("down", "sm") return this.country; } } diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index 8b3dc80ce6..db21adf886 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -1164,9 +1164,9 @@ Object.assign(frappe.utils, { } else { size_class = `flag-${size}`; } - return ` - - `; + return `` }, make_chart(wrapper, custom_options={}) { diff --git a/frappe/public/scss/common/phone_picker.scss b/frappe/public/scss/common/phone_picker.scss index 631090f145..cc3387ecb0 100644 --- a/frappe/public/scss/common/phone_picker.scss +++ b/frappe/public/scss/common/phone_picker.scss @@ -29,6 +29,9 @@ border-radius: 0.375rem; padding: 0.5rem; + img { + height: 15px; + } .country { display: flex; margin-left: 0.6rem; @@ -75,6 +78,7 @@ top: calc(50% + 2.6px); left: 8px; content: ' '; + align-items: center; .country { display: flex; @@ -83,6 +87,10 @@ flex-grow: 1; } + img { + height: 15px; + } + } .like-disabled-input { .phone-value { diff --git a/frappe/www/app.html b/frappe/www/app.html index 8fcaf581e2..68a6dc8e86 100644 --- a/frappe/www/app.html +++ b/frappe/www/app.html @@ -26,7 +26,6 @@ {% include "public/icons/timeless/symbol-defs.svg" %} - {% include "public/icons/timeless/flags.svg" %}
From b3076c67b8b477112a0a57a198e95f67049da193 Mon Sep 17 00:00:00 2001 From: Noah Jacob Date: Fri, 7 Jan 2022 12:18:33 +0530 Subject: [PATCH 0015/1251] chore: renamed iso to isd --- frappe/geo/country_info.json | 490 +++++++++--------- .../public/js/frappe/form/controls/phone.js | 4 +- .../js/frappe/phone_picker/phone_picker.js | 4 +- 3 files changed, 249 insertions(+), 249 deletions(-) diff --git a/frappe/geo/country_info.json b/frappe/geo/country_info.json index 72e3e0ba24..e8b8bed1c7 100644 --- a/frappe/geo/country_info.json +++ b/frappe/geo/country_info.json @@ -9,7 +9,7 @@ "timezones": [ "Asia/Kabul" ], - "iso": "+93" + "isd": "+93" }, "Albania": { "code": "al", @@ -22,7 +22,7 @@ "timezones": [ "Europe/Tirane" ], - "iso": "+355" + "isd": "+355" }, "Algeria": { "code": "dz", @@ -35,12 +35,12 @@ "timezones": [ "Africa/Algiers" ], - "iso": "+213" + "isd": "+213" }, "American Samoa": { "code": "as", "number_format": "#,###.##", - "iso": "+1684" + "isd": "+1684" }, "Andorra": { "code": "ad", @@ -53,7 +53,7 @@ "timezones": [ "Europe/Andorra" ], - "iso": "+376" + "isd": "+376" }, "Angola": { "code": "ao", @@ -66,7 +66,7 @@ "timezones": [ "Africa/Luanda" ], - "iso": "+244" + "isd": "+244" }, "Anguilla": { "code": "ai", @@ -79,7 +79,7 @@ "timezones": [ "America/Anguilla" ], - "iso": "+1264" + "isd": "+1264" }, "Antarctica": { "code": "aq", @@ -96,7 +96,7 @@ "Antarctica/Syowa", "Antarctica/Vostok" ], - "iso": "+672" + "isd": "+672" }, "Antigua and Barbuda": { "code": "ag", @@ -109,7 +109,7 @@ "timezones": [ "America/Antigua" ], - "iso": "+1268" + "isd": "+1268" }, "Argentina": { "code": "ar", @@ -133,7 +133,7 @@ "America/Argentina/Tucuman", "America/Argentina/Ushuaia" ], - "iso": "+54" + "isd": "+54" }, "Armenia": { "code": "am", @@ -146,7 +146,7 @@ "timezones": [ "Asia/Yerevan" ], - "iso": "+374" + "isd": "+374" }, "Aruba": { "code": "aw", @@ -159,7 +159,7 @@ "timezones": [ "America/Aruba" ], - "iso": "+297" + "isd": "+297" }, "Australia": { "code": "au", @@ -183,7 +183,7 @@ "Australia/Perth", "Australia/Sydney" ], - "iso": "+61" + "isd": "+61" }, "Austria": { "code": "at", @@ -196,7 +196,7 @@ "timezones": [ "Europe/Vienna" ], - "iso": "+43" + "isd": "+43" }, "Azerbaijan": { "code": "az", @@ -207,7 +207,7 @@ "timezones": [ "Asia/Baku" ], - "iso": "+994" + "isd": "+994" }, "Bahamas": { "code": "bs", @@ -217,7 +217,7 @@ "timezones": [ "America/Nassau" ], - "iso": "+1242" + "isd": "+1242" }, "Bahrain": { "code": "bh", @@ -230,7 +230,7 @@ "timezones": [ "Asia/Bahrain" ], - "iso": "+973" + "isd": "+973" }, "Bangladesh": { "code": "bd", @@ -243,7 +243,7 @@ "timezones": [ "Asia/Dhaka" ], - "iso": "+880" + "isd": "+880" }, "Barbados": { "code": "bb", @@ -256,7 +256,7 @@ "timezones": [ "America/Barbados" ], - "iso": "+1246" + "isd": "+1246" }, "Belarus": { "code": "by", @@ -267,7 +267,7 @@ "timezones": [ "Europe/Minsk" ], - "iso": "+375" + "isd": "+375" }, "Belgium": { "code": "be", @@ -280,7 +280,7 @@ "timezones": [ "Europe/Brussels" ], - "iso": "+32" + "isd": "+32" }, "Belize": { "code": "bz", @@ -294,7 +294,7 @@ "timezones": [ "America/Belize" ], - "iso": "+501" + "isd": "+501" }, "Benin": { "code": "bj", @@ -307,7 +307,7 @@ "timezones": [ "Africa/Porto-Novo" ], - "iso": "+229" + "isd": "+229" }, "Bermuda": { "code": "bm", @@ -320,7 +320,7 @@ "timezones": [ "Atlantic/Bermuda" ], - "iso": "+1441" + "isd": "+1441" }, "Bhutan": { "code": "bt", @@ -333,14 +333,14 @@ "timezones": [ "Asia/Thimphu" ], - "iso": "+975" + "isd": "+975" }, "Bolivia, Plurinational State of": { "code": "bo", "currency": "BOB", "currency_name": "Boliviano", "number_format": "#,###.##", - "iso": "+591" + "isd": "+591" }, "Bonaire, Sint Eustatius and Saba": { "code": "bq", @@ -356,7 +356,7 @@ "timezones": [ "Europe/Sarajevo" ], - "iso": "+387" + "isd": "+387" }, "Botswana": { "code": "bw", @@ -369,12 +369,12 @@ "timezones": [ "Africa/Gaborone" ], - "iso": "+267" + "isd": "+267" }, "Bouvet Island": { "code": "bv", "number_format": "#,###.##", - "iso": "+47" + "isd": "+47" }, "Brazil": { "code": "br", @@ -402,7 +402,7 @@ "America/Santarem", "America/Sao_Paulo" ], - "iso": "+55" + "isd": "+55" }, "British Indian Ocean Territory": { "code": "io", @@ -413,7 +413,7 @@ "timezones": [ "Indian/Chagos" ], - "iso": "+246" + "isd": "+246" }, "Brunei Darussalam": { "code": "bn", @@ -423,7 +423,7 @@ "timezones": [ "Asia/Brunei" ], - "iso": "+673" + "isd": "+673" }, "Bulgaria": { "code": "bg", @@ -436,7 +436,7 @@ "timezones": [ "Europe/Sofia" ], - "iso": "+359" + "isd": "+359" }, "Burkina Faso": { "code": "bf", @@ -449,7 +449,7 @@ "timezones": [ "Africa/Ouagadougou" ], - "iso": "+226" + "isd": "+226" }, "Burundi": { "code": "bi", @@ -462,7 +462,7 @@ "timezones": [ "Africa/Bujumbura" ], - "iso": "+257" + "isd": "+257" }, "Cambodia": { "code": "kh", @@ -475,7 +475,7 @@ "timezones": [ "Asia/Phnom_Penh" ], - "iso": "+855" + "isd": "+855" }, "Cameroon": { "code": "cm", @@ -488,7 +488,7 @@ "timezones": [ "Africa/Douala" ], - "iso": "+237" + "isd": "+237" }, "Canada": { "code": "ca", @@ -529,7 +529,7 @@ "America/Winnipeg", "America/Yellowknife" ], - "iso": "+1" + "isd": "+1" }, "Cape Verde": { "code": "cv", @@ -542,7 +542,7 @@ "timezones": [ "Atlantic/Cape_Verde" ], - "iso": "+238" + "isd": "+238" }, "Cayman Islands": { "code": "ky", @@ -555,7 +555,7 @@ "timezones": [ "America/Cayman" ], - "iso": "+ 345" + "isd": "+ 345" }, "Central African Republic": { "code": "cf", @@ -568,7 +568,7 @@ "timezones": [ "Africa/Bangui" ], - "iso": "+236" + "isd": "+236" }, "Chad": { "code": "td", @@ -581,7 +581,7 @@ "timezones": [ "Africa/Ndjamena" ], - "iso": "+235" + "isd": "+235" }, "Chile": { "code": "cl", @@ -595,7 +595,7 @@ "America/Santiago", "Pacific/Easter" ], - "iso": "+56" + "isd": "+56" }, "China": { "code": "cn", @@ -612,7 +612,7 @@ "Asia/Shanghai", "Asia/Urumqi" ], - "iso": "+86" + "isd": "+86" }, "Christmas Island": { "code": "cx", @@ -620,7 +620,7 @@ "timezones": [ "Indian/Christmas" ], - "iso": "+61" + "isd": "+61" }, "Cocos (Keeling) Islands": { "code": "cc", @@ -631,7 +631,7 @@ "timezones": [ "Indian/Cocos" ], - "iso": "+61" + "isd": "+61" }, "Colombia": { "code": "co", @@ -644,7 +644,7 @@ "timezones": [ "America/Bogota" ], - "iso": "+57" + "isd": "+57" }, "Comoros": { "code": "km", @@ -657,7 +657,7 @@ "timezones": [ "Indian/Comoro" ], - "iso": "+269" + "isd": "+269" }, "Congo": { "code": "cg", @@ -667,7 +667,7 @@ "currency_symbol": "FCFA", "currency_fraction": "Centime", "currency_fraction_units": 100, - "iso": "+242" + "isd": "+242" }, "Congo, The Democratic Republic of the": { "code": "cd", @@ -677,7 +677,7 @@ "currency_symbol": "FC", "currency_fraction": "Centime", "currency_fraction_units": 100, - "iso": "+243" + "isd": "+243" }, "Cook Islands": { "code": "ck", @@ -688,7 +688,7 @@ "timezones": [ "Pacific/Rarotonga" ], - "iso": "+682" + "isd": "+682" }, "Costa Rica": { "code": "cr", @@ -701,7 +701,7 @@ "timezones": [ "America/Costa_Rica" ], - "iso": "+506" + "isd": "+506" }, "Croatia": { "code": "hr", @@ -714,7 +714,7 @@ "timezones": [ "Europe/Zagreb" ], - "iso": "+385" + "isd": "+385" }, "Cuba": { "code": "cu", @@ -727,7 +727,7 @@ "timezones": [ "America/Havana" ], - "iso": "+53" + "isd": "+53" }, "Cura\u00e7ao": { "code": "cw", @@ -747,7 +747,7 @@ "timezones": [ "Asia/Nicosia" ], - "iso": "+357" + "isd": "+357" }, "Czech Republic": { "code": "cz", @@ -760,7 +760,7 @@ "timezones": [ "Europe/Prague" ], - "iso": "+420" + "isd": "+420" }, "Denmark": { "code": "dk", @@ -773,7 +773,7 @@ "timezones": [ "Europe/Copenhagen" ], - "iso": "+45" + "isd": "+45" }, "Djibouti": { "code": "dj", @@ -786,7 +786,7 @@ "timezones": [ "Africa/Djibouti" ], - "iso": "+253" + "isd": "+253" }, "Dominica": { "code": "dm", @@ -799,7 +799,7 @@ "timezones": [ "America/Dominica" ], - "iso": "+1767" + "isd": "+1767" }, "Dominican Republic": { "code": "do", @@ -812,7 +812,7 @@ "timezones": [ "America/Santo_Domingo" ], - "iso": "+1849" + "isd": "+1849" }, "Ecuador": { "code": "ec", @@ -824,7 +824,7 @@ "America/Guayaquil", "Pacific/Galapagos" ], - "iso": "+593" + "isd": "+593" }, "Egypt": { "code": "eg", @@ -837,7 +837,7 @@ "timezones": [ "Africa/Cairo" ], - "iso": "+20" + "isd": "+20" }, "El Salvador": { "code": "sv", @@ -852,7 +852,7 @@ "timezones": [ "America/El_Salvador" ], - "iso": "+503" + "isd": "+503" }, "Equatorial Guinea": { "code": "gq", @@ -865,7 +865,7 @@ "timezones": [ "Africa/Malabo" ], - "iso": "+240" + "isd": "+240" }, "Eritrea": { "code": "er", @@ -878,7 +878,7 @@ "timezones": [ "Africa/Asmara" ], - "iso": "+291" + "isd": "+291" }, "Estonia": { "code": "ee", @@ -891,7 +891,7 @@ "timezones": [ "Europe/Tallinn" ], - "iso": "+372" + "isd": "+372" }, "Ethiopia": { "code": "et", @@ -904,14 +904,14 @@ "timezones": [ "Africa/Addis_Ababa" ], - "iso": "+251" + "isd": "+251" }, "Falkland Islands (Malvinas)": { "code": "fk", "currency": "FKP", "currency_name": "Falkland Islands Pound", "number_format": "#,###.##", - "iso": "+500" + "isd": "+500" }, "Faroe Islands": { "code": "fo", @@ -922,7 +922,7 @@ "timezones": [ "Atlantic/Faroe" ], - "iso": "+298" + "isd": "+298" }, "Fiji": { "code": "fj", @@ -935,7 +935,7 @@ "timezones": [ "Pacific/Fiji" ], - "iso": "+679" + "isd": "+679" }, "Finland": { "code": "fi", @@ -948,7 +948,7 @@ "timezones": [ "Europe/Helsinki" ], - "iso": "+358" + "isd": "+358" }, "France": { "code": "fr", @@ -962,7 +962,7 @@ "timezones": [ "Europe/Paris" ], - "iso": "+33" + "isd": "+33" }, "French Guiana": { "code": "gf", @@ -970,7 +970,7 @@ "timezones": [ "America/Cayenne" ], - "iso": "+594" + "isd": "+594" }, "French Polynesia": { "code": "pf", @@ -983,12 +983,12 @@ "Pacific/Marquesas", "Pacific/Tahiti" ], - "iso": "+689" + "isd": "+689" }, "French Southern Territories": { "code": "tf", "number_format": "#,###.##", - "iso": "+262" + "isd": "+262" }, "Gabon": { "code": "ga", @@ -1001,7 +1001,7 @@ "timezones": [ "Africa/Libreville" ], - "iso": "+241" + "isd": "+241" }, "Gambia": { "code": "gm", @@ -1011,7 +1011,7 @@ "timezones": [ "Africa/Banjul" ], - "iso": "+220" + "isd": "+220" }, "Georgia": { "code": "ge", @@ -1022,7 +1022,7 @@ "timezones": [ "Asia/Tbilisi" ], - "iso": "+995" + "isd": "+995" }, "Germany": { "code": "de", @@ -1035,7 +1035,7 @@ "timezones": [ "Europe/Berlin" ], - "iso": "+49" + "isd": "+49" }, "Ghana": { "code": "gh", @@ -1047,7 +1047,7 @@ "timezones": [ "Africa/Accra" ], - "iso": "+233" + "isd": "+233" }, "Gibraltar": { "code": "gi", @@ -1060,7 +1060,7 @@ "timezones": [ "Europe/Gibraltar" ], - "iso": "+350" + "isd": "+350" }, "Greece": { "code": "gr", @@ -1073,7 +1073,7 @@ "timezones": [ "Europe/Athens" ], - "iso": "+30" + "isd": "+30" }, "Greenland": { "code": "gl", @@ -1084,7 +1084,7 @@ "America/Scoresbysund", "America/Thule" ], - "iso": "+299" + "isd": "+299" }, "Grenada": { "code": "gd", @@ -1097,7 +1097,7 @@ "timezones": [ "America/Grenada" ], - "iso": "+1473" + "isd": "+1473" }, "Guadeloupe": { "code": "gp", @@ -1105,7 +1105,7 @@ "timezones": [ "America/Guadeloupe" ], - "iso": "+590" + "isd": "+590" }, "Guam": { "code": "gu", @@ -1113,7 +1113,7 @@ "timezones": [ "Pacific/Guam" ], - "iso": "+1671" + "isd": "+1671" }, "Guatemala": { "code": "gt", @@ -1126,7 +1126,7 @@ "timezones": [ "America/Guatemala" ], - "iso": "+502" + "isd": "+502" }, "Guernsey": { "code": "gg", @@ -1137,7 +1137,7 @@ "timezones": [ "Europe/London" ], - "iso": "+44" + "isd": "+44" }, "Guinea": { "code": "gn", @@ -1150,7 +1150,7 @@ "timezones": [ "Africa/Conakry" ], - "iso": "+224" + "isd": "+224" }, "Guinea-Bissau": { "code": "gw", @@ -1163,7 +1163,7 @@ "timezones": [ "Africa/Bissau" ], - "iso": "+245" + "isd": "+245" }, "Guyana": { "code": "gy", @@ -1176,7 +1176,7 @@ "timezones": [ "America/Guyana" ], - "iso": "+592" + "isd": "+592" }, "Haiti": { "code": "ht", @@ -1190,17 +1190,17 @@ "America/Guatemala", "America/Port-au-Prince" ], - "iso": "+509" + "isd": "+509" }, "Heard Island and McDonald Islands": { "code": "hm", "number_format": "#,###.##", - "iso": "+0" + "isd": "+0" }, "Holy See (Vatican City State)": { "code": "va", "number_format": "#,###.##", - "iso": "+379" + "isd": "+379" }, "Honduras": { "code": "hn", @@ -1213,7 +1213,7 @@ "timezones": [ "America/Tegucigalpa" ], - "iso": "+504" + "isd": "+504" }, "Hong Kong": { "code": "hk", @@ -1226,7 +1226,7 @@ "timezones": [ "Asia/Hong_Kong" ], - "iso": "+852" + "isd": "+852" }, "Hungary": { "code": "hu", @@ -1240,7 +1240,7 @@ "timezones": [ "Europe/Budapest" ], - "iso": "+36" + "isd": "+36" }, "Iceland": { "code": "is", @@ -1253,7 +1253,7 @@ "timezones": [ "Atlantic/Reykjavik" ], - "iso": "+354" + "isd": "+354" }, "India": { "code": "in", @@ -1266,7 +1266,7 @@ "timezones": [ "Asia/Kolkata" ], - "iso": "+91" + "isd": "+91" }, "Indonesia": { "code": "id", @@ -1282,7 +1282,7 @@ "Asia/Makassar", "Asia/Pontianak" ], - "iso": "+62" + "isd": "+62" }, "Iran": { "code": "ir", @@ -1293,7 +1293,7 @@ "timezones": [ "Asia/Tehran" ], - "iso": "+98" + "isd": "+98" }, "Iraq": { "code": "iq", @@ -1306,7 +1306,7 @@ "timezones": [ "Asia/Baghdad" ], - "iso": "+964" + "isd": "+964" }, "Ireland": { "code": "ie", @@ -1319,7 +1319,7 @@ "timezones": [ "Europe/Dublin" ], - "iso": "+353" + "isd": "+353" }, "Isle of Man": { "code": "im", @@ -1330,7 +1330,7 @@ "timezones": [ "Europe/London" ], - "iso": "+44" + "isd": "+44" }, "Israel": { "code": "il", @@ -1343,7 +1343,7 @@ "timezones": [ "Asia/Jerusalem" ], - "iso": "+972" + "isd": "+972" }, "Italy": { "code": "it", @@ -1357,7 +1357,7 @@ "timezones": [ "Europe/Rome" ], - "iso": "+39" + "isd": "+39" }, "Ivory Coast": { "code": "ci", @@ -1370,7 +1370,7 @@ "timeszones": [ "Africa/Abidjan" ], - "iso": "+225" + "isd": "+225" }, "Jamaica": { "code": "jm", @@ -1383,7 +1383,7 @@ "timezones": [ "America/Jamaica" ], - "iso": "+1876" + "isd": "+1876" }, "Japan": { "code": "jp", @@ -1396,7 +1396,7 @@ "timezones": [ "Asia/Tokyo" ], - "iso": "+81" + "isd": "+81" }, "Jersey": { "code": "je", @@ -1407,7 +1407,7 @@ "timezones": [ "Europe/London" ], - "iso": "+44" + "isd": "+44" }, "Jordan": { "code": "jo", @@ -1420,7 +1420,7 @@ "timezones": [ "Asia/Amman" ], - "iso": "+962" + "isd": "+962" }, "Kazakhstan": { "code": "kz", @@ -1437,7 +1437,7 @@ "Asia/Oral", "Asia/Qyzylorda" ], - "iso": "+7" + "isd": "+7" }, "Kenya": { "code": "ke", @@ -1450,7 +1450,7 @@ "timezones": [ "Africa/Nairobi" ], - "iso": "+254" + "isd": "+254" }, "Kiribati": { "code": "ki", @@ -1463,21 +1463,21 @@ "Pacific/Kiritimati", "Pacific/Tarawa" ], - "iso": "+686" + "isd": "+686" }, "Korea, Democratic Peoples Republic of": { "code": "kp", "currency": "KPW", "currency_name": "North Korean Won", "number_format": "#,###.##", - "iso": "+850" + "isd": "+850" }, "Korea, Republic of": { "code": "kr", "currency": "KRW", "currency_name": "Won", "number_format": "#,###", - "iso": "+82" + "isd": "+82" }, "Kuwait": { "code": "kw", @@ -1490,7 +1490,7 @@ "timezones": [ "Asia/Kuwait" ], - "iso": "+965" + "isd": "+965" }, "Kyrgyzstan": { "code": "kg", @@ -1503,7 +1503,7 @@ "timezones": [ "Asia/Bishkek" ], - "iso": "+996" + "isd": "+996" }, "Lao Peoples Democratic Republic": { "code": "la", @@ -1513,7 +1513,7 @@ "timezones": [ "Asia/Vientiane" ], - "iso": "+856" + "isd": "+856" }, "Latvia": { "code": "lv", @@ -1526,7 +1526,7 @@ "timezones": [ "Europe/Riga" ], - "iso": "+371" + "isd": "+371" }, "Lebanon": { "code": "lb", @@ -1539,7 +1539,7 @@ "timezones": [ "Asia/Beirut" ], - "iso": "+961" + "isd": "+961" }, "Lesotho": { "code": "ls", @@ -1552,7 +1552,7 @@ "timezones": [ "Africa/Maseru" ], - "iso": "+266" + "isd": "+266" }, "Liberia": { "code": "lr", @@ -1565,7 +1565,7 @@ "timezones": [ "Africa/Monrovia" ], - "iso": "+231" + "isd": "+231" }, "Libya": { "code": "ly", @@ -1578,7 +1578,7 @@ "timezones": [ "Africa/Tripoli" ], - "iso": "+218" + "isd": "+218" }, "Liechtenstein": { "code": "li", @@ -1589,7 +1589,7 @@ "timezones": [ "Europe/Vaduz" ], - "iso": "+423" + "isd": "+423" }, "Lithuania": { "code": "lt", @@ -1603,7 +1603,7 @@ "timezones": [ "Europe/Vilnius" ], - "iso": "+370" + "isd": "+370" }, "Luxembourg": { "code": "lu", @@ -1616,14 +1616,14 @@ "timezones": [ "Europe/Luxembourg" ], - "iso": "+352" + "isd": "+352" }, "Macao": { "code": "mo", "currency": "MOP", "currency_name": "Pataca", "number_format": "#,###.##", - "iso": "+853" + "isd": "+853" }, "Macedonia": { "code": "mk", @@ -1633,7 +1633,7 @@ "currency_name": "Denar", "currency_symbol": "\u0434\u0435\u043d", "number_format": "#,###.##", - "iso": "+389" + "isd": "+389" }, "Madagascar": { "code": "mg", @@ -1644,7 +1644,7 @@ "timezones": [ "Indian/Antananarivo" ], - "iso": "+261" + "isd": "+261" }, "Malawi": { "code": "mw", @@ -1657,7 +1657,7 @@ "timezones": [ "Africa/Blantyre" ], - "iso": "+265" + "isd": "+265" }, "Malaysia": { "code": "my", @@ -1671,7 +1671,7 @@ "Asia/Kuala_Lumpur", "Asia/Kuching" ], - "iso": "+60" + "isd": "+60" }, "Maldives": { "code": "mv", @@ -1684,7 +1684,7 @@ "timezones": [ "Indian/Maldives" ], - "iso": "+960" + "isd": "+960" }, "Mali": { "code": "ml", @@ -1697,7 +1697,7 @@ "timezones": [ "Africa/Bamako" ], - "iso": "+223" + "isd": "+223" }, "Malta": { "code": "mt", @@ -1710,7 +1710,7 @@ "timezones": [ "Europe/Malta" ], - "iso": "+356" + "isd": "+356" }, "Marshall Islands": { "code": "mh", @@ -1722,7 +1722,7 @@ "Pacific/Kwajalein", "Pacific/Majuro" ], - "iso": "+692" + "isd": "+692" }, "Martinique": { "code": "mq", @@ -1730,7 +1730,7 @@ "timezones": [ "America/Martinique" ], - "iso": "+596" + "isd": "+596" }, "Mauritania": { "code": "mr", @@ -1743,7 +1743,7 @@ "timezones": [ "Africa/Nouakchott" ], - "iso": "+222" + "isd": "+222" }, "Mauritius": { "code": "mu", @@ -1756,7 +1756,7 @@ "timezones": [ "Indian/Mauritius" ], - "iso": "+230" + "isd": "+230" }, "Mayotte": { "code": "yt", @@ -1764,7 +1764,7 @@ "timezones": [ "Indian/Mayotte" ], - "iso": "+262" + "isd": "+262" }, "Mexico": { "code": "mx", @@ -1788,19 +1788,19 @@ "America/Santa_Isabel", "America/Tijuana" ], - "iso": "+52" + "isd": "+52" }, "Micronesia, Federated States of": { "code": "fm", "number_format": "#,###.##", - "iso": "+691" + "isd": "+691" }, "Moldova, Republic of": { "code": "md", "currency": "MDL", "currency_name": "Moldovan Leu", "number_format": "#,###.##", - "iso": "+373" + "isd": "+373" }, "Monaco": { "code": "mc", @@ -1813,7 +1813,7 @@ "timezones": [ "Europe/Monaco" ], - "iso": "+377" + "isd": "+377" }, "Mongolia": { "code": "mn", @@ -1829,7 +1829,7 @@ "Asia/Hovd", "Asia/Ulaanbaatar" ], - "iso": "+976" + "isd": "+976" }, "Montenegro": { "code": "me", @@ -1842,7 +1842,7 @@ "timezones": [ "Europe/Belgrade" ], - "iso": "+382" + "isd": "+382" }, "Montserrat": { "code": "ms", @@ -1855,7 +1855,7 @@ "timezones": [ "America/Montserrat" ], - "iso": "+1664" + "isd": "+1664" }, "Morocco": { "code": "ma", @@ -1868,7 +1868,7 @@ "timezones": [ "Africa/Casablanca" ], - "iso": "+212" + "isd": "+212" }, "Mozambique": { "code": "mz", @@ -1880,7 +1880,7 @@ "timezones": [ "Africa/Maputo" ], - "iso": "+258" + "isd": "+258" }, "Myanmar": { "code": "mm", @@ -1890,7 +1890,7 @@ "timezones": [ "Asia/Rangoon" ], - "iso": "+95" + "isd": "+95" }, "Namibia": { "code": "na", @@ -1903,7 +1903,7 @@ "timezones": [ "Africa/Windhoek" ], - "iso": "+264" + "isd": "+264" }, "Nauru": { "code": "nr", @@ -1914,7 +1914,7 @@ "timezones": [ "Pacific/Nauru" ], - "iso": "+674" + "isd": "+674" }, "Nepal": { "code": "np", @@ -1927,7 +1927,7 @@ "timezones": [ "Asia/Kathmandu" ], - "iso": "+977" + "isd": "+977" }, "Netherlands": { "code": "nl", @@ -1940,7 +1940,7 @@ "timezones": [ "Europe/Amsterdam" ], - "iso": "+31" + "isd": "+31" }, "New Caledonia": { "code": "nc", @@ -1951,7 +1951,7 @@ "timezones": [ "Pacific/Noumea" ], - "iso": "+687" + "isd": "+687" }, "New Zealand": { "code": "nz", @@ -1965,7 +1965,7 @@ "Pacific/Auckland", "Pacific/Chatham" ], - "iso": "+64" + "isd": "+64" }, "Nicaragua": { "code": "ni", @@ -1978,7 +1978,7 @@ "timezones": [ "America/Managua" ], - "iso": "+505" + "isd": "+505" }, "Niger": { "code": "ne", @@ -1991,7 +1991,7 @@ "timezones": [ "Africa/Niamey" ], - "iso": "+227" + "isd": "+227" }, "Nigeria": { "code": "ng", @@ -2004,7 +2004,7 @@ "timezones": [ "Africa/Lagos" ], - "iso": "+234" + "isd": "+234" }, "Niue": { "code": "nu", @@ -2015,7 +2015,7 @@ "timezones": [ "Pacific/Niue" ], - "iso": "+683" + "isd": "+683" }, "Norfolk Island": { "code": "nf", @@ -2023,7 +2023,7 @@ "timezones": [ "Pacific/Norfolk" ], - "iso": "+672" + "isd": "+672" }, "Northern Mariana Islands": { "code": "mp", @@ -2031,7 +2031,7 @@ "timezones": [ "Pacific/Saipan" ], - "iso": "+1670" + "isd": "+1670" }, "Norway": { "code": "no", @@ -2044,7 +2044,7 @@ "timezones": [ "Europe/Oslo" ], - "iso": "+47" + "isd": "+47" }, "Oman": { "code": "om", @@ -2057,7 +2057,7 @@ "timezones": [ "Asia/Muscat" ], - "iso": "+968" + "isd": "+968" }, "Pakistan": { "code": "pk", @@ -2070,7 +2070,7 @@ "timezones": [ "Asia/Karachi" ], - "iso": "+92" + "isd": "+92" }, "Palau": { "code": "pw", @@ -2082,12 +2082,12 @@ "timezones": [ "Pacific/Palau" ], - "iso": "+680" + "isd": "+680" }, "Palestinian Territory, Occupied": { "code": "ps", "number_format": "#,###.##", - "iso": "+970" + "isd": "+970" }, "Panama": { "code": "pa", @@ -2098,7 +2098,7 @@ "timezones": [ "America/Panama" ], - "iso": "+507" + "isd": "+507" }, "Papua New Guinea": { "code": "pg", @@ -2111,7 +2111,7 @@ "timezones": [ "Pacific/Port_Moresby" ], - "iso": "+675" + "isd": "+675" }, "Paraguay": { "code": "py", @@ -2124,7 +2124,7 @@ "timezones": [ "America/Asuncion" ], - "iso": "+595" + "isd": "+595" }, "Peru": { "code": "pe", @@ -2137,7 +2137,7 @@ "timezones": [ "America/Lima" ], - "iso": "+51" + "isd": "+51" }, "Philippines": { "code": "ph", @@ -2151,7 +2151,7 @@ "timezones": [ "Asia/Manila" ], - "iso": "+63" + "isd": "+63" }, "Pitcairn": { "code": "pn", @@ -2159,7 +2159,7 @@ "timezones": [ "Pacific/Pitcairn" ], - "iso": "+64" + "isd": "+64" }, "Poland": { "code": "pl", @@ -2171,7 +2171,7 @@ "timezones": [ "Europe/Warsaw" ], - "iso": "+48" + "isd": "+48" }, "Portugal": { "code": "pt", @@ -2186,7 +2186,7 @@ "Atlantic/Madeira", "Europe/Lisbon" ], - "iso": "+351" + "isd": "+351" }, "Puerto Rico": { "code": "pr", @@ -2194,7 +2194,7 @@ "timezones": [ "America/Puerto_Rico" ], - "iso": "+1939" + "isd": "+1939" }, "Qatar": { "code": "qa", @@ -2207,7 +2207,7 @@ "timezones": [ "Asia/Qatar" ], - "iso": "+974" + "isd": "+974" }, "Romania": { "code": "ro", @@ -2220,14 +2220,14 @@ "timezones": [ "Europe/Bucharest" ], - "iso": "+40" + "isd": "+40" }, "Russian Federation": { "code": "ru", "currency": "RUB", "currency_name": "Russian Ruble", "number_format": "#.###,##", - "iso": "+7" + "isd": "+7" }, "Rwanda": { "code": "rw", @@ -2240,24 +2240,24 @@ "timezones": [ "Africa/Kigali" ], - "iso": "+250" + "isd": "+250" }, "R\u00e9union": { "code": "re", "number_format": "#,###.##", - "iso": "+262" + "isd": "+262" }, "Saint Barth\u00e9lemy": { "code": "bl", "number_format": "#,###.##", - "iso": "+590" + "isd": "+590" }, "Saint Helena, Ascension and Tristan da Cunha": { "code": "sh", "currency": "SHP", "currency_name": "Saint Helena Pound", "number_format": "#,###.##", - "iso": "+290" + "isd": "+290" }, "Saint Kitts and Nevis": { "code": "kn", @@ -2270,7 +2270,7 @@ "timezones": [ "America/St_Kitts" ], - "iso": "+1869" + "isd": "+1869" }, "Saint Lucia": { "code": "lc", @@ -2283,17 +2283,17 @@ "timezones": [ "America/St_Lucia" ], - "iso": "+1758" + "isd": "+1758" }, "Saint Martin (French part)": { "code": "mf", "number_format": "#,###.##", - "iso": "+590" + "isd": "+590" }, "Saint Pierre and Miquelon": { "code": "pm", "number_format": "#,###.##", - "iso": "+508" + "isd": "+508" }, "Saint Vincent and the Grenadines": { "code": "vc", @@ -2306,7 +2306,7 @@ "timezones": [ "America/St_Vincent" ], - "iso": "+1784" + "isd": "+1784" }, "Samoa": { "code": "ws", @@ -2319,7 +2319,7 @@ "timezones": [ "Pacific/Apia" ], - "iso": "+685" + "isd": "+685" }, "San Marino": { "code": "sm", @@ -2332,14 +2332,14 @@ "timezones": [ "Europe/Rome" ], - "iso": "+378" + "isd": "+378" }, "Sao Tome and Principe": { "code": "st", "currency": "STD", "currency_name": "Dobra", "number_format": "#,###.##", - "iso": "+239" + "isd": "+239" }, "Saudi Arabia": { "code": "sa", @@ -2352,7 +2352,7 @@ "timezones": [ "Asia/Riyadh" ], - "iso": "+966" + "isd": "+966" }, "Senegal": { "code": "sn", @@ -2365,7 +2365,7 @@ "timezones": [ "Africa/Dakar" ], - "iso": "+221" + "isd": "+221" }, "Serbia": { "code": "rs", @@ -2378,7 +2378,7 @@ "timezones": [ "Europe/Belgrade" ], - "iso": "+381" + "isd": "+381" }, "Seychelles": { "code": "sc", @@ -2391,7 +2391,7 @@ "timezones": [ "Indian/Mahe" ], - "iso": "+248" + "isd": "+248" }, "Sierra Leone": { "code": "sl", @@ -2404,7 +2404,7 @@ "timezones": [ "Africa/Freetown" ], - "iso": "+232" + "isd": "+232" }, "Singapore": { "code": "sg", @@ -2417,7 +2417,7 @@ "timezones": [ "Asia/Singapore" ], - "iso": "+65" + "isd": "+65" }, "Sint Maarten (Dutch part)": { "code": "sx", @@ -2434,7 +2434,7 @@ "timezones": [ "Europe/Bratislava" ], - "iso": "+421" + "isd": "+421" }, "Slovenia": { "code": "si", @@ -2447,7 +2447,7 @@ "timezones": [ "Europe/Belgrade" ], - "iso": "+386" + "isd": "+386" }, "Solomon Islands": { "code": "sb", @@ -2460,7 +2460,7 @@ "timezones": [ "Pacific/Guadalcanal" ], - "iso": "+677" + "isd": "+677" }, "Somalia": { "code": "so", @@ -2473,7 +2473,7 @@ "timezones": [ "Africa/Mogadishu" ], - "iso": "+252" + "isd": "+252" }, "South Africa": { "code": "za", @@ -2487,7 +2487,7 @@ "timezones": [ "Africa/Johannesburg" ], - "iso": "+27" + "isd": "+27" }, "South Georgia and the South Sandwich Islands": { "code": "gs", @@ -2495,7 +2495,7 @@ "currency_fraction_units": 100, "currency_symbol": "\u00a3", "number_format": "#,###.##", - "iso": "+500" + "isd": "+500" }, "South Sudan": { "code": "ss", @@ -2506,7 +2506,7 @@ "timezones": [ "Africa/Juba" ], - "iso": "+211" + "isd": "+211" }, "Spain": { "code": "es", @@ -2521,7 +2521,7 @@ "Atlantic/Canary", "Europe/Madrid" ], - "iso": "+34" + "isd": "+34" }, "Sri Lanka": { "code": "lk", @@ -2534,7 +2534,7 @@ "timezones": [ "Asia/Colombo" ], - "iso": "+94" + "isd": "+94" }, "Sudan": { "code": "sd", @@ -2545,7 +2545,7 @@ "timezones": [ "Africa/Khartoum" ], - "iso": "+249" + "isd": "+249" }, "Suriname": { "code": "sr", @@ -2557,12 +2557,12 @@ "timezones": [ "America/Paramaribo" ], - "iso": "+597" + "isd": "+597" }, "Svalbard and Jan Mayen": { "code": "sj", "number_format": "#,###.##", - "iso": "+47" + "isd": "+47" }, "Swaziland": { "code": "sz", @@ -2575,7 +2575,7 @@ "timezones": [ "Africa/Mbabane" ], - "iso": "+268" + "isd": "+268" }, "Sweden": { "code": "se", @@ -2588,7 +2588,7 @@ "timezones": [ "Europe/Stockholm" ], - "iso": "+46" + "isd": "+46" }, "Switzerland": { "code": "ch", @@ -2602,21 +2602,21 @@ "timezones": [ "Europe/Zurich" ], - "iso": "+41" + "isd": "+41" }, "Syria": { "code": "sy", "currency": "SYP", "currency_name": "Syrian Pound", "number_format": "#,###.##", - "iso": "+963" + "isd": "+963" }, "Taiwan": { "code": "tw", "currency": "TWD", "date_format": "yyyy-mm-dd", "number_format": "#,###.##", - "iso": "+886" + "isd": "+886" }, "Tajikistan": { "code": "tj", @@ -2627,14 +2627,14 @@ "timezones": [ "Asia/Dushanbe" ], - "iso": "+992" + "isd": "+992" }, "Tanzania": { "code": "tz", "currency": "TZS", "currency_name": "Tanzanian Shilling", "number_format": "#,###.##", - "iso": "+255" + "isd": "+255" }, "Thailand": { "code": "th", @@ -2647,12 +2647,12 @@ "timezones": [ "Asia/Bangkok" ], - "iso": "+66" + "isd": "+66" }, "Timor-Leste": { "code": "tl", "number_format": "#,###.##", - "iso": "+670" + "isd": "+670" }, "Togo": { "code": "tg", @@ -2665,7 +2665,7 @@ "timezones": [ "Africa/Lome" ], - "iso": "+228" + "isd": "+228" }, "Tokelau": { "code": "tk", @@ -2673,7 +2673,7 @@ "timezones": [ "Pacific/Fakaofo" ], - "iso": "+690" + "isd": "+690" }, "Tonga": { "code": "to", @@ -2686,7 +2686,7 @@ "timezones": [ "Pacific/Tongatapu" ], - "iso": "+676" + "isd": "+676" }, "Trinidad and Tobago": { "code": "tt", @@ -2699,7 +2699,7 @@ "timezones": [ "America/Port_of_Spain" ], - "iso": "+1868" + "isd": "+1868" }, "Tunisia": { "code": "tn", @@ -2712,7 +2712,7 @@ "timezones": [ "Africa/Tunis" ], - "iso": "+216" + "isd": "+216" }, "Turkey": { "code": "tr", @@ -2724,7 +2724,7 @@ "timezones": [ "Europe/Istanbul" ], - "iso": "+90" + "isd": "+90" }, "Turkmenistan": { "code": "tm", @@ -2737,7 +2737,7 @@ "timezones": [ "Asia/Ashgabat" ], - "iso": "+993" + "isd": "+993" }, "Turks and Caicos Islands": { "code": "tc", @@ -2745,7 +2745,7 @@ "currency_fraction_units": 100, "currency_symbol": "$", "number_format": "#,###.##", - "iso": "+1649" + "isd": "+1649" }, "Tuvalu": { "code": "tv", @@ -2756,7 +2756,7 @@ "timezones": [ "Pacific/Funafuti" ], - "iso": "+688" + "isd": "+688" }, "Uganda": { "code": "ug", @@ -2769,7 +2769,7 @@ "timezones": [ "Africa/Kampala" ], - "iso": "+256" + "isd": "+256" }, "Ukraine": { "code": "ua", @@ -2785,7 +2785,7 @@ "Europe/Uzhgorod", "Europe/Zaporozhye" ], - "iso": "+380" + "isd": "+380" }, "United Arab Emirates": { "code": "ae", @@ -2798,7 +2798,7 @@ "timezones": [ "Asia/Dubai" ], - "iso": "+971" + "isd": "+971" }, "United Kingdom": { "code": "gb", @@ -2811,7 +2811,7 @@ "timezones": [ "Europe/London" ], - "iso": "+44" + "isd": "+44" }, "United States": { "code": "us", @@ -2855,7 +2855,7 @@ "America/Yakutat", "Pacific/Honolulu" ], - "iso": "+1" + "isd": "+1" }, "United States Minor Outlying Islands": { "code": "um", @@ -2872,7 +2872,7 @@ "timezones": [ "America/Montevideo" ], - "iso": "+598" + "isd": "+598" }, "Uzbekistan": { "code": "uz", @@ -2886,7 +2886,7 @@ "Asia/Samarkand", "Asia/Tashkent" ], - "iso": "+998" + "isd": "+998" }, "Vanuatu": { "code": "vu", @@ -2899,7 +2899,7 @@ "timezones": [ "Pacific/Efate" ], - "iso": "+678" + "isd": "+678" }, "Venezuela, Bolivarian Republic of": { "code": "ve", @@ -2908,24 +2908,24 @@ "currency_symbol": "Bs.", "currency_fraction": "Centimos", "currency_fraction_units": 100, - "iso": "+58" + "isd": "+58" }, "Vietnam": { "code": "vn", "currency": "VND", "currency_name": "Dong", "number_format": "#.###", - "iso": "+84" + "isd": "+84" }, "Virgin Islands, British": { "code": "vg", "number_format": "#,###.##", - "iso": "+1284" + "isd": "+1284" }, "Virgin Islands, U.S.": { "code": "vi", "number_format": "#,###.##", - "iso": "+1340" + "isd": "+1340" }, "Wallis and Futuna": { "code": "wf", @@ -2933,7 +2933,7 @@ "currency_fraction_units": 100, "currency_symbol": "Fr", "number_format": "#,###.##", - "iso": "+681" + "isd": "+681" }, "Western Sahara": { "code": "eh", @@ -2954,7 +2954,7 @@ "timezones": [ "Asia/Aden" ], - "iso": "+967" + "isd": "+967" }, "Zambia": { "code": "zm", @@ -2967,7 +2967,7 @@ "timezones": [ "Africa/Lusaka" ], - "iso": "+260" + "isd": "+260" }, "Zimbabwe": { "code": "zw", @@ -2980,11 +2980,11 @@ "timezones": [ "Africa/Harare" ], - "iso": "+263" + "isd": "+263" }, "\u00c5land Islands": { "code": "ax", "number_format": "#,###.##", - "iso": "+358" + "isd": "+358" } -} \ No newline at end of file +} diff --git a/frappe/public/js/frappe/form/controls/phone.js b/frappe/public/js/frappe/form/controls/phone.js index bf5a865d02..308957ccb5 100644 --- a/frappe/public/js/frappe/form/controls/phone.js +++ b/frappe/public/js/frappe/form/controls/phone.js @@ -13,7 +13,7 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD // Replaces code when selected and removes previously selected. this.picker.on_change = (country) => { const country_code = frappe.boot.country_codes[country].code; - const country_isd = frappe.boot.country_codes[country].iso; + const country_isd = frappe.boot.country_codes[country].isd; this.change_flag(country_code); this.$icon = this.selected_icon.find('svg'); this.$flag = this.selected_icon.find('img'); @@ -151,7 +151,7 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD } get_country(country) { const country_codes = frappe.boot.country_codes; - return country_codes[country].iso; + return country_codes[country].isd; } get_country_flag(country) { const country_codes = frappe.boot.country_codes; diff --git a/frappe/public/js/frappe/phone_picker/phone_picker.js b/frappe/public/js/frappe/phone_picker/phone_picker.js index 7270fe63a1..34241be915 100644 --- a/frappe/public/js/frappe/phone_picker/phone_picker.js +++ b/frappe/public/js/frappe/phone_picker/phone_picker.js @@ -34,11 +34,11 @@ class Picker { setup_countries() { Object.entries(this.countries).forEach(([country, info]) => { - if (!info.iso) { + if (!info.isd) { return } let $country = $(`
${frappe.utils.flag(info.code)} - ${country} (${info.iso})
`); + ${country} (${info.isd})
`); this.phone_wrapper.append($country); const set_values = () => { this.set_country(country); From ad26e277182a245a5a30b32f3a88b59efb9d199e Mon Sep 17 00:00:00 2001 From: Noah Jacob Date: Fri, 7 Jan 2022 12:51:42 +0530 Subject: [PATCH 0016/1251] fix: updated test --- cypress/integration/control_phone.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cypress/integration/control_phone.js b/cypress/integration/control_phone.js index 684e0d7d99..f59ebd2667 100644 --- a/cypress/integration/control_phone.js +++ b/cypress/integration/control_phone.js @@ -4,7 +4,7 @@ context('Control Phone', () => { cy.visit('/app/website'); }); - function get_dialog_with_phone(s) { + function get_dialog_with_phone() { return cy.dialog({ title: 'Phone', fields: [{ @@ -19,10 +19,10 @@ context('Control Phone', () => { cy.get('.selected-phone').click(); cy.get('.phone-picker .phone-wrapper[id="afghanistan"]').click(); cy.get('.phone-picker .phone-wrapper[id="india"]').click(); - cy.get('.selected-phone .country').should('have.text', '+91') - cy.get('.selected-phone > .icon > use').should('have.attr', 'href').and('include', '#in') + cy.get('.selected-phone .country').should('have.text', '+91'); + cy.get('.selected-phone > img').should('have.attr', 'src').and('include', '/in.png'); - let phone_number = '9312672712' + let phone_number = '9312672712'; cy.get('.selected-phone').click().first(); cy.get('.frappe-control[data-fieldname=phone] input') .first() From 938d12b14258fd5fbdb51ed0d2351397d3159df1 Mon Sep 17 00:00:00 2001 From: Noah Jacob Date: Fri, 7 Jan 2022 12:52:09 +0530 Subject: [PATCH 0017/1251] fix: sider --- frappe/database/mariadb/database.py | 4 ++-- frappe/database/postgres/database.py | 4 ++-- frappe/public/js/frappe/form/controls/control.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frappe/database/mariadb/database.py b/frappe/database/mariadb/database.py index 5e838db842..9e0e8e1b51 100644 --- a/frappe/database/mariadb/database.py +++ b/frappe/database/mariadb/database.py @@ -52,8 +52,8 @@ class MariaDBDatabase(Database): 'Barcode': ('longtext', ''), 'Geolocation': ('longtext', ''), 'Duration': ('decimal', '21,9'), - 'Icon': ('varchar', self.VARCHAR_LEN), - 'Phone': ('varchar', self.VARCHAR_LEN) + 'Icon': ('varchar', self.VARCHAR_LEN), + 'Phone': ('varchar', self.VARCHAR_LEN) } def get_connection(self): diff --git a/frappe/database/postgres/database.py b/frappe/database/postgres/database.py index 71b5918d4a..3ad3c10869 100644 --- a/frappe/database/postgres/database.py +++ b/frappe/database/postgres/database.py @@ -62,8 +62,8 @@ class PostgresDatabase(Database): 'Barcode': ('text', ''), 'Geolocation': ('text', ''), 'Duration': ('decimal', '21,9'), - 'Icon': ('varchar', self.VARCHAR_LEN), - 'Phone': ('varchar', self.VARCHAR_LEN) + 'Icon': ('varchar', self.VARCHAR_LEN), + 'Phone': ('varchar', self.VARCHAR_LEN) } def get_connection(self): diff --git a/frappe/public/js/frappe/form/controls/control.js b/frappe/public/js/frappe/form/controls/control.js index 578ddd3276..dad3ed1bec 100644 --- a/frappe/public/js/frappe/form/controls/control.js +++ b/frappe/public/js/frappe/form/controls/control.js @@ -40,7 +40,7 @@ import './multiselect_list'; import './rating'; import './duration'; import './icon'; -import './phone' +import './phone'; frappe.ui.form.make_control = function (opts) { var control_class_name = "Control" + opts.df.fieldtype.replace(/ /g, ""); From b45e5dda63df0bc95341033a5d847cf6f2c27155 Mon Sep 17 00:00:00 2001 From: Noah Jacob Date: Fri, 7 Jan 2022 13:40:03 +0530 Subject: [PATCH 0018/1251] refactor: moved phone_validation to frappe.utils --- frappe/model/base_document.py | 10 +--------- frappe/public/js/frappe/form/controls/phone.js | 2 +- frappe/utils/__init__.py | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index ac87e564ac..b4f1910bbc 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -11,7 +11,6 @@ from frappe.model import display_fieldtypes from frappe.utils import (cint, flt, now, cstr, strip_html, sanitize_html, sanitize_email, cast_fieldtype) from frappe.utils.html_utils import unescape_html -import phonenumbers as ph max_positive_value = { 'smallint': 2 ** 15, @@ -655,14 +654,7 @@ class BaseDocument(object): # data_field options defined in frappe.model.data_field_options for phone_field in self.meta.get_phone_fields(): phone = self.get(phone_field.fieldname) - try: - phone = ph.parse(phone) - except Exception as e: - if e.error_type == 1: - frappe.throw(_("The entered value is not a phone number."), title="Invalid Number") - frappe.throw(_("Please select a country code."), title = _("Country Code Required")) - if not ph.is_valid_number(phone): - frappe.throw('This is not a valid phone number', title = "Invalid Number") + frappe.utils.validate_phone_number_with_isd(phone, throw=True) for data_field in self.meta.get_data_fields(): data = self.get(data_field.fieldname) diff --git a/frappe/public/js/frappe/form/controls/phone.js b/frappe/public/js/frappe/form/controls/phone.js index 308957ccb5..492b75f8c3 100644 --- a/frappe/public/js/frappe/form/controls/phone.js +++ b/frappe/public/js/frappe/form/controls/phone.js @@ -128,7 +128,7 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD change_flag(country_code) { this.selected_icon.find('img').attr('src', 'https://flagcdn.com/h20/'+country_code+'.png') this.$icon = this.selected_icon.find('img'); - // this.$icon.hasClass('hide') && this.$icon.toggleClass('hide'); + this.$icon.hasClass('hide') && this.$icon.toggleClass('hide'); } // country_code for India is 'in' diff --git a/frappe/utils/__init__.py b/frappe/utils/__init__.py index 1b4cdc7922..add55fc238 100644 --- a/frappe/utils/__init__.py +++ b/frappe/utils/__init__.py @@ -17,6 +17,7 @@ from typing import Generator, Iterable from urllib.parse import quote, urlparse from werkzeug.test import Client from redis.exceptions import ConnectionError +import phonenumbers as ph import frappe # utility functions like cint, int, flt, etc. @@ -71,6 +72,21 @@ def extract_email_id(email): email_id = email_id.decode("utf-8", "ignore") return email_id +def validate_phone_number_with_isd(phone, throw=False): + if not phone: + return + try: + phone = ph.parse(phone) + except Exception as e: + if e.error_type == 1: + frappe.throw(frappe._("The entered value is not a phone number."), frappe.InvalidPhoneNumberError, + title=frappe._("Invalid Number")) + frappe.throw(frappe._("Please select a country code."), frappe.InvalidPhoneNumberError, + title = frappe._("Country Code Required")) + if not ph.is_valid_number(phone): + frappe.throw(frappe._("This is not a valid phone number"), frappe.InvalidPhoneNumberError, + title = frappe._("Invalid Number")) + def validate_phone_number(phone_number, throw=False): """Returns True if valid phone number""" if not phone_number: From 8d00c4ff7611363ba8b94bd6f70cc68c58f60cf7 Mon Sep 17 00:00:00 2001 From: Noah Jacob Date: Fri, 7 Jan 2022 14:17:56 +0530 Subject: [PATCH 0019/1251] fix: sider and styling --- cypress/integration/control_phone.js | 2 +- frappe/database/mariadb/database.py | 2 +- .../public/js/frappe/form/controls/phone.js | 21 ++++--- .../js/frappe/phone_picker/phone_picker.js | 58 +++++++++---------- frappe/public/js/frappe/utils/utils.js | 13 +---- frappe/public/scss/common/phone_picker.scss | 2 +- 6 files changed, 45 insertions(+), 53 deletions(-) diff --git a/cypress/integration/control_phone.js b/cypress/integration/control_phone.js index f59ebd2667..952e31a9eb 100644 --- a/cypress/integration/control_phone.js +++ b/cypress/integration/control_phone.js @@ -20,7 +20,7 @@ context('Control Phone', () => { cy.get('.phone-picker .phone-wrapper[id="afghanistan"]').click(); cy.get('.phone-picker .phone-wrapper[id="india"]').click(); cy.get('.selected-phone .country').should('have.text', '+91'); - cy.get('.selected-phone > img').should('have.attr', 'src').and('include', '/in.png'); + cy.get('.selected-phone > img').should('have.attr', 'src').and('include', '/in.svg'); let phone_number = '9312672712'; cy.get('.selected-phone').click().first(); diff --git a/frappe/database/mariadb/database.py b/frappe/database/mariadb/database.py index 21d5a9962c..fde86a7876 100644 --- a/frappe/database/mariadb/database.py +++ b/frappe/database/mariadb/database.py @@ -52,7 +52,7 @@ class MariaDBDatabase(Database): 'Barcode': ('longtext', ''), 'Geolocation': ('longtext', ''), 'Duration': ('decimal', '21,9'), - 'Icon': ('varchar', self.VARCHAR_LEN), + 'Icon': ('varchar', self.VARCHAR_LEN), 'Phone': ('varchar', self.VARCHAR_LEN) } diff --git a/frappe/public/js/frappe/form/controls/phone.js b/frappe/public/js/frappe/form/controls/phone.js index 492b75f8c3..7144b31f1e 100644 --- a/frappe/public/js/frappe/form/controls/phone.js +++ b/frappe/public/js/frappe/form/controls/phone.js @@ -17,7 +17,7 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD this.change_flag(country_code); this.$icon = this.selected_icon.find('svg'); this.$flag = this.selected_icon.find('img'); - if (!this.$icon.hasClass('hide')){ + if (!this.$icon.hasClass('hide')) { this.$icon.toggleClass('hide'); } if (!this.$flag.length) { @@ -28,7 +28,7 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD } else { this.$isd.text(country_isd); } - if(this.$input.val()) { + if (this.$input.val()) { this.set_formatted_input(this.get_country(country) +'-'+ this.$input.val()); } }; @@ -85,7 +85,7 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD this.selected_icon.insertAfter(this.$input); this.selected_icon.append($(``)); this.$isd = this.selected_icon.find('.country'); - if(input_value && input_value.split("-").length == 2) { + if (input_value && input_value.split("-").length == 2) { this.$isd.text(this.value.split("-")[0]); } } @@ -95,7 +95,7 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD super.refresh(); // Previously opened doc values get fetched. - if(!this.value) { + if (!this.value) { this.$input.val(""); this.$wrapper.find('.country').text(""); if (this.selected_icon.find('svg').hasClass('hide')) { @@ -103,30 +103,30 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD this.selected_icon.find('img').addClass('hide'); } } - if(this.value && this.value.split("-").length == 2) { + if (this.value && this.value.split("-").length == 2) { let isd = this.value.split("-")[0]; this.get_country_code_and_change_flag(isd); this.picker.set_country(isd); this.picker.refresh(); if (this.picker.country && this.picker.country !== this.$isd.text()) { - this.$isd.length && this.$isd.text(isd) + this.$isd.length && this.$isd.text(isd); } } } set_formatted_input(value) { - if(value && value.includes('-')) { + if (value && value.includes('-')) { this.set_model_value(value); this.$input.val(value.split("-").pop()); - } else if(this.$isd.text().trim() && this.value) { + } else if (this.$isd.text().trim() && this.value) { let code_number = this.$isd.text() + '-' + value; this.set_model_value(code_number); } } change_flag(country_code) { - this.selected_icon.find('img').attr('src', 'https://flagcdn.com/h20/'+country_code+'.png') + this.selected_icon.find('img').attr('src', 'https://flagcdn.com/'+country_code+'.svg'); this.$icon = this.selected_icon.find('img'); this.$icon.hasClass('hide') && this.$icon.toggleClass('hide'); } @@ -142,8 +142,7 @@ frappe.ui.form.ControlPhone = class ControlPhone extends frappe.ui.form.ControlD if (!flag.length) { this.selected_icon.prepend(this.get_country_flag(country)); this.selected_icon.find('svg').addClass('hide'); - } - else { + } else { this.change_flag(code); } } diff --git a/frappe/public/js/frappe/phone_picker/phone_picker.js b/frappe/public/js/frappe/phone_picker/phone_picker.js index 34241be915..cbc5df4b12 100644 --- a/frappe/public/js/frappe/phone_picker/phone_picker.js +++ b/frappe/public/js/frappe/phone_picker/phone_picker.js @@ -34,38 +34,38 @@ class Picker { setup_countries() { Object.entries(this.countries).forEach(([country, info]) => { - if (!info.isd) { - return - } - let $country = $(`
${frappe.utils.flag(info.code)} - ${country} (${info.isd})
`); - this.phone_wrapper.append($country); - const set_values = () => { - this.set_country(country); - this.update_icon_selected(); - }; - $country.on('click', () => { - set_values(); - }); - $country.hover(() => { - $country.toggleClass("bg-gray-100"); - }); - this.search_input.keydown((e) => { - const key_code = e.keyCode; - if ([13].includes(key_code)) { - e.preventDefault(); - set_values(); + if (!info.isd) { + return; } - }); - this.search_input.keyup((e) => { - e.preventDefault(); - this.filter_icons(); - }); + let $country = $(`
${frappe.utils.flag(info.code)} + ${country} (${info.isd})
`); + this.phone_wrapper.append($country); + const set_values = () => { + this.set_country(country); + this.update_icon_selected(); + }; + $country.on('click', () => { + set_values(); + }); + $country.hover(() => { + $country.toggleClass("bg-gray-100"); + }); + this.search_input.keydown((e) => { + const key_code = e.keyCode; + if ([13].includes(key_code)) { + e.preventDefault(); + set_values(); + } + }); + this.search_input.keyup((e) => { + e.preventDefault(); + this.filter_icons(); + }); - this.search_input.on('search', () => { - this.filter_icons(); + this.search_input.on('search', () => { + this.filter_icons(); + }); }); - }); } filter_icons() { diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index c7739c82a1..3cde43f529 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -1164,17 +1164,10 @@ Object.assign(frappe.utils, { `; }, - flag(icon_name, size="sm", icon_class="", icon_style="", svg_class="") { - let size_class = ""; - - if (typeof size == "object") { - icon_style += ` width: ${size.width}; height: ${size.height}`; - } else { - size_class = `flag-${size}`; - } + flag(country_code) { return `` + src="https://flagcdn.com/${country_code}.svg" + width="20" height="15">`; }, make_chart(wrapper, custom_options={}) { diff --git a/frappe/public/scss/common/phone_picker.scss b/frappe/public/scss/common/phone_picker.scss index cc3387ecb0..dea364d157 100644 --- a/frappe/public/scss/common/phone_picker.scss +++ b/frappe/public/scss/common/phone_picker.scss @@ -75,7 +75,7 @@ height: 20px; border-radius: 5px; position: absolute; - top: calc(50% + 2.6px); + top: calc(50% + 2px); left: 8px; content: ' '; align-items: center; From 69335b23ce675f999d00a8007743acab9e3fbadd Mon Sep 17 00:00:00 2001 From: rajkris Date: Mon, 10 Jan 2022 10:38:31 +0000 Subject: [PATCH 0020/1251] add reset password link expiry feature --- .../doctype/system_settings/system_settings.json | 12 ++++++++++-- frappe/core/doctype/user/user.json | 9 ++++++++- frappe/core/doctype/user/user.py | 12 ++++++++++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/frappe/core/doctype/system_settings/system_settings.json b/frappe/core/doctype/system_settings/system_settings.json index 61410fb1a8..3fcd69a704 100644 --- a/frappe/core/doctype/system_settings/system_settings.json +++ b/frappe/core/doctype/system_settings/system_settings.json @@ -42,6 +42,7 @@ "allow_error_traceback", "strip_exif_metadata_from_uploaded_images", "password_settings", + "reset_password_link_expiry_seconds", "logout_on_password_reset", "force_user_to_reset_password", "password_reset_limit", @@ -485,7 +486,14 @@ "fieldtype": "Select", "label": "First Day of the Week", "options": "Sunday\nMonday\nTuesday\nWednesday\nThursday\nFriday\nSaturday" - } + }, + { + "default": "1200", + "fieldname": "reset_password_link_expiry_seconds", + "fieldtype": "Int", + "label": "Reset Password Link Expiry Seconds", + "non_negative": 1 + } ], "icon": "fa fa-cog", "issingle": 1, @@ -509,4 +517,4 @@ "sort_order": "ASC", "states": [], "track_changes": 1 -} \ No newline at end of file +} diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json index a47f539466..a09d9c794d 100644 --- a/frappe/core/doctype/user/user.json +++ b/frappe/core/doctype/user/user.json @@ -43,6 +43,7 @@ "new_password", "logout_all_sessions", "reset_password_key", + "reset_password_key_datetime", "last_password_reset_date", "redirect_url", "document_follow_notifications_section", @@ -606,7 +607,13 @@ "fieldtype": "Link", "label": "Module Profile", "options": "Module Profile" - } + }, + { + "fieldname": "reset_password_key_datetime", + "fieldtype": "Datetime", + "label": "Reset Password Key Generation Datetime", + "read_only": 1 + } ], "icon": "fa fa-user", "idx": 413, diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index ef7845d3b0..254e15f101 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -1,6 +1,7 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE from bs4 import BeautifulSoup +from datetime import timedelta import frappe import frappe.share import frappe.defaults @@ -265,6 +266,7 @@ class User(Document): key = random_string(32) self.db_set("reset_password_key", key) + self.db_set("reset_password_key_datetime", now_datetime()) url = "/update-password?key=" + key if password_expired: @@ -728,8 +730,14 @@ def _get_user_for_update_password(key, old_password): # verify old password result = frappe._dict() if key: - result.user = frappe.db.get_value("User", {"reset_password_key": key}) - if not result.user: + user = frappe.db.get_value("User", {"reset_password_key": key}, ["name", "reset_password_key_datetime"]) + result.user, res_pass_key_datetime = user if user else (None, None) + + if result.user: + res_pass_link_exp_sec = frappe.db.get_single_value("System Settings", "reset_password_link_expiry_seconds") + if res_pass_link_exp_sec and now_datetime() > res_pass_key_datetime + timedelta(seconds=res_pass_link_exp_sec): + result.message = _("The Link specified has been expired") + else: result.message = _("The Link specified has either been used before or Invalid") elif old_password: From ceae31f6fe3ad155936e2f8e6493369ba534b37f Mon Sep 17 00:00:00 2001 From: rajkris Date: Mon, 10 Jan 2022 10:38:31 +0000 Subject: [PATCH 0021/1251] feat: add reset password link expiry feature --- .../doctype/system_settings/system_settings.json | 12 ++++++++++-- frappe/core/doctype/user/user.json | 9 ++++++++- frappe/core/doctype/user/user.py | 12 ++++++++++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/frappe/core/doctype/system_settings/system_settings.json b/frappe/core/doctype/system_settings/system_settings.json index 61410fb1a8..3fcd69a704 100644 --- a/frappe/core/doctype/system_settings/system_settings.json +++ b/frappe/core/doctype/system_settings/system_settings.json @@ -42,6 +42,7 @@ "allow_error_traceback", "strip_exif_metadata_from_uploaded_images", "password_settings", + "reset_password_link_expiry_seconds", "logout_on_password_reset", "force_user_to_reset_password", "password_reset_limit", @@ -485,7 +486,14 @@ "fieldtype": "Select", "label": "First Day of the Week", "options": "Sunday\nMonday\nTuesday\nWednesday\nThursday\nFriday\nSaturday" - } + }, + { + "default": "1200", + "fieldname": "reset_password_link_expiry_seconds", + "fieldtype": "Int", + "label": "Reset Password Link Expiry Seconds", + "non_negative": 1 + } ], "icon": "fa fa-cog", "issingle": 1, @@ -509,4 +517,4 @@ "sort_order": "ASC", "states": [], "track_changes": 1 -} \ No newline at end of file +} diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json index a47f539466..a09d9c794d 100644 --- a/frappe/core/doctype/user/user.json +++ b/frappe/core/doctype/user/user.json @@ -43,6 +43,7 @@ "new_password", "logout_all_sessions", "reset_password_key", + "reset_password_key_datetime", "last_password_reset_date", "redirect_url", "document_follow_notifications_section", @@ -606,7 +607,13 @@ "fieldtype": "Link", "label": "Module Profile", "options": "Module Profile" - } + }, + { + "fieldname": "reset_password_key_datetime", + "fieldtype": "Datetime", + "label": "Reset Password Key Generation Datetime", + "read_only": 1 + } ], "icon": "fa fa-user", "idx": 413, diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index ef7845d3b0..254e15f101 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -1,6 +1,7 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE from bs4 import BeautifulSoup +from datetime import timedelta import frappe import frappe.share import frappe.defaults @@ -265,6 +266,7 @@ class User(Document): key = random_string(32) self.db_set("reset_password_key", key) + self.db_set("reset_password_key_datetime", now_datetime()) url = "/update-password?key=" + key if password_expired: @@ -728,8 +730,14 @@ def _get_user_for_update_password(key, old_password): # verify old password result = frappe._dict() if key: - result.user = frappe.db.get_value("User", {"reset_password_key": key}) - if not result.user: + user = frappe.db.get_value("User", {"reset_password_key": key}, ["name", "reset_password_key_datetime"]) + result.user, res_pass_key_datetime = user if user else (None, None) + + if result.user: + res_pass_link_exp_sec = frappe.db.get_single_value("System Settings", "reset_password_link_expiry_seconds") + if res_pass_link_exp_sec and now_datetime() > res_pass_key_datetime + timedelta(seconds=res_pass_link_exp_sec): + result.message = _("The Link specified has been expired") + else: result.message = _("The Link specified has either been used before or Invalid") elif old_password: From 4cf462a610e0eeea0b91eb08e79922e8c193876e Mon Sep 17 00:00:00 2001 From: rajkris Date: Mon, 10 Jan 2022 23:26:22 +0530 Subject: [PATCH 0022/1251] test: add test case for link expiry --- frappe/core/doctype/user/test_user.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/frappe/core/doctype/user/test_user.py b/frappe/core/doctype/user/test_user.py index d1291acfc4..608f79c7b4 100644 --- a/frappe/core/doctype/user/test_user.py +++ b/frappe/core/doctype/user/test_user.py @@ -1,6 +1,7 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE import json +import time import unittest from unittest.mock import patch @@ -371,6 +372,18 @@ class TestUser(unittest.TestCase): doc = frappe.response.docs[0] self.assertListEqual(doc.get("__onload").get('all_modules', []), [m.get("module_name") for m in get_modules_from_all_apps()]) + + def test_reset_password_link_expiry(self): + new_password = "new_password" + + frappe.db.set_value("System Settings", "System Settings", "reset_password_link_expiry_seconds", 1) + frappe.db.commit() + + frappe.set_user("testpassword@example.com") + test_user = frappe.get_doc("User", "testpassword@example.com") + test_user.reset_password() + time.sleep(1) # sleep for 1 sec to expire the reset link + self.assertEqual(update_password(new_password, key=test_user.reset_password_key), "The Link specified has been expired") def delete_contact(user): From f68b623b3bbda118763660b2fb77cbab475cd238 Mon Sep 17 00:00:00 2001 From: rajkris Date: Mon, 10 Jan 2022 23:51:15 +0530 Subject: [PATCH 0023/1251] style: add comment --- frappe/core/doctype/user/test_user.py | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/core/doctype/user/test_user.py b/frappe/core/doctype/user/test_user.py index 608f79c7b4..fd99f51be9 100644 --- a/frappe/core/doctype/user/test_user.py +++ b/frappe/core/doctype/user/test_user.py @@ -376,6 +376,7 @@ class TestUser(unittest.TestCase): def test_reset_password_link_expiry(self): new_password = "new_password" + # set the reset password expir to 1 second frappe.db.set_value("System Settings", "System Settings", "reset_password_link_expiry_seconds", 1) frappe.db.commit() From 4ee99ce7e159018d654cf6f818e1d2c080430f3e Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Thu, 13 Jan 2022 11:45:45 +0530 Subject: [PATCH 0024/1251] feat: Set expiry to document link --- frappe/model/document.py | 2 +- frappe/public/icons/timeless/symbol-defs.svg | 3 ++ frappe/public/js/frappe/form/controls/data.js | 14 ++++++- frappe/public/js/frappe/form/controls/date.js | 2 + frappe/public/js/frappe/form/form.js | 41 +++++++++++++++++++ frappe/public/js/frappe/form/toolbar.js | 7 ++++ frappe/public/scss/common/controls.scss | 26 ++++++++---- frappe/public/scss/common/css_variables.scss | 2 +- frappe/www/printview.html | 13 ++++-- frappe/www/printview.py | 11 +++-- 10 files changed, 104 insertions(+), 17 deletions(-) diff --git a/frappe/model/document.py b/frappe/model/document.py index ec83f5f7b0..633c6531b4 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -1286,7 +1286,7 @@ class Document(BaseDocument): "reference_docname": self.name, "status": "Active", "key": key - }) + }, cache=True) def get_liked_by(self): liked_by = getattr(self, "_liked_by", None) diff --git a/frappe/public/icons/timeless/symbol-defs.svg b/frappe/public/icons/timeless/symbol-defs.svg index b878f713e9..dcba913836 100644 --- a/frappe/public/icons/timeless/symbol-defs.svg +++ b/frappe/public/icons/timeless/symbol-defs.svg @@ -712,4 +712,7 @@ + + + diff --git a/frappe/public/js/frappe/form/controls/data.js b/frappe/public/js/frappe/form/controls/data.js index f4c9849528..2323ccee2f 100644 --- a/frappe/public/js/frappe/form/controls/data.js +++ b/frappe/public/js/frappe/form/controls/data.js @@ -58,7 +58,7 @@ frappe.ui.form.ControlData = class ControlData extends frappe.ui.form.ControlInp this.has_input = true; this.bind_change_event(); this.setup_autoname_check(); - + this.setup_copy_button(); if (this.df.options == 'URL') { this.setup_url_field(); } @@ -112,6 +112,18 @@ frappe.ui.form.ControlData = class ControlData extends frappe.ui.form.ControlInp }); } + setup_copy_button() { + if (this.df.with_copy_button) { + this.$wrapper.find('.control-input').append( + `` + ).find(".action-btn").click(() => { + frappe.utils.copy_to_clipboard(this.value); + }); + } + } + setup_barcode_field() { this.$wrapper.find('.control-input').append( ` diff --git a/frappe/public/js/frappe/form/controls/date.js b/frappe/public/js/frappe/form/controls/date.js index 28e7f2a478..5667fd05a4 100644 --- a/frappe/public/js/frappe/form/controls/date.js +++ b/frappe/public/js/frappe/form/controls/date.js @@ -62,6 +62,8 @@ frappe.ui.form.ControlDate = class ControlDate extends frappe.ui.form.ControlDat dateFormat: date_format, startDate: this.get_start_date(), keyboardNav: false, + minDate: this.df.min_date, + maxDate: this.df.max_date, onSelect: () => { this.$input.trigger('change'); }, diff --git a/frappe/public/js/frappe/form/form.js b/frappe/public/js/frappe/form/form.js index 8af1631b48..3ce7ff5777 100644 --- a/frappe/public/js/frappe/form/form.js +++ b/frappe/public/js/frappe/form/form.js @@ -1139,6 +1139,47 @@ frappe.ui.form.Form = class FrappeForm { }); } + share_doc_link() { + const share_document_url_dialog = new frappe.ui.Dialog({ + fields: [{ + fieldname: "visibility", + label: "Visibility", + fieldtype: "Select", + options: "Public\nPrivate", + default: "Public", + read_only_depends_on: "eval: doc.link" + }, { + fieldname: "link_expiration_date", + label: "Link Expiration Date", + fieldtype: "Date", + min_date: new Date(), + read_only_depends_on: "eval: doc.link" + }, { + fieldtype: "Button", + label: "Generate Link", + click: () => { + this.call("get_new_document_key").then(res => { + let key = res.message; + share_document_url_dialog.set_value("link", this.get_share_link(key)) + }) + } + }, { + fieldname: "link", + label: "Link", + fieldtype: "Data", + depends_on: "eval: doc.link", + with_copy_button: true + }], + size: "small", + title: __("Share {} Link", [this.doctype]), + }) + share_document_url_dialog.show() + } + + get_share_link(key) { + return `${window.origin}/${this.doctype}/${this.docname}?key=${key}`; + } + copy_doc(onload, from_amend) { this.validate_form_action("Create"); var newdoc = frappe.model.copy_doc(this.doc, from_amend); diff --git a/frappe/public/js/frappe/form/toolbar.js b/frappe/public/js/frappe/form/toolbar.js index ffcfc349ef..f5153eb67e 100644 --- a/frappe/public/js/frappe/form/toolbar.js +++ b/frappe/public/js/frappe/form/toolbar.js @@ -265,6 +265,13 @@ frappe.ui.form.Toolbar = class Toolbar { }); } + // share print view link + if (frappe.model.can_email(null, me.frm) && me.frm.doc.docstatus < 2) { + this.page.add_menu_item(__("Share Link", [me.frm.doctype]), function() { + me.frm.share_doc_link(); + }, true); + } + // go to field modal this.page.add_menu_item(__("Jump to field"), function() { me.show_jump_to_field_dialog(); diff --git a/frappe/public/scss/common/controls.scss b/frappe/public/scss/common/controls.scss index 954916c911..3cbc447d8f 100644 --- a/frappe/public/scss/common/controls.scss +++ b/frappe/public/scss/common/controls.scss @@ -288,13 +288,25 @@ textarea.form-control { position: relative; } -.link-btn { - position: absolute; - top: 4px; - right: 4px; - padding: 3px; - display: none; - z-index: 3; +.frappe-control { + .action-btn { + position: absolute; + top: 4px; + right: 4px; + padding: 3px; + z-index: 3; + } + + button.action-btn { + padding: 3px 5px; + background-color: var(--fg-color); + } + + .link-btn { + @extend .action-btn; + background-color: none; + display: none; + } } .phone-btn { diff --git a/frappe/public/scss/common/css_variables.scss b/frappe/public/scss/common/css_variables.scss index a14c19af2a..4293d6834b 100644 --- a/frappe/public/scss/common/css_variables.scss +++ b/frappe/public/scss/common/css_variables.scss @@ -219,7 +219,7 @@ --border-radius-full: 999px; --primary-color: #2490EF; - --btn-height: 28px; + --btn-height: 30px; // Checkbox --checkbox-right-margin: var(--margin-xs); diff --git a/frappe/www/printview.html b/frappe/www/printview.html index 3f8d4201fb..691c0cf3cf 100644 --- a/frappe/www/printview.html +++ b/frappe/www/printview.html @@ -11,11 +11,16 @@ - ").appendTo(this.body); +
" + ).appendTo(this.body); const table_columns = [ [__("Document Type"), 150], [__("Role"), 170], [__("Level"), 40], [__("Permissions"), 350], - ["", 40] + ["", 40], ]; table_columns.forEach((col) => { @@ -236,9 +250,9 @@ frappe.PermissionEngine = class PermissionEngine { let perm_cell = this.add_cell(row, d, "permissions"); let perm_container = $("
").appendTo(perm_cell); - this.rights.forEach(r => { - if (!d.is_submittable && ['submit', 'cancel', 'amend'].includes(r)) return; - if (d.in_create && ['create', 'write', 'delete'].includes(r)) return; + this.rights.forEach((r) => { + if (!d.is_submittable && ["submit", "cancel", "amend"].includes(r)) return; + if (d.in_create && ["create", "write", "delete"].includes(r)) return; this.add_check(perm_container, d, r); }); @@ -248,7 +262,8 @@ frappe.PermissionEngine = class PermissionEngine { } add_cell(row, d, fieldname) { - return $("").appendTo(row) + return $("") + .appendTo(row) .attr("data-fieldname", fieldname) .addClass("pt-4") .html(__(d[fieldname])); @@ -266,19 +281,20 @@ frappe.PermissionEngine = class PermissionEngine {

${__(description)}

- `) + ` + ) .appendTo(cell) .attr("data-fieldname", fieldname); - checkbox.find("input") + checkbox + .find("input") .prop("checked", d[fieldname] ? true : false) .attr("data-ptype", fieldname) .attr("data-role", d.role) .attr("data-permlevel", d.permlevel) .attr("data-doctype", d.parent); - checkbox.find("label") - .css("text-transform", "capitalize"); + checkbox.find("label").css("text-transform", "capitalize"); return checkbox; } @@ -290,8 +306,23 @@ frappe.PermissionEngine = class PermissionEngine { } get rights() { - return ["select", "read", "write", "create", "delete", "submit", "cancel", "amend", - "print", "email", "report", "import", "export", "set_user_permissions", "share"]; + return [ + "select", + "read", + "write", + "create", + "delete", + "submit", + "cancel", + "amend", + "print", + "email", + "report", + "import", + "export", + "set_user_permissions", + "share", + ]; } set_show_users(cell, role) { @@ -305,22 +336,29 @@ frappe.PermissionEngine = class PermissionEngine { page: "permission_manager", method: "get_users_with_role", args: { - role: role + role: role, }, callback: function (r) { r.message = $.map(r.message, function (p) { return $.format('{1}', [p, p]); }); - frappe.msgprint(__("Users with role {0}:", [__(role)]) - + "
" + r.message.join("
")); - } + frappe.msgprint( + __("Users with role {0}:", [__(role)]) + + "
" + + r.message.join("
") + ); + }, }); return false; }); } add_delete_button(row, d) { - $(``) + $( + `` + ) .appendTo($(``).appendTo(row)) .attr("data-doctype", d.parent) .attr("data-role", d.role) @@ -333,7 +371,7 @@ frappe.PermissionEngine = class PermissionEngine { args: { doctype: d.parent, role: d.role, - permlevel: d.permlevel + permlevel: d.permlevel, }, callback: (r) => { if (r.exc) { @@ -341,7 +379,7 @@ frappe.PermissionEngine = class PermissionEngine { } else { this.refresh(); } - } + }, }); }); } @@ -350,7 +388,7 @@ frappe.PermissionEngine = class PermissionEngine { let me = this; this.body.on("click", ".show-user-permissions", () => { frappe.route_options = { allow: this.get_doctype() || "" }; - frappe.set_route('List', 'User Permission'); + frappe.set_route("List", "User Permission"); }); this.body.on("click", "input[type='checkbox']", function () { @@ -361,7 +399,7 @@ frappe.PermissionEngine = class PermissionEngine { permlevel: chk.attr("data-permlevel"), doctype: chk.attr("data-doctype"), ptype: chk.attr("data-ptype"), - value: chk.prop("checked") ? 1 : 0 + value: chk.prop("checked") ? 1 : 0, }; return frappe.call({ module: "frappe.core", @@ -376,7 +414,7 @@ frappe.PermissionEngine = class PermissionEngine { } else { me.get_perm(args.role)[args.ptype] = args.value; } - } + }, }); }); } @@ -389,19 +427,30 @@ frappe.PermissionEngine = class PermissionEngine { title: __("Add New Permission Rule"), fields: [ { - fieldtype: "Select", label: __("Document Type"), - options: this.options.doctypes, reqd: 1, fieldname: "parent" + fieldtype: "Select", + label: __("Document Type"), + options: this.options.doctypes, + reqd: 1, + fieldname: "parent", }, { - fieldtype: "Select", label: __("Role"), - options: this.options.roles, reqd: 1, fieldname: "role" + fieldtype: "Select", + label: __("Role"), + options: this.options.roles, + reqd: 1, + fieldname: "role", }, { - fieldtype: "Select", label: __("Permission Level"), - options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], reqd: 1, fieldname: "permlevel", - description: __("Level 0 is for document level permissions, higher levels for field level permissions.") - } - ] + fieldtype: "Select", + label: __("Permission Level"), + options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + reqd: 1, + fieldname: "permlevel", + description: __( + "Level 0 is for document level permissions, higher levels for field level permissions." + ), + }, + ], }); if (this.get_doctype()) { d.set_value("parent", this.get_doctype()); @@ -412,7 +461,7 @@ frappe.PermissionEngine = class PermissionEngine { d.get_input("role").prop("disabled", true); } d.set_value("permlevel", "0"); - d.set_primary_action(__('Add'), () => { + d.set_primary_action(__("Add"), () => { let args = d.get_values(); if (!args) { return; @@ -428,7 +477,7 @@ frappe.PermissionEngine = class PermissionEngine { } else { this.refresh(); } - } + }, }); d.hide(); }); @@ -439,13 +488,11 @@ frappe.PermissionEngine = class PermissionEngine { } make_reset_button() { - this.page.set_secondary_action( - __("Restore Original Permissions"), - () => { - this.get_standard_permissions((data) => { - this.reset_std_permissions(data); - }); + this.page.set_secondary_action(__("Restore Original Permissions"), () => { + this.get_standard_permissions((data) => { + this.reset_std_permissions(data); }); + }); } get_perm(role) { @@ -455,7 +502,9 @@ frappe.PermissionEngine = class PermissionEngine { } get_link_fields(doctype) { - return frappe.get_children("DocType", doctype, "fields", - { fieldtype: "Link", options: ["not in", ["User", '[Select]']] }); + return frappe.get_children("DocType", doctype, "fields", { + fieldtype: "Link", + options: ["not in", ["User", "[Select]"]], + }); } }; diff --git a/frappe/core/page/recorder/recorder.js b/frappe/core/page/recorder/recorder.js index f1f74daf71..83b8d1a636 100644 --- a/frappe/core/page/recorder/recorder.js +++ b/frappe/core/page/recorder/recorder.js @@ -1,28 +1,28 @@ -frappe.pages['recorder'].on_page_load = function(wrapper) { +frappe.pages["recorder"].on_page_load = function (wrapper) { frappe.ui.make_app_page({ parent: wrapper, - title: __('Recorder'), + title: __("Recorder"), single_column: true, - card_layout: true + card_layout: true, }); frappe.recorder = new Recorder(wrapper); - $(wrapper).bind('show', function() { + $(wrapper).bind("show", function () { frappe.recorder.show(); }); - frappe.require('recorder.bundle.js'); + frappe.require("recorder.bundle.js"); }; class Recorder { constructor(wrapper) { this.wrapper = $(wrapper); - this.container = this.wrapper.find('.layout-main-section'); + this.container = this.wrapper.find(".layout-main-section"); this.container.append($('
')); } show() { if (!this.view || this.view.$route.name == "recorder-detail") return; - this.view.$router.replace({name: "recorder-detail"}); + this.view.$router.replace({ name: "recorder-detail" }); } } diff --git a/frappe/core/report/permitted_documents_for_user/permitted_documents_for_user.js b/frappe/core/report/permitted_documents_for_user/permitted_documents_for_user.js index 195f25f533..f840a49c92 100644 --- a/frappe/core/report/permitted_documents_for_user/permitted_documents_for_user.js +++ b/frappe/core/report/permitted_documents_for_user/permitted_documents_for_user.js @@ -2,33 +2,33 @@ // MIT License. See license.txt frappe.query_reports["Permitted Documents For User"] = { - "filters": [ + filters: [ { - "fieldname": "user", - "label": __("User"), - "fieldtype": "Link", - "options": "User", - "reqd": 1 + fieldname: "user", + label: __("User"), + fieldtype: "Link", + options: "User", + reqd: 1, }, { - "fieldname": "doctype", - "label": __("DocType"), - "fieldtype": "Link", - "options": "DocType", - "reqd": 1, - "get_query": function () { + fieldname: "doctype", + label: __("DocType"), + fieldtype: "Link", + options: "DocType", + reqd: 1, + get_query: function () { return { - "query": "frappe.core.report.permitted_documents_for_user.permitted_documents_for_user.query_doctypes", - "filters": { - "user": frappe.query_report.get_filter_value('user') - } - } - } + query: "frappe.core.report.permitted_documents_for_user.permitted_documents_for_user.query_doctypes", + filters: { + user: frappe.query_report.get_filter_value("user"), + }, + }; + }, }, { - "fieldname": "show_permissions", - "label": __("Show Permissions"), - "fieldtype": "Check" - } - ] -} + fieldname: "show_permissions", + label: __("Show Permissions"), + fieldtype: "Check", + }, + ], +}; diff --git a/frappe/core/report/transaction_log_report/transaction_log_report.js b/frappe/core/report/transaction_log_report/transaction_log_report.js index 54ecf3fcf1..3c7261306d 100644 --- a/frappe/core/report/transaction_log_report/transaction_log_report.js +++ b/frappe/core/report/transaction_log_report/transaction_log_report.js @@ -3,9 +3,9 @@ /* eslint-disable */ frappe.query_reports["Transaction Log Report"] = { - onload: function(query_report) { - query_report.add_make_chart_button = function() { + onload: function (query_report) { + query_report.add_make_chart_button = function () { // }; - } -} + }, +}; diff --git a/frappe/core/web_form/edit_profile/edit_profile.js b/frappe/core/web_form/edit_profile/edit_profile.js index 699703c579..8f56ebb353 100644 --- a/frappe/core/web_form/edit_profile/edit_profile.js +++ b/frappe/core/web_form/edit_profile/edit_profile.js @@ -1,3 +1,3 @@ -frappe.ready(function() { +frappe.ready(function () { // bind events here -}) \ No newline at end of file +}); diff --git a/frappe/custom/doctype/client_script/client_script.js b/frappe/custom/doctype/client_script/client_script.js index 18786c62cf..67bb0083c8 100644 --- a/frappe/custom/doctype/client_script/client_script.js +++ b/frappe/custom/doctype/client_script/client_script.js @@ -1,46 +1,49 @@ // Copyright (c) 2016, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Client Script', { +frappe.ui.form.on("Client Script", { setup(frm) { frm.get_field("sample").html(SAMPLE_HTML); }, refresh(frm) { if (frm.doc.dt && frm.doc.script) { - frm.add_custom_button(__('Go to {0}', [frm.doc.dt]), - () => frappe.set_route('List', frm.doc.dt, 'List')); + frm.add_custom_button(__("Go to {0}", [frm.doc.dt]), () => + frappe.set_route("List", frm.doc.dt, "List") + ); } - if (frm.doc.view == 'Form') { - frm.add_custom_button(__('Add script for Child Table'), () => { + if (frm.doc.view == "Form") { + frm.add_custom_button(__("Add script for Child Table"), () => { frappe.model.with_doctype(frm.doc.dt, () => { - const child_tables = frappe.meta.get_docfields(frm.doc.dt, null, { - fieldtype: 'Table' - }).map(df => df.options); + const child_tables = frappe.meta + .get_docfields(frm.doc.dt, null, { + fieldtype: "Table", + }) + .map((df) => df.options); const d = new frappe.ui.Dialog({ - title: __('Select Child Table'), + title: __("Select Child Table"), fields: [ { - label: __('Select Child Table'), - fieldtype: 'Link', - fieldname: 'cdt', - options: 'DocType', + label: __("Select Child Table"), + fieldtype: "Link", + fieldname: "cdt", + options: "DocType", get_query: () => { return { filters: { istable: 1, - name: ['in', child_tables] - } + name: ["in", child_tables], + }, }; - } - } + }, + }, ], primary_action: ({ cdt }) => { - cdt = d.get_field('cdt').value; + cdt = d.get_field("cdt").value; frm.events.add_script_for_doctype(frm, cdt); d.hide(); - } + }, }); d.show(); @@ -48,39 +51,39 @@ frappe.ui.form.on('Client Script', { }); if (!frm.is_new()) { - frm.add_custom_button(__('Compare Versions'), () => { + frm.add_custom_button(__("Compare Versions"), () => { new frappe.ui.DiffView("Client Script", "script", frm.doc.name); }); } } - frm.set_query('dt', { + frm.set_query("dt", { filters: { - istable: 0 - } + istable: 0, + }, }); }, dt(frm) { - frm.toggle_display('view', !frappe.boot.single_types.includes(frm.doc.dt)); + frm.toggle_display("view", !frappe.boot.single_types.includes(frm.doc.dt)); if (!frm.doc.script) { frm.events.add_script_for_doctype(frm, frm.doc.dt); } if (frm.doc.script && !frm.doc.script.includes(frm.doc.dt)) { - frm.doc.script = ''; + frm.doc.script = ""; frm.events.add_script_for_doctype(frm, frm.doc.dt); } }, view(frm) { - let has_form_boilerplate = frm.doc.script.includes('frappe.ui.form.on') - if (frm.doc.view === 'List' && has_form_boilerplate) { - frm.set_value('script', ''); + let has_form_boilerplate = frm.doc.script.includes("frappe.ui.form.on"); + if (frm.doc.view === "List" && has_form_boilerplate) { + frm.set_value("script", ""); } - if (frm.doc.view === 'Form' && !has_form_boilerplate) { - frm.trigger('dt'); + if (frm.doc.view === "Form" && !has_form_boilerplate) { + frm.trigger("dt"); } }, @@ -93,12 +96,12 @@ frappe.ui.form.on('${doctype}', { } }) `.trim(); - let script = (frm.doc.script || ''); + let script = frm.doc.script || ""; if (script) { - script += '\n\n'; + script += "\n\n"; } - frm.set_value('script', script + boilerplate); - } + frm.set_value("script", script + boilerplate); + }, }); const SAMPLE_HTML = `

Client Script Help

diff --git a/frappe/custom/doctype/client_script/ui_test_client_script.js b/frappe/custom/doctype/client_script/ui_test_client_script.js index 022f677151..0d202d697c 100644 --- a/frappe/custom/doctype/client_script/ui_test_client_script.js +++ b/frappe/custom/doctype/client_script/ui_test_client_script.js @@ -12,14 +12,14 @@ context("Client Script", () => { dt: "ToDo", view: "Form", enabled: 1, - script: `console.log('todo form script')` + script: `console.log('todo form script')`, }, true ); cy.visit("/app/todo/new", { onBeforeLoad(win) { cy.spy(win.console, "log").as("consoleLog"); - } + }, }); cy.get("@consoleLog").should("be.calledWith", "todo form script"); }); @@ -32,14 +32,14 @@ context("Client Script", () => { dt: "ToDo", view: "List", enabled: 1, - script: `console.log('todo list script')` + script: `console.log('todo list script')`, }, true ); cy.visit("/app/todo", { onBeforeLoad(win) { cy.spy(win.console, "log").as("consoleLog"); - } + }, }); cy.get("@consoleLog").should("be.calledWith", "todo list script"); }); @@ -52,19 +52,16 @@ context("Client Script", () => { dt: "ToDo", view: "List", enabled: 0, - script: `console.log('todo disabled script')` + script: `console.log('todo disabled script')`, }, true ); cy.visit("/app/todo", { onBeforeLoad(win) { cy.spy(win.console, "log").as("consoleLog"); - } + }, }); - cy.get("@consoleLog").should( - "not.be.calledWith", - "todo disabled script" - ); + cy.get("@consoleLog").should("not.be.calledWith", "todo disabled script"); }); it("should run multiple scripts", () => { @@ -75,7 +72,7 @@ context("Client Script", () => { dt: "ToDo", view: "Form", enabled: 1, - script: `console.log('todo form script 1')` + script: `console.log('todo form script 1')`, }, true ); @@ -86,14 +83,14 @@ context("Client Script", () => { dt: "ToDo", view: "Form", enabled: 1, - script: `console.log('todo form script 2')` + script: `console.log('todo form script 2')`, }, true ); cy.visit("/app/todo/new", { onBeforeLoad(win) { cy.spy(win.console, "log").as("consoleLog"); - } + }, }); cy.get("@consoleLog").should("be.calledWith", "todo form script 1"); cy.get("@consoleLog").should("be.calledWith", "todo form script 2"); diff --git a/frappe/custom/doctype/custom_field/custom_field.js b/frappe/custom/doctype/custom_field/custom_field.js index c59fabeaa6..fba19ca45e 100644 --- a/frappe/custom/doctype/custom_field/custom_field.js +++ b/frappe/custom/doctype/custom_field/custom_field.js @@ -4,88 +4,99 @@ // Refresh // -------- -frappe.ui.form.on('Custom Field', { - setup: function(frm) { - frm.set_query('dt', function(doc) { +frappe.ui.form.on("Custom Field", { + setup: function (frm) { + frm.set_query("dt", function (doc) { var filters = [ - ['DocType', 'issingle', '=', 0], - ['DocType', 'custom', '=', 0], - ['DocType', 'name', 'not in', frappe.model.core_doctypes_list], - ['DocType', 'restrict_to_domain', 'in', frappe.boot.active_domains] + ["DocType", "issingle", "=", 0], + ["DocType", "custom", "=", 0], + ["DocType", "name", "not in", frappe.model.core_doctypes_list], + ["DocType", "restrict_to_domain", "in", frappe.boot.active_domains], ]; - if(frappe.session.user!=="Administrator") { - filters.push(['DocType', 'module', 'not in', ['Core', 'Custom']]) + if (frappe.session.user !== "Administrator") { + filters.push(["DocType", "module", "not in", ["Core", "Custom"]]); } return { - "filters": filters - } + filters: filters, + }; }); }, - refresh: function(frm) { - frm.toggle_enable('dt', frm.doc.__islocal); - frm.trigger('dt'); - frm.toggle_reqd('label', !frm.doc.fieldname); + refresh: function (frm) { + frm.toggle_enable("dt", frm.doc.__islocal); + frm.trigger("dt"); + frm.toggle_reqd("label", !frm.doc.fieldname); }, - dt: function(frm) { - if(!frm.doc.dt) { - set_field_options('insert_after', ''); + dt: function (frm) { + if (!frm.doc.dt) { + set_field_options("insert_after", ""); return; } var insert_after = frm.doc.insert_after || null; return frappe.call({ - method: 'frappe.custom.doctype.custom_field.custom_field.get_fields_label', + method: "frappe.custom.doctype.custom_field.custom_field.get_fields_label", args: { doctype: frm.doc.dt, fieldname: frm.doc.fieldname }, - callback: function(r) { - if(r) { - if(r._server_messages && r._server_messages.length) { + callback: function (r) { + if (r) { + if (r._server_messages && r._server_messages.length) { frm.set_value("dt", ""); } else { - set_field_options('insert_after', r.message); - var fieldnames = $.map(r.message, function(v) { return v.value; }); + set_field_options("insert_after", r.message); + var fieldnames = $.map(r.message, function (v) { + return v.value; + }); - if(insert_after==null || !in_list(fieldnames, insert_after)) { + if (insert_after == null || !in_list(fieldnames, insert_after)) { insert_after = fieldnames[-1]; } - frm.set_value('insert_after', insert_after); + frm.set_value("insert_after", insert_after); } } - } + }, }); - }, - label: function(frm) { - if(frm.doc.label && frappe.utils.has_special_chars(frm.doc.label)) { - frm.fields_dict['label_help'].disp_area.innerHTML = - ''+__('Special Characters are not allowed')+''; - frm.set_value('label', ''); + label: function (frm) { + if (frm.doc.label && frappe.utils.has_special_chars(frm.doc.label)) { + frm.fields_dict["label_help"].disp_area.innerHTML = + '' + __("Special Characters are not allowed") + ""; + frm.set_value("label", ""); } else { - frm.fields_dict['label_help'].disp_area.innerHTML = ''; + frm.fields_dict["label_help"].disp_area.innerHTML = ""; } }, - fieldtype: function(frm) { - if(frm.doc.fieldtype == 'Link') { - frm.fields_dict['options_help'].disp_area.innerHTML = - __('Name of the Document Type (DocType) you want this field to be linked to. e.g. Customer'); - } else if(frm.doc.fieldtype == 'Select') { - frm.fields_dict['options_help'].disp_area.innerHTML = - __('Options for select. Each option on a new line.')+' '+__('e.g.:')+'
'+__('Option 1')+'
'+__('Option 2')+'
'+__('Option 3')+'
'; - } else if(frm.doc.fieldtype == 'Dynamic Link') { - frm.fields_dict['options_help'].disp_area.innerHTML = - __('Fieldname which will be the DocType for this link field.'); + fieldtype: function (frm) { + if (frm.doc.fieldtype == "Link") { + frm.fields_dict["options_help"].disp_area.innerHTML = __( + "Name of the Document Type (DocType) you want this field to be linked to. e.g. Customer" + ); + } else if (frm.doc.fieldtype == "Select") { + frm.fields_dict["options_help"].disp_area.innerHTML = + __("Options for select. Each option on a new line.") + + " " + + __("e.g.:") + + "
" + + __("Option 1") + + "
" + + __("Option 2") + + "
" + + __("Option 3") + + "
"; + } else if (frm.doc.fieldtype == "Dynamic Link") { + frm.fields_dict["options_help"].disp_area.innerHTML = __( + "Fieldname which will be the DocType for this link field." + ); } else { - frm.fields_dict['options_help'].disp_area.innerHTML = ''; + frm.fields_dict["options_help"].disp_area.innerHTML = ""; } - } + }, }); - -frappe.utils.has_special_chars = function(t) { - var iChars = "!@#$%^&*()+=-[]\\\';,./{}|\":<>?"; +frappe.utils.has_special_chars = function (t) { + var iChars = "!@#$%^&*()+=-[]\\';,./{}|\":<>?"; for (var i = 0; i < t.length; i++) { if (iChars.indexOf(t.charAt(i)) != -1) { return true; } } return false; -} +}; diff --git a/frappe/custom/doctype/customize_form/customize_form.js b/frappe/custom/doctype/customize_form/customize_form.js index 3ec6795f0e..a35db2ca18 100644 --- a/frappe/custom/doctype/customize_form/customize_form.js +++ b/frappe/custom/doctype/customize_form/customize_form.js @@ -4,7 +4,7 @@ frappe.provide("frappe.customize_form"); frappe.ui.form.on("Customize Form", { - setup: function(frm) { + setup: function (frm) { // save the last setting if refreshing window.addEventListener("beforeunload", () => { if (frm.doc.doc_type && frm.doc.doc_type != "undefined") { @@ -13,67 +13,59 @@ frappe.ui.form.on("Customize Form", { }); }, - onload: function(frm) { - frm.set_query("doc_type", function() { + onload: function (frm) { + frm.set_query("doc_type", function () { return { filters: [ ["DocType", "issingle", "=", 0], ["DocType", "custom", "=", 0], - [ - "DocType", - "name", - "not in", - frappe.model.core_doctypes_list - ], - [ - "DocType", - "restrict_to_domain", - "in", - frappe.boot.active_domains - ] - ] + ["DocType", "name", "not in", frappe.model.core_doctypes_list], + ["DocType", "restrict_to_domain", "in", frappe.boot.active_domains], + ], }; }); - frm.set_query("default_print_format", function() { + frm.set_query("default_print_format", function () { return { filters: { print_format_type: ["!=", "JS"], - doc_type: ["=", frm.doc.doc_type] - } + doc_type: ["=", frm.doc.doc_type], + }, }; }); - $(frm.wrapper).on("grid-row-render", function(e, grid_row) { + $(frm.wrapper).on("grid-row-render", function (e, grid_row) { if (grid_row.doc && grid_row.doc.fieldtype == "Section Break") { $(grid_row.row).css({ "font-weight": "bold" }); } grid_row.row.removeClass("highlight"); - if (grid_row.doc.is_custom_field && - !grid_row.row.hasClass('highlight') && - !grid_row.doc.is_system_generated) { + if ( + grid_row.doc.is_custom_field && + !grid_row.row.hasClass("highlight") && + !grid_row.doc.is_system_generated + ) { grid_row.row.addClass("highlight"); } }); - $(frm.wrapper).on("grid-make-sortable", function(e, frm) { + $(frm.wrapper).on("grid-make-sortable", function (e, frm) { frm.trigger("setup_sortable"); }); - $(frm.wrapper).on("grid-move-row", function(e, frm) { + $(frm.wrapper).on("grid-move-row", function (e, frm) { frm.trigger("setup_sortable"); }); }, - doc_type: function(frm) { + doc_type: function (frm) { if (frm.doc.doc_type) { return frm.call({ method: "fetch_to_customize", doc: frm.doc, freeze: true, - callback: function(r) { + callback: function (r) { if (r) { if (r._server_messages && r._server_messages.length) { frm.set_value("doc_type", ""); @@ -83,15 +75,15 @@ frappe.ui.form.on("Customize Form", { } } localStorage["customize_doctype"] = frm.doc.doc_type; - } + }, }); } else { frm.refresh(); } }, - setup_sortable: function(frm) { - frm.doc.fields.forEach(function(f, i) { + setup_sortable: function (frm) { + frm.doc.fields.forEach(function (f, i) { if (!f.is_custom_field) { f._sortable = false; } @@ -99,7 +91,7 @@ frappe.ui.form.on("Customize Form", { if (f.fieldtype == "Table") { frm.add_custom_button( f.options, - function() { + function () { frm.set_value("doc_type", f.options); }, __("Customize Child Table") @@ -109,17 +101,17 @@ frappe.ui.form.on("Customize Form", { frm.fields_dict.fields.grid.refresh(); }, - refresh: function(frm) { + refresh: function (frm) { frm.disable_save(true); frm.page.clear_icons(); if (frm.doc.doc_type) { - frm.page.set_title(__('Customize Form - {0}', [frm.doc.doc_type])); + frm.page.set_title(__("Customize Form - {0}", [frm.doc.doc_type])); frappe.customize_form.set_primary_action(frm); frm.add_custom_button( __("Go to {0} List", [__(frm.doc.doc_type)]), - function() { + function () { frappe.set_route("List", frm.doc.doc_type); }, __("Actions") @@ -127,7 +119,7 @@ frappe.ui.form.on("Customize Form", { frm.add_custom_button( __("Reload"), - function() { + function () { frm.script_manager.trigger("doc_type"); }, __("Actions") @@ -135,24 +127,21 @@ frappe.ui.form.on("Customize Form", { frm.add_custom_button( __("Reset to defaults"), - function() { - frappe.customize_form.confirm( - __("Remove all customizations?"), - frm - ); + function () { + frappe.customize_form.confirm(__("Remove all customizations?"), frm); }, __("Actions") ); frm.add_custom_button( __("Set Permissions"), - function() { + function () { frappe.set_route("permission-manager", frm.doc.doc_type); }, __("Actions") ); - const is_autoname_autoincrement = frm.doc.autoname === 'autoincrement'; + const is_autoname_autoincrement = frm.doc.autoname === "autoincrement"; frm.set_df_property("naming_rule", "hidden", is_autoname_autoincrement); frm.set_df_property("autoname", "read_only", is_autoname_autoincrement); } @@ -181,37 +170,37 @@ frappe.ui.form.on("Customize Form", { if (frappe.boot.developer_mode) { frm.add_custom_button( __("Export Customizations"), - function() { + function () { frappe.prompt( [ { fieldtype: "Link", fieldname: "module", options: "Module Def", - label: __("Module to Export") + label: __("Module to Export"), }, { fieldtype: "Check", fieldname: "sync_on_migrate", label: __("Sync on Migrate"), - default: 1 + default: 1, }, { fieldtype: "Check", fieldname: "with_permissions", label: __("Export Custom Permissions"), - default: 1 - } + default: 1, + }, ], - function(data) { + function (data) { frappe.call({ method: "frappe.modules.utils.export_customizations", args: { doctype: frm.doc.doc_type, module: data.module, sync_on_migrate: data.sync_on_migrate, - with_permissions: data.with_permissions - } + with_permissions: data.with_permissions, + }, }); }, __("Select Module") @@ -225,127 +214,131 @@ frappe.ui.form.on("Customize Form", { setup_sort_order(frm) { // sort order select if (frm.doc.doc_type) { - var fields = $.map(frm.doc.fields, function(df) { - return frappe.model.is_value_type(df.fieldtype) - ? df.fieldname - : null; + var fields = $.map(frm.doc.fields, function (df) { + return frappe.model.is_value_type(df.fieldtype) ? df.fieldname : null; }); fields = ["", "name", "modified"].concat(fields); frm.set_df_property("sort_field", "options", fields); } - } + }, }); // can't delete standard fields 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); if (!(row.is_custom_field || row.__islocal)) { frappe.msgprint(__("Cannot delete standard field. You can hide it if you want")); throw "cannot delete standard field"; } }, - fields_add: function(frm, cdt, cdn) { + fields_add: function (frm, cdt, cdn) { var f = frappe.model.get_doc(cdt, cdn); f.is_system_generated = false; f.is_custom_field = true; - } + }, }); // can't delete standard links frappe.ui.form.on("DocType Link", { - before_links_remove: function(frm, doctype, name) { + before_links_remove: function (frm, doctype, name) { let row = frappe.get_doc(doctype, name); if (!(row.custom || row.__islocal)) { frappe.msgprint(__("Cannot delete standard link. You can hide it if you want")); throw "cannot delete standard link"; } }, - links_add: function(frm, cdt, cdn) { + links_add: function (frm, cdt, cdn) { let f = frappe.model.get_doc(cdt, cdn); f.custom = 1; - } + }, }); // can't delete standard actions frappe.ui.form.on("DocType Action", { - before_actions_remove: function(frm, doctype, name) { + before_actions_remove: function (frm, doctype, name) { let row = frappe.get_doc(doctype, name); if (!(row.custom || row.__islocal)) { frappe.msgprint(__("Cannot delete standard action. You can hide it if you want")); throw "cannot delete standard action"; } }, - actions_add: function(frm, cdt, cdn) { + actions_add: function (frm, cdt, cdn) { let f = frappe.model.get_doc(cdt, cdn); f.custom = 1; - } + }, }); // can't delete standard states frappe.ui.form.on("DocType State", { - before_states_remove: function(frm, doctype, name) { + before_states_remove: function (frm, doctype, name) { let row = frappe.get_doc(doctype, name); if (!(row.custom || row.__islocal)) { frappe.msgprint(__("Cannot delete standard document state.")); throw "cannot delete standard document state"; } }, - states_add: function(frm, cdt, cdn) { + states_add: function (frm, cdt, cdn) { let f = frappe.model.get_doc(cdt, cdn); f.custom = 1; - } + }, }); -frappe.customize_form.set_primary_action = function(frm) { - frm.page.set_primary_action(__("Update"), function() { +frappe.customize_form.set_primary_action = function (frm) { + frm.page.set_primary_action(__("Update"), function () { if (frm.doc.doc_type) { return frm.call({ doc: frm.doc, freeze: true, btn: frm.page.btn_primary, method: "save_customization", - callback: function(r) { + callback: function (r) { if (!r.exc) { frappe.customize_form.clear_locals_and_refresh(frm); frm.script_manager.trigger("doc_type"); } - } + }, }); } }); }; -frappe.customize_form.confirm = function(msg, frm) { +frappe.customize_form.confirm = function (msg, frm) { if (!frm.doc.doc_type) return; var d = new frappe.ui.Dialog({ - title: 'Reset To Defaults', + title: "Reset To Defaults", fields: [ - {fieldtype:"HTML", options:__("All customizations will be removed. Please confirm.")}, + { + fieldtype: "HTML", + options: __("All customizations will be removed. Please confirm."), + }, ], - primary_action: function() { + primary_action: function () { return frm.call({ doc: frm.doc, method: "reset_to_defaults", - callback: function(r) { + callback: function (r) { if (r.exc) { frappe.msgprint(r.exc); } else { d.hide(); - frappe.show_alert({message:__('Customizations Reset'), indicator:'green'}); + frappe.show_alert({ + message: __("Customizations Reset"), + indicator: "green", + }); frappe.customize_form.clear_locals_and_refresh(frm); } - } + }, }); - } + }, }); frappe.customize_form.confirm.dialog = d; d.show(); -} +}; -frappe.customize_form.clear_locals_and_refresh = function(frm) { +frappe.customize_form.clear_locals_and_refresh = function (frm) { delete frm.doc.__unsaved; // clear doctype from locals frappe.model.clear_doc("DocType", frm.doc.doc_type); @@ -353,4 +346,4 @@ frappe.customize_form.clear_locals_and_refresh = function(frm) { frm.refresh(); }; -extend_cscript(cur_frm.cscript, new frappe.model.DocTypeController({frm: cur_frm})); +extend_cscript(cur_frm.cscript, new frappe.model.DocTypeController({ frm: cur_frm })); diff --git a/frappe/custom/doctype/doctype_layout/doctype_layout.js b/frappe/custom/doctype/doctype_layout/doctype_layout.js index 533efea9b8..f91f04f762 100644 --- a/frappe/custom/doctype/doctype_layout/doctype_layout.js +++ b/frappe/custom/doctype/doctype_layout/doctype_layout.js @@ -1,30 +1,32 @@ // Copyright (c) 2020, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('DocType Layout', { - refresh: function(frm) { - frm.trigger('document_type'); +frappe.ui.form.on("DocType Layout", { + refresh: function (frm) { + frm.trigger("document_type"); frm.events.set_button(frm); }, document_type(frm) { - frm.set_fields_as_options('fields', frm.doc.document_type, null, [], 'fieldname').then(() => { - // child table empty? then show all fields as default - if (frm.doc.document_type) { - if (!(frm.doc.fields || []).length) { - for (let f of frappe.get_doc('DocType', frm.doc.document_type).fields) { - frm.add_child('fields', { fieldname: f.fieldname, label: f.label }); + frm.set_fields_as_options("fields", frm.doc.document_type, null, [], "fieldname").then( + () => { + // child table empty? then show all fields as default + if (frm.doc.document_type) { + if (!(frm.doc.fields || []).length) { + for (let f of frappe.get_doc("DocType", frm.doc.document_type).fields) { + frm.add_child("fields", { fieldname: f.fieldname, label: f.label }); + } } } } - }); + ); }, set_button(frm) { if (!frm.is_new()) { - frm.add_custom_button(__('Go to {0} List', [frm.doc.name]), () => { + frm.add_custom_button(__("Go to {0} List", [frm.doc.name]), () => { window.open(`/app/${frappe.router.slug(frm.doc.name)}`); }); } - } + }, }); diff --git a/frappe/custom/doctype/property_setter/property_setter.js b/frappe/custom/doctype/property_setter/property_setter.js index bff5ad0e63..955e01c33e 100644 --- a/frappe/custom/doctype/property_setter/property_setter.js +++ b/frappe/custom/doctype/property_setter/property_setter.js @@ -1,10 +1,10 @@ // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors // MIT License. See license.txt -frappe.ui.form.on('Property Setter', { - validate: function(frm) { - if(frm.doc.property_type=='Check' && !in_list(['0','1'], frm.doc.value)) { - frappe.throw(__('Value for a check field can be either 0 or 1')); +frappe.ui.form.on("Property Setter", { + validate: function (frm) { + if (frm.doc.property_type == "Check" && !in_list(["0", "1"], frm.doc.value)) { + frappe.throw(__("Value for a check field can be either 0 or 1")); } - } + }, }); diff --git a/frappe/desk/doctype/bulk_update/bulk_update.js b/frappe/desk/doctype/bulk_update/bulk_update.js index bb9cf2af51..017eee1480 100644 --- a/frappe/desk/doctype/bulk_update/bulk_update.js +++ b/frappe/desk/doctype/bulk_update/bulk_update.js @@ -1,65 +1,69 @@ // Copyright (c) 2016, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Bulk Update', { - refresh: function(frm) { - frm.set_query("document_type", function() { +frappe.ui.form.on("Bulk Update", { + refresh: function (frm) { + frm.set_query("document_type", function () { return { filters: [ - ['DocType', 'issingle', '=', 0], - ['DocType', 'name', 'not in', frappe.model.core_doctypes_list] - ] + ["DocType", "issingle", "=", 0], + ["DocType", "name", "not in", frappe.model.core_doctypes_list], + ], }; }); - frm.page.set_primary_action(__('Update'), function() { + frm.page.set_primary_action(__("Update"), function () { if (!frm.doc.update_value) { frappe.throw(__('Field "value" is mandatory. Please specify value to be updated')); } else { - frappe.call({ - method: 'frappe.desk.doctype.bulk_update.bulk_update.update', - args: { - doctype: frm.doc.document_type, - field: frm.doc.field, - value: frm.doc.update_value, - condition: frm.doc.condition, - limit: frm.doc.limit - }, - }).then(r => { - let failed = r.message; - if (!failed) failed = []; + frappe + .call({ + method: "frappe.desk.doctype.bulk_update.bulk_update.update", + args: { + doctype: frm.doc.document_type, + field: frm.doc.field, + value: frm.doc.update_value, + condition: frm.doc.condition, + limit: frm.doc.limit, + }, + }) + .then((r) => { + let failed = r.message; + if (!failed) failed = []; - if (failed.length && !r._server_messages) { - frappe.throw(__('Cannot update {0}', [failed.map(f => f.bold ? f.bold(): f).join(', ')])); - } else { - frappe.msgprint({ - title: __('Success'), - message: __('Updated Successfully'), - indicator: 'green' - }); - } + if (failed.length && !r._server_messages) { + frappe.throw( + __("Cannot update {0}", [ + failed.map((f) => (f.bold ? f.bold() : f)).join(", "), + ]) + ); + } else { + frappe.msgprint({ + title: __("Success"), + message: __("Updated Successfully"), + indicator: "green", + }); + } - frappe.hide_progress(); - frm.save(); - }); + frappe.hide_progress(); + frm.save(); + }); } }); }, - document_type: function(frm) { + document_type: function (frm) { // set field options - if(!frm.doc.document_type) return; + if (!frm.doc.document_type) return; - frappe.model.with_doctype(frm.doc.document_type, function() { - var options = $.map(frappe.get_meta(frm.doc.document_type).fields, - function(d) { - if(d.fieldname && frappe.model.no_value_type.indexOf(d.fieldtype)===-1) { - return d.fieldname; - } - return null; + frappe.model.with_doctype(frm.doc.document_type, function () { + var options = $.map(frappe.get_meta(frm.doc.document_type).fields, function (d) { + if (d.fieldname && frappe.model.no_value_type.indexOf(d.fieldtype) === -1) { + return d.fieldname; } - ); - frm.set_df_property('field', 'options', options); + return null; + }); + frm.set_df_property("field", "options", options); }); - } + }, }); diff --git a/frappe/desk/doctype/calendar_view/calendar_view.js b/frappe/desk/doctype/calendar_view/calendar_view.js index a58a9555db..c302c1a4d8 100644 --- a/frappe/desk/doctype/calendar_view/calendar_view.js +++ b/frappe/desk/doctype/calendar_view/calendar_view.js @@ -1,35 +1,36 @@ // Copyright (c) 2017, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Calendar View', { - onload: function(frm) { - frm.trigger('reference_doctype'); +frappe.ui.form.on("Calendar View", { + onload: function (frm) { + frm.trigger("reference_doctype"); }, - refresh: function(frm) { + refresh: function (frm) { if (!frm.is_new()) { - frm.add_custom_button(__('Show Calendar'), - () => frappe.set_route('List', frm.doc.reference_doctype, 'Calendar', frm.doc.name)); + frm.add_custom_button(__("Show Calendar"), () => + frappe.set_route("List", frm.doc.reference_doctype, "Calendar", frm.doc.name) + ); } }, - reference_doctype: function(frm) { + reference_doctype: function (frm) { const { reference_doctype } = frm.doc; if (!reference_doctype) return; frappe.model.with_doctype(reference_doctype, () => { const meta = frappe.get_meta(reference_doctype); - const subject_options = meta.fields.filter( - df => !frappe.model.no_value_type.includes(df.fieldtype) - ).map(df => df.fieldname); + const subject_options = meta.fields + .filter((df) => !frappe.model.no_value_type.includes(df.fieldtype)) + .map((df) => df.fieldname); - const date_options = meta.fields.filter( - df => ['Date', 'Datetime'].includes(df.fieldtype) - ).map(df => df.fieldname); + const date_options = meta.fields + .filter((df) => ["Date", "Datetime"].includes(df.fieldtype)) + .map((df) => df.fieldname); - frm.set_df_property('subject_field', 'options', subject_options); - frm.set_df_property('start_date_field', 'options', date_options); - frm.set_df_property('end_date_field', 'options', date_options); + frm.set_df_property("subject_field", "options", subject_options); + frm.set_df_property("start_date_field", "options", date_options); + frm.set_df_property("end_date_field", "options", date_options); frm.refresh(); }); - } + }, }); diff --git a/frappe/desk/doctype/console_log/console_log.js b/frappe/desk/doctype/console_log/console_log.js index 1ef4fdce59..9a980667ac 100644 --- a/frappe/desk/doctype/console_log/console_log.js +++ b/frappe/desk/doctype/console_log/console_log.js @@ -1,8 +1,7 @@ // Copyright (c) 2020, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Console Log', { +frappe.ui.form.on("Console Log", { // refresh: function(frm) { - // } }); diff --git a/frappe/desk/doctype/dashboard/dashboard.js b/frappe/desk/doctype/dashboard/dashboard.js index c640259cf2..9f584ca552 100644 --- a/frappe/desk/doctype/dashboard/dashboard.js +++ b/frappe/desk/doctype/dashboard/dashboard.js @@ -1,30 +1,30 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Dashboard', { - refresh: function(frm) { - frm.add_custom_button(__("Show Dashboard"), - () => frappe.set_route('dashboard-view', frm.doc.name) +frappe.ui.form.on("Dashboard", { + refresh: function (frm) { + frm.add_custom_button(__("Show Dashboard"), () => + frappe.set_route("dashboard-view", frm.doc.name) ); if (!frappe.boot.developer_mode && frm.doc.is_standard) { frm.disable_form(); } - frm.set_query("chart", "charts", function() { + frm.set_query("chart", "charts", function () { return { filters: { is_public: 1, - } + }, }; }); - frm.set_query("card", "cards", function() { + frm.set_query("card", "cards", function () { return { filters: { is_public: 1, - } + }, }; }); - } + }, }); diff --git a/frappe/desk/doctype/dashboard/dashboard_list.js b/frappe/desk/doctype/dashboard/dashboard_list.js index d60a324048..80ebbd4355 100644 --- a/frappe/desk/doctype/dashboard/dashboard_list.js +++ b/frappe/desk/doctype/dashboard/dashboard_list.js @@ -1,4 +1,4 @@ -frappe.listview_settings['Dashboard'] = { +frappe.listview_settings["Dashboard"] = { button: { show(doc) { return doc.name; @@ -7,10 +7,10 @@ frappe.listview_settings['Dashboard'] = { return frappe.utils.icon("dashboard-list", "sm"); }, get_description(doc) { - return __('View {0}', [`${doc.name}`]); + return __("View {0}", [`${doc.name}`]); }, action(doc) { - frappe.set_route('dashboard-view', doc.name); - } + frappe.set_route("dashboard-view", doc.name); + }, }, -}; \ No newline at end of file +}; diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js index 0b93786e8e..b1c23eba28 100644 --- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js +++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js @@ -1,42 +1,44 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.provide('frappe.dashboards.chart_sources'); +frappe.provide("frappe.dashboards.chart_sources"); -frappe.ui.form.on('Dashboard Chart', { - setup: function(frm) { +frappe.ui.form.on("Dashboard Chart", { + setup: function (frm) { // fetch timeseries from source - frm.add_fetch('source', 'timeseries', 'timeseries'); + frm.add_fetch("source", "timeseries", "timeseries"); }, - before_save: function(frm) { - let dynamic_filters = JSON.parse(frm.doc.dynamic_filters_json || 'null'); - let static_filters = JSON.parse(frm.doc.filters_json || 'null'); - static_filters = - frappe.dashboard_utils.remove_common_static_filter_values(static_filters, dynamic_filters); + before_save: function (frm) { + let dynamic_filters = JSON.parse(frm.doc.dynamic_filters_json || "null"); + let static_filters = JSON.parse(frm.doc.filters_json || "null"); + static_filters = frappe.dashboard_utils.remove_common_static_filter_values( + static_filters, + dynamic_filters + ); - frm.set_value('filters_json', JSON.stringify(static_filters)); - frm.trigger('show_filters'); + frm.set_value("filters_json", JSON.stringify(static_filters)); + frm.trigger("show_filters"); }, - refresh: function(frm) { + refresh: function (frm) { frm.chart_filters = null; frm.is_disabled = !frappe.boot.developer_mode && frm.doc.is_standard; if (frm.is_disabled) { - !frm.doc.custom_options && frm.set_df_property('chart_options_section', 'hidden', 1); + !frm.doc.custom_options && frm.set_df_property("chart_options_section", "hidden", 1); frm.disable_form(); } - frm.add_custom_button('Add Chart to Dashboard', () => { + frm.add_custom_button("Add Chart to Dashboard", () => { const dialog = frappe.dashboard_utils.get_add_to_dashboard_dialog( frm.doc.name, - 'Dashboard Chart', - 'frappe.desk.doctype.dashboard_chart.dashboard_chart.add_chart_to_dashboard' + "Dashboard Chart", + "frappe.desk.doctype.dashboard_chart.dashboard_chart.add_chart_to_dashboard" ); if (!frm.doc.chart_name) { - frappe.msgprint(__('Please create chart first')); + frappe.msgprint(__("Please create chart first")); } else { dialog.show(); } @@ -45,199 +47,227 @@ frappe.ui.form.on('Dashboard Chart', { frm.set_df_property("filters_section", "hidden", 1); frm.set_df_property("dynamic_filters_section", "hidden", 1); - frm.trigger('set_parent_document_type'); - frm.trigger('set_time_series'); - frm.set_query('document_type', function() { + frm.trigger("set_parent_document_type"); + frm.trigger("set_time_series"); + frm.set_query("document_type", function () { return { filters: { - 'issingle': false - } - } + issingle: false, + }, + }; }); - frm.trigger('update_options'); - frm.trigger('set_heatmap_year_options'); + frm.trigger("update_options"); + frm.trigger("set_heatmap_year_options"); if (frm.doc.report_name) { - frm.trigger('set_chart_report_filters'); + frm.trigger("set_chart_report_filters"); } }, - is_standard: function(frm) { + is_standard: function (frm) { if (frappe.boot.developer_mode && frm.doc.is_standard) { - frm.trigger('render_dynamic_filters_table'); + frm.trigger("render_dynamic_filters_table"); } else { frm.set_df_property("dynamic_filters_section", "hidden", 1); } }, - source: function(frm) { + source: function (frm) { frm.trigger("show_filters"); }, - set_heatmap_year_options: function(frm) { - if (frm.doc.type == 'Heatmap') { - frappe.db.get_doc('System Settings').then(doc => { + set_heatmap_year_options: function (frm) { + if (frm.doc.type == "Heatmap") { + frappe.db.get_doc("System Settings").then((doc) => { const creation_date = doc.creation; - frm.set_df_property('heatmap_year', 'options', frappe.dashboard_utils.get_years_since_creation(creation_date)); + frm.set_df_property( + "heatmap_year", + "options", + frappe.dashboard_utils.get_years_since_creation(creation_date) + ); }); } }, - chart_type: function(frm) { - frm.trigger('set_time_series'); - if (frm.doc.chart_type == 'Report') { - frm.set_query('report_name', () => { + chart_type: function (frm) { + frm.trigger("set_time_series"); + if (frm.doc.chart_type == "Report") { + frm.set_query("report_name", () => { return { filters: { - 'report_type': ['!=', 'Report Builder'] - } - } + report_type: ["!=", "Report Builder"], + }, + }; }); } else { - frm.set_value('document_type', ''); + frm.set_value("document_type", ""); } }, - set_time_series: function(frm) { + set_time_series: function (frm) { // set timeseries based on chart type - if (['Count', 'Average', 'Sum'].includes(frm.doc.chart_type)) { - frm.set_value('timeseries', 1); + if (["Count", "Average", "Sum"].includes(frm.doc.chart_type)) { + frm.set_value("timeseries", 1); } else { - frm.set_value('timeseries', 0); + frm.set_value("timeseries", 0); } }, - document_type: function(frm) { + document_type: function (frm) { // update `based_on` options based on date / datetime fields - frm.set_value('source', ''); - frm.set_value('based_on', ''); - frm.set_value('value_based_on', ''); - frm.set_value('parent_document_type', ''); - frm.set_value('filters_json', '[]'); - frm.set_value('dynamic_filters_json', '[]'); - frm.trigger('update_options'); - frm.trigger('set_parent_document_type'); + frm.set_value("source", ""); + frm.set_value("based_on", ""); + frm.set_value("value_based_on", ""); + frm.set_value("parent_document_type", ""); + frm.set_value("filters_json", "[]"); + frm.set_value("dynamic_filters_json", "[]"); + frm.trigger("update_options"); + frm.trigger("set_parent_document_type"); }, - report_name: function(frm) { - frm.set_value('x_field', ''); - frm.set_value('y_axis', []); - frm.set_df_property('x_field', 'options', []); - frm.set_value('filters_json', '{}'); - frm.set_value('dynamic_filters_json', '{}'); - frm.set_value('use_report_chart', 0); - frm.trigger('set_chart_report_filters'); + report_name: function (frm) { + frm.set_value("x_field", ""); + frm.set_value("y_axis", []); + frm.set_df_property("x_field", "options", []); + frm.set_value("filters_json", "{}"); + frm.set_value("dynamic_filters_json", "{}"); + frm.set_value("use_report_chart", 0); + frm.trigger("set_chart_report_filters"); }, - set_chart_report_filters: function(frm) { + set_chart_report_filters: function (frm) { let report_name = frm.doc.report_name; if (report_name) { if (frm.doc.filters_json.length > 2) { - frm.trigger('show_filters'); - frm.trigger('set_chart_field_options'); + frm.trigger("show_filters"); + frm.trigger("set_chart_field_options"); } else { - frappe.report_utils.get_report_filters(report_name).then(filters => { + frappe.report_utils.get_report_filters(report_name).then((filters) => { if (filters) { frm.chart_filters = filters; let filter_values = frappe.report_utils.get_filter_values(filters); - frm.set_value('filters_json', JSON.stringify(filter_values)); + frm.set_value("filters_json", JSON.stringify(filter_values)); } - frm.trigger('show_filters'); - frm.trigger('set_chart_field_options'); + frm.trigger("show_filters"); + frm.trigger("set_chart_field_options"); }); } - } }, - use_report_chart: function(frm) { - !frm.doc.use_report_chart && frm.trigger('set_chart_field_options'); + use_report_chart: function (frm) { + !frm.doc.use_report_chart && frm.trigger("set_chart_field_options"); }, - set_chart_field_options: function(frm) { + set_chart_field_options: function (frm) { let filters = frm.doc.filters_json.length > 2 ? JSON.parse(frm.doc.filters_json) : null; if (frm.doc.dynamic_filters_json && frm.doc.dynamic_filters_json.length > 2) { filters = frappe.dashboard_utils.get_all_filters(frm.doc); } - frappe.xcall( - 'frappe.desk.query_report.run', - { + frappe + .xcall("frappe.desk.query_report.run", { report_name: frm.doc.report_name, filters: filters, - ignore_prepared_report: 1 - } - ).then(data => { - frm.report_data = data; - let report_has_chart = Boolean(data.chart); + ignore_prepared_report: 1, + }) + .then((data) => { + frm.report_data = data; + let report_has_chart = Boolean(data.chart); - frm.set_df_property('use_report_chart', 'hidden', !report_has_chart); + frm.set_df_property("use_report_chart", "hidden", !report_has_chart); - if (!frm.doc.use_report_chart) { - if (data.result.length) { - frm.field_options = frappe.report_utils.get_field_options_from_report(data.columns, data); - frm.set_df_property('x_field', 'options', frm.field_options.non_numeric_fields); - if (!frm.field_options.numeric_fields.length) { - frappe.msgprint(__("Report has no numeric fields, please change the Report Name")); + if (!frm.doc.use_report_chart) { + if (data.result.length) { + frm.field_options = frappe.report_utils.get_field_options_from_report( + data.columns, + data + ); + frm.set_df_property( + "x_field", + "options", + frm.field_options.non_numeric_fields + ); + if (!frm.field_options.numeric_fields.length) { + frappe.msgprint( + __("Report has no numeric fields, please change the Report Name") + ); + } else { + let y_field_df = frappe.meta.get_docfield( + "Dashboard Chart Field", + "y_field", + frm.doc.name + ); + y_field_df.options = frm.field_options.numeric_fields; + } } else { - let y_field_df = frappe.meta.get_docfield('Dashboard Chart Field', 'y_field', frm.doc.name); - y_field_df.options = frm.field_options.numeric_fields; + frappe.msgprint( + __( + "Report has no data, please modify the filters or change the Report Name" + ) + ); } } else { - frappe.msgprint(__('Report has no data, please modify the filters or change the Report Name')); + frm.set_value("use_report_chart", 1); + frm.set_df_property("use_report_chart", "hidden", false); } - } else { - frm.set_value('use_report_chart', 1); - frm.set_df_property('use_report_chart', 'hidden', false); - } - }); + }); }, - timespan: function(frm) { + timespan: function (frm) { const time_interval_options = { "Select Date Range": ["Quarterly", "Monthly", "Weekly", "Daily"], "All Time": ["Yearly", "Monthly"], "Last Year": ["Quarterly", "Monthly", "Weekly", "Daily"], "Last Quarter": ["Monthly", "Weekly", "Daily"], "Last Month": ["Weekly", "Daily"], - "Last Week": ["Daily"] + "Last Week": ["Daily"], }; if (frm.doc.timespan) { - frm.set_df_property('time_interval', 'options', time_interval_options[frm.doc.timespan]); + frm.set_df_property( + "time_interval", + "options", + time_interval_options[frm.doc.timespan] + ); } }, - update_options: function(frm) { + update_options: function (frm) { let doctype = frm.doc.document_type; let date_fields = [ - {label: __('Created On'), value: 'creation'}, - {label: __('Last Modified On'), value: 'modified'} + { label: __("Created On"), value: "creation" }, + { label: __("Last Modified On"), value: "modified" }, ]; let value_fields = []; - let group_by_fields = [{label: 'Created By', value: 'owner'}]; + let group_by_fields = [{ label: "Created By", value: "owner" }]; let aggregate_function_fields = []; - let update_form = function() { + let update_form = function () { // update select options - frm.set_df_property('based_on', 'options', date_fields); - frm.set_df_property('value_based_on', 'options', value_fields); - frm.set_df_property('group_by_based_on', 'options', group_by_fields); - frm.set_df_property('aggregate_function_based_on', 'options', aggregate_function_fields); + frm.set_df_property("based_on", "options", date_fields); + frm.set_df_property("value_based_on", "options", value_fields); + frm.set_df_property("group_by_based_on", "options", group_by_fields); + frm.set_df_property( + "aggregate_function_based_on", + "options", + aggregate_function_fields + ); frm.trigger("show_filters"); - } - + }; if (doctype) { frappe.model.with_doctype(doctype, () => { // get all date and datetime fields - frappe.get_meta(doctype).fields.map(df => { - if (['Date', 'Datetime'].includes(df.fieldtype)) { - date_fields.push({label: df.label, value: df.fieldname}); + frappe.get_meta(doctype).fields.map((df) => { + if (["Date", "Datetime"].includes(df.fieldtype)) { + date_fields.push({ label: df.label, value: df.fieldname }); } - if (['Int', 'Float', 'Currency', 'Percent', 'Duration'].includes(df.fieldtype)) { - value_fields.push({label: df.label, value: df.fieldname}); - aggregate_function_fields.push({label: df.label, value: df.fieldname}); + if ( + ["Int", "Float", "Currency", "Percent", "Duration"].includes(df.fieldtype) + ) { + value_fields.push({ label: df.label, value: df.fieldname }); + aggregate_function_fields.push({ label: df.label, value: df.fieldname }); } - if (['Link', 'Select'].includes(df.fieldtype)) { - group_by_fields.push({label: df.label, value: df.fieldname}); + if (["Link", "Select"].includes(df.fieldtype)) { + group_by_fields.push({ label: df.label, value: df.fieldname }); } }); update_form(); @@ -246,92 +276,89 @@ frappe.ui.form.on('Dashboard Chart', { // update select options update_form(); } - }, - show_filters: function(frm) { + show_filters: function (frm) { frm.chart_filters = []; - frappe.dashboard_utils.get_filters_for_chart_type(frm.doc).then(filters => { + frappe.dashboard_utils.get_filters_for_chart_type(frm.doc).then((filters) => { if (filters) { frm.chart_filters = filters; } - frm.trigger('render_filters_table'); + frm.trigger("render_filters_table"); if (frappe.boot.developer_mode && frm.doc.is_standard) { - frm.trigger('render_dynamic_filters_table'); + frm.trigger("render_dynamic_filters_table"); } }); }, - render_filters_table: function(frm) { + render_filters_table: function (frm) { frm.set_df_property("filters_section", "hidden", 0); - let is_document_type = frm.doc.chart_type!== 'Report' && frm.doc.chart_type!=='Custom'; - let is_dynamic_filter = f => ['Date', 'DateRange'].includes(f.fieldtype) && f.default; + let is_document_type = frm.doc.chart_type !== "Report" && frm.doc.chart_type !== "Custom"; + let is_dynamic_filter = (f) => ["Date", "DateRange"].includes(f.fieldtype) && f.default; - let wrapper = $(frm.get_field('filters_json').wrapper).empty(); + let wrapper = $(frm.get_field("filters_json").wrapper).empty(); let table = $(` - - - + + +
${__('Filter')}${__('Condition')}${__('Value')}${__("Filter")}${__("Condition")}${__("Value")}
`).appendTo(wrapper); $(`

${__("Click table to edit")}

`).appendTo(wrapper); - let filters = JSON.parse(frm.doc.filters_json || '[]'); + let filters = JSON.parse(frm.doc.filters_json || "[]"); var filters_set = false; // Set dynamic filters for reports - if (frm.doc.chart_type == 'Report') { + if (frm.doc.chart_type == "Report") { let set_filters = false; - frm.chart_filters.forEach(f => { + frm.chart_filters.forEach((f) => { if (is_dynamic_filter(f)) { filters[f.fieldname] = f.default; set_filters = true; } }); - set_filters && frm.set_value('filters_json', JSON.stringify(filters)); + set_filters && frm.set_value("filters_json", JSON.stringify(filters)); } let fields = []; if (is_document_type) { fields = [ { - fieldtype: 'HTML', - fieldname: 'filter_area', - } + fieldtype: "HTML", + fieldname: "filter_area", + }, ]; if (filters.length > 0) { - filters.forEach( filter => { - const filter_row = - $(` + filters.forEach((filter) => { + const filter_row = $(` ${filter[1]} ${filter[2] || ""} ${filter[3]} `); - table.find('tbody').append(filter_row); + table.find("tbody").append(filter_row); filters_set = true; }); } } else if (frm.chart_filters.length) { - fields = frm.chart_filters.filter(f => f.fieldname); + fields = frm.chart_filters.filter((f) => f.fieldname); - fields.map(f => { + fields.map((f) => { if (filters[f.fieldname]) { - let condition = '='; - const filter_row = - $(` + let condition = "="; + const filter_row = $(` ${f.label} ${condition} ${filters[f.fieldname] || ""} `); - table.find('tbody').append(filter_row); + table.find("tbody").append(filter_row); filters_set = true; } }); @@ -340,39 +367,39 @@ frappe.ui.form.on('Dashboard Chart', { if (!filters_set) { const filter_row = $(` ${__("Click to Set Filters")}`); - table.find('tbody').append(filter_row); + table.find("tbody").append(filter_row); } - table.on('click', () => { - frm.is_disabled && frappe.throw(__('Cannot edit filters for standard charts')); + table.on("click", () => { + frm.is_disabled && frappe.throw(__("Cannot edit filters for standard charts")); let dialog = new frappe.ui.Dialog({ - title: __('Set Filters'), - fields: fields.filter(f => !is_dynamic_filter(f)), - primary_action: function() { + title: __("Set Filters"), + fields: fields.filter((f) => !is_dynamic_filter(f)), + primary_action: function () { let values = this.get_values(); if (values) { this.hide(); if (is_document_type) { let filters = frm.filter_group.get_filters(); - frm.set_value('filters_json', JSON.stringify(filters)); + frm.set_value("filters_json", JSON.stringify(filters)); } else { - frm.set_value('filters_json', JSON.stringify(values)); + frm.set_value("filters_json", JSON.stringify(values)); } - frm.trigger('show_filters'); - if (frm.doc.chart_type == 'Report') { - frm.trigger('set_chart_report_filters'); + frm.trigger("show_filters"); + if (frm.doc.chart_type == "Report") { + frm.trigger("set_chart_report_filters"); } } }, - primary_action_label: "Set" + primary_action_label: "Set", }); frappe.dashboards.filters_dialog = dialog; if (is_document_type) { frm.filter_group = new frappe.ui.FilterGroup({ - parent: dialog.get_field('filter_area').$wrapper, + parent: dialog.get_field("filter_area").$wrapper, doctype: frm.doc.document_type, parent_doctype: frm.doc.parent_document_type, on_change: () => {}, @@ -383,12 +410,14 @@ frappe.ui.form.on('Dashboard Chart', { dialog.show(); - if (frm.doc.chart_type == 'Report') { + if (frm.doc.chart_type == "Report") { //Set query report object so that it can be used while fetching filter values in the report - frappe.query_report = new frappe.views.QueryReport({'filters': dialog.fields_list}); - frappe.query_reports[frm.doc.report_name] - && frappe.query_reports[frm.doc.report_name].onload - && frappe.query_reports[frm.doc.report_name].onload(frappe.query_report); + frappe.query_report = new frappe.views.QueryReport({ + filters: dialog.fields_list, + }); + frappe.query_reports[frm.doc.report_name] && + frappe.query_reports[frm.doc.report_name].onload && + frappe.query_reports[frm.doc.report_name].onload(frappe.query_report); } dialog.set_values(filters); @@ -398,37 +427,40 @@ frappe.ui.form.on('Dashboard Chart', { render_dynamic_filters_table(frm) { frm.set_df_property("dynamic_filters_section", "hidden", 0); - let is_document_type = frm.doc.chart_type !== 'Report' - && frm.doc.chart_type !== 'Custom'; + let is_document_type = frm.doc.chart_type !== "Report" && frm.doc.chart_type !== "Custom"; - let wrapper = $(frm.get_field('dynamic_filters_json').wrapper).empty(); + let wrapper = $(frm.get_field("dynamic_filters_json").wrapper).empty(); - frm.dynamic_filter_table = $(` + frm.dynamic_filter_table = + $(`
- - - + + +
${__('Filter')}${__('Condition')}${__('Value')}${__("Filter")}${__("Condition")}${__("Value")}
`).appendTo(wrapper); - frm.dynamic_filters = frm.doc.dynamic_filters_json && frm.doc.dynamic_filters_json.length > 2 - ? JSON.parse(frm.doc.dynamic_filters_json) - : null; + frm.dynamic_filters = + frm.doc.dynamic_filters_json && frm.doc.dynamic_filters_json.length > 2 + ? JSON.parse(frm.doc.dynamic_filters_json) + : null; - frm.trigger('set_dynamic_filters_in_table'); + frm.trigger("set_dynamic_filters_in_table"); - let filters = JSON.parse(frm.doc.filters_json || '[]'); + let filters = JSON.parse(frm.doc.filters_json || "[]"); let fields = frappe.dashboard_utils.get_fields_for_dynamic_filter_dialog( - is_document_type, filters, frm.dynamic_filters + is_document_type, + filters, + frm.dynamic_filters ); - frm.dynamic_filter_table.on('click', () => { + frm.dynamic_filter_table.on("click", () => { let dialog = new frappe.ui.Dialog({ - title: __('Set Dynamic Filters'), + title: __("Set Dynamic Filters"), fields: fields, primary_action: () => { let values = dialog.get_values(); @@ -436,19 +468,19 @@ frappe.ui.form.on('Dashboard Chart', { let dynamic_filters = []; for (let key of Object.keys(values)) { if (is_document_type) { - let [doctype, fieldname] = key.split(':'); - dynamic_filters.push([doctype, fieldname, '=', values[key]]); + let [doctype, fieldname] = key.split(":"); + dynamic_filters.push([doctype, fieldname, "=", values[key]]); } } if (is_document_type) { - frm.set_value('dynamic_filters_json', JSON.stringify(dynamic_filters)); + frm.set_value("dynamic_filters_json", JSON.stringify(dynamic_filters)); } else { - frm.set_value('dynamic_filters_json', JSON.stringify(values)); + frm.set_value("dynamic_filters_json", JSON.stringify(values)); } - frm.trigger('set_dynamic_filters_in_table'); + frm.trigger("set_dynamic_filters_in_table"); }, - primary_action_label: "Set" + primary_action_label: "Set", }); dialog.show(); @@ -456,71 +488,70 @@ frappe.ui.form.on('Dashboard Chart', { }); }, - set_dynamic_filters_in_table: function(frm) { - frm.dynamic_filters = frm.doc.dynamic_filters_json && frm.doc.dynamic_filters_json.length > 2 - ? JSON.parse(frm.doc.dynamic_filters_json) - : null; + set_dynamic_filters_in_table: function (frm) { + frm.dynamic_filters = + frm.doc.dynamic_filters_json && frm.doc.dynamic_filters_json.length > 2 + ? JSON.parse(frm.doc.dynamic_filters_json) + : null; if (!frm.dynamic_filters) { const filter_row = $(` ${__("Click to Set Dynamic Filters")}`); - frm.dynamic_filter_table.find('tbody').html(filter_row); + frm.dynamic_filter_table.find("tbody").html(filter_row); } else { - let filter_rows = ''; + let filter_rows = ""; if ($.isArray(frm.dynamic_filters)) { - frm.dynamic_filters.forEach(filter => { - filter_rows += - ` + frm.dynamic_filters.forEach((filter) => { + filter_rows += ` ${filter[1]} ${filter[2] || ""} ${filter[3]} `; }); } else { - let condition = '='; + let condition = "="; for (let [key, val] of Object.entries(frm.dynamic_filters)) { - filter_rows += - ` + filter_rows += ` ${key} ${condition} ${val || ""} - ` - ; + `; } } - frm.dynamic_filter_table.find('tbody').html(filter_rows); + frm.dynamic_filter_table.find("tbody").html(filter_rows); } }, - set_parent_document_type: async function(frm) { + set_parent_document_type: async function (frm) { let document_type = frm.doc.document_type; - let doc_is_table = document_type && - (await frappe.db.get_value('DocType', document_type, 'istable')).message.istable; + let doc_is_table = + document_type && + (await frappe.db.get_value("DocType", document_type, "istable")).message.istable; - frm.set_df_property('parent_document_type', 'hidden', !doc_is_table); + frm.set_df_property("parent_document_type", "hidden", !doc_is_table); if (document_type && doc_is_table) { - let parent = await frappe.db.get_list('DocField', { + let parent = await frappe.db.get_list("DocField", { filters: { - 'fieldtype': 'Table', - 'options': document_type + fieldtype: "Table", + options: document_type, }, - fields: ['parent'] + fields: ["parent"], }); - parent && frm.set_query('parent_document_type', function() { - return { - filters: { - "name": ['in', parent.map(({ parent }) => parent)] - } - }; - }); + parent && + frm.set_query("parent_document_type", function () { + return { + filters: { + name: ["in", parent.map(({ parent }) => parent)], + }, + }; + }); if (parent.length === 1) { - frm.set_value('parent_document_type', parent[0].parent); + frm.set_value("parent_document_type", parent[0].parent); } } - } - + }, }); diff --git a/frappe/desk/doctype/dashboard_chart_source/dashboard_chart_source.js b/frappe/desk/doctype/dashboard_chart_source/dashboard_chart_source.js index 96dd40d3c1..6f1fa36ffd 100644 --- a/frappe/desk/doctype/dashboard_chart_source/dashboard_chart_source.js +++ b/frappe/desk/doctype/dashboard_chart_source/dashboard_chart_source.js @@ -1,5 +1,4 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Dashboard Chart Source', { -}); +frappe.ui.form.on("Dashboard Chart Source", {}); diff --git a/frappe/desk/doctype/dashboard_settings/dashboard_settings.js b/frappe/desk/doctype/dashboard_settings/dashboard_settings.js index 8e7966366d..aa5be2b1a5 100644 --- a/frappe/desk/doctype/dashboard_settings/dashboard_settings.js +++ b/frappe/desk/doctype/dashboard_settings/dashboard_settings.js @@ -1,8 +1,7 @@ // Copyright (c) 2020, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Dashboard Settings', { +frappe.ui.form.on("Dashboard Settings", { // refresh: function(frm) { - // } }); diff --git a/frappe/desk/doctype/desktop_icon/desktop_icon.js b/frappe/desk/doctype/desktop_icon/desktop_icon.js index 58ea09e732..72ef1f7a12 100644 --- a/frappe/desk/doctype/desktop_icon/desktop_icon.js +++ b/frappe/desk/doctype/desktop_icon/desktop_icon.js @@ -1,8 +1,6 @@ // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors // For license information, please see license.txt -frappe.ui.form.on('Desktop Icon', { - refresh: function(frm) { - - } +frappe.ui.form.on("Desktop Icon", { + refresh: function (frm) {}, }); diff --git a/frappe/desk/doctype/event/event.js b/frappe/desk/doctype/event/event.js index 87d78bae94..61bf66f5e5 100644 --- a/frappe/desk/doctype/event/event.js +++ b/frappe/desk/doctype/event/event.js @@ -3,70 +3,79 @@ frappe.provide("frappe.desk"); frappe.ui.form.on("Event", { - onload: function(frm) { - frm.set_query('reference_doctype', "event_participants", function() { - return { - "filters": { - "issingle": 0, - } - }; - }); - frm.set_query('google_calendar', function() { + onload: function (frm) { + frm.set_query("reference_doctype", "event_participants", function () { return { filters: { - "owner": frappe.session.user - } + issingle: 0, + }, + }; + }); + frm.set_query("google_calendar", function () { + return { + filters: { + owner: frappe.session.user, + }, }; }); }, - refresh: function(frm) { - if(frm.doc.event_participants) { - frm.doc.event_participants.forEach(value => { - frm.add_custom_button(__(value.reference_docname), function() { - frappe.set_route("Form", value.reference_doctype, value.reference_docname); - }, __("Participants")); - }) + refresh: function (frm) { + if (frm.doc.event_participants) { + frm.doc.event_participants.forEach((value) => { + frm.add_custom_button( + __(value.reference_docname), + function () { + frappe.set_route("Form", value.reference_doctype, value.reference_docname); + }, + __("Participants") + ); + }); } frm.page.set_inner_btn_group_as_primary(__("Add Participants")); - frm.add_custom_button(__('Add Contacts'), function() { - new frappe.desk.eventParticipants(frm, "Contact"); - }, __("Add Participants")); + frm.add_custom_button( + __("Add Contacts"), + function () { + new frappe.desk.eventParticipants(frm, "Contact"); + }, + __("Add Participants") + ); }, - repeat_on: function(frm) { - if(frm.doc.repeat_on==="Every Day") { - ["monday", "tuesday", "wednesday", "thursday", - "friday", "saturday", "sunday"].map(function(v) { + repeat_on: function (frm) { + if (frm.doc.repeat_on === "Every Day") { + ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"].map( + function (v) { frm.set_value(v, 1); - }); + } + ); } - } + }, }); frappe.ui.form.on("Event Participants", { - event_participants_remove: function(frm, cdt, cdn) { - if (cdt&&!cdn.includes("New Event Participants")){ + event_participants_remove: function (frm, cdt, cdn) { + if (cdt && !cdn.includes("New Event Participants")) { frappe.call({ type: "POST", method: "frappe.desk.doctype.event.event.delete_communication", args: { - "event": frm.doc, - "reference_doctype": cdt, - "reference_docname": cdn + event: frm.doc, + reference_doctype: cdt, + reference_docname: cdn, }, freeze: true, - callback: function(r) { - if(r.exc) { + callback: function (r) { + if (r.exc) { frappe.show_alert({ message: __("{0}", [r.exc]), - indicator: 'orange' + indicator: "orange", }); } - } + }, }); } - } + }, }); frappe.desk.eventParticipants = class eventParticipants { @@ -86,7 +95,7 @@ frappe.desk.eventParticipants = class eventParticipants { dynamic_link_reference: me.doctype, fieldname: "reference_docname", target: table, - txt: "" + txt: "", }); } }; diff --git a/frappe/desk/doctype/event/event_calendar.js b/frappe/desk/doctype/event/event_calendar.js index df474a0258..bfdd09b864 100644 --- a/frappe/desk/doctype/event/event_calendar.js +++ b/frappe/desk/doctype/event/event_calendar.js @@ -1,16 +1,16 @@ frappe.views.calendar["Event"] = { field_map: { - "start": "starts_on", - "end": "ends_on", - "id": "name", - "allDay": "all_day", - "title": "subject", - "status": "event_type", - "color": "color" + start: "starts_on", + end: "ends_on", + id: "name", + allDay: "all_day", + title: "subject", + status: "event_type", + color: "color", }, style_map: { - "Public": "success", - "Private": "info" + Public: "success", + Private: "info", }, - get_events_method: "frappe.desk.doctype.event.event.get_events" -} \ No newline at end of file + get_events_method: "frappe.desk.doctype.event.event.get_events", +}; diff --git a/frappe/desk/doctype/event/event_list.js b/frappe/desk/doctype/event/event_list.js index 5d73d9dd1a..f6460288d8 100644 --- a/frappe/desk/doctype/event/event_list.js +++ b/frappe/desk/doctype/event/event_list.js @@ -1,8 +1,8 @@ -frappe.listview_settings['Event'] = { +frappe.listview_settings["Event"] = { add_fields: ["starts_on", "ends_on"], - onload: function() { + onload: function () { frappe.route_options = { - "status": "Open" + status: "Open", }; - } -} \ No newline at end of file + }, +}; diff --git a/frappe/desk/doctype/form_tour/form_tour.js b/frappe/desk/doctype/form_tour/form_tour.js index 3f3fc0ff8a..1e67e10779 100644 --- a/frappe/desk/doctype/form_tour/form_tour.js +++ b/frappe/desk/doctype/form_tour/form_tour.js @@ -1,10 +1,10 @@ // Copyright (c) 2021, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Form Tour', { - setup: function(frm) { +frappe.ui.form.on("Form Tour", { + setup: function (frm) { if (!frm.doc.is_standard || frappe.boot.developer_mode) { - frm.trigger('setup_queries'); + frm.trigger("setup_queries"); } }, @@ -13,28 +13,26 @@ frappe.ui.form.on('Form Tour', { frm.trigger("disable_form"); } - frm.add_custom_button(__('Show Tour'), async () => { + frm.add_custom_button(__("Show Tour"), async () => { const issingle = await check_if_single(frm.doc.reference_doctype); let route_changed = null; if (issingle) { - route_changed = frappe.set_route('Form', frm.doc.reference_doctype); + route_changed = frappe.set_route("Form", frm.doc.reference_doctype); } else if (frm.doc.first_document) { const name = await get_first_document(frm.doc.reference_doctype); - route_changed = frappe.set_route('Form', frm.doc.reference_doctype, name); + route_changed = frappe.set_route("Form", frm.doc.reference_doctype, name); } else { - route_changed = frappe.set_route('Form', frm.doc.reference_doctype, 'new'); + route_changed = frappe.set_route("Form", frm.doc.reference_doctype, "new"); } route_changed.then(() => { const tour_name = frm.doc.name; - cur_frm.tour - .init({ tour_name }) - .then(() => cur_frm.tour.start()); + cur_frm.tour.init({ tour_name }).then(() => cur_frm.tour.start()); }); }); }, - disable_form: function(frm) { + disable_form: function (frm) { frm.set_read_only(); frm.fields .filter((field) => field.has_input) @@ -45,51 +43,48 @@ frappe.ui.form.on('Form Tour', { }, setup_queries(frm) { - frm.set_query("reference_doctype", function() { + frm.set_query("reference_doctype", function () { return { filters: { - istable: 0 - } + istable: 0, + }, }; }); - frm.trigger('reference_doctype'); + frm.trigger("reference_doctype"); }, reference_doctype(frm) { if (!frm.doc.reference_doctype) return; - frm.set_fields_as_options( - "fieldname", - frm.doc.reference_doctype, - df => !df.hidden - ).then(options => { - frm.fields_dict.steps.grid.update_docfield_property( - "fieldname", - "options", - [""].concat(options) - ); - }); + frm.set_fields_as_options("fieldname", frm.doc.reference_doctype, (df) => !df.hidden).then( + (options) => { + frm.fields_dict.steps.grid.update_docfield_property( + "fieldname", + "options", + [""].concat(options) + ); + } + ); frm.set_fields_as_options( - 'parent_fieldname', + "parent_fieldname", frm.doc.reference_doctype, - (df) => df.fieldtype == "Table" && !df.hidden, - ).then(options => { + (df) => df.fieldtype == "Table" && !df.hidden + ).then((options) => { frm.fields_dict.steps.grid.update_docfield_property( "parent_fieldname", "options", [""].concat(options) ); }); - - } + }, }); -frappe.ui.form.on('Form Tour Step', { +frappe.ui.form.on("Form Tour Step", { form_render(frm, cdt, cdn) { if (locals[cdt][cdn].is_table_field) { - frm.trigger('parent_fieldname', cdt, cdn); + frm.trigger("parent_fieldname", cdt, cdn); } }, parent_fieldname(frm, cdt, cdn) { @@ -97,37 +92,36 @@ frappe.ui.form.on('Form Tour Step', { const parent_fieldname_df = frappe .get_meta(frm.doc.reference_doctype) - .fields.find(df => df.fieldname == child_row.parent_fieldname); + .fields.find((df) => df.fieldname == child_row.parent_fieldname); frm.set_fields_as_options( - 'fieldname', + "fieldname", parent_fieldname_df.options, - (df) => !df.hidden, - ).then(options => { + (df) => !df.hidden + ).then((options) => { frm.fields_dict.steps.grid.update_docfield_property( "fieldname", "options", [""].concat(options) ); if (child_row.fieldname) { - frappe.model.set_value(cdt, cdn, 'fieldname', child_row.fieldname); + frappe.model.set_value(cdt, cdn, "fieldname", child_row.fieldname); } }); - } + }, }); async function check_if_single(doctype) { - const { message } = await frappe.db.get_value('DocType', doctype, 'issingle'); + const { message } = await frappe.db.get_value("DocType", doctype, "issingle"); return message.issingle || 0; } async function get_first_document(doctype) { let docname; - await frappe.db.get_list(doctype, { order_by: "creation" }).then(res => { - if (Array.isArray(res) && res.length) - docname = res[0].name; + await frappe.db.get_list(doctype, { order_by: "creation" }).then((res) => { + if (Array.isArray(res) && res.length) docname = res[0].name; }); - return docname || 'new'; + return docname || "new"; } diff --git a/frappe/desk/doctype/global_search_settings/global_search_settings.js b/frappe/desk/doctype/global_search_settings/global_search_settings.js index c333f83585..147a72eef1 100644 --- a/frappe/desk/doctype/global_search_settings/global_search_settings.js +++ b/frappe/desk/doctype/global_search_settings/global_search_settings.js @@ -1,14 +1,17 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Global Search Settings', { - refresh: function(frm) { - - frappe.realtime.on('global_search_settings', (data) => { +frappe.ui.form.on("Global Search Settings", { + refresh: function (frm) { + frappe.realtime.on("global_search_settings", (data) => { if (data.progress) { - frm.dashboard.show_progress('Setting up Global Search', data.progress / data.total * 100, data.msg); + frm.dashboard.show_progress( + "Setting up Global Search", + (data.progress / data.total) * 100, + data.msg + ); if (data.progress === data.total) { - frm.dashboard.hide_progress('Setting up Global Search'); + frm.dashboard.hide_progress("Setting up Global Search"); } } }); @@ -16,14 +19,14 @@ frappe.ui.form.on('Global Search Settings', { frm.add_custom_button(__("Reset"), function () { frappe.call({ method: "frappe.desk.doctype.global_search_settings.global_search_settings.reset_global_search_settings_doctypes", - callback: function() { + callback: function () { frappe.show_alert({ message: __("Global Search Document Types Reset."), - indicator: "green" + indicator: "green", }); frm.refresh(); - } + }, }); }); - } + }, }); diff --git a/frappe/desk/doctype/kanban_board/kanban_board.js b/frappe/desk/doctype/kanban_board/kanban_board.js index ff80a58fa0..3b815fef0e 100644 --- a/frappe/desk/doctype/kanban_board/kanban_board.js +++ b/frappe/desk/doctype/kanban_board/kanban_board.js @@ -1,43 +1,45 @@ // Copyright (c) 2016, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Kanban Board', { - onload: function(frm) { - frm.trigger('reference_doctype'); +frappe.ui.form.on("Kanban Board", { + onload: function (frm) { + frm.trigger("reference_doctype"); }, - refresh: function(frm) { - if(frm.is_new()) return; - frm.add_custom_button("Show Board", function() { + refresh: function (frm) { + if (frm.is_new()) return; + frm.add_custom_button("Show Board", function () { frappe.set_route("List", frm.doc.reference_doctype, "Kanban", frm.doc.name); }); }, - reference_doctype: function(frm) { - + reference_doctype: function (frm) { // set field options - if(!frm.doc.reference_doctype) return; + if (!frm.doc.reference_doctype) return; - frappe.model.with_doctype(frm.doc.reference_doctype, function() { - var options = $.map(frappe.get_meta(frm.doc.reference_doctype).fields, - function(d) { - if(d.fieldname && d.fieldtype === 'Select' && - frappe.model.no_value_type.indexOf(d.fieldtype)===-1) { - return d.fieldname; - } - return null; - }); - frm.set_df_property('field_name', 'options', options); - frm.get_field('field_name').refresh(); + frappe.model.with_doctype(frm.doc.reference_doctype, function () { + var options = $.map(frappe.get_meta(frm.doc.reference_doctype).fields, function (d) { + if ( + d.fieldname && + d.fieldtype === "Select" && + frappe.model.no_value_type.indexOf(d.fieldtype) === -1 + ) { + return d.fieldname; + } + return null; + }); + frm.set_df_property("field_name", "options", options); + frm.get_field("field_name").refresh(); }); }, - field_name: function(frm) { + field_name: function (frm) { var field = frappe.meta.get_field(frm.doc.reference_doctype, frm.doc.field_name); frm.doc.columns = []; - field.options && field.options.split('\n').forEach(function(o) { - o = o.trim(); - if(!o) return; - var d = frm.add_child('columns'); - d.column_name = o; - }); + field.options && + field.options.split("\n").forEach(function (o) { + o = o.trim(); + if (!o) return; + var d = frm.add_child("columns"); + d.column_name = o; + }); frm.refresh(); - } + }, }); diff --git a/frappe/desk/doctype/list_view_settings/list_view_settings.js b/frappe/desk/doctype/list_view_settings/list_view_settings.js index db33f71675..007a242dd3 100644 --- a/frappe/desk/doctype/list_view_settings/list_view_settings.js +++ b/frappe/desk/doctype/list_view_settings/list_view_settings.js @@ -1,8 +1,7 @@ // Copyright (c) 2020, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('List View Settings', { +frappe.ui.form.on("List View Settings", { // refresh: function(frm) { - // } -}); \ No newline at end of file +}); diff --git a/frappe/desk/doctype/module_onboarding/module_onboarding.js b/frappe/desk/doctype/module_onboarding/module_onboarding.js index d95920e2ca..0e312025bf 100644 --- a/frappe/desk/doctype/module_onboarding/module_onboarding.js +++ b/frappe/desk/doctype/module_onboarding/module_onboarding.js @@ -2,7 +2,7 @@ // For license information, please see license.txt frappe.ui.form.on("Module Onboarding", { - refresh: function(frm) { + refresh: function (frm) { frappe.boot.developer_mode && frm.set_intro( __( @@ -15,7 +15,7 @@ frappe.ui.form.on("Module Onboarding", { } }, - disable_form: function(frm) { + disable_form: function (frm) { frm.set_read_only(); frm.fields .filter((field) => field.has_input) diff --git a/frappe/desk/doctype/note/note.js b/frappe/desk/doctype/note/note.js index 5718180b70..dd556a3969 100644 --- a/frappe/desk/doctype/note/note.js +++ b/frappe/desk/doctype/note/note.js @@ -1,5 +1,5 @@ frappe.ui.form.on("Note", { - refresh: function(frm) { + refresh: function (frm) { if (frm.doc.__islocal) { frm.events.set_editable(frm, true); } else { @@ -8,13 +8,13 @@ frappe.ui.form.on("Note", { } // toggle edit - frm.add_custom_button("Edit", function() { + frm.add_custom_button("Edit", function () { frm.events.set_editable(frm, !frm.is_note_editable); }); frm.events.set_editable(frm, false); } }, - set_editable: function(frm, editable) { + set_editable: function (frm, editable) { // hide all fields other than content // no permission @@ -24,7 +24,7 @@ frappe.ui.form.on("Note", { frm.set_df_property("content", "read_only", editable ? 0 : 1); // hide all other fields - $.each(frm.fields_dict, function(fieldname) { + $.each(frm.fields_dict, function (fieldname) { if (fieldname !== "content") { frm.set_df_property(fieldname, "hidden", editable ? 0 : 1); } @@ -36,10 +36,10 @@ frappe.ui.form.on("Note", { // set flag for toggle frm.is_note_editable = editable; - } + }, }); -frappe.tour['Note'] = [ +frappe.tour["Note"] = [ { fieldname: "title", title: "Title of the Note", @@ -48,6 +48,7 @@ frappe.tour['Note'] = [ { fieldname: "public", title: "Sets the Note to Public", - description: "You can change the visibility of the note with this, setting it to public will allow other users to view it.", + description: + "You can change the visibility of the note with this, setting it to public will allow other users to view it.", }, -]; \ No newline at end of file +]; diff --git a/frappe/desk/doctype/note/note_list.js b/frappe/desk/doctype/note/note_list.js index f7f8d37dcf..1e0ed40880 100644 --- a/frappe/desk/doctype/note/note_list.js +++ b/frappe/desk/doctype/note/note_list.js @@ -1,13 +1,13 @@ -frappe.listview_settings['Note'] = { - onload: function(me) { +frappe.listview_settings["Note"] = { + onload: function (me) { me.page.set_title(__("Notes")); }, add_fields: ["title", "public"], - get_indicator: function(doc) { - if(doc.public) { + get_indicator: function (doc) { + if (doc.public) { return [__("Public"), "green", "public,=,Yes"]; } else { return [__("Private"), "gray", "public,=,No"]; } - } -} + }, +}; diff --git a/frappe/desk/doctype/notification_log/notification_log.js b/frappe/desk/doctype/notification_log/notification_log.js index 1f381d115b..ea5fdc6400 100644 --- a/frappe/desk/doctype/notification_log/notification_log.js +++ b/frappe/desk/doctype/notification_log/notification_log.js @@ -1,25 +1,25 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Notification Log', { - refresh: function(frm) { +frappe.ui.form.on("Notification Log", { + refresh: function (frm) { if (frm.doc.attached_file) { - frm.trigger('set_attachment'); + frm.trigger("set_attachment"); } else { - frm.get_field('attachment_link').$wrapper.empty(); + frm.get_field("attachment_link").$wrapper.empty(); } }, - open_reference_document: function(frm) { + open_reference_document: function (frm) { const dt = frm.doc.document_type; const dn = frm.doc.document_name; - frappe.set_route('Form', dt, dn); + frappe.set_route("Form", dt, dn); }, - set_attachment: function(frm) { + set_attachment: function (frm) { const attachment = JSON.parse(frm.doc.attached_file); - const $wrapper = frm.get_field('attachment_link').$wrapper; + const $wrapper = frm.get_field("attachment_link").$wrapper; $wrapper.html(`
@@ -41,5 +41,5 @@ frappe.ui.form.on('Notification Log', { frappe.msgprint(__("Please enable pop-ups")); } }); - } + }, }); diff --git a/frappe/desk/doctype/notification_settings/notification_settings.js b/frappe/desk/doctype/notification_settings/notification_settings.js index cc2fd95204..ba72369273 100644 --- a/frappe/desk/doctype/notification_settings/notification_settings.js +++ b/frappe/desk/doctype/notification_settings/notification_settings.js @@ -1,28 +1,27 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Notification Settings', { +frappe.ui.form.on("Notification Settings", { onload: (frm) => { frappe.breadcrumbs.add({ - label: __('Settings'), - route: '#modules/Settings', - type: 'Custom' + label: __("Settings"), + route: "#modules/Settings", + type: "Custom", }); - frm.set_query('subscribed_documents', () => { + frm.set_query("subscribed_documents", () => { return { filters: { - istable: 0 - } + istable: 0, + }, }; }); }, refresh: (frm) => { - if (frappe.user.has_role('System Manager')) { - frm.add_custom_button(__('Go to Notification Settings List'), () => { - frappe.set_route('List', 'Notification Settings'); + if (frappe.user.has_role("System Manager")) { + frm.add_custom_button(__("Go to Notification Settings List"), () => { + frappe.set_route("List", "Notification Settings"); }); } - } - + }, }); diff --git a/frappe/desk/doctype/number_card/number_card.js b/frappe/desk/doctype/number_card/number_card.js index 79ddb71187..77ab2b4ef8 100644 --- a/frappe/desk/doctype/number_card/number_card.js +++ b/frappe/desk/doctype/number_card/number_card.js @@ -1,73 +1,75 @@ // Copyright (c) 2020, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Number Card', { - refresh: function(frm) { +frappe.ui.form.on("Number Card", { + refresh: function (frm) { if (!frappe.boot.developer_mode && frm.doc.is_standard) { frm.disable_form(); } frm.set_df_property("filters_section", "hidden", 1); frm.set_df_property("dynamic_filters_section", "hidden", 1); - frm.trigger('set_options'); + frm.trigger("set_options"); if (!frm.doc.type) { - frm.set_value('type', 'Document Type'); + frm.set_value("type", "Document Type"); } - if (frm.doc.type == 'Report' && frm.doc.report_name) { - frm.trigger('set_report_filters'); + if (frm.doc.type == "Report" && frm.doc.report_name) { + frm.trigger("set_report_filters"); } - if (frm.doc.type == 'Custom') { + if (frm.doc.type == "Custom") { if (!frappe.boot.developer_mode) { frm.disable_form(); } frm.filters = eval(frm.doc.filters_config); - frm.trigger('set_filters_description'); - frm.trigger('set_method_description'); - frm.trigger('render_filters_table'); + frm.trigger("set_filters_description"); + frm.trigger("set_method_description"); + frm.trigger("render_filters_table"); } - frm.trigger('set_parent_document_type'); + frm.trigger("set_parent_document_type"); if (!frm.is_new()) { - frm.trigger('create_add_to_dashboard_button'); + frm.trigger("create_add_to_dashboard_button"); } }, - create_add_to_dashboard_button: function(frm) { - frm.add_custom_button('Add Card to Dashboard', () => { + create_add_to_dashboard_button: function (frm) { + frm.add_custom_button("Add Card to Dashboard", () => { const dialog = frappe.dashboard_utils.get_add_to_dashboard_dialog( frm.doc.name, - 'Number Card', - 'frappe.desk.doctype.number_card.number_card.add_card_to_dashboard' + "Number Card", + "frappe.desk.doctype.number_card.number_card.add_card_to_dashboard" ); if (!frm.doc.name) { - frappe.msgprint(__('Please create Card first')); + frappe.msgprint(__("Please create Card first")); } else { dialog.show(); } }); }, - before_save: function(frm) { - let dynamic_filters = JSON.parse(frm.doc.dynamic_filters_json || 'null'); - let static_filters = JSON.parse(frm.doc.filters_json || 'null'); - static_filters = - frappe.dashboard_utils.remove_common_static_filter_values(static_filters, dynamic_filters); + before_save: function (frm) { + let dynamic_filters = JSON.parse(frm.doc.dynamic_filters_json || "null"); + let static_filters = JSON.parse(frm.doc.filters_json || "null"); + static_filters = frappe.dashboard_utils.remove_common_static_filter_values( + static_filters, + dynamic_filters + ); - frm.set_value('filters_json', JSON.stringify(static_filters)); - frm.trigger('render_filters_table'); - frm.trigger('render_dynamic_filters_table'); + frm.set_value("filters_json", JSON.stringify(static_filters)); + frm.trigger("render_filters_table"); + frm.trigger("render_dynamic_filters_table"); }, - is_standard: function(frm) { - frm.trigger('render_dynamic_filters_table'); + is_standard: function (frm) { + frm.trigger("render_dynamic_filters_table"); frm.set_df_property("dynamic_filters_section", "hidden", 1); }, - set_filters_description: function(frm) { - if (frm.doc.type == 'Custom') { + set_filters_description: function (frm) { + if (frm.doc.type == "Custom") { frm.fields_dict.filters_config.set_description(` Set the filters here. For example:
@@ -91,8 +93,8 @@ frappe.ui.form.on('Number Card', {
 		}
 	},
 
-	set_method_description: function(frm) {
-		if (frm.doc.type == 'Custom') {
+	set_method_description: function (frm) {
+		if (frm.doc.type == "Custom") {
 			frm.fields_dict.method.set_description(`
 		Set the path to a whitelisted function that will return the number on the card in the format:
 
@@ -105,53 +107,52 @@ frappe.ui.form.on('Number Card', {
 		}
 	},
 
-	type: function(frm) {
-		frm.trigger('set_filters_description');
-		if (frm.doc.type == 'Report') {
-			frm.set_query('report_name', () => {
+	type: function (frm) {
+		frm.trigger("set_filters_description");
+		if (frm.doc.type == "Report") {
+			frm.set_query("report_name", () => {
 				return {
 					filters: {
-						'report_type': ['!=', 'Report Builder']
-					}
+						report_type: ["!=", "Report Builder"],
+					},
 				};
 			});
 		}
-
 	},
 
-	report_name: function(frm) {
+	report_name: function (frm) {
 		frm.filters = [];
-		frm.set_value('filters_json', '{}');
-		frm.set_value('dynamic_filters_json', '{}');
-		frm.set_df_property('report_field', 'options', []);
-		frm.trigger('set_report_filters');
+		frm.set_value("filters_json", "{}");
+		frm.set_value("dynamic_filters_json", "{}");
+		frm.set_df_property("report_field", "options", []);
+		frm.trigger("set_report_filters");
 	},
 
-	filters_config: function(frm) {
+	filters_config: function (frm) {
 		frm.filters = eval(frm.doc.filters_config);
 		const filter_values = frappe.report_utils.get_filter_values(frm.filters);
-		frm.set_value('filters_json', JSON.stringify(filter_values));
-		frm.trigger('render_filters_table');
+		frm.set_value("filters_json", JSON.stringify(filter_values));
+		frm.trigger("render_filters_table");
 	},
 
-	document_type: function(frm) {
-		frm.set_query('document_type', function() {
+	document_type: function (frm) {
+		frm.set_query("document_type", function () {
 			return {
 				filters: {
-					'issingle': false
-				}
+					issingle: false,
+				},
 			};
 		});
-		frm.set_value('filters_json', '[]');
-		frm.set_value('dynamic_filters_json', '[]');
-		frm.set_value('aggregate_function_based_on', '');
-		frm.set_value('parent_document_type', '');
-		frm.trigger('set_options');
-		frm.trigger('set_parent_document_type');
+		frm.set_value("filters_json", "[]");
+		frm.set_value("dynamic_filters_json", "[]");
+		frm.set_value("aggregate_function_based_on", "");
+		frm.set_value("parent_document_type", "");
+		frm.trigger("set_options");
+		frm.trigger("set_parent_document_type");
 	},
 
-	set_options: function(frm) {
-		if (frm.doc.type !== 'Document Type') {
+	set_options: function (frm) {
+		if (frm.doc.type !== "Document Type") {
 			return;
 		}
 
@@ -160,134 +161,148 @@ frappe.ui.form.on('Number Card', {
 
 		if (doctype) {
 			frappe.model.with_doctype(doctype, () => {
-				frappe.get_meta(doctype).fields.map(df => {
+				frappe.get_meta(doctype).fields.map((df) => {
 					if (frappe.model.numeric_fieldtypes.includes(df.fieldtype)) {
-						if (df.fieldtype == 'Currency') {
-							if (!df.options || df.options !== 'Company:company:default_currency') {
+						if (df.fieldtype == "Currency") {
+							if (!df.options || df.options !== "Company:company:default_currency") {
 								return;
 							}
 						}
-						aggregate_based_on_fields.push({label: df.label, value: df.fieldname});
+						aggregate_based_on_fields.push({ label: df.label, value: df.fieldname });
 					}
 				});
 
-				frm.set_df_property('aggregate_function_based_on', 'options', aggregate_based_on_fields);
+				frm.set_df_property(
+					"aggregate_function_based_on",
+					"options",
+					aggregate_based_on_fields
+				);
 			});
-			frm.trigger('render_filters_table');
-			frm.trigger('render_dynamic_filters_table');
+			frm.trigger("render_filters_table");
+			frm.trigger("render_dynamic_filters_table");
 		}
 	},
 
-	set_report_filters: function(frm) {
+	set_report_filters: function (frm) {
 		const report_name = frm.doc.report_name;
 		if (report_name) {
-			frappe.report_utils.get_report_filters(report_name).then(filters => {
+			frappe.report_utils.get_report_filters(report_name).then((filters) => {
 				if (filters) {
 					frm.filters = filters;
 					const filter_values = frappe.report_utils.get_filter_values(filters);
 					if (frm.doc.filters_json.length <= 2) {
-						frm.set_value('filters_json', JSON.stringify(filter_values));
+						frm.set_value("filters_json", JSON.stringify(filter_values));
 					}
 				}
-				frm.trigger('render_filters_table');
-				frm.trigger('set_report_field_options');
-				frm.trigger('render_dynamic_filters_table');
+				frm.trigger("render_filters_table");
+				frm.trigger("set_report_field_options");
+				frm.trigger("render_dynamic_filters_table");
 			});
 		}
 	},
 
-	set_report_field_options: function(frm) {
+	set_report_field_options: function (frm) {
 		let filters = frm.doc.filters_json.length > 2 ? JSON.parse(frm.doc.filters_json) : null;
 		if (frm.doc.dynamic_filters_json && frm.doc.dynamic_filters_json.length > 2) {
 			filters = frappe.dashboard_utils.get_all_filters(frm.doc);
 		}
-		frappe.xcall(
-			'frappe.desk.query_report.run',
-			{
+		frappe
+			.xcall("frappe.desk.query_report.run", {
 				report_name: frm.doc.report_name,
 				filters: filters,
-				ignore_prepared_report: 1
-			}
-		).then(data => {
-			if (data.result.length) {
-				frm.field_options = frappe.report_utils.get_field_options_from_report(data.columns, data);
-				frm.set_df_property('report_field', 'options', frm.field_options.numeric_fields);
-				if (!frm.field_options.numeric_fields.length) {
-					frappe.msgprint(__("Report has no numeric fields, please change the Report Name"));
+				ignore_prepared_report: 1,
+			})
+			.then((data) => {
+				if (data.result.length) {
+					frm.field_options = frappe.report_utils.get_field_options_from_report(
+						data.columns,
+						data
+					);
+					frm.set_df_property(
+						"report_field",
+						"options",
+						frm.field_options.numeric_fields
+					);
+					if (!frm.field_options.numeric_fields.length) {
+						frappe.msgprint(
+							__("Report has no numeric fields, please change the Report Name")
+						);
+					}
+				} else {
+					frappe.msgprint(
+						__(
+							"Report has no data, please modify the filters or change the Report Name"
+						)
+					);
 				}
-			} else {
-				frappe.msgprint(__('Report has no data, please modify the filters or change the Report Name'));
-			}
-		});
+			});
 	},
 
-	render_filters_table: function(frm) {
+	render_filters_table: function (frm) {
 		frm.set_df_property("filters_section", "hidden", 0);
-		let is_document_type = frm.doc.type == 'Document Type';
-		let is_dynamic_filter = f => ['Date', 'DateRange'].includes(f.fieldtype) && f.default;
+		let is_document_type = frm.doc.type == "Document Type";
+		let is_dynamic_filter = (f) => ["Date", "DateRange"].includes(f.fieldtype) && f.default;
 
-		let wrapper = $(frm.get_field('filters_json').wrapper).empty();
+		let wrapper = $(frm.get_field("filters_json").wrapper).empty();
 		let table = $(`
-					
-					
-					
+					
+					
+					
${__('Filter')}${__('Condition')}${__('Value')}${__("Filter")}${__("Condition")}${__("Value")}
`).appendTo(wrapper); $(`

${__("Click table to edit")}

`).appendTo(wrapper); - let filters = JSON.parse(frm.doc.filters_json || '[]'); + let filters = JSON.parse(frm.doc.filters_json || "[]"); let filters_set = false; // Set dynamic filters for reports - if (frm.doc.type == 'Report') { + if (frm.doc.type == "Report") { let set_filters = false; - frm.filters.forEach(f => { + frm.filters.forEach((f) => { if (is_dynamic_filter(f)) { filters[f.fieldname] = f.default; set_filters = true; } }); - set_filters && frm.set_value('filters_json', JSON.stringify(filters)); + set_filters && frm.set_value("filters_json", JSON.stringify(filters)); } let fields = []; if (is_document_type) { fields = [ { - fieldtype: 'HTML', - fieldname: 'filter_area', - } + fieldtype: "HTML", + fieldname: "filter_area", + }, ]; if (filters.length) { - filters.forEach(filter => { - const filter_row = - $(` + filters.forEach((filter) => { + const filter_row = $(` ${filter[1]} ${filter[2] || ""} ${filter[3]} `); - table.find('tbody').append(filter_row); + table.find("tbody").append(filter_row); }); filters_set = true; } } else if (frm.filters.length) { - fields = frm.filters.filter(f => f.fieldname); - fields.map(f => { + fields = frm.filters.filter((f) => f.fieldname); + fields.map((f) => { if (filters[f.fieldname]) { - let condition = '='; - const filter_row = - $(` + let condition = "="; + const filter_row = $(` ${f.label} ${condition} ${filters[f.fieldname] || ""} `); - table.find('tbody').append(filter_row); + table.find("tbody").append(filter_row); if (!filters_set) filters_set = true; } }); @@ -296,32 +311,32 @@ frappe.ui.form.on('Number Card', { if (!filters_set) { const filter_row = $(` ${__("Click to Set Filters")}`); - table.find('tbody').append(filter_row); + table.find("tbody").append(filter_row); } - table.on('click', () => { + table.on("click", () => { let dialog = new frappe.ui.Dialog({ - title: __('Set Filters'), - fields: fields.filter(f => !is_dynamic_filter(f)), - primary_action: function() { + title: __("Set Filters"), + fields: fields.filter((f) => !is_dynamic_filter(f)), + primary_action: function () { let values = this.get_values(); if (values) { this.hide(); if (is_document_type) { let filters = frm.filter_group.get_filters(); - frm.set_value('filters_json', JSON.stringify(filters)); + frm.set_value("filters_json", JSON.stringify(filters)); } else { - frm.set_value('filters_json', JSON.stringify(values)); + frm.set_value("filters_json", JSON.stringify(values)); } - frm.trigger('render_filters_table'); + frm.trigger("render_filters_table"); } }, - primary_action_label: "Set" + primary_action_label: "Set", }); if (is_document_type) { frm.filter_group = new frappe.ui.FilterGroup({ - parent: dialog.get_field('filter_area').$wrapper, + parent: dialog.get_field("filter_area").$wrapper, doctype: frm.doc.document_type, parent_doctype: frm.doc.parent_document_type, on_change: () => {}, @@ -331,56 +346,61 @@ frappe.ui.form.on('Number Card', { dialog.show(); - if (frm.doc.type == 'Report') { + if (frm.doc.type == "Report") { //Set query report object so that it can be used while fetching filter values in the report - frappe.query_report = new frappe.views.QueryReport({'filters': dialog.fields_list}); - frappe.query_reports[frm.doc.report_name] - && frappe.query_reports[frm.doc.report_name].onload - && frappe.query_reports[frm.doc.report_name].onload(frappe.query_report); + frappe.query_report = new frappe.views.QueryReport({ + filters: dialog.fields_list, + }); + frappe.query_reports[frm.doc.report_name] && + frappe.query_reports[frm.doc.report_name].onload && + frappe.query_reports[frm.doc.report_name].onload(frappe.query_report); } dialog.set_values(filters); }); - }, render_dynamic_filters_table(frm) { - if (!frappe.boot.developer_mode || !frm.doc.is_standard || frm.doc.type == 'Custom') { + if (!frappe.boot.developer_mode || !frm.doc.is_standard || frm.doc.type == "Custom") { return; } frm.set_df_property("dynamic_filters_section", "hidden", 0); - let is_document_type = frm.doc.type == 'Document Type'; + let is_document_type = frm.doc.type == "Document Type"; - let wrapper = $(frm.get_field('dynamic_filters_json').wrapper).empty(); + let wrapper = $(frm.get_field("dynamic_filters_json").wrapper).empty(); - frm.dynamic_filter_table = $(` + frm.dynamic_filter_table = + $(`
- - - + + +
${__('Filter')}${__('Condition')}${__('Value')}${__("Filter")}${__("Condition")}${__("Value")}
`).appendTo(wrapper); - frm.dynamic_filters = frm.doc.dynamic_filters_json && frm.doc.dynamic_filters_json.length > 2 - ? JSON.parse(frm.doc.dynamic_filters_json) - : null; + frm.dynamic_filters = + frm.doc.dynamic_filters_json && frm.doc.dynamic_filters_json.length > 2 + ? JSON.parse(frm.doc.dynamic_filters_json) + : null; - frm.trigger('set_dynamic_filters_in_table'); + frm.trigger("set_dynamic_filters_in_table"); - let filters = JSON.parse(frm.doc.filters_json || '[]'); + let filters = JSON.parse(frm.doc.filters_json || "[]"); let fields = frappe.dashboard_utils.get_fields_for_dynamic_filter_dialog( - is_document_type, filters, frm.dynamic_filters + is_document_type, + filters, + frm.dynamic_filters ); - frm.dynamic_filter_table.on('click', () => { + frm.dynamic_filter_table.on("click", () => { let dialog = new frappe.ui.Dialog({ - title: __('Set Dynamic Filters'), + title: __("Set Dynamic Filters"), fields: fields, primary_action: () => { let values = dialog.get_values(); @@ -388,19 +408,19 @@ frappe.ui.form.on('Number Card', { let dynamic_filters = []; for (let key of Object.keys(values)) { if (is_document_type) { - let [doctype, fieldname] = key.split(':'); - dynamic_filters.push([doctype, fieldname, '=', values[key]]); + let [doctype, fieldname] = key.split(":"); + dynamic_filters.push([doctype, fieldname, "=", values[key]]); } } if (is_document_type) { - frm.set_value('dynamic_filters_json', JSON.stringify(dynamic_filters)); + frm.set_value("dynamic_filters_json", JSON.stringify(dynamic_filters)); } else { - frm.set_value('dynamic_filters_json', JSON.stringify(values)); + frm.set_value("dynamic_filters_json", JSON.stringify(values)); } - frm.trigger('set_dynamic_filters_in_table'); + frm.trigger("set_dynamic_filters_in_table"); }, - primary_action_label: "Set" + primary_action_label: "Set", }); dialog.show(); @@ -408,71 +428,70 @@ frappe.ui.form.on('Number Card', { }); }, - set_dynamic_filters_in_table: function(frm) { - frm.dynamic_filters = frm.doc.dynamic_filters_json && frm.doc.dynamic_filters_json.length > 2 - ? JSON.parse(frm.doc.dynamic_filters_json) - : null; + set_dynamic_filters_in_table: function (frm) { + frm.dynamic_filters = + frm.doc.dynamic_filters_json && frm.doc.dynamic_filters_json.length > 2 + ? JSON.parse(frm.doc.dynamic_filters_json) + : null; if (!frm.dynamic_filters) { const filter_row = $(` ${__("Click to Set Dynamic Filters")}`); - frm.dynamic_filter_table.find('tbody').html(filter_row); + frm.dynamic_filter_table.find("tbody").html(filter_row); } else { - let filter_rows = ''; + let filter_rows = ""; if ($.isArray(frm.dynamic_filters)) { - frm.dynamic_filters.forEach(filter => { - filter_rows += - ` + frm.dynamic_filters.forEach((filter) => { + filter_rows += ` ${filter[1]} ${filter[2] || ""} ${filter[3]} `; }); } else { - let condition = '='; + let condition = "="; for (let [key, val] of Object.entries(frm.dynamic_filters)) { - filter_rows += - ` + filter_rows += ` ${key} ${condition} ${val || ""} - ` - ; + `; } } - frm.dynamic_filter_table.find('tbody').html(filter_rows); + frm.dynamic_filter_table.find("tbody").html(filter_rows); } }, - set_parent_document_type: async function(frm) { + set_parent_document_type: async function (frm) { let document_type = frm.doc.document_type; - let doc_is_table = document_type && - (await frappe.db.get_value('DocType', document_type, 'istable')).message.istable; + let doc_is_table = + document_type && + (await frappe.db.get_value("DocType", document_type, "istable")).message.istable; - frm.set_df_property('parent_document_type', 'hidden', !doc_is_table); + frm.set_df_property("parent_document_type", "hidden", !doc_is_table); if (document_type && doc_is_table) { - let parent = await frappe.db.get_list('DocField', { + let parent = await frappe.db.get_list("DocField", { filters: { - 'fieldtype': 'Table', - 'options': document_type + fieldtype: "Table", + options: document_type, }, - fields: ['parent'] + fields: ["parent"], }); - parent && frm.set_query('parent_document_type', function() { - return { - filters: { - "name": ['in', parent.map(({ parent }) => parent)] - } - }; - }); + parent && + frm.set_query("parent_document_type", function () { + return { + filters: { + name: ["in", parent.map(({ parent }) => parent)], + }, + }; + }); if (parent.length === 1) { - frm.set_value('parent_document_type', parent[0].parent); + frm.set_value("parent_document_type", parent[0].parent); } } - } - + }, }); diff --git a/frappe/desk/doctype/onboarding_permission/onboarding_permission.js b/frappe/desk/doctype/onboarding_permission/onboarding_permission.js index 752b8a02cc..ec2c8a03b0 100644 --- a/frappe/desk/doctype/onboarding_permission/onboarding_permission.js +++ b/frappe/desk/doctype/onboarding_permission/onboarding_permission.js @@ -1,8 +1,7 @@ // Copyright (c) 2020, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Onboarding Permission', { +frappe.ui.form.on("Onboarding Permission", { // refresh: function(frm) { - // } }); diff --git a/frappe/desk/doctype/onboarding_step/onboarding_step.js b/frappe/desk/doctype/onboarding_step/onboarding_step.js index 3c9bbab9ac..67b2ed0501 100644 --- a/frappe/desk/doctype/onboarding_step/onboarding_step.js +++ b/frappe/desk/doctype/onboarding_step/onboarding_step.js @@ -2,18 +2,17 @@ // For license information, please see license.txt frappe.ui.form.on("Onboarding Step", { - - setup: function(frm) { - frm.set_query("form_tour", function() { + setup: function (frm) { + frm.set_query("form_tour", function () { return { filters: { - reference_doctype: frm.doc.reference_document - } + reference_doctype: frm.doc.reference_document, + }, }; }); }, - refresh: function(frm) { + refresh: function (frm) { frappe.boot.developer_mode && frm.set_intro( __( @@ -30,15 +29,16 @@ frappe.ui.form.on("Onboarding Step", { } }, - reference_document: function(frm) { + reference_document: function (frm) { if (frm.doc.reference_document && frm.doc.action == "Update Settings") { setup_fields(frm); } }, - action: function(frm) { + action: function (frm) { if (frm.doc.action == "Show Form Tour") { - frm.fields_dict.reference_document.set_description(`You need to add the steps in the contoller JS file. For example: note.js + frm.fields_dict.reference_document + .set_description(`You need to add the steps in the contoller JS file. For example: note.js

 frappe.tour['Note'] = [
 	{
@@ -54,7 +54,7 @@ frappe.tour['Note'] = [
 		}
 	},
 
-	disable_form: function(frm) {
+	disable_form: function (frm) {
 		frm.set_read_only();
 		frm.fields
 			.filter((field) => field.has_input)
@@ -71,9 +71,7 @@ function setup_fields(frm) {
 			let fields = frappe
 				.get_meta(frm.doc.reference_document)
 				.fields.filter((df) => {
-					return ["Data", "Check", "Int", "Link", "Select"].includes(
-						df.fieldtype
-					);
+					return ["Data", "Check", "Int", "Link", "Select"].includes(df.fieldtype);
 				})
 				.map((df) => {
 					return {
diff --git a/frappe/desk/doctype/route_history/route_history.js b/frappe/desk/doctype/route_history/route_history.js
index 19689e406b..c68d4e2b54 100644
--- a/frappe/desk/doctype/route_history/route_history.js
+++ b/frappe/desk/doctype/route_history/route_history.js
@@ -1,8 +1,6 @@
 // Copyright (c) 2018, Frappe Technologies and contributors
 // For license information, please see license.txt
 
-frappe.ui.form.on('Route History', {
-	refresh: function() {
-
-	}
+frappe.ui.form.on("Route History", {
+	refresh: function () {},
 });
diff --git a/frappe/desk/doctype/route_history/route_history_list.js b/frappe/desk/doctype/route_history/route_history_list.js
index 84a441852c..03bf86b9fd 100644
--- a/frappe/desk/doctype/route_history/route_history_list.js
+++ b/frappe/desk/doctype/route_history/route_history_list.js
@@ -1,7 +1,7 @@
 frappe.listview_settings["Route History"] = {
-	onload: function(listview) {
+	onload: function (listview) {
 		frappe.require("logtypes.bundle.js", () => {
 			frappe.utils.logtypes.show_log_retention_message(cur_list.doctype);
-		})
+		});
 	},
 };
diff --git a/frappe/desk/doctype/system_console/system_console.js b/frappe/desk/doctype/system_console/system_console.js
index 7751ffe860..dc73f33b67 100644
--- a/frappe/desk/doctype/system_console/system_console.js
+++ b/frappe/desk/doctype/system_console/system_console.js
@@ -1,21 +1,21 @@
 // Copyright (c) 2020, Frappe Technologies and contributors
 // For license information, please see license.txt
 
-frappe.ui.form.on('System Console', {
-	onload: function(frm) {
+frappe.ui.form.on("System Console", {
+	onload: function (frm) {
 		frappe.ui.keys.add_shortcut({
-			shortcut: 'shift+enter',
-			action: () => frm.page.btn_primary.trigger('click'),
+			shortcut: "shift+enter",
+			action: () => frm.page.btn_primary.trigger("click"),
 			page: frm.page,
-			description: __('Execute Console script'),
+			description: __("Execute Console script"),
 			ignore_inputs: true,
 		});
 		frm.set_value("type", "Python");
 	},
 
-	refresh: function(frm) {
+	refresh: function (frm) {
 		frm.disable_save();
-		frm.page.set_primary_action(__("Execute"), $btn => {
+		frm.page.set_primary_action(__("Execute"), ($btn) => {
 			$btn.text(__("Executing..."));
 			return frm
 				.execute_action("Execute")
@@ -24,7 +24,7 @@ frappe.ui.form.on('System Console', {
 		});
 	},
 
-	type: function(frm) {
+	type: function (frm) {
 		if (frm.doc.type == "Python") {
 			frm.set_value("output", "");
 			if (frm.sql_output) {
@@ -34,7 +34,7 @@ frappe.ui.form.on('System Console', {
 		}
 	},
 
-	render_sql_output: function(frm) {
+	render_sql_output: function (frm) {
 		if (frm.doc.type !== "SQL") return;
 		if (frm.sql_output) {
 			frm.sql_output.destroy();
@@ -46,50 +46,51 @@ frappe.ui.form.on('System Console', {
 		}
 
 		let result = JSON.parse(frm.doc.output);
-		frm.set_value("output", `${result.length} ${result.length == 1 ? 'row' : 'rows'}`);
+		frm.set_value("output", `${result.length} ${result.length == 1 ? "row" : "rows"}`);
 
 		if (result.length) {
 			let columns = Object.keys(result[0]);
-			frm.sql_output = new DataTable(
-				frm.get_field("sql_output").$wrapper.get(0),
-				{
-					columns,
-					data: result
-				}
-			);
+			frm.sql_output = new DataTable(frm.get_field("sql_output").$wrapper.get(0), {
+				columns,
+				data: result,
+			});
 		}
 	},
 
-	show_processlist: function(frm) {
+	show_processlist: function (frm) {
 		if (frm.doc.show_processlist) {
 			// keep refreshing every 5 seconds
 			frm.events.refresh_processlist(frm);
-			frm.processlist_interval = setInterval(() => frm.events.refresh_processlist(frm), 5000);
+			frm.processlist_interval = setInterval(
+				() => frm.events.refresh_processlist(frm),
+				5000
+			);
 		} else {
 			if (frm.processlist_interval) {
-
 				// end it
 				clearInterval(frm.processlist_interval);
-				frm.get_field("processlist").html('');
+				frm.get_field("processlist").html("");
 			}
 		}
 	},
 
-	refresh_processlist: function(frm) {
+	refresh_processlist: function (frm) {
 		let timestamp = new Date();
-		frappe.call('frappe.desk.doctype.system_console.system_console.show_processlist').then(r => {
-			let rows = '';
-			for (let row of r.message) {
-				rows += `
+		frappe
+			.call("frappe.desk.doctype.system_console.system_console.show_processlist")
+			.then((r) => {
+				let rows = "";
+				for (let row of r.message) {
+					rows += `
 					${row.Id}
 					${row.Time}
 					${row.State}
 					${row.Info}
 					${row.Progress}
-				`
-			}
+				`;
+				}
 
-			frm.get_field('processlist').html(`
+				frm.get_field("processlist").html(`
 				

Requested on: ${timestamp}

@@ -100,6 +101,6 @@ frappe.ui.form.on('System Console', { ${rows}`); - }); + }); }, }); diff --git a/frappe/desk/doctype/tag/tag.js b/frappe/desk/doctype/tag/tag.js index f55f98c3d0..1c60f417e0 100644 --- a/frappe/desk/doctype/tag/tag.js +++ b/frappe/desk/doctype/tag/tag.js @@ -1,8 +1,7 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Tag', { +frappe.ui.form.on("Tag", { // refresh: function(frm) { - // } }); diff --git a/frappe/desk/doctype/tag_link/tag_link.js b/frappe/desk/doctype/tag_link/tag_link.js index d85655bb90..e2cb4fcd7f 100644 --- a/frappe/desk/doctype/tag_link/tag_link.js +++ b/frappe/desk/doctype/tag_link/tag_link.js @@ -1,8 +1,7 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Tag Link', { +frappe.ui.form.on("Tag Link", { // refresh: function(frm) { - // } }); diff --git a/frappe/desk/doctype/todo/todo.js b/frappe/desk/doctype/todo/todo.js index 0317281371..6c1af67d2b 100644 --- a/frappe/desk/doctype/todo/todo.js +++ b/frappe/desk/doctype/todo/todo.js @@ -1,40 +1,55 @@ // bind events frappe.ui.form.on("ToDo", { - onload: function(frm) { - frm.set_query("reference_type", function(txt) { + onload: function (frm) { + frm.set_query("reference_type", function (txt) { return { - "filters": { - "issingle": 0, - } + filters: { + issingle: 0, + }, }; }); }, - refresh: function(frm) { - if(frm.doc.reference_type && frm.doc.reference_name) { - frm.add_custom_button(__(frm.doc.reference_name), function() { + refresh: function (frm) { + if (frm.doc.reference_type && frm.doc.reference_name) { + frm.add_custom_button(__(frm.doc.reference_name), function () { frappe.set_route("Form", frm.doc.reference_type, frm.doc.reference_name); }); } if (!frm.doc.__islocal) { - if(frm.doc.status!=="Closed") { - frm.add_custom_button(__("Close"), function() { - frm.set_value("status", "Closed"); - frm.save(null, function() { - // back to list - frappe.set_route("List", "ToDo"); - }); - }, "fa fa-check", "btn-success"); + if (frm.doc.status !== "Closed") { + frm.add_custom_button( + __("Close"), + function () { + frm.set_value("status", "Closed"); + frm.save(null, function () { + // back to list + frappe.set_route("List", "ToDo"); + }); + }, + "fa fa-check", + "btn-success" + ); } else { - frm.add_custom_button(__("Reopen"), function() { - frm.set_value("status", "Open"); - frm.save(); - }, null, "btn-default"); + frm.add_custom_button( + __("Reopen"), + function () { + frm.set_value("status", "Open"); + frm.save(); + }, + null, + "btn-default" + ); } - frm.add_custom_button(__("New"), function() { - frappe.new_doc("ToDo") - }, null, "btn-default"); + frm.add_custom_button( + __("New"), + function () { + frappe.new_doc("ToDo"); + }, + null, + "btn-default" + ); } - } + }, }); diff --git a/frappe/desk/doctype/todo/todo_calendar.js b/frappe/desk/doctype/todo/todo_calendar.js index 8ba020fac1..f79243a86e 100644 --- a/frappe/desk/doctype/todo/todo_calendar.js +++ b/frappe/desk/doctype/todo/todo_calendar.js @@ -3,29 +3,27 @@ frappe.views.calendar["ToDo"] = { field_map: { - "start": "date", - "end": "date", - "id": "name", - "title": "description", - "allDay": "allDay", - "progress": "progress" + start: "date", + end: "date", + id: "name", + title: "description", + allDay: "allDay", + progress: "progress", }, gantt: true, filters: [ { - "fieldtype": "Link", - "fieldname": "reference_type", - "options": "Task", - "label": __("Task") + fieldtype: "Link", + fieldname: "reference_type", + options: "Task", + label: __("Task"), }, { - "fieldtype": "Dynamic Link", - "fieldname": "reference_name", - "options": "reference_type", - "label": __("Task") - } - + fieldtype: "Dynamic Link", + fieldname: "reference_name", + options: "reference_type", + label: __("Task"), + }, ], - get_events_method: "frappe.desk.calendar.get_events" + get_events_method: "frappe.desk.calendar.get_events", }; - diff --git a/frappe/desk/doctype/todo/todo_list.js b/frappe/desk/doctype/todo/todo_list.js index 53564cc017..2e4534e05c 100644 --- a/frappe/desk/doctype/todo/todo_list.js +++ b/frappe/desk/doctype/todo/todo_list.js @@ -1,40 +1,44 @@ -frappe.listview_settings['ToDo'] = { +frappe.listview_settings["ToDo"] = { hide_name_column: true, add_fields: ["reference_type", "reference_name"], - onload: function(me) { + onload: function (me) { if (!frappe.route_options) { frappe.route_options = { - "owner": frappe.session.user, - "status": "Open" + owner: frappe.session.user, + status: "Open", }; } me.page.set_title(__("To Do")); }, button: { - show: function(doc) { + show: function (doc) { return doc.reference_name; }, - get_label: function() { - return __('Open'); + get_label: function () { + return __("Open"); }, - get_description: function(doc) { - return __('Open {0}', [`${doc.reference_type} ${doc.reference_name}`]) + get_description: function (doc) { + return __("Open {0}", [`${doc.reference_type} ${doc.reference_name}`]); + }, + action: function (doc) { + frappe.set_route("Form", doc.reference_type, doc.reference_name); }, - action: function(doc) { - frappe.set_route('Form', doc.reference_type, doc.reference_name); - } }, - refresh: function(me) { + refresh: function (me) { if (me.todo_sidebar_setup) return; // add assigned by me - me.page.add_sidebar_item(__("Assigned By Me"), function() { - me.filter_area.add([[me.doctype, "assigned_by", '=', frappe.session.user]]); - }, ('.list-link[data-view="Kanban"]')); + me.page.add_sidebar_item( + __("Assigned By Me"), + function () { + me.filter_area.add([[me.doctype, "assigned_by", "=", frappe.session.user]]); + }, + '.list-link[data-view="Kanban"]' + ); me.todo_sidebar_setup = true; }, -} \ No newline at end of file +}; diff --git a/frappe/desk/doctype/workspace/workspace.js b/frappe/desk/doctype/workspace/workspace.js index 3f912127fc..25721f9ae2 100644 --- a/frappe/desk/doctype/workspace/workspace.js +++ b/frappe/desk/doctype/workspace/workspace.js @@ -1,26 +1,30 @@ // Copyright (c) 2020, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Workspace', { - setup: function() { - frappe.meta.get_field('Workspace Link', 'only_for').no_default = true; +frappe.ui.form.on("Workspace", { + setup: function () { + frappe.meta.get_field("Workspace Link", "only_for").no_default = true; }, - refresh: function(frm) { + refresh: function (frm) { frm.enable_save(); - if (frm.doc.for_user || (frm.doc.public && !frm.has_perm('write') && - !frappe.user.has_role('Workspace Manager'))) { - frm.trigger('disable_form'); + if ( + frm.doc.for_user || + (frm.doc.public && + !frm.has_perm("write") && + !frappe.user.has_role("Workspace Manager")) + ) { + frm.trigger("disable_form"); } }, - disable_form: function(frm) { + disable_form: function (frm) { frm.fields - .filter(field => field.has_input) - .forEach(field => { + .filter((field) => field.has_input) + .forEach((field) => { frm.set_df_property(field.df.fieldname, "read_only", "1"); }); frm.disable_save(); - } -}); \ No newline at end of file + }, +}); diff --git a/frappe/desk/page/activity/activity.js b/frappe/desk/page/activity/activity.js index 7b4e8ddc1a..0291edb225 100644 --- a/frappe/desk/page/activity/activity.js +++ b/frappe/desk/page/activity/activity.js @@ -3,12 +3,12 @@ frappe.provide("frappe.activity"); -frappe.pages['activity'].on_page_load = function (wrapper) { +frappe.pages["activity"].on_page_load = function (wrapper) { var me = this; frappe.ui.make_app_page({ parent: wrapper, - single_column: true + single_column: true, }); me.page = wrapper.page; @@ -16,8 +16,8 @@ frappe.pages['activity'].on_page_load = function (wrapper) { frappe.model.with_doctype("Communication", function () { me.page.list = new frappe.views.Activity({ - doctype: 'Communication', - parent: wrapper + doctype: "Communication", + parent: wrapper, }); }); @@ -29,17 +29,21 @@ frappe.pages['activity'].on_page_load = function (wrapper) { doctype = $(this).attr("data-doctype"), docname = $(this).attr("data-docname"); - [link_doctype, link_name, doctype, docname] = - [link_doctype, link_name, doctype, docname].map(decodeURIComponent); + [link_doctype, link_name, doctype, docname] = [ + link_doctype, + link_name, + doctype, + docname, + ].map(decodeURIComponent); - link_doctype = link_doctype && link_doctype !== 'null' ? link_doctype : null; - link_name = link_name && link_name !== 'null' ? link_name : null; + link_doctype = link_doctype && link_doctype !== "null" ? link_doctype : null; + link_name = link_name && link_name !== "null" ? link_name : null; if (doctype && docname) { if (link_doctype && link_name) { frappe.route_options = { - scroll_to: { "doctype": doctype, "name": docname } - } + scroll_to: { doctype: doctype, name: docname }, + }; } frappe.set_route(["Form", link_doctype || doctype, link_name || docname]); @@ -48,37 +52,46 @@ frappe.pages['activity'].on_page_load = function (wrapper) { // Build Report Button if (frappe.boot.user.can_get_report.indexOf("Feed") != -1) { - this.page.add_menu_item(__('Build Report'), function () { - frappe.set_route("List", "Feed", "Report"); - }, 'fa fa-th') + this.page.add_menu_item( + __("Build Report"), + function () { + frappe.set_route("List", "Feed", "Report"); + }, + "fa fa-th" + ); } - this.page.add_menu_item(__('Activity Log'), function () { - frappe.route_options = { - "user": frappe.session.user - } + this.page.add_menu_item( + __("Activity Log"), + function () { + frappe.route_options = { + user: frappe.session.user, + }; - frappe.set_route("List", "Activity Log", "Report"); - }, 'fa fa-th'); + frappe.set_route("List", "Activity Log", "Report"); + }, + "fa fa-th" + ); }; -frappe.pages['activity'].on_page_show = function () { +frappe.pages["activity"].on_page_show = function () { frappe.breadcrumbs.add("Desk"); -} +}; frappe.activity.last_feed_date = false; frappe.activity.Feed = class Feed { constructor(row, data) { this.scrub_data(data); this.add_date_separator(row, data); - if (!data.add_class) - data.add_class = "label-default"; + if (!data.add_class) data.add_class = "label-default"; data.link = ""; if (data.link_doctype && data.link_name) { - data.link = frappe.format(data.link_name, { fieldtype: "Link", options: data.link_doctype }, - { label: __(data.link_doctype) + " " + __(data.link_name) }); - + data.link = frappe.format( + data.link_name, + { fieldtype: "Link", options: data.link_doctype }, + { label: __(data.link_doctype) + " " + __(data.link_name) } + ); } else if (data.feed_type === "Comment" && data.comment_type === "Comment") { // hack for backward compatiblity data.link_doctype = data.reference_doctype; @@ -86,17 +99,20 @@ frappe.activity.Feed = class Feed { data.reference_doctype = "Communication"; data.reference_name = data.name; - data.link = frappe.format(data.link_name, { fieldtype: "Link", options: data.link_doctype }, - { label: __(data.link_doctype) + " " + __(data.link_name) }); - + data.link = frappe.format( + data.link_name, + { fieldtype: "Link", options: data.link_doctype }, + { label: __(data.link_doctype) + " " + __(data.link_name) } + ); } else if (data.reference_doctype && data.reference_name) { - data.link = frappe.format(data.reference_name, { fieldtype: "Link", options: data.reference_doctype }, - { label: __(data.reference_doctype) + " " + __(data.reference_name) }); + data.link = frappe.format( + data.reference_name, + { fieldtype: "Link", options: data.reference_doctype }, + { label: __(data.reference_doctype) + " " + __(data.reference_name) } + ); } - $(row) - .append(frappe.render_template("activity_row", data)) - .find("a").addClass("grey"); + $(row).append(frappe.render_template("activity_row", data)).find("a").addClass("grey"); } scrub_data(data) { @@ -106,11 +122,12 @@ frappe.activity.Feed = class Feed { data.icon = "fa fa-flag"; // color for comment - data.add_class = { - "Comment": "label-danger", - "Assignment": "label-warning", - "Login": "label-default" - }[data.comment_type || data.communication_medium] || "label-info" + data.add_class = + { + Comment: "label-danger", + Assignment: "label-warning", + Login: "label-default", + }[data.comment_type || data.communication_medium] || "label-info"; data.when = comment_when(data.creation); data.feed_type = data.comment_type || data.communication_medium; @@ -120,18 +137,24 @@ frappe.activity.Feed = class Feed { var date = frappe.datetime.str_to_obj(data.creation); var last = frappe.activity.last_feed_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)); + if ( + (last && frappe.datetime.obj_to_str(last) != frappe.datetime.obj_to_str(date)) || + !last + ) { + var diff = frappe.datetime.get_day_diff( + frappe.datetime.get_today(), + frappe.datetime.obj_to_str(date) + ); var pdate; if (diff < 1) { - pdate = 'Today'; + pdate = "Today"; } else if (diff < 2) { - pdate = 'Yesterday'; + pdate = "Yesterday"; } else { pdate = frappe.datetime.global_date_format(date); } data.date_sep = pdate; - data.date_class = pdate == 'Today' ? "date-indicator blue" : "date-indicator"; + data.date_class = pdate == "Today" ? "date-indicator blue" : "date-indicator"; } else { data.date_sep = null; data.date_class = ""; @@ -141,26 +164,28 @@ frappe.activity.Feed = class Feed { }; frappe.activity.render_heatmap = function (page) { - $('
\ + $( + '
\
\ -
').prependTo(page.main); +
' + ).prependTo(page.main); frappe.call({ method: "frappe.desk.page.activity.activity.get_heatmap_data", callback: function (r) { if (r.message) { new frappe.Chart(".heatmap", { - type: 'heatmap', - start: new Date(moment().subtract(1, 'year').toDate()), + type: "heatmap", + start: new Date(moment().subtract(1, "year").toDate()), countLabel: "actions", discreteDomains: 1, radius: 3, // default 0 data: { - 'dataPoints': r.message - } + dataPoints: r.message, + }, }); } - } + }, }); }; @@ -173,10 +198,9 @@ frappe.views.Activity = class Activity extends frappe.views.BaseList { setup_defaults() { super.setup_defaults(); - this.page_title = __('Activity'); - this.doctype = 'Communication'; - this.method = 'frappe.desk.page.activity.activity.get_feed'; - + this.page_title = __("Activity"); + this.doctype = "Communication"; + this.method = "frappe.desk.page.activity.activity.get_feed"; } setup_filter_area() { @@ -187,18 +211,14 @@ frappe.views.Activity = class Activity extends frappe.views.BaseList { // } - setup_sort_selector() { + setup_sort_selector() {} - } - - setup_side_bar() { - - } + setup_side_bar() {} get_args() { return { start: this.start, - page_length: this.page_length + page_length: this.page_length, }; } @@ -213,8 +233,11 @@ frappe.views.Activity = class Activity extends frappe.views.BaseList { } render() { - this.data.map(value => { - const row = $('
').data("data", value).appendTo(this.$result).get(0); + this.data.map((value) => { + const row = $('
') + .data("data", value) + .appendTo(this.$result) + .get(0); new frappe.activity.Feed(row, value); }); } diff --git a/frappe/desk/page/backups/backups.js b/frappe/desk/page/backups/backups.js index d6cab750f0..08289cab2d 100644 --- a/frappe/desk/page/backups/backups.js +++ b/frappe/desk/page/backups/backups.js @@ -1,18 +1,18 @@ -frappe.pages['backups'].on_page_load = function (wrapper) { +frappe.pages["backups"].on_page_load = function (wrapper) { var page = frappe.ui.make_app_page({ parent: wrapper, - title: __('Download Backups'), - single_column: true + title: __("Download Backups"), + single_column: true, }); page.add_inner_button(__("Set Number of Backups"), function () { - frappe.set_route('Form', 'System Settings'); + frappe.set_route("Form", "System Settings"); }); page.add_inner_button(__("Download Files Backup"), function () { frappe.call({ method: "frappe.desk.page.backups.backups.schedule_files_backup", - args: { "user_email": frappe.session.user_email } + args: { user_email: frappe.session.user_email }, }); }); @@ -23,18 +23,18 @@ frappe.pages['backups'].on_page_load = function (wrapper) { method: "frappe.utils.backups.get_backup_encryption_key", callback: function (r) { frappe.msgprint({ - title: __('Backup Encryption Key'), + title: __("Backup Encryption Key"), message: __(r.message), - indicator: 'blue' + indicator: "blue", }); - } + }, }); }); } else { frappe.msgprint({ - title: __('Error'), - message: __('System Manager privileges required.'), - indicator: 'red' + title: __("Error"), + message: __("System Manager privileges required."), + indicator: "red", }); } }); diff --git a/frappe/desk/page/leaderboard/leaderboard.js b/frappe/desk/page/leaderboard/leaderboard.js index aa1678af37..845dac0d63 100644 --- a/frappe/desk/page/leaderboard/leaderboard.js +++ b/frappe/desk/page/leaderboard/leaderboard.js @@ -1,7 +1,7 @@ frappe.pages["leaderboard"].on_page_load = (wrapper) => { frappe.leaderboard = new Leaderboard(wrapper); - $(wrapper).bind('show', ()=> { + $(wrapper).bind("show", () => { // Get which leaderboard to show let doctype = frappe.get_route()[1]; frappe.leaderboard.show_leaderboard(doctype); @@ -9,7 +9,6 @@ frappe.pages["leaderboard"].on_page_load = (wrapper) => { }; class Leaderboard { - constructor(parent) { frappe.ui.make_app_page({ parent: parent, @@ -20,11 +19,12 @@ class Leaderboard { this.parent = parent; this.page = this.parent.page; - this.page.sidebar.html(`
    `); - this.$sidebar_list = this.page.sidebar.find('ul'); + this.page.sidebar.html( + `
      ` + ); + this.$sidebar_list = this.page.sidebar.find("ul"); this.get_leaderboard_config(); - } get_leaderboard_config() { @@ -32,47 +32,57 @@ class Leaderboard { this.filters = {}; this.leaderboard_limit = 20; - frappe.xcall("frappe.desk.page.leaderboard.leaderboard.get_leaderboard_config").then(config => { - this.leaderboard_config = config; - for (let doctype in this.leaderboard_config) { - this.doctypes.push(doctype); - this.filters[doctype] = this.leaderboard_config[doctype].fields.map(field => { - if (typeof field ==='object') { - return field.label || field.fieldname; - } - return field; - }); - } + frappe + .xcall("frappe.desk.page.leaderboard.leaderboard.get_leaderboard_config") + .then((config) => { + this.leaderboard_config = config; + for (let doctype in this.leaderboard_config) { + this.doctypes.push(doctype); + this.filters[doctype] = this.leaderboard_config[doctype].fields.map( + (field) => { + if (typeof field === "object") { + return field.label || field.fieldname; + } + return field; + } + ); + } - // For translation. Do not remove this - // __("This Week"), __("This Month"), __("This Quarter"), __("This Year"), - // __("Last Week"), __("Last Month"), __("Last Quarter"), __("Last Year"), - // __("All Time"), __("Select From Date") - this.timespans = [ - "This Week", "This Month", "This Quarter", "This Year", - "Last Week", "Last Month", "Last Quarter", "Last Year", - "All Time", "Select Date Range" - ]; + // For translation. Do not remove this + // __("This Week"), __("This Month"), __("This Quarter"), __("This Year"), + // __("Last Week"), __("Last Month"), __("Last Quarter"), __("Last Year"), + // __("All Time"), __("Select From Date") + this.timespans = [ + "This Week", + "This Month", + "This Quarter", + "This Year", + "Last Week", + "Last Month", + "Last Quarter", + "Last Year", + "All Time", + "Select Date Range", + ]; - // for saving current selected filters - const _initial_doctype = frappe.get_route()[1] || this.doctypes[0]; - const _initial_timespan = this.timespans[0]; - const _initial_filter = this.filters[_initial_doctype]; + // for saving current selected filters + const _initial_doctype = frappe.get_route()[1] || this.doctypes[0]; + const _initial_timespan = this.timespans[0]; + const _initial_filter = this.filters[_initial_doctype]; - this.options = { - selected_doctype: _initial_doctype, - selected_filter: _initial_filter, - selected_filter_item: _initial_filter[0], - selected_timespan: _initial_timespan, - }; + this.options = { + selected_doctype: _initial_doctype, + selected_filter: _initial_filter, + selected_filter_item: _initial_filter[0], + selected_timespan: _initial_timespan, + }; - this.message = null; - this.make(); - }); + this.message = null; + this.make(); + }); } make() { - this.$container = $(`
      @@ -80,7 +90,7 @@ class Leaderboard { this.$graph_area = this.$container.find(".leaderboard-graph"); - this.doctypes.map(doctype => { + this.doctypes.map((doctype) => { const icon = this.leaderboard_config[doctype].icon; this.get_sidebar_item(doctype, icon).appendTo(this.$sidebar_list); }); @@ -94,7 +104,6 @@ class Leaderboard { // Get which leaderboard to show let doctype = frappe.get_route()[1]; this.show_leaderboard(doctype); - } setup_leaderboard_fields() { @@ -108,25 +117,27 @@ class Leaderboard { change: (e) => { this.options.selected_company = e.currentTarget.value; this.make_request(); - } + }, }); - this.timespan_select = this.page.add_select(__("Timespan"), - this.timespans.map(d => { - return {"label": __(d), value: d }; + this.timespan_select = this.page.add_select( + __("Timespan"), + this.timespans.map((d) => { + return { label: __(d), value: d }; }) ); this.create_date_range_field(); - this.type_select = this.page.add_select(__("Field"), - this.options.selected_filter.map(d => { - return {"label": __(frappe.model.unscrub(d)), value: d }; + this.type_select = this.page.add_select( + __("Field"), + this.options.selected_filter.map((d) => { + return { label: __(frappe.model.unscrub(d)), value: d }; }) ); this.timespan_select.on("change", (e) => { this.options.selected_timespan = e.currentTarget.value; - if (this.options.selected_timespan === 'Select Date Range') { + if (this.options.selected_timespan === "Select Date Range") { this.date_range_field.show(); } else { this.date_range_field.hide(); @@ -141,30 +152,33 @@ class Leaderboard { } create_date_range_field() { - let timespan_field = $(this.parent).find(`.frappe-control[data-original-title="${__('Timespan')}"]`); - this.date_range_field = $(`
      `).insertAfter(timespan_field).hide(); + let timespan_field = $(this.parent).find( + `.frappe-control[data-original-title="${__("Timespan")}"]` + ); + this.date_range_field = $(`
      `) + .insertAfter(timespan_field) + .hide(); let date_field = frappe.ui.form.make_control({ df: { - fieldtype: 'DateRange', - fieldname: 'selected_date_range', + fieldtype: "DateRange", + fieldname: "selected_date_range", placeholder: __("Date Range"), default: [frappe.datetime.month_start(), frappe.datetime.now_date()], - input_class: 'input-xs', + input_class: "input-xs", reqd: 1, change: () => { this.selected_date_range = date_field.get_value(); if (this.selected_date_range) this.make_request(); - } + }, }, - parent: $(this.parent).find('.from-date-field'), - render_input: 1 + parent: $(this.parent).find(".from-date-field"), + render_input: 1, }); } render_selected_doctype() { - - this.$sidebar_list.on("click", "li", (e)=> { + this.$sidebar_list.on("click", "li", (e) => { let $li = $(e.currentTarget); let doctype = $li.find(".doctype-text").attr("doctype-value"); @@ -174,8 +188,8 @@ class Leaderboard { this.options.selected_filter_item = this.filters[doctype][0]; this.type_select.empty().add_options( - this.options.selected_filter.map(d => { - return {"label": __(frappe.model.unscrub(d)), value: d }; + this.options.selected_filter.map((d) => { + return { label: __(frappe.model.unscrub(d)), value: d }; }) ); if (this.leaderboard_config[this.options.selected_doctype].company_disabled) { @@ -193,10 +207,10 @@ class Leaderboard { } render_search_box() { - - this.$search_box = - $(``; + }) + .join(""); - const html = - `
      + const html = `
      ${filters}
      `; return html; } render_list_result(items) { + let _html = items + .map((item, index) => { + const $value = $(this.get_item_html(item, index + 1)); + const $item_container = $(`
      `).append($value); + return $item_container[0].outerHTML; + }) + .join(""); - let _html = items.map((item, index) => { - const $value = $(this.get_item_html(item, index+1)); - const $item_container = $(`
      `).append($value); - return $item_container[0].outerHTML; - }).join(""); - - let html = - `
      + let html = `
      ${_html}
      @@ -328,7 +336,7 @@ class Leaderboard { } render_message() { - const display_class = this.message ? '' : 'hide'; + const display_class = this.message ? "" : "hide"; let html = `
      { - let fieldname = field.fieldname || field; - return fieldname === this.options.selected_filter_item; - })); + const value = frappe.format( + item.value, + fields.find((field) => { + let fieldname = field.fieldname || field; + return fieldname === this.options.selected_filter_item; + }) + ); const link = `/app/${frappe.router.slug(this.options.selected_doctype)}/${item.name}`; - const name_html = item.formatted_name ? - `${item.formatted_name}` + const name_html = item.formatted_name + ? `${item.formatted_name}` : ` ${item.name} `; - const html = - `
      + const html = `
      ${index}
      @@ -369,11 +379,11 @@ class Leaderboard { } get_sidebar_item(item, icon) { - let icon_html = icon ? frappe.utils.icon(icon, 'md') : ''; + let icon_html = icon ? frappe.utils.icon(icon, "md") : ""; return $(`
    • ${icon_html} - ${ __(item) } + ${__(item)}
    • `); } @@ -391,9 +401,11 @@ class Leaderboard { "last quarter": [frappe.datetime.add_months(current_date, -3), current_date], "last year": [frappe.datetime.add_months(current_date, -12), current_date], "all time": null, - "select date range": this.selected_date_range || [frappe.datetime.month_start(), current_date] - } + "select date range": this.selected_date_range || [ + frappe.datetime.month_start(), + current_date, + ], + }; return date_range_map[timespan]; } - } diff --git a/frappe/desk/page/setup_wizard/setup_wizard.js b/frappe/desk/page/setup_wizard/setup_wizard.js index c683655dd5..1cfceb29b0 100644 --- a/frappe/desk/page/setup_wizard/setup_wizard.js +++ b/frappe/desk/page/setup_wizard/setup_wizard.js @@ -27,11 +27,11 @@ frappe.setup = { $.each(frappe.setup.events[event] || [], function (i, fn) { fn(); }); - } -} + }, +}; -frappe.pages['setup-wizard'].on_page_load = function (wrapper) { - let requires = (frappe.boot.setup_wizard_requires || []); +frappe.pages["setup-wizard"].on_page_load = function (wrapper) { + let requires = frappe.boot.setup_wizard_requires || []; frappe.require(requires, function () { frappe.call({ method: "frappe.desk.page.setup_wizard.setup_wizard.load_languages", @@ -46,19 +46,19 @@ frappe.pages['setup-wizard'].on_page_load = function (wrapper) { slide_class: frappe.setup.SetupWizardSlide, unidirectional: 1, done_state: 1, - } + }; frappe.wizard = new frappe.setup.SetupWizard(wizard_settings); frappe.setup.run_event("after_load"); let route = frappe.get_route(); if (route) { frappe.wizard.show_slide(route[1]); } - } + }, }); }); }; -frappe.pages['setup-wizard'].on_page_show = function () { +frappe.pages["setup-wizard"].on_page_show = function () { if (frappe.get_route()[1]) { frappe.wizard && frappe.wizard.show_slide(frappe.get_route()[1]); } @@ -67,7 +67,7 @@ frappe.pages['setup-wizard'].on_page_show = function () { frappe.setup.on("before_load", function () { // load slides frappe.setup.slides_settings.forEach((s) => { - if (!(s.name === 'user' && frappe.boot.developer_mode)) { + if (!(s.name === "user" && frappe.boot.developer_mode)) { // if not user slide with developer mode frappe.setup.add_slide(s); } @@ -87,26 +87,26 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { make() { super.make(); this.container.addClass("container setup-wizard-slide with-form"); - this.$next_btn.addClass('action'); - this.$complete_btn.addClass('action'); + this.$next_btn.addClass("action"); + this.$complete_btn.addClass("action"); this.setup_keyboard_nav(); } setup_keyboard_nav() { - $('body').on('keydown', this.handle_enter_press.bind(this)); + $("body").on("keydown", this.handle_enter_press.bind(this)); } disable_keyboard_nav() { - $('body').off('keydown', this.handle_enter_press.bind(this)); + $("body").off("keydown", this.handle_enter_press.bind(this)); } handle_enter_press(e) { if (e.which === frappe.ui.keyCode.ENTER) { var $target = $(e.target); - if ($target.hasClass('prev-btn')) { - $target.trigger('click'); + if ($target.hasClass("prev-btn")) { + $target.trigger("click"); } else { - this.container.find('.next-btn').trigger('click'); + this.container.find(".next-btn").trigger("click"); e.preventDefault(); } } @@ -134,8 +134,10 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { super.show_hide_prev_next(id); if (id + 1 === this.slides.length) { this.$next_btn.removeClass("btn-primary").hide(); - this.$complete_btn.addClass("btn-primary").show() - .on('click', () => this.action_on_complete()); + this.$complete_btn + .addClass("btn-primary") + .show() + .on("click", () => this.action_on_complete()); } else { this.$next_btn.addClass("btn-primary").show(); this.$complete_btn.removeClass("btn-primary").hide(); @@ -170,7 +172,7 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { this.show_slide(this.current_id); this.refresh(this.current_id); setTimeout(() => { - this.container.find('.form-control').first().focus(); + this.container.find(".form-control").first().focus(); }, 200); this.in_refresh_slides = false; } @@ -186,15 +188,15 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { method: "frappe.desk.page.setup_wizard.setup_wizard.setup_complete", args: { args: this.values }, callback: (r) => { - if (r.message.status === 'ok') { + if (r.message.status === "ok") { this.post_setup_success(); - } else if (r.message.status === 'registered') { + } else if (r.message.status === "registered") { this.update_setup_message(__("starting the setup...")); } else if (r.message.fail !== undefined) { this.abort_setup(r.message.fail); } }, - error: () => this.abort_setup("Error in setup") + error: () => this.abort_setup("Error in setup"), }); } @@ -205,17 +207,17 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { } setTimeout(function () { // Reload - window.location.href = '/app'; + window.location.href = "/app"; }, 2000); } abort_setup(fail_msg) { - this.$working_state.find('.state-icon-container').html(''); + this.$working_state.find(".state-icon-container").html(""); fail_msg = fail_msg ? fail_msg : __("Failed to complete setup"); - this.update_setup_message('Could not start up: ' + fail_msg); + this.update_setup_message("Could not start up: " + fail_msg); - this.$working_state.find('.title').html('Setup failed'); + this.$working_state.find(".title").html("Setup failed"); this.$abort_btn.show(); } @@ -226,19 +228,19 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { if (data.stage_status) { // .html('Process '+ data.progress[0] + ' of ' + data.progress[1] + ': ' + data.stage_status); this.update_setup_message(data.stage_status); - this.set_setup_load_percent((data.progress[0] + 1) / data.progress[1] * 100); + this.set_setup_load_percent(((data.progress[0] + 1) / data.progress[1]) * 100); } if (data.fail_msg) { this.abort_setup(data.fail_msg); } - if (data.status === 'ok') { + if (data.status === "ok") { this.post_setup_success(); } - }) + }); } update_setup_message(message) { - this.$working_state.find('.setup-message').html(message); + this.$working_state.find(".setup-message").html(message); } get_setup_slides_filtered_by_domain() { @@ -246,14 +248,16 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { frappe.setup.slides.forEach(function (slide) { if (frappe.setup.domains) { let active_domains = frappe.setup.domains; - if (!slide.domains || - slide.domains.filter(d => active_domains.includes(d)).length > 0) { + if ( + !slide.domains || + slide.domains.filter((d) => active_domains.includes(d)).length > 0 + ) { filtered_slides.push(slide); } } else { filtered_slides.push(slide); } - }) + }); return filtered_slides; } @@ -263,7 +267,8 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { this.$working_state = this.get_message( __("Setting up your system"), - __("Starting Frappe ...")).appendTo(this.parent); + __("Starting Frappe ...") + ).appendTo(this.parent); this.attach_abort_button(); @@ -272,11 +277,13 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { } attach_abort_button() { - this.$abort_btn = $(``); - this.$working_state.find('.content').append(this.$abort_btn); + this.$abort_btn = $( + `` + ); + this.$working_state.find(".content").append(this.$abort_btn); - this.$abort_btn.on('click', () => { - $(this.parent).find('.setup-in-progress').remove(); + this.$abort_btn.on("click", () => { + $(this.parent).find(".setup-in-progress").remove(); this.container.show(); frappe.set_route(this.page_name, this.slides.length - 1); }); @@ -301,12 +308,12 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { } set_setup_complete_message(title, message) { - this.$working_state.find('.title').html(title); - this.$working_state.find('.setup-message').html(message); + this.$working_state.find(".title").html(title); + this.$working_state.find(".setup-message").html(message); } set_setup_load_percent(percent) { - this.$working_state.find('.progress-bar').css({ "width": percent + "%" }); + this.$working_state.find(".progress-bar").css({ width: percent + "%" }); } }; @@ -333,7 +340,6 @@ frappe.setup.SetupWizardSlide = class SetupWizardSlide extends frappe.ui.Slide { }); } } - }; // Frappe slides settings @@ -349,7 +355,7 @@ frappe.setup.slides_settings = [ fieldname: "language", label: __("Your Language"), fieldtype: "Autocomplete", - placeholder: __('Select Language'), + placeholder: __("Select Language"), default: "English", reqd: 1, }, @@ -357,16 +363,16 @@ frappe.setup.slides_settings = [ fieldname: "country", label: __("Your Country"), fieldtype: "Autocomplete", - placeholder: __('Select Country'), + placeholder: __("Select Country"), reqd: 1, }, { - fieldtype: "Section Break" + fieldtype: "Section Break", }, { fieldname: "timezone", label: __("Time Zone"), - placeholder: __('Select Time Zone'), + placeholder: __("Select Time Zone"), fieldtype: "Select", reqd: 1, }, @@ -374,10 +380,10 @@ frappe.setup.slides_settings = [ { fieldname: "currency", label: __("Currency"), - placeholder: __('Select Currency'), + placeholder: __("Select Currency"), fieldtype: "Select", reqd: 1, - } + }, ], onload: function (slide) { @@ -387,7 +393,10 @@ frappe.setup.slides_settings = [ frappe.setup.utils.load_regional_data(slide, this.setup_fields); } if (!slide.get_value("language")) { - let session_language = frappe.setup.utils.get_language_name_from_code(frappe.boot.lang || navigator.language) || "English"; + let session_language = + frappe.setup.utils.get_language_name_from_code( + frappe.boot.lang || navigator.language + ) || "English"; let language_field = slide.get_field("language"); language_field.set_input(session_language); @@ -408,23 +417,30 @@ frappe.setup.slides_settings = [ }, { // Profile slide - name: 'user', + name: "user", title: __("The First User: You"), icon: "fa fa-user", fields: [ { - "fieldtype": "Attach Image", "fieldname": "attach_user_image", - label: __("Attach Your Picture"), is_private: 0, align: 'center' + fieldtype: "Attach Image", + fieldname: "attach_user_image", + label: __("Attach Your Picture"), + is_private: 0, + align: "center", }, { - "fieldname": "full_name", "label": __("Full Name"), "fieldtype": "Data", - reqd: 1 + fieldname: "full_name", + label: __("Full Name"), + fieldtype: "Data", + reqd: 1, }, { - "fieldname": "email", "label": __("Email Address") + ' (' + __("Will be your login ID") + ')', - "fieldtype": "Data", "options": "Email" + fieldname: "email", + label: __("Email Address") + " (" + __("Will be your login ID") + ")", + fieldtype: "Data", + options: "Email", }, - { "fieldname": "password", "label": __("Password"), "fieldtype": "Password" } + { fieldname: "password", label: __("Password"), fieldtype: "Password" }, ], onload: function (slide) { @@ -437,7 +453,8 @@ frappe.setup.slides_settings = [ if (frappe.boot.user.first_name || frappe.boot.user.last_name) { slide.form.fields_dict.full_name.set_input( - [frappe.boot.user.first_name, frappe.boot.user.last_name].join(' ').trim()); + [frappe.boot.user.first_name, frappe.boot.user.last_name].join(" ").trim() + ); } var user_image = frappe.get_cookie("user_image"); @@ -449,7 +466,6 @@ frappe.setup.slides_settings = [ $attach_user_image.find(".img-container").toggle(true); } delete slide.form.fields_dict.email; - } else { slide.form.fields_dict.email.df.reqd = 1; slide.form.fields_dict.email.refresh(); @@ -475,7 +491,7 @@ frappe.setup.slides_settings = [ } } }, - } + }, ]; frappe.setup.utils = { @@ -485,7 +501,7 @@ frappe.setup.utils = { callback: function (data) { frappe.setup.data.regional_data = data.message; callback(slide); - } + }, }); }, @@ -497,7 +513,7 @@ frappe.setup.utils = { frappe.setup.data.full_name = r.message.full_name; frappe.setup.data.email = r.message.email; callback(slide); - } + }, }); }, @@ -512,28 +528,28 @@ frappe.setup.utils = { Set a slide's country, timezone and currency fields */ let data = frappe.setup.data.regional_data; - let country_field = slide.get_field('country'); + let country_field = slide.get_field("country"); let translated_countries = []; - Object.keys(data.country_info).sort().forEach(country => { - translated_countries.push({ - label: __(country), - value: country + Object.keys(data.country_info) + .sort() + .forEach((country) => { + translated_countries.push({ + label: __(country), + value: country, + }); }); - }); country_field.set_data(translated_countries); - slide.get_input("currency") + slide + .get_input("currency") .empty() .add_options( - frappe.utils.unique( - $.map(data.country_info, opts => opts.currency).sort() - ) + frappe.utils.unique($.map(data.country_info, (opts) => opts.currency).sort()) ); - slide.get_input("timezone").empty() - .add_options(data.all_timezones); + slide.get_input("timezone").empty().add_options(data.all_timezones); // set values if present if (frappe.wizard.values.country) { @@ -547,24 +563,27 @@ frappe.setup.utils = { }, bind_language_events: function (slide) { - slide.get_input("language").unbind("change").on("change", function () { - clearTimeout(slide.language_call_timeout); - slide.language_call_timeout = setTimeout(() => { - var lang = $(this).val() || "English"; - frappe._messages = {}; - frappe.call({ - method: "frappe.desk.page.setup_wizard.setup_wizard.load_messages", - freeze: true, - args: { - language: lang - }, - callback: function () { - frappe.setup._from_load_messages = true; - frappe.wizard.refresh_slides(); - } - }); - }, 500); - }); + slide + .get_input("language") + .unbind("change") + .on("change", function () { + clearTimeout(slide.language_call_timeout); + slide.language_call_timeout = setTimeout(() => { + var lang = $(this).val() || "English"; + frappe._messages = {}; + frappe.call({ + method: "frappe.desk.page.setup_wizard.setup_wizard.load_messages", + freeze: true, + args: { + language: lang, + }, + callback: function () { + frappe.setup._from_load_messages = true; + frappe.wizard.refresh_slides(); + }, + }); + }, 500); + }); }, get_language_name_from_code: function (language_code) { @@ -594,8 +613,8 @@ frappe.setup.utils = { slide.get_field("timezone").set_input($timezone.val()); // temporarily set date format - frappe.boot.sysdefaults.date_format = (data.country_info[country].date_format - || "dd-mm-yyyy"); + frappe.boot.sysdefaults.date_format = + data.country_info[country].date_format || "dd-mm-yyyy"; }); slide.get_input("currency").on("change", function () { diff --git a/frappe/desk/page/translation_tool/translation_tool.js b/frappe/desk/page/translation_tool/translation_tool.js index 13f68e647a..5739eddfc7 100644 --- a/frappe/desk/page/translation_tool/translation_tool.js +++ b/frappe/desk/page/translation_tool/translation_tool.js @@ -1,7 +1,7 @@ -frappe.pages['translation-tool'].on_page_load = function(wrapper) { +frappe.pages["translation-tool"].on_page_load = function (wrapper) { var page = frappe.ui.make_app_page({ parent: wrapper, - title: __('Translation Tool'), + title: __("Translation Tool"), single_column: true, card_layout: true, }); @@ -13,77 +13,74 @@ class TranslationTool { constructor(page) { this.page = page; this.wrapper = $(page.body); - this.wrapper.append(frappe.render_template('translation_tool')); + this.wrapper.append(frappe.render_template("translation_tool")); frappe.utils.bind_actions_with_object(this.wrapper, this); this.active_translation = null; this.edited_translations = {}; this.setup_search_box(); this.setup_language_filter(); this.page.set_primary_action( - __('Contribute Translations'), + __("Contribute Translations"), this.show_confirmation_dialog.bind(this) ); - this.page.set_secondary_action( - __('Refresh'), - this.fetch_messages_then_render.bind(this) - ); + this.page.set_secondary_action(__("Refresh"), this.fetch_messages_then_render.bind(this)); this.update_header(); } setup_language_filter() { - let languages = Object.keys(frappe.boot.lang_dict).map(language_label => { + let languages = Object.keys(frappe.boot.lang_dict).map((language_label) => { let value = frappe.boot.lang_dict[language_label]; return { label: `${language_label} (${value})`, - value: value + value: value, }; }); let language_selector = this.page.add_field({ - fieldname: 'language', - fieldtype: 'Select', + fieldname: "language", + fieldtype: "Select", options: languages, change: () => { let language = language_selector.get_value(); - localStorage.setItem('translation_language', language); + localStorage.setItem("translation_language", language); this.language = language; this.fetch_messages_then_render(); - } + }, }); - let translation_language = localStorage.getItem('translation_language'); - if (translation_language || frappe.boot.lang !== 'en') { + let translation_language = localStorage.getItem("translation_language"); + if (translation_language || frappe.boot.lang !== "en") { language_selector.set_value(translation_language || frappe.boot.lang); } else { frappe.prompt( { - label: __('Please select target language for translation'), - fieldname: 'language', - fieldtype: 'Select', + label: __("Please select target language for translation"), + fieldname: "language", + fieldtype: "Select", options: languages, - reqd: 1 + reqd: 1, }, - values => { + (values) => { language_selector.set_value(values.language); }, - __('Select Language') + __("Select Language") ); } } setup_search_box() { let search_box = this.page.add_field({ - fieldname: 'search', - fieldtype: 'Data', - label: __('Search Source Text'), + fieldname: "search", + fieldtype: "Data", + label: __("Search Source Text"), change: () => { this.search_text = search_box.get_value(); this.fetch_messages_then_render(); - } + }, }); } fetch_messages_then_render() { - this.fetch_messages().then(messages => { + this.fetch_messages().then((messages) => { this.messages = messages; this.render_messages(messages); }); @@ -91,13 +88,13 @@ class TranslationTool { } fetch_messages() { - frappe.dom.freeze(__('Fetching...')); + frappe.dom.freeze(__("Fetching...")); return frappe - .xcall('frappe.translate.get_messages', { + .xcall("frappe.translate.get_messages", { language: this.language, - search_text: this.search_text + search_text: this.search_text, }) - .then(messages => { + .then((messages) => { return messages; }) .finally(() => { @@ -106,7 +103,7 @@ class TranslationTool { } render_messages(messages) { - let template = message => ` + let template = (message) => `
      `; - let html = messages.map(template).join(''); - this.wrapper.find('.translation-item-container').html(html); + let html = messages.map(template).join(""); + this.wrapper.find(".translation-item-container").html(html); } on_translation_click(e, $el) { - let message_id = decodeURIComponent($el.data('message-id')); - this.wrapper.find('.translation-item').removeClass('active'); - $el.addClass('active'); - this.active_translation = this.messages.find(m => m.id === message_id); + let message_id = decodeURIComponent($el.data("message-id")); + this.wrapper.find(".translation-item").removeClass("active"); + $el.addClass("active"); + this.active_translation = this.messages.find((m) => m.id === message_id); this.edit_translation(this.active_translation); } @@ -135,17 +132,19 @@ class TranslationTool { if (this.form) { this.form.set_values({}); } - this.get_additional_info(translation.id).then(data => { + this.get_additional_info(translation.id).then((data) => { this.make_edit_form(translation, data); }); } get_additional_info(source_id) { - frappe.dom.freeze('Fetching...'); - return frappe.xcall('frappe.translate.get_source_additional_info', { - source: source_id, - language: this.page.fields_dict['language'].get_value() - }).finally(frappe.dom.unfreeze); + frappe.dom.freeze("Fetching..."); + return frappe + .xcall("frappe.translate.get_source_additional_info", { + source: source_id, + language: this.page.fields_dict["language"].get_value(), + }) + .finally(frappe.dom.unfreeze); } make_edit_form(translation, { contributions, positions }) { @@ -153,80 +152,77 @@ class TranslationTool { this.form = new frappe.ui.FieldGroup({ fields: [ { - fieldtype: 'HTML', - fieldname: 'header', - read_only: 1 - }, - { - fieldtype: 'Data', - fieldname: 'id', - hidden: 1 - }, - { - label: 'Source Text', - fieldtype: 'Code', - fieldname: 'source_text', + fieldtype: "HTML", + fieldname: "header", read_only: 1, - enable_copy_button: 1 }, { - label: 'Context', - fieldtype: 'Code', - fieldname: 'context', - read_only: 1 + fieldtype: "Data", + fieldname: "id", + hidden: 1, }, { - label: 'DocType', - fieldtype: 'Data', - fieldname: 'doctype', - read_only: 1 + label: "Source Text", + fieldtype: "Code", + fieldname: "source_text", + read_only: 1, + enable_copy_button: 1, }, { - label: 'Translated Text', - fieldtype: 'Small Text', - fieldname: 'translated_text', + label: "Context", + fieldtype: "Code", + fieldname: "context", + read_only: 1, }, { - label: 'Suggest', - fieldtype: 'Button', + label: "DocType", + fieldtype: "Data", + fieldname: "doctype", + read_only: 1, + }, + { + label: "Translated Text", + fieldtype: "Small Text", + fieldname: "translated_text", + }, + { + label: "Suggest", + fieldtype: "Button", click: () => { let { id, translated_text, source_text } = this.form.get_values(); let existing_value = this.form.translation_dict.translated_text; - if ( - is_null(translated_text) || - existing_value === translated_text - ) { + if (is_null(translated_text) || existing_value === translated_text) { delete this.edited_translations[id]; } else if (existing_value !== translated_text) { this.edited_translations[id] = { id, translated_text, - source_text + source_text, }; } this.update_header(); - } + }, }, { - fieldtype: 'Section Break', - fieldname: 'contributed_translations_section', - label: 'Contributed Translations' + fieldtype: "Section Break", + fieldname: "contributed_translations_section", + label: "Contributed Translations", }, { - fieldtype: 'HTML', - fieldname: 'contributed_translations' + fieldtype: "HTML", + fieldname: "contributed_translations", }, { - fieldtype: 'Section Break', + fieldtype: "Section Break", collapsible: 1, - label: 'Occurences in source code' + label: "Occurences in source code", }, { - fieldtype: 'HTML', - fieldname: 'positions' + fieldtype: "HTML", + fieldname: "positions", }, ], - body: this.wrapper.find('.translation-edit-form') + body: this.wrapper.find(".translation-edit-form"), }); this.form.make(); @@ -235,8 +231,8 @@ class TranslationTool { this.form.set_values(translation); this.form.translation_dict = translation; - this.form.set_df_property('doctype', 'hidden', !translation.doctype); - this.form.set_df_property('context', 'hidden', !translation.context); + this.form.set_df_property("doctype", "hidden", !translation.doctype); + this.form.set_df_property("context", "hidden", !translation.context); this.set_status(translation); this.setup_contributions(contributions); @@ -244,13 +240,13 @@ class TranslationTool { } setup_header() { - this.form.get_field('header').$wrapper.html(`
      + this.form.get_field("header").$wrapper.html(`
      `); } set_status(translation) { - this.form.get_field('header').$wrapper.find('.translation-status').html(` + this.form.get_field("header").$wrapper.find(".translation-status").html(` ${this.get_indicator_status_text(translation)} @@ -258,15 +254,16 @@ class TranslationTool { } setup_positions(positions) { - let position_dom = ''; + let position_dom = ""; if (positions && positions.length) { - position_dom = positions.map(position => { - if (position.path.startsWith('DocType: ')) { - return `
      + position_dom = positions + .map((position) => { + if (position.path.startsWith("DocType: ")) { + return `
      ${position.path}
      `; - } else { - return `
      + } else { + return ``; - } - }).join(''); + } + }) + .join(""); } - this.form.get_field('positions').$wrapper.html(position_dom); + this.form.get_field("positions").$wrapper.html(position_dom); } setup_contributions(contributions) { const contributions_exists = contributions && contributions.length; if (contributions_exists) { - let contributions_html = contributions.map(c => { + let contributions_html = contributions.map((c) => { return `
      ${c.translated}
      @@ -293,62 +291,70 @@ class TranslationTool {
      `; }); - this.form.get_field('contributed_translations').html(contributions_html); + this.form.get_field("contributed_translations").html(contributions_html); } - this.form.set_df_property('contributed_translations_section', 'hidden', !contributions_exists); + this.form.set_df_property( + "contributed_translations_section", + "hidden", + !contributions_exists + ); } show_confirmation_dialog() { this.confirmation_dialog = new frappe.ui.Dialog({ fields: [ { - label: __('Language'), - fieldname: 'language', - fieldtype: 'Data', + label: __("Language"), + fieldname: "language", + fieldtype: "Data", read_only: 1, bold: 1, - default: this.language + default: this.language, }, { - fieldtype: 'HTML', - fieldname: 'edited_translations' - } + fieldtype: "HTML", + fieldname: "edited_translations", + }, ], - title: __('Confirm Translations'), + title: __("Confirm Translations"), no_submit_on_enter: true, - primary_action_label: __('Submit'), - primary_action: values => { + primary_action_label: __("Submit"), + primary_action: (values) => { this.create_translations(values).then(this.confirmation_dialog.hide()); - } + }, }); - this.confirmation_dialog.get_field('edited_translations').html(` + this.confirmation_dialog.get_field("edited_translations").html(`
      Progress / Wait Event
      - - + + - ${Object.values(this.edited_translations).map(t => ` + ${Object.values(this.edited_translations) + .map( + (t) => ` - `).join('')} + ` + ) + .join("")}
      ${__('Source Text')}${__('Translated Text')}${__("Source Text")}${__("Translated Text")}
      ${t.source_text} ${t.translated_text}
      `); this.confirmation_dialog.show(); } create_translations() { - frappe.dom.freeze(__('Submitting...')); + frappe.dom.freeze(__("Submitting...")); return frappe - .xcall( - 'frappe.core.doctype.translation.translation.create_translations', - { - translation_map: this.edited_translations, - language: this.language - } - ) + .xcall("frappe.core.doctype.translation.translation.create_translations", { + translation_map: this.edited_translations, + language: this.language, + }) .then(() => { frappe.dom.unfreeze(); - frappe.show_alert({ message: __('Successfully Submitted!'), indicator: 'success'}); + frappe.show_alert({ + message: __("Successfully Submitted!"), + indicator: "success", + }); this.edited_translations = {}; this.update_header(); this.fetch_messages_then_render(); @@ -359,11 +365,11 @@ class TranslationTool { setup_local_contributions() { // TODO: Refactor frappe - .xcall('frappe.translate.get_contributions', { - language: this.language + .xcall("frappe.translate.get_contributions", { + language: this.language, }) - .then(messages => { - let template = message => ` + .then((messages) => { + let template = (message) => `
      `; - let html = messages.map(template).join(''); - this.wrapper.find('.translation-item-tr').html(html); + let html = messages.map(template).join(""); + this.wrapper.find(".translation-item-tr").html(html); }); } show_translation_status_modal(e, $el) { - let message_id = decodeURIComponent($el.data('message-id')); + let message_id = decodeURIComponent($el.data("message-id")); - frappe.xcall('frappe.translate.get_contribution_status', { message_id }) - .then(doc => { - let d = new frappe.ui.Dialog({ - title: __('Contribution Status'), - fields: [ - { - fieldname: 'source_message', - label: __('Source Message'), - fieldtype: 'Data', - read_only: 1 + frappe.xcall("frappe.translate.get_contribution_status", { message_id }).then((doc) => { + let d = new frappe.ui.Dialog({ + title: __("Contribution Status"), + fields: [ + { + fieldname: "source_message", + label: __("Source Message"), + fieldtype: "Data", + read_only: 1, + }, + { + fieldname: "translated", + label: __("Translated Message"), + fieldtype: "Data", + read_only: 1, + }, + { + fieldname: "contribution_status", + label: __("Contribution Status"), + fieldtype: "Data", + read_only: 1, + }, + { + fieldname: "modified_by", + label: __("Verified By"), + fieldtype: "Data", + read_only: 1, + depends_on: (doc) => { + return doc.contribution_status == "Verified"; }, - { - fieldname: 'translated', - label: __('Translated Message'), - fieldtype: 'Data', - read_only: 1 - }, - { - fieldname: 'contribution_status', - label: __('Contribution Status'), - fieldtype: 'Data', - read_only: 1 - }, - { - fieldname: 'modified_by', - label: __('Verified By'), - fieldtype: 'Data', - read_only: 1, - depends_on: doc => { - return doc.contribution_status == 'Verified'; - } - }, - ] - }); - d.set_values(doc); - d.show(); + }, + ], }); + d.set_values(doc); + d.show(); + }); } update_header() { - let edited_translations_count = Object.keys(this.edited_translations) - .length; + let edited_translations_count = Object.keys(this.edited_translations).length; if (edited_translations_count) { - let message = ''; + let message = ""; if (edited_translations_count == 1) { - message = __('{0} translation pending', [edited_translations_count]); + message = __("{0} translation pending", [edited_translations_count]); } else { - message = __('{0} translations pending', [edited_translations_count]); + message = __("{0} translations pending", [edited_translations_count]); } - this.page.set_indicator(message, 'orange'); + this.page.set_indicator(message, "orange"); } else { - this.page.set_indicator(''); + this.page.set_indicator(""); } - this.page.btn_primary.prop('disabled', !edited_translations_count); + this.page.btn_primary.prop("disabled", !edited_translations_count); } get_indicator_color(message_obj) { - return !message_obj.translated ? 'red' : message_obj.translated_by_google ? 'orange' : 'blue'; + return !message_obj.translated + ? "red" + : message_obj.translated_by_google + ? "orange" + : "blue"; } get_indicator_status_text(message_obj) { if (!message_obj.translated) { - return __('Untranslated'); + return __("Untranslated"); } else if (message_obj.translated_by_google) { - return __('Google Translation'); + return __("Google Translation"); } else { - return __('Community Contribution'); + return __("Community Contribution"); } } get_contribution_indicator_color(message_obj) { - return message_obj.contribution_status == 'Pending' ? 'orange' : 'green'; + return message_obj.contribution_status == "Pending" ? "orange" : "green"; } get_code_url(path, line_no, app) { diff --git a/frappe/desk/page/user_profile/user_profile.js b/frappe/desk/page/user_profile/user_profile.js index 5890975e69..e4cef59cc7 100644 --- a/frappe/desk/page/user_profile/user_profile.js +++ b/frappe/desk/page/user_profile/user_profile.js @@ -1,5 +1,5 @@ -frappe.pages['user-profile'].on_page_load = function (wrapper) { - frappe.require('user_profile_controller.bundle.js', () => { +frappe.pages["user-profile"].on_page_load = function (wrapper) { + frappe.require("user_profile_controller.bundle.js", () => { let user_profile = new frappe.ui.UserProfile(wrapper); user_profile.show(); }); diff --git a/frappe/desk/page/user_profile/user_profile_controller.js b/frappe/desk/page/user_profile/user_profile_controller.js index 40b542d5c3..5103bd8a19 100644 --- a/frappe/desk/page/user_profile/user_profile_controller.js +++ b/frappe/desk/page/user_profile/user_profile_controller.js @@ -1,5 +1,5 @@ import BaseTimeline from "../../../public/js/frappe/form/footer/base_timeline"; -frappe.provide('frappe.energy_points'); +frappe.provide("frappe.energy_points"); class UserProfile { constructor(wrapper) { @@ -7,9 +7,9 @@ class UserProfile { this.page = frappe.ui.make_app_page({ parent: wrapper, }); - this.sidebar = this.wrapper.find('.layout-side-section'); - this.main_section = this.wrapper.find('.layout-main-section'); - this.wrapper.bind('show', () => { + this.sidebar = this.wrapper.find(".layout-side-section"); + this.main_section = this.wrapper.find(".layout-main-section"); + this.wrapper.bind("show", () => { this.show(); }); } @@ -17,13 +17,13 @@ class UserProfile { show() { let route = frappe.get_route(); this.user_id = route[1] || frappe.session.user; - frappe.dom.freeze(__('Loading user profile') + '...'); - frappe.db.exists('User', this.user_id).then(exists => { + frappe.dom.freeze(__("Loading user profile") + "..."); + frappe.db.exists("User", this.user_id).then((exists) => { frappe.dom.unfreeze(); if (exists) { this.make_user_profile(); } else { - frappe.msgprint(__('User does not exist')); + frappe.msgprint(__("User does not exist")); } }); } @@ -32,7 +32,7 @@ class UserProfile { this.user = frappe.user_info(this.user_id); this.page.set_title(this.user.fullname); this.setup_user_search(); - this.main_section.empty().append(frappe.render_template('user_profile')); + this.main_section.empty().append(frappe.render_template("user_profile")); this.energy_points = 0; this.review_points = 0; this.rank = 0; @@ -41,91 +41,92 @@ class UserProfile { this.render_points_and_rank(); this.render_heatmap(); this.render_line_chart(); - this.render_percentage_chart('type', 'Type Distribution'); + this.render_percentage_chart("type", "Type Distribution"); this.create_percentage_chart_filters(); this.setup_user_activity_timeline(); } setup_user_search() { this.$user_search_button = this.page.set_secondary_action( - __('Change User'), + __("Change User"), () => this.show_user_search_dialog(), - { icon: 'change', size: 'sm' } + { icon: "change", size: "sm" } ); } show_user_search_dialog() { let dialog = new frappe.ui.Dialog({ - title: __('Change User'), + title: __("Change User"), fields: [ { - fieldtype: 'Link', - fieldname: 'user', - options: 'User', - label: __('User'), - } + fieldtype: "Link", + fieldname: "user", + options: "User", + label: __("User"), + }, ], - primary_action_label: __('Go'), + primary_action_label: __("Go"), primary_action: ({ user }) => { dialog.hide(); - frappe.set_route('user-profile', user); - } + frappe.set_route("user-profile", user); + }, }); dialog.show(); } render_heatmap() { - this.heatmap = new frappe.Chart('.performance-heatmap', { - type: 'heatmap', - countLabel: 'Energy Points', + this.heatmap = new frappe.Chart(".performance-heatmap", { + type: "heatmap", + countLabel: "Energy Points", data: {}, discreteDomains: 1, radius: 3, - height: 150 + height: 150, }); this.update_heatmap_data(); this.create_heatmap_chart_filters(); } update_heatmap_data(date_from) { - frappe.xcall('frappe.desk.page.user_profile.user_profile.get_energy_points_heatmap_data', { - user: this.user_id, - date: date_from || frappe.datetime.year_start(), - }).then((r) => { - this.heatmap.update({ dataPoints: r }); - }); + frappe + .xcall("frappe.desk.page.user_profile.user_profile.get_energy_points_heatmap_data", { + user: this.user_id, + date: date_from || frappe.datetime.year_start(), + }) + .then((r) => { + this.heatmap.update({ dataPoints: r }); + }); } - render_line_chart() { this.line_chart_filters = [ - ['Energy Point Log', 'user', '=', this.user_id, false], - ['Energy Point Log', 'type', '!=', 'Review', false] + ["Energy Point Log", "user", "=", this.user_id, false], + ["Energy Point Log", "type", "!=", "Review", false], ]; this.line_chart_config = { - timespan: 'Last Month', - time_interval: 'Daily', - type: 'Line', - value_based_on: 'points', - chart_type: 'Sum', - document_type: 'Energy Point Log', - name: 'Energy Points', - width: 'half', - based_on: 'creation' + timespan: "Last Month", + time_interval: "Daily", + type: "Line", + value_based_on: "points", + chart_type: "Sum", + document_type: "Energy Point Log", + name: "Energy Points", + width: "half", + based_on: "creation", }; - this.line_chart = new frappe.Chart('.performance-line-chart', { - type: 'line', + this.line_chart = new frappe.Chart(".performance-line-chart", { + type: "line", height: 200, data: { labels: [], - datasets: [{}] + datasets: [{}], }, - colors: ['purple'], + colors: ["purple"], axisOptions: { - xIsSeries: 1 - } + xIsSeries: 1, + }, }); this.update_line_chart_data(); this.create_line_chart_filters(); @@ -134,217 +135,258 @@ class UserProfile { update_line_chart_data() { this.line_chart_config.filters_json = JSON.stringify(this.line_chart_filters); - frappe.xcall('frappe.desk.doctype.dashboard_chart.dashboard_chart.get', { - chart: this.line_chart_config, - no_cache: 1, - }).then(chart => { - this.line_chart.update(chart); - }); + frappe + .xcall("frappe.desk.doctype.dashboard_chart.dashboard_chart.get", { + chart: this.line_chart_config, + no_cache: 1, + }) + .then((chart) => { + this.line_chart.update(chart); + }); } // eslint-disable-next-line no-unused-vars render_percentage_chart(field, title) { - frappe.xcall('frappe.desk.page.user_profile.user_profile.get_energy_points_percentage_chart_data', { - user: this.user_id, - field: field - }).then(chart => { - if (chart.labels.length) { - this.percentage_chart = new frappe.Chart('.performance-percentage-chart', { - type: 'percentage', - data: { - labels: chart.labels, - datasets: chart.datasets - }, - truncateLegends: 1, - barOptions: { - height: 11, - depth: 1 - }, - height: 200, - maxSlices: 8, - colors: ['purple', 'blue', 'cyan', 'teal', 'pink', 'red', 'orange', 'yellow'], - }); - } else { - this.wrapper.find('.percentage-chart-container').hide(); - } - }); + frappe + .xcall( + "frappe.desk.page.user_profile.user_profile.get_energy_points_percentage_chart_data", + { + user: this.user_id, + field: field, + } + ) + .then((chart) => { + if (chart.labels.length) { + this.percentage_chart = new frappe.Chart(".performance-percentage-chart", { + type: "percentage", + data: { + labels: chart.labels, + datasets: chart.datasets, + }, + truncateLegends: 1, + barOptions: { + height: 11, + depth: 1, + }, + height: 200, + maxSlices: 8, + colors: [ + "purple", + "blue", + "cyan", + "teal", + "pink", + "red", + "orange", + "yellow", + ], + }); + } else { + this.wrapper.find(".percentage-chart-container").hide(); + } + }); } create_line_chart_filters() { let filters = [ { - label: 'All', - options: ['All', 'Auto', 'Criticism', 'Appreciation', 'Revert'], + label: "All", + options: ["All", "Auto", "Criticism", "Appreciation", "Revert"], action: (selected_item) => { - if (selected_item === 'All') { + if (selected_item === "All") { this.line_chart_filters = [ - ['Energy Point Log', 'user', '=', this.user_id, false], - ['Energy Point Log', 'type', '!=', 'Review', false] + ["Energy Point Log", "user", "=", this.user_id, false], + ["Energy Point Log", "type", "!=", "Review", false], ]; } else { - this.line_chart_filters[1] = ['Energy Point Log', 'type', '=', selected_item, false]; + this.line_chart_filters[1] = [ + "Energy Point Log", + "type", + "=", + selected_item, + false, + ]; } this.update_line_chart_data(); - } + }, }, { - label: 'Last Month', - options: ['Last Week', 'Last Month', 'Last Quarter', 'Last Year'], + label: "Last Month", + options: ["Last Week", "Last Month", "Last Quarter", "Last Year"], action: (selected_item) => { this.line_chart_config.timespan = selected_item; this.update_line_chart_data(); - } + }, }, { - label: 'Daily', - options: ['Daily', 'Weekly', 'Monthly'], + label: "Daily", + options: ["Daily", "Weekly", "Monthly"], action: (selected_item) => { this.line_chart_config.time_interval = selected_item; this.update_line_chart_data(); - } + }, }, ]; - frappe.dashboard_utils.render_chart_filters(filters, 'chart-filter', '.line-chart-options', 1); + frappe.dashboard_utils.render_chart_filters( + filters, + "chart-filter", + ".line-chart-options", + 1 + ); } create_percentage_chart_filters() { let filters = [ { - label: 'Type', - options: ['Type', 'Reference Doctype', 'Rule'], - fieldnames: ['type', 'reference_doctype', 'rule'], + label: "Type", + options: ["Type", "Reference Doctype", "Rule"], + fieldnames: ["type", "reference_doctype", "rule"], action: (selected_item, fieldname) => { - let title = selected_item + ' Distribution'; + let title = selected_item + " Distribution"; this.render_percentage_chart(fieldname, title); - } + }, }, ]; - frappe.dashboard_utils.render_chart_filters(filters, 'chart-filter', '.percentage-chart-options'); + frappe.dashboard_utils.render_chart_filters( + filters, + "chart-filter", + ".percentage-chart-options" + ); } create_heatmap_chart_filters() { let filters = [ { label: frappe.dashboard_utils.get_year(frappe.datetime.now_date()), - options: frappe.dashboard_utils.get_years_since_creation(frappe.boot.user.creation), + options: frappe.dashboard_utils.get_years_since_creation( + frappe.boot.user.creation + ), action: (selected_item) => { this.update_heatmap_data(frappe.datetime.obj_to_str(selected_item)); - } + }, }, ]; - frappe.dashboard_utils.render_chart_filters(filters, 'chart-filter', '.heatmap-options'); + frappe.dashboard_utils.render_chart_filters(filters, "chart-filter", ".heatmap-options"); } - edit_profile() { let edit_profile_dialog = new frappe.ui.Dialog({ - title: __('Edit Profile'), + title: __("Edit Profile"), fields: [ { - fieldtype: 'Attach Image', - fieldname: 'user_image', - label: 'Profile Image', + fieldtype: "Attach Image", + fieldname: "user_image", + label: "Profile Image", }, { - fieldtype: 'Data', - fieldname: 'interest', - label: 'Interests', + fieldtype: "Data", + fieldname: "interest", + label: "Interests", }, { - fieldtype: 'Column Break' + fieldtype: "Column Break", }, { - fieldtype: 'Data', - fieldname: 'location', - label: 'Location', + fieldtype: "Data", + fieldname: "location", + label: "Location", }, { - fieldtype: 'Section Break', - fieldname: 'Interest', + fieldtype: "Section Break", + fieldname: "Interest", }, { - fieldtype: 'Small Text', - fieldname: 'bio', - label: 'Bio', - } + fieldtype: "Small Text", + fieldname: "bio", + label: "Bio", + }, ], - primary_action: values => { + primary_action: (values) => { edit_profile_dialog.disable_primary_action(); - frappe.xcall('frappe.desk.page.user_profile.user_profile.update_profile_info', { - profile_info: values - }).then(user => { - user.image = user.user_image; - this.user = Object.assign(values, user); - edit_profile_dialog.hide(); - this.render_user_details(); - }).finally(() => { - edit_profile_dialog.enable_primary_action(); - }); + frappe + .xcall("frappe.desk.page.user_profile.user_profile.update_profile_info", { + profile_info: values, + }) + .then((user) => { + user.image = user.user_image; + this.user = Object.assign(values, user); + edit_profile_dialog.hide(); + this.render_user_details(); + }) + .finally(() => { + edit_profile_dialog.enable_primary_action(); + }); }, - primary_action_label: __('Save') + primary_action_label: __("Save"), }); edit_profile_dialog.set_values({ user_image: this.user.image, location: this.user.location, interest: this.user.interest, - bio: this.user.bio + bio: this.user.bio, }); edit_profile_dialog.show(); } render_user_details() { - this.sidebar.empty().append(frappe.render_template('user_profile_sidebar', { - user_image: this.user.image, - user_abbr: this.user.abbr, - user_location: this.user.location, - user_interest: this.user.interest, - user_bio: this.user.bio, - })); + this.sidebar.empty().append( + frappe.render_template("user_profile_sidebar", { + user_image: this.user.image, + user_abbr: this.user.abbr, + user_location: this.user.location, + user_interest: this.user.interest, + user_bio: this.user.bio, + }) + ); this.setup_user_profile_links(); } setup_user_profile_links() { if (this.user_id !== frappe.session.user) { - this.wrapper.find('.profile-links').hide(); + this.wrapper.find(".profile-links").hide(); } else { - this.wrapper.find('.edit-profile-link').on('click', () => { + this.wrapper.find(".edit-profile-link").on("click", () => { this.edit_profile(); }); - this.wrapper.find('.user-settings-link').on('click', () => { + this.wrapper.find(".user-settings-link").on("click", () => { this.go_to_user_settings(); }); } } get_user_rank() { - return frappe.xcall('frappe.desk.page.user_profile.user_profile.get_user_rank', { - user: this.user_id, - }).then(r => { - if (r.monthly_rank.length) this.month_rank = r.monthly_rank[0]; - if (r.all_time_rank.length) this.rank = r.all_time_rank[0]; - }); + return frappe + .xcall("frappe.desk.page.user_profile.user_profile.get_user_rank", { + user: this.user_id, + }) + .then((r) => { + if (r.monthly_rank.length) this.month_rank = r.monthly_rank[0]; + if (r.all_time_rank.length) this.rank = r.all_time_rank[0]; + }); } get_user_points() { - return frappe.xcall( - 'frappe.social.doctype.energy_point_log.energy_point_log.get_user_energy_and_review_points', - { - user: this.user_id, - } - ).then(r => { - if (r[this.user_id]) { - this.energy_points = r[this.user_id].energy_points; - this.review_points = r[this.user_id].review_points; - } - }); + return frappe + .xcall( + "frappe.social.doctype.energy_point_log.energy_point_log.get_user_energy_and_review_points", + { + user: this.user_id, + } + ) + .then((r) => { + if (r[this.user_id]) { + this.energy_points = r[this.user_id].energy_points; + this.review_points = r[this.user_id].review_points; + } + }); } render_points_and_rank() { - let $profile_details = this.wrapper.find('.user-stats'); - let $profile_details_wrapper = this.wrapper.find('.user-stats-detail'); + let $profile_details = this.wrapper.find(".user-stats"); + let $profile_details_wrapper = this.wrapper.find(".user-stats-detail"); const _get_stat_dom = (value, label, icon) => { return `
      @@ -359,10 +401,10 @@ class UserProfile { this.get_user_rank().then(() => { this.get_user_points().then(() => { let html = $(` - ${_get_stat_dom(this.energy_points, __('Energy Points'), "color-energy-points")} - ${_get_stat_dom(this.review_points, __('Review Points'), "color-review-points")} - ${_get_stat_dom(this.rank, __('Rank'), "color-rank")} - ${_get_stat_dom(this.month_rank, __('Monthly Rank'), "color-monthly-rank")} + ${_get_stat_dom(this.energy_points, __("Energy Points"), "color-energy-points")} + ${_get_stat_dom(this.review_points, __("Review Points"), "color-review-points")} + ${_get_stat_dom(this.rank, __("Rank"), "color-rank")} + ${_get_stat_dom(this.month_rank, __("Monthly Rank"), "color-monthly-rank")} `); $profile_details.append(html); @@ -372,14 +414,14 @@ class UserProfile { } go_to_user_settings() { - frappe.set_route('Form', 'User', this.user_id); + frappe.set_route("Form", "User", this.user_id); } setup_user_activity_timeline() { this.user_activity_timeline = new UserProfileTimeline({ - parent: this.wrapper.find('.recent-activity-list'), - footer: this.wrapper.find('.recent-activity-footer'), - user: this.user_id + parent: this.wrapper.find(".recent-activity-list"), + footer: this.wrapper.find(".recent-activity-footer"), + user: this.user_id, }); this.user_activity_timeline.refresh(); @@ -397,24 +439,27 @@ class UserProfileTimeline extends BaseTimeline { return this.get_user_activity_data().then((activities) => { if (!activities.length) { this.show_more_button.hide(); - this.timeline_wrapper.html(`
      ${__('No activities to show')}
      `); + this.timeline_wrapper.html(`
      ${__("No activities to show")}
      `); return; } this.show_more_button.toggle(activities.length === this.activity_limit); - this.timeline_items = activities.map((activity) => this.get_activity_timeline_item(activity)); + this.timeline_items = activities.map((activity) => + this.get_activity_timeline_item(activity) + ); }); } get_user_activity_data() { - return frappe.xcall('frappe.desk.page.user_profile.user_profile.get_energy_points_list', { + return frappe.xcall("frappe.desk.page.user_profile.user_profile.get_energy_points_list", { start: this.activity_start, limit: this.activity_limit, - user: this.user + user: this.user, }); } get_activity_timeline_item(data) { - let icon = data.type == 'Appreciation' ? 'clap': data.type == 'Criticism' ? 'criticize': null; + let icon = + data.type == "Appreciation" ? "clap" : data.type == "Criticism" ? "criticize" : null; return { icon: icon, creation: data.creation, @@ -424,23 +469,27 @@ class UserProfileTimeline extends BaseTimeline { } setup_show_more_activity() { - this.show_more_button = $(`
      ${__('Show More Activity')}`); + this.show_more_button = $( + `${__("Show More Activity")}` + ); this.show_more_button.hide(); this.footer.append(this.show_more_button); - this.show_more_button.on('click', () => this.show_more_activity()); + this.show_more_button.on("click", () => this.show_more_activity()); } show_more_activity() { this.activity_start += this.activity_limit; - this.get_user_activity_data().then(activities => { + this.get_user_activity_data().then((activities) => { if (!activities.length || activities.length < this.activity_limit) { this.show_more_button.hide(); } - let timeline_items = activities.map((activity) => this.get_activity_timeline_item(activity)); + let timeline_items = activities.map((activity) => + this.get_activity_timeline_item(activity) + ); timeline_items.map((item) => this.add_timeline_item(item, true)); }); } } -frappe.provide('frappe.ui'); +frappe.provide("frappe.ui"); frappe.ui.UserProfile = UserProfile; diff --git a/frappe/desk/report/todo/todo.js b/frappe/desk/report/todo/todo.js index bb2e0f7846..52fee62afd 100644 --- a/frappe/desk/report/todo/todo.js +++ b/frappe/desk/report/todo/todo.js @@ -3,7 +3,5 @@ /* eslint-disable */ frappe.query_reports["ToDo"] = { - "filters": [ - - ] -} + filters: [], +}; diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.js b/frappe/email/doctype/auto_email_report/auto_email_report.js index 3423c3ccba..6930078512 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.js +++ b/frappe/email/doctype/auto_email_report/auto_email_report.js @@ -1,139 +1,156 @@ // Copyright (c) 2016, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Auto Email Report', { - refresh: function(frm) { - frm.trigger('fetch_report_filters'); - if(!frm.is_new()) { - frm.add_custom_button(__('Download'), function() { +frappe.ui.form.on("Auto Email Report", { + refresh: function (frm) { + frm.trigger("fetch_report_filters"); + if (!frm.is_new()) { + frm.add_custom_button(__("Download"), function () { var w = window.open( frappe.urllib.get_full_url( - "/api/method/frappe.email.doctype.auto_email_report.auto_email_report.download?" - +"name="+encodeURIComponent(frm.doc.name))); - if(!w) { - frappe.msgprint(__("Please enable pop-ups")); return; + "/api/method/frappe.email.doctype.auto_email_report.auto_email_report.download?" + + "name=" + + encodeURIComponent(frm.doc.name) + ) + ); + if (!w) { + frappe.msgprint(__("Please enable pop-ups")); + return; } }); - frm.add_custom_button(__('Send Now'), function() { + frm.add_custom_button(__("Send Now"), function () { frappe.call({ - method: 'frappe.email.doctype.auto_email_report.auto_email_report.send_now', - args: {name: frm.doc.name}, - callback: function() { - frappe.msgprint(__('Scheduled to send')); - } + method: "frappe.email.doctype.auto_email_report.auto_email_report.send_now", + args: { name: frm.doc.name }, + callback: function () { + frappe.msgprint(__("Scheduled to send")); + }, }); }); } else { - if(!frm.doc.user) { - frm.set_value('user', frappe.session.user); + if (!frm.doc.user) { + frm.set_value("user", frappe.session.user); } - if(!frm.doc.email_to) { - frm.set_value('email_to', frappe.session.user); + if (!frm.doc.email_to) { + frm.set_value("email_to", frappe.session.user); } } }, - report: function(frm) { - frm.set_value('filters', ''); - frm.trigger('fetch_report_filters'); + report: function (frm) { + frm.set_value("filters", ""); + frm.trigger("fetch_report_filters"); }, fetch_report_filters(frm) { - if (frm.doc.report - && frm.doc.report_type !== 'Report Builder' - && frm.script_setup_for !== frm.doc.report + if ( + frm.doc.report && + frm.doc.report_type !== "Report Builder" && + frm.script_setup_for !== frm.doc.report ) { frappe.call({ method: "frappe.desk.query_report.get_script", args: { - report_name: frm.doc.report + report_name: frm.doc.report, }, - callback: function(r) { + callback: function (r) { frappe.dom.eval(r.message.script || ""); frm.script_setup_for = frm.doc.report; - frm.trigger('show_filters'); - } + frm.trigger("show_filters"); + }, }); } else { - frm.trigger('show_filters'); + frm.trigger("show_filters"); } }, - show_filters: function(frm) { - var wrapper = $(frm.get_field('filters_display').wrapper); + show_filters: function (frm) { + var wrapper = $(frm.get_field("filters_display").wrapper); wrapper.empty(); - if(frm.doc.report_type === 'Custom Report' || (frm.doc.report_type !== 'Report Builder' - && frappe.query_reports[frm.doc.report] - && frappe.query_reports[frm.doc.report].filters)) { - + if ( + frm.doc.report_type === "Custom Report" || + (frm.doc.report_type !== "Report Builder" && + frappe.query_reports[frm.doc.report] && + frappe.query_reports[frm.doc.report].filters) + ) { // make a table to show filters - var table = $('\ - \ -
      '+__('Filter')+''+__('Value')+'
      ').appendTo(wrapper); - $('

      ' + __("Click table to edit") + '

      ').appendTo(wrapper); + var table = $( + '\ + \ +
      ' + + __("Filter") + + "" + + __("Value") + + "
      " + ).appendTo(wrapper); + $('

      ' + __("Click table to edit") + "

      ").appendTo( + wrapper + ); - var filters = JSON.parse(frm.doc.filters || '{}'); + var filters = JSON.parse(frm.doc.filters || "{}"); let report_filters; - if (frm.doc.report_type === 'Custom Report' - && frappe.query_reports[frm.doc.reference_report] - && frappe.query_reports[frm.doc.reference_report].filters) { + if ( + frm.doc.report_type === "Custom Report" && + frappe.query_reports[frm.doc.reference_report] && + frappe.query_reports[frm.doc.reference_report].filters + ) { report_filters = frappe.query_reports[frm.doc.reference_report].filters; } else { report_filters = frappe.query_reports[frm.doc.report].filters; } - if(report_filters && report_filters.length > 0) { - frm.set_value('filter_meta', JSON.stringify(report_filters)); + if (report_filters && report_filters.length > 0) { + frm.set_value("filter_meta", JSON.stringify(report_filters)); if (frm.is_dirty()) { frm.save(); } } - var report_filters_list = [] - $.each(report_filters, function(key, val){ + var report_filters_list = []; + $.each(report_filters, function (key, val) { // Remove break fieldtype from the filters - if(val.fieldtype != 'Break') { - report_filters_list.push(val) + if (val.fieldtype != "Break") { + report_filters_list.push(val); } - }) + }); report_filters = report_filters_list; const mandatory_css = { "background-color": "var(--error-bg)", - "font-weight": "bold" + "font-weight": "bold", }; - report_filters.forEach(f => { + report_filters.forEach((f) => { const css = f.reqd ? mandatory_css : {}; const row = $("").appendTo(table.find("tbody")); $("" + f.label + "").appendTo(row); - $("" + frappe.format(filters[f.fieldname], f) +"") + $("" + frappe.format(filters[f.fieldname], f) + "") .css(css) .appendTo(row); }); - table.on('click', function() { + table.on("click", function () { var dialog = new frappe.ui.Dialog({ fields: report_filters, - primary_action: function() { + primary_action: function () { var values = this.get_values(); - if(values) { + if (values) { this.hide(); - frm.set_value('filters', JSON.stringify(values)); - frm.trigger('show_filters'); + frm.set_value("filters", JSON.stringify(values)); + frm.trigger("show_filters"); } - } + }, }); dialog.show(); dialog.set_values(filters); - }) + }); // populate dynamic date field selection let date_fields = report_filters - .filter(df => df.fieldtype === 'Date') - .map(df => ({ label: df.label, value: df.fieldname })); - frm.set_df_property('from_date_field', 'options', date_fields); - frm.set_df_property('to_date_field', 'options', date_fields); - frm.toggle_display('dynamic_report_filters_section', date_fields.length > 0); + .filter((df) => df.fieldtype === "Date") + .map((df) => ({ label: df.label, value: df.fieldname })); + frm.set_df_property("from_date_field", "options", date_fields); + frm.set_df_property("to_date_field", "options", date_fields); + frm.toggle_display("dynamic_report_filters_section", date_fields.length > 0); } - } + }, }); diff --git a/frappe/email/doctype/document_follow/document_follow.js b/frappe/email/doctype/document_follow/document_follow.js index 3fdf055d36..59efb37341 100644 --- a/frappe/email/doctype/document_follow/document_follow.js +++ b/frappe/email/doctype/document_follow/document_follow.js @@ -1,6 +1,4 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Document Follow', { - -}); +frappe.ui.form.on("Document Follow", {}); diff --git a/frappe/email/doctype/email_account/email_account.js b/frappe/email/doctype/email_account/email_account.js index 3faf83800d..3e42af7051 100644 --- a/frappe/email/doctype/email_account/email_account.js +++ b/frappe/email/doctype/email_account/email_account.js @@ -1,84 +1,83 @@ frappe.email_defaults = { - "GMail": { - "email_server": "imap.gmail.com", - "incoming_port": 993, - "use_ssl": 1, - "enable_outgoing": 1, - "smtp_server": "smtp.gmail.com", - "smtp_port": 587, - "use_tls": 1, - "use_imap": 1 + GMail: { + email_server: "imap.gmail.com", + incoming_port: 993, + use_ssl: 1, + enable_outgoing: 1, + smtp_server: "smtp.gmail.com", + smtp_port: 587, + use_tls: 1, + use_imap: 1, }, "Outlook.com": { - "email_server": "imap-mail.outlook.com", - "use_ssl": 1, - "enable_outgoing": 1, - "smtp_server": "smtp-mail.outlook.com", - "smtp_port": 587, - "use_tls": 1, - "use_imap": 1 + email_server: "imap-mail.outlook.com", + use_ssl: 1, + enable_outgoing: 1, + smtp_server: "smtp-mail.outlook.com", + smtp_port: 587, + use_tls: 1, + use_imap: 1, }, - "Sendgrid": { - "enable_outgoing": 1, - "smtp_server": "smtp.sendgrid.net", - "smtp_port": 587, - "use_tls": 1, + Sendgrid: { + enable_outgoing: 1, + smtp_server: "smtp.sendgrid.net", + smtp_port: 587, + use_tls: 1, }, - "SparkPost": { - "enable_incoming": 0, - "enable_outgoing": 1, - "smtp_server": "smtp.sparkpostmail.com", - "smtp_port": 587, - "use_tls": 1 + SparkPost: { + enable_incoming: 0, + enable_outgoing: 1, + smtp_server: "smtp.sparkpostmail.com", + smtp_port: 587, + use_tls: 1, }, "Yahoo Mail": { - "email_server": "imap.mail.yahoo.com", - "use_ssl": 1, - "enable_outgoing": 1, - "smtp_server": "smtp.mail.yahoo.com", - "smtp_port": 587, - "use_tls": 1, - "use_imap": 1 + email_server: "imap.mail.yahoo.com", + use_ssl: 1, + enable_outgoing: 1, + smtp_server: "smtp.mail.yahoo.com", + smtp_port: 587, + use_tls: 1, + use_imap: 1, }, "Yandex.Mail": { - "email_server": "imap.yandex.com", - "use_ssl": 1, - "enable_outgoing": 1, - "smtp_server": "smtp.yandex.com", - "smtp_port": 587, - "use_tls": 1, - "use_imap": 1 + email_server: "imap.yandex.com", + use_ssl: 1, + enable_outgoing: 1, + smtp_server: "smtp.yandex.com", + smtp_port: 587, + use_tls: 1, + use_imap: 1, }, }; frappe.email_defaults_pop = { - "GMail": { - "email_server": "pop.gmail.com" + GMail: { + email_server: "pop.gmail.com", }, "Outlook.com": { - "email_server": "pop3-mail.outlook.com" + email_server: "pop3-mail.outlook.com", }, "Yahoo Mail": { - "email_server": "pop.mail.yahoo.com" + email_server: "pop.mail.yahoo.com", }, "Yandex.Mail": { - "email_server": "pop.yandex.com" + email_server: "pop.yandex.com", }, - }; function oauth_access(frm) { return frappe.call({ method: "frappe.email.oauth.oauth_access", args: { - "email_account": frm.doc.name, - "service": frm.doc.service || "" + email_account: frm.doc.name, + service: frm.doc.service || "", }, - callback: function(r) { + callback: function (r) { if (!r.exc) { window.open(r.message.url, "_self"); } - } + }, }); } @@ -86,9 +85,9 @@ function set_default_max_attachment_size(frm, field) { if (frm.doc.__islocal && !frm.doc[field]) { frappe.call({ method: "frappe.core.api.file.get_max_file_size", - callback: function(r) { + callback: function (r) { if (!r.exc) { - frm.set_value(field, Number(r.message)/(1024*1024)); + frm.set_value(field, Number(r.message) / (1024 * 1024)); } }, }); @@ -96,12 +95,12 @@ function set_default_max_attachment_size(frm, field) { } frappe.ui.form.on("Email Account", { - service: function(frm) { - $.each(frappe.email_defaults[frm.doc.service], function(key, value) { + service: function (frm) { + $.each(frappe.email_defaults[frm.doc.service], function (key, value) { frm.set_value(key, value); }); if (!frm.doc.use_imap) { - $.each(frappe.email_defaults_pop[frm.doc.service], function(key, value) { + $.each(frappe.email_defaults_pop[frm.doc.service], function (key, value) { frm.set_value(key, value); }); } @@ -109,54 +108,56 @@ frappe.ui.form.on("Email Account", { frm.events.toggle_auth_method(frm); }, - use_imap: function(frm) { + use_imap: function (frm) { 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); }); - } - else{ - $.each(frappe.email_defaults[frm.doc.service], function(key, value) { + } else { + $.each(frappe.email_defaults[frm.doc.service], function (key, value) { frm.set_value(key, value); }); } }, - enable_incoming: function(frm) { + enable_incoming: function (frm) { frm.trigger("warn_autoreply_on_incoming"); }, - enable_auto_reply: function(frm) { + enable_auto_reply: function (frm) { frm.trigger("warn_autoreply_on_incoming"); }, - notify_if_unreplied: function(frm) { + notify_if_unreplied: function (frm) { frm.set_df_property("send_notification_to", "reqd", frm.doc.notify_if_unreplied); }, - onload: function(frm) { - if (frappe.utils.get_query_params().successful_authorization === '1') { + onload: function (frm) { + if (frappe.utils.get_query_params().successful_authorization === "1") { frappe.show_alert(__("Successfully Authorized")); // FIXME: find better alternative window.history.replaceState(null, "", window.location.pathname); } frm.set_df_property("append_to", "only_select", true); - frm.set_query("append_to", "frappe.email.doctype.email_account.email_account.get_append_to"); - frm.set_query("append_to", "imap_folder", function() { + frm.set_query( + "append_to", + "frappe.email.doctype.email_account.email_account.get_append_to" + ); + frm.set_query("append_to", "imap_folder", function () { return { - query: "frappe.email.doctype.email_account.email_account.get_append_to" + query: "frappe.email.doctype.email_account.email_account.get_append_to", }; }); if (frm.doc.__islocal) { - frm.add_child("imap_folder", {"folder_name": "INBOX"}); + frm.add_child("imap_folder", { folder_name: "INBOX" }); frm.refresh_field("imap_folder"); } - frm.toggle_display(['auth_method'], frm.doc.service === "GMail"); + frm.toggle_display(["auth_method"], frm.doc.service === "GMail"); set_default_max_attachment_size(frm, "attachment_limit"); }, - refresh: function(frm) { + refresh: function (frm) { frm.events.set_domain_fields(frm); frm.events.enable_incoming(frm); frm.events.notify_if_unreplied(frm); @@ -165,7 +166,7 @@ frappe.ui.form.on("Email Account", { 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 locals["User"][frappe.route_flags.linked_user]; } }, @@ -175,67 +176,71 @@ frappe.ui.form.on("Email Account", { } }, - toggle_auth_method: function(frm) { + toggle_auth_method: function (frm) { if (frm.doc.service !== "GMail") { - frm.toggle_display(['auth_method'], false); + frm.toggle_display(["auth_method"], false); frm.doc.auth_method = "Basic"; } else { - frm.toggle_display(['auth_method'], true); + frm.toggle_display(["auth_method"], true); } }, - show_gmail_message_for_less_secure_apps: function(frm) { + show_gmail_message_for_less_secure_apps: function (frm) { frm.dashboard.clear_headline(); - let msg = __("GMail will only work if you enable 2-step authentication and use app-specific password OR use OAuth."); + let msg = __( + "GMail will only work if you enable 2-step authentication and use app-specific password OR use OAuth." + ); let cta = __("Read the step by step guide here."); msg += ` ${cta}`; - if (frm.doc.service==="GMail") { + if (frm.doc.service === "GMail") { frm.dashboard.set_headline_alert(msg); } }, show_oauth_authorization_message(frm) { if (frm.doc.auth_method === "OAuth" && !frm.doc.refresh_token) { - let msg = __('OAuth has been enabled but not authorised. Please use "Authorise API Access" button to do the same.') + let msg = __( + 'OAuth has been enabled but not authorised. Please use "Authorise API Access" button to do the same.' + ); frm.dashboard.clear_headline(); frm.dashboard.set_headline_alert(msg, "yellow"); } }, - authorize_api_access: function(frm) { + authorize_api_access: function (frm) { oauth_access(frm); }, - email_id:function(frm) { + email_id: function (frm) { //pull domain and if no matching domain go create one frm.events.update_domain(frm); }, - update_domain: function(frm) { + update_domain: function (frm) { if (!frm.doc.email_id && !frm.doc.service) { return; } frappe.call({ - method: 'get_domain', + method: "get_domain", doc: frm.doc, args: { - "email_id": frm.doc.email_id + email_id: frm.doc.email_id, }, - callback: function(r) { + callback: function (r) { if (r.message) { frm.events.set_domain_fields(frm, r.message); } - } + }, }); }, - set_domain_fields: function(frm, args) { + set_domain_fields: function (frm, args) { if (!args) { - args = frappe.route_flags.set_domain_values? frappe.route_options: {}; + args = frappe.route_flags.set_domain_values ? frappe.route_options : {}; } - for(var field in args) { + for (var field in args) { frm.set_value(field, args[field]); } @@ -243,24 +248,28 @@ frappe.ui.form.on("Email Account", { frappe.route_options = {}; }, - email_sync_option: function(frm) { + email_sync_option: function (frm) { // confirm if the ALL sync option is selected if (frm.doc.email_sync_option == "ALL") { - var msg = __("You are selecting Sync Option as ALL, It will resync all read as well as unread message from server. This may also cause the duplication of Communication (emails)."); - frappe.confirm(msg, null, function() { + var msg = __( + "You are selecting Sync Option as ALL, It will resync all read as well as unread message from server. This may also cause the duplication of Communication (emails)." + ); + frappe.confirm(msg, null, function () { frm.set_value("email_sync_option", "UNSEEN"); }); } }, - warn_autoreply_on_incoming: function(frm) { + warn_autoreply_on_incoming: function (frm) { if (frm.doc.enable_incoming && frm.doc.enable_auto_reply && frm.doc.__islocal) { - var msg = __("Enabling auto reply on an incoming email account will send automated replies to all the synchronized emails. Do you wish to continue?"); - frappe.confirm(msg, null, function() { + var msg = __( + "Enabling auto reply on an incoming email account will send automated replies to all the synchronized emails. Do you wish to continue?" + ); + frappe.confirm(msg, null, function () { frm.set_value("enable_auto_reply", 0); - frappe.show_alert({message: __("Disabled Auto Reply"), indicator: "blue"}); + frappe.show_alert({ message: __("Disabled Auto Reply"), indicator: "blue" }); }); } - } + }, }); diff --git a/frappe/email/doctype/email_account/email_account_list.js b/frappe/email/doctype/email_account/email_account_list.js index 5ec56fb3db..5913706cbf 100644 --- a/frappe/email/doctype/email_account/email_account_list.js +++ b/frappe/email/doctype/email_account/email_account_list.js @@ -1,23 +1,24 @@ frappe.listview_settings["Email Account"] = { add_fields: ["default_incoming", "default_outgoing", "enable_incoming", "enable_outgoing"], - get_indicator: function(doc) { - if(doc.default_incoming && doc.default_outgoing) { - var color = (doc.enable_incoming && doc.enable_outgoing) ? "blue" : "gray"; - return [__("Default Sending and Inbox"), color, "default_incoming,=,Yes|default_outgoing,=,Yes"] - } - else if(doc.default_incoming) { + get_indicator: function (doc) { + if (doc.default_incoming && doc.default_outgoing) { + var color = doc.enable_incoming && doc.enable_outgoing ? "blue" : "gray"; + return [ + __("Default Sending and Inbox"), + color, + "default_incoming,=,Yes|default_outgoing,=,Yes", + ]; + } else if (doc.default_incoming) { color = doc.enable_incoming ? "blue" : "gray"; return [__("Default Inbox"), color, "default_incoming,=,Yes"]; - } - else if(doc.default_outgoing) { + } else if (doc.default_outgoing) { color = doc.enable_outgoing ? "blue" : "gray"; return [__("Default Sending"), color, "default_outgoing,=,Yes"]; - } - else { + } else { color = doc.enable_incoming ? "blue" : "gray"; return [__("Inbox"), color, "is_global,=,No|is_default=No"]; } - } -} + }, +}; frappe.help.youtube_id["Email Account"] = "YFYe0DrB95o"; diff --git a/frappe/email/doctype/email_domain/email_domain.js b/frappe/email/doctype/email_domain/email_domain.js index 1716bf9900..ea93758905 100644 --- a/frappe/email/doctype/email_domain/email_domain.js +++ b/frappe/email/doctype/email_domain/email_domain.js @@ -1,29 +1,28 @@ - frappe.ui.form.on("Email Domain", { - email_id:function(frm){ - frm.set_value("domain_name",frm.doc.email_id.split("@")[1]) + email_id: function (frm) { + frm.set_value("domain_name", frm.doc.email_id.split("@")[1]); }, - refresh:function(frm){ - if (frm.doc.email_id){ - frm.set_value("domain_name",frm.doc.email_id.split("@")[1]) + refresh: function (frm) { + if (frm.doc.email_id) { + 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(); delete frappe.route_flags.return_to_email_account; - frappe.route_flags.set_domain_values = true + frappe.route_flags.set_domain_values = true; - frappe.route_options = { + (frappe.route_options = { domain: frm.doc.name, use_imap: frm.doc.use_imap, email_server: frm.doc.email_server, use_ssl: frm.doc.use_ssl, smtp_server: frm.doc.smtp_server, use_tls: frm.doc.use_tls, - smtp_port: frm.doc.smtp_port - }, - frappe.set_route(route); + smtp_port: frm.doc.smtp_port, + }), + frappe.set_route(route); } - } -}) \ No newline at end of file + }, +}); diff --git a/frappe/email/doctype/email_flag_queue/email_flag_queue.js b/frappe/email/doctype/email_flag_queue/email_flag_queue.js index 19c4d4b0c1..ee062815f5 100644 --- a/frappe/email/doctype/email_flag_queue/email_flag_queue.js +++ b/frappe/email/doctype/email_flag_queue/email_flag_queue.js @@ -1,8 +1,6 @@ // Copyright (c) 2016, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Email Flag Queue', { - refresh: function(frm) { - - } +frappe.ui.form.on("Email Flag Queue", { + refresh: function (frm) {}, }); diff --git a/frappe/email/doctype/email_group/email_group.js b/frappe/email/doctype/email_group/email_group.js index 404600c97d..5ad4a39dd9 100644 --- a/frappe/email/doctype/email_group/email_group.js +++ b/frappe/email/doctype/email_group/email_group.js @@ -1,46 +1,74 @@ // Copyright (c) 2016, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on("Email Group", "refresh", function(frm) { - if(!frm.is_new()) { - frm.add_custom_button(__("Import Subscribers"), function() { - frappe.prompt({fieldtype:"Select", options: frm.doc.__onload.import_types, - label:__("Import Email From"), fieldname:"doctype", reqd:1}, - function(data) { - frappe.call({ - method: "frappe.email.doctype.email_group.email_group.import_from", - args: { - "name": frm.doc.name, - "doctype": data.doctype - }, - callback: function(r) { - frm.set_value("total_subscribers", r.message); - } - }) - }, __("Import Subscribers"), __("Import")); - }, __("Action")); +frappe.ui.form.on("Email Group", "refresh", function (frm) { + if (!frm.is_new()) { + frm.add_custom_button( + __("Import Subscribers"), + function () { + frappe.prompt( + { + fieldtype: "Select", + options: frm.doc.__onload.import_types, + label: __("Import Email From"), + fieldname: "doctype", + reqd: 1, + }, + function (data) { + frappe.call({ + method: "frappe.email.doctype.email_group.email_group.import_from", + args: { + name: frm.doc.name, + doctype: data.doctype, + }, + callback: function (r) { + frm.set_value("total_subscribers", r.message); + }, + }); + }, + __("Import Subscribers"), + __("Import") + ); + }, + __("Action") + ); - frm.add_custom_button(__("Add Subscribers"), function() { - frappe.prompt({fieldtype:"Text", - label:__("Email Addresses"), fieldname:"email_list", reqd:1}, - function(data) { - frappe.call({ - method: "frappe.email.doctype.email_group.email_group.add_subscribers", - args: { - "name": frm.doc.name, - "email_list": data.email_list - }, - callback: function(r) { - frm.set_value("total_subscribers", r.message); - } - }) - }, __("Add Subscribers"), __("Add")); - }, __("Action")); - - frm.add_custom_button(__("New Newsletter"), function() { - frappe.route_options = {"email_group": frm.doc.name}; - frappe.new_doc("Newsletter"); - }, __("Action")); + frm.add_custom_button( + __("Add Subscribers"), + function () { + frappe.prompt( + { + fieldtype: "Text", + label: __("Email Addresses"), + fieldname: "email_list", + reqd: 1, + }, + function (data) { + frappe.call({ + method: "frappe.email.doctype.email_group.email_group.add_subscribers", + args: { + name: frm.doc.name, + email_list: data.email_list, + }, + callback: function (r) { + frm.set_value("total_subscribers", r.message); + }, + }); + }, + __("Add Subscribers"), + __("Add") + ); + }, + __("Action") + ); + frm.add_custom_button( + __("New Newsletter"), + function () { + frappe.route_options = { email_group: frm.doc.name }; + frappe.new_doc("Newsletter"); + }, + __("Action") + ); } }); diff --git a/frappe/email/doctype/email_group_member/email_group_member.js b/frappe/email/doctype/email_group_member/email_group_member.js index 417eb70119..ca2c17ad81 100644 --- a/frappe/email/doctype/email_group_member/email_group_member.js +++ b/frappe/email/doctype/email_group_member/email_group_member.js @@ -1,8 +1,6 @@ // Copyright (c) 2016, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Email Group Member', { - refresh: function(frm) { - - } +frappe.ui.form.on("Email Group Member", { + refresh: function (frm) {}, }); diff --git a/frappe/email/doctype/email_queue/email_queue.js b/frappe/email/doctype/email_queue/email_queue.js index b6ef0ec082..2ac4b6f7fe 100644 --- a/frappe/email/doctype/email_queue/email_queue.js +++ b/frappe/email/doctype/email_queue/email_queue.js @@ -2,37 +2,37 @@ // For license information, please see license.txt frappe.ui.form.on("Email Queue", { - refresh: function(frm) { - if (["Not Sent","Partially Sent"].indexOf(frm.doc.status)!=-1) { - let button = frm.add_custom_button("Send Now", function() { + refresh: function (frm) { + if (["Not Sent", "Partially Sent"].indexOf(frm.doc.status) != -1) { + let button = frm.add_custom_button("Send Now", function () { frappe.call({ - method: 'frappe.email.doctype.email_queue.email_queue.send_now', + method: "frappe.email.doctype.email_queue.email_queue.send_now", args: { - name: frm.doc.name + name: frm.doc.name, }, btn: button, - callback: function() { + callback: function () { frm.reload_doc(); - } + }, }); }); } - if (["Error","Partially Errored"].indexOf(frm.doc.status)!=-1) { - let button = frm.add_custom_button("Retry Sending", function() { + if (["Error", "Partially Errored"].indexOf(frm.doc.status) != -1) { + let button = frm.add_custom_button("Retry Sending", function () { frm.call({ method: "retry_sending", args: { - name: frm.doc.name + name: frm.doc.name, }, btn: button, - callback: function(r) { + callback: function (r) { if (!r.exc) { frm.set_value("status", "Not Sent"); } - } - }) + }, + }); }); } - } + }, }); diff --git a/frappe/email/doctype/email_queue/email_queue_list.js b/frappe/email/doctype/email_queue/email_queue_list.js index ab2a1b9a45..b00503b6f8 100644 --- a/frappe/email/doctype/email_queue/email_queue_list.js +++ b/frappe/email/doctype/email_queue/email_queue_list.js @@ -1,39 +1,41 @@ -frappe.listview_settings['Email Queue'] = { - get_indicator: function(doc) { - var colour = {'Sent': 'green', 'Sending': 'blue', 'Not Sent': 'grey', 'Error': 'red', 'Expired': 'orange'}; +frappe.listview_settings["Email Queue"] = { + get_indicator: function (doc) { + var colour = { + Sent: "green", + Sending: "blue", + "Not Sent": "grey", + Error: "red", + Expired: "orange", + }; return [__(doc.status), colour[doc.status], "status,=," + doc.status]; }, refresh: show_toggle_sending_button, - onload: function(list_view) { + onload: function (list_view) { frappe.require("logtypes.bundle.js", () => { frappe.utils.logtypes.show_log_retention_message(list_view.doctype); - }) - } + }); + }, }; function show_toggle_sending_button(list_view) { - if (!has_common(frappe.user_roles, ["Administrator", "System Manager"])) - return; + if (!has_common(frappe.user_roles, ["Administrator", "System Manager"])) return; const sending_disabled = cint(frappe.sys_defaults.suspend_email_queue); const label = sending_disabled ? __("Resume Sending") : __("Suspend Sending"); - list_view.page.add_inner_button( - label, - async () => { - await frappe.xcall( - "frappe.email.doctype.email_queue.email_queue.toggle_sending", + list_view.page.add_inner_button(label, async () => { + await frappe.xcall( + "frappe.email.doctype.email_queue.email_queue.toggle_sending", - // enable if disabled - {enable: sending_disabled} - ); + // enable if disabled + { enable: sending_disabled } + ); - // set new value for suspend_email_queue in sys_defaults - frappe.sys_defaults.suspend_email_queue = sending_disabled ? 0 : 1; + // set new value for suspend_email_queue in sys_defaults + frappe.sys_defaults.suspend_email_queue = sending_disabled ? 0 : 1; - // clear the button and show one with the opposite label - list_view.page.remove_inner_button(label); - show_toggle_sending_button(list_view); - } - ); -} \ No newline at end of file + // clear the button and show one with the opposite label + list_view.page.remove_inner_button(label); + show_toggle_sending_button(list_view); + }); +} diff --git a/frappe/email/doctype/email_rule/email_rule.js b/frappe/email/doctype/email_rule/email_rule.js index 974bcd4e51..2670ef3e1c 100644 --- a/frappe/email/doctype/email_rule/email_rule.js +++ b/frappe/email/doctype/email_rule/email_rule.js @@ -1,8 +1,6 @@ // Copyright (c) 2017, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Email Rule', { - refresh: function(frm) { - - } +frappe.ui.form.on("Email Rule", { + refresh: function (frm) {}, }); diff --git a/frappe/email/doctype/email_template/email_template.js b/frappe/email/doctype/email_template/email_template.js index 62ce4d94ad..33327005a5 100644 --- a/frappe/email/doctype/email_template/email_template.js +++ b/frappe/email/doctype/email_template/email_template.js @@ -1,8 +1,6 @@ // Copyright (c) 2018, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Email Template', { - refresh: function() { - - } +frappe.ui.form.on("Email Template", { + refresh: function () {}, }); diff --git a/frappe/email/doctype/email_unsubscribe/email_unsubscribe.js b/frappe/email/doctype/email_unsubscribe/email_unsubscribe.js index 9a022cf4ca..5f1e28e9b9 100644 --- a/frappe/email/doctype/email_unsubscribe/email_unsubscribe.js +++ b/frappe/email/doctype/email_unsubscribe/email_unsubscribe.js @@ -1,8 +1,6 @@ // Copyright (c) 2016, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Email Unsubscribe', { - refresh: function(frm) { - - } +frappe.ui.form.on("Email Unsubscribe", { + refresh: function (frm) {}, }); diff --git a/frappe/email/doctype/newsletter/newsletter.js b/frappe/email/doctype/newsletter/newsletter.js index 3c52e61cbb..8a81bbaab3 100644 --- a/frappe/email/doctype/newsletter/newsletter.js +++ b/frappe/email/doctype/newsletter/newsletter.js @@ -1,113 +1,146 @@ // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors // License: GNU General Public License v3. See license.txt -frappe.ui.form.on('Newsletter', { +frappe.ui.form.on("Newsletter", { refresh(frm) { let doc = frm.doc; let can_write = in_list(frappe.boot.user.can_write, doc.doctype); if (!frm.is_new() && !frm.is_dirty() && !doc.email_sent && can_write) { - frm.add_custom_button(__('Send a test email'), () => { - frm.events.send_test_email(frm); - }, __('Preview')); + frm.add_custom_button( + __("Send a test email"), + () => { + frm.events.send_test_email(frm); + }, + __("Preview") + ); - frm.add_custom_button(__('Check broken links'), () => { - frm.dashboard.set_headline(__('Checking broken links...')); - frm.call('find_broken_links').then(r => { - frm.dashboard.set_headline(''); - let links = r.message; - if (links && links.length) { - let html = '
        ' + links.map(link => `
      • ${link}
      • `).join('') + '
      '; - frm.dashboard.set_headline(__("Following links are broken in the email content: {0}", [html])); - } else { - frm.dashboard.set_headline(__("No broken links found in the email content")); - setTimeout(() => { - frm.dashboard.set_headline(''); - }, 3000); - } - }); - }, __('Preview')); - - frm.add_custom_button(__('Send now'), () => { - if (frm.doc.schedule_send) { - frappe.confirm(__("This newsletter was scheduled to send on a later date. Are you sure you want to send it now?"), function () { - frm.events.send_emails(frm); + frm.add_custom_button( + __("Check broken links"), + () => { + frm.dashboard.set_headline(__("Checking broken links...")); + frm.call("find_broken_links").then((r) => { + frm.dashboard.set_headline(""); + let links = r.message; + if (links && links.length) { + let html = + "
        " + + links.map((link) => `
      • ${link}
      • `).join("") + + "
      "; + frm.dashboard.set_headline( + __("Following links are broken in the email content: {0}", [html]) + ); + } else { + frm.dashboard.set_headline( + __("No broken links found in the email content") + ); + setTimeout(() => { + frm.dashboard.set_headline(""); + }, 3000); + } }); - return; - } - frappe.confirm(__("Are you sure you want to send this newsletter now?"), () => { - frm.events.send_emails(frm); - }); - }, __('Send')); + }, + __("Preview") + ); - frm.add_custom_button(__('Schedule sending'), () => { - frm.events.schedule_send_dialog(frm); - }, __('Send')); + frm.add_custom_button( + __("Send now"), + () => { + if (frm.doc.schedule_send) { + frappe.confirm( + __( + "This newsletter was scheduled to send on a later date. Are you sure you want to send it now?" + ), + function () { + frm.events.send_emails(frm); + } + ); + return; + } + frappe.confirm( + __("Are you sure you want to send this newsletter now?"), + () => { + frm.events.send_emails(frm); + } + ); + }, + __("Send") + ); + + frm.add_custom_button( + __("Schedule sending"), + () => { + frm.events.schedule_send_dialog(frm); + }, + __("Send") + ); } frm.events.update_sending_status(frm); if (frm.is_new() && !doc.sender_email) { let { fullname, email } = frappe.user_info(doc.owner); - frm.set_value('sender_email', email); - frm.set_value('sender_name', fullname); + frm.set_value("sender_email", email); + frm.set_value("sender_name", fullname); } - frm.trigger('update_schedule_message'); + frm.trigger("update_schedule_message"); }, send_emails(frm) { frappe.dom.freeze(__("Queuing emails...")); - frm.call('send_emails').then(() => { + frm.call("send_emails").then(() => { frm.refresh(); frappe.dom.unfreeze(); - frappe.show_alert(__("Queued {0} emails", [frappe.utils.shorten_number(frm.doc.total_recipients)])); + frappe.show_alert( + __("Queued {0} emails", [frappe.utils.shorten_number(frm.doc.total_recipients)]) + ); }); }, schedule_send_dialog(frm) { let hours = frappe.utils.range(24); - let time_slots = hours.map(hour => { - return `${(hour + '').padStart(2, '0')}:00`; + let time_slots = hours.map((hour) => { + return `${(hour + "").padStart(2, "0")}:00`; }); let d = new frappe.ui.Dialog({ - title: __('Schedule Newsletter'), + title: __("Schedule Newsletter"), fields: [ { - label: __('Date'), - fieldname: 'date', - fieldtype: 'Date', + label: __("Date"), + fieldname: "date", + fieldtype: "Date", options: { - minDate: new Date() - } + minDate: new Date(), + }, }, { - label: __('Time'), - fieldname: 'time', - fieldtype: 'Select', + label: __("Time"), + fieldname: "time", + fieldtype: "Select", options: time_slots, }, ], - primary_action_label: __('Schedule'), + primary_action_label: __("Schedule"), primary_action({ date, time }) { - frm.set_value('schedule_sending', 1); - frm.set_value('schedule_send', `${date} ${time}:00`); + frm.set_value("schedule_sending", 1); + frm.set_value("schedule_send", `${date} ${time}:00`); d.hide(); frm.save(); }, - secondary_action_label: __('Cancel Scheduling'), + secondary_action_label: __("Cancel Scheduling"), secondary_action() { - frm.set_value('schedule_sending', 0); - frm.set_value('schedule_send', ''); + frm.set_value("schedule_sending", 0); + frm.set_value("schedule_send", ""); d.hide(); frm.save(); - } + }, }); if (frm.doc.schedule_sending) { - let parts = frm.doc.schedule_send.split(' '); + let parts = frm.doc.schedule_send.split(" "); if (parts.length === 2) { let [date, time] = parts; - d.set_value('date', date); - d.set_value('time', time.slice(0, 5)); + d.set_value("date", date); + d.set_value("time", time.slice(0, 5)); } } d.show(); @@ -115,35 +148,37 @@ frappe.ui.form.on('Newsletter', { send_test_email(frm) { let d = new frappe.ui.Dialog({ - title: __('Send Test Email'), + title: __("Send Test Email"), fields: [ { - label: __('Email'), - fieldname: 'email', - fieldtype: 'Data', - options: 'Email', - } + label: __("Email"), + fieldname: "email", + fieldtype: "Data", + options: "Email", + }, ], - primary_action_label: __('Send'), + primary_action_label: __("Send"), primary_action({ email }) { - d.get_primary_btn().text(__('Sending...')).prop('disabled', true); - frm.call('send_test_email', { email }) - .then(() => { - d.get_primary_btn().text(__('Send again')).prop('disabled', false); - }); - } + d.get_primary_btn().text(__("Sending...")).prop("disabled", true); + frm.call("send_test_email", { email }).then(() => { + d.get_primary_btn().text(__("Send again")).prop("disabled", false); + }); + }, }); d.show(); }, async update_sending_status(frm) { - if (frm.doc.email_sent && frm.$wrapper.is(':visible') && !frm.waiting_for_request) { + if (frm.doc.email_sent && frm.$wrapper.is(":visible") && !frm.waiting_for_request) { frm.waiting_for_request = true; - let res = await frm.call('get_sending_status'); + let res = await frm.call("get_sending_status"); frm.waiting_for_request = false; let stats = res.message; stats && frm.events.update_sending_progress(frm, stats); - if (stats.sent + stats.error >= frm.doc.total_recipients || (!stats.total && !stats.emails_queued)) { + if ( + stats.sent + stats.error >= frm.doc.total_recipients || + (!stats.total && !stats.emails_queued) + ) { frm.sending_status && clearInterval(frm.sending_status); frm.sending_status = null; return; @@ -162,7 +197,11 @@ frappe.ui.form.on('Newsletter', { } if (stats.total) { frm.page.set_indicator(__("Sending"), "blue"); - frm.dashboard.show_progress(__('Sending emails'), stats.sent * 100 / frm.doc.total_recipients, __("{0} of {1} sent", [stats.sent, frm.doc.total_recipients])); + frm.dashboard.show_progress( + __("Sending emails"), + (stats.sent * 100) / frm.doc.total_recipients, + __("{0} of {1} sent", [stats.sent, frm.doc.total_recipients]) + ); } else if (stats.emails_queued) { frm.page.set_indicator(__("Queued"), "blue"); } @@ -178,9 +217,11 @@ frappe.ui.form.on('Newsletter', { update_schedule_message(frm) { if (!frm.doc.email_sent && frm.doc.schedule_send) { let datetime = frappe.datetime.global_date_format(frm.doc.schedule_send); - frm.dashboard.set_headline_alert(__('This newsletter is scheduled to be sent on {0}', [datetime.bold()])); + frm.dashboard.set_headline_alert( + __("This newsletter is scheduled to be sent on {0}", [datetime.bold()]) + ); } else { frm.dashboard.clear_headline(); } - } + }, }); diff --git a/frappe/email/doctype/newsletter/newsletter_list.js b/frappe/email/doctype/newsletter/newsletter_list.js index 0b82f1c9e4..0921de02b4 100644 --- a/frappe/email/doctype/newsletter/newsletter_list.js +++ b/frappe/email/doctype/newsletter/newsletter_list.js @@ -1,6 +1,6 @@ -frappe.listview_settings['Newsletter'] = { +frappe.listview_settings["Newsletter"] = { add_fields: ["subject", "email_sent", "schedule_sending"], - get_indicator: function(doc) { + get_indicator: function (doc) { if (doc.email_sent) { return [__("Sent"), "green", "email_sent,=,Yes"]; } else if (doc.schedule_sending) { @@ -8,5 +8,5 @@ frappe.listview_settings['Newsletter'] = { } else { return [__("Not Sent"), "gray", "email_sent,=,No"]; } - } + }, }; diff --git a/frappe/email/doctype/notification/notification.js b/frappe/email/doctype/notification/notification.js index f14447707f..4e3b1eae53 100644 --- a/frappe/email/doctype/notification/notification.js +++ b/frappe/email/doctype/notification/notification.js @@ -1,100 +1,98 @@ // Copyright (c) 2018, Frappe Technologies and contributors // For license information, please see license.txt -this.frm.add_fetch('sender', 'email_id', 'sender_email'); +this.frm.add_fetch("sender", "email_id", "sender_email"); -this.frm.fields_dict.sender.get_query = function() { +this.frm.fields_dict.sender.get_query = function () { return { filters: { - enable_outgoing: 1 - } + enable_outgoing: 1, + }, }; }; frappe.notification = { - setup_fieldname_select: function(frm) { + setup_fieldname_select: function (frm) { // get the doctype to update fields if (!frm.doc.document_type) { return; } - frappe.model.with_doctype(frm.doc.document_type, function() { - let get_select_options = function(df, parent_field) { + frappe.model.with_doctype(frm.doc.document_type, function () { + let get_select_options = function (df, parent_field) { // Append parent_field name along with fieldname for child table fields - let select_value = parent_field ? df.fieldname + ',' + parent_field : df.fieldname; + let select_value = parent_field ? df.fieldname + "," + parent_field : df.fieldname; return { value: select_value, - label: df.fieldname + ' (' + __(df.label) + ')' + label: df.fieldname + " (" + __(df.label) + ")", }; }; - let get_date_change_options = function() { - let date_options = $.map(fields, function(d) { - return d.fieldtype == 'Date' || d.fieldtype == 'Datetime' + let get_date_change_options = function () { + let date_options = $.map(fields, function (d) { + return d.fieldtype == "Date" || d.fieldtype == "Datetime" ? get_select_options(d) : null; }); // append creation and modified date to Date Change field return date_options.concat([ - { value: 'creation', label: `creation (${__('Created On')})` }, - { value: 'modified', label: `modified (${__('Last Modified Date')})` } + { value: "creation", label: `creation (${__("Created On")})` }, + { value: "modified", label: `modified (${__("Last Modified Date")})` }, ]); }; - let fields = frappe.get_doc('DocType', frm.doc.document_type).fields; - let options = $.map(fields, function(d) { + let fields = frappe.get_doc("DocType", frm.doc.document_type).fields; + let options = $.map(fields, function (d) { return in_list(frappe.model.no_value_type, d.fieldtype) - ? null : get_select_options(d); + ? null + : get_select_options(d); }); // set value changed options - frm.set_df_property('value_changed', 'options', [''].concat(options)); - frm.set_df_property( - 'set_property_after_alert', - 'options', - [''].concat(options) - ); + frm.set_df_property("value_changed", "options", [""].concat(options)); + frm.set_df_property("set_property_after_alert", "options", [""].concat(options)); // set date changed options - frm.set_df_property('date_changed', 'options', get_date_change_options()); + frm.set_df_property("date_changed", "options", get_date_change_options()); let receiver_fields = []; - if (frm.doc.channel === 'Email') { - receiver_fields = $.map(fields, function(d) { - + if (frm.doc.channel === "Email") { + receiver_fields = $.map(fields, function (d) { // Add User and Email fields from child into select dropdown - if (d.fieldtype == 'Table') { - let child_fields = frappe.get_doc('DocType', d.options).fields; - return $.map(child_fields, function(df) { - return df.options == 'Email' || - (df.options == 'User' && df.fieldtype == 'Link') - ? get_select_options(df, d.fieldname) : null; + if (d.fieldtype == "Table") { + let child_fields = frappe.get_doc("DocType", d.options).fields; + return $.map(child_fields, function (df) { + return df.options == "Email" || + (df.options == "User" && df.fieldtype == "Link") + ? get_select_options(df, d.fieldname) + : null; }); - // Add User and Email fields from parent into select dropdown + // Add User and Email fields from parent into select dropdown } else { - return d.options == 'Email' || - (d.options == 'User' && d.fieldtype == 'Link') - ? get_select_options(d) : null; + return d.options == "Email" || + (d.options == "User" && d.fieldtype == "Link") + ? get_select_options(d) + : null; } }); - } else if (in_list(['WhatsApp', 'SMS'], frm.doc.channel)) { - receiver_fields = $.map(fields, function(d) { - return d.options == 'Phone' ? get_select_options(d) : null; + } else if (in_list(["WhatsApp", "SMS"], frm.doc.channel)) { + receiver_fields = $.map(fields, function (d) { + return d.options == "Phone" ? get_select_options(d) : null; }); } // set email recipient options frm.fields_dict.recipients.grid.update_docfield_property( - 'receiver_by_document_field', - 'options', - [''].concat(["owner"]).concat(receiver_fields) + "receiver_by_document_field", + "options", + [""].concat(["owner"]).concat(receiver_fields) ); }); }, - setup_example_message: function(frm) { - let template = ''; - if (frm.doc.channel === 'Email') { + setup_example_message: function (frm) { + let template = ""; + if (frm.doc.channel === "Email") { template = `
      Message Example
      <h3>Order Overdue</h3>
      @@ -114,7 +112,7 @@ Last comment: {{ comments[-1].comment }} by {{ comments[-1].by }}
       </ul>
       
      `; - } else if (in_list(['Slack', 'System Notification', 'SMS'], frm.doc.channel)) { + } else if (in_list(["Slack", "System Notification", "SMS"], frm.doc.channel)) { template = `
      Message Example
      *Order Overdue*
      @@ -133,71 +131,72 @@ Last comment: {{ comments[-1].comment }} by {{ comments[-1].by }}
       
      `; } if (template) { - frm.set_df_property('message_examples', 'options', template); + frm.set_df_property("message_examples", "options", template); } - - } + }, }; -frappe.ui.form.on('Notification', { - onload: function(frm) { - frm.set_query('document_type', function() { +frappe.ui.form.on("Notification", { + onload: function (frm) { + frm.set_query("document_type", function () { return { filters: { - istable: 0 - } + istable: 0, + }, }; }); - frm.set_query('print_format', function() { + frm.set_query("print_format", function () { return { filters: { - doc_type: frm.doc.document_type - } + doc_type: frm.doc.document_type, + }, }; }); }, - refresh: function(frm) { + refresh: function (frm) { frappe.notification.setup_fieldname_select(frm); frappe.notification.setup_example_message(frm); - frm.get_field('is_standard').toggle(frappe.boot.developer_mode); - frm.trigger('event'); + frm.get_field("is_standard").toggle(frappe.boot.developer_mode); + frm.trigger("event"); }, - document_type: function(frm) { + document_type: function (frm) { frappe.notification.setup_fieldname_select(frm); }, - view_properties: function(frm) { + view_properties: function (frm) { frappe.route_options = { doc_type: frm.doc.document_type }; - frappe.set_route('Form', 'Customize Form'); + frappe.set_route("Form", "Customize Form"); }, - event: function(frm) { - if (in_list(['Days Before', 'Days After'], frm.doc.event)) { - frm.add_custom_button(__('Get Alerts for Today'), function() { + event: function (frm) { + if (in_list(["Days Before", "Days After"], frm.doc.event)) { + frm.add_custom_button(__("Get Alerts for Today"), function () { frappe.call({ - method: - 'frappe.email.doctype.notification.notification.get_documents_for_today', + method: "frappe.email.doctype.notification.notification.get_documents_for_today", args: { - notification: frm.doc.name + notification: frm.doc.name, }, - callback: function(r) { + callback: function (r) { if (r.message) { frappe.msgprint(r.message); } else { - frappe.msgprint(__('No alerts for today')); + frappe.msgprint(__("No alerts for today")); } - } + }, }); }); } }, - channel: function(frm) { - frm.toggle_reqd('recipients', frm.doc.channel == 'Email'); + channel: function (frm) { + frm.toggle_reqd("recipients", frm.doc.channel == "Email"); frappe.notification.setup_fieldname_select(frm); frappe.notification.setup_example_message(frm); - if (frm.doc.channel === 'SMS' && frm.doc.__islocal) { - frm.set_df_property('channel', - 'description', `To use SMS Channel, initialize SMS Settings.`); + if (frm.doc.channel === "SMS" && frm.doc.__islocal) { + frm.set_df_property( + "channel", + "description", + `To use SMS Channel, initialize SMS Settings.` + ); } else { - frm.set_df_property('channel', 'description', ` `); + frm.set_df_property("channel", "description", ` `); } - } + }, }); diff --git a/frappe/event_streaming/doctype/document_type_mapping/document_type_mapping.js b/frappe/event_streaming/doctype/document_type_mapping/document_type_mapping.js index 22b7f2ef4c..ad9ab0f51d 100644 --- a/frappe/event_streaming/doctype/document_type_mapping/document_type_mapping.js +++ b/frappe/event_streaming/doctype/document_type_mapping/document_type_mapping.js @@ -1,28 +1,37 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Document Type Mapping', { - local_doctype: function(frm) { +frappe.ui.form.on("Document Type Mapping", { + local_doctype: function (frm) { if (frm.doc.local_doctype) { - frappe.model.clear_table(frm.doc, 'field_mapping'); + frappe.model.clear_table(frm.doc, "field_mapping"); let fields = frm.events.get_fields(frm); - $.each(fields, function(i, data) { - let row = frappe.model.add_child(frm.doc, 'Document Type Field Mapping', 'field_mapping'); + $.each(fields, function (i, data) { + let row = frappe.model.add_child( + frm.doc, + "Document Type Field Mapping", + "field_mapping" + ); row.local_fieldname = data; }); - refresh_field('field_mapping'); + refresh_field("field_mapping"); } }, - get_fields: function(frm) { + get_fields: function (frm) { let filtered_fields = []; - frappe.model.with_doctype(frm.doc.local_doctype, ()=> { - frappe.get_meta(frm.doc.local_doctype).fields.map( field => { - if (field.fieldname !== 'remote_docname' && field.fieldname !== 'remote_site_name' && frappe.model.is_value_type(field) && !field.hidden) { + frappe.model.with_doctype(frm.doc.local_doctype, () => { + frappe.get_meta(frm.doc.local_doctype).fields.map((field) => { + if ( + field.fieldname !== "remote_docname" && + field.fieldname !== "remote_site_name" && + frappe.model.is_value_type(field) && + !field.hidden + ) { filtered_fields.push(field.fieldname); } }); }); return filtered_fields; - } + }, }); diff --git a/frappe/event_streaming/doctype/event_consumer/event_consumer.js b/frappe/event_streaming/doctype/event_consumer/event_consumer.js index 66d92699fa..2bcf96f9f3 100644 --- a/frappe/event_streaming/doctype/event_consumer/event_consumer.js +++ b/frappe/event_streaming/doctype/event_consumer/event_consumer.js @@ -1,19 +1,17 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Event Consumer', { - refresh: function(frm) { +frappe.ui.form.on("Event Consumer", { + refresh: function (frm) { // formatter for subscribed doctype approval status - frm.set_indicator_formatter('status', - function(doc) { - let indicator = 'orange'; - if (doc.status == 'Approved') { - indicator = 'green'; - } else if (doc.status == 'Rejected') { - indicator = 'red'; - } - return indicator; + frm.set_indicator_formatter("status", function (doc) { + let indicator = "orange"; + if (doc.status == "Approved") { + indicator = "green"; + } else if (doc.status == "Rejected") { + indicator = "red"; } - ); - } + return indicator; + }); + }, }); diff --git a/frappe/event_streaming/doctype/event_producer/event_producer.js b/frappe/event_streaming/doctype/event_producer/event_producer.js index c2c3389e92..23ca482433 100644 --- a/frappe/event_streaming/doctype/event_producer/event_producer.js +++ b/frappe/event_streaming/doctype/event_producer/event_producer.js @@ -1,27 +1,25 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Event Producer', { - refresh: function(frm) { - frm.set_query('ref_doctype', 'producer_doctypes', function() { +frappe.ui.form.on("Event Producer", { + refresh: function (frm) { + frm.set_query("ref_doctype", "producer_doctypes", function () { return { filters: { issingle: 0, - istable: 0 - } + istable: 0, + }, }; }); - frm.set_indicator_formatter('status', - function(doc) { - let indicator = 'orange'; - if (doc.status == 'Approved') { - indicator = 'green'; - } else if (doc.status == 'Rejected') { - indicator = 'red'; - } - return indicator; + frm.set_indicator_formatter("status", function (doc) { + let indicator = "orange"; + if (doc.status == "Approved") { + indicator = "green"; + } else if (doc.status == "Rejected") { + indicator = "red"; } - ); - } + return indicator; + }); + }, }); diff --git a/frappe/event_streaming/doctype/event_producer_last_update/event_producer_last_update.js b/frappe/event_streaming/doctype/event_producer_last_update/event_producer_last_update.js index 15730e4c5f..6d18be43e3 100644 --- a/frappe/event_streaming/doctype/event_producer_last_update/event_producer_last_update.js +++ b/frappe/event_streaming/doctype/event_producer_last_update/event_producer_last_update.js @@ -1,8 +1,7 @@ // Copyright (c) 2020, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Event Producer Last Update', { +frappe.ui.form.on("Event Producer Last Update", { // refresh: function(frm) { - // } }); diff --git a/frappe/event_streaming/doctype/event_sync_log/event_sync_log.js b/frappe/event_streaming/doctype/event_sync_log/event_sync_log.js index 5199e3f02d..7cc3198bae 100644 --- a/frappe/event_streaming/doctype/event_sync_log/event_sync_log.js +++ b/frappe/event_streaming/doctype/event_sync_log/event_sync_log.js @@ -1,24 +1,24 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Event Sync Log', { - refresh: function(frm) { - if (frm.doc.status == 'Failed') { - frm.add_custom_button(__('Resync'), function() { +frappe.ui.form.on("Event Sync Log", { + refresh: function (frm) { + if (frm.doc.status == "Failed") { + frm.add_custom_button(__("Resync"), function () { frappe.call({ method: "frappe.event_streaming.doctype.event_producer.event_producer.resync", args: { update: frm.doc, }, - callback: function(r) { + callback: function (r) { if (r.message) { frappe.msgprint(r.message); - frm.set_value('status', r.message); + frm.set_value("status", r.message); frm.save(); } - } + }, }); }); } - } + }, }); diff --git a/frappe/event_streaming/doctype/event_sync_log/event_sync_log_list.js b/frappe/event_streaming/doctype/event_sync_log/event_sync_log_list.js index 75d67003c4..97d2ee0a1d 100644 --- a/frappe/event_streaming/doctype/event_sync_log/event_sync_log_list.js +++ b/frappe/event_streaming/doctype/event_sync_log/event_sync_log_list.js @@ -1,9 +1,9 @@ -frappe.listview_settings['Event Sync Log'] = { - get_indicator: function(doc) { +frappe.listview_settings["Event Sync Log"] = { + get_indicator: function (doc) { var colors = { - "Failed": "red", - "Synced": "green" + Failed: "red", + Synced: "green", }; return [__(doc.status), colors[doc.status], "status,=," + doc.status]; - } + }, }; diff --git a/frappe/event_streaming/doctype/event_update_log/event_update_log.js b/frappe/event_streaming/doctype/event_update_log/event_update_log.js index c5e8ed5915..d901799780 100644 --- a/frappe/event_streaming/doctype/event_update_log/event_update_log.js +++ b/frappe/event_streaming/doctype/event_update_log/event_update_log.js @@ -1,8 +1,7 @@ // Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors // For license information, please see license.txt -frappe.ui.form.on('Event Update Log', { +frappe.ui.form.on("Event Update Log", { // refresh: function(frm) { - // } }); diff --git a/frappe/geo/doctype/country/country.js b/frappe/geo/doctype/country/country.js index 62159a1fe7..75bb3f46d5 100644 --- a/frappe/geo/doctype/country/country.js +++ b/frappe/geo/doctype/country/country.js @@ -1,8 +1,6 @@ // Copyright (c) 2016, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Country', { - refresh: function(frm) { - - } +frappe.ui.form.on("Country", { + refresh: function (frm) {}, }); diff --git a/frappe/geo/doctype/currency/currency.js b/frappe/geo/doctype/currency/currency.js index af2d6ebc4e..08915893a5 100644 --- a/frappe/geo/doctype/currency/currency.js +++ b/frappe/geo/doctype/currency/currency.js @@ -1,11 +1,11 @@ // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors // License: See license.txt -frappe.ui.form.on('Currency', { +frappe.ui.form.on("Currency", { refresh(frm) { frm.set_intro(""); - if(!frm.doc.enabled) { + if (!frm.doc.enabled) { frm.set_intro(__("This Currency is disabled. Enable to use in transactions")); } - } + }, }); diff --git a/frappe/integrations/doctype/connected_app/connected_app.js b/frappe/integrations/doctype/connected_app/connected_app.js index 4d20f65559..11dcda235e 100644 --- a/frappe/integrations/doctype/connected_app/connected_app.js +++ b/frappe/integrations/doctype/connected_app/connected_app.js @@ -1,38 +1,38 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Connected App', { - refresh: frm => { - frm.add_custom_button(__('Get OpenID Configuration'), async () => { +frappe.ui.form.on("Connected App", { + refresh: (frm) => { + frm.add_custom_button(__("Get OpenID Configuration"), async () => { if (!frm.doc.openid_configuration) { - frappe.msgprint(__('Please enter OpenID Configuration URL')); + frappe.msgprint(__("Please enter OpenID Configuration URL")); } else { try { const response = await fetch(frm.doc.openid_configuration); const oidc = await response.json(); - frm.set_value('authorization_uri', oidc.authorization_endpoint); - frm.set_value('token_uri', oidc.token_endpoint); - frm.set_value('userinfo_uri', oidc.userinfo_endpoint); - frm.set_value('introspection_uri', oidc.introspection_endpoint); - frm.set_value('revocation_uri', oidc.revocation_endpoint); + frm.set_value("authorization_uri", oidc.authorization_endpoint); + frm.set_value("token_uri", oidc.token_endpoint); + frm.set_value("userinfo_uri", oidc.userinfo_endpoint); + frm.set_value("introspection_uri", oidc.introspection_endpoint); + frm.set_value("revocation_uri", oidc.revocation_endpoint); } catch (error) { - frappe.msgprint(__('Please check OpenID Configuration URL')); + frappe.msgprint(__("Please check OpenID Configuration URL")); } } }); if (!frm.is_new()) { - frm.add_custom_button(__('Connect to {}', [frm.doc.provider_name]), async () => { + frm.add_custom_button(__("Connect to {}", [frm.doc.provider_name]), async () => { frappe.call({ - method: 'initiate_web_application_flow', + method: "initiate_web_application_flow", doc: frm.doc, - callback: function(r) { - window.open(r.message, '_blank'); - } + callback: function (r) { + window.open(r.message, "_blank"); + }, }); }); } - frm.toggle_display('sb_client_credentials_section', !frm.is_new()); - } + frm.toggle_display("sb_client_credentials_section", !frm.is_new()); + }, }); diff --git a/frappe/integrations/doctype/dropbox_settings/dropbox_settings.js b/frappe/integrations/doctype/dropbox_settings/dropbox_settings.js index ea731fafc2..9a5e9a4dc7 100644 --- a/frappe/integrations/doctype/dropbox_settings/dropbox_settings.js +++ b/frappe/integrations/doctype/dropbox_settings/dropbox_settings.js @@ -1,51 +1,54 @@ // Copyright (c) 2016, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Dropbox Settings', { - refresh: function(frm) { - frm.toggle_display(["app_access_key", "app_secret_key"], !(frm.doc.__onload && frm.doc.__onload.dropbox_setup_via_site_config)); +frappe.ui.form.on("Dropbox Settings", { + refresh: function (frm) { + frm.toggle_display( + ["app_access_key", "app_secret_key"], + !(frm.doc.__onload && frm.doc.__onload.dropbox_setup_via_site_config) + ); frm.clear_custom_buttons(); frm.events.take_backup(frm); }, - allow_dropbox_access: function(frm) { + allow_dropbox_access: function (frm) { if (frm.doc.app_access_key && frm.doc.app_secret_key) { frappe.call({ method: "frappe.integrations.doctype.dropbox_settings.dropbox_settings.get_dropbox_authorize_url", freeze: true, - callback: function(r) { - if(!r.exc) { + callback: function (r) { + if (!r.exc) { window.open(r.message.auth_url); } - } - }) - } - else if (frm.doc.__onload && frm.doc.__onload.dropbox_setup_via_site_config) { + }, + }); + } else if (frm.doc.__onload && frm.doc.__onload.dropbox_setup_via_site_config) { frappe.call({ method: "frappe.integrations.doctype.dropbox_settings.dropbox_settings.get_redirect_url", freeze: true, - callback: function(r) { - if(!r.exc) { + callback: function (r) { + if (!r.exc) { window.open(r.message.auth_url); } - } - }) - } - else { - frappe.msgprint(__("Please enter values for App Access Key and App Secret Key")) + }, + }); + } else { + frappe.msgprint(__("Please enter values for App Access Key and App Secret Key")); } }, - take_backup: function(frm) { - if (frm.doc.enabled && ((frm.doc.app_access_key && frm.doc.app_secret_key) - || (frm.doc.__onload && frm.doc.__onload.dropbox_setup_via_site_config))) { - frm.add_custom_button(__("Take Backup Now"), function(frm){ + take_backup: function (frm) { + if ( + frm.doc.enabled && + ((frm.doc.app_access_key && frm.doc.app_secret_key) || + (frm.doc.__onload && frm.doc.__onload.dropbox_setup_via_site_config)) + ) { + frm.add_custom_button(__("Take Backup Now"), function (frm) { frappe.call({ method: "frappe.integrations.doctype.dropbox_settings.dropbox_settings.take_backup", - freeze: true - }) - }).addClass("btn-primary") + freeze: true, + }); + }).addClass("btn-primary"); } - } + }, }); - diff --git a/frappe/integrations/doctype/google_calendar/google_calendar.js b/frappe/integrations/doctype/google_calendar/google_calendar.js index f30c52b2f2..977dee8dfe 100644 --- a/frappe/integrations/doctype/google_calendar/google_calendar.js +++ b/frappe/integrations/doctype/google_calendar/google_calendar.js @@ -2,15 +2,22 @@ // For license information, please see license.txt frappe.ui.form.on("Google Calendar", { - refresh: function(frm) { + refresh: function (frm) { if (frm.is_new()) { - frm.dashboard.set_headline(__("To use Google Calendar, enable {0}.", [`${__('Google Settings')}`])); + frm.dashboard.set_headline( + __("To use Google Calendar, enable {0}.", [ + `${__("Google Settings")}`, + ]) + ); } frappe.realtime.on("import_google_calendar", (data) => { if (data.progress) { - frm.dashboard.show_progress("Syncing Google Calendar", data.progress / data.total * 100, - __("Syncing {0} of {1}", [data.progress, data.total])); + frm.dashboard.show_progress( + "Syncing Google Calendar", + (data.progress / data.total) * 100, + __("Syncing {0} of {1}", [data.progress, data.total]) + ); if (data.progress === data.total) { frm.dashboard.hide_progress("Syncing Google Calendar"); } @@ -21,38 +28,40 @@ frappe.ui.form.on("Google Calendar", { frm.add_custom_button(__("Sync Calendar"), function () { frappe.show_alert({ indicator: "green", - message: __("Syncing") - }); - frappe.call({ - method: "frappe.integrations.doctype.google_calendar.google_calendar.sync", - args: { - "g_calendar": frm.doc.name - }, - }).then((r) => { - frappe.hide_progress(); - frappe.msgprint(r.message); + message: __("Syncing"), }); + frappe + .call({ + method: "frappe.integrations.doctype.google_calendar.google_calendar.sync", + args: { + g_calendar: frm.doc.name, + }, + }) + .then((r) => { + frappe.hide_progress(); + frappe.msgprint(r.message); + }); }); } }, - authorize_google_calendar_access: function(frm) { + authorize_google_calendar_access: function (frm) { let reauthorize = 0; - if(frm.doc.authorization_code) { + if (frm.doc.authorization_code) { reauthorize = 1; } frappe.call({ method: "frappe.integrations.doctype.google_calendar.google_calendar.authorize_access", args: { - "g_calendar": frm.doc.name, - "reauthorize": reauthorize + g_calendar: frm.doc.name, + reauthorize: reauthorize, }, - callback: function(r) { - if(!r.exc) { + callback: function (r) { + if (!r.exc) { frm.save(); window.open(r.message.url); } - } + }, }); - } + }, }); diff --git a/frappe/integrations/doctype/google_contacts/google_contacts.js b/frappe/integrations/doctype/google_contacts/google_contacts.js index 6e8035f38d..06289b0ca5 100644 --- a/frappe/integrations/doctype/google_contacts/google_contacts.js +++ b/frappe/integrations/doctype/google_contacts/google_contacts.js @@ -1,54 +1,63 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Google Contacts', { - refresh: function(frm) { +frappe.ui.form.on("Google Contacts", { + refresh: function (frm) { if (!frm.doc.enable) { - frm.dashboard.set_headline(__("To use Google Contacts, enable {0}.", [`${__('Google Settings')}`])); + frm.dashboard.set_headline( + __("To use Google Contacts, enable {0}.", [ + `${__("Google Settings")}`, + ]) + ); } - frappe.realtime.on('import_google_contacts', (data) => { + frappe.realtime.on("import_google_contacts", (data) => { if (data.progress) { - frm.dashboard.show_progress('Import Google Contacts', data.progress / data.total * 100, - __('Importing {0} of {1}', [data.progress, data.total])); + frm.dashboard.show_progress( + "Import Google Contacts", + (data.progress / data.total) * 100, + __("Importing {0} of {1}", [data.progress, data.total]) + ); if (data.progress === data.total) { - frm.dashboard.hide_progress('Import Google Contacts'); + frm.dashboard.hide_progress("Import Google Contacts"); } } }); if (frm.doc.refresh_token) { - let sync_button = frm.add_custom_button(__('Sync Contacts'), function () { + let sync_button = frm.add_custom_button(__("Sync Contacts"), function () { frappe.show_alert({ - indicator: 'green', - message: __('Syncing') - }); - frappe.call({ - method: "frappe.integrations.doctype.google_contacts.google_contacts.sync", - args: { - "g_contact": frm.doc.name - }, - btn: sync_button - }).then((r) => { - frappe.hide_progress(); - frappe.msgprint(r.message); + indicator: "green", + message: __("Syncing"), }); + frappe + .call({ + method: "frappe.integrations.doctype.google_contacts.google_contacts.sync", + args: { + g_contact: frm.doc.name, + }, + btn: sync_button, + }) + .then((r) => { + frappe.hide_progress(); + frappe.msgprint(r.message); + }); }); } }, - authorize_google_contacts_access: function(frm) { + authorize_google_contacts_access: function (frm) { frappe.call({ method: "frappe.integrations.doctype.google_contacts.google_contacts.authorize_access", args: { - "g_contact": frm.doc.name, - "reauthorize": frm.doc.authorization_code ? 1 : 0 + g_contact: frm.doc.name, + reauthorize: frm.doc.authorization_code ? 1 : 0, }, - callback: function(r) { - if(!r.exc) { + callback: function (r) { + if (!r.exc) { frm.save(); window.open(r.message.url); } - } + }, }); - } + }, }); diff --git a/frappe/integrations/doctype/google_drive/google_drive.js b/frappe/integrations/doctype/google_drive/google_drive.js index b38c0fb8e6..208c1e5e1a 100644 --- a/frappe/integrations/doctype/google_drive/google_drive.js +++ b/frappe/integrations/doctype/google_drive/google_drive.js @@ -1,16 +1,23 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Google Drive', { - refresh: function(frm) { +frappe.ui.form.on("Google Drive", { + refresh: function (frm) { if (!frm.doc.enable) { - frm.dashboard.set_headline(__("To use Google Drive, enable {0}.", [`${__('Google Settings')}`])); + frm.dashboard.set_headline( + __("To use Google Drive, enable {0}.", [ + `${__("Google Settings")}`, + ]) + ); } frappe.realtime.on("upload_to_google_drive", (data) => { if (data.progress) { - frm.dashboard.show_progress("Uploading to Google Drive", data.progress / data.total * 100, - __("{0}", [data.message])); + frm.dashboard.show_progress( + "Uploading to Google Drive", + (data.progress / data.total) * 100, + __("{0}", [data.message]) + ); if (data.progress === data.total) { frm.dashboard.hide_progress("Uploading to Google Drive"); } @@ -21,37 +28,43 @@ frappe.ui.form.on('Google Drive', { let sync_button = frm.add_custom_button(__("Take Backup"), function () { frappe.show_alert({ indicator: "green", - message: __("Backing up to Google Drive.") - }); - frappe.call({ - method: "frappe.integrations.doctype.google_drive.google_drive.take_backup", - btn: sync_button - }).then((r) => { - frappe.msgprint(r.message); + message: __("Backing up to Google Drive."), }); + frappe + .call({ + method: "frappe.integrations.doctype.google_drive.google_drive.take_backup", + btn: sync_button, + }) + .then((r) => { + frappe.msgprint(r.message); + }); }); } if (frm.doc.enable && frm.doc.backup_folder_name && !frm.doc.refresh_token) { - frm.dashboard.set_headline(__("Click on Authorize Google Drive Access to authorize Google Drive Access.")); + frm.dashboard.set_headline( + __( + "Click on Authorize Google Drive Access to authorize Google Drive Access." + ) + ); } if (frm.doc.enable && frm.doc.refresh_token && frm.doc.authorization_code) { frm.page.set_indicator("Authorized", "green"); } }, - authorize_google_drive_access: function(frm) { + authorize_google_drive_access: function (frm) { frappe.call({ method: "frappe.integrations.doctype.google_drive.google_drive.authorize_access", args: { - "reauthorize": frm.doc.authorization_code ? 1 : 0 + reauthorize: frm.doc.authorization_code ? 1 : 0, }, - callback: function(r) { + callback: function (r) { if (!r.exc) { frm.save(); window.open(r.message.url); } - } + }, }); - } + }, }); diff --git a/frappe/integrations/doctype/google_settings/google_settings.js b/frappe/integrations/doctype/google_settings/google_settings.js index 01a127db7f..58093034b5 100644 --- a/frappe/integrations/doctype/google_settings/google_settings.js +++ b/frappe/integrations/doctype/google_settings/google_settings.js @@ -1,8 +1,14 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Google Settings', { - refresh: function(frm) { - frm.dashboard.set_headline(__("For more information, {0}.", [`${__('Click here')}`])); - } +frappe.ui.form.on("Google Settings", { + refresh: function (frm) { + frm.dashboard.set_headline( + __("For more information, {0}.", [ + `${__( + "Click here" + )}`, + ]) + ); + }, }); diff --git a/frappe/integrations/doctype/integration_request/integration_request.js b/frappe/integrations/doctype/integration_request/integration_request.js index 4b3b9a2de7..ac810f4d73 100644 --- a/frappe/integrations/doctype/integration_request/integration_request.js +++ b/frappe/integrations/doctype/integration_request/integration_request.js @@ -1,8 +1,6 @@ // Copyright (c) 2016, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Integration Request', { - refresh: function(frm) { - - } +frappe.ui.form.on("Integration Request", { + refresh: function (frm) {}, }); diff --git a/frappe/integrations/doctype/ldap_settings/ldap_settings.js b/frappe/integrations/doctype/ldap_settings/ldap_settings.js index 9ac95883b7..2ca7370ecf 100644 --- a/frappe/integrations/doctype/ldap_settings/ldap_settings.js +++ b/frappe/integrations/doctype/ldap_settings/ldap_settings.js @@ -1,8 +1,6 @@ // Copyright (c) 2016, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('LDAP Settings', { - refresh: function(frm) { - - } +frappe.ui.form.on("LDAP Settings", { + refresh: function (frm) {}, }); diff --git a/frappe/integrations/doctype/oauth_authorization_code/oauth_authorization_code.js b/frappe/integrations/doctype/oauth_authorization_code/oauth_authorization_code.js index 32746e6752..83ad1b3ee5 100644 --- a/frappe/integrations/doctype/oauth_authorization_code/oauth_authorization_code.js +++ b/frappe/integrations/doctype/oauth_authorization_code/oauth_authorization_code.js @@ -1,8 +1,6 @@ // Copyright (c) 2016, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('OAuth Authorization Code', { - refresh: function(frm) { - - } +frappe.ui.form.on("OAuth Authorization Code", { + refresh: function (frm) {}, }); diff --git a/frappe/integrations/doctype/oauth_bearer_token/oauth_bearer_token.js b/frappe/integrations/doctype/oauth_bearer_token/oauth_bearer_token.js index da69753903..7794f2fb70 100644 --- a/frappe/integrations/doctype/oauth_bearer_token/oauth_bearer_token.js +++ b/frappe/integrations/doctype/oauth_bearer_token/oauth_bearer_token.js @@ -1,8 +1,6 @@ // Copyright (c) 2016, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('OAuth Bearer Token', { - refresh: function(frm) { - - } +frappe.ui.form.on("OAuth Bearer Token", { + refresh: function (frm) {}, }); diff --git a/frappe/integrations/doctype/oauth_client/oauth_client.js b/frappe/integrations/doctype/oauth_client/oauth_client.js index b0caa562b1..3ddd1a046b 100644 --- a/frappe/integrations/doctype/oauth_client/oauth_client.js +++ b/frappe/integrations/doctype/oauth_client/oauth_client.js @@ -1,8 +1,6 @@ // Copyright (c) 2016, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('OAuth Client', { - refresh: function(frm) { - - } +frappe.ui.form.on("OAuth Client", { + refresh: function (frm) {}, }); diff --git a/frappe/integrations/doctype/oauth_provider_settings/oauth_provider_settings.js b/frappe/integrations/doctype/oauth_provider_settings/oauth_provider_settings.js index 6d7d071934..0071b4e977 100644 --- a/frappe/integrations/doctype/oauth_provider_settings/oauth_provider_settings.js +++ b/frappe/integrations/doctype/oauth_provider_settings/oauth_provider_settings.js @@ -1,8 +1,6 @@ // Copyright (c) 2016, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('OAuth Provider Settings', { - refresh: function(frm) { - - } +frappe.ui.form.on("OAuth Provider Settings", { + refresh: function (frm) {}, }); diff --git a/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.js b/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.js index 1a1b8a7c67..6db4087cf3 100755 --- a/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.js +++ b/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.js @@ -1,26 +1,26 @@ // Copyright (c) 2017, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('S3 Backup Settings', { - refresh: function(frm) { +frappe.ui.form.on("S3 Backup Settings", { + refresh: function (frm) { frm.clear_custom_buttons(); frm.events.take_backup(frm); }, - take_backup: function(frm) { + take_backup: function (frm) { if (frm.doc.access_key_id && frm.doc.secret_access_key) { - frm.add_custom_button(__("Take Backup Now"), function(){ + frm.add_custom_button(__("Take Backup Now"), function () { frm.dashboard.set_headline_alert("S3 Backup Started!"); frappe.call({ method: "frappe.integrations.doctype.s3_backup_settings.s3_backup_settings.take_backups_s3", - callback: function(r) { - if(!r.exc) { + callback: function (r) { + if (!r.exc) { frappe.msgprint(__("S3 Backup complete!")); frm.dashboard.clear_headline(); } - } + }, }); }).addClass("btn-primary"); } - } + }, }); diff --git a/frappe/integrations/doctype/slack_webhook_url/slack_webhook_url.js b/frappe/integrations/doctype/slack_webhook_url/slack_webhook_url.js index b7a972bdc1..49991fcffe 100644 --- a/frappe/integrations/doctype/slack_webhook_url/slack_webhook_url.js +++ b/frappe/integrations/doctype/slack_webhook_url/slack_webhook_url.js @@ -1,6 +1,4 @@ // Copyright (c) 2018, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Slack Webhook URL', { - -}); +frappe.ui.form.on("Slack Webhook URL", {}); diff --git a/frappe/integrations/doctype/social_login_key/social_login_key.js b/frappe/integrations/doctype/social_login_key/social_login_key.js index e2cbb3459f..033beffff0 100644 --- a/frappe/integrations/doctype/social_login_key/social_login_key.js +++ b/frappe/integrations/doctype/social_login_key/social_login_key.js @@ -1,12 +1,19 @@ // Copyright (c) 2017, Frappe Technologies and contributors // For license information, please see license.txt const fields = [ - "provider_name", "base_url", "custom_base_url", - "icon", "authorize_url", "access_token_url", "redirect_url", - "api_endpoint", "api_endpoint_args", "auth_url_data" + "provider_name", + "base_url", + "custom_base_url", + "icon", + "authorize_url", + "access_token_url", + "redirect_url", + "api_endpoint", + "api_endpoint_args", + "auth_url_data", ]; -frappe.ui.form.on('Social Login Key', { +frappe.ui.form.on("Social Login Key", { refresh(frm) { frm.trigger("setup_fields"); }, @@ -16,23 +23,25 @@ frappe.ui.form.on('Social Login Key', { }, social_login_provider(frm) { - if(frm.doc.social_login_provider != "Custom") { - frappe.call({ - "doc": frm.doc, - "method": "get_social_login_provider", - "args": { - "provider": frm.doc.social_login_provider - } - }).done((r) => { - const provider = r.message; - for(var field of fields) { - frm.set_value(field, provider[field]); - frm.set_df_property(field, "read_only", 1); - if (frm.doc.custom_base_url) { - frm.toggle_enable("base_url", 1); + if (frm.doc.social_login_provider != "Custom") { + frappe + .call({ + doc: frm.doc, + method: "get_social_login_provider", + args: { + provider: frm.doc.social_login_provider, + }, + }) + .done((r) => { + const provider = r.message; + for (var field of fields) { + frm.set_value(field, provider[field]); + frm.set_df_property(field, "read_only", 1); + if (frm.doc.custom_base_url) { + frm.toggle_enable("base_url", 1); + } } - } - }); + }); } else { frm.trigger("clear_fields"); frm.trigger("setup_fields"); @@ -41,38 +50,35 @@ frappe.ui.form.on('Social Login Key', { setup_fields(frm) { // set custom_base_url to read only for "Custom" provider - if(frm.doc.social_login_provider == "Custom") { + if (frm.doc.social_login_provider == "Custom") { frm.set_value("custom_base_url", 1); frm.set_df_property("custom_base_url", "read_only", 1); } // set fields to read only for providers from template - for(var f of fields) { - if(frm.doc.social_login_provider != "Custom"){ + for (var f of fields) { + if (frm.doc.social_login_provider != "Custom") { frm.set_df_property(f, "read_only", 1); } } // enable base_url for providers with custom_base_url - if(frm.doc.custom_base_url) { + if (frm.doc.custom_base_url) { frm.set_df_property("base_url", "read_only", 0); frm.fields_dict["sb_identity_details"].collapse(false); } // hide social_login_provider and provider_name for non local - if(!frm.doc.__islocal && - (frm.doc.social_login_provider || - frm.doc.provider_name)) { + if (!frm.doc.__islocal && (frm.doc.social_login_provider || frm.doc.provider_name)) { frm.set_df_property("social_login_provider", "hidden", 1); frm.set_df_property("provider_name", "hidden", 1); } }, clear_fields(frm) { - for(var field of fields){ + for (var field of fields) { frm.set_value(field, ""); frm.set_df_property(field, "read_only", 0); } - } - + }, }); diff --git a/frappe/integrations/doctype/token_cache/token_cache.js b/frappe/integrations/doctype/token_cache/token_cache.js index b7cac9b804..c8074c876b 100644 --- a/frappe/integrations/doctype/token_cache/token_cache.js +++ b/frappe/integrations/doctype/token_cache/token_cache.js @@ -1,8 +1,7 @@ // Copyright (c) 2019, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Token Cache', { +frappe.ui.form.on("Token Cache", { // refresh: function(frm) { - // } }); diff --git a/frappe/integrations/doctype/webhook/webhook.js b/frappe/integrations/doctype/webhook/webhook.js index f4cb4373ea..302cacc194 100644 --- a/frappe/integrations/doctype/webhook/webhook.js +++ b/frappe/integrations/doctype/webhook/webhook.js @@ -6,27 +6,41 @@ frappe.webhook = { if (frm.doc.webhook_doctype) { frappe.model.with_doctype(frm.doc.webhook_doctype, () => { // get doctype fields - let fields = $.map(frappe.get_doc("DocType", frm.doc.webhook_doctype).fields, (d) => { - if (frappe.model.no_value_type.includes(d.fieldtype) && !(frappe.model.table_fields.includes(d.fieldtype))) { - return null; - } else if (d.fieldtype === 'Currency' || d.fieldtype === 'Float') { - return { label: d.label, value: d.fieldname }; - } else { - return { label: `${__(d.label)} (${d.fieldtype})`, value: d.fieldname }; + let fields = $.map( + frappe.get_doc("DocType", frm.doc.webhook_doctype).fields, + (d) => { + if ( + frappe.model.no_value_type.includes(d.fieldtype) && + !frappe.model.table_fields.includes(d.fieldtype) + ) { + return null; + } else if (d.fieldtype === "Currency" || d.fieldtype === "Float") { + return { label: d.label, value: d.fieldname }; + } else { + return { + label: `${__(d.label)} (${d.fieldtype})`, + value: d.fieldname, + }; + } } - }); + ); // add meta fields for (let field of frappe.model.std_fields) { if (field.fieldname == "name") { fields.unshift({ label: "Name (Doc Name)", value: "name" }); } else { - fields.push({ label: `${__(field.label)} (${field.fieldtype})`, value: field.fieldname }); + fields.push({ + label: `${__(field.label)} (${field.fieldtype})`, + value: field.fieldname, + }); } } frm.fields_dict.webhook_data.grid.update_docfield_property( - 'fieldname', 'options', [""].concat(fields) + "fieldname", + "options", + [""].concat(fields) ); }); } @@ -42,22 +56,29 @@ frappe.webhook = { } if (header_value) { - let header_row = (frm.doc.webhook_headers || []).find(row => row.key === 'Content-Type'); + let header_row = (frm.doc.webhook_headers || []).find( + (row) => row.key === "Content-Type" + ); if (header_row) { - frappe.model.set_value(header_row.doctype, header_row.name, "value", header_value); + frappe.model.set_value( + header_row.doctype, + header_row.name, + "value", + header_value + ); } else { frm.add_child("webhook_headers", { - "key": "Content-Type", - "value": header_value + key: "Content-Type", + value: header_value, }); } frm.refresh(); } } - } + }, }; -frappe.ui.form.on('Webhook', { +frappe.ui.form.on("Webhook", { refresh: (frm) => { frappe.webhook.set_fieldname_select(frm); }, @@ -71,7 +92,7 @@ frappe.ui.form.on('Webhook', { }, enable_security: (frm) => { - frm.toggle_reqd('webhook_secret', frm.doc.enable_security); + frm.toggle_reqd("webhook_secret", frm.doc.enable_security); }, preview_document: (frm) => { @@ -83,13 +104,15 @@ frappe.ui.form.on('Webhook', { frm.refresh_field("preview_request_body"); }, }); - } + }, }); frappe.ui.form.on("Webhook Data", { fieldname: (frm, cdt, cdn) => { let row = locals[cdt][cdn]; - let df = frappe.get_meta(frm.doc.webhook_doctype).fields.filter((field) => field.fieldname == row.fieldname); + let df = frappe + .get_meta(frm.doc.webhook_doctype) + .fields.filter((field) => field.fieldname == row.fieldname); if (!df.length) { // check if field is a meta field @@ -98,5 +121,5 @@ frappe.ui.form.on("Webhook Data", { row.key = df.length ? df[0].fieldname : "name"; frm.refresh_field("webhook_data"); - } + }, }); diff --git a/frappe/integrations/doctype/webhook_request_log/webhook_request_log.js b/frappe/integrations/doctype/webhook_request_log/webhook_request_log.js index 9ec4f11536..1cb8c5ec76 100644 --- a/frappe/integrations/doctype/webhook_request_log/webhook_request_log.js +++ b/frappe/integrations/doctype/webhook_request_log/webhook_request_log.js @@ -1,8 +1,7 @@ // Copyright (c) 2021, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Webhook Request Log', { +frappe.ui.form.on("Webhook Request Log", { // refresh: function(frm) { - // } }); diff --git a/frappe/printing/doctype/letter_head/letter_head.js b/frappe/printing/doctype/letter_head/letter_head.js index ca4dad2d07..55d97cf37f 100644 --- a/frappe/printing/doctype/letter_head/letter_head.js +++ b/frappe/printing/doctype/letter_head/letter_head.js @@ -1,8 +1,8 @@ // Copyright (c) 2017, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Letter Head', { - refresh: function(frm) { +frappe.ui.form.on("Letter Head", { + refresh: function (frm) { frm.flag_public_attachments = true; - } + }, }); diff --git a/frappe/printing/doctype/network_printer_settings/network_printer_settings.js b/frappe/printing/doctype/network_printer_settings/network_printer_settings.js index 043afd388f..2d094d8038 100644 --- a/frappe/printing/doctype/network_printer_settings/network_printer_settings.js +++ b/frappe/printing/doctype/network_printer_settings/network_printer_settings.js @@ -1,29 +1,29 @@ // Copyright (c) 2021, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Network Printer Settings', { - onload (frm) { +frappe.ui.form.on("Network Printer Settings", { + onload(frm) { frm.trigger("connect_print_server"); }, - server_ip (frm) { + server_ip(frm) { frm.trigger("connect_print_server"); }, - port (frm) { + port(frm) { frm.trigger("connect_print_server"); }, - connect_print_server (frm) { + connect_print_server(frm) { if (frm.doc.server_ip && frm.doc.port) { frappe.call({ - "doc": frm.doc, - "method": "get_printers_list", - "args": { + doc: frm.doc, + method: "get_printers_list", + args: { ip: frm.doc.server_ip, - port: frm.doc.port + port: frm.doc.port, + }, + callback: function (data) { + frm.set_df_property("printer_name", "options", [""].concat(data.message)); }, - callback: function(data) { - frm.set_df_property('printer_name', 'options', [""].concat(data.message)); - } }); } - } + }, }); diff --git a/frappe/printing/doctype/print_format/print_format.js b/frappe/printing/doctype/print_format/print_format.js index 3fd1d9d148..94f0ae5b1c 100644 --- a/frappe/printing/doctype/print_format/print_format.js +++ b/frappe/printing/doctype/print_format/print_format.js @@ -17,9 +17,9 @@ frappe.ui.form.on("Print Format", { if (frm.doc.standard === "Yes" && frappe.session.user !== "Administrator") { frm.set_intro(__("Please duplicate this to make changes")); } - frm.trigger('render_buttons'); - frm.toggle_display('standard', frappe.boot.developer_mode); - frm.trigger('hide_absolute_value_field'); + frm.trigger("render_buttons"); + frm.toggle_display("standard", frappe.boot.developer_mode); + frm.trigger("hide_absolute_value_field"); }, render_buttons: function (frm) { frm.page.clear_inner_toolbar(); @@ -36,22 +36,21 @@ frappe.ui.form.on("Print Format", { frappe.set_route("print-format-builder", frm.doc.name); } }); - } - else if (frm.doc.custom_format && !frm.doc.raw_printing) { + } else if (frm.doc.custom_format && !frm.doc.raw_printing) { frm.set_df_property("html", "reqd", 1); } if (frappe.model.can_read(frm.doc.doc_type)) { - frappe.db.get_value('DocType', frm.doc.doc_type, 'default_print_format', (r) => { + frappe.db.get_value("DocType", frm.doc.doc_type, "default_print_format", (r) => { if (r.default_print_format != frm.doc.name) { frm.add_custom_button(__("Set as Default"), function () { frappe.call({ method: "frappe.printing.doctype.print_format.print_format.make_default", args: { - name: frm.doc.name + name: frm.doc.name, }, - callback: function() { + callback: function () { frm.refresh(); - } + }, }); }); } @@ -61,13 +60,13 @@ frappe.ui.form.on("Print Format", { }, custom_format: function (frm) { var value = frm.doc.custom_format ? 0 : 1; - frm.set_value('align_labels_right', value); - frm.set_value('show_section_headings', value); - frm.set_value('line_breaks', value); - frm.trigger('render_buttons'); + frm.set_value("align_labels_right", value); + frm.set_value("show_section_headings", value); + frm.set_value("line_breaks", value); + frm.trigger("render_buttons"); }, doc_type: function (frm) { - frm.trigger('hide_absolute_value_field'); + frm.trigger("hide_absolute_value_field"); }, hide_absolute_value_field: function (frm) { // TODO: make it work with frm.doc.doc_type @@ -76,9 +75,11 @@ frappe.ui.form.on("Print Format", { if (doctype) { frappe.model.with_doctype(doctype, () => { const meta = frappe.get_meta(doctype); - const has_int_float_currency_field = meta.fields.filter(df => in_list(['Int', 'Float', 'Currency'], df.fieldtype)); - frm.toggle_display('absolute_value', has_int_float_currency_field.length); + const has_int_float_currency_field = meta.fields.filter((df) => + in_list(["Int", "Float", "Currency"], df.fieldtype) + ); + frm.toggle_display("absolute_value", has_int_float_currency_field.length); }); } - } + }, }); diff --git a/frappe/printing/doctype/print_format_field_template/print_format_field_template.js b/frappe/printing/doctype/print_format_field_template/print_format_field_template.js index 7fbb0d7359..4aa00ae5e7 100644 --- a/frappe/printing/doctype/print_format_field_template/print_format_field_template.js +++ b/frappe/printing/doctype/print_format_field_template/print_format_field_template.js @@ -1,8 +1,7 @@ // Copyright (c) 2021, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Print Format Field Template', { +frappe.ui.form.on("Print Format Field Template", { // refresh: function(frm) { - // } }); diff --git a/frappe/printing/doctype/print_heading/print_heading.js b/frappe/printing/doctype/print_heading/print_heading.js index 39f26a2e0f..3a2c615363 100644 --- a/frappe/printing/doctype/print_heading/print_heading.js +++ b/frappe/printing/doctype/print_heading/print_heading.js @@ -1,8 +1,6 @@ // Copyright (c) 2017, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Print Heading', { - refresh: function(frm) { - - } +frappe.ui.form.on("Print Heading", { + refresh: function (frm) {}, }); diff --git a/frappe/printing/doctype/print_settings/print_settings.js b/frappe/printing/doctype/print_settings/print_settings.js index b1311166ee..dc939c298d 100644 --- a/frappe/printing/doctype/print_settings/print_settings.js +++ b/frappe/printing/doctype/print_settings/print_settings.js @@ -1,19 +1,23 @@ // Copyright (c) 2018, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Print Settings', { - print_style: function(frm) { - frappe.db.get_value('Print Style', frm.doc.print_style, 'preview').then((r) => { - if(r.message.preview) { +frappe.ui.form.on("Print Settings", { + print_style: function (frm) { + frappe.db.get_value("Print Style", frm.doc.print_style, "preview").then((r) => { + if (r.message.preview) { frm.get_field("print_style_preview").$wrapper.html( - ``); + `` + ); } else { frm.get_field("print_style_preview").$wrapper.html( - `

      ${__("No Preview")}

      `); + `

      ${__( + "No Preview" + )}

      ` + ); } }); }, - onload: function(frm) { + onload: function (frm) { frm.script_manager.trigger("print_style"); - } + }, }); diff --git a/frappe/printing/doctype/print_style/print_style.js b/frappe/printing/doctype/print_style/print_style.js index 44c4a528f4..3177e1aa09 100644 --- a/frappe/printing/doctype/print_style/print_style.js +++ b/frappe/printing/doctype/print_style/print_style.js @@ -1,10 +1,10 @@ // Copyright (c) 2017, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Print Style', { - refresh: function(frm) { - frm.add_custom_button(__('Print Settings'), () => { - frappe.set_route('Form', 'Print Settings'); - }) - } +frappe.ui.form.on("Print Style", { + refresh: function (frm) { + frm.add_custom_button(__("Print Settings"), () => { + frappe.set_route("Form", "Print Settings"); + }); + }, }); diff --git a/frappe/printing/page/print/print.js b/frappe/printing/page/print/print.js index 7db6930a60..90e7328a30 100644 --- a/frappe/printing/page/print/print.js +++ b/frappe/printing/page/print/print.js @@ -1,11 +1,11 @@ -frappe.pages['print'].on_page_load = function(wrapper) { +frappe.pages["print"].on_page_load = function (wrapper) { frappe.ui.make_app_page({ parent: wrapper, }); let print_view = new frappe.ui.form.PrintView(wrapper); - $(wrapper).bind('show', () => { + $(wrapper).bind("show", () => { const route = frappe.get_route(); const doctype = route[1]; const docname = route.slice(2).join("/"); @@ -19,8 +19,9 @@ frappe.pages['print'].on_page_load = function(wrapper) { }); }); } else { - print_view.frm = frappe.route_options.frm.doctype ? - frappe.route_options.frm : frappe.route_options.frm.frm; + print_view.frm = frappe.route_options.frm.doctype + ? frappe.route_options.frm + : frappe.route_options.frm.frm; frappe.route_options.frm = null; print_view.show(print_view.frm); } @@ -37,7 +38,7 @@ frappe.ui.form.PrintView = class { make() { this.print_wrapper = this.page.main.empty().html( `