diff --git a/babel_extractors.csv b/babel_extractors.csv index ff8faafaff..7f2103c4d4 100644 --- a/babel_extractors.csv +++ b/babel_extractors.csv @@ -7,5 +7,6 @@ hooks.py,frappe.gettext.extractors.navbar.extract **.py,frappe.gettext.extractors.python.extract **.js,frappe.gettext.extractors.javascript.extract **.html,frappe.gettext.extractors.html_template.extract +**.vue,frappe.gettext.extractors.html_template.extract **/custom/*.json,frappe.gettext.extractors.customization.extract **/fixtures/custom_field.json,frappe.gettext.extractors.custom_field.extract \ No newline at end of file diff --git a/cypress/integration/workspace.js b/cypress/integration/workspace.js index 4079877c9c..79800faa01 100644 --- a/cypress/integration/workspace.js +++ b/cypress/integration/workspace.js @@ -18,7 +18,7 @@ context("Workspace 2.0", () => { }).as("new_page"); cy.get(".codex-editor__redactor .ce-block"); - cy.get('.custom-actions button[data-label="Create%20Workspace"]').click(); + cy.get(".btn-new-workspace").click(); cy.fill_field("title", "Test Private Page", "Data"); cy.get_open_dialog().find(".modal-header").click(); cy.get_open_dialog().find(".btn-primary").click(); @@ -48,7 +48,7 @@ context("Workspace 2.0", () => { }).as("new_page"); cy.get(".codex-editor__redactor .ce-block"); - cy.get('.custom-actions button[data-label="Create%20Workspace"]').click(); + cy.get(".btn-new-workspace").click(); cy.fill_field("title", "Test Child Page", "Data"); cy.fill_field("parent", "Test Private Page", "Select"); cy.get_open_dialog().find(".modal-header").click(); @@ -79,7 +79,7 @@ context("Workspace 2.0", () => { }).as("page_duplicated"); cy.get(".codex-editor__redactor .ce-block"); - cy.get(".standard-actions .btn-secondary[data-label=Edit]").click(); + cy.get(".btn-edit-workspace").click(); cy.get('.sidebar-item-container[item-name="Test Private Page"]').as("sidebar-item"); @@ -196,7 +196,7 @@ context("Workspace 2.0", () => { }).as("hide_page"); cy.get(".codex-editor__redactor .ce-block"); - cy.get(".standard-actions .btn-secondary[data-label=Edit]").click(); + cy.get(".btn-edit-workspace").click(); cy.get('.sidebar-item-container[item-name="Duplicate Page"]') .find(".sidebar-item-control .setting-btn") @@ -217,7 +217,7 @@ context("Workspace 2.0", () => { }).as("unhide_page"); cy.get(".codex-editor__redactor .ce-block"); - cy.get(".standard-actions .btn-secondary[data-label=Edit]").click(); + cy.get(".btn-edit-workspace").click(); cy.get('.sidebar-item-container[item-name="Duplicate Page"]') .find('[title="Unhide Workspace"]') @@ -237,7 +237,7 @@ context("Workspace 2.0", () => { }).as("page_deleted"); cy.get(".codex-editor__redactor .ce-block"); - cy.get(".standard-actions .btn-secondary[data-label=Edit]").click(); + cy.get(".btn-edit-workspace").click(); cy.get('.sidebar-item-container[item-name="Duplicate Page"]') .find(".sidebar-item-control .setting-btn") diff --git a/cypress/integration/workspace_blocks.js b/cypress/integration/workspace_blocks.js index 8b93c4e50d..e601efc9b3 100644 --- a/cypress/integration/workspace_blocks.js +++ b/cypress/integration/workspace_blocks.js @@ -18,7 +18,7 @@ context("Workspace Blocks", () => { cy.visit("/app/website"); cy.get(".codex-editor__redactor .ce-block"); - cy.get('.custom-actions button[data-label="Create%20Workspace"]').click(); + cy.get(".btn-new-workspace").click(); cy.fill_field("title", "Test Block Page", "Data"); cy.get_open_dialog().find(".modal-header").click(); cy.get_open_dialog().find(".btn-primary").click(); @@ -71,7 +71,7 @@ context("Workspace Blocks", () => { }).as("get_doctype"); cy.get(".codex-editor__redactor .ce-block"); - cy.get(".standard-actions .btn-secondary[data-label=Edit]").click(); + cy.get(".btn-edit-workspace").click(); // test quick list creation cy.get(".ce-block").first().click({ force: true }).type("{enter}"); @@ -159,7 +159,7 @@ context("Workspace Blocks", () => { ]); cy.get(".codex-editor__redactor .ce-block"); - cy.get(".standard-actions .btn-secondary[data-label=Edit]").click(); + cy.get(".btn-edit-workspace").click(); cy.get(".ce-block").first().click({ force: true }).type("{enter}"); cy.get(".block-list-container .block-list-item").contains("Number Card").click(); @@ -174,7 +174,7 @@ context("Workspace Blocks", () => { cy.get("@number_card").find(".widget-title").should("contain", "Test Number Card"); // edit number card - cy.get(".standard-actions .btn-secondary[data-label=Edit]").click(); + cy.get(".btn-edit-workspace").click(); cy.get("@number_card").realHover().find(".widget-control .edit-button").click(); cy.get_field("label", "Data").invoke("val", "ToDo Count"); cy.click_modal_primary_button("Save"); diff --git a/frappe/__init__.py b/frappe/__init__.py index ac6b0edff5..4c1873ea9b 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -442,6 +442,12 @@ def get_site_config(sites_path: str | None = None, site_path: str | None = None) # Set the user as database name if not set in config config["db_user"] = os.environ.get("FRAPPE_DB_USER") or config.get("db_user") or config.get("db_name") + # vice versa for dbname if not defined + config["db_name"] = os.environ.get("FRAPPE_DB_NAME") or config.get("db_name") or config["db_user"] + + # read password + config["db_password"] = os.environ.get("FRAPPE_DB_PASSWORD") or config.get("db_password") + # Allow externally extending the config with hooks if extra_config := config.get("extra_config"): if isinstance(extra_config, str): diff --git a/frappe/commands/site.py b/frappe/commands/site.py index e76f0c23d0..3c2c3950d1 100644 --- a/frappe/commands/site.py +++ b/frappe/commands/site.py @@ -675,19 +675,11 @@ def migrate(context, skip_failing=False, skip_search_index=False): @click.command("migrate-to") -@click.argument("frappe_provider") -@pass_context -def migrate_to(context, frappe_provider): +def migrate_to(): "Migrates site to the specified provider" from frappe.integrations.frappe_providers import migrate_to - for site in context.sites: - frappe.init(site=site) - frappe.connect() - migrate_to(site, frappe_provider) - frappe.destroy() - if not context.sites: - raise SiteNotSpecifiedError + migrate_to() @click.command("run-patch") diff --git a/frappe/core/doctype/communication/communication.py b/frappe/core/doctype/communication/communication.py index 468f7ea6ea..ed1409575c 100644 --- a/frappe/core/doctype/communication/communication.py +++ b/frappe/core/doctype/communication/communication.py @@ -3,7 +3,7 @@ from collections import Counter from email.utils import getaddresses -from urllib.parse import unquote +from urllib.parse import unquote_plus from bs4 import BeautifulSoup @@ -593,47 +593,62 @@ def parse_email(email_strings): When automatic email linking is enabled, an email from email_strings can contain a doctype and docname ie in the format `admin+doctype+docname@example.com` or `admin+doctype=docname@example.com`, the email is parsed and doctype and docname is extracted. + + see: RFC5233 """ for email_string in email_strings: if not email_string: continue for email in email_string.split(","): - email_username = email.split("@", 1)[0] - email_local_parts = email_username.split("+") - docname = doctype = None - if len(email_local_parts) == 3: - doctype = unquote(email_local_parts[1]) - docname = unquote(email_local_parts[2]) + local_part = email.split("@", 1)[0].strip('"') + user, detail = None, None + if "+" in local_part: + user, detail = local_part.split("+", 1) + elif "--" in local_part: + detail, user = local_part.rsplit("--", 1) - elif len(email_local_parts) == 2: - document_parts = email_local_parts[1].split("=", 1) - if len(document_parts) != 2: - continue + if not detail: + continue - doctype = unquote(document_parts[0]) - docname = unquote(document_parts[1]) + document_parts = None + if "=" in detail: + document_parts = detail.split("=", 1) + elif "+" in detail: + document_parts = detail.split("+", 1) - if doctype and docname: - yield doctype, docname + if not document_parts or len(document_parts) != 2: + continue + + doctype = unquote_plus(document_parts[0]) + docname = unquote_plus(document_parts[1]) + yield doctype, docname def get_email_without_link(email): """Return email address without doctype links. e.g. 'admin@example.com' is returned for email 'admin+doctype+docname@example.com' + + see: RFC5233 """ if not frappe.get_all("Email Account", filters={"enable_automatic_linking": 1}): return email try: _email = email.split("@") - email_id = _email[0].split("+", 1)[0] - email_host = _email[1] + _local_part = _email[0].strip('"') + if "+" in _local_part: + user = _local_part.split("+", 1)[0] + elif "--" in _local_part: + user = _local_part.split("--", 1)[1] + else: + user = _local_part + domain = _email[1] except IndexError: return email - return f"{email_id}@{email_host}" + return f"{user}@{domain}" def update_parent_document_on_communication(doc): diff --git a/frappe/core/doctype/communication/test_communication.py b/frappe/core/doctype/communication/test_communication.py index 3d42c823c5..4474168c14 100644 --- a/frappe/core/doctype/communication/test_communication.py +++ b/frappe/core/doctype/communication/test_communication.py @@ -221,11 +221,20 @@ class TestCommunication(FrappeTestCase): def test_parse_email(self): to = "Jon Doe " cc = """=?UTF-8?Q?Max_Mu=C3=9F?= , - erp+Customer+that%20company@example.org""" + erp+Customer=Plus%2BCompany@example.org, + erp+Customer+Space%20Company@example.org, + erp+Customer+Space+Company+Plus+Encoded@example.org""" bcc = "" results = list(parse_email([to, cc, bcc])) - self.assertEqual([("Customer", "that company")], results) + self.assertEqual( + [ + ("Customer", "Plus+Company"), + ("Customer", "Space Company"), + ("Customer", "Space Company Plus Encoded"), + ], + results, + ) results = list(parse_email([to, bcc])) self.assertEqual(results, []) @@ -380,7 +389,8 @@ class TestCommunicationEmailMixin(FrappeTestCase): user = self.new_user(email="bcc+2@test.com", enabled=0) comm = self.new_communication(bcc=bcc_list) res = comm.get_mail_bcc_with_displayname() - self.assertCountEqual(res, bcc_list) + # Disabled users have thread_notify disabled, so they'll be removed from the list + self.assertCountEqual(res, bcc_list[:1]) user.delete() comm.delete() diff --git a/frappe/core/doctype/data_import/data_import.py b/frappe/core/doctype/data_import/data_import.py index b2de0badc9..0af57c2dd2 100644 --- a/frappe/core/doctype/data_import/data_import.py +++ b/frappe/core/doctype/data_import/data_import.py @@ -296,7 +296,16 @@ def export_json(doctype, path, filters=None, or_filters=None, name=None, order_b for v in doc.values(): if isinstance(v, list): for child in v: - for key in (*del_keys, "docstatus", "doctype", "modified", "name"): + for key in ( + *del_keys, + "docstatus", + "doctype", + "modified", + "name", + "parent", + "parentfield", + "parenttype", + ): if key in child: del child[key] diff --git a/frappe/core/doctype/deleted_document/deleted_document.py b/frappe/core/doctype/deleted_document/deleted_document.py index be5fc1b0ff..dcb25be677 100644 --- a/frappe/core/doctype/deleted_document/deleted_document.py +++ b/frappe/core/doctype/deleted_document/deleted_document.py @@ -26,7 +26,7 @@ class DeletedDocument(Document): restored: DF.Check # end: auto-generated types - pass + no_feed_on_delete = True @staticmethod def clear_old_logs(days=180): diff --git a/frappe/core/doctype/docfield/docfield.json b/frappe/core/doctype/docfield/docfield.json index 4943f7a94c..f2d0eee7a1 100644 --- a/frappe/core/doctype/docfield/docfield.json +++ b/frappe/core/doctype/docfield/docfield.json @@ -32,6 +32,7 @@ "fetch_if_empty", "visibility_section", "hidden", + "show_on_timeline", "bold", "allow_in_quick_entry", "translatable", @@ -578,13 +579,20 @@ "fieldname": "not_nullable", "fieldtype": "Check", "label": "Not Nullable" + }, + { + "default": "0", + "depends_on": "eval: doc.hidden", + "fieldname": "show_on_timeline", + "fieldtype": "Check", + "label": "Show on Timeline" } ], "idx": 1, "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2024-04-12 16:27:34.546314", + "modified": "2024-07-30 13:15:32.037892", "modified_by": "Administrator", "module": "Core", "name": "DocField", @@ -594,4 +602,4 @@ "sort_field": "creation", "sort_order": "ASC", "states": [] -} +} \ No newline at end of file diff --git a/frappe/core/doctype/docfield/docfield.py b/frappe/core/doctype/docfield/docfield.py index ed663c3bba..4dc397d5b5 100644 --- a/frappe/core/doctype/docfield/docfield.py +++ b/frappe/core/doctype/docfield/docfield.py @@ -112,6 +112,7 @@ class DocField(Document): search_index: DF.Check set_only_once: DF.Check show_dashboard: DF.Check + show_on_timeline: DF.Check sort_options: DF.Check translatable: DF.Check unique: DF.Check diff --git a/frappe/core/doctype/doctype/doctype.js b/frappe/core/doctype/doctype/doctype.js index f672db1f92..6cfb54dc1c 100644 --- a/frappe/core/doctype/doctype/doctype.js +++ b/frappe/core/doctype/doctype/doctype.js @@ -62,7 +62,7 @@ frappe.ui.form.on("DocType", { } } - const customize_form_link = "Customize Form"; + const customize_form_link = `${__("Customize Form")}`; if (!frappe.boot.developer_mode && !frm.doc.custom) { // make the document read-only frm.set_read_only(); diff --git a/frappe/core/doctype/doctype/doctype.json b/frappe/core/doctype/doctype/doctype.json index c285c6ffec..6979dd35fc 100644 --- a/frappe/core/doctype/doctype/doctype.json +++ b/frappe/core/doctype/doctype/doctype.json @@ -10,6 +10,11 @@ "field_order": [ "form_builder_tab", "form_builder", + "permissions_tab", + "permissions", + "restrict_to_domain", + "read_only", + "in_create", "settings_tab", "sb0", "module", @@ -70,11 +75,6 @@ "sender_field", "sender_name_field", "subject_field", - "sb2", - "permissions", - "restrict_to_domain", - "read_only", - "in_create", "actions_section", "actions", "links_section", @@ -152,8 +152,8 @@ }, { "default": "0", - "depends_on": "eval:!doc.istable && !doc.issingle", - "description": "Open a dialog with mandatory fields to create a new record quickly", + "depends_on": "eval:!doc.istable", + "description": "Open a dialog with mandatory fields to create a new record quickly. There must be at least one mandatory field to show in dialog.", "fieldname": "quick_entry", "fieldtype": "Check", "label": "Quick Entry" @@ -381,12 +381,6 @@ "fieldtype": "Check", "label": "Make \"name\" searchable in Global Search" }, - { - "depends_on": "eval:!doc.istable", - "fieldname": "sb2", - "fieldtype": "Section Break", - "label": "Permission Rules" - }, { "fieldname": "permissions", "fieldtype": "Table", @@ -418,6 +412,7 @@ "oldfieldtype": "Check" }, { + "collapsible": 1, "depends_on": "eval:doc.custom===0 && !doc.istable", "fieldname": "web_view", "fieldtype": "Section Break", @@ -668,6 +663,11 @@ "fieldname": "sender_name_field", "fieldtype": "Data", "label": "Sender Name Field" + }, + { + "fieldname": "permissions_tab", + "fieldtype": "Tab Break", + "label": "Permissions" } ], "icon": "fa fa-bolt", @@ -750,7 +750,7 @@ "link_fieldname": "reference_doctype" } ], - "modified": "2024-03-29 16:09:26.114720", + "modified": "2024-08-02 14:48:12.911702", "modified_by": "Administrator", "module": "Core", "name": "DocType", diff --git a/frappe/core/doctype/file/test_file.py b/frappe/core/doctype/file/test_file.py index 6c9b9f5872..03a8927dac 100644 --- a/frappe/core/doctype/file/test_file.py +++ b/frappe/core/doctype/file/test_file.py @@ -17,7 +17,7 @@ from frappe.core.api.file import ( unzip_file, ) from frappe.core.doctype.file.exceptions import FileTypeNotAllowed -from frappe.core.doctype.file.utils import get_extension +from frappe.core.doctype.file.utils import get_corrupted_image_msg, get_extension from frappe.desk.form.utils import add_comment from frappe.exceptions import ValidationError from frappe.tests.utils import FrappeTestCase, change_settings @@ -768,6 +768,25 @@ class TestFileUtils(FrappeTestCase): ) self.assertRegex(communication.content, r"") + def test_broken_image(self): + """Ensure that broken inline images don't cause errors.""" + is_private = not frappe.get_meta("Communication").make_attachments_public + communication = frappe.get_doc( + doctype="Communication", + communication_type="Communication", + communication_medium="Email", + content='
', + recipients="to ", + cc=None, + bcc=None, + sender="sender@test.com", + ).insert(ignore_permissions=True) + + self.assertFalse( + frappe.db.exists("File", {"attached_to_name": communication.name, "is_private": is_private}) + ) + self.assertIn(f'{get_corrupted_image_msg()}', communication.content) + def test_create_new_folder(self): folder = create_new_folder("test_folder", "Home") self.assertTrue(folder.is_folder) diff --git a/frappe/core/doctype/file/utils.py b/frappe/core/doctype/file/utils.py index 578c760389..d16f76b090 100644 --- a/frappe/core/doctype/file/utils.py +++ b/frappe/core/doctype/file/utils.py @@ -2,6 +2,7 @@ import hashlib import mimetypes import os import re +from binascii import Error as BinasciiError from io import BytesIO from typing import TYPE_CHECKING, Optional from urllib.parse import unquote @@ -234,7 +235,12 @@ def extract_images_from_html(doc: "Document", content: str, is_private: bool = F content = content.encode("utf-8") if b"," in content: content = content.split(b",")[1] - content = safe_b64decode(content) + + try: + content = safe_b64decode(content) + except BinasciiError: + frappe.flags.has_dataurl = True + return f'{get_corrupted_image_msg()} str: extn = None if content_type: diff --git a/frappe/core/doctype/navbar_settings/navbar_settings.py b/frappe/core/doctype/navbar_settings/navbar_settings.py index b155b530ed..55e33cd61a 100644 --- a/frappe/core/doctype/navbar_settings/navbar_settings.py +++ b/frappe/core/doctype/navbar_settings/navbar_settings.py @@ -22,26 +22,6 @@ class NavbarSettings(Document): settings_dropdown: DF.Table[NavbarItem] # end: auto-generated types - def validate(self): - self.validate_standard_navbar_items() - - def validate_standard_navbar_items(self): - doc_before_save = self.get_doc_before_save() - - if not doc_before_save: - return - - before_save_items = [ - item - for item in doc_before_save.help_dropdown + doc_before_save.settings_dropdown - if item.is_standard - ] - - after_save_items = [item for item in self.help_dropdown + self.settings_dropdown if item.is_standard] - - if not frappe.flags.in_patch and (len(before_save_items) > len(after_save_items)): - frappe.throw(_("Please hide the standard navbar items instead of deleting them")) - def get_app_logo(): app_logo = frappe.db.get_single_value("Navbar Settings", "app_logo", cache=True) @@ -53,3 +33,31 @@ def get_app_logo(): def get_navbar_settings(): return frappe.get_single("Navbar Settings") + + +def sync_standard_items(): + """Syncs standard items from hooks. Called in migrate""" + + sync_table("settings_dropdown", "standard_navbar_items") + sync_table("help_dropdown", "standard_help_items") + + +def sync_table(key, hook): + navbar_settings = NavbarSettings("Navbar Settings") + existing_items = {d.item_label: d for d in navbar_settings.get(key)} + new_standard_items = {} + + # add new items + count = 0 # matain count because list may come from seperate apps + for item in frappe.get_hooks(hook): + if item.get("item_label") not in existing_items: + navbar_settings.append(key, item, count) + new_standard_items[item.get("item_label")] = True + count += 1 + + # remove unused items + items = navbar_settings.get(key) + items = [item for item in items if not (item.is_standard and (item.item_label not in new_standard_items))] + navbar_settings.set(key, items) + + navbar_settings.save() diff --git a/frappe/core/doctype/report/boilerplate/controller.js b/frappe/core/doctype/report/boilerplate/controller.js index b7a53df088..6aef67307e 100644 --- a/frappe/core/doctype/report/boilerplate/controller.js +++ b/frappe/core/doctype/report/boilerplate/controller.js @@ -2,7 +2,12 @@ // For license information, please see license.txt frappe.query_reports["{name}"] = {{ - "filters": [ - - ] + filters: [ + // {{ + // "fieldname": "my_filter", + // "label": __("My Filter"), + // "fieldtype": "Data", + // "reqd": 1, + // }}, + ], }}; diff --git a/frappe/core/doctype/report/boilerplate/controller.py b/frappe/core/doctype/report/boilerplate/controller.py index dd4339dd5f..53810436b2 100644 --- a/frappe/core/doctype/report/boilerplate/controller.py +++ b/frappe/core/doctype/report/boilerplate/controller.py @@ -2,8 +2,47 @@ # For license information, please see license.txt # import frappe +from frappe import _ -def execute(filters=None): - columns, data = [], [] +def execute(filters: dict | None = None): + """Return columns and data for the report. + + This is the main entry point for the report. It accepts the filters as a + dictionary and should return columns and data. It is called by the framework + every time the report is refreshed or a filter is updated. + """ + columns = get_columns() + data = get_data() + return columns, data + + +def get_columns() -> list[dict]: + """Return columns for the report. + + One field definition per column, just like a DocType field definition. + """ + return [ + {{ + "label": _("Column 1"), + "fieldname": "column_1", + "fieldtype": "Data", + }}, + {{ + "label": _("Column 2"), + "fieldname": "column_2", + "fieldtype": "Int", + }}, + ] + + +def get_data() -> list[list]: + """Return data for the report. + + The report data is a list of rows, with each row being a list of cell values. + """ + return [ + ["Row 1", 1], + ["Row 2", 2], + ] diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json index 1cdf6c2397..4e326bbc25 100644 --- a/frappe/core/doctype/user/user.json +++ b/frappe/core/doctype/user/user.json @@ -237,7 +237,8 @@ "options": "Has Role", "permlevel": 1, "print_hide": 1, - "read_only": 1 + "read_only": 1, + "show_on_timeline": 1 }, { "collapsible": 1, @@ -428,7 +429,8 @@ "hidden": 1, "label": "Block Modules", "options": "Block Module", - "permlevel": 1 + "permlevel": 1, + "show_on_timeline": 1 }, { "fieldname": "home_settings", @@ -796,7 +798,7 @@ "link_fieldname": "user" } ], - "modified": "2024-04-12 23:25:04.628007", + "modified": "2024-07-15 18:40:18.842915", "modified_by": "Administrator", "module": "Core", "name": "User", diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index 96891b53e1..225175e417 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -17,7 +17,6 @@ from frappe.desk.doctype.notification_settings.notification_settings import ( toggle_notifications, ) from frappe.desk.notifications import clear_notifications -from frappe.model.delete_doc import check_if_doc_is_linked from frappe.model.document import Document from frappe.query_builder import DocType from frappe.rate_limiter import rate_limit @@ -183,6 +182,12 @@ class User(Document): if (self.name not in ["Administrator", "Guest"]) and (not self.get_social_login_userid("frappe")): self.set_social_login_userid("frappe", frappe.generate_hash(length=39)) + def disable_email_fields_if_user_disabled(self): + if not self.enabled: + self.thread_notify = 0 + self.send_me_a_copy = 0 + self.allowed_in_mentions = 0 + @frappe.whitelist() def populate_role_profile_roles(self): if not self.role_profiles: @@ -285,6 +290,7 @@ class User(Document): # toggle notifications based on the user's status toggle_notifications(self.name, enable=cint(self.enabled), ignore_permissions=True) + self.disable_email_fields_if_user_disabled() def email_new_password(self, new_password=None): if new_password and not self.flags.in_insert: @@ -356,7 +362,11 @@ class User(Document): user=self.name, pwd=new_password, logout_all_sessions=self.logout_all_sessions ) - if not self.flags.no_welcome_mail and cint(self.send_welcome_email): + if ( + not self.flags.no_welcome_mail + and cint(self.send_welcome_email) + and not self.flags.email_sent + ): self.send_welcome_mail_to_user() self.flags.email_sent = 1 if frappe.session.user != "Guest": @@ -536,11 +546,20 @@ class User(Document): # Delete EPS data frappe.db.delete("Energy Point Log", {"user": self.name}) - # Ask user to disable instead if document is still linked - try: - check_if_doc_is_linked(self) - except frappe.LinkExistsError: - frappe.throw(_("You can disable the user instead of deleting it."), frappe.LinkExistsError) + # Remove user link from Workflow Action + frappe.db.set_value("Workflow Action", {"user": self.name}, "user", None) + + # Delete user's List Filters + frappe.db.delete("List Filter", {"for_user": self.name}) + + # Remove user from Note's Seen By table + seen_notes = frappe.get_all("Note", filters=[["Note Seen By", "user", "=", self.name]], pluck="name") + for note_id in seen_notes: + note = frappe.get_doc("Note", note_id) + for row in note.seen_by: + if row.user == self.name: + note.remove(row) + note.save(ignore_permissions=True) def before_rename(self, old_name, new_name, merge=False): # if merging, delete the old user notification settings diff --git a/frappe/core/doctype/user_document_type/user_document_type.json b/frappe/core/doctype/user_document_type/user_document_type.json index e4e40f7548..9cca917a60 100644 --- a/frappe/core/doctype/user_document_type/user_document_type.json +++ b/frappe/core/doctype/user_document_type/user_document_type.json @@ -16,7 +16,12 @@ "submit", "cancel", "amend", - "delete" + "delete", + "additional_permissions_section", + "email", + "column_break_fjuk", + "share", + "print" ], "fields": [ { @@ -92,12 +97,39 @@ "fieldname": "delete", "fieldtype": "Check", "label": "Delete" + }, + { + "fieldname": "additional_permissions_section", + "fieldtype": "Section Break", + "label": "Additional Permissions" + }, + { + "default": "1", + "fieldname": "email", + "fieldtype": "Check", + "label": "Email" + }, + { + "fieldname": "column_break_fjuk", + "fieldtype": "Column Break" + }, + { + "default": "1", + "fieldname": "share", + "fieldtype": "Check", + "label": "Share" + }, + { + "default": "1", + "fieldname": "print", + "fieldtype": "Check", + "label": "Print" } ], "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2024-03-23 16:04:00.313525", + "modified": "2024-07-12 17:32:15.721862", "modified_by": "Administrator", "module": "Core", "name": "User Document Type", diff --git a/frappe/core/doctype/user_document_type/user_document_type.py b/frappe/core/doctype/user_document_type/user_document_type.py index a2b519b8ca..7641342744 100644 --- a/frappe/core/doctype/user_document_type/user_document_type.py +++ b/frappe/core/doctype/user_document_type/user_document_type.py @@ -19,11 +19,14 @@ class UserDocumentType(Document): create: DF.Check delete: DF.Check document_type: DF.Link + email: DF.Check is_custom: DF.Check parent: DF.Data parentfield: DF.Data parenttype: DF.Data + print: DF.Check read: DF.Check + share: DF.Check submit: DF.Check write: DF.Check # end: auto-generated types diff --git a/frappe/core/doctype/user_type/test_user_type.py b/frappe/core/doctype/user_type/test_user_type.py index ec1a5e3bfc..08ba0ceaab 100644 --- a/frappe/core/doctype/user_type/test_user_type.py +++ b/frappe/core/doctype/user_type/test_user_type.py @@ -31,6 +31,18 @@ class TestUserType(FrappeTestCase): for entry in link_fields: self.assertTrue(entry.options in select_doctypes) + def test_print_share_email_default(self): + """Test if print, share & email values default to 1. (for backward compatibility)""" + # create user type with read, write permissions + create_user_type("Test User Type") + + # check if print, share & email values are set to 1 + perm = frappe.get_all("Custom DocPerm", filters={"role": "_Test User Type"}, fields=["*"])[0] + + self.assertTrue(perm.print == 1) + self.assertTrue(perm.share == 1) + self.assertTrue(perm.email == 1) + def tearDown(self): frappe.db.rollback() diff --git a/frappe/core/doctype/user_type/user_type.py b/frappe/core/doctype/user_type/user_type.py index 7478b71782..09440b8abc 100644 --- a/frappe/core/doctype/user_type/user_type.py +++ b/frappe/core/doctype/user_type/user_type.py @@ -137,13 +137,10 @@ class UserType(Document): user.set("block_modules", block_modules) def add_role_permissions_for_user_doctypes(self): - perms = ["read", "write", "create", "submit", "cancel", "amend", "delete"] + perms = ["read", "write", "create", "submit", "cancel", "amend", "delete", "print", "email", "share"] for row in self.user_doctypes: docperm = add_role_permissions(row.document_type, self.role) - values = {perm: row.get(perm, default=0) for perm in perms} - for perm in ["print", "email", "share"]: - values[perm] = 1 frappe.db.set_value("Custom DocPerm", docperm, values) diff --git a/frappe/core/page/permission_manager/permission_manager.js b/frappe/core/page/permission_manager/permission_manager.js index 308bbfedba..0df30519e9 100644 --- a/frappe/core/page/permission_manager/permission_manager.js +++ b/frappe/core/page/permission_manager/permission_manager.js @@ -106,7 +106,7 @@ frappe.PermissionEngine = class PermissionEngine { reset_std_permissions(data) { let doctype = this.get_doctype(); - let d = frappe.confirm(__("Reset Permissions for {0}?", [doctype]), () => { + let d = frappe.confirm(__("Reset Permissions for {0}?", [__(doctype)]), () => { return frappe .call({ module: "frappe.core", @@ -122,7 +122,7 @@ frappe.PermissionEngine = class PermissionEngine { // show standard permissions let $d = $(d.wrapper) .find(".frappe-confirm-message") - .append("
Standard Permissions:

"); + .append(`
${__("Standard Permissions")}:

`); let $wrapper = $("

").appendTo($d); data.message.forEach((d) => { let rights = this.rights @@ -134,7 +134,7 @@ frappe.PermissionEngine = class PermissionEngine { d.rights = rights.join(", "); $wrapper.append(`
\ -
${d.role}, Level ${d.permlevel || 0}
\ +
${__(d.role)}, ${__("Level")} ${d.permlevel || 0}
\
${d.rights}
\

`); }); diff --git a/frappe/core/workspace/users/users.json b/frappe/core/workspace/users/users.json index 3899ad534b..a84facecff 100644 --- a/frappe/core/workspace/users/users.json +++ b/frappe/core/workspace/users/users.json @@ -103,6 +103,7 @@ "link_to": "Document Share Report", "link_type": "Report", "onboard": 0, + "report_ref_doctype": "DocShare", "type": "Link" }, { @@ -158,7 +159,7 @@ "type": "Link" } ], - "modified": "2024-01-02 15:39:13.811700", + "modified": "2024-08-03 13:14:36.129599", "modified_by": "Administrator", "module": "Core", "name": "Users", diff --git a/frappe/database/database.py b/frappe/database/database.py index 1edd61926d..c7ce29de6a 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -144,7 +144,7 @@ class Database: def _transform_query(self, query: Query, values: QueryValues) -> tuple: return query, values - def _transform_result(self, result: list[tuple]) -> list[tuple]: + def _transform_result(self, result: list[tuple] | tuple[tuple]) -> tuple[tuple]: return result def _clean_up(self): diff --git a/frappe/database/postgres/database.py b/frappe/database/postgres/database.py index 7bae004986..aa3f808a79 100644 --- a/frappe/database/postgres/database.py +++ b/frappe/database/postgres/database.py @@ -2,6 +2,7 @@ import re import psycopg2 import psycopg2.extensions +from psycopg2 import sql from psycopg2.errorcodes import ( CLASS_INTEGRITY_CONSTRAINT_VIOLATION, DEADLOCK_DETECTED, @@ -169,6 +170,15 @@ class PostgresDatabase(PostgresExceptionUtil, Database): def last_query(self): return LazyDecode(self._cursor.query) + @property + def db_schema(self): + return frappe.conf.get("db_schema", "public").replace("'", "").replace('"', "") + + def connect(self): + super().connect() + + self._cursor.execute("SET search_path TO %s", (self.db_schema,)) + def get_connection(self): conn_settings = { "dbname": self.cur_db_name, @@ -215,6 +225,9 @@ class PostgresDatabase(PostgresExceptionUtil, Database): ) return db_size[0].get("database_size") + def _transform_result(self, result: list[tuple] | tuple[tuple]) -> tuple[tuple]: + return tuple(result) if isinstance(result, list) else result + # pylint: disable=W0221 def sql(self, query, values=EmptyQueryValues, *args, **kwargs): return super().sql(modify_query(query), modify_values(values), *args, **kwargs) @@ -228,12 +241,34 @@ class PostgresDatabase(PostgresExceptionUtil, Database): for d in self.sql( """select table_name from information_schema.tables - where table_catalog='{}' + where table_catalog=%s and table_type = 'BASE TABLE' - and table_schema='{}'""".format(self.cur_db_name, frappe.conf.get("db_schema", "public")) + and table_schema=%s""", + (self.cur_db_name, self.db_schema), ) ] + def get_db_table_columns(self, table) -> list[str]: + """Returns list of column names from given table.""" + if (columns := frappe.cache.hget("table_columns", table)) is not None: + return columns + + information_schema = frappe.qb.Schema("information_schema") + + columns = ( + frappe.qb.from_(information_schema.columns) + .select(information_schema.columns.column_name) + .where( + (information_schema.columns.table_name == table) + & (information_schema.columns.table_schema == self.db_schema) + ) + .run(pluck=True) + ) + + frappe.cache.hset("table_columns", table, columns) + + return columns + def format_date(self, date): if not date: return "0001-01-01" @@ -260,7 +295,7 @@ class PostgresDatabase(PostgresExceptionUtil, Database): def describe(self, doctype: str) -> list | tuple: table_name = get_table_name(doctype) return self.sql( - f"SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_NAME = '{table_name}'" + f"SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_NAME = '{table_name}' and table_schema='{frappe.conf.get('db_schema', 'public')}'" ) def change_column_type( @@ -349,8 +384,10 @@ class PostgresDatabase(PostgresExceptionUtil, Database): def has_index(self, table_name, index_name): return self.sql( - f"""SELECT 1 FROM pg_indexes WHERE tablename='{table_name}' - and indexname='{index_name}' limit 1""" + """SELECT 1 FROM pg_indexes WHERE tablename=%s + and schemaname = %s + and indexname=%s limit 1""", + (table_name, self.db_schema, index_name), ) def add_index(self, doctype: str, fields: list, index_name: str | None = None): @@ -360,7 +397,9 @@ class PostgresDatabase(PostgresExceptionUtil, Database): index_name = index_name or self.get_index_name(fields) fields_str = '", "'.join(re.sub(r"\(.*\)", "", field) for field in fields) - self.sql_ddl(f'CREATE INDEX IF NOT EXISTS "{index_name}" ON `{table_name}` ("{fields_str}")') + self.sql_ddl( + f'CREATE INDEX IF NOT EXISTS "{index_name}" ON "{self.db_schema}"."{table_name}" ("{fields_str}")' + ) def add_unique(self, doctype, fields, constraint_name=None): if isinstance(fields, str): @@ -374,13 +413,24 @@ class PostgresDatabase(PostgresExceptionUtil, Database): FROM information_schema.TABLE_CONSTRAINTS WHERE table_name=%s AND constraint_type='UNIQUE' + AND constraint_schema=%s AND CONSTRAINT_NAME=%s""", - ("tab" + doctype, constraint_name), + ("tab" + doctype, self.db_schema, constraint_name), ): self.commit() + self.sql( - """ALTER TABLE `tab{}` - ADD CONSTRAINT {} UNIQUE ({})""".format(doctype, constraint_name, ", ".join(fields)) + sql.SQL( + """ALTER TABLE {schema}.{table} + ADD CONSTRAINT {constraint} UNIQUE ({fields})""" + ) + .format( + schema=sql.Identifier(self.db_schema), + table=sql.Identifier("tab" + doctype), + constraint=sql.Identifier(constraint_name), + fields=sql.SQL(", ").join(sql.Identifier(field) for field in fields), + ) + .as_string(self._conn) ) def get_table_columns_description(self, table_name): @@ -404,9 +454,10 @@ class PostgresDatabase(PostgresExceptionUtil, Database): indexdef LIKE '%UNIQUE INDEX%' AS unique, indexdef NOT LIKE '%UNIQUE INDEX%' AS index FROM pg_indexes - WHERE tablename='{table_name}') b + WHERE tablename='{table_name}' AND schemaname='{self.db_schema}') b ON SUBSTRING(b.indexdef, '(.*)') LIKE CONCAT('%', a.column_name, '%') WHERE a.table_name = '{table_name}' + AND a.table_schema = '{self.db_schema}' GROUP BY a.column_name, a.data_type, a.column_default, a.character_maximum_length, a.is_nullable; """, as_dict=1, @@ -423,6 +474,7 @@ class PostgresDatabase(PostgresExceptionUtil, Database): .where( (information_schema.columns.table_name == table) & (information_schema.columns.column_name == column) + & (information_schema.columns.table_schema == self.db_schema) ) .run(pluck=True)[0] ) diff --git a/frappe/desk/desktop.py b/frappe/desk/desktop.py index 71d29a2579..211820be28 100644 --- a/frappe/desk/desktop.py +++ b/frappe/desk/desktop.py @@ -3,7 +3,7 @@ # Author - Shivam Mishra from functools import wraps -from json import dumps, loads +from json import JSONDecodeError, dumps, loads import frappe from frappe import DoesNotExistError, ValidationError, _, _dict @@ -450,6 +450,14 @@ def get_workspace_sidebar_items(): pages = [] private_pages = [] + # get additional settings from Work Settings + try: + workspace_visibilty = loads( + frappe.db.get_single_value("Workspace Settings", "workspace_visibility_json") or "{}" + ) + except JSONDecodeError: + workspace_visibilty = {} + # Filter Page based on Permission for page in all_pages: try: @@ -460,6 +468,10 @@ def get_workspace_sidebar_items(): elif page.for_user == frappe.session.user: private_pages.append(page) page["label"] = _(page.get("name")) + + if page["name"] in workspace_visibilty: + page["visibility"] = workspace_visibilty[page["name"]] + except frappe.PermissionError: pass if private_pages: @@ -470,6 +482,9 @@ def get_workspace_sidebar_items(): pages[0]["label"] = _("Welcome Workspace") return { + "workspace_setup_completed": frappe.db.get_single_value( + "Workspace Settings", "workspace_setup_completed" + ), "pages": pages, "has_access": has_access, "has_create_access": frappe.has_permission(doctype="Workspace", ptype="create"), diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js index 31fb7e5167..e11d496d69 100644 --- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js +++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js @@ -397,7 +397,7 @@ frappe.ui.form.on("Dashboard Chart", { } } }, - primary_action_label: "Set", + primary_action_label: __("Set"), }); frappe.dashboards.filters_dialog = dialog; @@ -484,7 +484,7 @@ frappe.ui.form.on("Dashboard Chart", { } frm.trigger("set_dynamic_filters_in_table"); }, - primary_action_label: "Set", + primary_action_label: __("Set"), }); dialog.show(); diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.py b/frappe/desk/doctype/dashboard_chart/dashboard_chart.py index a425da5980..65836b2b2f 100644 --- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.py +++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.py @@ -279,6 +279,16 @@ def get_group_by_chart_config(chart, filters) -> dict | None: ignore_ifnull=True, ) + group_by_field_field = frappe.get_meta(doctype).get_field( + group_by_field + ) # get info about @group_by_field + + if data and group_by_field_field.fieldtype == "Link": # if @group_by_field is link + title_field = frappe.get_meta(group_by_field_field.options) # get title field + if title_field.title_field: # if has title_field + for item in data: # replace chart labels from name to title value + item.name = frappe.get_value(group_by_field_field.options, item.name, title_field.title_field) + if data: return { "labels": [item.get("name", "Not Specified") for item in data], diff --git a/frappe/desk/doctype/notification_log/notification_log.json b/frappe/desk/doctype/notification_log/notification_log.json index 49b16266b4..c3b3c09d92 100644 --- a/frappe/desk/doctype/notification_log/notification_log.json +++ b/frappe/desk/doctype/notification_log/notification_log.json @@ -40,7 +40,7 @@ "in_list_view": 1, "in_standard_filter": 1, "label": "Type", - "options": "Mention\nEnergy Point\nAssignment\nShare\nAlert" + "options": "\nMention\nEnergy Point\nAssignment\nShare\nAlert" }, { "fieldname": "email_content", @@ -103,7 +103,7 @@ "hide_toolbar": 1, "in_create": 1, "links": [], - "modified": "2024-03-23 16:03:31.715461", + "modified": "2024-08-03 09:38:10.497711", "modified_by": "Administrator", "module": "Desk", "name": "Notification Log", diff --git a/frappe/desk/doctype/notification_log/notification_log.py b/frappe/desk/doctype/notification_log/notification_log.py index 70f31606c1..499e4e27cd 100644 --- a/frappe/desk/doctype/notification_log/notification_log.py +++ b/frappe/desk/doctype/notification_log/notification_log.py @@ -28,7 +28,7 @@ class NotificationLog(Document): link: DF.Data | None read: DF.Check subject: DF.Text | None - type: DF.Literal["Mention", "Energy Point", "Assignment", "Share", "Alert"] + type: DF.Literal["", "Mention", "Energy Point", "Assignment", "Share", "Alert"] # end: auto-generated types def after_insert(self): @@ -93,6 +93,7 @@ def enqueue_create_notification(users: list[str] | str, doc: dict): doc=doc, users=users, now=frappe.flags.in_test, + enqueue_after_commit=not frappe.flags.in_test, ) diff --git a/frappe/desk/doctype/notification_settings/notification_settings.py b/frappe/desk/doctype/notification_settings/notification_settings.py index 41a6991d6f..691c03588d 100644 --- a/frappe/desk/doctype/notification_settings/notification_settings.py +++ b/frappe/desk/doctype/notification_settings/notification_settings.py @@ -59,9 +59,10 @@ def is_email_notifications_enabled_for_type(user, notification_type): return False fieldname = "enable_email_" + frappe.scrub(notification_type) - enabled = frappe.db.get_value("Notification Settings", user, fieldname) + enabled = frappe.db.get_value("Notification Settings", user, fieldname, ignore=True) if enabled is None: return True + return enabled diff --git a/frappe/desk/doctype/number_card/number_card.js b/frappe/desk/doctype/number_card/number_card.js index ef04ac5b3e..274ca76848 100644 --- a/frappe/desk/doctype/number_card/number_card.js +++ b/frappe/desk/doctype/number_card/number_card.js @@ -33,7 +33,7 @@ frappe.ui.form.on("Number Card", { }, create_add_to_dashboard_button: function (frm) { - frm.add_custom_button("Add Card to Dashboard", () => { + frm.add_custom_button(__("Add Card to Dashboard"), () => { const dialog = frappe.dashboard_utils.get_add_to_dashboard_dialog( frm.doc.name, "Number Card", @@ -292,7 +292,7 @@ frappe.ui.form.on("Number Card", { frm.trigger("render_filters_table"); } }, - primary_action_label: "Set", + primary_action_label: __("Set"), }); if (is_document_type) { @@ -384,7 +384,7 @@ frappe.ui.form.on("Number Card", { } frm.trigger("set_dynamic_filters_in_table"); }, - primary_action_label: "Set", + primary_action_label: __("Set"), }); dialog.show(); diff --git a/frappe/desk/doctype/system_health_report/system_health_report.py b/frappe/desk/doctype/system_health_report/system_health_report.py index 1f136d43b9..abdc1b0272 100644 --- a/frappe/desk/doctype/system_health_report/system_health_report.py +++ b/frappe/desk/doctype/system_health_report/system_health_report.py @@ -186,19 +186,40 @@ class SystemHealthReport(Document): # Exclude "maybe" curently executing job upper_threshold = add_to_date(None, minutes=-30, as_datetime=True) self.scheduler_status = get_scheduler_status().get("status") - failing_jobs = frappe.db.sql( - """ - select scheduled_job_type, - avg(CASE WHEN status != 'Complete' THEN 1 ELSE 0 END) * 100 as failure_rate - from `tabScheduled Job Log` - where - creation > %(lower_threshold)s - and modified > %(lower_threshold)s - and creation < %(upper_threshold)s - group by scheduled_job_type - having failure_rate > 0 - order by failure_rate desc - limit 5""", + + mariadb_query = """ + SELECT scheduled_job_type, + AVG(CASE WHEN status != 'Complete' THEN 1 ELSE 0 END) * 100 AS failure_rate + FROM `tabScheduled Job Log` + WHERE + creation > %(lower_threshold)s + AND modified > %(lower_threshold)s + AND creation < %(upper_threshold)s + GROUP BY scheduled_job_type + HAVING failure_rate > 0 + ORDER BY failure_rate DESC + LIMIT 5 + """ + + postgres_query = """ + SELECT scheduled_job_type, + AVG(CASE WHEN status != 'Complete' THEN 1 ELSE 0 END) * 100 AS "failure_rate" + FROM "tabScheduled Job Log" + WHERE + creation > %(lower_threshold)s + AND modified > %(lower_threshold)s + AND creation < %(upper_threshold)s + GROUP BY scheduled_job_type + HAVING AVG(CASE WHEN status != 'Complete' THEN 1 ELSE 0 END) * 100 > 0 + ORDER BY "failure_rate" DESC + LIMIT 5 + """ + + failing_jobs = frappe.db.multisql( + { + "mariadb": mariadb_query, + "postgres": postgres_query, + }, {"lower_threshold": lower_threshold, "upper_threshold": upper_threshold}, as_dict=True, ) diff --git a/frappe/desk/doctype/workspace/workspace.py b/frappe/desk/doctype/workspace/workspace.py index 273de542aa..1ea99d33f0 100644 --- a/frappe/desk/doctype/workspace/workspace.py +++ b/frappe/desk/doctype/workspace/workspace.py @@ -80,6 +80,10 @@ class Workspace(Document): except Exception: frappe.throw(_("Content data shoud be a list")) + for d in self.get("links"): + if d.link_type == "Report" and d.is_query_report != 1: + d.report_ref_doctype = frappe.get_value("Report", d.link_to, "ref_doctype") + def clear_cache(self): super().clear_cache() if self.for_user: diff --git a/frappe/desk/doctype/workspace_link/workspace_link.json b/frappe/desk/doctype/workspace_link/workspace_link.json index e11f606b0e..34575d21e5 100644 --- a/frappe/desk/doctype/workspace_link/workspace_link.json +++ b/frappe/desk/doctype/workspace_link/workspace_link.json @@ -13,6 +13,7 @@ "link_details_section", "link_type", "link_to", + "report_ref_doctype", "column_break_7", "dependencies", "only_for", @@ -116,12 +117,19 @@ "ignore_xss_filter": 1, "label": "Description", "max_height": "7rem" + }, + { + "fieldname": "report_ref_doctype", + "fieldtype": "Link", + "label": "Report Ref DocType", + "options": "DocType", + "read_only": 1 } ], "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2024-03-23 16:04:06.025772", + "modified": "2024-06-10 16:04:00.746903", "modified_by": "Administrator", "module": "Desk", "name": "Workspace Link", diff --git a/frappe/desk/doctype/workspace_link/workspace_link.py b/frappe/desk/doctype/workspace_link/workspace_link.py index 03da7abe47..d3f8b68965 100644 --- a/frappe/desk/doctype/workspace_link/workspace_link.py +++ b/frappe/desk/doctype/workspace_link/workspace_link.py @@ -28,6 +28,7 @@ class WorkspaceLink(Document): parent: DF.Data parentfield: DF.Data parenttype: DF.Data + report_ref_doctype: DF.Link | None type: DF.Literal["Link", "Card Break"] # end: auto-generated types diff --git a/frappe/desk/doctype/workspace_settings/__init__.py b/frappe/desk/doctype/workspace_settings/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/desk/doctype/workspace_settings/test_workspace_settings.py b/frappe/desk/doctype/workspace_settings/test_workspace_settings.py new file mode 100644 index 0000000000..fe639c4d1c --- /dev/null +++ b/frappe/desk/doctype/workspace_settings/test_workspace_settings.py @@ -0,0 +1,9 @@ +# Copyright (c) 2024, Frappe Technologies and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestWorkspaceSettings(FrappeTestCase): + pass diff --git a/frappe/desk/doctype/workspace_settings/workspace_settings.js b/frappe/desk/doctype/workspace_settings/workspace_settings.js new file mode 100644 index 0000000000..d1ba550205 --- /dev/null +++ b/frappe/desk/doctype/workspace_settings/workspace_settings.js @@ -0,0 +1,44 @@ +// Copyright (c) 2024, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on("Workspace Settings", { + setup(frm) { + frm.hide_full_form_button = true; + frm.docfields = []; + let workspace_visibilty = JSON.parse(frm.doc.workspace_visibility_json || "{}"); + + // build fields from workspaces + let cnt = 0, + column_added = false; + for (let w of frappe.boot.allowed_workspaces) { + if (w.public) { + cnt++; + frm.docfields.push({ + fieldtype: "Check", + fieldname: w.name, + label: w.title, + initial_value: workspace_visibilty[w.name] !== 0, // not set is also visible + }); + } + + if (cnt >= frappe.boot.allowed_workspaces.length / 2 && !column_added) { + // add column break to split into 2 columns + frm.docfields.push({ fieldtype: "Column Break" }); + column_added = true; + } + } + + frappe.temp = frm; + }, + validate(frm) { + frm.doc.workspace_visibility_json = JSON.stringify(frm.dialog.get_values()); + frm.doc.workspace_setup_completed = 1; + }, + after_save(frm) { + // reload page to show latest sidebar + window.location.reload(); + }, + refresh(frm) { + frm.dialog.set_alert(__("Select modules you want to see in the sidebar")); + }, +}); diff --git a/frappe/desk/doctype/workspace_settings/workspace_settings.json b/frappe/desk/doctype/workspace_settings/workspace_settings.json new file mode 100644 index 0000000000..d5a86559a5 --- /dev/null +++ b/frappe/desk/doctype/workspace_settings/workspace_settings.json @@ -0,0 +1,56 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2024-08-02 14:20:30.177818", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "select_workspaces_section", + "workspace_visibility_json", + "workspace_setup_completed" + ], + "fields": [ + { + "fieldname": "select_workspaces_section", + "fieldtype": "Section Break", + "label": "Select Workspaces" + }, + { + "fieldname": "workspace_visibility_json", + "fieldtype": "JSON", + "in_list_view": 1, + "label": "Workspace Visibility", + "reqd": 1 + }, + { + "default": "0", + "fieldname": "workspace_setup_completed", + "fieldtype": "Check", + "label": "Workspace Setup Completed" + } + ], + "index_web_pages_for_search": 1, + "issingle": 1, + "links": [], + "modified": "2024-08-03 19:34:16.757871", + "modified_by": "Administrator", + "module": "Desk", + "name": "Workspace Settings", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "print": 1, + "read": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "quick_entry": 1, + "sort_field": "creation", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/frappe/desk/doctype/workspace_settings/workspace_settings.py b/frappe/desk/doctype/workspace_settings/workspace_settings.py new file mode 100644 index 0000000000..7909a37c1e --- /dev/null +++ b/frappe/desk/doctype/workspace_settings/workspace_settings.py @@ -0,0 +1,21 @@ +# Copyright (c) 2024, Frappe Technologies and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class WorkspaceSettings(Document): + # begin: auto-generated types + # This code is auto-generated. Do not modify anything in this block. + + from typing import TYPE_CHECKING + + if TYPE_CHECKING: + from frappe.types import DF + + workspace_setup_completed: DF.Check + workspace_visibility_json: DF.JSON + # end: auto-generated types + + pass diff --git a/frappe/desk/form/linked_with.py b/frappe/desk/form/linked_with.py index 96c9cacd64..c68388aa70 100644 --- a/frappe/desk/form/linked_with.py +++ b/frappe/desk/form/linked_with.py @@ -421,99 +421,85 @@ def get_linked_docs(doctype: str, name: str, linkinfo: dict | None = None) -> di if not linkinfo: return results - for dt, link in linkinfo.items(): - filters = [] - link["doctype"] = dt - try: - link_meta_bundle = frappe.desk.form.load.get_meta_bundle(dt) - except Exception as e: - if isinstance(e, frappe.DoesNotExistError): - frappe.clear_last_message() + is_target_doctype_table = frappe.get_meta(doctype).istable + + for linked_doctype, link_context in linkinfo.items(): + linked_doctype_meta = frappe.get_meta(linked_doctype) + + if linked_doctype_meta.issingle: continue - linkmeta = link_meta_bundle[0] - if not linkmeta.get("issingle"): - fields = [ - d.fieldname - for d in linkmeta.get( - "fields", - { - "in_list_view": 1, - "fieldtype": ["not in", ("Image", "HTML", "Button", *frappe.model.table_fields)], - }, - ) - ] + ["name", "modified", "docstatus"] + filters = [] + ret = None + parent_info = None - if link.get("add_fields"): - fields += link["add_fields"] + fields = [ + d.fieldname + for d in linked_doctype_meta.get( + "fields", + { + "in_list_view": 1, + "fieldtype": ["not in", ("Image", "HTML", "Button", *frappe.model.table_fields)], + }, + ) + ] + ["name", "modified", "docstatus"] - fields = [f"`tab{dt}`.`{sf.strip()}`" for sf in fields if sf and "`tab" not in sf] + if add_fields := link_context.get("add_fields"): + fields += add_fields - try: - if link.get("filters"): - ret = frappe.get_all( - doctype=dt, fields=fields, filters=link.get("filters"), order_by=None - ) + fields = [f"`tab{linked_doctype}`.`{sf.strip()}`" for sf in fields if sf and "`tab" not in sf] - elif link.get("get_parent"): - ret = None - - # check for child table - if not frappe.get_meta(doctype).istable: - continue - - me = frappe.db.get_value( - doctype, name, ["parenttype", "parent"], as_dict=True, order_by=None - ) - if me and me.parenttype == dt: - ret = frappe.get_all( - doctype=dt, fields=fields, filters=[[dt, "name", "=", me.parent]], order_by=None - ) - - elif link.get("child_doctype"): - or_filters = [ - [link.get("child_doctype"), link_fieldnames, "=", name] - for link_fieldnames in link.get("fieldname") - ] - - # dynamic link - if link.get("doctype_fieldname"): - filters.append( - [link.get("child_doctype"), link.get("doctype_fieldname"), "=", doctype] - ) - - ret = frappe.get_all( - doctype=dt, - fields=fields, - filters=filters, - or_filters=or_filters, - distinct=True, - order_by=None, - ) - - else: - link_fieldnames = link.get("fieldname") - if link_fieldnames: - if isinstance(link_fieldnames, str): - link_fieldnames = [link_fieldnames] - or_filters = [[dt, fieldname, "=", name] for fieldname in link_fieldnames] - # dynamic link - if link.get("doctype_fieldname"): - filters.append([dt, link.get("doctype_fieldname"), "=", doctype]) - ret = frappe.get_all( - doctype=dt, fields=fields, filters=filters, or_filters=or_filters, order_by=None - ) - - else: - ret = None - - except frappe.PermissionError: - frappe.clear_last_message() + if filters_ctx := link_context.get("filters"): + ret = frappe.get_list(doctype=linked_doctype, fields=fields, filters=filters_ctx, order_by=None) + elif link_context.get("get_parent"): + # check for child table + if not is_target_doctype_table: continue - if ret: - results[dt] = ret + parent_info = parent_info or frappe.db.get_value( + doctype, name, ["parenttype", "parent"], as_dict=True, order_by=None + ) + + if parent_info and parent_info.parenttype == linked_doctype: + ret = frappe.get_list( + doctype=linked_doctype, + fields=fields, + filters=[[linked_doctype, "name", "=", parent_info.parent]], + order_by=None, + ) + + elif child_doctype := link_context.get("child_doctype"): + or_filters = [ + [child_doctype, link_fieldnames, "=", name] for link_fieldnames in link_context["fieldname"] + ] + + # dynamic link_context + if doctype_fieldname := link_context.get("doctype_fieldname"): + filters.append([child_doctype, doctype_fieldname, "=", doctype]) + + ret = frappe.get_list( + doctype=linked_doctype, + fields=fields, + filters=filters, + or_filters=or_filters, + distinct=True, + order_by=None, + ) + + elif link_fieldnames := link_context.get("fieldname"): + if isinstance(link_fieldnames, str): + link_fieldnames = [link_fieldnames] + or_filters = [[linked_doctype, fieldname, "=", name] for fieldname in link_fieldnames] + # dynamic link_context + if doctype_fieldname := link_context.get("doctype_fieldname"): + filters.append([linked_doctype, doctype_fieldname, "=", doctype]) + ret = frappe.get_list( + doctype=linked_doctype, fields=fields, filters=filters, or_filters=or_filters, order_by=None + ) + + if ret: + results[linked_doctype] = ret return results diff --git a/frappe/desk/form/load.py b/frappe/desk/form/load.py index 9b01c8ecee..4400f077a5 100644 --- a/frappe/desk/form/load.py +++ b/frappe/desk/form/load.py @@ -3,7 +3,7 @@ import json import typing -from urllib.parse import quote +from urllib.parse import quote_plus import frappe import frappe.defaults @@ -38,7 +38,7 @@ def getdoc(doctype, name, user=None): if not doc.has_permission("read"): frappe.flags.error_message = _("Insufficient Permission for {0}").format( - frappe.bold(doctype + " " + name) + frappe.bold(_(doctype) + " " + name) ) raise frappe.PermissionError(("read", doctype, name)) @@ -384,7 +384,7 @@ def get_document_email(doctype, name): return None email = email.split("@") - return f"{email[0]}+{quote(doctype)}={quote(cstr(name))}@{email[1]}" + return f"{email[0]}+{quote_plus(doctype)}={quote_plus(cstr(name))}@{email[1]}" def get_automatic_email_link(): diff --git a/frappe/desk/page/user_profile/user_profile_controller.js b/frappe/desk/page/user_profile/user_profile_controller.js index fd38f09ddd..abf0bea297 100644 --- a/frappe/desk/page/user_profile/user_profile_controller.js +++ b/frappe/desk/page/user_profile/user_profile_controller.js @@ -77,7 +77,7 @@ class UserProfile { render_heatmap() { this.heatmap = new frappe.Chart(".performance-heatmap", { type: "heatmap", - countLabel: "Energy Points", + countLabel: __("Energy Points"), data: {}, discreteDomains: 1, radius: 3, @@ -111,7 +111,7 @@ class UserProfile { value_based_on: "points", chart_type: "Sum", document_type: "Energy Point Log", - name: "Energy Points", + name: __("Energy Points"), width: "half", based_on: "creation", }; 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 a6ceb08077..991f83bbd5 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.js +++ b/frappe/email/doctype/auto_email_report/auto_email_report.js @@ -71,6 +71,9 @@ frappe.ui.form.on("Auto Email Report", { } }, show_filters: async function (frm) { + if (!frm.doc.report) { + return; + } var wrapper = $(frm.get_field("filters_display").wrapper); wrapper.empty(); let reference_report = frappe.query_reports[frm.doc.report]; diff --git a/frappe/email/doctype/email_account/email_account.js b/frappe/email/doctype/email_account/email_account.js index 23fcca58f5..f76a175b24 100644 --- a/frappe/email/doctype/email_account/email_account.js +++ b/frappe/email/doctype/email_account/email_account.js @@ -1,4 +1,24 @@ frappe.email_defaults = { + "Frappe Mail": { + domain: null, + password: null, + awaiting_password: 0, + ascii_encode_password: 0, + login_id_is_different: 0, + login_id: null, + use_imap: 0, + use_ssl: 0, + validate_ssl_certificate: 0, + use_starttls: 0, + email_server: null, + incoming_port: 0, + always_use_account_email_id_as_sender: 1, + use_tls: 0, + use_ssl_for_outgoing: 0, + smtp_server: null, + smtp_port: null, + no_smtp_authentication: 0, + }, GMail: { email_server: "imap.gmail.com", incoming_port: 993, @@ -144,11 +164,11 @@ frappe.ui.form.on("Email Account", { frm.refresh_field("imap_folder"); } set_default_max_attachment_size(frm); - frm.events.show_oauth_authorization_message(frm); }, refresh: function (frm) { frm.events.enable_incoming(frm); + frm.events.show_oauth_authorization_message(frm); if (frappe.route_flags.delete_user_from_locals && frappe.route_flags.linked_user) { delete frappe.route_flags.delete_user_from_locals; @@ -175,8 +195,21 @@ frappe.ui.form.on("Email Account", { oauth_access(frm); }, + validate_frappe_mail_settings: function (frm) { + if (frm.doc.service == "Frappe Mail") { + frappe.call({ + doc: frm.doc, + method: "validate_frappe_mail_settings", + }); + } + }, + show_oauth_authorization_message(frm) { - if (frm.doc.auth_method === "OAuth" && frm.doc.connected_app) { + if ( + frm.doc.auth_method === "OAuth" && + frm.doc.connected_app && + !frm.doc.backend_app_flow + ) { frappe.call({ method: "frappe.integrations.doctype.connected_app.connected_app.has_token", args: { diff --git a/frappe/email/doctype/email_account/email_account.json b/frappe/email/doctype/email_account/email_account.json index 5ddaed911d..cca7cc7165 100644 --- a/frappe/email/doctype/email_account/email_account.json +++ b/frappe/email/doctype/email_account/email_account.json @@ -2,7 +2,7 @@ "actions": [], "allow_rename": 1, "autoname": "field:email_account_name", - "creation": "2014-09-11 12:04:34.163728", + "creation": "2024-06-11 16:39:01.323289", "doctype": "DocType", "document_type": "Setup", "engine": "InnoDB", @@ -13,22 +13,31 @@ "enable_incoming", "enable_outgoing", "column_break_3", - "domain", "service", + "domain", + "frappe_mail_site", "authentication_column", "auth_method", + "backend_app_flow", "authorize_api_access", + "validate_frappe_mail_settings", "password", "awaiting_password", "ascii_encode_password", "column_break_10", + "api_key", + "api_secret", "connected_app", "connected_user", "login_id_is_different", "login_id", "incoming_popimap_tab", - "mailbox_settings", + "section_break_uc6h", "default_incoming", + "column_break_uynb", + "attachment_limit", + "last_synced_at", + "mailbox_settings", "use_imap", "use_ssl", "validate_ssl_certificate", @@ -36,7 +45,6 @@ "email_server", "incoming_port", "column_break_18", - "attachment_limit", "email_sync_option", "initial_sync_count", "section_break_25", @@ -50,19 +58,19 @@ "notify_if_unreplied", "unreplied_for_mins", "send_notification_to", - "outgoing_smtp_tab", + "outgoing_tab", + "default_outgoing", + "column_break_h5pd", + "always_use_account_email_id_as_sender", + "always_use_account_name_as_sender_name", + "send_unsubscribe_message", + "track_email_status", "outgoing_mail_settings", - "column_break_bidn", "use_tls", "use_ssl_for_outgoing", "smtp_server", "smtp_port", "column_break_38", - "default_outgoing", - "always_use_account_email_id_as_sender", - "always_use_account_name_as_sender_name", - "send_unsubscribe_message", - "track_email_status", "no_smtp_authentication", "signature_section", "add_signature", @@ -92,6 +100,7 @@ }, { "default": "0", + "depends_on": "eval: doc.service != \"Frappe Mail\" && !doc.backend_app_flow", "fieldname": "login_id_is_different", "fieldtype": "Check", "hide_days": 1, @@ -107,7 +116,7 @@ "label": "Alternative Email ID" }, { - "depends_on": "eval: doc.auth_method === \"Basic\"", + "depends_on": "eval: doc.auth_method === \"Basic\" && doc.service != \"Frappe Mail\"", "fieldname": "password", "fieldtype": "Password", "hide_days": 1, @@ -116,7 +125,7 @@ }, { "default": "0", - "depends_on": "eval: doc.auth_method === \"Basic\"", + "depends_on": "eval: doc.auth_method === \"Basic\" && doc.service != \"Frappe Mail\"", "fieldname": "awaiting_password", "fieldtype": "Check", "hide_days": 1, @@ -125,7 +134,7 @@ }, { "default": "0", - "depends_on": "eval: doc.auth_method === \"Basic\"", + "depends_on": "eval: doc.auth_method === \"Basic\" && doc.service != \"Frappe Mail\"", "fieldname": "ascii_encode_password", "fieldtype": "Check", "hide_days": 1, @@ -159,9 +168,10 @@ "hide_days": 1, "hide_seconds": 1, "label": "Service", - "options": "\nGMail\nSendgrid\nSparkPost\nYahoo Mail\nOutlook.com\nYandex.Mail" + "options": "\nFrappe Mail\nGMail\nSendgrid\nSparkPost\nYahoo Mail\nOutlook.com\nYandex.Mail" }, { + "depends_on": "eval: doc.service != \"Frappe Mail\"", "fieldname": "mailbox_settings", "fieldtype": "Section Break", "hide_days": 1, @@ -289,6 +299,7 @@ "mandatory_depends_on": "notify_if_unreplied" }, { + "depends_on": "eval: doc.service != \"Frappe Mail\"", "fieldname": "outgoing_mail_settings", "fieldtype": "Section Break", "hide_days": 1, @@ -571,7 +582,7 @@ "label": "IMAP Details" }, { - "depends_on": "eval: doc.auth_method === \"OAuth\" && doc.connected_app && doc.connected_user", + "depends_on": "eval: doc.auth_method === \"OAuth\" && doc.connected_app && doc.connected_user && !doc.backend_app_flow", "fieldname": "authorize_api_access", "fieldtype": "Button", "label": "Authorize API Access" @@ -600,11 +611,11 @@ "options": "Connected App" }, { - "depends_on": "eval: doc.auth_method === \"OAuth\"", + "depends_on": "eval: doc.auth_method === \"OAuth\" && !doc.backend_app_flow", "fieldname": "connected_user", "fieldtype": "Link", "label": "Connected User", - "mandatory_depends_on": "eval: doc.auth_method === \"OAuth\"", + "mandatory_depends_on": "eval: doc.auth_method === \"OAuth\" && !doc.backend_app_flow", "options": "User" }, { @@ -621,23 +632,72 @@ "depends_on": "enable_incoming", "fieldname": "incoming_popimap_tab", "fieldtype": "Tab Break", - "label": "Incoming (POP/IMAP)" + "label": "Incoming" + }, + { + "default": "https://frappemail.com", + "depends_on": "eval: doc.service == \"Frappe Mail\"", + "fieldname": "frappe_mail_site", + "fieldtype": "Data", + "label": "Frappe Mail Site", + "mandatory_depends_on": "eval: doc.service == \"Frappe Mail\"" }, { "depends_on": "enable_outgoing", - "fieldname": "outgoing_smtp_tab", + "fieldname": "outgoing_tab", "fieldtype": "Tab Break", - "label": "Outgoing (SMTP)" + "label": "Outgoing" }, { - "fieldname": "column_break_bidn", + "fieldname": "column_break_h5pd", "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_uc6h", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_uynb", + "fieldtype": "Column Break" + }, + { + "depends_on": "eval: doc.service == \"Frappe Mail\"", + "fieldname": "last_synced_at", + "fieldtype": "Datetime", + "label": "Last Synced At" + }, + { + "depends_on": "eval: (doc.service == \"Frappe Mail\" && doc.auth_method != \"Basic\" && !doc.__islocal && !doc.__unsaved)", + "fieldname": "validate_frappe_mail_settings", + "fieldtype": "Button", + "label": "Validate Frappe Mail Settings" + }, + { + "depends_on": "eval: doc.service == \"Frappe Mail\" && doc.auth_method == \"Basic\"", + "fieldname": "api_key", + "fieldtype": "Data", + "label": "API Key", + "mandatory_depends_on": "eval: doc.service == \"Frappe Mail\" && doc.auth_method == \"Basic\"" + }, + { + "depends_on": "eval: doc.service == \"Frappe Mail\" && doc.auth_method == \"Basic\"", + "fieldname": "api_secret", + "fieldtype": "Password", + "label": "API Secret", + "mandatory_depends_on": "eval: doc.service == \"Frappe Mail\" && doc.auth_method == \"Basic\"" + }, + { + "default": "0", + "depends_on": "eval: doc.auth_method === \"OAuth\"", + "fieldname": "backend_app_flow", + "fieldtype": "Check", + "label": "Authenticate as Service Principal" } ], "icon": "fa fa-inbox", "index_web_pages_for_search": 1, "links": [], - "modified": "2024-04-17 14:46:38.836631", + "modified": "2024-07-18 11:05:57.193762", "modified_by": "Administrator", "module": "Email", "name": "Email Account", diff --git a/frappe/email/doctype/email_account/email_account.py b/frappe/email/doctype/email_account/email_account.py index 78c886fc80..b90c672d0e 100755 --- a/frappe/email/doctype/email_account/email_account.py +++ b/frappe/email/doctype/email_account/email_account.py @@ -12,6 +12,7 @@ import frappe from frappe import _, are_emails_muted, safe_encode from frappe.desk.form import assign_to from frappe.email.doctype.email_domain.email_domain import EMAIL_DOMAIN_FIELDS +from frappe.email.frappemail import FrappeMail from frappe.email.receive import EmailServer, InboundMail, SentEmailInInboxError from frappe.email.smtp import SMTPServer from frappe.email.utils import get_port @@ -61,6 +62,8 @@ class EmailAccount(Document): add_signature: DF.Check always_use_account_email_id_as_sender: DF.Check always_use_account_name_as_sender_name: DF.Check + api_key: DF.Data | None + api_secret: DF.Password | None append_emails_to_sent_folder: DF.Check append_to: DF.Link | None ascii_encode_password: DF.Check @@ -68,6 +71,7 @@ class EmailAccount(Document): auth_method: DF.Literal["Basic", "OAuth"] auto_reply_message: DF.TextEditor | None awaiting_password: DF.Check + backend_app_flow: DF.Check brand_logo: DF.AttachImage | None connected_app: DF.Link | None connected_user: DF.Link | None @@ -84,9 +88,11 @@ class EmailAccount(Document): enable_incoming: DF.Check enable_outgoing: DF.Check footer: DF.TextEditor | None + frappe_mail_site: DF.Data | None imap_folder: DF.Table[IMAPFolder] incoming_port: DF.Data | None initial_sync_count: DF.Literal["100", "250", "500"] + last_synced_at: DF.Datetime | None login_id: DF.Data | None login_id_is_different: DF.Check no_failed: DF.Int @@ -96,13 +102,7 @@ class EmailAccount(Document): send_notification_to: DF.SmallText | None send_unsubscribe_message: DF.Check service: DF.Literal[ - "", - "GMail", - "Sendgrid", - "SparkPost", - "Yahoo Mail", - "Outlook.com", - "Yandex.Mail", + "", "Frappe Mail", "GMail", "Sendgrid", "SparkPost", "Yahoo Mail", "Outlook.com", "Yandex.Mail" ] signature: DF.TextEditor | None smtp_port: DF.Data | None @@ -142,6 +142,13 @@ class EmailAccount(Document): else: self.login_id = None + if self.service == "Frappe Mail": + self.use_imap = 0 + self.always_use_account_email_id_as_sender = 1 + + if self.auth_method == "Basic" or self.get_oauth_token(): + self.validate_frappe_mail_settings() + # validate the imap settings if self.enable_incoming and self.use_imap and len(self.imap_folder) <= 0: frappe.throw(_("You need to set one IMAP folder for {0}").format(frappe.bold(self.email_id))) @@ -158,7 +165,11 @@ class EmailAccount(Document): self.awaiting_password = 0 self.password = None - if not frappe.local.flags.in_install and not self.awaiting_password: + if ( + not frappe.local.flags.in_install + and not self.awaiting_password + and not self.service == "Frappe Mail" + ): if validate_oauth or self.password or self.smtp_server in ("127.0.0.1", "localhost"): if self.enable_incoming: self.get_incoming_server() @@ -184,6 +195,12 @@ class EmailAccount(Document): if folder.append_to not in valid_doctypes: frappe.throw(_("Append To can be one of {0}").format(comma_or(valid_doctypes))) + @frappe.whitelist() + def validate_frappe_mail_settings(self): + if self.service == "Frappe Mail": + frappe_mail_client = self.get_frappe_mail_client() + frappe_mail_client.validate(for_inbound=self.enable_incoming, for_outbound=self.enable_outgoing) + def validate_smtp_conn(self): if not self.smtp_server: frappe.throw(_("SMTP Server is required")) @@ -476,9 +493,11 @@ class EmailAccount(Document): return account_details - def sendmail_config(self): + def get_access_token(self) -> str | None: oauth_token = self.get_oauth_token() + return oauth_token.get_password("access_token") if oauth_token else None + def sendmail_config(self): return { "email_account": self.name, "server": self.smtp_server, @@ -488,7 +507,7 @@ class EmailAccount(Document): "use_ssl": cint(self.use_ssl_for_outgoing), "use_tls": cint(self.use_tls), "use_oauth": self.auth_method == "OAuth", - "access_token": oauth_token.get_password("access_token") if oauth_token else None, + "access_token": self.get_access_token(), } def get_smtp_server(self): @@ -504,6 +523,26 @@ class EmailAccount(Document): config = self.sendmail_config() return SMTPServer(**config) + def get_frappe_mail_client(self): + return self._frappe_mail_client + + @functools.cached_property + def _frappe_mail_client(self): + if self.auth_method == "OAuth": + if access_token := self.get_access_token(): + return FrappeMail(self.frappe_mail_site, self.email_id, access_token=access_token) + + frappe.throw( + _("Please Authorize OAuth for Email Account {0}").format( + frappe.bold(self.email_account_name) + ), + title=_("Frappe Mail OAuth Error"), + ) + else: + return FrappeMail( + self.frappe_mail_site, self.email_id, self.api_key, self.get_password("api_secret") + ) + def remove_unpicklable_values(self, state): super().remove_unpicklable_values(state) state.pop("_smtp_server_instance", None) @@ -561,10 +600,15 @@ class EmailAccount(Document): frappe.db.rollback() except Exception: frappe.db.rollback() - self.log_error(title="EmailAccount.receive") - if self.use_imap: - self.handle_bad_emails(mail.uid, mail.raw_message, frappe.get_traceback()) - exceptions.append(frappe.get_traceback()) + try: + self.log_error(title="EmailAccount.receive") + if self.use_imap: + self.handle_bad_emails(mail.uid, mail.raw_message, frappe.get_traceback()) + exceptions.append(frappe.get_traceback()) + except Exception: + frappe.db.rollback() + else: + frappe.db.commit() else: frappe.db.commit() @@ -594,25 +638,33 @@ class EmailAccount(Document): if not self.enable_incoming: return [] - email_sync_rule = self.build_email_sync_rule() try: - email_server = self.get_incoming_server(in_receive=True, email_sync_rule=email_sync_rule) - if self.use_imap: - # process all given imap folder - for folder in self.imap_folder: - if email_server.select_imap_folder(folder.folder_name): - email_server.settings["uid_validity"] = folder.uidvalidity - messages = email_server.get_messages(folder=f'"{folder.folder_name}"') or {} - process_mail(messages, folder.append_to) - else: - # process the pop3 account - messages = email_server.get_messages() or {} + if self.service == "Frappe Mail": + frappe_mail_client = self.get_frappe_mail_client() + messages = frappe_mail_client.pull_raw(last_synced_at=self.last_synced_at) process_mail(messages) - # close connection to mailserver - email_server.logout() + self.db_set("last_synced_at", messages["last_synced_at"], update_modified=False) + else: + email_sync_rule = self.build_email_sync_rule() + email_server = self.get_incoming_server(in_receive=True, email_sync_rule=email_sync_rule) + if self.use_imap: + # process all given imap folder + for folder in self.imap_folder: + if email_server.select_imap_folder(folder.folder_name): + email_server.settings["uid_validity"] = folder.uidvalidity + messages = email_server.get_messages(folder=f'"{folder.folder_name}"') or {} + process_mail(messages, folder.append_to) + else: + # process the pop3 account + messages = email_server.get_messages() or {} + process_mail(messages) + + # close connection to mailserver + email_server.logout() except Exception: self.log_error(title=_("Error while connecting to email account {0}").format(self.name)) return [] + return mails def handle_bad_emails(self, uid, raw, reason): @@ -729,7 +781,12 @@ class EmailAccount(Document): def get_oauth_token(self): if self.auth_method == "OAuth": connected_app = frappe.get_doc("Connected App", self.connected_app) - return connected_app.get_active_token(self.connected_user) + if self.backend_app_flow: + token = connected_app.get_backend_app_token() + else: + token = connected_app.get_active_token(self.connected_user) + + return token @frappe.whitelist() @@ -828,8 +885,10 @@ def pull(now=False): ) for email_account in email_accounts: - if email_account.auth_method == "OAuth" and not has_token( - email_account.connected_app, email_account.connected_user + if ( + email_account.auth_method == "OAuth" + and not email_account.backend_app_flow + and not has_token(email_account.connected_app, email_account.connected_user) ): # don't try to pull from accounts which dont have access token (for Oauth) continue diff --git a/frappe/email/doctype/email_queue/email_queue.py b/frappe/email/doctype/email_queue/email_queue.py index bb568b2658..8f02a6e5f2 100644 --- a/frappe/email/doctype/email_queue/email_queue.py +++ b/frappe/email/doctype/email_queue/email_queue.py @@ -14,6 +14,7 @@ from frappe.core.utils import html2text from frappe.database.database import savepoint from frappe.email.doctype.email_account.email_account import EmailAccount from frappe.email.email_body import add_attachment, get_email, get_formatted_html +from frappe.email.frappemail import FrappeMail from frappe.email.queue import get_unsubcribed_url, get_unsubscribe_message from frappe.email.smtp import SMTPServer from frappe.model.document import Document @@ -153,13 +154,13 @@ class EmailQueue(Document): return True - def send(self, smtp_server_instance: SMTPServer = None): + def send(self, smtp_server_instance: SMTPServer = None, frappe_mail_client: FrappeMail = None): """Send emails to recipients.""" if not self.can_send_now(): return - with SendMailContext(self, smtp_server_instance) as ctx: - ctx.fetch_smtp_server() + with SendMailContext(self, smtp_server_instance, frappe_mail_client) as ctx: + ctx.fetch_outgoing_server() message = None for recipient in self.recipients: if recipient.is_mail_sent(): @@ -168,8 +169,21 @@ class EmailQueue(Document): message = ctx.build_message(recipient.recipient) if method := get_hook_method("override_email_send"): method(self, self.sender, recipient.recipient, message) - else: - if not frappe.flags.in_test or frappe.flags.testing_email: + elif not frappe.flags.in_test or frappe.flags.testing_email: + if ctx.email_account_doc.service == "Frappe Mail": + if self.reference_doctype == "Newsletter": + ctx.frappe_mail_client.send_newsletter( + sender=self.sender, + recipients=recipient.recipient, + message=message.decode("utf-8"), + ) + else: + ctx.frappe_mail_client.send_raw( + sender=self.sender, + recipients=recipient.recipient, + message=message.decode("utf-8"), + ) + else: ctx.smtp_server.session.sendmail( from_addr=self.sender, to_addrs=recipient.recipient, @@ -231,17 +245,23 @@ class SendMailContext: self, queue_doc: Document, smtp_server_instance: SMTPServer = None, + frappe_mail_client: FrappeMail = None, ): self.queue_doc: EmailQueue = queue_doc self.smtp_server: SMTPServer = smtp_server_instance + self.frappe_mail_client: FrappeMail = frappe_mail_client self.sent_to_atleast_one_recipient = any( rec.recipient for rec in self.queue_doc.recipients if rec.is_mail_sent() ) self.email_account_doc = None - def fetch_smtp_server(self): + def fetch_outgoing_server(self): self.email_account_doc = self.queue_doc.get_email_account(raise_error=True) - if not self.smtp_server: + + if self.email_account_doc.service == "Frappe Mail": + if not self.frappe_mail_client: + self.frappe_mail_client = self.email_account_doc.get_frappe_mail_client() + elif not self.smtp_server: self.smtp_server = self.email_account_doc.get_smtp_server() def __enter__(self): @@ -751,18 +771,24 @@ class QueueBuilder: def send_emails(self, queue_data, final_recipients): # This is used to bulk send emails from same sender to multiple recipients separately # This re-uses smtp server instance to minimize the cost of new session creation + frappe_mail_client = None smtp_server_instance = None for r in final_recipients: recipients = list(set([r, *self.final_cc(), *self.bcc])) q = EmailQueue.new({**queue_data, **{"recipients": recipients}}, ignore_permissions=True) - if not smtp_server_instance: + if not frappe_mail_client and not smtp_server_instance: email_account = q.get_email_account(raise_error=True) - smtp_server_instance = email_account.get_smtp_server() + + if email_account.service == "Frappe Mail": + frappe_mail_client = email_account.get_frappe_mail_client() + else: + smtp_server_instance = email_account.get_smtp_server() with suppress(Exception): - q.send(smtp_server_instance=smtp_server_instance) + q.send(smtp_server_instance=smtp_server_instance, frappe_mail_client=frappe_mail_client) - smtp_server_instance.quit() + if smtp_server_instance: + smtp_server_instance.quit() def as_dict(self, include_recipients=True): email_account = self.get_outgoing_email_account() diff --git a/frappe/email/doctype/newsletter/newsletter.py b/frappe/email/doctype/newsletter/newsletter.py index 45d5c35d99..5b39a00d7e 100644 --- a/frappe/email/doctype/newsletter/newsletter.py +++ b/frappe/email/doctype/newsletter/newsletter.py @@ -439,7 +439,11 @@ def newsletter_email_read(recipient_email=None, reference_doctype=None, referenc ).run() except Exception: - doc.log_error(f"Unable to mark as viewed for {recipient_email}") + frappe.log_error( + title=f"Unable to mark as viewed for {recipient_email}", + reference_doctype="Newsletter", + reference_name=reference_name, + ) finally: frappe.response.update(frappe.utils.get_imaginary_pixel_response()) diff --git a/frappe/email/doctype/notification/notification.js b/frappe/email/doctype/notification/notification.js index b88d10ea0d..c11a0ec3a3 100644 --- a/frappe/email/doctype/notification/notification.js +++ b/frappe/email/doctype/notification/notification.js @@ -1,6 +1,8 @@ // Copyright (c) 2018, Frappe Technologies and contributors // For license information, please see license.txt +const DATE_BASED_EVENTS = ["Days Before", "Days After"]; + frappe.notification = { setup_fieldname_select: function (frm) { // get the doctype to update fields @@ -12,10 +14,11 @@ frappe.notification = { 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 path = parent_field ? parent_field + " > " + df.fieldname : df.fieldname; return { value: select_value, - label: df.fieldname + " (" + __(df.label, null, df.parent) + ")", + label: path + " (" + __(df.label, null, df.parent) + ")", }; }; @@ -31,6 +34,38 @@ frappe.notification = { { value: "modified", label: `modified (${__("Last Modified Date")})` }, ]); }; + let get_receiver_fields = function ( + fields, + is_extra_receiver_field = (_) => { + return false; + } + ) { + // finds receiver fields from the fields or any child table + // by default finds any link to the User doctype + // however an additional optional predicate can be passed as argument + // to find additional fields + let is_receiver_field = function (df) { + return ( + is_extra_receiver_field(df) || + (df.options == "User" && df.fieldtype == "Link") || + (df.options == "Customer" && df.fieldtype == "Link") + ); + }; + let extract_receiver_field = function (df) { + // Add recipients from child doctypes into select dropdown + if (frappe.model.table_fields.includes(df.fieldtype)) { + let child_fields = frappe.get_doc("DocType", df.options).fields; + return $.map(child_fields, function (cdf) { + return is_receiver_field(cdf) + ? get_select_options(cdf, df.fieldname) + : null; + }); + } else { + return is_receiver_field(df) ? get_select_options(df) : null; + } + }; + return $.map(fields, extract_receiver_field); + }; let fields = frappe.get_doc("DocType", frm.doc.document_type).fields; let options = $.map(fields, function (d) { @@ -48,27 +83,12 @@ frappe.notification = { let receiver_fields = []; if (frm.doc.channel === "Email") { - receiver_fields = $.map(fields, function (d) { - // Add User and Email fields from child into select dropdown - if (frappe.model.table_fields.includes(d.fieldtype)) { - 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 - } else { - return d.options == "Email" || - (d.options == "User" && d.fieldtype == "Link") - ? get_select_options(d) - : null; - } + receiver_fields = get_receiver_fields(fields, function (df) { + return df.options == "Email"; }); } else if (["WhatsApp", "SMS"].includes(frm.doc.channel)) { - receiver_fields = $.map(fields, function (d) { - return d.options == "Phone" ? get_select_options(d) : null; + receiver_fields = get_receiver_fields(fields, function (df) { + df.options == "Phone" || df.options == "Mobile"; }); } @@ -129,6 +149,8 @@ Last comment: {{ comments[-1].comment }} by {{ comments[-1].by }} frappe.ui.form.on("Notification", { onload: function (frm) { frm.set_query("document_type", function () { + if (DATE_BASED_EVENTS.includes(frm.doc.event)) return; + return { filters: { istable: 0, @@ -157,6 +179,25 @@ frappe.ui.form.on("Notification", { }); frm.get_field("is_standard").toggle(frappe.boot.developer_mode); frm.trigger("event"); + if (frm.doc.document_type) { + frm.add_custom_button(__("Preview"), () => { + const args = { + doc: frm.doc, + doctype: frm.doc.document_type, + preview_fields: [ + { + label: __("Meets Condition?"), + fieldtype: "Data", + method: "preview_meets_condition", + }, + { label: __("Subject"), fieldtype: "Data", method: "preview_subject" }, + { label: __("Message"), fieldtype: "Code", method: "preview_message" }, + ], + }; + let dialog = new frappe.views.RenderPreviewer(args); + return dialog; + }); + } }, document_type: function (frm) { frappe.notification.setup_fieldname_select(frm); @@ -166,23 +207,23 @@ frappe.ui.form.on("Notification", { frappe.set_route("Form", "Customize Form"); }, event: function (frm) { - if (["Days Before", "Days After"].includes(frm.doc.event)) { - frm.add_custom_button(__("Get Alerts for Today"), function () { - frappe.call({ - method: "frappe.email.doctype.notification.notification.get_documents_for_today", - args: { - notification: frm.doc.name, - }, - callback: function (r) { - if (r.message && r.message.length > 0) { - frappe.msgprint(r.message.toString()); - } else { - frappe.msgprint(__("No alerts for today")); - } - }, - }); + if (!DATE_BASED_EVENTS.includes(frm.doc.event) || frm.is_new()) return; + + frm.add_custom_button(__("Get Alerts for Today"), function () { + frappe.call({ + method: "frappe.email.doctype.notification.notification.get_documents_for_today", + args: { + notification: frm.doc.name, + }, + callback: function (r) { + if (r.message && r.message.length > 0) { + frappe.msgprint(r.message.toString()); + } else { + frappe.msgprint(__("No alerts for today")); + } + }, }); - } + }); }, channel: function (frm) { frm.toggle_reqd("recipients", frm.doc.channel == "Email"); diff --git a/frappe/email/doctype/notification/notification.json b/frappe/email/doctype/notification/notification.json index b50c8d8468..c05ea05b01 100644 --- a/frappe/email/doctype/notification/notification.json +++ b/frappe/email/doctype/notification/notification.json @@ -8,16 +8,16 @@ "engine": "InnoDB", "field_order": [ "enabled", + "is_standard", + "module", "column_break_2", "channel", "slack_webhook_url", "filters", "subject", - "document_type", - "is_standard", - "module", - "col_break_1", "event", + "document_type", + "col_break_1", "method", "date_changed", "days_in_advance", @@ -119,7 +119,6 @@ "fieldtype": "Column Break" }, { - "depends_on": "eval: doc.document_type", "fieldname": "event", "fieldtype": "Select", "in_list_view": 1, @@ -292,7 +291,7 @@ "icon": "fa fa-envelope", "index_web_pages_for_search": 1, "links": [], - "modified": "2024-06-17 04:03:22.591781", + "modified": "2024-07-04 05:53:40.595130", "modified_by": "Administrator", "module": "Email", "name": "Notification", @@ -315,4 +314,4 @@ "states": [], "title_field": "subject", "track_changes": 1 -} +} \ No newline at end of file diff --git a/frappe/email/doctype/notification/notification.py b/frappe/email/doctype/notification/notification.py index 72c95cf194..2e7159d47b 100644 --- a/frappe/email/doctype/notification/notification.py +++ b/frappe/email/doctype/notification/notification.py @@ -18,6 +18,8 @@ from frappe.utils.jinja import validate_template from frappe.utils.safe_exec import get_safe_globals FORMATS = {"HTML": ".html", "Markdown": ".md", "Plain Text": ".txt"} +FORBIDDEN_DOCUMENT_TYPES = frozenset(("Email Queue",)) +DATE_BASED_EVENTS = frozenset(("Days Before", "Days After")) class Notification(Document): @@ -27,9 +29,7 @@ class Notification(Document): from typing import TYPE_CHECKING if TYPE_CHECKING: - from frappe.email.doctype.notification_recipient.notification_recipient import ( - NotificationRecipient, - ) + from frappe.email.doctype.notification_recipient.notification_recipient import NotificationRecipient from frappe.types import DF attach_print: DF.Check @@ -78,6 +78,59 @@ class Notification(Document): if not self.name: self.name = self.subject + # START: PreviewRenderer API + + @frappe.whitelist() + def preview_meets_condition(self, preview_document): + if not self.condition: + return _("Yes") + try: + doc = frappe.get_cached_doc(self.document_type, preview_document) + context = get_context(doc) + if self.is_standard: + self.load_standard_properties(context) + return _("Yes") if frappe.safe_eval(self.condition, eval_locals=context) else _("No") + except Exception as e: + frappe.local.message_log = [] + return _("Failed to evaluate conditions: {}").format(e) + + @frappe.whitelist() + def preview_message(self, preview_document): + try: + doc = frappe.get_cached_doc(self.document_type, preview_document) + context = get_context(doc) + context.update({"alert": self, "comments": None}) + if doc.get("_comments"): + context["comments"] = json.loads(doc.get("_comments")) + if self.is_standard: + self.load_standard_properties(context) + msg = frappe.render_template(self.message, context) + if self.channel == "SMS": + return frappe.utils.strip_html_tags(msg) + return msg + except Exception as e: + return _("Failed to render message: {}").format(e) + + @frappe.whitelist() + def preview_subject(self, preview_document): + try: + doc = frappe.get_cached_doc(self.document_type, preview_document) + context = get_context(doc) + context.update({"alert": self, "comments": None}) + if doc.get("_comments"): + context["comments"] = json.loads(doc.get("_comments")) + if self.is_standard: + self.load_standard_properties(context) + if not self.subject: + return _("No subject") + if "{" in self.subject: + return frappe.render_template(self.subject, context) + return self.subject + except Exception as e: + return _("Failed to render subject: {}").format(e) + + # END: PreviewRenderer API + def validate(self): if self.channel in ("Email", "Slack", "System Notification"): validate_template(self.subject) @@ -90,7 +143,7 @@ class Notification(Document): if self.event == "Value Change" and not self.value_changed: frappe.throw(_("Please specify which value field must be checked")) - self.validate_forbidden_types() + self.validate_forbidden_document_types() self.validate_condition() self.validate_standard() frappe.cache.hdel("notifications", self.document_type) @@ -130,12 +183,16 @@ def get_context(context): except Exception: frappe.throw(_("The Condition '{0}' is invalid").format(self.condition)) - def validate_forbidden_types(self): - forbidden_document_types = ("Email Queue",) - if self.document_type in forbidden_document_types or frappe.get_meta(self.document_type).istable: - # currently notifications don't work on child tables as events are not fired for each record of child table - - frappe.throw(_("Cannot set Notification on Document Type {0}").format(self.document_type)) + def validate_forbidden_document_types(self): + if self.document_type in FORBIDDEN_DOCUMENT_TYPES or ( + frappe.get_meta(self.document_type).istable and self.event not in DATE_BASED_EVENTS + ): + # only date based events are allowed for child tables + frappe.throw( + _("Cannot set Notification with event {0} on Document Type {1}").format( + _(self.event), _(self.document_type) + ) + ) def get_documents_for_today(self): """get list of documents that will be triggered today""" @@ -172,7 +229,7 @@ def get_context(context): """Build recipients and send Notification""" context = get_context(doc) - context = {"doc": doc, "alert": self, "comments": None} + context.update({"alert": self, "comments": None}) if doc.get("_comments"): context["comments"] = json.loads(doc.get("_comments")) @@ -237,8 +294,8 @@ def get_context(context): notification_doc = { "type": "Alert", - "document_type": doc.doctype, - "document_name": doc.name, + "document_type": get_reference_doctype(doc), + "document_name": get_reference_name(doc), "subject": subject, "from_user": doc.modified_by or doc.owner, "email_content": frappe.render_template(self.message, context), @@ -270,8 +327,8 @@ def get_context(context): # No need to add if it is already a communication. if doc.doctype != "Communication": communication = make_communication( - doctype=doc.doctype, - name=doc.name, + doctype=get_reference_doctype(doc), + name=get_reference_name(doc), content=message, subject=subject, sender=sender, @@ -294,8 +351,8 @@ def get_context(context): cc=cc, bcc=bcc, message=message, - reference_doctype=doc.doctype, - reference_name=doc.name, + reference_doctype=get_reference_doctype(doc), + reference_name=get_reference_name(doc), attachments=attachments, expose_recipients="header", print_letterhead=((attachments and attachments[0].get("print_letterhead")) or False), @@ -306,16 +363,47 @@ def get_context(context): send_slack_message( webhook_url=self.slack_webhook_url, message=frappe.render_template(self.message, context), - reference_doctype=doc.doctype, - reference_name=doc.name, + reference_doctype=get_reference_doctype(doc), + reference_name=get_reference_name(doc), ) def send_sms(self, doc, context): send_sms( - receiver_list=self.get_receiver_list(doc, context), + receiver_list=self.get_receiver_list(doc, context, "mobile_no", self.get_mobile_no), msg=frappe.utils.strip_html_tags(frappe.render_template(self.message, context)), ) + @staticmethod + def get_mobile_no(doc, field): + option = doc.meta.get_field(field).options.strip() + # users may sometimes register mobile numbers under Phone type fields + if option == "Phone" or option == "Mobile": + mobile_no = doc.get(field) + if not mobile_no: + doc.log_error( + _("Notification: document {0} has no {1} number set (field: {2})").format( + field, doc.name, option, field + ) + ) + # but on user & customer it's expected to be set on the proper field + elif option == "User": + user = doc.get(field) + mobile_no = frappe.get_value("User", user, "mobile_no") + if not mobile_no: + doc.log_error(_("Notification: user {0} has no Mobile number set").format(user)) + elif option == "Customer": + customer = doc.get(field) + mobile_no = frappe.get_value("Customer", customer, "mobile_no") + if not mobile_no: + doc.log_error(_("Notification: customer {0} has no Mobile number set").format(customer)) + else: + frappe.throw( + _( + "Field {0} on document {1} is neither a Mobile number field nor a Customer or User link" + ).format(field, doc.name) + ) + return mobile_no + def get_list_of_recipients(self, doc, context): recipients = [] cc = [] @@ -325,16 +413,17 @@ def get_context(context): if not frappe.safe_eval(recipient.condition, None, context): continue if recipient.receiver_by_document_field: - fields = recipient.receiver_by_document_field.split(",") - # fields from child table - if len(fields) > 1: - for d in doc.get(fields[1]): - email_id = d.get(fields[0]) + data_field, child_field = _parse_receiver_by_document_field( + recipient.receiver_by_document_field + ) + if child_field: + for d in doc.get(child_field): + email_id = d.get(data_field) if validate_email_address(email_id): recipients.append(email_id) - # field from parent doc + # field from current doc else: - email_ids_value = doc.get(fields[0]) + email_ids_value = doc.get(data_field) if validate_email_address(email_ids_value): email_ids = email_ids_value.replace(",", "\n") recipients = recipients + email_ids.split("\n") @@ -354,8 +443,10 @@ def get_context(context): return list(set(recipients)), list(set(cc)), list(set(bcc)) - def get_receiver_list(self, doc, context): + def get_receiver_list(self, doc, context, field_on_user="mobile_no", recipient_extractor_func=None): """return receiver list based on the doc field and role specified""" + if not recipient_extractor_func: + recipient_extractor_func = self.get_mobile_no receiver_list = [] for recipient in self.recipients: if recipient.condition: @@ -364,18 +455,28 @@ def get_context(context): # For sending messages to the owner's mobile phone number if recipient.receiver_by_document_field == "owner": - receiver_list += get_user_info([dict(user_name=doc.get("owner"))], "mobile_no") + receiver_list += get_user_info([dict(user_name=doc.get("owner"))], field_on_user) # For sending messages to the number specified in the receiver field elif recipient.receiver_by_document_field: - receiver_list.append(doc.get(recipient.receiver_by_document_field)) + data_field, child_field = _parse_receiver_by_document_field( + recipient.receiver_by_document_field + ) + if child_field: + for d in doc.get(child_field): + if recv := recipient_extractor_func(d, data_field): + receiver_list.append(recv) + # field from current doc + else: + if recv := recipient_extractor_func(doc, data_field): + receiver_list.append(recv) # For sending messages to specified role if recipient.receiver_by_role: receiver_list += get_info_based_on_role( - recipient.receiver_by_role, "mobile_no", ignore_permissions=True + recipient.receiver_by_role, field_on_user, ignore_permissions=True ) - return receiver_list + return list(set(receiver_list)) def get_attachment(self, doc): """check print settings are attach the pdf""" @@ -543,3 +644,21 @@ def get_emails_from_template(template, context): emails = frappe.render_template(template, context) if "{" in template else template return filter(None, emails.replace(",", "\n").split("\n")) + + +def get_reference_doctype(doc): + return doc.parenttype if doc.meta.istable else doc.doctype + + +def get_reference_name(doc): + return doc.parent if doc.meta.istable else doc.name + + +def _parse_receiver_by_document_field(s): + fragments = s.split(",") + # fields from child table or linked doctype + if len(fragments) > 1: + data_field, child_field = fragments + else: + data_field, child_field = fragments[0], None + return data_field, child_field diff --git a/frappe/email/frappemail.py b/frappe/email/frappemail.py new file mode 100644 index 0000000000..84ef6166f5 --- /dev/null +++ b/frappe/email/frappemail.py @@ -0,0 +1,129 @@ +from datetime import datetime +from typing import Any +from urllib.parse import urljoin + +import pytz + +import frappe +from frappe import _ +from frappe.frappeclient import FrappeClient, FrappeOAuth2Client +from frappe.utils import convert_utc_to_system_timezone, get_datetime, get_datetime_str, get_system_timezone + + +class FrappeMail: + """Class to interact with the Frappe Mail API.""" + + def __init__( + self, + site: str, + mailbox: str, + api_key: str | None = None, + api_secret: str | None = None, + access_token: str | None = None, + ) -> None: + self.site = site + self.mailbox = mailbox + self.api_key = api_key + self.api_secret = api_secret + self.access_token = access_token + self.client = self.get_client( + self.site, self.mailbox, self.api_key, self.api_secret, self.access_token + ) + + @staticmethod + def get_client( + site: str, + mailbox: str, + api_key: str | None = None, + api_secret: str | None = None, + access_token: str | None = None, + ) -> FrappeClient | FrappeOAuth2Client: + """Returns a FrappeClient or FrappeOAuth2Client instance.""" + + if hasattr(frappe.local, "frappe_mail_clients"): + if client := frappe.local.frappe_mail_clients.get(mailbox): + return client + else: + frappe.local.frappe_mail_clients = {} + + client = ( + FrappeOAuth2Client(url=site, access_token=access_token) + if access_token + else FrappeClient(url=site, api_key=api_key, api_secret=api_secret) + ) + frappe.local.frappe_mail_clients[mailbox] = client + + return client + + def request( + self, + method: str, + endpoint: str, + params: dict | None = None, + data: dict | None = None, + json: dict | None = None, + headers: dict[str, str] | None = None, + timeout: int | tuple[int, int] = (60, 120), + raise_exception: bool = True, + ) -> Any | None: + """Makes a request to the Frappe Mail API.""" + + url = urljoin(self.client.url, endpoint) + + headers = headers or {} + headers.update(self.client.headers) + + response = self.client.session.request( + method=method, url=url, params=params, data=data, json=json, headers=headers, timeout=timeout + ) + + return self.client.post_process(response) + + def validate(self, for_outbound: bool = False, for_inbound: bool = False) -> None: + """Validates the mailbox for inbound and outbound emails.""" + + endpoint = "/api/method/mail.api.auth.validate" + data = {"mailbox": self.mailbox, "for_outbound": for_outbound, "for_inbound": for_inbound} + self.request("POST", endpoint=endpoint, data=data) + + def send_raw(self, sender: str, recipients: str | list, message: str) -> None: + """Sends an email using the Frappe Mail API.""" + + endpoint = "/api/method/mail.api.outbound.send_raw" + data = {"from_": sender, "to": recipients, "raw_message": message} + self.request("POST", endpoint=endpoint, data=data) + + def send_newsletter(self, sender: str, recipients: str | list, message: str) -> None: + """Sends an newsletter using the Frappe Mail API.""" + + endpoint = "/api/method/mail.api.outbound.send_newsletter" + data = {"from_": sender, "to": recipients, "raw_message": message} + self.request("POST", endpoint=endpoint, json=data) + + def pull_raw(self, limit: int = 50, last_synced_at: str | None = None) -> dict[str, list[str] | str]: + """Pulls emails from the mailbox using the Frappe Mail API.""" + + endpoint = "/api/method/mail.api.inbound.pull_raw" + if last_synced_at: + last_synced_at = add_or_update_tzinfo(last_synced_at) + + data = {"mailbox": self.mailbox, "limit": limit, "last_synced_at": last_synced_at} + headers = {"X-Site": frappe.utils.get_url()} + response = self.request("GET", endpoint=endpoint, data=data, headers=headers) + last_synced_at = convert_utc_to_system_timezone(get_datetime(response["last_synced_at"])) + + return {"latest_messages": response["mails"], "last_synced_at": last_synced_at} + + +def add_or_update_tzinfo(date_time: datetime | str, timezone: str | None = None) -> str: + """Adds or updates timezone to the datetime.""" + + date_time = get_datetime(date_time) + target_tz = pytz.timezone(timezone or get_system_timezone()) + + if date_time.tzinfo is None: + date_time = target_tz.localize(date_time) + else: + date_time = date_time.astimezone(target_tz) + + return str(date_time) diff --git a/frappe/geo/country_info.json b/frappe/geo/country_info.json index ff2c2d4ae6..163f7fd9c0 100644 --- a/frappe/geo/country_info.json +++ b/frappe/geo/country_info.json @@ -2731,18 +2731,6 @@ ], "isd": "+216" }, - "Türkiye": { - "code": "tr", - "currency": "TRY", - "currency_fraction": "Kuru\u015f", - "currency_fraction_units": 100, - "currency_symbol": "\u20ba", - "number_format": "#.###,##", - "timezones": [ - "Europe/Istanbul" - ], - "isd": "+90" - }, "Turkmenistan": { "code": "tm", "currency": "TMM", @@ -2774,6 +2762,18 @@ "Pacific/Funafuti" ], "isd": "+688" + }, + "T\u00fcrkiye": { + "code": "tr", + "currency": "TRY", + "currency_fraction": "Kuru\u015f", + "currency_fraction_units": 100, + "currency_symbol": "\u20ba", + "number_format": "#.###,##", + "timezones": [ + "Europe/Istanbul" + ], + "isd": "+90" }, "Uganda": { "code": "ug", diff --git a/frappe/gettext/extractors/workspace.py b/frappe/gettext/extractors/workspace.py index 76ca108df4..4c58c373be 100644 --- a/frappe/gettext/extractors/workspace.py +++ b/frappe/gettext/extractors/workspace.py @@ -29,8 +29,8 @@ def extract(fileobj, *args, **kwargs): yield from ( ( None, - "pgettext", - (link.get("link_to") if link.get("link_type") == "DocType" else None, link.get("label")), + "_", + link.get("label"), [f"Label of a {link.get('type')} in the {workspace_name} Workspace"], ) for link in data.get("links", []) @@ -38,8 +38,8 @@ def extract(fileobj, *args, **kwargs): yield from ( ( None, - "pgettext", - (link.get("link_to") if link.get("link_type") == "DocType" else None, link.get("description")), + "_", + link.get("description"), [f"Description of a {link.get('type')} in the {workspace_name} Workspace"], ) for link in data.get("links", []) @@ -47,8 +47,8 @@ def extract(fileobj, *args, **kwargs): yield from ( ( None, - "pgettext", - (shortcut.get("link_to") if shortcut.get("type") == "DocType" else None, shortcut.get("label")), + "_", + shortcut.get("label"), [f"Label of a shortcut in the {workspace_name} Workspace"], ) for shortcut in data.get("shortcuts", []) @@ -56,8 +56,8 @@ def extract(fileobj, *args, **kwargs): yield from ( ( None, - "pgettext", - (shortcut.get("link_to") if shortcut.get("type") == "DocType" else None, shortcut.get("format")), + "_", + shortcut.get("format"), [f"Count format of shortcut in the {workspace_name} Workspace"], ) for shortcut in data.get("shortcuts", []) diff --git a/frappe/gettext/translate.py b/frappe/gettext/translate.py index bf5b60f0b8..3e43e55f7a 100644 --- a/frappe/gettext/translate.py +++ b/frappe/gettext/translate.py @@ -218,7 +218,7 @@ def update_po(target_app: str | None = None, locale: str | None = None): pot_catalog = get_catalog(app) for locale in locales: po_catalog = get_catalog(app, locale) - po_catalog.update(pot_catalog) + po_catalog.update(pot_catalog, no_fuzzy_matching=True) po_path = write_catalog(app, po_catalog, locale) print(f"PO file modified at {po_path}") diff --git a/frappe/hooks.py b/frappe/hooks.py index d29f2167a9..2c084bbe6a 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -33,8 +33,8 @@ app_include_css = [ "report.bundle.css", ] app_include_icons = [ - "frappe/icons/timeless/icons.svg", - "frappe/icons/espresso/icons.svg", + "/assets/frappe/icons/timeless/icons.svg", + "/assets/frappe/icons/espresso/icons.svg", ] doctype_js = { @@ -43,8 +43,11 @@ doctype_js = { } web_include_js = ["website_script.js"] - web_include_css = [] +web_include_icons = [ + "/assets/frappe/icons/timeless/icons.svg", + "/assets/frappe/icons/espresso/icons.svg", +] email_css = ["email.bundle.css"] @@ -457,15 +460,15 @@ export_python_type_annotations = True standard_navbar_items = [ { - "item_label": "My Profile", - "item_type": "Route", - "route": "/app/user-profile", + "item_label": "User Settings", + "item_type": "Action", + "action": "frappe.ui.toolbar.route_to_user()", "is_standard": 1, }, { - "item_label": "My Settings", + "item_label": "Workspace Settings", "item_type": "Action", - "action": "frappe.ui.toolbar.route_to_user()", + "action": "frappe.quick_edit('Workspace Settings')", "is_standard": 1, }, { diff --git a/frappe/integrations/doctype/connected_app/connected_app.json b/frappe/integrations/doctype/connected_app/connected_app.json index 201f161120..9fc63cd520 100644 --- a/frappe/integrations/doctype/connected_app/connected_app.json +++ b/frappe/integrations/doctype/connected_app/connected_app.json @@ -139,7 +139,7 @@ "link_fieldname": "connected_app" } ], - "modified": "2024-03-23 16:01:30.633764", + "modified": "2024-07-05 08:24:50.182706", "modified_by": "Administrator", "module": "Integrations", "name": "Connected App", @@ -162,6 +162,7 @@ "role": "All" } ], + "show_title_field_in_link": 1, "sort_field": "creation", "sort_order": "DESC", "states": [], diff --git a/frappe/integrations/doctype/connected_app/connected_app.py b/frappe/integrations/doctype/connected_app/connected_app.py index 07f5c10b01..0a98869aab 100644 --- a/frappe/integrations/doctype/connected_app/connected_app.py +++ b/frappe/integrations/doctype/connected_app/connected_app.py @@ -4,6 +4,7 @@ import os from urllib.parse import urlencode, urljoin +from oauthlib.oauth2 import BackendApplicationClient from requests_oauthlib import OAuth2Session import frappe @@ -147,6 +148,29 @@ class ConnectedApp(Document): return token_cache + def get_backend_app_token(self): + """Get an Access Token for the Cloud-Registered Service Principal""" + # There is no User assigned to the app, so we give it an empty string, + # otherwise it will assign the logged in user. + token_cache = self.get_token_cache("") + if token_cache is None: + token_cache = frappe.new_doc("Token Cache") + token_cache.connected_app = self.name + elif not token_cache.is_expired(): + return token_cache + + # Get a new Access token for the App + client = BackendApplicationClient(client_id=self.client_id, scope=self.get_scopes()) + oauth_session = OAuth2Session(client=client) + + token = oauth_session.fetch_token(self.token_uri, client_secret=self.get_password("client_secret")) + + token_cache.update_data(token) + token_cache.save(ignore_permissions=True) + frappe.db.commit() + + return token_cache + @frappe.whitelist(methods=["GET"], allow_guest=True) def callback(code=None, state=None): diff --git a/frappe/integrations/doctype/webhook/webhook.js b/frappe/integrations/doctype/webhook/webhook.js index 9fad6150ab..38aed089f5 100644 --- a/frappe/integrations/doctype/webhook/webhook.js +++ b/frappe/integrations/doctype/webhook/webhook.js @@ -85,6 +85,29 @@ frappe.ui.form.on("Webhook", { "background_jobs_queue", "frappe.integrations.doctype.webhook.webhook.get_all_queues" ); + + if (frm.doc.webhook_doctype) { + frm.add_custom_button(__("Preview"), () => { + const args = { + doc: frm.doc, + doctype: frm.doc.webhook_doctype, + preview_fields: [ + { + label: __("Meets Condition?"), + fieldtype: "Data", + method: "preview_meets_condition", + }, + { + label: __("Request Body"), + fieldtype: "Code", + method: "preview_request_body", + }, + ], + }; + let dialog = new frappe.views.RenderPreviewer(args); + return dialog; + }); + } }, request_structure: (frm) => { @@ -98,17 +121,6 @@ frappe.ui.form.on("Webhook", { enable_security: (frm) => { frm.toggle_reqd("webhook_secret", frm.doc.enable_security); }, - - preview_document: (frm) => { - frappe.call({ - method: "generate_preview", - doc: frm.doc, - callback: (r) => { - frm.refresh_field("meets_condition"); - frm.refresh_field("preview_request_body"); - }, - }); - }, }); frappe.ui.form.on("Webhook Data", { diff --git a/frappe/integrations/doctype/webhook/webhook.json b/frappe/integrations/doctype/webhook/webhook.json index 5ce16026fa..884f4429ba 100644 --- a/frappe/integrations/doctype/webhook/webhook.json +++ b/frappe/integrations/doctype/webhook/webhook.json @@ -30,13 +30,7 @@ "webhook_headers", "sb_webhook_data", "webhook_data", - "webhook_json", - "preview_tab", - "preview_document", - "column_break_26", - "meets_condition", - "section_break_28", - "preview_request_body" + "webhook_json" ], "fields": [ { @@ -169,37 +163,6 @@ "options": "POST\nPUT\nDELETE", "reqd": 1 }, - { - "fieldname": "preview_tab", - "fieldtype": "Tab Break", - "label": "Preview" - }, - { - "fieldname": "preview_document", - "fieldtype": "Dynamic Link", - "label": "Select Document", - "options": "webhook_doctype" - }, - { - "fieldname": "preview_request_body", - "fieldtype": "Code", - "is_virtual": 1, - "label": "Request Body" - }, - { - "fieldname": "meets_condition", - "fieldtype": "Data", - "is_virtual": 1, - "label": "Meets Condition?" - }, - { - "fieldname": "column_break_26", - "fieldtype": "Column Break" - }, - { - "fieldname": "section_break_28", - "fieldtype": "Section Break" - }, { "default": "0", "description": "On checking this option, URL will be treated like a jinja template string", @@ -226,7 +189,7 @@ "link_fieldname": "webhook" } ], - "modified": "2024-03-23 16:04:03.108172", + "modified": "2024-07-22 09:23:32.642172", "modified_by": "Administrator", "module": "Integrations", "name": "Webhook", @@ -250,4 +213,4 @@ "sort_order": "DESC", "states": [], "track_changes": 1 -} \ No newline at end of file +} diff --git a/frappe/integrations/doctype/webhook/webhook.py b/frappe/integrations/doctype/webhook/webhook.py index 9d82dd34b1..952d25d31f 100644 --- a/frappe/integrations/doctype/webhook/webhook.py +++ b/frappe/integrations/doctype/webhook/webhook.py @@ -36,9 +36,6 @@ class Webhook(Document): enable_security: DF.Check enabled: DF.Check is_dynamic_url: DF.Check - meets_condition: DF.Data | None - preview_document: DF.DynamicLink | None - preview_request_body: DF.Code | None request_method: DF.Literal["POST", "PUT", "DELETE"] request_structure: DF.Literal["", "Form URL-Encoded", "JSON"] request_url: DF.SmallText @@ -119,35 +116,24 @@ class Webhook(Document): frappe.throw(_("Invalid Webhook Secret")) @frappe.whitelist() - def generate_preview(self): - # This function doesn't need to do anything specific as virtual fields - # get evaluated automatically. - pass - - @property - def meets_condition(self): + def preview_meets_condition(self, preview_document): if not self.condition: return _("Yes") - - if not (self.preview_document and self.webhook_doctype): - return _("Select a document to check if it meets conditions.") - try: - doc = frappe.get_cached_doc(self.webhook_doctype, self.preview_document) + doc = frappe.get_cached_doc(self.webhook_doctype, preview_document) met_condition = frappe.safe_eval(self.condition, eval_locals=get_context(doc)) except Exception as e: + frappe.local.message_log = [] return _("Failed to evaluate conditions: {}").format(e) return _("Yes") if met_condition else _("No") - @property - def preview_request_body(self): - if not (self.preview_document and self.webhook_doctype): - return _("Select a document to preview request data") - + @frappe.whitelist() + def preview_request_body(self, preview_document): try: - doc = frappe.get_cached_doc(self.webhook_doctype, self.preview_document) + doc = frappe.get_cached_doc(self.webhook_doctype, preview_document) return frappe.as_json(get_webhook_data(doc, self)) except Exception as e: + frappe.local.message_log = [] return _("Failed to compute request body: {}").format(e) diff --git a/frappe/integrations/frappe_providers/__init__.py b/frappe/integrations/frappe_providers/__init__.py index 630c2c08b4..b1f0c41798 100644 --- a/frappe/integrations/frappe_providers/__init__.py +++ b/frappe/integrations/frappe_providers/__init__.py @@ -1,13 +1,8 @@ # imports - standard imports -import sys - # imports - module imports + from frappe.integrations.frappe_providers.frappecloud import frappecloud_migrator -def migrate_to(local_site, frappe_provider): - if frappe_provider in ("frappe.cloud", "frappecloud.com"): - return frappecloud_migrator(local_site) - else: - print(f"{frappe_provider} is not supported yet") - sys.exit(1) +def migrate_to(): + return frappecloud_migrator() diff --git a/frappe/integrations/frappe_providers/frappecloud.py b/frappe/integrations/frappe_providers/frappecloud.py index f276004427..29acca44ff 100644 --- a/frappe/integrations/frappe_providers/frappecloud.py +++ b/frappe/integrations/frappe_providers/frappecloud.py @@ -5,9 +5,8 @@ import frappe from frappe.core.utils import html2text -def frappecloud_migrator(local_site): +def get_remote_script(remote_site): print("Retrieving Site Migrator...") - remote_site = frappe.conf.frappecloud_url or "frappecloud.com" request_url = f"https://{remote_site}/api/method/press.api.script" request = requests.get(request_url) @@ -19,8 +18,12 @@ def frappecloud_migrator(local_site): ) return - script_contents = request.json()["message"] + return request.json()["message"] + +def frappecloud_migrator(): + remote_site_name = "frappecloud.com" + script_contents = get_remote_script(remote_site=remote_site_name) import os import sys import tempfile @@ -29,4 +32,4 @@ def frappecloud_migrator(local_site): script = tempfile.NamedTemporaryFile(mode="w") script.write(script_contents) print(f"Site Migrator stored at {script.name}") - os.execv(py, [py, script.name, local_site]) + os.execv(py, [py, script.name]) diff --git a/frappe/locale/eo.po b/frappe/locale/eo.po index 8305c8614a..e10c29491e 100644 --- a/frappe/locale/eo.po +++ b/frappe/locale/eo.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: frappe\n" "Report-Msgid-Bugs-To: developers@frappe.io\n" -"POT-Creation-Date: 2024-06-30 09:33+0000\n" -"PO-Revision-Date: 2024-07-02 15:49\n" +"POT-Creation-Date: 2024-07-21 09:33+0000\n" +"PO-Revision-Date: 2024-07-23 01:05\n" "Last-Translator: developers@frappe.io\n" "Language-Team: Esperanto\n" "MIME-Version: 1.0\n" @@ -44,7 +44,7 @@ msgstr "crwdns90470:0crwdne90470:0" msgid "\"Team Members\" or \"Management\"" msgstr "crwdns127908:0crwdne127908:0" -#: public/js/frappe/form/form.js:1085 +#: public/js/frappe/form/form.js:1089 msgid "\"amended_from\" field must be present to do an amendment." msgstr "crwdns90474:0crwdne90474:0" @@ -98,7 +98,7 @@ msgstr "crwdns90532:0{0}crwdne90532:0" msgid "'{0}' not allowed for type {1} in row {2}" msgstr "crwdns90534:0{0}crwdnd90534:0{1}crwdnd90534:0{2}crwdne90534:0" -#: public/js/frappe/data_import/data_exporter.js:301 +#: public/js/frappe/data_import/data_exporter.js:302 msgid "(Mandatory)" msgstr "crwdns110776:0crwdne110776:0" @@ -168,7 +168,7 @@ msgstr "crwdns90558:0crwdne90558:0" msgid "1 month ago" msgstr "crwdns90560:0crwdne90560:0" -#: public/js/frappe/data_import/data_exporter.js:226 +#: public/js/frappe/data_import/data_exporter.js:227 msgid "1 record will be exported" msgstr "crwdns90562:0crwdne90562:0" @@ -471,7 +471,7 @@ msgid "

To interact with above HTML you will have to use `root_element` as a p "" msgstr "crwdns127946:0crwdne127946:0" -#: twofactor.py:462 +#: twofactor.py:446 msgid "

Your OTP secret on {0} has been reset. If you did not perform this reset and did not request it, please contact your System Administrator immediately.

" msgstr "crwdns90622:0{0}crwdne90622:0" @@ -659,10 +659,11 @@ msgid "API Endpoint Args" msgstr "crwdns127990:0crwdne127990:0" #. Label of the api_key (Data) field in DocType 'User' +#. Label of the api_key (Data) field in DocType 'Email Account' #. Label of the api_key (Data) field in DocType 'Google Settings' #. Label of the sb_01 (Section Break) field in DocType 'Google Settings' #. Label of the api_key (Data) field in DocType 'Push Notification Settings' -#: core/doctype/user/user.json +#: core/doctype/user/user.json email/doctype/email_account/email_account.json #: integrations/doctype/google_settings/google_settings.json #: integrations/doctype/push_notification_settings/push_notification_settings.json msgid "API Key" @@ -685,9 +686,10 @@ msgid "API Method" msgstr "crwdns127998:0crwdne127998:0" #. Label of the api_secret (Password) field in DocType 'User' +#. Label of the api_secret (Password) field in DocType 'Email Account' #. Label of the api_secret (Password) field in DocType 'Push Notification #. Settings' -#: core/doctype/user/user.json +#: core/doctype/user/user.json email/doctype/email_account/email_account.json #: integrations/doctype/push_notification_settings/push_notification_settings.json msgid "API Secret" msgstr "crwdns128000:0crwdne128000:0" @@ -923,7 +925,7 @@ msgstr "crwdns90796:0crwdne90796:0" #. Group in User's connections #: core/doctype/user/user.json public/js/frappe/form/dashboard.js:22 -#: public/js/frappe/form/footer/form_timeline.js:58 +#: public/js/frappe/form/footer/form_timeline.js:60 msgid "Activity" msgstr "crwdns90798:0crwdne90798:0" @@ -952,11 +954,6 @@ msgstr "crwdns90804:0crwdne90804:0" msgid "Add" msgstr "crwdns90808:0crwdne90808:0" -#: public/js/frappe/list/list_view.js:266 -msgctxt "Primary action in list view" -msgid "Add" -msgstr "crwdns110784:0crwdne110784:0" - #: public/js/frappe/form/grid_row.js:431 msgid "Add / Remove Columns" msgstr "crwdns110786:0crwdne110786:0" @@ -994,6 +991,10 @@ msgstr "crwdns128032:0crwdne128032:0" msgid "Add Border at Top" msgstr "crwdns128034:0crwdne128034:0" +#: desk/doctype/number_card/number_card.js:36 +msgid "Add Card to Dashboard" +msgstr "crwdns142868:0crwdne142868:0" + #: public/js/frappe/views/reports/query_report.js:210 msgid "Add Chart to Dashboard" msgstr "crwdns90824:0crwdne90824:0" @@ -1003,8 +1004,8 @@ msgid "Add Child" msgstr "crwdns90826:0crwdne90826:0" #: public/js/frappe/views/kanban/kanban_board.html:4 -#: public/js/frappe/views/reports/query_report.js:1696 -#: public/js/frappe/views/reports/query_report.js:1699 +#: public/js/frappe/views/reports/query_report.js:1681 +#: public/js/frappe/views/reports/query_report.js:1684 #: public/js/frappe/views/reports/report_view.js:324 #: public/js/frappe/views/reports/report_view.js:349 msgid "Add Column" @@ -1068,7 +1069,7 @@ msgstr "crwdns128042:0crwdne128042:0" msgid "Add Review" msgstr "crwdns90850:0crwdne90850:0" -#: core/doctype/user/user.py:757 +#: core/doctype/user/user.py:772 msgid "Add Roles" msgstr "crwdns90852:0crwdne90852:0" @@ -1101,7 +1102,7 @@ msgstr "crwdns90862:0crwdne90862:0" msgid "Add Tags" msgstr "crwdns90864:0crwdne90864:0" -#: public/js/frappe/list/list_view.js:1903 +#: public/js/frappe/list/list_view.js:1957 msgctxt "Button in list view actions menu" msgid "Add Tags" msgstr "crwdns90866:0crwdne90866:0" @@ -1137,7 +1138,7 @@ msgstr "crwdns110792:0crwdne110792:0" msgid "Add a New Role" msgstr "crwdns110794:0crwdne110794:0" -#: public/js/frappe/form/form_tour.js:205 +#: public/js/frappe/form/form_tour.js:211 msgid "Add a Row" msgstr "crwdns90878:0crwdne90878:0" @@ -1187,7 +1188,7 @@ msgstr "crwdns90896:0crwdne90896:0" msgid "Add to table" msgstr "crwdns90898:0crwdne90898:0" -#: public/js/frappe/form/footer/form_timeline.js:97 +#: public/js/frappe/form/footer/form_timeline.js:99 msgid "Add to this activity by mailing to {0}" msgstr "crwdns90900:0{0}crwdne90900:0" @@ -1195,6 +1196,11 @@ msgstr "crwdns90900:0{0}crwdne90900:0" msgid "Add {0}" msgstr "crwdns110798:0{0}crwdne110798:0" +#: public/js/frappe/list/list_view.js:264 +msgctxt "Primary action in list view" +msgid "Add {0}" +msgstr "crwdns142870:0{0}crwdne142870:0" + #. Description of the '<head> HTML' (Code) field in DocType 'Website #. Settings' #: website/doctype/website_settings/website_settings.json @@ -1218,8 +1224,11 @@ msgstr "crwdns90908:0{0}crwdnd90908:0{1}crwdne90908:0" #. DocPerm' #. Label of the additional_permissions (Section Break) field in DocType #. 'DocPerm' +#. Label of the additional_permissions_section (Section Break) field in DocType +#. 'User Document Type' #: core/doctype/custom_docperm/custom_docperm.json #: core/doctype/docperm/docperm.json +#: core/doctype/user_document_type/user_document_type.json msgid "Additional Permissions" msgstr "crwdns128056:0crwdne128056:0" @@ -1314,11 +1323,11 @@ msgstr "crwdns90948:0crwdne90948:0" msgid "Administrator" msgstr "crwdns90950:0crwdne90950:0" -#: core/doctype/user/user.py:1161 +#: core/doctype/user/user.py:1176 msgid "Administrator Logged In" msgstr "crwdns90952:0crwdne90952:0" -#: core/doctype/user/user.py:1155 +#: core/doctype/user/user.py:1170 msgid "Administrator accessed {0} on {1} via IP Address {2}." msgstr "crwdns90954:0{0}crwdnd90954:0{1}crwdnd90954:0{2}crwdne90954:0" @@ -1474,7 +1483,7 @@ msgstr "crwdns91012:0crwdne91012:0" msgid "All Records" msgstr "crwdns91014:0crwdne91014:0" -#: public/js/frappe/form/form.js:2225 +#: public/js/frappe/form/form.js:2230 msgid "All Submissions" msgstr "crwdns110800:0crwdne110800:0" @@ -1792,11 +1801,11 @@ msgstr "crwdns128188:0crwdne128188:0" msgid "Allowed Roles" msgstr "crwdns128190:0crwdne128190:0" -#: public/js/frappe/form/form.js:1251 +#: public/js/frappe/form/form.js:1255 msgid "Allowing DocType, DocType. Be careful!" msgstr "crwdns91150:0crwdne91150:0" -#: core/doctype/user/user.py:964 +#: core/doctype/user/user.py:979 msgid "Already Registered" msgstr "crwdns91152:0crwdne91152:0" @@ -2008,11 +2017,11 @@ msgstr "crwdns91230:0crwdne91230:0" msgid "App Secret Key" msgstr "crwdns128236:0crwdne128236:0" -#: modules/utils.py:275 +#: modules/utils.py:279 msgid "App not found for module: {0}" msgstr "crwdns91240:0{0}crwdne91240:0" -#: __init__.py:1794 +#: __init__.py:1800 msgid "App {0} is not installed" msgstr "crwdns91242:0{0}crwdne91242:0" @@ -2032,7 +2041,7 @@ msgstr "crwdns128238:0crwdne128238:0" msgid "Append To" msgstr "crwdns128240:0crwdne128240:0" -#: email/doctype/email_account/email_account.py:185 +#: email/doctype/email_account/email_account.py:195 msgid "Append To can be one of {0}" msgstr "crwdns91252:0{0}crwdne91252:0" @@ -2073,7 +2082,7 @@ msgstr "crwdns128250:0crwdne128250:0" msgid "Applied On" msgstr "crwdns128252:0crwdne128252:0" -#: public/js/frappe/list/list_view.js:1888 +#: public/js/frappe/list/list_view.js:1942 msgctxt "Button in list view actions menu" msgid "Apply Assignment Rule" msgstr "crwdns91270:0crwdne91270:0" @@ -2167,7 +2176,7 @@ msgstr "crwdns128272:0crwdne128272:0" msgid "Archived Columns" msgstr "crwdns91306:0crwdne91306:0" -#: public/js/frappe/list/list_view.js:1867 +#: public/js/frappe/list/list_view.js:1921 msgid "Are you sure you want to clear the assignments?" msgstr "crwdns104470:0crwdne104470:0" @@ -2263,7 +2272,7 @@ msgstr "crwdns128278:0crwdne128278:0" msgid "Assign To" msgstr "crwdns91344:0crwdne91344:0" -#: public/js/frappe/list/list_view.js:1849 +#: public/js/frappe/list/list_view.js:1903 msgctxt "Button in list view actions menu" msgid "Assign To" msgstr "crwdns91346:0crwdne91346:0" @@ -2382,7 +2391,7 @@ msgstr "crwdns91400:0{0}crwdne91400:0" msgid "Assignment Rules" msgstr "crwdns128292:0crwdne128292:0" -#: desk/doctype/notification_log/notification_log.py:157 +#: desk/doctype/notification_log/notification_log.py:158 msgid "Assignment Update on {0}" msgstr "crwdns91404:0{0}crwdne91404:0" @@ -2570,7 +2579,15 @@ msgstr "crwdns91494:0crwdne91494:0" msgid "Authentication Apps you can use are: " msgstr "crwdns91498:0crwdne91498:0" -#: email/doctype/email_account/email_account.py:312 +#: email/frappemail.py:89 +msgid "Authentication Error: Invalid API Key or Secret" +msgstr "crwdns142872:0crwdne142872:0" + +#: email/frappemail.py:85 +msgid "Authentication Error: Reauthorize OAuth for Email Account {0}." +msgstr "crwdns142874:0{0}crwdne142874:0" + +#: email/doctype/email_account/email_account.py:328 msgid "Authentication failed while receiving emails from Email Account: {0}." msgstr "crwdns91500:0{0}crwdne91500:0" @@ -2784,11 +2801,11 @@ msgstr "crwdns128362:0crwdne128362:0" msgid "Automatic" msgstr "crwdns91588:0crwdne91588:0" -#: email/doctype/email_account/email_account.py:715 +#: email/doctype/email_account/email_account.py:766 msgid "Automatic Linking can be activated only for one Email Account." msgstr "crwdns91592:0crwdne91592:0" -#: email/doctype/email_account/email_account.py:709 +#: email/doctype/email_account/email_account.py:760 msgid "Automatic Linking can be activated only if Incoming is enabled." msgstr "crwdns91594:0crwdne91594:0" @@ -3719,6 +3736,7 @@ msgstr "crwdns128570:0crwdne128570:0" #. Name of a DocType #: desk/doctype/calendar_view/calendar_view.json +#: public/js/frappe/list/base_list.js:208 msgid "Calendar View" msgstr "crwdns91974:0crwdne91974:0" @@ -3825,7 +3843,7 @@ msgstr "crwdns92008:0{0}crwdnd92008:0{1}crwdnd92008:0{0}crwdne92008:0" msgid "Cancel" msgstr "crwdns92010:0crwdne92010:0" -#: public/js/frappe/list/list_view.js:1958 +#: public/js/frappe/list/list_view.js:2012 msgctxt "Button in list view actions menu" msgid "Cancel" msgstr "crwdns92012:0crwdne92012:0" @@ -3835,11 +3853,11 @@ msgctxt "Secondary button in warning dialog" msgid "Cancel" msgstr "crwdns92022:0crwdne92022:0" -#: public/js/frappe/form/form.js:974 +#: public/js/frappe/form/form.js:978 msgid "Cancel All" msgstr "crwdns92026:0crwdne92026:0" -#: public/js/frappe/form/form.js:961 +#: public/js/frappe/form/form.js:965 msgid "Cancel All Documents" msgstr "crwdns92028:0crwdne92028:0" @@ -3847,7 +3865,7 @@ msgstr "crwdns92028:0crwdne92028:0" msgid "Cancel Scheduling" msgstr "crwdns92030:0crwdne92030:0" -#: public/js/frappe/list/list_view.js:1963 +#: public/js/frappe/list/list_view.js:2017 msgctxt "Title of confirmation dialog" msgid "Cancel {0} documents?" msgstr "crwdns92032:0{0}crwdne92032:0" @@ -3895,7 +3913,7 @@ msgstr "crwdns92056:0crwdne92056:0" msgid "Cannot Remove" msgstr "crwdns92058:0crwdne92058:0" -#: model/base_document.py:1072 +#: model/base_document.py:1073 msgid "Cannot Update After Submit" msgstr "crwdns92060:0crwdne92060:0" @@ -3947,7 +3965,7 @@ msgstr "crwdns92082:0crwdne92082:0" msgid "Cannot delete Home and Attachments folders" msgstr "crwdns92084:0crwdne92084:0" -#: model/delete_doc.py:373 +#: model/delete_doc.py:382 msgid "Cannot delete or cancel because {0} {1} is linked with {2} {3} {4}" msgstr "crwdns92086:0{0}crwdnd92086:0{1}crwdnd92086:0{2}crwdnd92086:0{3}crwdnd92086:0{4}crwdne92086:0" @@ -3983,7 +4001,7 @@ msgstr "crwdns92100:0{0}crwdne92100:0" msgid "Cannot delete {0}" msgstr "crwdns92102:0{0}crwdne92102:0" -#: utils/nestedset.py:296 +#: utils/nestedset.py:299 msgid "Cannot delete {0} as it has child nodes" msgstr "crwdns92104:0{0}crwdne92104:0" @@ -3991,7 +4009,7 @@ msgstr "crwdns92104:0{0}crwdne92104:0" msgid "Cannot edit Standard Dashboards" msgstr "crwdns92106:0crwdne92106:0" -#: email/doctype/notification/notification.py:121 +#: email/doctype/notification/notification.py:122 msgid "Cannot edit Standard Notification. To edit, please disable this and duplicate it" msgstr "crwdns92108:0crwdne92108:0" @@ -4060,9 +4078,9 @@ msgstr "crwdns92136:0crwdne92136:0" msgid "Cannot set 'Report' permission if 'Only If Creator' permission is set" msgstr "crwdns110830:0crwdne110830:0" -#: email/doctype/notification/notification.py:137 -msgid "Cannot set Notification on Document Type {0}" -msgstr "crwdns92138:0{0}crwdne92138:0" +#: email/doctype/notification/notification.py:139 +msgid "Cannot set Notification with event {0} on Document Type {1}" +msgstr "crwdns142876:0{0}crwdnd142876:0{1}crwdne142876:0" #: core/doctype/docshare/docshare.py:67 msgid "Cannot share {0} with submit permission as the doctype {1} is not submittable" @@ -4234,6 +4252,8 @@ msgstr "crwdns128610:0crwdne128610:0" #. Label of the chart_name (Link) field in DocType 'Workspace Chart' #: desk/doctype/dashboard_chart/dashboard_chart.json #: desk/doctype/workspace_chart/workspace_chart.json +#: public/js/frappe/views/reports/query_report.js:289 +#: public/js/frappe/widgets/widget_dialog.js:137 msgid "Chart Name" msgstr "crwdns128612:0crwdne128612:0" @@ -4406,7 +4426,7 @@ msgstr "crwdns92296:0crwdne92296:0" msgid "Clear & Add template" msgstr "crwdns92298:0crwdne92298:0" -#: public/js/frappe/list/list_view.js:1864 +#: public/js/frappe/list/list_view.js:1918 msgctxt "Button in list view actions menu" msgid "Clear Assignment" msgstr "crwdns104478:0crwdne104478:0" @@ -4505,7 +4525,7 @@ msgstr "crwdns110842:0crwdne110842:0" msgid "Click to Set Filters" msgstr "crwdns110844:0crwdne110844:0" -#: public/js/frappe/list/list_view.js:680 +#: public/js/frappe/list/list_view.js:679 msgid "Click to sort by {0}" msgstr "crwdns110846:0{0}crwdne110846:0" @@ -4585,7 +4605,8 @@ msgid "Client URLs" msgstr "crwdns128656:0crwdne128656:0" #: core/doctype/communication/communication.js:39 desk/doctype/todo/todo.js:23 -#: public/js/frappe/ui/messages.js:243 website/js/bootstrap-4.js:24 +#: public/js/frappe/form/form_tour.js:17 public/js/frappe/ui/messages.js:244 +#: website/js/bootstrap-4.js:24 msgid "Close" msgstr "crwdns92372:0crwdne92372:0" @@ -4640,7 +4661,7 @@ msgstr "crwdns128666:0crwdne128666:0" msgid "Code challenge method" msgstr "crwdns128668:0crwdne128668:0" -#: public/js/frappe/form/form_tour.js:270 +#: public/js/frappe/form/form_tour.js:276 #: public/js/frappe/widgets/base_widget.js:159 msgid "Collapse" msgstr "crwdns92400:0crwdne92400:0" @@ -4650,7 +4671,7 @@ msgctxt "Shrink code field." msgid "Collapse" msgstr "crwdns92402:0crwdne92402:0" -#: public/js/frappe/views/reports/query_report.js:1979 +#: public/js/frappe/views/reports/query_report.js:1964 #: public/js/frappe/views/treeview.js:121 msgid "Collapse All" msgstr "crwdns92404:0crwdne92404:0" @@ -4942,7 +4963,7 @@ msgstr "crwdns92554:0crwdne92554:0" msgid "Complete By" msgstr "crwdns92558:0crwdne92558:0" -#: core/doctype/user/user.py:426 templates/emails/new_user.html:10 +#: core/doctype/user/user.py:432 templates/emails/new_user.html:10 msgid "Complete Registration" msgstr "crwdns92560:0crwdne92560:0" @@ -5504,7 +5525,7 @@ msgstr "crwdns128770:0crwdne128770:0" msgid "Create New" msgstr "crwdns92808:0crwdne92808:0" -#: public/js/frappe/list/list_view.js:487 +#: public/js/frappe/list/list_view.js:484 msgctxt "Create a new document from list view" msgid "Create New" msgstr "crwdns110866:0crwdne110866:0" @@ -5544,7 +5565,7 @@ msgstr "crwdns92822:0crwdne92822:0" #: public/js/frappe/form/controls/link.js:295 #: public/js/frappe/form/controls/link.js:297 #: public/js/frappe/form/link_selector.js:139 -#: public/js/frappe/list/list_view.js:476 +#: public/js/frappe/list/list_view.js:473 #: public/js/frappe/web_form/web_form_list.js:225 msgid "Create a new {0}" msgstr "crwdns92824:0{0}crwdne92824:0" @@ -5571,7 +5592,7 @@ msgstr "crwdns92828:0crwdne92828:0" msgid "Create or Edit Workflow" msgstr "crwdns92830:0crwdne92830:0" -#: public/js/frappe/list/list_view.js:479 +#: public/js/frappe/list/list_view.js:476 msgid "Create your first {0}" msgstr "crwdns92832:0{0}crwdne92832:0" @@ -5602,7 +5623,7 @@ msgid "Created Custom Field {0} in {1}" msgstr "crwdns92844:0{0}crwdnd92844:0{1}crwdne92844:0" #: desk/doctype/dashboard_chart/dashboard_chart.js:241 -#: email/doctype/notification/notification.js:30 model/meta.py:46 +#: email/doctype/notification/notification.js:33 model/meta.py:46 #: public/js/frappe/model/meta.js:198 public/js/frappe/model/model.js:125 #: public/js/frappe/views/dashboard/dashboard_view.js:478 msgid "Created On" @@ -5961,7 +5982,7 @@ msgstr "crwdns93010:0crwdne93010:0" msgid "Customizations Reset" msgstr "crwdns93012:0crwdne93012:0" -#: modules/utils.py:91 +#: modules/utils.py:95 msgid "Customizations for {0} exported to:
{1}" msgstr "crwdns93014:0{0}crwdnd93014:0{1}crwdne93014:0" @@ -5972,7 +5993,7 @@ msgstr "crwdns93014:0{0}crwdnd93014:0{1}crwdne93014:0" msgid "Customize" msgstr "crwdns93016:0crwdne93016:0" -#: public/js/frappe/list/list_view.js:1709 +#: public/js/frappe/list/list_view.js:1763 msgctxt "Button in list view menu" msgid "Customize" msgstr "crwdns93018:0crwdne93018:0" @@ -5987,6 +6008,7 @@ msgstr "crwdns93022:0crwdne93022:0" #. Name of a DocType #: automation/doctype/auto_repeat/auto_repeat.js:33 +#: core/doctype/doctype/doctype.js:65 #: custom/doctype/customize_form/customize_form.json #: public/js/frappe/views/kanban/kanban_view.js:343 msgid "Customize Form" @@ -6179,6 +6201,10 @@ msgstr "crwdns128842:0crwdne128842:0" msgid "Dashboard Settings" msgstr "crwdns93118:0crwdne93118:0" +#: public/js/frappe/list/base_list.js:205 +msgid "Dashboard View" +msgstr "crwdns142844:0crwdne142844:0" + #. Label of the tab_break_2 (Tab Break) field in DocType 'Workspace' #: desk/doctype/workspace/workspace.json msgid "Dashboards" @@ -6213,7 +6239,7 @@ msgstr "crwdns128844:0crwdne128844:0" msgid "Data" msgstr "crwdns93122:0crwdne93122:0" -#: public/js/frappe/form/controls/data.js:58 +#: public/js/frappe/form/controls/data.js:59 msgid "Data Clipped" msgstr "crwdns93148:0crwdne93148:0" @@ -6318,6 +6344,7 @@ msgstr "crwdns128854:0crwdne128854:0" #. Trail' #: core/doctype/audit_trail/audit_trail.json #: desk/page/leaderboard/leaderboard.js:165 +#: public/js/frappe/widgets/chart_widget.js:237 msgid "Date Range" msgstr "crwdns93198:0crwdne93198:0" @@ -6451,7 +6478,7 @@ msgstr "crwdns93266:0crwdne93266:0" #. Label of the default_incoming (Check) field in DocType 'Email Account' #: email/doctype/email_account/email_account.json -#: email/doctype/email_account/email_account.py:201 +#: email/doctype/email_account/email_account.py:217 msgid "Default Incoming" msgstr "crwdns93268:0crwdne93268:0" @@ -6471,7 +6498,7 @@ msgstr "crwdns128876:0crwdne128876:0" #. Label of the default_outgoing (Check) field in DocType 'Email Account' #: email/doctype/email_account/email_account.json -#: email/doctype/email_account/email_account.py:209 +#: email/doctype/email_account/email_account.py:225 msgid "Default Outgoing" msgstr "crwdns93278:0crwdne93278:0" @@ -6586,7 +6613,7 @@ msgstr "crwdns93326:0crwdne93326:0" msgid "Defaults" msgstr "crwdns128906:0crwdne128906:0" -#: email/doctype/email_account/email_account.py:220 +#: email/doctype/email_account/email_account.py:236 msgid "Defaults Updated" msgstr "crwdns93332:0crwdne93332:0" @@ -6612,7 +6639,7 @@ msgstr "crwdns128908:0crwdne128908:0" #: core/doctype/docperm/docperm.json #: core/doctype/user_document_type/user_document_type.json #: core/doctype/user_permission/user_permission_list.js:189 -#: public/js/frappe/form/footer/form_timeline.js:613 +#: public/js/frappe/form/footer/form_timeline.js:615 #: public/js/frappe/form/grid.js:63 public/js/frappe/form/toolbar.js:434 #: public/js/frappe/views/reports/report_view.js:1654 #: public/js/frappe/views/treeview.js:308 @@ -6622,7 +6649,7 @@ msgstr "crwdns128908:0crwdne128908:0" msgid "Delete" msgstr "crwdns93336:0crwdne93336:0" -#: public/js/frappe/list/list_view.js:1926 +#: public/js/frappe/list/list_view.js:1980 msgctxt "Button in list view actions menu" msgid "Delete" msgstr "crwdns93338:0crwdne93338:0" @@ -6651,7 +6678,7 @@ msgstr "crwdns93352:0crwdne93352:0" msgid "Delete and Generate New" msgstr "crwdns110882:0crwdne110882:0" -#: public/js/frappe/form/footer/form_timeline.js:719 +#: public/js/frappe/form/footer/form_timeline.js:721 msgid "Delete comment?" msgstr "crwdns93354:0crwdne93354:0" @@ -6659,12 +6686,12 @@ msgstr "crwdns93354:0crwdne93354:0" msgid "Delete this record to allow sending to this email address" msgstr "crwdns93356:0crwdne93356:0" -#: public/js/frappe/list/list_view.js:1931 +#: public/js/frappe/list/list_view.js:1985 msgctxt "Title of confirmation dialog" msgid "Delete {0} item permanently?" msgstr "crwdns93358:0{0}crwdne93358:0" -#: public/js/frappe/list/list_view.js:1937 +#: public/js/frappe/list/list_view.js:1991 msgctxt "Title of confirmation dialog" msgid "Delete {0} items permanently?" msgstr "crwdns93360:0{0}crwdne93360:0" @@ -6760,7 +6787,8 @@ msgid "Department" msgstr "crwdns128922:0crwdne128922:0" #. Label of the dependencies (Data) field in DocType 'Workspace Link' -#: desk/doctype/workspace_link/workspace_link.json www/attribution.html:29 +#: desk/doctype/workspace_link/workspace_link.json +#: public/js/frappe/widgets/widget_dialog.js:318 www/attribution.html:29 msgid "Dependencies" msgstr "crwdns112688:0crwdne112688:0" @@ -6902,7 +6930,7 @@ msgstr "crwdns93458:0crwdne93458:0" #: desk/doctype/event/event.json #: desk/page/user_profile/user_profile_sidebar.html:45 #: public/js/form_builder/store.js:259 public/js/form_builder/utils.js:38 -#: public/js/frappe/form/layout.js:135 public/js/frappe/views/treeview.js:271 +#: public/js/frappe/form/layout.js:137 public/js/frappe/views/treeview.js:271 msgid "Details" msgstr "crwdns93460:0crwdne93460:0" @@ -7050,7 +7078,7 @@ msgstr "crwdns128970:0crwdne128970:0" msgid "Disabled" msgstr "crwdns93510:0crwdne93510:0" -#: email/doctype/email_account/email_account.js:232 +#: email/doctype/email_account/email_account.js:261 msgid "Disabled Auto Reply" msgstr "crwdns93536:0crwdne93536:0" @@ -7067,7 +7095,7 @@ msgctxt "Button in web form" msgid "Discard" msgstr "crwdns110884:0crwdne110884:0" -#: public/js/frappe/form/form.js:840 +#: public/js/frappe/form/form.js:844 msgid "Discard {0}" msgstr "crwdns127626:0{0}crwdne127626:0" @@ -7094,7 +7122,7 @@ msgstr "crwdns93542:0crwdne93542:0" msgid "Discussion Topic" msgstr "crwdns93544:0crwdne93544:0" -#: public/js/frappe/form/footer/form_timeline.js:623 +#: public/js/frappe/form/footer/form_timeline.js:625 #: templates/discussions/reply_card.html:16 #: templates/discussions/reply_section.html:29 msgid "Dismiss" @@ -7145,7 +7173,7 @@ msgstr "crwdns93562:0{0}crwdne93562:0" msgid "Do you still want to proceed?" msgstr "crwdns93564:0crwdne93564:0" -#: public/js/frappe/form/form.js:953 +#: public/js/frappe/form/form.js:957 msgid "Do you want to cancel all linked documents?" msgstr "crwdns93566:0crwdne93566:0" @@ -7219,6 +7247,7 @@ msgstr "crwdns93582:0{0}crwdne93582:0" #: desk/doctype/workspace_shortcut/workspace_shortcut.json #: integrations/doctype/webhook/webhook.json #: printing/doctype/print_format/print_format.json +#: public/js/frappe/widgets/widget_dialog.js:164 #: website/doctype/website_slideshow/website_slideshow.js:18 msgid "DocType" msgstr "crwdns93584:0crwdne93584:0" @@ -7277,6 +7306,7 @@ msgstr "crwdns93632:0crwdne93632:0" #. Label of the doc_view (Select) field in DocType 'Workspace Shortcut' #: desk/doctype/workspace_shortcut/workspace_shortcut.json +#: public/js/frappe/widgets/widget_dialog.js:477 msgid "DocType View" msgstr "crwdns128992:0crwdne128992:0" @@ -7318,11 +7348,11 @@ msgstr "crwdns128994:0crwdne128994:0" msgid "DocType required" msgstr "crwdns93652:0crwdne93652:0" -#: modules/utils.py:170 +#: modules/utils.py:174 msgid "DocType {0} does not exist." msgstr "crwdns93654:0{0}crwdne93654:0" -#: modules/utils.py:233 +#: modules/utils.py:237 msgid "DocType {} not found" msgstr "crwdns93656:0crwdne93656:0" @@ -7428,7 +7458,7 @@ msgstr "crwdns93702:0#{0}crwdne93702:0" #: core/doctype/user_permission/user_permission_list.js:36 #: core/doctype/version/version.json desk/doctype/tag_link/tag_link.json #: email/doctype/document_follow/document_follow.json -#: public/js/frappe/form/form_tour.js:60 +#: public/js/frappe/form/form_tour.js:62 msgid "Document Name" msgstr "crwdns93704:0crwdne93704:0" @@ -7612,15 +7642,15 @@ msgstr "crwdns129022:0crwdne129022:0" msgid "Document Unlocked" msgstr "crwdns93812:0crwdne93812:0" -#: public/js/frappe/list/list_view.js:1081 +#: public/js/frappe/list/list_view.js:1118 msgid "Document has been cancelled" msgstr "crwdns93814:0crwdne93814:0" -#: public/js/frappe/list/list_view.js:1080 +#: public/js/frappe/list/list_view.js:1117 msgid "Document has been submitted" msgstr "crwdns93816:0crwdne93816:0" -#: public/js/frappe/list/list_view.js:1079 +#: public/js/frappe/list/list_view.js:1116 msgid "Document is in draft state" msgstr "crwdns93818:0crwdne93818:0" @@ -7743,7 +7773,7 @@ msgstr "crwdns129038:0crwdne129038:0" msgid "Don't have an account?" msgstr "crwdns93874:0crwdne93874:0" -#: public/js/frappe/ui/messages.js:231 +#: public/js/frappe/form/form_tour.js:16 public/js/frappe/ui/messages.js:231 #: public/js/onboarding_tours/onboarding_tours.js:17 msgid "Done" msgstr "crwdns93876:0crwdne93876:0" @@ -7800,7 +7830,7 @@ msgstr "crwdns129042:0crwdne129042:0" msgid "Download Your Data" msgstr "crwdns93896:0crwdne93896:0" -#: contacts/doctype/contact/contact.js:93 +#: contacts/doctype/contact/contact.js:98 msgid "Download vCard" msgstr "crwdns140790:0crwdne140790:0" @@ -7982,17 +8012,17 @@ msgstr "crwdns93972:0crwdne93972:0" #: printing/page/print_format_builder_beta/print_format_builder_beta.js:46 #: printing/page/print_format_builder_beta/print_format_builder_beta.js:85 #: public/js/frappe/form/controls/markdown_editor.js:31 -#: public/js/frappe/form/footer/form_timeline.js:652 -#: public/js/frappe/form/footer/form_timeline.js:661 +#: public/js/frappe/form/footer/form_timeline.js:654 +#: public/js/frappe/form/footer/form_timeline.js:663 #: public/js/frappe/form/templates/address_list.html:7 #: public/js/frappe/form/templates/contact_list.html:7 #: public/js/frappe/form/toolbar.js:681 #: public/js/frappe/views/reports/query_report.js:815 -#: public/js/frappe/views/reports/query_report.js:1649 +#: public/js/frappe/views/reports/query_report.js:1634 #: public/js/frappe/views/workspace/workspace.js:460 #: public/js/frappe/views/workspace/workspace.js:816 #: public/js/frappe/widgets/base_widget.js:64 -#: public/js/frappe/widgets/chart_widget.js:298 +#: public/js/frappe/widgets/chart_widget.js:299 #: public/js/frappe/widgets/number_card_widget.js:331 #: templates/discussions/reply_card.html:29 #: templates/discussions/reply_section.html:29 @@ -8001,7 +8031,7 @@ msgstr "crwdns93972:0crwdne93972:0" msgid "Edit" msgstr "crwdns93974:0crwdne93974:0" -#: public/js/frappe/list/list_view.js:2012 +#: public/js/frappe/list/list_view.js:2066 msgctxt "Button in list view actions menu" msgid "Edit" msgstr "crwdns93976:0crwdne93976:0" @@ -8031,7 +8061,7 @@ msgstr "crwdns93982:0crwdne93982:0" msgid "Edit DocType" msgstr "crwdns93984:0crwdne93984:0" -#: public/js/frappe/list/list_view.js:1736 +#: public/js/frappe/list/list_view.js:1790 msgctxt "Button in list view menu" msgid "Edit DocType" msgstr "crwdns93986:0crwdne93986:0" @@ -8177,6 +8207,7 @@ msgstr "crwdns129070:0crwdne129070:0" #. Label of the email_tab (Tab Break) field in DocType 'System Settings' #. Label of the email (Data) field in DocType 'User' #. Label of the email_settings (Section Break) field in DocType 'User' +#. Label of the email (Check) field in DocType 'User Document Type' #. Label of the email (Data) field in DocType 'Event Participants' #. Label of the email (Data) field in DocType 'Email Group Member' #. Label of the email (Data) field in DocType 'Email Unsubscribe' @@ -8189,6 +8220,7 @@ msgstr "crwdns129070:0crwdne129070:0" #: core/doctype/success_action/success_action.js:57 #: core/doctype/system_settings/system_settings.json #: core/doctype/user/user.json +#: core/doctype/user_document_type/user_document_type.json #: desk/doctype/event_participants/event_participants.json #: email/doctype/email_group_member/email_group_member.json #: email/doctype/email_unsubscribe/email_unsubscribe.json @@ -8224,7 +8256,7 @@ msgctxt "Email Account" msgid "Email Account" msgstr "crwdns94060:0crwdne94060:0" -#: email/doctype/email_account/email_account.py:316 +#: email/doctype/email_account/email_account.py:332 msgid "Email Account Disabled." msgstr "crwdns94072:0crwdne94072:0" @@ -8233,7 +8265,7 @@ msgstr "crwdns94072:0crwdne94072:0" msgid "Email Account Name" msgstr "crwdns129072:0crwdne129072:0" -#: core/doctype/user/user.py:690 +#: core/doctype/user/user.py:705 msgid "Email Account added multiple times" msgstr "crwdns94076:0crwdne94076:0" @@ -8529,7 +8561,7 @@ msgstr "crwdns129124:0crwdne129124:0" #. Label of the enable_incoming (Check) field in DocType 'Email Account' #: email/doctype/email_account/email_account.json -#: email/doctype/email_account/email_account.py:202 +#: email/doctype/email_account/email_account.py:218 msgid "Enable Incoming" msgstr "crwdns94210:0crwdne94210:0" @@ -8542,7 +8574,7 @@ msgstr "crwdns129126:0crwdne129126:0" #. Label of the enable_outgoing (Check) field in DocType 'Email Account' #: core/doctype/user_email/user_email.json #: email/doctype/email_account/email_account.json -#: email/doctype/email_account/email_account.py:210 +#: email/doctype/email_account/email_account.py:226 msgid "Enable Outgoing" msgstr "crwdns94216:0crwdne94216:0" @@ -8613,7 +8645,7 @@ msgstr "crwdns94244:0crwdne94244:0" #. Label of the enable_two_factor_auth (Check) field in DocType 'System #. Settings' -#: core/doctype/system_settings/system_settings.json twofactor.py:449 +#: core/doctype/system_settings/system_settings.json twofactor.py:433 msgid "Enable Two Factor Auth" msgstr "crwdns94246:0crwdne94246:0" @@ -8682,7 +8714,7 @@ msgstr "crwdns94262:0crwdne94262:0" msgid "Enabled Scheduler" msgstr "crwdns94290:0crwdne94290:0" -#: email/doctype/email_account/email_account.py:936 +#: email/doctype/email_account/email_account.py:987 msgid "Enabled email inbox for user {0}" msgstr "crwdns94292:0{0}crwdne94292:0" @@ -8695,7 +8727,7 @@ msgstr "crwdns94292:0{0}crwdne94292:0" msgid "Enables Calendar and Gantt views." msgstr "crwdns129154:0crwdne129154:0" -#: email/doctype/email_account/email_account.js:227 +#: email/doctype/email_account/email_account.js:256 msgid "Enabling auto reply on an incoming email account will send automated replies to all the synchronized emails. Do you wish to continue?" msgstr "crwdns94300:0crwdne94300:0" @@ -8793,7 +8825,7 @@ msgstr "crwdns94340:0crwdne94340:0" msgid "Energy Point Settings" msgstr "crwdns94344:0crwdne94344:0" -#: desk/doctype/notification_log/notification_log.py:159 +#: desk/doctype/notification_log/notification_log.py:160 msgid "Energy Point Update on {0}" msgstr "crwdns94346:0{0}crwdne94346:0" @@ -8803,6 +8835,8 @@ msgstr "crwdns94346:0{0}crwdne94346:0" #. 'Notification Settings' #: desk/doctype/notification_settings/notification_settings.json #: desk/page/user_profile/user_profile.html:28 +#: desk/page/user_profile/user_profile_controller.js:80 +#: desk/page/user_profile/user_profile_controller.js:114 #: desk/page/user_profile/user_profile_controller.js:402 #: templates/emails/energy_points_summary.html:39 msgid "Energy Points" @@ -8843,7 +8877,7 @@ msgctxt "Title of prompt dialog" msgid "Enter Value" msgstr "crwdns94362:0crwdne94362:0" -#: public/js/frappe/form/form_tour.js:58 +#: public/js/frappe/form/form_tour.js:60 msgid "Enter a name for this {0}" msgstr "crwdns94364:0{0}crwdne94364:0" @@ -8874,7 +8908,7 @@ msgstr "crwdns129182:0crwdne129182:0" msgid "Enter url parameter for receiver nos" msgstr "crwdns129184:0crwdne129184:0" -#: public/js/frappe/ui/messages.js:332 +#: public/js/frappe/ui/messages.js:334 msgid "Enter your password" msgstr "crwdns94376:0crwdne94376:0" @@ -8965,9 +8999,9 @@ msgstr "crwdns94422:0crwdne94422:0" msgid "Error in Header/Footer Script" msgstr "crwdns110924:0crwdne110924:0" -#: email/doctype/notification/notification.py:394 -#: email/doctype/notification/notification.py:510 -#: email/doctype/notification/notification.py:516 +#: email/doctype/notification/notification.py:443 +#: email/doctype/notification/notification.py:559 +#: email/doctype/notification/notification.py:565 msgid "Error in Notification" msgstr "crwdns94424:0crwdne94424:0" @@ -8975,11 +9009,11 @@ msgstr "crwdns94424:0crwdne94424:0" msgid "Error in print format on line {0}: {1}" msgstr "crwdns94426:0{0}crwdnd94426:0{1}crwdne94426:0" -#: email/doctype/email_account/email_account.py:614 +#: email/doctype/email_account/email_account.py:664 msgid "Error while connecting to email account {0}" msgstr "crwdns94428:0{0}crwdne94428:0" -#: email/doctype/notification/notification.py:507 +#: email/doctype/notification/notification.py:556 msgid "Error while evaluating Notification {0}. Please fix your template." msgstr "crwdns94430:0{0}crwdne94430:0" @@ -9136,7 +9170,7 @@ msgstr "crwdns94494:0crwdne94494:0" msgid "Executing..." msgstr "crwdns94496:0crwdne94496:0" -#: public/js/frappe/views/reports/query_report.js:1993 +#: public/js/frappe/views/reports/query_report.js:1978 msgid "Execution Time: {0} sec" msgstr "crwdns94498:0{0}crwdne94498:0" @@ -9154,7 +9188,7 @@ msgctxt "Enlarge code field." msgid "Expand" msgstr "crwdns94504:0crwdne94504:0" -#: public/js/frappe/views/reports/query_report.js:1979 +#: public/js/frappe/views/reports/query_report.js:1964 #: public/js/frappe/views/treeview.js:125 msgid "Expand All" msgstr "crwdns94506:0crwdne94506:0" @@ -9208,19 +9242,19 @@ msgstr "crwdns129232:0crwdne129232:0" #. Label of the export (Check) field in DocType 'DocPerm' #: core/doctype/custom_docperm/custom_docperm.json #: core/doctype/docperm/docperm.json core/doctype/recorder/recorder_list.js:37 -#: public/js/frappe/data_import/data_exporter.js:91 -#: public/js/frappe/data_import/data_exporter.js:242 -#: public/js/frappe/views/reports/query_report.js:1684 +#: public/js/frappe/data_import/data_exporter.js:92 +#: public/js/frappe/data_import/data_exporter.js:243 +#: public/js/frappe/views/reports/query_report.js:1669 #: public/js/frappe/views/reports/report_view.js:1550 msgid "Export" msgstr "crwdns94526:0crwdne94526:0" -#: public/js/frappe/list/list_view.js:2034 +#: public/js/frappe/list/list_view.js:2088 msgctxt "Button in list view actions menu" msgid "Export" msgstr "crwdns94528:0crwdne94528:0" -#: public/js/frappe/data_import/data_exporter.js:244 +#: public/js/frappe/data_import/data_exporter.js:245 msgid "Export 1 record" msgstr "crwdns94534:0crwdne94534:0" @@ -9293,7 +9327,7 @@ msgstr "crwdns129236:0crwdne129236:0" msgid "Export without main header" msgstr "crwdns129238:0crwdne129238:0" -#: public/js/frappe/data_import/data_exporter.js:246 +#: public/js/frappe/data_import/data_exporter.js:247 msgid "Export {0} records" msgstr "crwdns94564:0{0}crwdne94564:0" @@ -9446,7 +9480,7 @@ msgstr "crwdns94620:0crwdne94620:0" msgid "Failed to optimize image: {0}" msgstr "crwdns94622:0{0}crwdne94622:0" -#: email/doctype/email_queue/email_queue.py:281 +#: email/doctype/email_queue/email_queue.py:294 msgid "Failed to send email with subject:" msgstr "crwdns94624:0crwdne94624:0" @@ -9551,7 +9585,7 @@ msgstr "crwdns94660:0crwdne94660:0" #: public/js/frappe/list/bulk_operations.js:297 #: public/js/frappe/list/list_view_permission_restrictions.html:3 #: public/js/frappe/views/reports/query_report.js:236 -#: public/js/frappe/views/reports/query_report.js:1738 +#: public/js/frappe/views/reports/query_report.js:1723 #: website/doctype/web_form_field/web_form_field.json #: website/doctype/web_form_list_column/web_form_list_column.json msgid "Field" @@ -9626,10 +9660,14 @@ msgstr "crwdns94704:0{0}crwdnd94704:0{1}crwdne94704:0" msgid "Field {0} is referring to non-existing doctype {1}." msgstr "crwdns94706:0{0}crwdnd94706:0{1}crwdne94706:0" -#: public/js/frappe/form/form.js:1761 +#: public/js/frappe/form/form.js:1765 msgid "Field {0} not found." msgstr "crwdns94708:0{0}crwdne94708:0" +#: email/doctype/notification/notification.py:348 +msgid "Field {0} on document {1} is neither a Mobile number field nor a Customer or User link" +msgstr "crwdns142910:0{0}crwdnd142910:0{1}crwdne142910:0" + #. Label of the fieldname (Data) field in DocType 'Report Column' #. Label of the fieldname (Data) field in DocType 'Report Filter' #. Label of the fieldname (Data) field in DocType 'Custom Field' @@ -9762,7 +9800,7 @@ msgctxt "File" msgid "File" msgstr "crwdns94782:0crwdne94782:0" -#: core/doctype/file/utils.py:127 +#: core/doctype/file/utils.py:128 msgid "File '{0}' not found" msgstr "crwdns94786:0{0}crwdne94786:0" @@ -9859,7 +9897,7 @@ msgstr "crwdns94824:0crwdne94824:0" #: desk/doctype/number_card/number_card.js:205 #: desk/doctype/number_card/number_card.js:336 #: email/doctype/auto_email_report/auto_email_report.js:90 -#: public/js/frappe/list/base_list.js:882 +#: public/js/frappe/list/base_list.js:890 #: public/js/frappe/ui/filters/filter_list.js:134 #: website/doctype/web_form/web_form.js:197 msgid "Filter" @@ -10295,7 +10333,7 @@ msgstr "crwdns95024:0crwdne95024:0" msgid "For Value" msgstr "crwdns129392:0crwdne129392:0" -#: public/js/frappe/views/reports/query_report.js:1990 +#: public/js/frappe/views/reports/query_report.js:1975 #: public/js/frappe/views/reports/report_view.js:96 msgid "For comparison, use >5, <10 or =324. For ranges, use 5:10 (for values between 5 & 10)." msgstr "crwdns95034:0crwdne95034:0" @@ -10304,6 +10342,10 @@ msgstr "crwdns95034:0crwdne95034:0" msgid "For example if you cancel and amend INV004 it will become a new document INV004-1. This helps you to keep track of each amendment." msgstr "crwdns110948:0crwdne110948:0" +#: public/js/frappe/utils/dashboard_utils.js:162 +msgid "For example:" +msgstr "crwdns142878:0crwdne142878:0" + #: printing/page/print_format_builder/print_format_builder.js:744 msgid "For example: If you want to include the document ID, use {0}" msgstr "crwdns95036:0{0}crwdne95036:0" @@ -10483,6 +10525,20 @@ msgstr "crwdns95122:0crwdne95122:0" msgid "Frappe Light" msgstr "crwdns95124:0crwdne95124:0" +#. Option for the 'Service' (Select) field in DocType 'Email Account' +#: email/doctype/email_account/email_account.json email/frappemail.py:91 +msgid "Frappe Mail" +msgstr "crwdns142880:0crwdne142880:0" + +#: email/doctype/email_account/email_account.py:538 +msgid "Frappe Mail OAuth Error" +msgstr "crwdns142882:0crwdne142882:0" + +#. Label of the frappe_mail_site (Data) field in DocType 'Email Account' +#: email/doctype/email_account/email_account.json +msgid "Frappe Mail Site" +msgstr "crwdns142884:0crwdne142884:0" + #. Label of a standard help item #. Type: Action #: hooks.py @@ -10542,7 +10598,7 @@ msgstr "crwdns95156:0crwdne95156:0" msgid "From Date Field" msgstr "crwdns129430:0crwdne129430:0" -#: public/js/frappe/views/reports/query_report.js:1704 +#: public/js/frappe/views/reports/query_report.js:1689 msgid "From Document Type" msgstr "crwdns95162:0crwdne95162:0" @@ -10600,7 +10656,7 @@ msgstr "crwdns95188:0crwdne95188:0" msgid "Function Based On" msgstr "crwdns95192:0crwdne95192:0" -#: __init__.py:934 +#: __init__.py:940 msgid "Function {0} is not whitelisted." msgstr "crwdns95194:0{0}crwdne95194:0" @@ -10638,6 +10694,10 @@ msgstr "crwdns129446:0crwdne129446:0" msgid "Gantt" msgstr "crwdns95208:0crwdne95208:0" +#: public/js/frappe/list/base_list.js:206 +msgid "Gantt View" +msgstr "crwdns142846:0crwdne142846:0" + #. Label of the gender (Link) field in DocType 'Contact' #. Name of a DocType #. Label of the gender (Data) field in DocType 'Gender' @@ -10683,7 +10743,7 @@ msgstr "crwdns95228:0crwdne95228:0" msgid "Geolocation" msgstr "crwdns129450:0crwdne129450:0" -#: email/doctype/notification/notification.js:170 +#: email/doctype/notification/notification.js:193 msgid "Get Alerts for Today" msgstr "crwdns95236:0crwdne95236:0" @@ -11508,7 +11568,7 @@ msgstr "crwdns129578:0crwdne129578:0" msgid "Hide Standard Menu" msgstr "crwdns129580:0crwdne129580:0" -#: public/js/frappe/list/list_view.js:1611 +#: public/js/frappe/list/list_view.js:1665 msgid "Hide Tags" msgstr "crwdns95620:0crwdne95620:0" @@ -11526,7 +11586,7 @@ msgstr "crwdns95624:0crwdne95624:0" msgid "Hide descendant records of For Value." msgstr "crwdns129582:0crwdne129582:0" -#: public/js/frappe/form/layout.js:268 +#: public/js/frappe/form/layout.js:270 msgid "Hide details" msgstr "crwdns95628:0crwdne95628:0" @@ -11629,11 +11689,11 @@ msgstr "crwdns129602:0crwdne129602:0" #: core/doctype/data_import/importer.py:1139 #: core/doctype/data_import/importer.py:1204 #: core/doctype/data_import/importer.py:1207 desk/report/todo/todo.py:36 -#: model/meta.py:45 public/js/frappe/data_import/data_exporter.js:329 -#: public/js/frappe/data_import/data_exporter.js:344 +#: model/meta.py:45 public/js/frappe/data_import/data_exporter.js:330 +#: public/js/frappe/data_import/data_exporter.js:345 #: public/js/frappe/list/list_settings.js:334 -#: public/js/frappe/list/list_view.js:358 -#: public/js/frappe/list/list_view.js:422 public/js/frappe/model/meta.js:197 +#: public/js/frappe/list/list_view.js:355 +#: public/js/frappe/list/list_view.js:419 public/js/frappe/model/meta.js:197 #: public/js/frappe/model/model.js:122 msgid "ID" msgstr "crwdns95674:0crwdne95674:0" @@ -12009,6 +12069,10 @@ msgstr "crwdns129686:0crwdne129686:0" msgid "Image Link" msgstr "crwdns129688:0crwdne129688:0" +#: public/js/frappe/list/base_list.js:209 +msgid "Image View" +msgstr "crwdns142848:0crwdne142848:0" + #. Label of the image_width (Float) field in DocType 'Letter Head' #. Label of the footer_image_width (Float) field in DocType 'Letter Head' #: printing/doctype/letter_head/letter_head.json @@ -12023,7 +12087,7 @@ msgstr "crwdns95852:0crwdne95852:0" msgid "Image field must be of type Attach Image" msgstr "crwdns95854:0crwdne95854:0" -#: core/doctype/file/utils.py:135 +#: core/doctype/file/utils.py:136 msgid "Image link '{0}' is not valid" msgstr "crwdns95856:0{0}crwdne95856:0" @@ -12031,6 +12095,10 @@ msgstr "crwdns95856:0{0}crwdne95856:0" msgid "Image optimized" msgstr "crwdns95858:0crwdne95858:0" +#: core/doctype/file/utils.py:283 +msgid "Image: Corrupted Data Stream" +msgstr "crwdns142912:0crwdne142912:0" + #: public/js/frappe/views/image/image_view.js:13 msgid "Images" msgstr "crwdns95860:0crwdne95860:0" @@ -12069,7 +12137,7 @@ msgstr "crwdns129692:0crwdne129692:0" msgid "Import" msgstr "crwdns95866:0crwdne95866:0" -#: public/js/frappe/list/list_view.js:1673 +#: public/js/frappe/list/list_view.js:1727 msgctxt "Button in list view menu" msgid "Import" msgstr "crwdns95868:0crwdne95868:0" @@ -12280,6 +12348,10 @@ msgstr "crwdns95966:0crwdne95966:0" msgid "Inbox User" msgstr "crwdns95970:0crwdne95970:0" +#: public/js/frappe/list/base_list.js:210 +msgid "Inbox View" +msgstr "crwdns142850:0crwdne142850:0" + #. Label of the include_name_field (Check) field in DocType 'Form Tour' #: desk/doctype/form_tour/form_tour.json msgid "Include Name Field" @@ -12299,11 +12371,11 @@ msgstr "crwdns95976:0crwdne95976:0" msgid "Include Web View Link in Email" msgstr "crwdns129732:0crwdne129732:0" -#: public/js/frappe/views/reports/query_report.js:1521 +#: public/js/frappe/views/reports/query_report.js:1506 msgid "Include filters" msgstr "crwdns95980:0crwdne95980:0" -#: public/js/frappe/views/reports/query_report.js:1513 +#: public/js/frappe/views/reports/query_report.js:1498 msgid "Include indentation" msgstr "crwdns95982:0crwdne95982:0" @@ -12314,8 +12386,8 @@ msgstr "crwdns95984:0crwdne95984:0" #. Label of the incoming_popimap_tab (Tab Break) field in DocType 'Email #. Account' #: email/doctype/email_account/email_account.json -msgid "Incoming (POP/IMAP)" -msgstr "crwdns129734:0crwdne129734:0" +msgid "Incoming" +msgstr "crwdns142886:0crwdne142886:0" #. Label of the mailbox_settings (Section Break) field in DocType 'Email #. Account' @@ -12459,7 +12531,7 @@ msgstr "crwdns110970:0crwdne110970:0" #. Label of the insert_after (Select) field in DocType 'Custom Field' #: custom/doctype/custom_field/custom_field.json -#: public/js/frappe/views/reports/query_report.js:1744 +#: public/js/frappe/views/reports/query_report.js:1729 msgid "Insert After" msgstr "crwdns96046:0crwdne96046:0" @@ -12654,7 +12726,7 @@ msgid "Invalid" msgstr "crwdns129784:0crwdne129784:0" #: public/js/form_builder/utils.js:221 public/js/frappe/form/grid_row.js:770 -#: public/js/frappe/form/layout.js:793 +#: public/js/frappe/form/layout.js:795 msgid "Invalid \"depends_on\" expression" msgstr "crwdns96130:0crwdne96130:0" @@ -12666,7 +12738,7 @@ msgstr "crwdns96132:0{0}crwdne96132:0" msgid "Invalid \"mandatory_depends_on\" expression" msgstr "crwdns96134:0crwdne96134:0" -#: utils/nestedset.py:177 +#: utils/nestedset.py:178 msgid "Invalid Action" msgstr "crwdns96136:0crwdne96136:0" @@ -12758,7 +12830,7 @@ msgstr "crwdns127664:0crwdne127664:0" msgid "Invalid Parameters." msgstr "crwdns96176:0crwdne96176:0" -#: core/doctype/user/user.py:1176 www/update-password.html:121 +#: core/doctype/user/user.py:1191 www/update-password.html:121 #: www/update-password.html:142 www/update-password.html:144 #: www/update-password.html:245 msgid "Invalid Password" @@ -13037,6 +13109,7 @@ msgstr "crwdns96308:0crwdne96308:0" #. Label of the is_query_report (Check) field in DocType 'Workspace Link' #: desk/doctype/workspace_link/workspace_link.json +#: public/js/frappe/widgets/widget_dialog.js:336 msgid "Is Query Report" msgstr "crwdns129828:0crwdne129828:0" @@ -13126,7 +13199,7 @@ msgstr "crwdns129846:0crwdne129846:0" msgid "Is Virtual" msgstr "crwdns129848:0crwdne129848:0" -#: core/doctype/file/utils.py:156 utils/file_manager.py:311 +#: core/doctype/file/utils.py:157 utils/file_manager.py:311 msgid "It is risky to delete this file: {0}. Please contact your System Manager." msgstr "crwdns96366:0{0}crwdne96366:0" @@ -13140,7 +13213,7 @@ msgstr "crwdns129850:0crwdne129850:0" msgid "Item Type" msgstr "crwdns129852:0crwdne129852:0" -#: utils/nestedset.py:228 +#: utils/nestedset.py:229 msgid "Item cannot be added to its own descendants" msgstr "crwdns96372:0crwdne96372:0" @@ -13265,6 +13338,7 @@ msgstr "crwdns129880:0crwdne129880:0" #. Label of the kanban_board (Link) field in DocType 'Workspace Shortcut' #: desk/doctype/kanban_board/kanban_board.json #: desk/doctype/workspace_shortcut/workspace_shortcut.json +#: public/js/frappe/widgets/widget_dialog.js:509 msgid "Kanban Board" msgstr "crwdns96432:0crwdne96432:0" @@ -13284,6 +13358,10 @@ msgctxt "Button in kanban view menu" msgid "Kanban Settings" msgstr "crwdns96444:0crwdne96444:0" +#: public/js/frappe/list/base_list.js:207 +msgid "Kanban View" +msgstr "crwdns142852:0crwdne142852:0" + #. Description of a DocType #: core/doctype/activity_log/activity_log.json msgid "Keep track of all update feeds" @@ -13529,7 +13607,10 @@ msgstr "crwdns96524:0{0}crwdne96524:0" #: desk/doctype/workspace_quick_list/workspace_quick_list.json #: desk/doctype/workspace_shortcut/workspace_shortcut.json #: printing/page/print_format_builder/print_format_builder.js:474 +#: public/js/frappe/widgets/widget_dialog.js:187 #: public/js/frappe/widgets/widget_dialog.js:255 +#: public/js/frappe/widgets/widget_dialog.js:304 +#: public/js/frappe/widgets/widget_dialog.js:421 #: public/js/frappe/widgets/widget_dialog.js:645 #: public/js/frappe/widgets/widget_dialog.js:678 #: templates/form_grid/fields.html:37 @@ -13625,7 +13706,7 @@ msgstr "crwdns129948:0crwdne129948:0" msgid "Last Login" msgstr "crwdns129950:0crwdne129950:0" -#: email/doctype/notification/notification.js:31 +#: email/doctype/notification/notification.js:34 msgid "Last Modified Date" msgstr "crwdns110984:0crwdne110984:0" @@ -13673,6 +13754,11 @@ msgstr "crwdns129960:0crwdne129960:0" msgid "Last Sync On" msgstr "crwdns129962:0crwdne129962:0" +#. Label of the last_synced_at (Datetime) field in DocType 'Email Account' +#: email/doctype/email_account/email_account.json +msgid "Last Synced At" +msgstr "crwdns142888:0crwdne142888:0" + #. Label of the last_synced_on (Datetime) field in DocType 'Dashboard Chart' #: desk/doctype/dashboard_chart/dashboard_chart.json msgid "Last Synced On" @@ -13703,7 +13789,7 @@ msgstr "crwdns129968:0crwdne129968:0" msgid "Last Year" msgstr "crwdns129970:0crwdne129970:0" -#: public/js/frappe/widgets/chart_widget.js:698 +#: public/js/frappe/widgets/chart_widget.js:701 msgid "Last synced {0}" msgstr "crwdns96636:0{0}crwdne96636:0" @@ -13755,7 +13841,7 @@ msgid "Leave blank to repeat always" msgstr "crwdns129972:0crwdne129972:0" #: core/doctype/communication/mixins.py:207 -#: email/doctype/email_account/email_account.py:663 +#: email/doctype/email_account/email_account.py:714 msgid "Leave this conversation" msgstr "crwdns96658:0crwdne96658:0" @@ -13814,7 +13900,7 @@ msgstr "crwdns96684:0crwdne96684:0" msgid "Length of {0} should be between 1 and 1000" msgstr "crwdns96686:0{0}crwdne96686:0" -#: public/js/frappe/widgets/chart_widget.js:674 +#: public/js/frappe/widgets/chart_widget.js:677 msgid "Less" msgstr "crwdns110986:0crwdne110986:0" @@ -13897,6 +13983,7 @@ msgstr "crwdns129994:0crwdne129994:0" #. Label of the level (Select) field in DocType 'Help Article' #: core/doctype/custom_docperm/custom_docperm.json #: core/doctype/docperm/docperm.json +#: core/page/permission_manager/permission_manager.js:137 #: core/page/permission_manager/permission_manager.js:213 #: public/js/frappe/roles_editor.js:66 #: website/doctype/help_article/help_article.json @@ -14096,6 +14183,8 @@ msgstr "crwdns130038:0crwdne130038:0" #. Label of the link_to (Dynamic Link) field in DocType 'Workspace Shortcut' #: desk/doctype/workspace_link/workspace_link.json #: desk/doctype/workspace_shortcut/workspace_shortcut.json +#: public/js/frappe/widgets/widget_dialog.js:285 +#: public/js/frappe/widgets/widget_dialog.js:430 msgid "Link To" msgstr "crwdns130040:0crwdne130040:0" @@ -14105,6 +14194,7 @@ msgstr "crwdns110990:0crwdne110990:0" #. Label of the link_type (Select) field in DocType 'Workspace Link' #: desk/doctype/workspace_link/workspace_link.json +#: public/js/frappe/widgets/widget_dialog.js:277 msgid "Link Type" msgstr "crwdns130042:0crwdne130042:0" @@ -14148,7 +14238,7 @@ msgstr "crwdns96840:0crwdne96840:0" #. Label of the links (Table) field in DocType 'Customize Form' #. Label of the links (Table) field in DocType 'Workspace' #: contacts/doctype/address/address.js:39 contacts/doctype/address/address.json -#: contacts/doctype/contact/contact.js:87 contacts/doctype/contact/contact.json +#: contacts/doctype/contact/contact.js:92 contacts/doctype/contact/contact.json #: core/doctype/doctype/doctype.json #: custom/doctype/customize_form/customize_form.json #: desk/doctype/workspace/workspace.json public/js/frappe/form/toolbar.js:377 @@ -14196,11 +14286,15 @@ msgstr "crwdns130058:0crwdne130058:0" msgid "List Settings" msgstr "crwdns130060:0crwdne130060:0" -#: public/js/frappe/list/list_view.js:1753 +#: public/js/frappe/list/list_view.js:1807 msgctxt "Button in list view menu" msgid "List Settings" msgstr "crwdns96868:0crwdne96868:0" +#: public/js/frappe/list/base_list.js:203 +msgid "List View" +msgstr "crwdns142854:0crwdne142854:0" + #. Name of a DocType #: desk/doctype/list_view_settings/list_view_settings.json msgid "List View Settings" @@ -14237,13 +14331,13 @@ msgstr "crwdns96884:0crwdne96884:0" msgid "Load Balancing" msgstr "crwdns130066:0crwdne130066:0" -#: public/js/frappe/list/base_list.js:378 +#: public/js/frappe/list/base_list.js:386 #: website/doctype/blog_post/templates/blog_post_list.html:50 #: website/doctype/help_article/templates/help_article_list.html:30 msgid "Load More" msgstr "crwdns96888:0crwdne96888:0" -#: public/js/frappe/form/footer/form_timeline.js:214 +#: public/js/frappe/form/footer/form_timeline.js:216 msgctxt "Form timeline" msgid "Load More Communications" msgstr "crwdns96890:0crwdne96890:0" @@ -14251,8 +14345,8 @@ msgstr "crwdns96890:0crwdne96890:0" #: core/page/permission_manager/permission_manager.js:165 #: public/js/frappe/form/controls/multicheck.js:13 #: public/js/frappe/form/linked_with.js:13 -#: public/js/frappe/list/base_list.js:490 -#: public/js/frappe/list/list_view.js:335 public/js/frappe/ui/listing.html:16 +#: public/js/frappe/list/base_list.js:498 +#: public/js/frappe/list/list_view.js:332 public/js/frappe/ui/listing.html:16 #: public/js/frappe/views/reports/query_report.js:1017 msgid "Loading" msgstr "crwdns96892:0crwdne96892:0" @@ -14279,7 +14373,7 @@ msgstr "crwdns110996:0crwdne110996:0" #: public/js/frappe/views/kanban/kanban_board.html:11 #: public/js/frappe/widgets/chart_widget.js:50 #: public/js/frappe/widgets/number_card_widget.js:174 -#: public/js/frappe/widgets/quick_list_widget.js:126 +#: public/js/frappe/widgets/quick_list_widget.js:128 msgid "Loading..." msgstr "crwdns96898:0crwdne96898:0" @@ -14363,7 +14457,7 @@ msgstr "crwdns130080:0crwdne130080:0" msgid "Login Failed please try again" msgstr "crwdns96932:0crwdne96932:0" -#: email/doctype/email_account/email_account.py:141 +#: email/doctype/email_account/email_account.py:140 msgid "Login Id is required" msgstr "crwdns96934:0crwdne96934:0" @@ -14664,6 +14758,10 @@ msgstr "crwdns130124:0crwdne130124:0" msgid "Map Columns" msgstr "crwdns97072:0crwdne97072:0" +#: public/js/frappe/list/base_list.js:212 +msgid "Map View" +msgstr "crwdns142856:0crwdne142856:0" + #: public/js/frappe/data_import/import_preview.js:290 msgid "Map columns from {0} to fields in {1}" msgstr "crwdns111002:0{0}crwdnd111002:0{1}crwdne111002:0" @@ -14893,7 +14991,7 @@ msgstr "crwdns97168:0crwdne97168:0" msgid "Merge with existing" msgstr "crwdns97170:0crwdne97170:0" -#: utils/nestedset.py:304 +#: utils/nestedset.py:307 msgid "Merging is only possible between Group-to-Group or Leaf Node-to-Leaf Node" msgstr "crwdns97172:0crwdne97172:0" @@ -14929,7 +15027,7 @@ msgstr "crwdns97172:0crwdne97172:0" msgid "Message" msgstr "crwdns97174:0crwdne97174:0" -#: __init__.py:618 public/js/frappe/ui/messages.js:265 +#: __init__.py:624 public/js/frappe/ui/messages.js:267 msgctxt "Default title of the message dialog" msgid "Message" msgstr "crwdns97184:0crwdne97184:0" @@ -14970,7 +15068,7 @@ msgstr "crwdns130188:0crwdne130188:0" msgid "Message clipped" msgstr "crwdns97214:0crwdne97214:0" -#: email/doctype/email_account/email_account.py:317 +#: email/doctype/email_account/email_account.py:333 msgid "Message from server: {0}" msgstr "crwdns97216:0{0}crwdne97216:0" @@ -15049,6 +15147,10 @@ msgstr "crwdns97252:0crwdne97252:0" msgid "Method" msgstr "crwdns130200:0crwdne130200:0" +#: __init__.py:942 +msgid "Method Not Allowed" +msgstr "crwdns142858:0crwdne142858:0" + #: desk/doctype/number_card/number_card.py:70 msgid "Method is required to create a number card" msgstr "crwdns97266:0crwdne97266:0" @@ -15274,7 +15376,7 @@ msgstr "crwdns97390:0crwdne97390:0" msgid "Module to Export" msgstr "crwdns97392:0crwdne97392:0" -#: modules/utils.py:268 +#: modules/utils.py:272 msgid "Module {} not found" msgstr "crwdns97394:0crwdne97394:0" @@ -15358,7 +15460,7 @@ msgstr "crwdns111008:0crwdne111008:0" #: public/js/frappe/form/multi_select_dialog.js:72 #: public/js/frappe/ui/toolbar/search.js:285 #: public/js/frappe/ui/toolbar/search.js:300 -#: public/js/frappe/widgets/chart_widget.js:674 +#: public/js/frappe/widgets/chart_widget.js:677 #: templates/includes/list/list.html:23 #: templates/includes/search_template.html:13 msgid "More" @@ -15440,7 +15542,7 @@ msgstr "crwdns130234:0crwdne130234:0" msgid "Mozilla doesn't support :has() so you can pass parent selector here as workaround" msgstr "crwdns130236:0crwdne130236:0" -#: utils/nestedset.py:328 +#: utils/nestedset.py:331 msgid "Multiple root nodes not allowed." msgstr "crwdns97478:0crwdne97478:0" @@ -15642,12 +15744,12 @@ msgstr "crwdns130266:0crwdne130266:0" msgid "Navigate Home" msgstr "crwdns97562:0crwdne97562:0" -#: public/js/frappe/list/list_view.js:1161 +#: public/js/frappe/list/list_view.js:1198 msgctxt "Description of a list view shortcut" msgid "Navigate list down" msgstr "crwdns97564:0crwdne97564:0" -#: public/js/frappe/list/list_view.js:1168 +#: public/js/frappe/list/list_view.js:1205 msgctxt "Description of a list view shortcut" msgid "Navigate list up" msgstr "crwdns97566:0crwdne97566:0" @@ -15674,7 +15776,7 @@ msgstr "crwdns97574:0crwdne97574:0" msgid "Negative Value" msgstr "crwdns97576:0crwdne97576:0" -#: utils/nestedset.py:93 +#: utils/nestedset.py:94 msgid "Nested set error. Please contact the Administrator." msgstr "crwdns97578:0crwdne97578:0" @@ -15731,11 +15833,11 @@ msgstr "crwdns97594:0crwdne97594:0" msgid "New Document Form" msgstr "crwdns130270:0crwdne130270:0" -#: desk/doctype/notification_log/notification_log.py:158 +#: desk/doctype/notification_log/notification_log.py:159 msgid "New Document Shared {0}" msgstr "crwdns97598:0{0}crwdne97598:0" -#: public/js/frappe/form/footer/form_timeline.js:26 +#: public/js/frappe/form/footer/form_timeline.js:27 #: public/js/frappe/views/communication.js:23 msgid "New Email" msgstr "crwdns97600:0crwdne97600:0" @@ -15745,7 +15847,7 @@ msgstr "crwdns97600:0crwdne97600:0" msgid "New Email Account" msgstr "crwdns97602:0crwdne97602:0" -#: public/js/frappe/form/footer/form_timeline.js:45 +#: public/js/frappe/form/footer/form_timeline.js:47 msgid "New Event" msgstr "crwdns97604:0crwdne97604:0" @@ -15761,7 +15863,7 @@ msgstr "crwdns97608:0crwdne97608:0" msgid "New Links" msgstr "crwdns111020:0crwdne111020:0" -#: desk/doctype/notification_log/notification_log.py:156 +#: desk/doctype/notification_log/notification_log.py:157 msgid "New Mention on {0}" msgstr "crwdns97610:0{0}crwdne97610:0" @@ -15779,7 +15881,7 @@ msgstr "crwdns97614:0crwdne97614:0" msgid "New Newsletter" msgstr "crwdns97618:0crwdne97618:0" -#: desk/doctype/notification_log/notification_log.py:155 +#: desk/doctype/notification_log/notification_log.py:156 msgid "New Notification" msgstr "crwdns97620:0crwdne97620:0" @@ -15884,7 +15986,7 @@ msgstr "crwdns97648:0{0}crwdnd97648:0{1}crwdne97648:0" msgid "New {} releases for the following apps are available" msgstr "crwdns97650:0crwdne97650:0" -#: core/doctype/user/user.py:753 +#: core/doctype/user/user.py:768 msgid "Newly created user {0} has no roles enabled." msgstr "crwdns97652:0{0}crwdne97652:0" @@ -15935,7 +16037,7 @@ msgstr "crwdns97668:0crwdne97668:0" msgid "Newsletters" msgstr "crwdns97670:0crwdne97670:0" -#: public/js/frappe/form/form_tour.js:318 +#: public/js/frappe/form/form_tour.js:14 public/js/frappe/form/form_tour.js:324 #: public/js/frappe/web_form/web_form.js:91 #: public/js/onboarding_tours/onboarding_tours.js:15 #: public/js/onboarding_tours/onboarding_tours.js:240 @@ -16021,7 +16123,7 @@ msgstr "crwdns130294:0crwdne130294:0" #: public/js/form_builder/utils.js:341 #: public/js/frappe/form/controls/link.js:475 #: public/js/frappe/list/list_sidebar_group_by.js:223 -#: public/js/frappe/views/reports/query_report.js:1541 +#: public/js/frappe/views/reports/query_report.js:1526 #: website/doctype/help_article/templates/help_article.html:26 msgid "No" msgstr "crwdns97696:0crwdne97696:0" @@ -16065,7 +16167,7 @@ msgstr "crwdns97718:0crwdne97718:0" msgid "No Data to Show" msgstr "crwdns111038:0crwdne111038:0" -#: public/js/frappe/widgets/quick_list_widget.js:131 +#: public/js/frappe/widgets/quick_list_widget.js:133 msgid "No Data..." msgstr "crwdns111040:0crwdne111040:0" @@ -16085,7 +16187,7 @@ msgstr "crwdns97722:0crwdne97722:0" msgid "No Entry for the User {0} found within LDAP!" msgstr "crwdns97724:0{0}crwdne97724:0" -#: public/js/frappe/widgets/chart_widget.js:366 +#: public/js/frappe/widgets/chart_widget.js:367 msgid "No Filters Set" msgstr "crwdns97726:0crwdne97726:0" @@ -16163,7 +16265,7 @@ msgstr "crwdns97750:0crwdne97750:0" msgid "No Results found" msgstr "crwdns97752:0crwdne97752:0" -#: core/doctype/user/user.py:754 +#: core/doctype/user/user.py:769 msgid "No Roles Specified" msgstr "crwdns97754:0crwdne97754:0" @@ -16191,7 +16293,7 @@ msgstr "crwdns111056:0crwdne111056:0" msgid "No address added yet." msgstr "crwdns111058:0crwdne111058:0" -#: email/doctype/notification/notification.js:180 +#: email/doctype/notification/notification.js:203 msgid "No alerts for today" msgstr "crwdns97760:0crwdne97760:0" @@ -16318,11 +16420,11 @@ msgstr "crwdns130300:0crwdne130300:0" msgid "No of Sent SMS" msgstr "crwdns130302:0crwdne130302:0" -#: __init__.py:1126 client.py:109 client.py:151 +#: __init__.py:1132 client.py:109 client.py:151 msgid "No permission for {0}" msgstr "crwdns97808:0{0}crwdne97808:0" -#: public/js/frappe/form/form.js:1137 +#: public/js/frappe/form/form.js:1141 msgctxt "{0} = verb, {1} = object" msgid "No permission to '{0}' {1}" msgstr "crwdns97810:0{0}crwdnd97810:0{1}crwdne97810:0" @@ -16347,7 +16449,7 @@ msgstr "crwdns97818:0{0}crwdne97818:0" msgid "No records tagged." msgstr "crwdns111072:0crwdne111072:0" -#: public/js/frappe/data_import/data_exporter.js:224 +#: public/js/frappe/data_import/data_exporter.js:225 msgid "No records will be exported" msgstr "crwdns97820:0crwdne97820:0" @@ -16371,7 +16473,7 @@ msgstr "crwdns111076:0{0}crwdne111076:0" msgid "No {0} found" msgstr "crwdns111078:0{0}crwdne111078:0" -#: public/js/frappe/list/list_view.js:469 +#: public/js/frappe/list/list_view.js:466 msgid "No {0} found with matching filters. Clear filters to see all {0}." msgstr "crwdns97826:0{0}crwdnd97826:0{0}crwdne97826:0" @@ -16413,7 +16515,7 @@ msgstr "crwdns130308:0crwdne130308:0" msgid "Normalized Query" msgstr "crwdns130310:0crwdne130310:0" -#: core/doctype/user/user.py:959 templates/includes/login/login.js:257 +#: core/doctype/user/user.py:974 templates/includes/login/login.js:257 #: utils/oauth.py:265 msgid "Not Allowed" msgstr "crwdns97846:0crwdne97846:0" @@ -16460,7 +16562,7 @@ msgstr "crwdns97862:0crwdne97862:0" msgid "Not Nullable" msgstr "crwdns130314:0crwdne130314:0" -#: __init__.py:1018 app.py:357 desk/calendar.py:26 geo/utils.py:97 +#: __init__.py:1024 app.py:357 desk/calendar.py:26 geo/utils.py:97 #: public/js/frappe/web_form/webform_script.js:15 #: website/doctype/web_form/web_form.py:602 #: website/page_renderers/not_permitted_page.py:20 www/login.py:181 @@ -16512,7 +16614,7 @@ msgstr "crwdns97884:0crwdne97884:0" msgid "Not a valid Comma Separated Value (CSV File)" msgstr "crwdns97886:0crwdne97886:0" -#: core/doctype/user/user.py:235 +#: core/doctype/user/user.py:240 msgid "Not a valid User Image." msgstr "crwdns97888:0crwdne97888:0" @@ -16532,7 +16634,7 @@ msgstr "crwdns97892:0crwdne97892:0" msgid "Not allowed for {0}: {1}" msgstr "crwdns97894:0{0}crwdnd97894:0{1}crwdne97894:0" -#: email/doctype/notification/notification.py:391 +#: email/doctype/notification/notification.py:440 msgid "Not allowed to attach {0} document, please enable Allow Print For {0} in Print Settings" msgstr "crwdns97896:0{0}crwdnd97896:0{0}crwdne97896:0" @@ -16651,7 +16753,7 @@ msgstr "crwdns97940:0crwdne97940:0" msgid "Nothing left to undo" msgstr "crwdns97942:0crwdne97942:0" -#: public/js/frappe/list/base_list.js:362 +#: public/js/frappe/list/base_list.js:370 #: public/js/frappe/views/reports/query_report.js:105 #: templates/includes/list/list.html:7 #: website/doctype/blog_post/templates/blog_post_list.html:41 @@ -16714,6 +16816,18 @@ msgstr "crwdns97970:0crwdne97970:0" msgid "Notification sent to" msgstr "crwdns111084:0crwdne111084:0" +#: email/doctype/notification/notification.py:345 +msgid "Notification: customer {0} has no Mobile number set" +msgstr "crwdns142914:0{0}crwdne142914:0" + +#: email/doctype/notification/notification.py:331 +msgid "Notification: document {0} has no {1} number set (field: {2})" +msgstr "crwdns142916:0{0}crwdnd142916:0{1}crwdnd142916:0{2}crwdne142916:0" + +#: email/doctype/notification/notification.py:340 +msgid "Notification: user {0} has no Mobile number set" +msgstr "crwdns142918:0{0}crwdne142918:0" + #. Label of the notifications (Check) field in DocType 'Role' #: core/doctype/role/role.json #: public/js/frappe/ui/notifications/notifications.js:50 @@ -16918,7 +17032,7 @@ msgstr "crwdns98046:0crwdne98046:0" msgid "OAuth Scope" msgstr "crwdns98048:0crwdne98048:0" -#: email/doctype/email_account/email_account.js:182 +#: email/doctype/email_account/email_account.js:211 msgid "OAuth has been enabled but not authorised. Please use \"Authorise API Access\" button to do the same." msgstr "crwdns98050:0crwdne98050:0" @@ -16942,11 +17056,11 @@ msgstr "crwdns130366:0crwdne130366:0" msgid "OTP Issuer Name" msgstr "crwdns130368:0crwdne130368:0" -#: twofactor.py:461 +#: twofactor.py:445 msgid "OTP Secret Reset - {0}" msgstr "crwdns98060:0{0}crwdne98060:0" -#: twofactor.py:480 +#: twofactor.py:464 msgid "OTP Secret has been reset. Re-registration will be required on next login." msgstr "crwdns98062:0crwdne98062:0" @@ -17057,9 +17171,14 @@ msgstr "crwdns111096:0{0}crwdnd111096:0{1}crwdne111096:0" #. Label of the onboard (Check) field in DocType 'Workspace Link' #: desk/doctype/workspace_link/workspace_link.json +#: public/js/frappe/widgets/widget_dialog.js:330 msgid "Onboard" msgstr "crwdns130402:0crwdne130402:0" +#: public/js/frappe/widgets/widget_dialog.js:236 +msgid "Onboarding Name" +msgstr "crwdns142860:0crwdne142860:0" + #. Name of a DocType #: desk/doctype/onboarding_permission/onboarding_permission.json msgid "Onboarding Permission" @@ -17113,7 +17232,7 @@ msgstr "crwdns98110:0{0}crwdnd98110:0{1}crwdne98110:0" msgid "Only 200 inserts allowed in one request" msgstr "crwdns98112:0crwdne98112:0" -#: email/doctype/email_queue/email_queue.py:81 +#: email/doctype/email_queue/email_queue.py:82 msgid "Only Administrator can delete Email Queue" msgstr "crwdns98114:0crwdne98114:0" @@ -17167,6 +17286,7 @@ msgstr "crwdns127690:0crwdne127690:0" #. Label of the only_for (Link) field in DocType 'Workspace Link' #: desk/doctype/workspace_link/workspace_link.json +#: public/js/frappe/widgets/widget_dialog.js:323 msgid "Only for" msgstr "crwdns130412:0crwdne130412:0" @@ -17276,7 +17396,7 @@ msgstr "crwdns130420:0crwdne130420:0" msgid "Open a module or tool" msgstr "crwdns98184:0crwdne98184:0" -#: public/js/frappe/list/list_view.js:1214 +#: public/js/frappe/list/list_view.js:1251 msgctxt "Description of a list view shortcut" msgid "Open list item" msgstr "crwdns98186:0crwdne98186:0" @@ -17451,10 +17571,10 @@ msgstr "crwdns111108:0crwdne111108:0" msgid "Other" msgstr "crwdns130444:0crwdne130444:0" -#. Label of the outgoing_smtp_tab (Tab Break) field in DocType 'Email Account' +#. Label of the outgoing_tab (Tab Break) field in DocType 'Email Account' #: email/doctype/email_account/email_account.json -msgid "Outgoing (SMTP)" -msgstr "crwdns130446:0crwdne130446:0" +msgid "Outgoing" +msgstr "crwdns142890:0crwdne142890:0" #. Label of the outgoing_mail_settings (Section Break) field in DocType 'Email #. Account' @@ -17516,7 +17636,7 @@ msgstr "crwdns130460:0crwdne130460:0" #: printing/page/print/print.js:71 #: public/js/frappe/form/templates/print_layout.html:44 -#: public/js/frappe/views/reports/query_report.js:1669 +#: public/js/frappe/views/reports/query_report.js:1654 msgid "PDF" msgstr "crwdns98288:0crwdne98288:0" @@ -17869,11 +17989,11 @@ msgstr "crwdns130516:0crwdne130516:0" msgid "Password" msgstr "crwdns98434:0crwdne98434:0" -#: core/doctype/user/user.py:1022 +#: core/doctype/user/user.py:1037 msgid "Password Email Sent" msgstr "crwdns98448:0crwdne98448:0" -#: core/doctype/user/user.py:406 +#: core/doctype/user/user.py:412 msgid "Password Reset" msgstr "crwdns98450:0crwdne98450:0" @@ -17895,7 +18015,7 @@ msgstr "crwdns98456:0crwdne98456:0" msgid "Password for Base DN" msgstr "crwdns130520:0crwdne130520:0" -#: email/doctype/email_account/email_account.py:172 +#: email/doctype/email_account/email_account.py:182 msgid "Password is required or select Awaiting Password" msgstr "crwdns98460:0crwdne98460:0" @@ -17907,9 +18027,9 @@ msgstr "crwdns98462:0crwdne98462:0" msgid "Password not found for {0} {1} {2}" msgstr "crwdns98464:0{0}crwdnd98464:0{1}crwdnd98464:0{2}crwdne98464:0" -#: core/doctype/user/user.py:1021 -msgid "Password reset instructions have been sent to your email" -msgstr "crwdns98466:0crwdne98466:0" +#: core/doctype/user/user.py:1036 +msgid "Password reset instructions have been sent to {}'s email" +msgstr "crwdns142862:0crwdne142862:0" #: www/update-password.html:164 msgid "Password set" @@ -17919,7 +18039,7 @@ msgstr "crwdns98468:0crwdne98468:0" msgid "Password size exceeded the maximum allowed size" msgstr "crwdns98470:0crwdne98470:0" -#: core/doctype/user/user.py:817 +#: core/doctype/user/user.py:832 msgid "Password size exceeded the maximum allowed size." msgstr "crwdns98472:0crwdne98472:0" @@ -18057,15 +18177,15 @@ msgstr "crwdns130548:0crwdne130548:0" msgid "Permanent" msgstr "crwdns130550:0crwdne130550:0" -#: public/js/frappe/form/form.js:1023 +#: public/js/frappe/form/form.js:1027 msgid "Permanently Cancel {0}?" msgstr "crwdns98534:0{0}crwdne98534:0" -#: public/js/frappe/form/form.js:1069 +#: public/js/frappe/form/form.js:1073 msgid "Permanently Discard {0}?" msgstr "crwdns127706:0{0}crwdne127706:0" -#: public/js/frappe/form/form.js:853 +#: public/js/frappe/form/form.js:857 msgid "Permanently Submit {0}?" msgstr "crwdns98536:0{0}crwdne98536:0" @@ -18252,6 +18372,10 @@ msgstr "crwdns130572:0crwdne130572:0" msgid "Plant" msgstr "crwdns130574:0crwdne130574:0" +#: email/doctype/email_account/email_account.py:535 +msgid "Please Authorize OAuth for Email Account {0}" +msgstr "crwdns142892:0{0}crwdne142892:0" + #: email/oauth.py:29 msgid "Please Authorize OAuth for Email Account {}" msgstr "crwdns98622:0crwdne98622:0" @@ -18280,7 +18404,7 @@ msgstr "crwdns98632:0crwdne98632:0" msgid "Please add a valid comment." msgstr "crwdns98634:0crwdne98634:0" -#: core/doctype/user/user.py:1004 +#: core/doctype/user/user.py:1019 msgid "Please ask your administrator to verify your sign-up" msgstr "crwdns98636:0crwdne98636:0" @@ -18308,11 +18432,11 @@ msgstr "crwdns98646:0crwdne98646:0" msgid "Please check the filter values set for Dashboard Chart: {}" msgstr "crwdns98648:0crwdne98648:0" -#: model/base_document.py:872 +#: model/base_document.py:873 msgid "Please check the value of \"Fetch From\" set for field {0}" msgstr "crwdns98650:0{0}crwdne98650:0" -#: core/doctype/user/user.py:1002 +#: core/doctype/user/user.py:1017 msgid "Please check your email for verification" msgstr "crwdns98652:0crwdne98652:0" @@ -18594,11 +18718,11 @@ msgstr "crwdns98782:0crwdne98782:0" msgid "Please setup a message first" msgstr "crwdns98784:0crwdne98784:0" -#: email/doctype/email_account/email_account.py:407 +#: email/doctype/email_account/email_account.py:423 msgid "Please setup default Email Account from Settings > Email Account" msgstr "crwdns98786:0crwdne98786:0" -#: core/doctype/user/user.py:371 +#: core/doctype/user/user.py:377 msgid "Please setup default outgoing Email Account from Settings > Email Account" msgstr "crwdns98788:0crwdne98788:0" @@ -18610,11 +18734,11 @@ msgstr "crwdns98790:0crwdne98790:0" msgid "Please specify a valid parent DocType for {0}" msgstr "crwdns98792:0{0}crwdne98792:0" -#: email/doctype/notification/notification.py:87 +#: email/doctype/notification/notification.py:88 msgid "Please specify which date field must be checked" msgstr "crwdns98794:0crwdne98794:0" -#: email/doctype/notification/notification.py:90 +#: email/doctype/notification/notification.py:91 msgid "Please specify which value field must be checked" msgstr "crwdns98796:0crwdne98796:0" @@ -18879,6 +19003,7 @@ msgstr "crwdns130614:0crwdne130614:0" msgid "Preview:" msgstr "crwdns111132:0crwdne111132:0" +#: public/js/frappe/form/form_tour.js:15 #: public/js/frappe/web_form/web_form.js:95 #: public/js/onboarding_tours/onboarding_tours.js:16 #: templates/includes/slideshow.html:34 @@ -18900,7 +19025,7 @@ msgstr "crwdns98914:0crwdne98914:0" msgid "Previous Hash" msgstr "crwdns130616:0crwdne130616:0" -#: public/js/frappe/form/form.js:2217 +#: public/js/frappe/form/form.js:2222 msgid "Previous Submission" msgstr "crwdns98918:0crwdne98918:0" @@ -18940,20 +19065,22 @@ msgstr "crwdns112704:0{0}crwdne112704:0" #. Label of the print (Check) field in DocType 'Custom DocPerm' #. Label of the print (Check) field in DocType 'DocPerm' +#. Label of the print (Check) field in DocType 'User Document Type' #: core/doctype/custom_docperm/custom_docperm.json #: core/doctype/docperm/docperm.json #: core/doctype/success_action/success_action.js:56 +#: core/doctype/user_document_type/user_document_type.json #: printing/page/print/print.js:65 public/js/frappe/form/success_action.js:81 #: public/js/frappe/form/templates/print_layout.html:46 #: public/js/frappe/form/toolbar.js:332 public/js/frappe/form/toolbar.js:344 #: public/js/frappe/list/bulk_operations.js:87 -#: public/js/frappe/views/reports/query_report.js:1655 +#: public/js/frappe/views/reports/query_report.js:1640 #: public/js/frappe/views/reports/report_view.js:1460 #: public/js/frappe/views/treeview.js:469 www/printview.html:18 msgid "Print" msgstr "crwdns98924:0crwdne98924:0" -#: public/js/frappe/list/list_view.js:1918 +#: public/js/frappe/list/list_view.js:1972 msgctxt "Button in list view actions menu" msgid "Print" msgstr "crwdns98926:0crwdne98926:0" @@ -19213,7 +19340,7 @@ msgstr "crwdns99052:0crwdne99052:0" msgid "Processing" msgstr "crwdns99054:0crwdne99054:0" -#: email/doctype/email_queue/email_queue.py:434 +#: email/doctype/email_queue/email_queue.py:447 msgid "Processing..." msgstr "crwdns99056:0crwdne99056:0" @@ -19349,7 +19476,7 @@ msgstr "crwdns99120:0crwdne99120:0" msgid "Publishing Dates" msgstr "crwdns130668:0crwdne130668:0" -#: email/doctype/email_account/email_account.js:159 +#: email/doctype/email_account/email_account.js:179 msgid "Pull Emails" msgstr "crwdns99124:0crwdne99124:0" @@ -19696,12 +19823,12 @@ msgstr "crwdns111152:0crwdne111152:0" msgid "Re-Run in Console" msgstr "crwdns99268:0crwdne99268:0" -#: email/doctype/email_account/email_account.py:669 +#: email/doctype/email_account/email_account.py:720 msgid "Re:" msgstr "crwdns99270:0crwdne99270:0" #: core/doctype/communication/communication.js:268 -#: public/js/frappe/form/footer/form_timeline.js:587 +#: public/js/frappe/form/footer/form_timeline.js:589 #: public/js/frappe/views/communication.js:355 msgid "Re: {0}" msgstr "crwdns99272:0{0}crwdne99272:0" @@ -19809,7 +19936,7 @@ msgstr "crwdns99328:0crwdne99328:0" msgid "Rebuild Tree" msgstr "crwdns99330:0crwdne99330:0" -#: utils/nestedset.py:176 +#: utils/nestedset.py:177 msgid "Rebuilding of tree is not supported for {}" msgstr "crwdns99332:0crwdne99332:0" @@ -20164,12 +20291,12 @@ msgid "Referrer" msgstr "crwdns99526:0crwdne99526:0" #: printing/page/print/print.js:73 public/js/frappe/desk.js:134 -#: public/js/frappe/desk.js:533 public/js/frappe/form/form.js:1196 +#: public/js/frappe/desk.js:533 public/js/frappe/form/form.js:1200 #: public/js/frappe/form/templates/print_layout.html:6 #: public/js/frappe/list/base_list.js:66 -#: public/js/frappe/views/reports/query_report.js:1644 +#: public/js/frappe/views/reports/query_report.js:1629 #: public/js/frappe/views/treeview.js:475 -#: public/js/frappe/widgets/chart_widget.js:290 +#: public/js/frappe/widgets/chart_widget.js:291 #: public/js/frappe/widgets/number_card_widget.js:324 msgid "Refresh" msgstr "crwdns99530:0crwdne99530:0" @@ -20196,7 +20323,7 @@ msgstr "crwdns130796:0crwdne130796:0" msgid "Refresh Token" msgstr "crwdns130798:0crwdne130798:0" -#: public/js/frappe/list/list_view.js:507 +#: public/js/frappe/list/list_view.js:504 msgctxt "Document count in list view" msgid "Refreshing" msgstr "crwdns111160:0crwdne111160:0" @@ -20206,7 +20333,7 @@ msgstr "crwdns111160:0crwdne111160:0" msgid "Refreshing..." msgstr "crwdns99546:0crwdne99546:0" -#: core/doctype/user/user.py:966 +#: core/doctype/user/user.py:981 msgid "Registered but disabled" msgstr "crwdns99548:0crwdne99548:0" @@ -20265,7 +20392,7 @@ msgstr "crwdns99566:0crwdne99566:0" msgid "Reload File" msgstr "crwdns111162:0crwdne111162:0" -#: public/js/frappe/list/base_list.js:242 +#: public/js/frappe/list/base_list.js:250 msgid "Reload List" msgstr "crwdns99568:0crwdne99568:0" @@ -20423,7 +20550,7 @@ msgstr "crwdns130826:0crwdne130826:0" #. Label of the reply (Text Editor) field in DocType 'Discussion Reply' #: core/doctype/communication/communication.js:57 -#: public/js/frappe/form/footer/form_timeline.js:550 +#: public/js/frappe/form/footer/form_timeline.js:552 #: website/doctype/discussion_reply/discussion_reply.json msgid "Reply" msgstr "crwdns99638:0crwdne99638:0" @@ -20534,7 +20661,7 @@ msgstr "crwdns99694:0crwdne99694:0" #: core/doctype/report/report.json #: desk/doctype/dashboard_chart/dashboard_chart.json #: desk/doctype/number_card/number_card.json -#: public/js/frappe/views/reports/query_report.js:1825 +#: public/js/frappe/views/reports/query_report.js:1810 msgid "Report Name" msgstr "crwdns99696:0crwdne99696:0" @@ -20557,6 +20684,10 @@ msgstr "crwdns130836:0crwdne130836:0" msgid "Report Type" msgstr "crwdns130838:0crwdne130838:0" +#: public/js/frappe/list/base_list.js:204 +msgid "Report View" +msgstr "crwdns142864:0crwdne142864:0" + #: core/doctype/doctype/doctype.py:1780 msgid "Report cannot be set for Single types" msgstr "crwdns99718:0crwdne99718:0" @@ -20591,7 +20722,7 @@ msgstr "crwdns99730:0crwdne99730:0" msgid "Report was not saved (there were errors)" msgstr "crwdns99732:0crwdne99732:0" -#: public/js/frappe/views/reports/query_report.js:1863 +#: public/js/frappe/views/reports/query_report.js:1848 msgid "Report with more than 10 columns looks better in Landscape mode." msgstr "crwdns99734:0crwdne99734:0" @@ -20745,7 +20876,7 @@ msgstr "crwdns99794:0crwdne99794:0" msgid "Reset Changes" msgstr "crwdns99796:0crwdne99796:0" -#: public/js/frappe/widgets/chart_widget.js:305 +#: public/js/frappe/widgets/chart_widget.js:306 msgid "Reset Chart" msgstr "crwdns99798:0crwdne99798:0" @@ -21093,7 +21224,7 @@ msgstr "crwdns99964:0crwdne99964:0" msgid "Role Permissions Manager" msgstr "crwdns99968:0crwdne99968:0" -#: public/js/frappe/list/list_view.js:1695 +#: public/js/frappe/list/list_view.js:1749 msgctxt "Button in list view menu" msgid "Role Permissions Manager" msgstr "crwdns99970:0crwdne99970:0" @@ -21125,7 +21256,7 @@ msgstr "crwdns130912:0crwdne130912:0" msgid "Role and Level" msgstr "crwdns130914:0crwdne130914:0" -#: core/doctype/user/user.py:316 +#: core/doctype/user/user.py:322 msgid "Role has been set as per the user type {0}" msgstr "crwdns99982:0{0}crwdne99982:0" @@ -21177,7 +21308,7 @@ msgstr "crwdns130922:0crwdne130922:0" msgid "Roles can be set for users from their User page." msgstr "crwdns111176:0crwdne111176:0" -#: utils/nestedset.py:277 +#: utils/nestedset.py:280 msgid "Root {0} cannot be deleted" msgstr "crwdns100012:0{0}crwdne100012:0" @@ -21250,7 +21381,7 @@ msgstr "crwdns111178:0crwdne111178:0" msgid "Row # {0}: Non administrator user can not set the role {1} to the custom doctype" msgstr "crwdns100056:0{0}crwdnd100056:0{1}crwdne100056:0" -#: model/base_document.py:903 +#: model/base_document.py:904 msgid "Row #{0}:" msgstr "crwdns100058:0#{0}crwdne100058:0" @@ -21426,7 +21557,7 @@ msgstr "crwdns100122:0{0}crwdne100122:0" msgid "SMS was not sent. Please contact Administrator." msgstr "crwdns111190:0crwdne111190:0" -#: email/doctype/email_account/email_account.py:189 +#: email/doctype/email_account/email_account.py:205 msgid "SMTP Server is required" msgstr "crwdns100124:0crwdne100124:0" @@ -21524,7 +21655,7 @@ msgstr "crwdns130978:0crwdne130978:0" #: email/doctype/notification/notification.json #: printing/page/print/print.js:856 #: printing/page/print_format_builder/print_format_builder.js:160 -#: public/js/frappe/form/footer/form_timeline.js:661 +#: public/js/frappe/form/footer/form_timeline.js:663 #: public/js/frappe/form/quick_entry.js:161 #: public/js/frappe/list/list_settings.js:36 #: public/js/frappe/list/list_settings.js:244 @@ -21534,11 +21665,11 @@ msgstr "crwdns130978:0crwdne130978:0" #: public/js/frappe/views/kanban/kanban_settings.js:45 #: public/js/frappe/views/kanban/kanban_settings.js:189 #: public/js/frappe/views/kanban/kanban_view.js:343 -#: public/js/frappe/views/reports/query_report.js:1817 +#: public/js/frappe/views/reports/query_report.js:1802 #: public/js/frappe/views/reports/report_view.js:1640 #: public/js/frappe/views/workspace/workspace.js:501 #: public/js/frappe/widgets/base_widget.js:142 -#: public/js/frappe/widgets/quick_list_widget.js:117 +#: public/js/frappe/widgets/quick_list_widget.js:119 #: public/js/print_format_builder/print_format_builder.bundle.js:15 #: public/js/workflow_builder/workflow_builder.bundle.js:33 msgid "Save" @@ -21565,7 +21696,7 @@ msgstr "crwdns100180:0crwdne100180:0" msgid "Save Filter" msgstr "crwdns111194:0crwdne111194:0" -#: public/js/frappe/views/reports/query_report.js:1820 +#: public/js/frappe/views/reports/query_report.js:1805 msgid "Save Report" msgstr "crwdns100182:0crwdne100182:0" @@ -21578,7 +21709,7 @@ msgstr "crwdns100184:0crwdne100184:0" msgid "Save on Completion" msgstr "crwdns130980:0crwdne130980:0" -#: public/js/frappe/form/form_tour.js:289 +#: public/js/frappe/form/form_tour.js:295 msgid "Save the document." msgstr "crwdns100188:0crwdne100188:0" @@ -21921,7 +22052,7 @@ msgstr "crwdns111200:0crwdne111200:0" msgid "See all past reports." msgstr "crwdns100338:0crwdne100338:0" -#: public/js/frappe/form/form.js:1230 +#: public/js/frappe/form/form.js:1234 #: website/doctype/contact_us_settings/contact_us_settings.js:4 msgid "See on Website" msgstr "crwdns100340:0crwdne100340:0" @@ -21980,7 +22111,7 @@ msgstr "crwdns131026:0crwdne131026:0" msgid "Select" msgstr "crwdns100362:0crwdne100362:0" -#: public/js/frappe/data_import/data_exporter.js:148 +#: public/js/frappe/data_import/data_exporter.js:149 #: public/js/frappe/form/controls/multicheck.js:166 msgid "Select All" msgstr "crwdns111204:0crwdne111204:0" @@ -22068,11 +22199,11 @@ msgstr "crwdns111208:0crwdne111208:0" msgid "Select Fields" msgstr "crwdns100414:0crwdne100414:0" -#: public/js/frappe/data_import/data_exporter.js:146 +#: public/js/frappe/data_import/data_exporter.js:147 msgid "Select Fields To Insert" msgstr "crwdns100416:0crwdne100416:0" -#: public/js/frappe/data_import/data_exporter.js:147 +#: public/js/frappe/data_import/data_exporter.js:148 msgid "Select Fields To Update" msgstr "crwdns100418:0crwdne100418:0" @@ -22105,7 +22236,7 @@ msgstr "crwdns100428:0crwdne100428:0" msgid "Select List View" msgstr "crwdns131034:0crwdne131034:0" -#: public/js/frappe/data_import/data_exporter.js:157 +#: public/js/frappe/data_import/data_exporter.js:158 msgid "Select Mandatory" msgstr "crwdns100432:0crwdne100432:0" @@ -22187,7 +22318,7 @@ msgstr "crwdns100466:0crwdne100466:0" msgid "Select a valid Subject field for creating documents from Email" msgstr "crwdns100468:0crwdne100468:0" -#: public/js/frappe/form/form_tour.js:315 +#: public/js/frappe/form/form_tour.js:321 msgid "Select an Image" msgstr "crwdns100470:0crwdne100470:0" @@ -22209,13 +22340,13 @@ msgstr "crwdns100474:0crwdne100474:0" msgid "Select atleast 2 actions" msgstr "crwdns100476:0crwdne100476:0" -#: public/js/frappe/list/list_view.js:1228 +#: public/js/frappe/list/list_view.js:1265 msgctxt "Description of a list view shortcut" msgid "Select list item" msgstr "crwdns100478:0crwdne100478:0" -#: public/js/frappe/list/list_view.js:1180 -#: public/js/frappe/list/list_view.js:1196 +#: public/js/frappe/list/list_view.js:1217 +#: public/js/frappe/list/list_view.js:1233 msgctxt "Description of a list view shortcut" msgid "Select multiple list items" msgstr "crwdns100480:0crwdne100480:0" @@ -22657,6 +22788,14 @@ msgstr "crwdns131134:0crwdne131134:0" msgid "Session Expiry must be in format {0}" msgstr "crwdns100684:0{0}crwdne100684:0" +#: desk/doctype/dashboard_chart/dashboard_chart.js:400 +#: desk/doctype/dashboard_chart/dashboard_chart.js:487 +#: desk/doctype/number_card/number_card.js:295 +#: desk/doctype/number_card/number_card.js:387 +#: public/js/frappe/widgets/chart_widget.js:407 +msgid "Set" +msgstr "crwdns142894:0crwdne142894:0" + #: public/js/frappe/ui/filters/filter.js:569 msgctxt "Field value is set" msgid "Set" @@ -22688,8 +22827,8 @@ msgstr "crwdns100694:0crwdne100694:0" msgid "Set Filters" msgstr "crwdns100696:0crwdne100696:0" -#: public/js/frappe/widgets/chart_widget.js:395 -#: public/js/frappe/widgets/quick_list_widget.js:102 +#: public/js/frappe/widgets/chart_widget.js:396 +#: public/js/frappe/widgets/quick_list_widget.js:104 msgid "Set Filters for {0}" msgstr "crwdns100698:0{0}crwdne100698:0" @@ -22777,6 +22916,10 @@ msgstr "crwdns100730:0crwdne100730:0" msgid "Set by user" msgstr "crwdns131150:0crwdne131150:0" +#: public/js/frappe/utils/dashboard_utils.js:162 +msgid "Set dynamic filter values in JavaScript for the required fields here." +msgstr "crwdns142896:0crwdne142896:0" + #. Description of the 'Precision' (Select) field in DocType 'DocField' #. Description of the 'Precision' (Select) field in DocType 'Custom Field' #. Description of the 'Precision' (Select) field in DocType 'Customize Form @@ -22902,7 +23045,7 @@ msgstr "crwdns111218:0crwdne111218:0" msgid "Setup Approval Workflows" msgstr "crwdns100772:0crwdne100772:0" -#: public/js/frappe/views/reports/query_report.js:1690 +#: public/js/frappe/views/reports/query_report.js:1675 #: public/js/frappe/views/reports/report_view.js:1618 msgid "Setup Auto Email" msgstr "crwdns100774:0crwdne100774:0" @@ -22932,9 +23075,11 @@ msgstr "crwdns131162:0crwdne131162:0" #. Label of the share (Check) field in DocType 'Custom DocPerm' #. Label of the share (Check) field in DocType 'DocPerm' #. Label of the share (Check) field in DocType 'DocShare' +#. Label of the share (Check) field in DocType 'User Document Type' #. Option for the 'Type' (Select) field in DocType 'Notification Log' #: core/doctype/custom_docperm/custom_docperm.json #: core/doctype/docperm/docperm.json core/doctype/docshare/docshare.json +#: core/doctype/user_document_type/user_document_type.json #: desk/doctype/notification_log/notification_log.json #: public/js/frappe/form/templates/form_sidebar.html:110 msgid "Share" @@ -23046,7 +23191,7 @@ msgstr "crwdns131180:0crwdne131180:0" msgid "Show Error" msgstr "crwdns100834:0crwdne100834:0" -#: public/js/frappe/form/layout.js:561 +#: public/js/frappe/form/layout.js:563 msgid "Show Fieldname (click to copy on clipboard)" msgstr "crwdns100838:0crwdne100838:0" @@ -23164,7 +23309,7 @@ msgid "Show Sidebar" msgstr "crwdns131206:0crwdne131206:0" #: public/js/frappe/list/list_sidebar.html:66 -#: public/js/frappe/list/list_view.js:1611 +#: public/js/frappe/list/list_view.js:1665 msgid "Show Tags" msgstr "crwdns100886:0crwdne100886:0" @@ -23211,7 +23356,7 @@ msgstr "crwdns131212:0crwdne131212:0" msgid "Show all Versions" msgstr "crwdns100904:0crwdne100904:0" -#: public/js/frappe/form/footer/form_timeline.js:67 +#: public/js/frappe/form/footer/form_timeline.js:69 msgid "Show all activity" msgstr "crwdns111236:0crwdne111236:0" @@ -23251,7 +23396,7 @@ msgstr "crwdns131222:0crwdne131222:0" msgid "Show link to document" msgstr "crwdns131224:0crwdne131224:0" -#: public/js/frappe/form/layout.js:255 public/js/frappe/form/layout.js:273 +#: public/js/frappe/form/layout.js:257 public/js/frappe/form/layout.js:275 msgid "Show more details" msgstr "crwdns100920:0crwdne100920:0" @@ -23305,7 +23450,7 @@ msgstr "crwdns131236:0crwdne131236:0" msgid "Sign Up and Confirmation" msgstr "crwdns131238:0crwdne131238:0" -#: core/doctype/user/user.py:959 +#: core/doctype/user/user.py:974 msgid "Sign Up is disabled" msgstr "crwdns100938:0crwdne100938:0" @@ -23421,7 +23566,7 @@ msgstr "crwdns100986:0crwdne100986:0" msgid "Skipping column {0}" msgstr "crwdns100988:0{0}crwdne100988:0" -#: modules/utils.py:171 +#: modules/utils.py:175 msgid "Skipping fixture syncing for doctype {0} from file {1}" msgstr "crwdns100990:0{0}crwdnd100990:0{1}crwdne100990:0" @@ -23703,6 +23848,10 @@ msgstr "crwdns101110:0crwdne101110:0" msgid "Standard Not Set" msgstr "crwdns101112:0crwdne101112:0" +#: core/page/permission_manager/permission_manager.js:125 +msgid "Standard Permissions" +msgstr "crwdns142898:0crwdne142898:0" + #: printing/doctype/print_format/print_format.py:74 msgid "Standard Print Format cannot be updated" msgstr "crwdns101114:0crwdne101114:0" @@ -24105,7 +24254,7 @@ msgstr "crwdns101312:0crwdne101312:0" msgid "Submit" msgstr "crwdns101314:0crwdne101314:0" -#: public/js/frappe/list/list_view.js:1985 +#: public/js/frappe/list/list_view.js:2039 msgctxt "Button in list view actions menu" msgid "Submit" msgstr "crwdns101316:0crwdne101316:0" @@ -24158,11 +24307,11 @@ msgstr "crwdns131364:0crwdne131364:0" msgid "Submit this document to complete this step." msgstr "crwdns101344:0crwdne101344:0" -#: public/js/frappe/form/form.js:1216 +#: public/js/frappe/form/form.js:1220 msgid "Submit this document to confirm" msgstr "crwdns101346:0crwdne101346:0" -#: public/js/frappe/list/list_view.js:1990 +#: public/js/frappe/list/list_view.js:2044 msgctxt "Title of confirmation dialog" msgid "Submit {0} documents?" msgstr "crwdns101348:0{0}crwdne101348:0" @@ -24312,7 +24461,7 @@ msgstr "crwdns127884:0crwdne127884:0" msgid "Suggested Indexes" msgstr "crwdns131380:0crwdne131380:0" -#: core/doctype/user/user.py:674 +#: core/doctype/user/user.py:689 msgid "Suggested Username: {0}" msgstr "crwdns101420:0{0}crwdne101420:0" @@ -24835,7 +24984,7 @@ msgstr "crwdns131428:0crwdne131428:0" msgid "Templates" msgstr "crwdns101586:0crwdne101586:0" -#: core/doctype/user/user.py:970 +#: core/doctype/user/user.py:985 msgid "Temporarily Disabled" msgstr "crwdns101588:0crwdne101588:0" @@ -24936,7 +25085,7 @@ msgid "The Client ID obtained from the Google Cloud Console under " msgstr "crwdns131442:0crwdne131442:0" -#: email/doctype/notification/notification.py:130 +#: email/doctype/notification/notification.py:131 msgid "The Condition '{0}' is invalid" msgstr "crwdns101636:0{0}crwdne101636:0" @@ -24985,7 +25134,11 @@ msgstr "crwdns101652:0{0}crwdnd101652:0{1}crwdnd101652:0{2}crwdne101652:0" msgid "The comment cannot be empty" msgstr "crwdns101654:0crwdne101654:0" -#: public/js/frappe/list/list_view.js:630 +#: templates/emails/workflow_action.html:9 +msgid "The contents of this email are strictly confidential. Please do not forward this email to anyone." +msgstr "crwdns142920:0crwdne142920:0" + +#: public/js/frappe/list/list_view.js:629 msgid "The count shown is an estimated count. Click here to see the accurate count." msgstr "crwdns111470:0crwdne111470:0" @@ -25084,11 +25237,11 @@ msgid "The project number obtained from Google Cloud Console under " msgstr "crwdns131456:0crwdne131456:0" -#: core/doctype/user/user.py:930 +#: core/doctype/user/user.py:945 msgid "The reset password link has been expired" msgstr "crwdns101696:0crwdne101696:0" -#: core/doctype/user/user.py:932 +#: core/doctype/user/user.py:947 msgid "The reset password link has either been used before or is invalid" msgstr "crwdns101698:0crwdne101698:0" @@ -25126,7 +25279,7 @@ msgstr "crwdns101710:0crwdne101710:0" msgid "The user from this field will be rewarded points" msgstr "crwdns131458:0crwdne131458:0" -#: public/js/frappe/form/controls/data.js:24 +#: public/js/frappe/form/controls/data.js:25 msgid "The value you pasted was {0} characters long. Max allowed characters is {1}." msgstr "crwdns101714:0{0}crwdnd101714:0{1}crwdne101714:0" @@ -25287,7 +25440,7 @@ msgstr "crwdns101774:0crwdne101774:0" msgid "This action is irreversible. Do you wish to continue?" msgstr "crwdns112746:0crwdne112746:0" -#: __init__.py:1014 +#: __init__.py:1020 msgid "This action is only allowed for {}" msgstr "crwdns101776:0crwdne101776:0" @@ -25333,11 +25486,11 @@ msgstr "crwdns101788:0crwdne101788:0" msgid "This document has been reverted" msgstr "crwdns101790:0crwdne101790:0" -#: public/js/frappe/form/form.js:1304 +#: public/js/frappe/form/form.js:1308 msgid "This document has unsaved changes which might not appear in final PDF.
Consider saving the document before printing." msgstr "crwdns127762:0crwdne127762:0" -#: public/js/frappe/form/form.js:1097 +#: public/js/frappe/form/form.js:1101 msgid "This document is already amended, you cannot ammend it again" msgstr "crwdns101792:0crwdne101792:0" @@ -25371,7 +25524,7 @@ msgstr "crwdns131480:0crwdne131480:0" msgid "This file is public. It can be accessed without authentication." msgstr "crwdns101802:0crwdne101802:0" -#: public/js/frappe/form/form.js:1194 +#: public/js/frappe/form/form.js:1198 msgid "This form has been modified after you have loaded it" msgstr "crwdns101804:0crwdne101804:0" @@ -25390,7 +25543,7 @@ msgstr "crwdns131482:0crwdne131482:0" msgid "This goes above the slideshow." msgstr "crwdns131484:0crwdne131484:0" -#: public/js/frappe/views/reports/query_report.js:2027 +#: public/js/frappe/views/reports/query_report.js:2012 msgid "This is a background report. Please set the appropriate filters and then generate a new one." msgstr "crwdns101812:0crwdne101812:0" @@ -25518,7 +25671,7 @@ msgstr "crwdns101866:0crwdne101866:0" msgid "This will terminate the job immediately and might be dangerous, are you sure? " msgstr "crwdns101868:0crwdne101868:0" -#: core/doctype/user/user.py:1190 +#: core/doctype/user/user.py:1205 msgid "Throttled" msgstr "crwdns101870:0crwdne101870:0" @@ -25868,7 +26021,7 @@ msgstr "crwdns102052:0crwdne102052:0" msgid "To print output use print(text)" msgstr "crwdns131550:0crwdne131550:0" -#: core/doctype/user_type/user_type.py:295 +#: core/doctype/user_type/user_type.py:292 msgid "To set the role {0} in the user {1}, kindly set the {2} field as {3} in one of the {4} record." msgstr "crwdns102056:0{0}crwdnd102056:0{1}crwdnd102056:0{2}crwdnd102056:0{3}crwdnd102056:0{4}crwdne102056:0" @@ -25935,7 +26088,7 @@ msgstr "crwdns102084:0crwdne102084:0" msgid "Toggle Sidebar" msgstr "crwdns102086:0crwdne102086:0" -#: public/js/frappe/list/list_view.js:1726 +#: public/js/frappe/list/list_view.js:1780 msgctxt "Button in list view menu" msgid "Toggle Sidebar" msgstr "crwdns102088:0crwdne102088:0" @@ -25982,7 +26135,7 @@ msgstr "crwdns102108:0crwdne102108:0" msgid "Too many changes to database in single action." msgstr "crwdns102110:0crwdne102110:0" -#: core/doctype/user/user.py:971 +#: core/doctype/user/user.py:986 msgid "Too many users signed up recently, so the registration is disabled. Please try back in an hour" msgstr "crwdns102112:0crwdne102112:0" @@ -26249,6 +26402,10 @@ msgstr "crwdns131624:0crwdne131624:0" msgid "Tree" msgstr "crwdns131626:0crwdne131626:0" +#: public/js/frappe/list/base_list.js:211 +msgid "Tree View" +msgstr "crwdns142866:0crwdne142866:0" + #. Description of the 'Is Tree' (Check) field in DocType 'DocType' #: core/doctype/doctype/doctype.json msgid "Tree structures are implemented using Nested Set" @@ -26354,6 +26511,7 @@ msgstr "crwdns131640:0crwdne131640:0" #: desk/doctype/workspace_link/workspace_link.json #: desk/doctype/workspace_shortcut/workspace_shortcut.json #: public/js/frappe/views/file/file_view.js:337 +#: public/js/frappe/widgets/widget_dialog.js:399 #: social/doctype/energy_point_log/energy_point_log.json #: website/doctype/web_template/web_template.json www/attribution.html:35 msgid "Type" @@ -26435,6 +26593,7 @@ msgstr "crwdns131652:0crwdne131652:0" #: desk/doctype/workspace_shortcut/workspace_shortcut.json #: integrations/doctype/integration_request/integration_request.json #: integrations/doctype/webhook_request_log/webhook_request_log.json +#: public/js/frappe/widgets/widget_dialog.js:469 #: website/doctype/top_bar_item/top_bar_item.json #: website/doctype/website_slideshow_item/website_slideshow_item.json msgid "URL" @@ -26479,7 +26638,7 @@ msgstr "crwdns102332:0{0}crwdne102332:0" msgid "Unable to open attached file. Did you export it as CSV?" msgstr "crwdns102334:0crwdne102334:0" -#: core/doctype/file/utils.py:97 core/doctype/file/utils.py:129 +#: core/doctype/file/utils.py:98 core/doctype/file/utils.py:130 msgid "Unable to read file format for {0}" msgstr "crwdns102336:0{0}crwdne102336:0" @@ -26588,7 +26747,7 @@ msgstr "crwdns131670:0crwdne131670:0" msgid "Unsafe SQL query" msgstr "crwdns102382:0crwdne102382:0" -#: public/js/frappe/data_import/data_exporter.js:158 +#: public/js/frappe/data_import/data_exporter.js:159 #: public/js/frappe/form/controls/multicheck.js:166 msgid "Unselect All" msgstr "crwdns111300:0crwdne111300:0" @@ -26758,7 +26917,7 @@ msgctxt "Freeze message while updating a document" msgid "Updating" msgstr "crwdns102458:0crwdne102458:0" -#: email/doctype/email_queue/email_queue.py:433 +#: email/doctype/email_queue/email_queue.py:446 msgid "Updating Email Queue Statuses. The emails will be picked up in the next scheduled run." msgstr "crwdns102460:0crwdne102460:0" @@ -27086,7 +27245,7 @@ msgstr "crwdns131746:0crwdne131746:0" msgid "User Id Field" msgstr "crwdns131748:0crwdne131748:0" -#: core/doctype/user_type/user_type.py:287 +#: core/doctype/user_type/user_type.py:284 msgid "User Id Field is mandatory in the user type {0}" msgstr "crwdns102618:0{0}crwdne102618:0" @@ -27111,12 +27270,12 @@ msgid "User Permission" msgstr "crwdns102624:0crwdne102624:0" #: core/page/permission_manager/permission_manager_help.html:30 -#: public/js/frappe/views/reports/query_report.js:1804 +#: public/js/frappe/views/reports/query_report.js:1789 #: public/js/frappe/views/reports/report_view.js:1666 msgid "User Permissions" msgstr "crwdns102628:0crwdne102628:0" -#: public/js/frappe/list/list_view.js:1684 +#: public/js/frappe/list/list_view.js:1738 msgctxt "Button in list view menu" msgid "User Permissions" msgstr "crwdns102630:0crwdne102630:0" @@ -27223,7 +27382,7 @@ msgstr "crwdns102664:0crwdne102664:0" msgid "User must always select" msgstr "crwdns131762:0crwdne131762:0" -#: model/delete_doc.py:235 +#: model/delete_doc.py:244 msgid "User not allowed to delete {0}: {1}" msgstr "crwdns102668:0{0}crwdnd102668:0{1}crwdne102668:0" @@ -27239,15 +27398,15 @@ msgstr "crwdns102672:0{0}crwdne102672:0" msgid "User with email: {0} does not exist in the system. Please ask 'System Administrator' to create the user for you." msgstr "crwdns102674:0{0}crwdne102674:0" -#: core/doctype/user/user.py:485 +#: core/doctype/user/user.py:491 msgid "User {0} cannot be deleted" msgstr "crwdns102676:0{0}crwdne102676:0" -#: core/doctype/user/user.py:280 +#: core/doctype/user/user.py:285 msgid "User {0} cannot be disabled" msgstr "crwdns102678:0{0}crwdne102678:0" -#: core/doctype/user/user.py:556 +#: core/doctype/user/user.py:571 msgid "User {0} cannot be renamed" msgstr "crwdns102680:0{0}crwdne102680:0" @@ -27268,7 +27427,7 @@ msgstr "crwdns127898:0{0}crwdne127898:0" msgid "User {0} has requested for data deletion" msgstr "crwdns102686:0{0}crwdne102686:0" -#: core/doctype/user/user.py:1319 +#: core/doctype/user/user.py:1334 msgid "User {0} impersonated as {1}" msgstr "crwdns111442:0{0}crwdnd111442:0{1}crwdne111442:0" @@ -27296,7 +27455,7 @@ msgstr "crwdns131764:0crwdne131764:0" msgid "Username" msgstr "crwdns102694:0crwdne102694:0" -#: core/doctype/user/user.py:641 +#: core/doctype/user/user.py:656 msgid "Username {0} already exists" msgstr "crwdns102700:0{0}crwdne102700:0" @@ -27359,6 +27518,12 @@ msgstr "crwdns111316:0crwdne111316:0" msgid "Validate Field" msgstr "crwdns131774:0crwdne131774:0" +#. Label of the validate_frappe_mail_settings (Button) field in DocType 'Email +#. Account' +#: email/doctype/email_account/email_account.json +msgid "Validate Frappe Mail Settings" +msgstr "crwdns142900:0crwdne142900:0" + #. Label of the validate_ssl_certificate (Check) field in DocType 'Email #. Account' #. Label of the validate_ssl_certificate (Check) field in DocType 'Email @@ -27429,7 +27594,7 @@ msgstr "crwdns131784:0crwdne131784:0" msgid "Value To Be Set" msgstr "crwdns131786:0crwdne131786:0" -#: model/base_document.py:965 model/document.py:682 +#: model/base_document.py:966 model/document.py:682 msgid "Value cannot be changed for {0}" msgstr "crwdns102750:0{0}crwdne102750:0" @@ -27472,7 +27637,7 @@ msgstr "crwdns102766:0{0}crwdne102766:0" msgid "Value to Validate" msgstr "crwdns131790:0crwdne131790:0" -#: model/base_document.py:1035 +#: model/base_document.py:1036 msgid "Value too big" msgstr "crwdns102770:0crwdne102770:0" @@ -27497,7 +27662,7 @@ msgstr "crwdns111318:0crwdne111318:0" msgid "Verdana" msgstr "crwdns131792:0crwdne131792:0" -#: twofactor.py:357 +#: twofactor.py:352 msgid "Verfication Code" msgstr "crwdns102780:0crwdne102780:0" @@ -27518,11 +27683,11 @@ msgstr "crwdns102784:0crwdne102784:0" msgid "Verified" msgstr "crwdns131794:0crwdne131794:0" -#: public/js/frappe/ui/messages.js:350 +#: public/js/frappe/ui/messages.js:352 msgid "Verify" msgstr "crwdns102788:0crwdne102788:0" -#: public/js/frappe/ui/messages.js:349 +#: public/js/frappe/ui/messages.js:351 msgid "Verify Password" msgstr "crwdns102790:0crwdne102790:0" @@ -27571,7 +27736,7 @@ msgid "View Full Log" msgstr "crwdns111324:0crwdne111324:0" #: public/js/frappe/views/treeview.js:463 -#: public/js/frappe/widgets/quick_list_widget.js:245 +#: public/js/frappe/widgets/quick_list_widget.js:247 msgid "View List" msgstr "crwdns102808:0crwdne102808:0" @@ -27895,7 +28060,7 @@ msgstr "crwdns131842:0crwdne131842:0" #. Group in Module Def's connections #. Name of a Workspace #: core/doctype/module_def/module_def.json -#: email/doctype/newsletter/newsletter.py:449 +#: email/doctype/newsletter/newsletter.py:453 #: public/js/frappe/ui/toolbar/about.js:8 #: website/workspace/website/website.json msgid "Website" @@ -28133,11 +28298,11 @@ msgstr "crwdns131860:0crwdne131860:0" msgid "Welcome Workspace" msgstr "crwdns103062:0crwdne103062:0" -#: core/doctype/user/user.py:363 +#: core/doctype/user/user.py:369 msgid "Welcome email sent" msgstr "crwdns103064:0crwdne103064:0" -#: core/doctype/user/user.py:424 +#: core/doctype/user/user.py:430 msgid "Welcome to {0}" msgstr "crwdns103066:0{0}crwdne103066:0" @@ -28453,7 +28618,7 @@ msgstr "crwdns127790:0crwdne127790:0" msgid "Write" msgstr "crwdns131894:0crwdne131894:0" -#: model/base_document.py:875 +#: model/base_document.py:876 msgid "Wrong Fetch From value" msgstr "crwdns103194:0crwdne103194:0" @@ -28540,7 +28705,7 @@ msgstr "crwdns131908:0crwdne131908:0" #: public/js/form_builder/utils.js:336 #: public/js/frappe/form/controls/link.js:475 #: public/js/frappe/list/list_sidebar_group_by.js:223 -#: public/js/frappe/views/reports/query_report.js:1541 +#: public/js/frappe/views/reports/query_report.js:1526 #: website/doctype/help_article/templates/help_article.html:25 msgid "Yes" msgstr "crwdns103238:0crwdne103238:0" @@ -28560,7 +28725,7 @@ msgctxt "Name of the current user. For example: You edited this 5 hours ago." msgid "You" msgstr "crwdns103252:0crwdne103252:0" -#: public/js/frappe/form/footer/form_timeline.js:462 +#: public/js/frappe/form/footer/form_timeline.js:464 msgid "You Liked" msgstr "crwdns103254:0crwdne103254:0" @@ -28624,7 +28789,7 @@ msgstr "crwdns103280:0crwdne103280:0" msgid "You are not permitted to access this page." msgstr "crwdns103282:0crwdne103282:0" -#: __init__.py:933 +#: __init__.py:939 msgid "You are not permitted to access this resource." msgstr "crwdns103284:0crwdne103284:0" @@ -28636,11 +28801,11 @@ msgstr "crwdns103286:0crwdne103286:0" msgid "You are only allowed to update order, do not remove or add apps." msgstr "crwdns103288:0crwdne103288:0" -#: email/doctype/email_account/email_account.js:216 +#: email/doctype/email_account/email_account.js:245 msgid "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)." msgstr "crwdns103290:0crwdne103290:0" -#: public/js/frappe/form/footer/form_timeline.js:413 +#: public/js/frappe/form/footer/form_timeline.js:415 msgctxt "Form timeline" msgid "You attached {0}" msgstr "crwdns103292:0{0}crwdne103292:0" @@ -28677,9 +28842,9 @@ msgstr "crwdns103302:0{0}crwdne103302:0" msgid "You can continue with the onboarding after exploring this page" msgstr "crwdns103304:0crwdne103304:0" -#: core/doctype/user/user.py:543 -msgid "You can disable the user instead of deleting it." -msgstr "crwdns111478:0crwdne111478:0" +#: model/delete_doc.py:136 +msgid "You can disable this {0} instead of deleting it." +msgstr "crwdns142902:0{0}crwdne142902:0" #: core/doctype/file/file.py:691 msgid "You can increase the limit from System Settings." @@ -28771,12 +28936,12 @@ msgstr "crwdns103340:0{0}crwdne103340:0" msgid "You changed the values for {0} {1}" msgstr "crwdns103342:0{0}crwdnd103342:0{1}crwdne103342:0" -#: public/js/frappe/form/footer/form_timeline.js:442 +#: public/js/frappe/form/footer/form_timeline.js:444 msgctxt "Form timeline" msgid "You changed {0} to {1}" msgstr "crwdns103344:0{0}crwdnd103344:0{1}crwdne103344:0" -#: public/js/frappe/form/footer/form_timeline.js:138 +#: public/js/frappe/form/footer/form_timeline.js:140 #: public/js/frappe/form/sidebar/form_sidebar.js:106 msgid "You created this" msgstr "crwdns103346:0crwdne103346:0" @@ -28806,7 +28971,7 @@ msgstr "crwdns103356:0crwdne103356:0" msgid "You do not have permission to view this document" msgstr "crwdns103358:0crwdne103358:0" -#: public/js/frappe/form/form.js:955 +#: public/js/frappe/form/form.js:959 msgid "You do not have permissions to cancel all linked documents." msgstr "crwdns103360:0crwdne103360:0" @@ -28858,7 +29023,7 @@ msgstr "crwdns103382:0crwdne103382:0" msgid "You have received a ❤️ like on your blog post" msgstr "crwdns103384:0crwdne103384:0" -#: twofactor.py:448 +#: twofactor.py:432 msgid "You have to enable Two Factor Auth from System Settings." msgstr "crwdns103386:0crwdne103386:0" @@ -28878,7 +29043,7 @@ msgstr "crwdns103390:0{0}crwdne103390:0" msgid "You haven't added any Dashboard Charts or Number Cards yet." msgstr "crwdns111346:0crwdne111346:0" -#: public/js/frappe/list/list_view.js:473 +#: public/js/frappe/list/list_view.js:470 msgid "You haven't created a {0} yet" msgstr "crwdns103392:0{0}crwdne103392:0" @@ -28886,7 +29051,7 @@ msgstr "crwdns103392:0{0}crwdne103392:0" msgid "You hit the rate limit because of too many requests. Please try after sometime." msgstr "crwdns103394:0crwdne103394:0" -#: public/js/frappe/form/footer/form_timeline.js:149 +#: public/js/frappe/form/footer/form_timeline.js:151 #: public/js/frappe/form/sidebar/form_sidebar.js:95 msgid "You last edited this" msgstr "crwdns103396:0crwdne103396:0" @@ -28947,7 +29112,7 @@ msgstr "crwdns103418:0crwdne103418:0" msgid "You need to select indexes you want to add first." msgstr "crwdns127892:0crwdne127892:0" -#: email/doctype/email_account/email_account.py:147 +#: email/doctype/email_account/email_account.py:153 msgid "You need to set one IMAP folder for {0}" msgstr "crwdns103420:0{0}crwdne103420:0" @@ -28959,7 +29124,7 @@ msgstr "crwdns103422:0crwdne103422:0" msgid "You need {0} permission to fetch values from {1} {2}" msgstr "crwdns103424:0{0}crwdnd103424:0{1}crwdnd103424:0{2}crwdne103424:0" -#: public/js/frappe/form/footer/form_timeline.js:418 +#: public/js/frappe/form/footer/form_timeline.js:420 msgctxt "Form timeline" msgid "You removed attachment {0}" msgstr "crwdns103426:0{0}crwdne103426:0" @@ -28986,7 +29151,7 @@ msgstr "crwdns103434:0{0}crwdne103434:0" msgid "You unfollowed this document" msgstr "crwdns103436:0crwdne103436:0" -#: public/js/frappe/form/footer/form_timeline.js:182 +#: public/js/frappe/form/footer/form_timeline.js:184 msgid "You viewed this" msgstr "crwdns103438:0crwdne103438:0" @@ -29708,7 +29873,7 @@ msgstr "crwdns103962:0crwdne103962:0" msgid "text in document type" msgstr "crwdns103968:0crwdne103968:0" -#: public/js/frappe/form/controls/data.js:35 +#: public/js/frappe/form/controls/data.js:36 msgid "this form" msgstr "crwdns103980:0crwdne103980:0" @@ -29753,7 +29918,7 @@ msgstr "crwdns104008:0crwdne104008:0" msgid "via Google Meet" msgstr "crwdns132068:0crwdne132068:0" -#: email/doctype/notification/notification.py:215 +#: email/doctype/notification/notification.py:220 msgid "via Notification" msgstr "crwdns104012:0crwdne104012:0" @@ -29821,12 +29986,12 @@ msgstr "crwdns104048:0{0}crwdne104048:0" msgid "{0} ${type}" msgstr "crwdns104050:0{0}crwdnd104050:0${type}crwdne104050:0" -#: public/js/frappe/data_import/data_exporter.js:79 +#: public/js/frappe/data_import/data_exporter.js:80 #: public/js/frappe/views/gantt/gantt_view.js:54 msgid "{0} ({1})" msgstr "crwdns104052:0{0}crwdnd104052:0{1}crwdne104052:0" -#: public/js/frappe/data_import/data_exporter.js:76 +#: public/js/frappe/data_import/data_exporter.js:77 msgid "{0} ({1}) (1 row mandatory)" msgstr "crwdns104054:0{0}crwdnd104054:0{1}crwdne104054:0" @@ -29869,14 +30034,14 @@ msgstr "crwdns104068:0{0}crwdne104068:0" msgid "{0} Google Contacts synced." msgstr "crwdns104070:0{0}crwdne104070:0" -#: public/js/frappe/form/footer/form_timeline.js:463 +#: public/js/frappe/form/footer/form_timeline.js:465 msgid "{0} Liked" msgstr "crwdns104072:0{0}crwdne104072:0" #: public/js/frappe/ui/toolbar/search_utils.js:83 #: public/js/frappe/ui/toolbar/search_utils.js:84 #: public/js/frappe/utils/utils.js:924 -#: public/js/frappe/widgets/chart_widget.js:317 www/list.html:4 www/list.html:8 +#: public/js/frappe/widgets/chart_widget.js:318 www/list.html:4 www/list.html:8 msgid "{0} List" msgstr "crwdns104074:0{0}crwdne104074:0" @@ -29896,14 +30061,14 @@ msgstr "crwdns104080:0{0}crwdne104080:0" msgid "{0} Name" msgstr "crwdns104082:0{0}crwdne104082:0" -#: model/base_document.py:1065 +#: model/base_document.py:1066 msgid "{0} Not allowed to change {1} after submission from {2} to {3}" msgstr "crwdns104084:0{0}crwdnd104084:0{1}crwdnd104084:0{2}crwdnd104084:0{3}crwdne104084:0" #: public/js/frappe/ui/toolbar/search_utils.js:95 #: public/js/frappe/ui/toolbar/search_utils.js:96 #: public/js/frappe/utils/utils.js:921 -#: public/js/frappe/widgets/chart_widget.js:325 +#: public/js/frappe/widgets/chart_widget.js:326 msgid "{0} Report" msgstr "crwdns104086:0{0}crwdne104086:0" @@ -29922,11 +30087,7 @@ msgstr "crwdns104088:0{0}crwdne104088:0" msgid "{0} Tree" msgstr "crwdns104090:0{0}crwdne104090:0" -#: public/js/frappe/list/base_list.js:209 -msgid "{0} View" -msgstr "crwdns104092:0{0}crwdne104092:0" - -#: public/js/frappe/form/footer/form_timeline.js:126 +#: public/js/frappe/form/footer/form_timeline.js:128 #: public/js/frappe/form/sidebar/form_sidebar.js:86 msgid "{0} Web page views" msgstr "crwdns104094:0{0}crwdne104094:0" @@ -29940,7 +30101,7 @@ msgstr "crwdns104506:0{0}crwdne104506:0" msgid "{0} added" msgstr "crwdns104096:0{0}crwdne104096:0" -#: public/js/frappe/form/controls/data.js:203 +#: public/js/frappe/form/controls/data.js:204 msgid "{0} already exists. Select another name" msgstr "crwdns104098:0{0}crwdne104098:0" @@ -29998,7 +30159,7 @@ msgstr "crwdns104122:0{0}crwdnd104122:0{1}crwdnd104122:0{2}crwdne104122:0" msgid "{0} assigned {1}: {2}" msgstr "crwdns104124:0{0}crwdnd104124:0{1}crwdnd104124:0{2}crwdne104124:0" -#: public/js/frappe/form/footer/form_timeline.js:414 +#: public/js/frappe/form/footer/form_timeline.js:416 msgctxt "Form timeline" msgid "{0} attached {1}" msgstr "crwdns104126:0{0}crwdnd104126:0{1}crwdne104126:0" @@ -30036,7 +30197,7 @@ msgstr "crwdns104138:0{0}crwdnd104138:0{1}crwdne104138:0" msgid "{0} changed the values for {1} {2}" msgstr "crwdns104140:0{0}crwdnd104140:0{1}crwdnd104140:0{2}crwdne104140:0" -#: public/js/frappe/form/footer/form_timeline.js:443 +#: public/js/frappe/form/footer/form_timeline.js:445 msgctxt "Form timeline" msgid "{0} changed {1} to {2}" msgstr "crwdns104142:0{0}crwdnd104142:0{1}crwdnd104142:0{2}crwdne104142:0" @@ -30053,7 +30214,7 @@ msgstr "crwdns127900:0{0}crwdne127900:0" msgid "{0} created successfully" msgstr "crwdns104146:0{0}crwdne104146:0" -#: public/js/frappe/form/footer/form_timeline.js:139 +#: public/js/frappe/form/footer/form_timeline.js:141 #: public/js/frappe/form/sidebar/form_sidebar.js:107 msgid "{0} created this" msgstr "crwdns104148:0{0}crwdne104148:0" @@ -30145,7 +30306,7 @@ msgstr "crwdns104188:0{0}crwdne104188:0" msgid "{0} has left the conversation in {1} {2}" msgstr "crwdns104190:0{0}crwdnd104190:0{1}crwdnd104190:0{2}crwdne104190:0" -#: __init__.py:2493 +#: __init__.py:2499 msgid "{0} has no versions tracked." msgstr "crwdns104192:0{0}crwdne104192:0" @@ -30211,7 +30372,7 @@ msgstr "crwdns104220:0{0}crwdnd104220:0{1}crwdne104220:0" msgid "{0} is like {1}" msgstr "crwdns104222:0{0}crwdnd104222:0{1}crwdne104222:0" -#: email/doctype/email_account/email_account.py:176 +#: email/doctype/email_account/email_account.py:186 msgid "{0} is mandatory" msgstr "crwdns104224:0{0}crwdne104224:0" @@ -30291,7 +30452,7 @@ msgstr "crwdns104258:0{0}crwdnd104258:0{1}crwdne104258:0" msgid "{0} is one of {1}" msgstr "crwdns104260:0{0}crwdnd104260:0{1}crwdne104260:0" -#: email/doctype/email_account/email_account.py:277 model/naming.py:217 +#: email/doctype/email_account/email_account.py:293 model/naming.py:217 #: printing/doctype/print_format/print_format.py:91 utils/csvutils.py:153 msgid "{0} is required" msgstr "crwdns104262:0{0}crwdne104262:0" @@ -30304,15 +30465,15 @@ msgstr "crwdns104264:0{0}crwdne104264:0" msgid "{0} is within {1}" msgstr "crwdns104266:0{0}crwdnd104266:0{1}crwdne104266:0" -#: public/js/frappe/list/list_view.js:1601 +#: public/js/frappe/list/list_view.js:1655 msgid "{0} items selected" msgstr "crwdns104268:0{0}crwdne104268:0" -#: core/doctype/user/user.py:1328 +#: core/doctype/user/user.py:1343 msgid "{0} just impersonated as you. They gave this reason: {1}" msgstr "crwdns111448:0{0}crwdnd111448:0{1}crwdne111448:0" -#: public/js/frappe/form/footer/form_timeline.js:150 +#: public/js/frappe/form/footer/form_timeline.js:152 #: public/js/frappe/form/sidebar/form_sidebar.js:96 msgid "{0} last edited this" msgstr "crwdns104270:0{0}crwdne104270:0" @@ -30374,11 +30535,11 @@ msgstr "crwdns104296:0{0}crwdne104296:0" msgid "{0} not found" msgstr "crwdns104298:0{0}crwdne104298:0" -#: core/doctype/report/report.py:413 public/js/frappe/list/list_view.js:992 +#: core/doctype/report/report.py:413 public/js/frappe/list/list_view.js:1029 msgid "{0} of {1}" msgstr "crwdns104300:0{0}crwdnd104300:0{1}crwdne104300:0" -#: public/js/frappe/list/list_view.js:994 +#: public/js/frappe/list/list_view.js:1031 msgid "{0} of {1} ({2} rows with children)" msgstr "crwdns104302:0{0}crwdnd104302:0{1}crwdnd104302:0{2}crwdne104302:0" @@ -30411,11 +30572,11 @@ msgstr "crwdns104312:0{0}crwdnd104312:0{1}crwdne104312:0" msgid "{0} records deleted" msgstr "crwdns104314:0{0}crwdne104314:0" -#: public/js/frappe/data_import/data_exporter.js:228 +#: public/js/frappe/data_import/data_exporter.js:229 msgid "{0} records will be exported" msgstr "crwdns104316:0{0}crwdne104316:0" -#: public/js/frappe/form/footer/form_timeline.js:419 +#: public/js/frappe/form/footer/form_timeline.js:421 msgctxt "Form timeline" msgid "{0} removed attachment {1}" msgstr "crwdns104318:0{0}crwdnd104318:0{1}crwdne104318:0" @@ -30507,7 +30668,7 @@ msgstr "crwdns104354:0{0}crwdne104354:0" msgid "{0} values selected" msgstr "crwdns104356:0{0}crwdne104356:0" -#: public/js/frappe/form/footer/form_timeline.js:183 +#: public/js/frappe/form/footer/form_timeline.js:185 msgid "{0} viewed this" msgstr "crwdns104358:0{0}crwdne104358:0" @@ -30539,11 +30700,11 @@ msgstr "crwdns104370:0{0}crwdnd104370:0{1}crwdnd104370:0{2}crwdne104370:0" msgid "{0} {1} already exists" msgstr "crwdns104372:0{0}crwdnd104372:0{1}crwdne104372:0" -#: model/base_document.py:908 +#: model/base_document.py:909 msgid "{0} {1} cannot be \"{2}\". It should be one of \"{3}\"" msgstr "crwdns104374:0{0}crwdnd104374:0{1}crwdnd104374:0{2}crwdnd104374:0{3}crwdne104374:0" -#: utils/nestedset.py:337 +#: utils/nestedset.py:340 msgid "{0} {1} cannot be a leaf node as it has children" msgstr "crwdns104376:0{0}crwdnd104376:0{1}crwdne104376:0" @@ -30551,7 +30712,7 @@ msgstr "crwdns104376:0{0}crwdnd104376:0{1}crwdne104376:0" msgid "{0} {1} does not exist, select a new target to merge" msgstr "crwdns104378:0{0}crwdnd104378:0{1}crwdne104378:0" -#: public/js/frappe/form/form.js:946 +#: public/js/frappe/form/form.js:950 msgid "{0} {1} is linked with the following submitted documents: {2}" msgstr "crwdns104380:0{0}crwdnd104380:0{1}crwdnd104380:0{2}crwdne104380:0" @@ -30559,15 +30720,15 @@ msgstr "crwdns104380:0{0}crwdnd104380:0{1}crwdnd104380:0{2}crwdne104380:0" msgid "{0} {1} not found" msgstr "crwdns104382:0{0}crwdnd104382:0{1}crwdne104382:0" -#: model/delete_doc.py:242 +#: model/delete_doc.py:251 msgid "{0} {1}: Submitted Record cannot be deleted. You must {2} Cancel {3} it first." msgstr "crwdns104384:0{0}crwdnd104384:0{1}crwdnd104384:0{2}crwdnd104384:0{3}crwdne104384:0" -#: model/base_document.py:1026 +#: model/base_document.py:1027 msgid "{0}, Row {1}" msgstr "crwdns104386:0{0}crwdnd104386:0{1}crwdne104386:0" -#: model/base_document.py:1031 +#: model/base_document.py:1032 msgid "{0}: '{1}' ({3}) will get truncated, as max characters allowed is {2}" msgstr "crwdns104388:0{0}crwdnd104388:0{1}crwdnd104388:0{3}crwdnd104388:0{2}crwdne104388:0" @@ -30651,7 +30812,7 @@ msgstr "crwdns111372:0{0}crwdne111372:0" msgid "{0}: Permission at level 0 must be set before higher levels are set" msgstr "crwdns104426:0{0}crwdne104426:0" -#: public/js/frappe/form/controls/data.js:50 +#: public/js/frappe/form/controls/data.js:51 msgid "{0}: You can increase the limit for the field if required via {1}" msgstr "crwdns104428:0{0}crwdnd104428:0{1}crwdne104428:0" @@ -30660,7 +30821,7 @@ msgid "{0}: fieldname cannot be set to reserved keyword {1}" msgstr "crwdns104430:0{0}crwdnd104430:0{1}crwdne104430:0" #: contacts/doctype/address/address.js:35 -#: contacts/doctype/contact/contact.js:83 +#: contacts/doctype/contact/contact.js:88 #: public/js/frappe/views/workspace/workspace.js:170 msgid "{0}: {1}" msgstr "crwdns104432:0{0}crwdnd104432:0{1}crwdne104432:0" @@ -30735,8 +30896,8 @@ msgstr "crwdns104456:0crwdne104456:0" msgid "{} field cannot be empty." msgstr "crwdns104458:0crwdne104458:0" -#: email/doctype/email_account/email_account.py:200 -#: email/doctype/email_account/email_account.py:208 +#: email/doctype/email_account/email_account.py:216 +#: email/doctype/email_account/email_account.py:224 msgid "{} has been disabled. It can only be enabled if {} is checked." msgstr "crwdns104460:0crwdne104460:0" diff --git a/frappe/locale/main.pot b/frappe/locale/main.pot index fce323b8bf..4836eaadcd 100644 --- a/frappe/locale/main.pot +++ b/frappe/locale/main.pot @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Frappe Framework VERSION\n" "Report-Msgid-Bugs-To: developers@frappe.io\n" -"POT-Creation-Date: 2024-06-30 09:33+0000\n" -"PO-Revision-Date: 2024-06-30 09:33+0000\n" +"POT-Creation-Date: 2024-08-04 09:33+0000\n" +"PO-Revision-Date: 2024-08-04 09:33+0000\n" "Last-Translator: developers@frappe.io\n" "Language-Team: developers@frappe.io\n" "MIME-Version: 1.0\n" @@ -42,7 +42,7 @@ msgstr "" msgid "\"Team Members\" or \"Management\"" msgstr "" -#: public/js/frappe/form/form.js:1085 +#: public/js/frappe/form/form.js:1089 msgid "\"amended_from\" field must be present to do an amendment." msgstr "" @@ -96,7 +96,7 @@ msgstr "" msgid "'{0}' not allowed for type {1} in row {2}" msgstr "" -#: public/js/frappe/data_import/data_exporter.js:301 +#: public/js/frappe/data_import/data_exporter.js:302 msgid "(Mandatory)" msgstr "" @@ -167,7 +167,11 @@ msgstr "" msgid "1 month ago" msgstr "" -#: public/js/frappe/data_import/data_exporter.js:226 +#: public/js/print_format_builder/PrintFormat.vue:3 +msgid "1 of 2" +msgstr "" + +#: public/js/frappe/data_import/data_exporter.js:227 msgid "1 record will be exported" msgstr "" @@ -499,7 +503,7 @@ msgid "" "" msgstr "" -#: twofactor.py:462 +#: twofactor.py:446 msgid "

Your OTP secret on {0} has been reset. If you did not perform this reset and did not request it, please contact your System Administrator immediately.

" msgstr "" @@ -692,10 +696,11 @@ msgid "API Endpoint Args" msgstr "" #. Label of the api_key (Data) field in DocType 'User' +#. Label of the api_key (Data) field in DocType 'Email Account' #. Label of the api_key (Data) field in DocType 'Google Settings' #. Label of the sb_01 (Section Break) field in DocType 'Google Settings' #. Label of the api_key (Data) field in DocType 'Push Notification Settings' -#: core/doctype/user/user.json +#: core/doctype/user/user.json email/doctype/email_account/email_account.json #: integrations/doctype/google_settings/google_settings.json #: integrations/doctype/push_notification_settings/push_notification_settings.json msgid "API Key" @@ -718,9 +723,10 @@ msgid "API Method" msgstr "" #. Label of the api_secret (Password) field in DocType 'User' +#. Label of the api_secret (Password) field in DocType 'Email Account' #. Label of the api_secret (Password) field in DocType 'Push Notification #. Settings' -#: core/doctype/user/user.json +#: core/doctype/user/user.json email/doctype/email_account/email_account.json #: integrations/doctype/push_notification_settings/push_notification_settings.json msgid "API Secret" msgstr "" @@ -743,13 +749,9 @@ msgid "About Us" msgstr "" #. Name of a DocType -#: website/doctype/about_us_settings/about_us_settings.json -msgid "About Us Settings" -msgstr "" - #. Label of a Link in the Website Workspace +#: website/doctype/about_us_settings/about_us_settings.json #: website/workspace/website/website.json -msgctxt "About Us Settings" msgid "About Us Settings" msgstr "" @@ -782,13 +784,8 @@ msgid "Access Key Secret" msgstr "" #. Name of a DocType -#: core/doctype/access_log/access_log.json -msgid "Access Log" -msgstr "" - #. Label of a Link in the Users Workspace -#: core/workspace/users/users.json -msgctxt "Access Log" +#: core/doctype/access_log/access_log.json core/workspace/users/users.json msgid "Access Log" msgstr "" @@ -956,19 +953,15 @@ msgstr "" #. Group in User's connections #: core/doctype/user/user.json public/js/frappe/form/dashboard.js:22 -#: public/js/frappe/form/footer/form_timeline.js:58 +#: public/js/frappe/form/footer/form_timeline.js:60 msgid "Activity" msgstr "" #. Name of a DocType -#: core/doctype/activity_log/activity_log.json -msgid "Activity Log" -msgstr "" - #. Label of a Link in the Build Workspace #. Label of a Link in the Users Workspace -#: core/workspace/build/build.json core/workspace/users/users.json -msgctxt "Activity Log" +#: core/doctype/activity_log/activity_log.json core/workspace/build/build.json +#: core/workspace/users/users.json msgid "Activity Log" msgstr "" @@ -977,7 +970,7 @@ msgstr "" #: public/js/frappe/form/grid_row.js:471 #: public/js/frappe/form/sidebar/assign_to.js:100 #: public/js/frappe/form/templates/set_sharing.html:68 -#: public/js/frappe/list/bulk_operations.js:407 +#: public/js/frappe/list/bulk_operations.js:437 #: public/js/frappe/views/dashboard/dashboard_view.js:440 #: public/js/frappe/views/reports/query_report.js:266 #: public/js/frappe/views/reports/query_report.js:294 @@ -985,11 +978,6 @@ msgstr "" msgid "Add" msgstr "" -#: public/js/frappe/list/list_view.js:266 -msgctxt "Primary action in list view" -msgid "Add" -msgstr "" - #: public/js/frappe/form/grid_row.js:431 msgid "Add / Remove Columns" msgstr "" @@ -1027,6 +1015,10 @@ msgstr "" msgid "Add Border at Top" msgstr "" +#: desk/doctype/number_card/number_card.js:36 +msgid "Add Card to Dashboard" +msgstr "" + #: public/js/frappe/views/reports/query_report.js:210 msgid "Add Chart to Dashboard" msgstr "" @@ -1036,10 +1028,11 @@ msgid "Add Child" msgstr "" #: public/js/frappe/views/kanban/kanban_board.html:4 -#: public/js/frappe/views/reports/query_report.js:1696 -#: public/js/frappe/views/reports/query_report.js:1699 +#: public/js/frappe/views/reports/query_report.js:1681 +#: public/js/frappe/views/reports/query_report.js:1684 #: public/js/frappe/views/reports/report_view.js:324 #: public/js/frappe/views/reports/report_view.js:349 +#: public/js/print_format_builder/Field.vue:112 msgid "Add Column" msgstr "" @@ -1101,7 +1094,7 @@ msgstr "" msgid "Add Review" msgstr "" -#: core/doctype/user/user.py:757 +#: core/doctype/user/user.py:776 msgid "Add Roles" msgstr "" @@ -1130,11 +1123,11 @@ msgstr "" msgid "Add Subscribers" msgstr "" -#: public/js/frappe/list/bulk_operations.js:395 +#: public/js/frappe/list/bulk_operations.js:425 msgid "Add Tags" msgstr "" -#: public/js/frappe/list/list_view.js:1903 +#: public/js/frappe/list/list_view.js:1957 msgctxt "Button in list view actions menu" msgid "Add Tags" msgstr "" @@ -1170,7 +1163,7 @@ msgstr "" msgid "Add a New Role" msgstr "" -#: public/js/frappe/form/form_tour.js:205 +#: public/js/frappe/form/form_tour.js:211 msgid "Add a Row" msgstr "" @@ -1180,6 +1173,7 @@ msgid "Add a comment" msgstr "" #: printing/page/print_format_builder/print_format_builder_layout.html:28 +#: public/js/form_builder/components/Tabs.vue:192 msgid "Add a new section" msgstr "" @@ -1203,10 +1197,42 @@ msgstr "" msgid "Add a {0} Chart" msgstr "" +#: public/js/form_builder/components/Section.vue:271 +#: public/js/print_format_builder/PrintFormatSection.vue:115 +msgid "Add column" +msgstr "" + +#: public/js/form_builder/components/AddFieldButton.vue:9 +#: public/js/form_builder/components/AddFieldButton.vue:48 +msgid "Add field" +msgstr "" + +#: public/js/form_builder/components/Sidebar.vue:49 +#: public/js/form_builder/components/Tabs.vue:153 +msgid "Add new tab" +msgstr "" + +#: public/js/print_format_builder/PrintFormatSection.vue:125 +msgid "Add page break" +msgstr "" + #: custom/doctype/client_script/client_script.js:16 msgid "Add script for Child Table" msgstr "" +#: public/js/print_format_builder/PrintFormatSection.vue:111 +msgid "Add section above" +msgstr "" + +#: public/js/form_builder/components/Section.vue:265 +msgid "Add section below" +msgstr "" + +#: public/js/form_builder/components/Sidebar.vue:52 +#: public/js/form_builder/components/Tabs.vue:157 +msgid "Add tab" +msgstr "" + #: public/js/frappe/utils/dashboard_utils.js:263 #: public/js/frappe/views/reports/query_report.js:252 msgid "Add to Dashboard" @@ -1220,7 +1246,7 @@ msgstr "" msgid "Add to table" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:97 +#: public/js/frappe/form/footer/form_timeline.js:99 msgid "Add to this activity by mailing to {0}" msgstr "" @@ -1228,6 +1254,11 @@ msgstr "" msgid "Add {0}" msgstr "" +#: public/js/frappe/list/list_view.js:264 +msgctxt "Primary action in list view" +msgid "Add {0}" +msgstr "" + #. Description of the '<head> HTML' (Code) field in DocType 'Website #. Settings' #: website/doctype/website_settings/website_settings.json @@ -1251,8 +1282,11 @@ msgstr "" #. DocPerm' #. Label of the additional_permissions (Section Break) field in DocType #. 'DocPerm' +#. Label of the additional_permissions_section (Section Break) field in DocType +#. 'User Document Type' #: core/doctype/custom_docperm/custom_docperm.json #: core/doctype/docperm/docperm.json +#: core/doctype/user_document_type/user_document_type.json msgid "Additional Permissions" msgstr "" @@ -1347,11 +1381,11 @@ msgstr "" msgid "Administrator" msgstr "" -#: core/doctype/user/user.py:1161 +#: core/doctype/user/user.py:1180 msgid "Administrator Logged In" msgstr "" -#: core/doctype/user/user.py:1155 +#: core/doctype/user/user.py:1174 msgid "Administrator accessed {0} on {1} via IP Address {2}." msgstr "" @@ -1436,7 +1470,7 @@ msgstr "" msgid "Aggregate Function Based On" msgstr "" -#: desk/doctype/dashboard_chart/dashboard_chart.py:399 +#: desk/doctype/dashboard_chart/dashboard_chart.py:409 msgid "Aggregate Function field is required to create a dashboard chart" msgstr "" @@ -1507,7 +1541,7 @@ msgstr "" msgid "All Records" msgstr "" -#: public/js/frappe/form/form.js:2225 +#: public/js/frappe/form/form.js:2230 msgid "All Submissions" msgstr "" @@ -1825,11 +1859,11 @@ msgstr "" msgid "Allowed Roles" msgstr "" -#: public/js/frappe/form/form.js:1251 +#: public/js/frappe/form/form.js:1255 msgid "Allowing DocType, DocType. Be careful!" msgstr "" -#: core/doctype/user/user.py:964 +#: core/doctype/user/user.py:983 msgid "Already Registered" msgstr "" @@ -2041,11 +2075,11 @@ msgstr "" msgid "App Secret Key" msgstr "" -#: modules/utils.py:275 +#: modules/utils.py:279 msgid "App not found for module: {0}" msgstr "" -#: __init__.py:1794 +#: __init__.py:1800 msgid "App {0} is not installed" msgstr "" @@ -2065,7 +2099,7 @@ msgstr "" msgid "Append To" msgstr "" -#: email/doctype/email_account/email_account.py:185 +#: email/doctype/email_account/email_account.py:196 msgid "Append To can be one of {0}" msgstr "" @@ -2106,7 +2140,11 @@ msgstr "" msgid "Applied On" msgstr "" -#: public/js/frappe/list/list_view.js:1888 +#: public/js/form_builder/components/Field.vue:103 +msgid "Apply" +msgstr "" + +#: public/js/frappe/list/list_view.js:1942 msgctxt "Button in list view actions menu" msgid "Apply Assignment Rule" msgstr "" @@ -2200,7 +2238,7 @@ msgstr "" msgid "Archived Columns" msgstr "" -#: public/js/frappe/list/list_view.js:1867 +#: public/js/frappe/list/list_view.js:1921 msgid "Are you sure you want to clear the assignments?" msgstr "" @@ -2208,7 +2246,7 @@ msgstr "" msgid "Are you sure you want to delete all rows?" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:899 +#: public/js/frappe/views/workspace/workspace.js:926 msgid "Are you sure you want to delete page {0}?" msgstr "" @@ -2216,6 +2254,21 @@ msgstr "" msgid "Are you sure you want to delete the attachment?" msgstr "" +#: public/js/form_builder/components/Section.vue:197 +msgctxt "Confirmation dialog message" +msgid "Are you sure you want to delete the column? All the fields in the column will be moved to the previous column." +msgstr "" + +#: public/js/form_builder/components/Section.vue:126 +msgctxt "Confirmation dialog message" +msgid "Are you sure you want to delete the section? All the columns along with fields in the section will be moved to the previous section." +msgstr "" + +#: public/js/form_builder/components/Tabs.vue:65 +msgctxt "Confirmation dialog message" +msgid "Are you sure you want to delete the tab? All the sections along with fields in the tab will be moved to the previous tab." +msgstr "" + #: public/js/frappe/web_form/web_form.js:185 msgid "Are you sure you want to discard the changes?" msgstr "" @@ -2296,7 +2349,7 @@ msgstr "" msgid "Assign To" msgstr "" -#: public/js/frappe/list/list_view.js:1849 +#: public/js/frappe/list/list_view.js:1903 msgctxt "Button in list view actions menu" msgid "Assign To" msgstr "" @@ -2382,16 +2435,11 @@ msgid "Assignment Days" msgstr "" #. Name of a DocType -#. Label of the assignment_rule (Link) field in DocType 'ToDo' -#: automation/doctype/assignment_rule/assignment_rule.json -#: desk/doctype/todo/todo.json -msgid "Assignment Rule" -msgstr "" - #. Label of a Link in the Tools Workspace #. Label of a shortcut in the Tools Workspace -#: automation/workspace/tools/tools.json -msgctxt "Assignment Rule" +#. Label of the assignment_rule (Link) field in DocType 'ToDo' +#: automation/doctype/assignment_rule/assignment_rule.json +#: automation/workspace/tools/tools.json desk/doctype/todo/todo.json msgid "Assignment Rule" msgstr "" @@ -2415,7 +2463,7 @@ msgstr "" msgid "Assignment Rules" msgstr "" -#: desk/doctype/notification_log/notification_log.py:157 +#: desk/doctype/notification_log/notification_log.py:158 msgid "Assignment Update on {0}" msgstr "" @@ -2453,6 +2501,7 @@ msgstr "" #: core/doctype/docfield/docfield.json #: custom/doctype/custom_field/custom_field.json #: custom/doctype/customize_form_field/customize_form_field.json +#: public/js/form_builder/components/controls/AttachControl.vue:15 #: public/js/frappe/form/controls/attach.js:5 #: website/doctype/web_form_field/web_form_field.json msgid "Attach" @@ -2485,6 +2534,10 @@ msgstr "" msgid "Attach Print" msgstr "" +#: public/js/frappe/file_uploader/WebLink.vue:10 +msgid "Attach a web link" +msgstr "" + #: website/doctype/website_slideshow/website_slideshow.js:8 msgid "Attach files / urls and add in table." msgstr "" @@ -2588,6 +2641,11 @@ msgstr "" msgid "Auth URL Data" msgstr "" +#. Label of the backend_app_flow (Check) field in DocType 'Email Account' +#: email/doctype/email_account/email_account.json +msgid "Authenticate as Service Principal" +msgstr "" + #. Label of the authentication_column (Section Break) field in DocType 'Email #. Account' #. Label of the authentication_credential_section (Section Break) field in @@ -2603,7 +2661,7 @@ msgstr "" msgid "Authentication Apps you can use are: " msgstr "" -#: email/doctype/email_account/email_account.py:312 +#: email/doctype/email_account/email_account.py:329 msgid "Authentication failed while receiving emails from Email Account: {0}." msgstr "" @@ -2692,14 +2750,10 @@ msgstr "" msgid "Auto" msgstr "" -#. Name of a DocType -#: email/doctype/auto_email_report/auto_email_report.json -msgid "Auto Email Report" -msgstr "" - #. Label of a Link in the Tools Workspace +#. Name of a DocType #: automation/workspace/tools/tools.json -msgctxt "Auto Email Report" +#: email/doctype/auto_email_report/auto_email_report.json msgid "Auto Email Report" msgstr "" @@ -2711,14 +2765,9 @@ msgid "Auto Name" msgstr "" #. Name of a DocType -#: automation/doctype/auto_repeat/auto_repeat.json -#: public/js/frappe/utils/common.js:442 -msgid "Auto Repeat" -msgstr "" - #. Label of a Link in the Tools Workspace -#: automation/workspace/tools/tools.json -msgctxt "Auto Repeat" +#: automation/doctype/auto_repeat/auto_repeat.json +#: automation/workspace/tools/tools.json public/js/frappe/utils/common.js:442 msgid "Auto Repeat" msgstr "" @@ -2817,11 +2866,11 @@ msgstr "" msgid "Automatic" msgstr "" -#: email/doctype/email_account/email_account.py:715 +#: email/doctype/email_account/email_account.py:767 msgid "Automatic Linking can be activated only for one Email Account." msgstr "" -#: email/doctype/email_account/email_account.py:709 +#: email/doctype/email_account/email_account.py:761 msgid "Automatic Linking can be activated only if Incoming is enabled." msgstr "" @@ -2961,6 +3010,7 @@ msgstr "" msgid "BCC" msgstr "" +#: public/js/frappe/file_uploader/ImageCropper.vue:31 #: public/js/frappe/widgets/onboarding_widget.js:181 msgid "Back" msgstr "" @@ -2991,19 +3041,15 @@ msgstr "" msgid "Background Image" msgstr "" +#. Label of a Link in the Build Workspace #. Label of the background_jobs_section (Section Break) field in DocType #. 'System Health Report' +#: core/workspace/build/build.json #: desk/doctype/system_health_report/system_health_report.json #: public/js/frappe/ui/toolbar/toolbar.js:178 msgid "Background Jobs" msgstr "" -#. Label of a Link in the Build Workspace -#: core/workspace/build/build.json -msgctxt "RQ Job" -msgid "Background Jobs" -msgstr "" - #. Label of the background_jobs_check (Data) field in DocType 'System Health #. Report' #: desk/doctype/system_health_report/system_health_report.json @@ -3015,6 +3061,10 @@ msgstr "" msgid "Background Jobs Queue" msgstr "" +#: public/js/frappe/list/bulk_operations.js:87 +msgid "Background Print (required for >25 documents)" +msgstr "" + #. Label of the background_workers (Section Break) field in DocType 'System #. Settings' #. Label of the background_workers (Table) field in DocType 'System Health @@ -3308,14 +3358,10 @@ msgstr "" #. Name of a DocType #. Label of the blog_category (Link) field in DocType 'Blog Post' +#. Label of a Link in the Website Workspace #: website/doctype/blog_category/blog_category.json #: website/doctype/blog_post/blog_post.json -msgid "Blog Category" -msgstr "" - -#. Label of a Link in the Website Workspace #: website/workspace/website/website.json -msgctxt "Blog Category" msgid "Blog Category" msgstr "" @@ -3330,14 +3376,10 @@ msgid "Blog Introduction" msgstr "" #. Name of a DocType -#: website/doctype/blog_post/blog_post.json -msgid "Blog Post" -msgstr "" - #. Label of a Link in the Website Workspace #. Label of a shortcut in the Website Workspace +#: website/doctype/blog_post/blog_post.json #: website/workspace/website/website.json -msgctxt "Blog Post" msgid "Blog Post" msgstr "" @@ -3354,17 +3396,12 @@ msgstr "" #. Name of a role #. Label of the blogger (Link) field in DocType 'Blog Post' #. Name of a DocType +#. Label of a Link in the Website Workspace +#. Label of a shortcut in the Website Workspace #: website/doctype/blog_category/blog_category.json #: website/doctype/blog_post/blog_post.json #: website/doctype/blog_settings/blog_settings.json -#: website/doctype/blogger/blogger.json -msgid "Blogger" -msgstr "" - -#. Label of a Link in the Website Workspace -#. Label of a shortcut in the Website Workspace -#: website/workspace/website/website.json -msgctxt "Blogger" +#: website/doctype/blogger/blogger.json website/workspace/website/website.json msgid "Blogger" msgstr "" @@ -3404,6 +3441,7 @@ msgstr "" #. Option for the 'Position' (Select) field in DocType 'Form Tour Step' #: desk/doctype/form_tour_step/form_tour_step.json +#: public/js/print_format_builder/PrintFormatControls.vue:154 msgid "Bottom" msgstr "" @@ -3411,11 +3449,13 @@ msgstr "" #. Option for the 'Page Number' (Select) field in DocType 'Print Format' #: desk/doctype/form_tour_step/form_tour_step.json #: printing/doctype/print_format/print_format.json +#: public/js/print_format_builder/PrintFormatControls.vue:248 msgid "Bottom Center" msgstr "" #. Option for the 'Page Number' (Select) field in DocType 'Print Format' #: printing/doctype/print_format/print_format.json +#: public/js/print_format_builder/PrintFormatControls.vue:247 msgid "Bottom Left" msgstr "" @@ -3423,6 +3463,7 @@ msgstr "" #. Option for the 'Page Number' (Select) field in DocType 'Print Format' #: desk/doctype/form_tour_step/form_tour_step.json #: printing/doctype/print_format/print_format.json +#: public/js/print_format_builder/PrintFormatControls.vue:249 msgid "Bottom Right" msgstr "" @@ -3534,7 +3575,7 @@ msgstr "" msgid "Bulk Delete" msgstr "" -#: public/js/frappe/list/bulk_operations.js:291 +#: public/js/frappe/list/bulk_operations.js:321 msgid "Bulk Edit" msgstr "" @@ -3550,18 +3591,14 @@ msgstr "" msgid "Bulk Operation Successful" msgstr "" -#: public/js/frappe/list/bulk_operations.js:122 +#: public/js/frappe/list/bulk_operations.js:131 msgid "Bulk PDF Export" msgstr "" -#. Name of a DocType -#: desk/doctype/bulk_update/bulk_update.json -msgid "Bulk Update" -msgstr "" - #. Label of a Link in the Tools Workspace +#. Name of a DocType #: automation/workspace/tools/tools.json -msgctxt "Bulk Update" +#: desk/doctype/bulk_update/bulk_update.json msgid "Bulk Update" msgstr "" @@ -3733,19 +3770,14 @@ msgstr "" msgid "Calculate" msgstr "" +#. Label of a Link in the Tools Workspace #. Option for the 'Select List View' (Select) field in DocType 'Form Tour' #. Option for the 'DocType View' (Select) field in DocType 'Workspace Shortcut' -#: desk/doctype/form_tour/form_tour.json +#: automation/workspace/tools/tools.json desk/doctype/form_tour/form_tour.json #: desk/doctype/workspace_shortcut/workspace_shortcut.json msgid "Calendar" msgstr "" -#. Label of a Link in the Tools Workspace -#: automation/workspace/tools/tools.json -msgctxt "Event" -msgid "Calendar" -msgstr "" - #. Label of the calendar_name (Data) field in DocType 'Google Calendar' #: integrations/doctype/google_calendar/google_calendar.json msgid "Calendar Name" @@ -3753,6 +3785,7 @@ msgstr "" #. Name of a DocType #: desk/doctype/calendar_view/calendar_view.json +#: public/js/frappe/list/base_list.js:208 msgid "Calendar View" msgstr "" @@ -3787,6 +3820,7 @@ msgstr "" msgid "Callback Title" msgstr "" +#: public/js/frappe/file_uploader/FileUploader.vue:150 #: public/js/frappe/ui/capture.js:334 msgid "Camera" msgstr "" @@ -3794,7 +3828,7 @@ msgstr "" #. Label of the campaign (Link) field in DocType 'Newsletter' #. Label of the campaign (Data) field in DocType 'Web Page View' #: email/doctype/newsletter/newsletter.json -#: public/js/frappe/utils/utils.js:1723 +#: public/js/frappe/utils/utils.js:1724 #: website/doctype/web_page_view/web_page_view.json #: website/report/website_analytics/website_analytics.js:39 msgid "Campaign" @@ -3859,7 +3893,7 @@ msgstr "" msgid "Cancel" msgstr "" -#: public/js/frappe/list/list_view.js:1958 +#: public/js/frappe/list/list_view.js:2012 msgctxt "Button in list view actions menu" msgid "Cancel" msgstr "" @@ -3869,11 +3903,11 @@ msgctxt "Secondary button in warning dialog" msgid "Cancel" msgstr "" -#: public/js/frappe/form/form.js:974 +#: public/js/frappe/form/form.js:978 msgid "Cancel All" msgstr "" -#: public/js/frappe/form/form.js:961 +#: public/js/frappe/form/form.js:965 msgid "Cancel All Documents" msgstr "" @@ -3881,7 +3915,7 @@ msgstr "" msgid "Cancel Scheduling" msgstr "" -#: public/js/frappe/list/list_view.js:1963 +#: public/js/frappe/list/list_view.js:2017 msgctxt "Title of confirmation dialog" msgid "Cancel {0} documents?" msgstr "" @@ -3929,7 +3963,7 @@ msgstr "" msgid "Cannot Remove" msgstr "" -#: model/base_document.py:1072 +#: model/base_document.py:1073 msgid "Cannot Update After Submit" msgstr "" @@ -3945,7 +3979,7 @@ msgstr "" msgid "Cannot cancel before submitting. See Transition {0}" msgstr "" -#: public/js/frappe/list/bulk_operations.js:264 +#: public/js/frappe/list/bulk_operations.js:294 msgid "Cannot cancel {0}." msgstr "" @@ -3973,7 +4007,7 @@ msgstr "" msgid "Cannot create a {0} against a child document: {1}" msgstr "" -#: desk/doctype/workspace/workspace.py:250 +#: desk/doctype/workspace/workspace.py:254 msgid "Cannot create private workspace of other users" msgstr "" @@ -3981,15 +4015,15 @@ msgstr "" msgid "Cannot delete Home and Attachments folders" msgstr "" -#: model/delete_doc.py:373 +#: model/delete_doc.py:382 msgid "Cannot delete or cancel because {0} {1} is linked with {2} {3} {4}" msgstr "" -#: desk/doctype/workspace/workspace.py:415 +#: desk/doctype/workspace/workspace.py:419 msgid "Cannot delete private workspace of other users" msgstr "" -#: desk/doctype/workspace/workspace.py:408 +#: desk/doctype/workspace/workspace.py:412 msgid "Cannot delete public workspace without Workspace Manager role" msgstr "" @@ -4005,6 +4039,13 @@ msgstr "" msgid "Cannot delete standard field {0}. You can hide it instead." msgstr "" +#: public/js/form_builder/components/Field.vue:38 +#: public/js/form_builder/components/Section.vue:117 +#: public/js/form_builder/components/Section.vue:190 +#: public/js/form_builder/components/Tabs.vue:56 +msgid "Cannot delete standard field. You can hide it if you want" +msgstr "" + #: custom/doctype/customize_form/customize_form.js:347 msgid "Cannot delete standard link. You can hide it if you want" msgstr "" @@ -4013,11 +4054,11 @@ msgstr "" msgid "Cannot delete system generated field {0}. You can hide it instead." msgstr "" -#: public/js/frappe/list/bulk_operations.js:185 +#: public/js/frappe/list/bulk_operations.js:215 msgid "Cannot delete {0}" msgstr "" -#: utils/nestedset.py:296 +#: utils/nestedset.py:299 msgid "Cannot delete {0} as it has child nodes" msgstr "" @@ -4025,11 +4066,11 @@ msgstr "" msgid "Cannot edit Standard Dashboards" msgstr "" -#: email/doctype/notification/notification.py:121 +#: email/doctype/notification/notification.py:183 msgid "Cannot edit Standard Notification. To edit, please disable this and duplicate it" msgstr "" -#: desk/doctype/dashboard_chart/dashboard_chart.py:377 +#: desk/doctype/dashboard_chart/dashboard_chart.py:387 msgid "Cannot edit Standard charts" msgstr "" @@ -4094,24 +4135,24 @@ msgstr "" msgid "Cannot set 'Report' permission if 'Only If Creator' permission is set" msgstr "" -#: email/doctype/notification/notification.py:137 -msgid "Cannot set Notification on Document Type {0}" +#: email/doctype/notification/notification.py:200 +msgid "Cannot set Notification with event {0} on Document Type {1}" msgstr "" #: core/doctype/docshare/docshare.py:67 msgid "Cannot share {0} with submit permission as the doctype {1} is not submittable" msgstr "" -#: public/js/frappe/list/bulk_operations.js:261 +#: public/js/frappe/list/bulk_operations.js:291 msgid "Cannot submit {0}." msgstr "" -#: desk/doctype/workspace/workspace.py:349 +#: desk/doctype/workspace/workspace.py:353 msgid "Cannot update private workspace of other users" msgstr "" #: desk/doctype/bulk_update/bulk_update.js:26 -#: public/js/frappe/list/bulk_operations.js:336 +#: public/js/frappe/list/bulk_operations.js:366 msgid "Cannot update {0}" msgstr "" @@ -4123,7 +4164,7 @@ msgstr "" msgid "Cannot use {0} in order/group by" msgstr "" -#: public/js/frappe/list/bulk_operations.js:267 +#: public/js/frappe/list/bulk_operations.js:297 msgid "Cannot {0} {1}." msgstr "" @@ -4210,11 +4251,20 @@ msgctxt "Coins" msgid "Change" msgstr "" +#: public/js/print_format_builder/LetterHeadEditor.vue:38 +msgid "Change Image" +msgstr "" + #. Label of the label (Data) field in DocType 'Customize Form' #: custom/doctype/customize_form/customize_form.json msgid "Change Label (via Custom Translation)" msgstr "" +#: public/js/print_format_builder/LetterHeadEditor.vue:45 +#: public/js/print_format_builder/LetterHeadEditor.vue:141 +msgid "Change Letter Head" +msgstr "" + #. Label of the change_password (Section Break) field in DocType 'User' #: core/doctype/user/user.json msgid "Change Password" @@ -4270,6 +4320,8 @@ msgstr "" #. Label of the chart_name (Link) field in DocType 'Workspace Chart' #: desk/doctype/dashboard_chart/dashboard_chart.json #: desk/doctype/workspace_chart/workspace_chart.json +#: public/js/frappe/views/reports/query_report.js:289 +#: public/js/frappe/widgets/widget_dialog.js:137 msgid "Chart Name" msgstr "" @@ -4401,14 +4453,16 @@ msgstr "" msgid "Choose Existing Card or create New Card" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:1399 +#: public/js/frappe/views/workspace/workspace.js:1426 msgid "Choose a block or continue typing" msgstr "" +#: public/js/form_builder/components/controls/DataControl.vue:18 #: public/js/frappe/form/controls/color.js:5 msgid "Choose a color" msgstr "" +#: public/js/form_builder/components/controls/DataControl.vue:21 #: public/js/frappe/form/controls/icon.js:5 msgid "Choose an icon" msgstr "" @@ -4442,7 +4496,7 @@ msgstr "" msgid "Clear & Add template" msgstr "" -#: public/js/frappe/list/list_view.js:1864 +#: public/js/frappe/list/list_view.js:1918 msgctxt "Button in list view actions menu" msgid "Clear Assignment" msgstr "" @@ -4496,6 +4550,10 @@ msgstr "" msgid "Click on Authorize Google Drive Access to authorize Google Drive Access." msgstr "" +#: public/js/frappe/file_uploader/FileUploader.vue:499 +msgid "Click on a file to select it." +msgstr "" + #: templates/emails/login_with_email_link.html:19 msgid "Click on the button to log in to {0}" msgstr "" @@ -4516,6 +4574,10 @@ msgstr "" msgid "Click on the link below to verify your request" msgstr "" +#: public/js/frappe/file_uploader/FileUploader.vue:200 +msgid "Click on the lock icon to toggle public/private" +msgstr "" + #: integrations/doctype/google_calendar/google_calendar.py:102 #: integrations/doctype/google_contacts/google_contacts.py:41 #: integrations/doctype/google_drive/google_drive.py:53 @@ -4541,7 +4603,7 @@ msgstr "" msgid "Click to Set Filters" msgstr "" -#: public/js/frappe/list/list_view.js:680 +#: public/js/frappe/list/list_view.js:679 msgid "Click to sort by {0}" msgstr "" @@ -4589,9 +4651,12 @@ msgstr "" msgid "Client Information" msgstr "" +#. Label of a Link in the Build Workspace +#. Label of a shortcut in the Build Workspace #. Name of a DocType #. Label of the client_script (Code) field in DocType 'DocType Layout' #. Label of the client_script (Code) field in DocType 'Web Form' +#: core/workspace/build/build.json #: custom/doctype/client_script/client_script.json #: custom/doctype/doctype_layout/doctype_layout.json #: website/doctype/web_form/web_form.json @@ -4599,13 +4664,6 @@ msgstr "" msgid "Client Script" msgstr "" -#. Label of a Link in the Build Workspace -#. Label of a shortcut in the Build Workspace -#: core/workspace/build/build.json -msgctxt "Client Script" -msgid "Client Script" -msgstr "" - #. Label of the client_secret (Password) field in DocType 'Connected App' #. Label of the client_secret (Password) field in DocType 'Google Settings' #. Label of the client_secret (Password) field in DocType 'Social Login Key' @@ -4621,7 +4679,8 @@ msgid "Client URLs" msgstr "" #: core/doctype/communication/communication.js:39 desk/doctype/todo/todo.js:23 -#: public/js/frappe/ui/messages.js:243 website/js/bootstrap-4.js:24 +#: public/js/frappe/form/form_tour.js:17 public/js/frappe/ui/messages.js:244 +#: website/js/bootstrap-4.js:24 msgid "Close" msgstr "" @@ -4630,6 +4689,10 @@ msgstr "" msgid "Close Condition" msgstr "" +#: public/js/form_builder/components/FieldProperties.vue:79 +msgid "Close properties" +msgstr "" + #. Option for the 'Status' (Select) field in DocType 'Activity Log' #. Option for the 'Status' (Select) field in DocType 'Communication' #. Option for the 'Status' (Select) field in DocType 'Event' @@ -4676,7 +4739,7 @@ msgstr "" msgid "Code challenge method" msgstr "" -#: public/js/frappe/form/form_tour.js:270 +#: public/js/frappe/form/form_tour.js:276 #: public/js/frappe/widgets/base_widget.js:159 msgid "Collapse" msgstr "" @@ -4686,7 +4749,7 @@ msgctxt "Shrink code field." msgid "Collapse" msgstr "" -#: public/js/frappe/views/reports/query_report.js:1979 +#: public/js/frappe/views/reports/query_report.js:1964 #: public/js/frappe/views/treeview.js:121 msgid "Collapse All" msgstr "" @@ -4750,6 +4813,8 @@ msgstr "" #. Label of the column (Data) field in DocType 'Recorder Suggested Index' #: core/doctype/recorder_suggested_index/recorder_suggested_index.json #: printing/page/print_format_builder/print_format_builder_column_selector.html:7 +#: public/js/form_builder/components/Section.vue:270 +#: public/js/print_format_builder/ConfigureColumns.vue:8 msgid "Column" msgstr "" @@ -4925,7 +4990,6 @@ msgstr "" #. Label of a Link in the Build Workspace #: core/workspace/build/build.json -msgctxt "Communication" msgid "Communication Logs" msgstr "" @@ -4978,7 +5042,7 @@ msgstr "" msgid "Complete By" msgstr "" -#: core/doctype/user/user.py:426 templates/emails/new_user.html:10 +#: core/doctype/user/user.py:436 templates/emails/new_user.html:10 msgid "Complete Registration" msgstr "" @@ -5079,6 +5143,10 @@ msgstr "" msgid "Configure Recorder" msgstr "" +#: public/js/print_format_builder/Field.vue:103 +msgid "Configure columns for {0}" +msgstr "" + #. Description of the 'Amended Documents' (Section Break) field in DocType #. 'Document Naming Settings' #: core/doctype/document_naming_settings/document_naming_settings.json @@ -5239,13 +5307,9 @@ msgid "Contact Us" msgstr "" #. Name of a DocType -#: website/doctype/contact_us_settings/contact_us_settings.json -msgid "Contact Us Settings" -msgstr "" - #. Label of a Link in the Website Workspace +#: website/doctype/contact_us_settings/contact_us_settings.json #: website/workspace/website/website.json -msgctxt "Contact Us Settings" msgid "Contact Us Settings" msgstr "" @@ -5276,7 +5340,7 @@ msgstr "" #: core/doctype/comment/comment.json desk/doctype/note/note.json #: desk/doctype/workspace/workspace.json #: email/doctype/newsletter/newsletter.json -#: public/js/frappe/utils/utils.js:1738 +#: public/js/frappe/utils/utils.js:1739 #: website/doctype/blog_post/blog_post.json #: website/doctype/help_article/help_article.json #: website/doctype/web_page/web_page.json @@ -5489,7 +5553,7 @@ msgstr "" #: public/js/frappe/views/file/file_view.js:112 #: public/js/frappe/views/interaction.js:18 #: public/js/frappe/views/reports/query_report.js:1188 -#: public/js/frappe/views/workspace/workspace.js:1231 +#: public/js/frappe/views/workspace/workspace.js:1258 #: workflow/page/workflow_builder/workflow_builder.js:46 msgid "Create" msgstr "" @@ -5513,6 +5577,10 @@ msgstr "" msgid "Create Chart" msgstr "" +#: public/js/form_builder/components/controls/TableControl.vue:62 +msgid "Create Child Doctype" +msgstr "" + #. Label of the create_contact (Check) field in DocType 'Email Account' #: email/doctype/email_account/email_account.json msgid "Create Contacts from Incoming Emails" @@ -5523,7 +5591,7 @@ msgstr "" msgid "Create Custom Fields" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:939 +#: public/js/frappe/views/workspace/workspace.js:966 msgid "Create Duplicate" msgstr "" @@ -5532,6 +5600,11 @@ msgstr "" msgid "Create Entry" msgstr "" +#: public/js/print_format_builder/LetterHeadEditor.vue:59 +#: public/js/print_format_builder/LetterHeadEditor.vue:195 +msgid "Create Letter Head" +msgstr "" + #. Label of the create_log (Check) field in DocType 'Scheduled Job Type' #: core/doctype/scheduled_job_type/scheduled_job_type.json msgid "Create Log" @@ -5543,7 +5616,7 @@ msgstr "" msgid "Create New" msgstr "" -#: public/js/frappe/list/list_view.js:487 +#: public/js/frappe/list/list_view.js:484 msgctxt "Create a new document from list view" msgid "Create New" msgstr "" @@ -5560,10 +5633,6 @@ msgstr "" msgid "Create User Email" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:479 -msgid "Create Workspace" -msgstr "" - #: printing/page/print_format_builder/print_format_builder_start.html:16 msgid "Create a New Format" msgstr "" @@ -5583,7 +5652,7 @@ msgstr "" #: public/js/frappe/form/controls/link.js:295 #: public/js/frappe/form/controls/link.js:297 #: public/js/frappe/form/link_selector.js:139 -#: public/js/frappe/list/list_view.js:476 +#: public/js/frappe/list/list_view.js:473 #: public/js/frappe/web_form/web_form_list.js:225 msgid "Create a new {0}" msgstr "" @@ -5610,7 +5679,7 @@ msgstr "" msgid "Create or Edit Workflow" msgstr "" -#: public/js/frappe/list/list_view.js:479 +#: public/js/frappe/list/list_view.js:476 msgid "Create your first {0}" msgstr "" @@ -5641,7 +5710,7 @@ msgid "Created Custom Field {0} in {1}" msgstr "" #: desk/doctype/dashboard_chart/dashboard_chart.js:241 -#: email/doctype/notification/notification.js:30 model/meta.py:46 +#: email/doctype/notification/notification.js:33 model/meta.py:46 #: public/js/frappe/model/meta.js:198 public/js/frappe/model/model.js:125 #: public/js/frappe/views/dashboard/dashboard_view.js:478 msgid "Created On" @@ -5682,6 +5751,10 @@ msgstr "" msgid "Cron format is required for job types with Cron frequency." msgstr "" +#: public/js/frappe/file_uploader/ImageCropper.vue:34 +msgid "Crop" +msgstr "" + #: public/js/frappe/form/grid_row_form.js:42 msgid "Ctrl + Down" msgstr "" @@ -5843,14 +5916,10 @@ msgstr "" msgid "Custom Documents" msgstr "" -#. Name of a DocType -#: custom/doctype/custom_field/custom_field.json -msgid "Custom Field" -msgstr "" - #. Label of a Link in the Build Workspace +#. Name of a DocType #: core/workspace/build/build.json -msgctxt "Custom Field" +#: custom/doctype/custom_field/custom_field.json msgid "Custom Field" msgstr "" @@ -5894,6 +5963,7 @@ msgstr "" #: printing/page/print_format_builder/print_format_builder.js:190 #: printing/page/print_format_builder/print_format_builder.js:720 +#: public/js/print_format_builder/PrintFormatControls.vue:192 msgid "Custom HTML" msgstr "" @@ -5960,7 +6030,6 @@ msgstr "" #. Label of a Link in the Build Workspace #: core/workspace/build/build.json -msgctxt "Translation" msgid "Custom Translation" msgstr "" @@ -5992,7 +6061,7 @@ msgstr "" msgid "Customization onboarding is all done!" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:525 +#: public/js/frappe/views/workspace/workspace.js:552 msgid "Customizations Discarded" msgstr "" @@ -6000,7 +6069,7 @@ msgstr "" msgid "Customizations Reset" msgstr "" -#: modules/utils.py:91 +#: modules/utils.py:95 msgid "Customizations for {0} exported to:
{1}" msgstr "" @@ -6011,7 +6080,7 @@ msgstr "" msgid "Customize" msgstr "" -#: public/js/frappe/list/list_view.js:1709 +#: public/js/frappe/list/list_view.js:1763 msgctxt "Button in list view menu" msgid "Customize" msgstr "" @@ -6024,17 +6093,13 @@ msgstr "" msgid "Customize Dashboard" msgstr "" -#. Name of a DocType -#: automation/doctype/auto_repeat/auto_repeat.js:33 -#: custom/doctype/customize_form/customize_form.json -#: public/js/frappe/views/kanban/kanban_view.js:343 -msgid "Customize Form" -msgstr "" - #. Label of a Link in the Build Workspace #. Label of a shortcut in the Build Workspace -#: core/workspace/build/build.json -msgctxt "Customize Form" +#. Name of a DocType +#: automation/doctype/auto_repeat/auto_repeat.js:33 +#: core/doctype/doctype/doctype.js:65 core/workspace/build/build.json +#: custom/doctype/customize_form/customize_form.json +#: public/js/frappe/views/kanban/kanban_view.js:343 msgid "Customize Form" msgstr "" @@ -6157,35 +6222,27 @@ msgid "Dark Theme" msgstr "" #. Label of the dashboard (Check) field in DocType 'Role' +#. Label of a Link in the Build Workspace #. Name of a DocType #. Option for the 'Select List View' (Select) field in DocType 'Form Tour' #. Option for the 'Type' (Select) field in DocType 'Workspace Shortcut' #. Option for the 'DocType View' (Select) field in DocType 'Workspace Shortcut' #: core/doctype/role/role.json core/page/dashboard_view/dashboard_view.js:10 -#: desk/doctype/dashboard/dashboard.json desk/doctype/form_tour/form_tour.json +#: core/workspace/build/build.json desk/doctype/dashboard/dashboard.json +#: desk/doctype/form_tour/form_tour.json #: desk/doctype/workspace_shortcut/workspace_shortcut.json #: public/js/frappe/ui/toolbar/search_utils.js:562 msgid "Dashboard" msgstr "" #. Label of a Link in the Build Workspace -#: core/workspace/build/build.json -msgctxt "Dashboard" -msgid "Dashboard" -msgstr "" - #. Name of a DocType +#: core/workspace/build/build.json #: desk/doctype/dashboard_chart/dashboard_chart.json #: desk/doctype/dashboard_chart_source/dashboard_chart_source.js:8 msgid "Dashboard Chart" msgstr "" -#. Label of a Link in the Build Workspace -#: core/workspace/build/build.json -msgctxt "Dashboard Chart" -msgid "Dashboard Chart" -msgstr "" - #. Name of a DocType #: desk/doctype/dashboard_chart_field/dashboard_chart_field.json msgid "Dashboard Chart Field" @@ -6218,6 +6275,10 @@ msgstr "" msgid "Dashboard Settings" msgstr "" +#: public/js/frappe/list/base_list.js:205 +msgid "Dashboard View" +msgstr "" + #. Label of the tab_break_2 (Tab Break) field in DocType 'Workspace' #: desk/doctype/workspace/workspace.json msgid "Dashboards" @@ -6252,7 +6313,7 @@ msgstr "" msgid "Data" msgstr "" -#: public/js/frappe/form/controls/data.js:58 +#: public/js/frappe/form/controls/data.js:59 msgid "Data Clipped" msgstr "" @@ -6357,6 +6418,7 @@ msgstr "" #. Trail' #: core/doctype/audit_trail/audit_trail.json #: desk/page/leaderboard/leaderboard.js:165 +#: public/js/frappe/widgets/chart_widget.js:237 msgid "Date Range" msgstr "" @@ -6490,7 +6552,7 @@ msgstr "" #. Label of the default_incoming (Check) field in DocType 'Email Account' #: email/doctype/email_account/email_account.json -#: email/doctype/email_account/email_account.py:201 +#: email/doctype/email_account/email_account.py:218 msgid "Default Incoming" msgstr "" @@ -6510,7 +6572,7 @@ msgstr "" #. Label of the default_outgoing (Check) field in DocType 'Email Account' #: email/doctype/email_account/email_account.json -#: email/doctype/email_account/email_account.py:209 +#: email/doctype/email_account/email_account.py:226 msgid "Default Outgoing" msgstr "" @@ -6625,7 +6687,7 @@ msgstr "" msgid "Defaults" msgstr "" -#: email/doctype/email_account/email_account.py:220 +#: email/doctype/email_account/email_account.py:237 msgid "Defaults Updated" msgstr "" @@ -6651,17 +6713,17 @@ msgstr "" #: core/doctype/docperm/docperm.json #: core/doctype/user_document_type/user_document_type.json #: core/doctype/user_permission/user_permission_list.js:189 -#: public/js/frappe/form/footer/form_timeline.js:613 +#: public/js/frappe/form/footer/form_timeline.js:615 #: public/js/frappe/form/grid.js:63 public/js/frappe/form/toolbar.js:434 #: public/js/frappe/views/reports/report_view.js:1654 #: public/js/frappe/views/treeview.js:308 -#: public/js/frappe/views/workspace/workspace.js:837 +#: public/js/frappe/views/workspace/workspace.js:864 #: templates/discussions/reply_card.html:35 #: templates/discussions/reply_section.html:29 msgid "Delete" msgstr "" -#: public/js/frappe/list/list_view.js:1926 +#: public/js/frappe/list/list_view.js:1980 msgctxt "Button in list view actions menu" msgid "Delete" msgstr "" @@ -6674,6 +6736,11 @@ msgstr "" msgid "Delete All" msgstr "" +#: public/js/form_builder/components/Section.vue:196 +msgctxt "Title of confirmation dialog" +msgid "Delete Column" +msgstr "" + #: website/doctype/personal_data_deletion_request/personal_data_deletion_request.js:10 msgid "Delete Data" msgstr "" @@ -6682,7 +6749,17 @@ msgstr "" msgid "Delete Kanban Board" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:838 +#: public/js/form_builder/components/Section.vue:125 +msgctxt "Title of confirmation dialog" +msgid "Delete Section" +msgstr "" + +#: public/js/form_builder/components/Tabs.vue:64 +msgctxt "Title of confirmation dialog" +msgid "Delete Tab" +msgstr "" + +#: public/js/frappe/views/workspace/workspace.js:865 msgid "Delete Workspace" msgstr "" @@ -6690,20 +6767,50 @@ msgstr "" msgid "Delete and Generate New" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:719 +#: public/js/form_builder/components/Section.vue:203 +msgctxt "Button text" +msgid "Delete column" +msgstr "" + +#: public/js/frappe/form/footer/form_timeline.js:721 msgid "Delete comment?" msgstr "" +#: public/js/form_builder/components/Section.vue:205 +msgctxt "Button text" +msgid "Delete entire column with fields" +msgstr "" + +#: public/js/form_builder/components/Section.vue:134 +msgctxt "Button text" +msgid "Delete entire section with fields" +msgstr "" + +#: public/js/form_builder/components/Tabs.vue:73 +msgctxt "Button text" +msgid "Delete entire tab with fields" +msgstr "" + +#: public/js/form_builder/components/Section.vue:132 +msgctxt "Button text" +msgid "Delete section" +msgstr "" + +#: public/js/form_builder/components/Tabs.vue:71 +msgctxt "Button text" +msgid "Delete tab" +msgstr "" + #: email/doctype/email_unsubscribe/email_unsubscribe.py:29 msgid "Delete this record to allow sending to this email address" msgstr "" -#: public/js/frappe/list/list_view.js:1931 +#: public/js/frappe/list/list_view.js:1985 msgctxt "Title of confirmation dialog" msgid "Delete {0} item permanently?" msgstr "" -#: public/js/frappe/list/list_view.js:1937 +#: public/js/frappe/list/list_view.js:1991 msgctxt "Title of confirmation dialog" msgid "Delete {0} items permanently?" msgstr "" @@ -6733,7 +6840,6 @@ msgstr "" #. Label of a Link in the Tools Workspace #: automation/workspace/tools/tools.json -msgctxt "Deleted Document" msgid "Deleted Documents" msgstr "" @@ -6750,7 +6856,7 @@ msgstr "" msgid "Deleting {0}" msgstr "" -#: public/js/frappe/list/bulk_operations.js:172 +#: public/js/frappe/list/bulk_operations.js:202 msgid "Deleting {0} records..." msgstr "" @@ -6799,7 +6905,8 @@ msgid "Department" msgstr "" #. Label of the dependencies (Data) field in DocType 'Workspace Link' -#: desk/doctype/workspace_link/workspace_link.json www/attribution.html:29 +#: desk/doctype/workspace_link/workspace_link.json +#: public/js/frappe/widgets/widget_dialog.js:318 www/attribution.html:29 msgid "Dependencies" msgstr "" @@ -6940,8 +7047,9 @@ msgstr "" #: custom/doctype/customize_form/customize_form.json #: desk/doctype/event/event.json #: desk/page/user_profile/user_profile_sidebar.html:45 +#: public/js/form_builder/components/Tabs.vue:92 #: public/js/form_builder/store.js:259 public/js/form_builder/utils.js:38 -#: public/js/frappe/form/layout.js:135 public/js/frappe/views/treeview.js:271 +#: public/js/frappe/form/layout.js:137 public/js/frappe/views/treeview.js:271 msgid "Details" msgstr "" @@ -7089,14 +7197,14 @@ msgstr "" msgid "Disabled" msgstr "" -#: email/doctype/email_account/email_account.js:232 +#: email/doctype/email_account/email_account.js:265 msgid "Disabled Auto Reply" msgstr "" #: public/js/frappe/form/toolbar.js:316 #: public/js/frappe/views/communication.js:30 #: public/js/frappe/views/dashboard/dashboard_view.js:70 -#: public/js/frappe/views/workspace/workspace.js:516 +#: public/js/frappe/views/workspace/workspace.js:543 #: public/js/frappe/web_form/web_form.js:187 msgid "Discard" msgstr "" @@ -7106,7 +7214,7 @@ msgctxt "Button in web form" msgid "Discard" msgstr "" -#: public/js/frappe/form/form.js:840 +#: public/js/frappe/form/form.js:844 msgid "Discard {0}" msgstr "" @@ -7133,7 +7241,7 @@ msgstr "" msgid "Discussion Topic" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:623 +#: public/js/frappe/form/footer/form_timeline.js:625 #: templates/discussions/reply_card.html:16 #: templates/discussions/reply_section.html:29 msgid "Dismiss" @@ -7161,6 +7269,10 @@ msgstr "" msgid "Display Depends On (JS)" msgstr "" +#: public/js/print_format_builder/PrintFormatControls.vue:210 +msgid "Divider" +msgstr "" + #. Label of the do_not_create_new_user (Check) field in DocType 'LDAP Settings' #: integrations/doctype/ldap_settings/ldap_settings.json msgid "Do Not Create New User " @@ -7184,7 +7296,7 @@ msgstr "" msgid "Do you still want to proceed?" msgstr "" -#: public/js/frappe/form/form.js:953 +#: public/js/frappe/form/form.js:957 msgid "Do you want to cancel all linked documents?" msgstr "" @@ -7235,6 +7347,8 @@ msgstr "" #. Group in Module Def's connections #. Label of the ref_doctype (Link) field in DocType 'Permission Inspector' #. Label of the ref_doctype (Link) field in DocType 'Version' +#. Label of a Link in the Build Workspace +#. Label of a shortcut in the Build Workspace #. Label of the dt (Link) field in DocType 'Client Script' #. Label of the dt (Link) field in DocType 'Custom Field' #. Option for the 'Applied On' (Select) field in DocType 'Property Setter' @@ -7251,6 +7365,7 @@ msgstr "" #: core/doctype/permission_inspector/permission_inspector.json #: core/doctype/version/version.json #: core/report/permitted_documents_for_user/permitted_documents_for_user.js:15 +#: core/workspace/build/build.json #: custom/doctype/client_script/client_script.json #: custom/doctype/custom_field/custom_field.json #: custom/doctype/property_setter/property_setter.json @@ -7259,17 +7374,11 @@ msgstr "" #: desk/doctype/workspace_shortcut/workspace_shortcut.json #: integrations/doctype/webhook/webhook.json #: printing/doctype/print_format/print_format.json +#: public/js/frappe/widgets/widget_dialog.js:164 #: website/doctype/website_slideshow/website_slideshow.js:18 msgid "DocType" msgstr "" -#. Label of a Link in the Build Workspace -#. Label of a shortcut in the Build Workspace -#: core/workspace/build/build.json -msgctxt "DocType" -msgid "DocType" -msgstr "" - #: core/doctype/doctype/doctype.py:1546 msgid "DocType {0} provided for the field {1} must have atleast one Link field" msgstr "" @@ -7317,6 +7426,7 @@ msgstr "" #. Label of the doc_view (Select) field in DocType 'Workspace Shortcut' #: desk/doctype/workspace_shortcut/workspace_shortcut.json +#: public/js/frappe/widgets/widget_dialog.js:477 msgid "DocType View" msgstr "" @@ -7358,11 +7468,11 @@ msgstr "" msgid "DocType required" msgstr "" -#: modules/utils.py:170 +#: modules/utils.py:174 msgid "DocType {0} does not exist." msgstr "" -#: modules/utils.py:233 +#: modules/utils.py:237 msgid "DocType {} not found" msgstr "" @@ -7388,7 +7498,7 @@ msgstr "" msgid "Doctype required" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:1317 +#: public/js/frappe/views/workspace/workspace.js:1344 msgid "Doctype with same route already exist. Please choose different title." msgstr "" @@ -7402,6 +7512,7 @@ msgstr "" #: core/doctype/audit_trail/audit_trail.json core/doctype/doctype/doctype.json #: core/doctype/permission_inspector/permission_inspector.json #: desk/doctype/notification_subscribed_document/notification_subscribed_document.json +#: public/js/frappe/views/render_preview.js:42 msgid "Document" msgstr "" @@ -7468,7 +7579,7 @@ msgstr "" #: core/doctype/user_permission/user_permission_list.js:36 #: core/doctype/version/version.json desk/doctype/tag_link/tag_link.json #: email/doctype/document_follow/document_follow.json -#: public/js/frappe/form/form_tour.js:60 +#: public/js/frappe/form/form_tour.js:62 msgid "Document Name" msgstr "" @@ -7652,15 +7763,15 @@ msgstr "" msgid "Document Unlocked" msgstr "" -#: public/js/frappe/list/list_view.js:1081 +#: public/js/frappe/list/list_view.js:1118 msgid "Document has been cancelled" msgstr "" -#: public/js/frappe/list/list_view.js:1080 +#: public/js/frappe/list/list_view.js:1117 msgid "Document has been submitted" msgstr "" -#: public/js/frappe/list/list_view.js:1079 +#: public/js/frappe/list/list_view.js:1116 msgid "Document is in draft state" msgstr "" @@ -7680,7 +7791,7 @@ msgstr "" msgid "Document renaming from {0} to {1} has been queued" msgstr "" -#: desk/doctype/dashboard_chart/dashboard_chart.py:386 +#: desk/doctype/dashboard_chart/dashboard_chart.py:396 msgid "Document type is required to create a dashboard chart" msgstr "" @@ -7783,8 +7894,10 @@ msgstr "" msgid "Don't have an account?" msgstr "" -#: public/js/frappe/ui/messages.js:231 +#: public/js/frappe/form/form_tour.js:16 public/js/frappe/ui/messages.js:231 #: public/js/onboarding_tours/onboarding_tours.js:17 +#: public/js/print_format_builder/HTMLEditor.vue:5 +#: public/js/print_format_builder/LetterHeadEditor.vue:52 msgid "Done" msgstr "" @@ -7793,6 +7906,10 @@ msgstr "" msgid "Donut" msgstr "" +#: public/js/form_builder/components/EditableInput.vue:43 +msgid "Double click to edit label" +msgstr "" + #: core/doctype/file/file.js:5 #: email/doctype/auto_email_report/auto_email_report.js:8 #: public/js/frappe/form/grid.js:63 @@ -7821,7 +7938,7 @@ msgstr "" msgid "Download Link" msgstr "" -#: public/js/frappe/list/bulk_operations.js:125 +#: public/js/frappe/list/bulk_operations.js:134 msgid "Download PDF" msgstr "" @@ -7840,7 +7957,7 @@ msgstr "" msgid "Download Your Data" msgstr "" -#: contacts/doctype/contact/contact.js:93 +#: contacts/doctype/contact/contact.js:98 msgid "Download vCard" msgstr "" @@ -7856,15 +7973,35 @@ msgstr "" #: public/js/frappe/views/workspace/blocks/header.js:46 #: public/js/frappe/views/workspace/blocks/paragraph.js:136 #: public/js/frappe/views/workspace/blocks/spacer.js:44 -#: public/js/frappe/views/workspace/workspace.js:579 +#: public/js/frappe/views/workspace/workspace.js:606 #: public/js/frappe/widgets/base_widget.js:33 msgid "Drag" msgstr "" +#: public/js/form_builder/components/Tabs.vue:189 +msgid "Drag & Drop a section here from another tab" +msgstr "" + +#: public/js/frappe/file_uploader/FileUploader.vue:14 +msgid "Drag and drop files here or upload from" +msgstr "" + +#: public/js/print_format_builder/ConfigureColumns.vue:76 +msgid "Drag columns to set order. Column width is set in percentage. The total width should not be more than 100. Columns marked in red will be removed." +msgstr "" + #: printing/page/print_format_builder/print_format_builder_layout.html:3 msgid "Drag elements from the sidebar to add. Drag them back to trash." msgstr "" +#: public/js/workflow_builder/WorkflowBuilder.vue:296 +msgid "Drag to add state" +msgstr "" + +#: public/js/frappe/file_uploader/FileUploader.vue:172 +msgid "Drop files here" +msgstr "" + #. Label of the dropbox_access_token (Password) field in DocType 'Dropbox #. Settings' #: integrations/doctype/dropbox_settings/dropbox_settings.json @@ -7878,13 +8015,9 @@ msgid "Dropbox Refresh Token" msgstr "" #. Name of a DocType -#: integrations/doctype/dropbox_settings/dropbox_settings.json -msgid "Dropbox Settings" -msgstr "" - #. Label of a Link in the Integrations Workspace +#: integrations/doctype/dropbox_settings/dropbox_settings.json #: integrations/workspace/integrations/integrations.json -msgctxt "Dropbox Settings" msgid "Dropbox Settings" msgstr "" @@ -7910,8 +8043,8 @@ msgstr "" #: public/js/frappe/form/grid_row_form.js:42 #: public/js/frappe/form/toolbar.js:388 -#: public/js/frappe/views/workspace/workspace.js:822 -#: public/js/frappe/views/workspace/workspace.js:989 +#: public/js/frappe/views/workspace/workspace.js:849 +#: public/js/frappe/views/workspace/workspace.js:1016 msgid "Duplicate" msgstr "" @@ -7927,8 +8060,8 @@ msgstr "" msgid "Duplicate Name" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:561 -#: public/js/frappe/views/workspace/workspace.js:823 +#: public/js/frappe/views/workspace/workspace.js:588 +#: public/js/frappe/views/workspace/workspace.js:850 msgid "Duplicate Workspace" msgstr "" @@ -7936,7 +8069,11 @@ msgstr "" msgid "Duplicate current row" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:1004 +#: public/js/form_builder/components/Field.vue:245 +msgid "Duplicate field" +msgstr "" + +#: public/js/frappe/views/workspace/workspace.js:1031 msgid "Duplicate of {0} named as {1} is created successfully" msgstr "" @@ -8022,17 +8159,17 @@ msgstr "" #: printing/page/print_format_builder_beta/print_format_builder_beta.js:46 #: printing/page/print_format_builder_beta/print_format_builder_beta.js:85 #: public/js/frappe/form/controls/markdown_editor.js:31 -#: public/js/frappe/form/footer/form_timeline.js:652 -#: public/js/frappe/form/footer/form_timeline.js:661 +#: public/js/frappe/form/footer/form_timeline.js:654 +#: public/js/frappe/form/footer/form_timeline.js:663 #: public/js/frappe/form/templates/address_list.html:7 #: public/js/frappe/form/templates/contact_list.html:7 #: public/js/frappe/form/toolbar.js:681 #: public/js/frappe/views/reports/query_report.js:815 -#: public/js/frappe/views/reports/query_report.js:1649 -#: public/js/frappe/views/workspace/workspace.js:460 -#: public/js/frappe/views/workspace/workspace.js:816 +#: public/js/frappe/views/reports/query_report.js:1634 +#: public/js/frappe/views/workspace/workspace.js:95 +#: public/js/frappe/views/workspace/workspace.js:843 #: public/js/frappe/widgets/base_widget.js:64 -#: public/js/frappe/widgets/chart_widget.js:298 +#: public/js/frappe/widgets/chart_widget.js:299 #: public/js/frappe/widgets/number_card_widget.js:331 #: templates/discussions/reply_card.html:29 #: templates/discussions/reply_section.html:29 @@ -8041,7 +8178,7 @@ msgstr "" msgid "Edit" msgstr "" -#: public/js/frappe/list/list_view.js:2012 +#: public/js/frappe/list/list_view.js:2066 msgctxt "Button in list view actions menu" msgid "Edit" msgstr "" @@ -8071,7 +8208,7 @@ msgstr "" msgid "Edit DocType" msgstr "" -#: public/js/frappe/list/list_view.js:1736 +#: public/js/frappe/list/list_view.js:1790 msgctxt "Button in list view menu" msgid "Edit DocType" msgstr "" @@ -8085,6 +8222,10 @@ msgstr "" msgid "Edit Filters" msgstr "" +#: public/js/print_format_builder/PrintFormat.vue:29 +msgid "Edit Footer" +msgstr "" + #: printing/doctype/print_format/print_format.js:28 msgid "Edit Format" msgstr "" @@ -8094,14 +8235,27 @@ msgid "Edit Full Form" msgstr "" #: printing/page/print_format_builder/print_format_builder_field.html:26 +#: public/js/print_format_builder/Field.vue:83 msgid "Edit HTML" msgstr "" +#: public/js/print_format_builder/PrintFormat.vue:9 +msgid "Edit Header" +msgstr "" + #: printing/page/print_format_builder/print_format_builder.js:602 #: printing/page/print_format_builder/print_format_builder_layout.html:8 msgid "Edit Heading" msgstr "" +#: public/js/print_format_builder/LetterHeadEditor.vue:52 +msgid "Edit Letter Head" +msgstr "" + +#: public/js/print_format_builder/PrintFormat.vue:35 +msgid "Edit Letter Head Footer" +msgstr "" + #: public/js/frappe/widgets/widget_dialog.js:42 msgid "Edit Links" msgstr "" @@ -8151,7 +8305,7 @@ msgstr "" msgid "Edit Values" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:817 +#: public/js/frappe/views/workspace/workspace.js:844 msgid "Edit Workspace" msgstr "" @@ -8159,6 +8313,10 @@ msgstr "" msgid "Edit mode" msgstr "" +#: public/js/form_builder/components/Field.vue:254 +msgid "Edit the {0} Doctype" +msgstr "" + #: printing/page/print_format_builder/print_format_builder.js:713 msgid "Edit to add content" msgstr "" @@ -8217,6 +8375,7 @@ msgstr "" #. Label of the email_tab (Tab Break) field in DocType 'System Settings' #. Label of the email (Data) field in DocType 'User' #. Label of the email_settings (Section Break) field in DocType 'User' +#. Label of the email (Check) field in DocType 'User Document Type' #. Label of the email (Data) field in DocType 'Event Participants' #. Label of the email (Data) field in DocType 'Email Group Member' #. Label of the email (Data) field in DocType 'Email Unsubscribe' @@ -8229,6 +8388,7 @@ msgstr "" #: core/doctype/success_action/success_action.js:57 #: core/doctype/system_settings/system_settings.json #: core/doctype/user/user.json +#: core/doctype/user_document_type/user_document_type.json #: desk/doctype/event_participants/event_participants.json #: email/doctype/email_group_member/email_group_member.json #: email/doctype/email_unsubscribe/email_unsubscribe.json @@ -8242,12 +8402,14 @@ msgstr "" msgid "Email" msgstr "" +#. Label of a Link in the Tools Workspace #. Label of the email_account (Link) field in DocType 'Communication' #. Label of the email_account (Link) field in DocType 'User Email' #. Name of a DocType #. Label of the email_account (Data) field in DocType 'Email Flag Queue' #. Label of the email_account (Link) field in DocType 'Email Queue' #. Label of the email_account (Link) field in DocType 'Unhandled Email' +#: automation/workspace/tools/tools.json #: core/doctype/communication/communication.js:199 #: core/doctype/communication/communication.json #: core/doctype/user_email/user_email.json @@ -8258,13 +8420,7 @@ msgstr "" msgid "Email Account" msgstr "" -#. Label of a Link in the Tools Workspace -#: automation/workspace/tools/tools.json -msgctxt "Email Account" -msgid "Email Account" -msgstr "" - -#: email/doctype/email_account/email_account.py:316 +#: email/doctype/email_account/email_account.py:333 msgid "Email Account Disabled." msgstr "" @@ -8273,7 +8429,7 @@ msgstr "" msgid "Email Account Name" msgstr "" -#: core/doctype/user/user.py:690 +#: core/doctype/user/user.py:709 msgid "Email Account added multiple times" msgstr "" @@ -8302,14 +8458,10 @@ msgstr "" msgid "Email Addresses" msgstr "" -#. Name of a DocType -#: email/doctype/email_domain/email_domain.json -msgid "Email Domain" -msgstr "" - #. Label of a Link in the Tools Workspace +#. Name of a DocType #: automation/workspace/tools/tools.json -msgctxt "Email Domain" +#: email/doctype/email_domain/email_domain.json msgid "Email Domain" msgstr "" @@ -8324,21 +8476,17 @@ msgstr "" msgid "Email Footer Address" msgstr "" +#. Label of a Link in the Tools Workspace #. Name of a DocType #. Label of the email_group (Link) field in DocType 'Email Group Member' #. Label of the email_group (Link) field in DocType 'Newsletter Email Group' +#: automation/workspace/tools/tools.json #: email/doctype/email_group/email_group.json #: email/doctype/email_group_member/email_group_member.json #: email/doctype/newsletter_email_group/newsletter_email_group.json msgid "Email Group" msgstr "" -#. Label of a Link in the Tools Workspace -#: automation/workspace/tools/tools.json -msgctxt "Email Group" -msgid "Email Group" -msgstr "" - #. Name of a DocType #: email/doctype/email_group_member/email_group_member.json msgid "Email Group Member" @@ -8443,20 +8591,16 @@ msgstr "" msgid "Email Sync Option" msgstr "" +#. Label of a Link in the Tools Workspace #. Label of the email_template (Link) field in DocType 'Communication' #. Name of a DocType +#: automation/workspace/tools/tools.json #: core/doctype/communication/communication.json #: email/doctype/email_template/email_template.json #: public/js/frappe/views/communication.js:95 msgid "Email Template" msgstr "" -#. Label of a Link in the Tools Workspace -#: automation/workspace/tools/tools.json -msgctxt "Email Template" -msgid "Email Template" -msgstr "" - #. Label of the enable_email_threads_on_assigned_document (Check) field in #. DocType 'Notification Settings' #: desk/doctype/notification_settings/notification_settings.json @@ -8508,6 +8652,10 @@ msgstr "" msgid "Embed code copied" msgstr "" +#: public/js/form_builder/components/Section.vue:285 +msgid "Empty column" +msgstr "" + #. Label of the enable (Check) field in DocType 'Google Calendar' #. Label of the enable (Check) field in DocType 'Google Contacts' #. Label of the enable (Check) field in DocType 'Google Drive' @@ -8569,7 +8717,7 @@ msgstr "" #. Label of the enable_incoming (Check) field in DocType 'Email Account' #: email/doctype/email_account/email_account.json -#: email/doctype/email_account/email_account.py:202 +#: email/doctype/email_account/email_account.py:219 msgid "Enable Incoming" msgstr "" @@ -8582,7 +8730,7 @@ msgstr "" #. Label of the enable_outgoing (Check) field in DocType 'Email Account' #: core/doctype/user_email/user_email.json #: email/doctype/email_account/email_account.json -#: email/doctype/email_account/email_account.py:210 +#: email/doctype/email_account/email_account.py:227 msgid "Enable Outgoing" msgstr "" @@ -8653,7 +8801,7 @@ msgstr "" #. Label of the enable_two_factor_auth (Check) field in DocType 'System #. Settings' -#: core/doctype/system_settings/system_settings.json twofactor.py:449 +#: core/doctype/system_settings/system_settings.json twofactor.py:433 msgid "Enable Two Factor Auth" msgstr "" @@ -8723,7 +8871,7 @@ msgstr "" msgid "Enabled Scheduler" msgstr "" -#: email/doctype/email_account/email_account.py:936 +#: email/doctype/email_account/email_account.py:995 msgid "Enabled email inbox for user {0}" msgstr "" @@ -8736,7 +8884,7 @@ msgstr "" msgid "Enables Calendar and Gantt views." msgstr "" -#: email/doctype/email_account/email_account.js:227 +#: email/doctype/email_account/email_account.js:260 msgid "Enabling auto reply on an incoming email account will send automated replies to all the synchronized emails. Do you wish to continue?" msgstr "" @@ -8834,7 +8982,7 @@ msgstr "" msgid "Energy Point Settings" msgstr "" -#: desk/doctype/notification_log/notification_log.py:159 +#: desk/doctype/notification_log/notification_log.py:160 msgid "Energy Point Update on {0}" msgstr "" @@ -8844,6 +8992,8 @@ msgstr "" #. 'Notification Settings' #: desk/doctype/notification_settings/notification_settings.json #: desk/page/user_profile/user_profile.html:28 +#: desk/page/user_profile/user_profile_controller.js:80 +#: desk/page/user_profile/user_profile_controller.js:114 #: desk/page/user_profile/user_profile_controller.js:402 #: templates/emails/energy_points_summary.html:39 msgid "Energy Points" @@ -8884,7 +9034,7 @@ msgctxt "Title of prompt dialog" msgid "Enter Value" msgstr "" -#: public/js/frappe/form/form_tour.js:58 +#: public/js/frappe/form/form_tour.js:60 msgid "Enter a name for this {0}" msgstr "" @@ -8915,7 +9065,7 @@ msgstr "" msgid "Enter url parameter for receiver nos" msgstr "" -#: public/js/frappe/ui/messages.js:332 +#: public/js/frappe/ui/messages.js:334 msgid "Enter your password" msgstr "" @@ -8969,7 +9119,6 @@ msgstr "" #. Label of a Link in the Build Workspace #: core/workspace/build/build.json -msgctxt "Error Log" msgid "Error Logs" msgstr "" @@ -9006,9 +9155,9 @@ msgstr "" msgid "Error in Header/Footer Script" msgstr "" -#: email/doctype/notification/notification.py:394 -#: email/doctype/notification/notification.py:510 -#: email/doctype/notification/notification.py:516 +#: email/doctype/notification/notification.py:504 +#: email/doctype/notification/notification.py:620 +#: email/doctype/notification/notification.py:626 msgid "Error in Notification" msgstr "" @@ -9016,11 +9165,11 @@ msgstr "" msgid "Error in print format on line {0}: {1}" msgstr "" -#: email/doctype/email_account/email_account.py:614 +#: email/doctype/email_account/email_account.py:665 msgid "Error while connecting to email account {0}" msgstr "" -#: email/doctype/notification/notification.py:507 +#: email/doctype/notification/notification.py:617 msgid "Error while evaluating Notification {0}. Please fix your template." msgstr "" @@ -9179,7 +9328,7 @@ msgstr "" msgid "Executing..." msgstr "" -#: public/js/frappe/views/reports/query_report.js:1993 +#: public/js/frappe/views/reports/query_report.js:1978 msgid "Execution Time: {0} sec" msgstr "" @@ -9197,7 +9346,7 @@ msgctxt "Enlarge code field." msgid "Expand" msgstr "" -#: public/js/frappe/views/reports/query_report.js:1979 +#: public/js/frappe/views/reports/query_report.js:1964 #: public/js/frappe/views/treeview.js:125 msgid "Expand All" msgstr "" @@ -9251,19 +9400,19 @@ msgstr "" #. Label of the export (Check) field in DocType 'DocPerm' #: core/doctype/custom_docperm/custom_docperm.json #: core/doctype/docperm/docperm.json core/doctype/recorder/recorder_list.js:37 -#: public/js/frappe/data_import/data_exporter.js:91 -#: public/js/frappe/data_import/data_exporter.js:242 -#: public/js/frappe/views/reports/query_report.js:1684 +#: public/js/frappe/data_import/data_exporter.js:92 +#: public/js/frappe/data_import/data_exporter.js:243 +#: public/js/frappe/views/reports/query_report.js:1669 #: public/js/frappe/views/reports/report_view.js:1550 msgid "Export" msgstr "" -#: public/js/frappe/list/list_view.js:2034 +#: public/js/frappe/list/list_view.js:2088 msgctxt "Button in list view actions menu" msgid "Export" msgstr "" -#: public/js/frappe/data_import/data_exporter.js:244 +#: public/js/frappe/data_import/data_exporter.js:245 msgid "Export 1 record" msgstr "" @@ -9275,13 +9424,9 @@ msgstr "" msgid "Export Customizations" msgstr "" -#: public/js/frappe/data_import/data_exporter.js:14 -msgid "Export Data" -msgstr "" - #. Label of a Link in the Tools Workspace #: automation/workspace/tools/tools.json -msgctxt "Data Export" +#: public/js/frappe/data_import/data_exporter.js:14 msgid "Export Data" msgstr "" @@ -9336,7 +9481,7 @@ msgstr "" msgid "Export without main header" msgstr "" -#: public/js/frappe/data_import/data_exporter.js:246 +#: public/js/frappe/data_import/data_exporter.js:247 msgid "Export {0} records" msgstr "" @@ -9457,6 +9602,7 @@ msgstr "" msgid "Failed to enable scheduler: {0}" msgstr "" +#: email/doctype/notification/notification.py:103 #: integrations/doctype/webhook/webhook.py:139 msgid "Failed to evaluate conditions: {}" msgstr "" @@ -9489,7 +9635,15 @@ msgstr "" msgid "Failed to optimize image: {0}" msgstr "" -#: email/doctype/email_queue/email_queue.py:281 +#: email/doctype/notification/notification.py:120 +msgid "Failed to render message: {}" +msgstr "" + +#: email/doctype/notification/notification.py:138 +msgid "Failed to render subject: {}" +msgstr "" + +#: email/doctype/email_queue/email_queue.py:301 msgid "Failed to send email with subject:" msgstr "" @@ -9553,6 +9707,8 @@ msgstr "" #: core/doctype/docfield/docfield.json #: custom/doctype/custom_field/custom_field.json #: custom/doctype/customize_form_field/customize_form_field.json +#: public/js/form_builder/components/controls/FetchFromControl.vue:29 +#: public/js/form_builder/components/controls/FetchFromControl.vue:34 msgid "Fetch From" msgstr "" @@ -9591,10 +9747,10 @@ msgstr "" #: desk/doctype/number_card/number_card.json #: desk/doctype/onboarding_step/onboarding_step.json #: desk/page/leaderboard/leaderboard.js:131 -#: public/js/frappe/list/bulk_operations.js:297 +#: public/js/frappe/list/bulk_operations.js:327 #: public/js/frappe/list/list_view_permission_restrictions.html:3 #: public/js/frappe/views/reports/query_report.js:236 -#: public/js/frappe/views/reports/query_report.js:1738 +#: public/js/frappe/views/reports/query_report.js:1723 #: website/doctype/web_form_field/web_form_field.json #: website/doctype/web_form_list_column/web_form_list_column.json msgid "Field" @@ -9628,6 +9784,15 @@ msgstr "" msgid "Field Name" msgstr "" +#: public/js/print_format_builder/PrintFormatSection.vue:141 +msgid "Field Orientation (Left-Right)" +msgstr "" + +#: public/js/print_format_builder/PrintFormatSection.vue:148 +msgid "Field Orientation (Top-Down)" +msgstr "" + +#: public/js/print_format_builder/PrintFormatControls.vue:233 #: public/js/print_format_builder/utils.js:69 msgid "Field Template" msgstr "" @@ -9669,10 +9834,14 @@ msgstr "" msgid "Field {0} is referring to non-existing doctype {1}." msgstr "" -#: public/js/frappe/form/form.js:1761 +#: public/js/frappe/form/form.js:1765 msgid "Field {0} not found." msgstr "" +#: email/doctype/notification/notification.py:409 +msgid "Field {0} on document {1} is neither a Mobile number field nor a Customer or User link" +msgstr "" + #. Label of the fieldname (Data) field in DocType 'Report Column' #. Label of the fieldname (Data) field in DocType 'Report Filter' #. Label of the fieldname (Data) field in DocType 'Custom Field' @@ -9747,6 +9916,7 @@ msgstr "" #: desk/doctype/list_view_settings/list_view_settings.json #: public/js/frappe/list/list_settings.js:132 #: public/js/frappe/views/kanban/kanban_settings.js:111 +#: public/js/print_format_builder/PrintFormatControls.vue:83 #: website/doctype/personal_data_deletion_step/personal_data_deletion_step.json #: website/doctype/web_template/web_template.json msgid "Fields" @@ -9793,19 +9963,19 @@ msgstr "" msgid "Fieldtype cannot be changed from {0} to {1} in row {2}" msgstr "" +#. Label of a shortcut in the Tools Workspace #. Name of a DocType #. Option for the 'Select List View' (Select) field in DocType 'Form Tour' -#: core/doctype/file/file.json desk/doctype/form_tour/form_tour.json +#: automation/workspace/tools/tools.json core/doctype/file/file.json +#: desk/doctype/form_tour/form_tour.json msgid "File" msgstr "" -#. Label of a shortcut in the Tools Workspace -#: automation/workspace/tools/tools.json -msgctxt "File" -msgid "File" +#: public/js/frappe/file_uploader/FileUploader.vue:459 +msgid "File \"{0}\" was skipped because of invalid file type" msgstr "" -#: core/doctype/file/utils.py:127 +#: core/doctype/file/utils.py:128 msgid "File '{0}' not found" msgstr "" @@ -9885,14 +10055,10 @@ msgstr "" msgid "File {0} does not exist" msgstr "" -#. Label of the files_tab (Tab Break) field in DocType 'System Settings' -#: core/doctype/system_settings/system_settings.json -msgid "Files" -msgstr "" - #. Label of a Link in the Tools Workspace +#. Label of the files_tab (Tab Break) field in DocType 'System Settings' #: automation/workspace/tools/tools.json -msgctxt "File" +#: core/doctype/system_settings/system_settings.json msgid "Files" msgstr "" @@ -9902,7 +10068,7 @@ msgstr "" #: desk/doctype/number_card/number_card.js:205 #: desk/doctype/number_card/number_card.js:336 #: email/doctype/auto_email_report/auto_email_report.js:90 -#: public/js/frappe/list/base_list.js:882 +#: public/js/frappe/list/base_list.js:887 #: public/js/frappe/ui/filters/filter_list.js:134 #: website/doctype/web_form/web_form.js:197 msgid "Filter" @@ -10082,6 +10248,10 @@ msgstr "" msgid "First set the name and save the record." msgstr "" +#: public/js/workflow_builder/WorkflowBuilder.vue:304 +msgid "Fit" +msgstr "" + #. Label of the flag (Data) field in DocType 'Language' #: core/doctype/language/language.json msgid "Flag" @@ -10199,6 +10369,7 @@ msgstr "" #. Label of the font_size (Data) field in DocType 'Website Theme' #: printing/doctype/print_format/print_format.json #: printing/doctype/print_settings/print_settings.json +#: public/js/print_format_builder/PrintFormatControls.vue:45 #: website/doctype/website_theme/website_theme.json msgid "Font Size" msgstr "" @@ -10339,7 +10510,7 @@ msgstr "" msgid "For Value" msgstr "" -#: public/js/frappe/views/reports/query_report.js:1990 +#: public/js/frappe/views/reports/query_report.js:1975 #: public/js/frappe/views/reports/report_view.js:96 msgid "For comparison, use >5, <10 or =324. For ranges, use 5:10 (for values between 5 & 10)." msgstr "" @@ -10348,6 +10519,10 @@ msgstr "" msgid "For example if you cancel and amend INV004 it will become a new document INV004-1. This helps you to keep track of each amendment." msgstr "" +#: public/js/frappe/utils/dashboard_utils.js:162 +msgid "For example:" +msgstr "" + #: printing/page/print_format_builder/print_format_builder.js:744 msgid "For example: If you want to include the document ID, use {0}" msgstr "" @@ -10527,6 +10702,20 @@ msgstr "" msgid "Frappe Light" msgstr "" +#. Option for the 'Service' (Select) field in DocType 'Email Account' +#: email/doctype/email_account/email_account.json +msgid "Frappe Mail" +msgstr "" + +#: email/doctype/email_account/email_account.py:539 +msgid "Frappe Mail OAuth Error" +msgstr "" + +#. Label of the frappe_mail_site (Data) field in DocType 'Email Account' +#: email/doctype/email_account/email_account.json +msgid "Frappe Mail Site" +msgstr "" + #. Label of a standard help item #. Type: Action #: hooks.py @@ -10537,6 +10726,11 @@ msgstr "" msgid "Frappe page builder using components" msgstr "" +#: public/js/frappe/file_uploader/ImageCropper.vue:112 +msgctxt "Image Cropper" +msgid "Free" +msgstr "" + #. Label of the frequency (Select) field in DocType 'Auto Repeat' #. Label of the frequency (Select) field in DocType 'Scheduled Job Type' #. Label of the document_follow_frequency (Select) field in DocType 'User' @@ -10586,7 +10780,7 @@ msgstr "" msgid "From Date Field" msgstr "" -#: public/js/frappe/views/reports/query_report.js:1704 +#: public/js/frappe/views/reports/query_report.js:1689 msgid "From Document Type" msgstr "" @@ -10644,7 +10838,7 @@ msgstr "" msgid "Function Based On" msgstr "" -#: __init__.py:934 +#: __init__.py:940 msgid "Function {0} is not whitelisted." msgstr "" @@ -10682,6 +10876,10 @@ msgstr "" msgid "Gantt" msgstr "" +#: public/js/frappe/list/base_list.js:206 +msgid "Gantt View" +msgstr "" + #. Label of the gender (Link) field in DocType 'Contact' #. Name of a DocType #. Label of the gender (Data) field in DocType 'Gender' @@ -10709,12 +10907,12 @@ msgstr "" msgid "Generate New Report" msgstr "" -#: public/js/frappe/ui/toolbar/awesome_bar.js:368 +#: public/js/frappe/ui/toolbar/awesome_bar.js:391 msgid "Generate Random Password" msgstr "" #: public/js/frappe/ui/toolbar/toolbar.js:172 -#: public/js/frappe/utils/utils.js:1772 +#: public/js/frappe/utils/utils.js:1773 msgid "Generate Tracking URL" msgstr "" @@ -10727,7 +10925,7 @@ msgstr "" msgid "Geolocation" msgstr "" -#: email/doctype/notification/notification.js:170 +#: email/doctype/notification/notification.js:205 msgid "Get Alerts for Today" msgstr "" @@ -10910,14 +11108,10 @@ msgstr "" #. Label of the google_calendar (Link) field in DocType 'Event' #. Name of a DocType #. Label of the sb_00 (Section Break) field in DocType 'Google Calendar' +#. Label of a Link in the Integrations Workspace #: desk/doctype/event/event.json #: integrations/doctype/google_calendar/google_calendar.json -msgid "Google Calendar" -msgstr "" - -#. Label of a Link in the Integrations Workspace #: integrations/workspace/integrations/integrations.json -msgctxt "Google Calendar" msgid "Google Calendar" msgstr "" @@ -10969,14 +11163,10 @@ msgstr "" #. Label of the google_contacts (Link) field in DocType 'Contact' #. Name of a DocType #. Label of the sb_00 (Section Break) field in DocType 'Google Contacts' +#. Label of a Link in the Integrations Workspace #: contacts/doctype/contact/contact.json #: integrations/doctype/google_contacts/google_contacts.json -msgid "Google Contacts" -msgstr "" - -#. Label of a Link in the Integrations Workspace #: integrations/workspace/integrations/integrations.json -msgctxt "Google Contacts" msgid "Google Contacts" msgstr "" @@ -10996,13 +11186,10 @@ msgstr "" #. Name of a DocType #. Label of the google_drive_section (Section Break) field in DocType 'Google #. Drive' -#: integrations/doctype/google_drive/google_drive.json -msgid "Google Drive" -msgstr "" - #. Label of a Link in the Integrations Workspace +#: integrations/doctype/google_drive/google_drive.json #: integrations/workspace/integrations/integrations.json -msgctxt "Google Drive" +#: public/js/frappe/file_uploader/FileUploader.vue:164 msgid "Google Drive" msgstr "" @@ -11037,6 +11224,7 @@ msgstr "" #. Label of the font (Data) field in DocType 'Print Format' #. Label of the google_font (Data) field in DocType 'Website Theme' #: printing/doctype/print_format/print_format.json +#: public/js/print_format_builder/PrintFormatControls.vue:28 #: website/doctype/website_theme/website_theme.json msgid "Google Font" msgstr "" @@ -11052,13 +11240,9 @@ msgid "Google Services" msgstr "" #. Name of a DocType -#: integrations/doctype/google_settings/google_settings.json -msgid "Google Settings" -msgstr "" - #. Label of a Link in the Integrations Workspace +#: integrations/doctype/google_settings/google_settings.json #: integrations/workspace/integrations/integrations.json -msgctxt "Google Settings" msgid "Google Settings" msgstr "" @@ -11099,6 +11283,10 @@ msgstr "" msgid "Green" msgstr "" +#: public/js/form_builder/components/controls/TableControl.vue:53 +msgid "Grid Empty State" +msgstr "" + #: public/js/frappe/ui/keyboard.js:126 msgid "Grid Shortcuts" msgstr "" @@ -11128,7 +11316,7 @@ msgstr "" msgid "Group By Type" msgstr "" -#: desk/doctype/dashboard_chart/dashboard_chart.py:397 +#: desk/doctype/dashboard_chart/dashboard_chart.py:407 msgid "Group By field is required to create a dashboard chart" msgstr "" @@ -11190,6 +11378,7 @@ msgstr "" #: printing/doctype/letter_head/letter_head.json #: printing/doctype/print_format/print_format.json #: printing/doctype/print_format/print_format.py:91 +#: public/js/print_format_builder/Field.vue:86 #: website/doctype/blog_post/blog_post.json #: website/doctype/web_form_field/web_form_field.json #: website/doctype/web_page/web_page.js:92 @@ -11353,13 +11542,9 @@ msgid "Help" msgstr "" #. Name of a DocType -#: website/doctype/help_article/help_article.json -msgid "Help Article" -msgstr "" - #. Label of a Link in the Website Workspace +#: website/doctype/help_article/help_article.json #: website/workspace/website/website.json -msgctxt "Help Article" msgid "Help Article" msgstr "" @@ -11369,13 +11554,9 @@ msgid "Help Articles" msgstr "" #. Name of a DocType -#: website/doctype/help_category/help_category.json -msgid "Help Category" -msgstr "" - #. Label of a Link in the Website Workspace +#: website/doctype/help_category/help_category.json #: website/workspace/website/website.json -msgctxt "Help Category" msgid "Help Category" msgstr "" @@ -11414,7 +11595,7 @@ msgstr "" msgid "Helvetica Neue" msgstr "" -#: public/js/frappe/utils/utils.js:1769 +#: public/js/frappe/utils/utils.js:1770 msgid "Here's your tracking URL" msgstr "" @@ -11452,9 +11633,10 @@ msgstr "" #. Option for the 'Page Number' (Select) field in DocType 'Print Format' #: printing/doctype/print_format/print_format.json -#: public/js/frappe/views/workspace/workspace.js:828 +#: public/js/frappe/views/workspace/workspace.js:855 #: public/js/frappe/widgets/base_widget.js:46 #: public/js/frappe/widgets/base_widget.js:178 +#: public/js/print_format_builder/PrintFormatControls.vue:243 #: templates/includes/login/login.js:82 msgid "Hide" msgstr "" @@ -11552,7 +11734,7 @@ msgstr "" msgid "Hide Standard Menu" msgstr "" -#: public/js/frappe/list/list_view.js:1611 +#: public/js/frappe/list/list_view.js:1665 msgid "Hide Tags" msgstr "" @@ -11560,7 +11742,7 @@ msgstr "" msgid "Hide Weekends" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:829 +#: public/js/frappe/views/workspace/workspace.js:856 msgid "Hide Workspace" msgstr "" @@ -11570,7 +11752,7 @@ msgstr "" msgid "Hide descendant records of For Value." msgstr "" -#: public/js/frappe/form/layout.js:268 +#: public/js/frappe/form/layout.js:270 msgid "Hide details" msgstr "" @@ -11605,6 +11787,7 @@ msgid "Hint: Include symbols, numbers and capital letters in the password" msgstr "" #. Label of the home_tab (Tab Break) field in DocType 'Website Settings' +#: public/js/frappe/file_uploader/FileBrowser.vue:38 #: public/js/frappe/views/file/file_view.js:67 #: public/js/frappe/views/file/file_view.js:88 #: public/js/frappe/views/pageview.js:153 templates/doc.html:19 @@ -11673,11 +11856,11 @@ msgstr "" #: core/doctype/data_import/importer.py:1139 #: core/doctype/data_import/importer.py:1204 #: core/doctype/data_import/importer.py:1207 desk/report/todo/todo.py:36 -#: model/meta.py:45 public/js/frappe/data_import/data_exporter.js:329 -#: public/js/frappe/data_import/data_exporter.js:344 +#: model/meta.py:45 public/js/frappe/data_import/data_exporter.js:330 +#: public/js/frappe/data_import/data_exporter.js:345 #: public/js/frappe/list/list_settings.js:334 -#: public/js/frappe/list/list_view.js:358 -#: public/js/frappe/list/list_view.js:422 public/js/frappe/model/meta.js:197 +#: public/js/frappe/list/list_view.js:355 +#: public/js/frappe/list/list_view.js:419 public/js/frappe/model/meta.js:197 #: public/js/frappe/model/model.js:122 msgid "ID" msgstr "" @@ -11687,6 +11870,10 @@ msgctxt "Label of name column in report" msgid "ID" msgstr "" +#: public/js/print_format_builder/PrintFormatControls.vue:199 +msgid "ID (name)" +msgstr "" + #. Description of the 'Field Name' (Data) field in DocType 'Property Setter' #: custom/doctype/property_setter/property_setter.json msgid "ID (name) of the entity whose property is to be set" @@ -11737,9 +11924,9 @@ msgstr "" #: desk/doctype/workspace_link/workspace_link.json #: desk/doctype/workspace_shortcut/workspace_shortcut.json #: integrations/doctype/social_login_key/social_login_key.json -#: public/js/frappe/views/workspace/workspace.js:646 -#: public/js/frappe/views/workspace/workspace.js:974 -#: public/js/frappe/views/workspace/workspace.js:1219 +#: public/js/frappe/views/workspace/workspace.js:673 +#: public/js/frappe/views/workspace/workspace.js:1001 +#: public/js/frappe/views/workspace/workspace.js:1246 #: workflow/doctype/workflow_state/workflow_state.json msgid "Icon" msgstr "" @@ -12053,6 +12240,10 @@ msgstr "" msgid "Image Link" msgstr "" +#: public/js/frappe/list/base_list.js:209 +msgid "Image View" +msgstr "" + #. Label of the image_width (Float) field in DocType 'Letter Head' #. Label of the footer_image_width (Float) field in DocType 'Letter Head' #: printing/doctype/letter_head/letter_head.json @@ -12067,7 +12258,7 @@ msgstr "" msgid "Image field must be of type Attach Image" msgstr "" -#: core/doctype/file/utils.py:135 +#: core/doctype/file/utils.py:136 msgid "Image link '{0}' is not valid" msgstr "" @@ -12075,6 +12266,10 @@ msgstr "" msgid "Image optimized" msgstr "" +#: core/doctype/file/utils.py:283 +msgid "Image: Corrupted Data Stream" +msgstr "" + #: public/js/frappe/views/image/image_view.js:13 msgid "Images" msgstr "" @@ -12088,7 +12283,7 @@ msgstr "" msgid "Impersonate as {0}" msgstr "" -#: public/js/frappe/form/footer/version_timeline_content_builder.js:233 +#: public/js/frappe/form/footer/version_timeline_content_builder.js:246 msgid "Impersonated by {0}" msgstr "" @@ -12113,7 +12308,7 @@ msgstr "" msgid "Import" msgstr "" -#: public/js/frappe/list/list_view.js:1673 +#: public/js/frappe/list/list_view.js:1727 msgctxt "Button in list view menu" msgid "Import" msgstr "" @@ -12121,7 +12316,6 @@ msgstr "" #. Label of a Link in the Tools Workspace #. Label of a shortcut in the Tools Workspace #: automation/workspace/tools/tools.json -msgctxt "Data Import" msgid "Import Data" msgstr "" @@ -12324,6 +12518,10 @@ msgstr "" msgid "Inbox User" msgstr "" +#: public/js/frappe/list/base_list.js:210 +msgid "Inbox View" +msgstr "" + #. Label of the include_name_field (Check) field in DocType 'Form Tour' #: desk/doctype/form_tour/form_tour.json msgid "Include Name Field" @@ -12343,11 +12541,11 @@ msgstr "" msgid "Include Web View Link in Email" msgstr "" -#: public/js/frappe/views/reports/query_report.js:1521 +#: public/js/frappe/views/reports/query_report.js:1506 msgid "Include filters" msgstr "" -#: public/js/frappe/views/reports/query_report.js:1513 +#: public/js/frappe/views/reports/query_report.js:1498 msgid "Include indentation" msgstr "" @@ -12358,7 +12556,7 @@ msgstr "" #. Label of the incoming_popimap_tab (Tab Break) field in DocType 'Email #. Account' #: email/doctype/email_account/email_account.json -msgid "Incoming (POP/IMAP)" +msgid "Incoming" msgstr "" #. Label of the mailbox_settings (Section Break) field in DocType 'Email @@ -12464,9 +12662,9 @@ msgstr "" msgid "Indicator Color" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:653 -#: public/js/frappe/views/workspace/workspace.js:981 -#: public/js/frappe/views/workspace/workspace.js:1225 +#: public/js/frappe/views/workspace/workspace.js:680 +#: public/js/frappe/views/workspace/workspace.js:1008 +#: public/js/frappe/views/workspace/workspace.js:1252 msgid "Indicator color" msgstr "" @@ -12503,7 +12701,7 @@ msgstr "" #. Label of the insert_after (Select) field in DocType 'Custom Field' #: custom/doctype/custom_field/custom_field.json -#: public/js/frappe/views/reports/query_report.js:1744 +#: public/js/frappe/views/reports/query_report.js:1729 msgid "Insert After" msgstr "" @@ -12698,7 +12896,7 @@ msgid "Invalid" msgstr "" #: public/js/form_builder/utils.js:221 public/js/frappe/form/grid_row.js:770 -#: public/js/frappe/form/layout.js:793 +#: public/js/frappe/form/layout.js:795 msgid "Invalid \"depends_on\" expression" msgstr "" @@ -12710,7 +12908,7 @@ msgstr "" msgid "Invalid \"mandatory_depends_on\" expression" msgstr "" -#: utils/nestedset.py:177 +#: utils/nestedset.py:178 msgid "Invalid Action" msgstr "" @@ -12798,11 +12996,11 @@ msgstr "" msgid "Invalid Override" msgstr "" -#: integrations/doctype/connected_app/connected_app.py:167 +#: integrations/doctype/connected_app/connected_app.py:191 msgid "Invalid Parameters." msgstr "" -#: core/doctype/user/user.py:1176 www/update-password.html:121 +#: core/doctype/user/user.py:1195 www/update-password.html:121 #: www/update-password.html:142 www/update-password.html:144 #: www/update-password.html:245 msgid "Invalid Password" @@ -12828,8 +13026,10 @@ msgstr "" msgid "Invalid Transition" msgstr "" -#: core/doctype/file/file.py:218 public/js/frappe/widgets/widget_dialog.js:604 -#: utils/csvutils.py:223 utils/csvutils.py:244 +#: core/doctype/file/file.py:218 +#: public/js/frappe/file_uploader/FileUploader.vue:511 +#: public/js/frappe/widgets/widget_dialog.js:604 utils/csvutils.py:223 +#: utils/csvutils.py:244 msgid "Invalid URL" msgstr "" @@ -12878,7 +13078,7 @@ msgid "Invalid filter: {0}" msgstr "" #: desk/doctype/dashboard/dashboard.py:67 -#: desk/doctype/dashboard_chart/dashboard_chart.py:413 +#: desk/doctype/dashboard_chart/dashboard_chart.py:423 msgid "Invalid json added in the custom options: {0}" msgstr "" @@ -12902,7 +13102,7 @@ msgstr "" msgid "Invalid request arguments" msgstr "" -#: integrations/doctype/connected_app/connected_app.py:173 +#: integrations/doctype/connected_app/connected_app.py:197 msgid "Invalid state." msgstr "" @@ -13081,6 +13281,7 @@ msgstr "" #. Label of the is_query_report (Check) field in DocType 'Workspace Link' #: desk/doctype/workspace_link/workspace_link.json +#: public/js/frappe/widgets/widget_dialog.js:336 msgid "Is Query Report" msgstr "" @@ -13170,7 +13371,7 @@ msgstr "" msgid "Is Virtual" msgstr "" -#: core/doctype/file/utils.py:156 utils/file_manager.py:311 +#: core/doctype/file/utils.py:157 utils/file_manager.py:311 msgid "It is risky to delete this file: {0}. Please contact your System Manager." msgstr "" @@ -13184,7 +13385,7 @@ msgstr "" msgid "Item Type" msgstr "" -#: utils/nestedset.py:228 +#: utils/nestedset.py:229 msgid "Item cannot be added to its own descendants" msgstr "" @@ -13309,6 +13510,7 @@ msgstr "" #. Label of the kanban_board (Link) field in DocType 'Workspace Shortcut' #: desk/doctype/kanban_board/kanban_board.json #: desk/doctype/workspace_shortcut/workspace_shortcut.json +#: public/js/frappe/widgets/widget_dialog.js:509 msgid "Kanban Board" msgstr "" @@ -13328,6 +13530,10 @@ msgctxt "Button in kanban view menu" msgid "Kanban Settings" msgstr "" +#: public/js/frappe/list/base_list.js:207 +msgid "Kanban View" +msgstr "" + #. Description of a DocType #: core/doctype/activity_log/activity_log.json msgid "Keep track of all update feeds" @@ -13494,13 +13700,9 @@ msgid "LDAP Server Url" msgstr "" #. Name of a DocType -#: integrations/doctype/ldap_settings/ldap_settings.json -msgid "LDAP Settings" -msgstr "" - #. Label of a Link in the Integrations Workspace +#: integrations/doctype/ldap_settings/ldap_settings.json #: integrations/workspace/integrations/integrations.json -msgctxt "LDAP Settings" msgid "LDAP Settings" msgstr "" @@ -13573,9 +13775,14 @@ msgstr "" #: desk/doctype/workspace_quick_list/workspace_quick_list.json #: desk/doctype/workspace_shortcut/workspace_shortcut.json #: printing/page/print_format_builder/print_format_builder.js:474 +#: public/js/form_builder/components/Field.vue:208 +#: public/js/frappe/widgets/widget_dialog.js:187 #: public/js/frappe/widgets/widget_dialog.js:255 +#: public/js/frappe/widgets/widget_dialog.js:304 +#: public/js/frappe/widgets/widget_dialog.js:421 #: public/js/frappe/widgets/widget_dialog.js:645 #: public/js/frappe/widgets/widget_dialog.js:678 +#: public/js/print_format_builder/Field.vue:18 #: templates/form_grid/fields.html:37 #: website/doctype/top_bar_item/top_bar_item.json #: website/doctype/web_template_field/web_template_field.json @@ -13669,7 +13876,7 @@ msgstr "" msgid "Last Login" msgstr "" -#: email/doctype/notification/notification.js:31 +#: email/doctype/notification/notification.js:34 msgid "Last Modified Date" msgstr "" @@ -13717,6 +13924,11 @@ msgstr "" msgid "Last Sync On" msgstr "" +#. Label of the last_synced_at (Datetime) field in DocType 'Email Account' +#: email/doctype/email_account/email_account.json +msgid "Last Synced At" +msgstr "" + #. Label of the last_synced_on (Datetime) field in DocType 'Dashboard Chart' #: desk/doctype/dashboard_chart/dashboard_chart.json msgid "Last Synced On" @@ -13747,7 +13959,7 @@ msgstr "" msgid "Last Year" msgstr "" -#: public/js/frappe/widgets/chart_widget.js:698 +#: public/js/frappe/widgets/chart_widget.js:701 msgid "Last synced {0}" msgstr "" @@ -13799,7 +14011,7 @@ msgid "Leave blank to repeat always" msgstr "" #: core/doctype/communication/mixins.py:207 -#: email/doctype/email_account/email_account.py:663 +#: email/doctype/email_account/email_account.py:715 msgid "Leave this conversation" msgstr "" @@ -13818,6 +14030,7 @@ msgid "Left" msgstr "" #: printing/page/print_format_builder/print_format_builder.js:483 +#: public/js/print_format_builder/PrintFormatControls.vue:155 msgctxt "alignment" msgid "Left" msgstr "" @@ -13858,7 +14071,7 @@ msgstr "" msgid "Length of {0} should be between 1 and 1000" msgstr "" -#: public/js/frappe/widgets/chart_widget.js:674 +#: public/js/frappe/widgets/chart_widget.js:677 msgid "Less" msgstr "" @@ -13902,7 +14115,8 @@ msgstr "" #: printing/doctype/letter_head/letter_head.json #: printing/page/print/print.js:127 public/js/frappe/form/print_utils.js:18 #: public/js/frappe/form/templates/print_layout.html:16 -#: public/js/frappe/list/bulk_operations.js:51 +#: public/js/frappe/list/bulk_operations.js:52 +#: public/js/print_format_builder/LetterHeadEditor.vue:144 msgid "Letter Head" msgstr "" @@ -13919,6 +14133,7 @@ msgstr "" #. Label of the letter_head_name (Data) field in DocType 'Letter Head' #: printing/doctype/letter_head/letter_head.json +#: public/js/print_format_builder/LetterHeadEditor.vue:198 msgid "Letter Head Name" msgstr "" @@ -13941,6 +14156,7 @@ msgstr "" #. Label of the level (Select) field in DocType 'Help Article' #: core/doctype/custom_docperm/custom_docperm.json #: core/doctype/docperm/docperm.json +#: core/page/permission_manager/permission_manager.js:137 #: core/page/permission_manager/permission_manager.js:213 #: public/js/frappe/roles_editor.js:66 #: website/doctype/help_article/help_article.json @@ -13956,6 +14172,10 @@ msgstr "" msgid "Level Name" msgstr "" +#: public/js/frappe/file_uploader/FileUploader.vue:94 +msgid "Library" +msgstr "" + #. Label of the license (Markdown Editor) field in DocType 'Package' #: core/doctype/package/package.json www/attribution.html:36 msgid "License" @@ -14058,6 +14278,7 @@ msgstr "" #: desk/doctype/desktop_icon/desktop_icon.json #: desk/doctype/notification_log/notification_log.json #: desk/doctype/workspace_link/workspace_link.json +#: public/js/frappe/file_uploader/FileUploader.vue:128 #: website/doctype/web_form_field/web_form_field.json #: website/doctype/web_template_field/web_template_field.json msgid "Link" @@ -14140,6 +14361,8 @@ msgstr "" #. Label of the link_to (Dynamic Link) field in DocType 'Workspace Shortcut' #: desk/doctype/workspace_link/workspace_link.json #: desk/doctype/workspace_shortcut/workspace_shortcut.json +#: public/js/frappe/widgets/widget_dialog.js:285 +#: public/js/frappe/widgets/widget_dialog.js:430 msgid "Link To" msgstr "" @@ -14149,6 +14372,7 @@ msgstr "" #. Label of the link_type (Select) field in DocType 'Workspace Link' #: desk/doctype/workspace_link/workspace_link.json +#: public/js/frappe/widgets/widget_dialog.js:277 msgid "Link Type" msgstr "" @@ -14192,7 +14416,7 @@ msgstr "" #. Label of the links (Table) field in DocType 'Customize Form' #. Label of the links (Table) field in DocType 'Workspace' #: contacts/doctype/address/address.js:39 contacts/doctype/address/address.json -#: contacts/doctype/contact/contact.js:87 contacts/doctype/contact/contact.json +#: contacts/doctype/contact/contact.js:92 contacts/doctype/contact/contact.json #: core/doctype/doctype/doctype.json #: custom/doctype/customize_form/customize_form.json #: desk/doctype/workspace/workspace.json public/js/frappe/form/toolbar.js:377 @@ -14240,11 +14464,15 @@ msgstr "" msgid "List Settings" msgstr "" -#: public/js/frappe/list/list_view.js:1753 +#: public/js/frappe/list/list_view.js:1807 msgctxt "Button in list view menu" msgid "List Settings" msgstr "" +#: public/js/frappe/list/base_list.js:203 +msgid "List View" +msgstr "" + #. Name of a DocType #: desk/doctype/list_view_settings/list_view_settings.json msgid "List View Settings" @@ -14281,22 +14509,26 @@ msgstr "" msgid "Load Balancing" msgstr "" -#: public/js/frappe/list/base_list.js:378 +#: public/js/frappe/list/base_list.js:386 #: website/doctype/blog_post/templates/blog_post_list.html:50 #: website/doctype/help_article/templates/help_article_list.html:30 msgid "Load More" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:214 +#: public/js/frappe/form/footer/form_timeline.js:216 msgctxt "Form timeline" msgid "Load More Communications" msgstr "" +#: public/js/frappe/file_uploader/TreeNode.vue:45 +msgid "Load more" +msgstr "" + #: core/page/permission_manager/permission_manager.js:165 #: public/js/frappe/form/controls/multicheck.js:13 #: public/js/frappe/form/linked_with.js:13 -#: public/js/frappe/list/base_list.js:490 -#: public/js/frappe/list/list_view.js:335 public/js/frappe/ui/listing.html:16 +#: public/js/frappe/list/base_list.js:495 +#: public/js/frappe/list/list_view.js:332 public/js/frappe/ui/listing.html:16 #: public/js/frappe/views/reports/query_report.js:1017 msgid "Loading" msgstr "" @@ -14317,13 +14549,14 @@ msgstr "" msgid "Loading versions..." msgstr "" +#: public/js/frappe/file_uploader/TreeNode.vue:45 #: public/js/frappe/form/sidebar/share.js:51 #: public/js/frappe/list/list_sidebar.js:218 #: public/js/frappe/list/list_sidebar_group_by.js:125 #: public/js/frappe/views/kanban/kanban_board.html:11 #: public/js/frappe/widgets/chart_widget.js:50 #: public/js/frappe/widgets/number_card_widget.js:174 -#: public/js/frappe/widgets/quick_list_widget.js:126 +#: public/js/frappe/widgets/quick_list_widget.js:128 msgid "Loading..." msgstr "" @@ -14708,6 +14941,10 @@ msgstr "" msgid "Map Columns" msgstr "" +#: public/js/frappe/list/base_list.js:212 +msgid "Map View" +msgstr "" + #: public/js/frappe/data_import/import_preview.js:290 msgid "Map columns from {0} to fields in {1}" msgstr "" @@ -14891,7 +15128,7 @@ msgstr "" #. Option for the 'Priority' (Select) field in DocType 'ToDo' #. Label of the medium (Data) field in DocType 'Web Page View' #: desk/doctype/todo/todo.json public/js/frappe/form/sidebar/assign_to.js:220 -#: public/js/frappe/utils/utils.js:1731 +#: public/js/frappe/utils/utils.js:1732 #: website/doctype/web_page_view/web_page_view.json #: website/report/website_analytics/website_analytics.js:40 msgid "Medium" @@ -14904,6 +15141,7 @@ msgid "Meeting" msgstr "" #. Label of the meets_condition (Data) field in DocType 'Webhook' +#: email/doctype/notification/notification.py:79 #: integrations/doctype/webhook/webhook.json msgid "Meets Condition?" msgstr "" @@ -14938,7 +15176,7 @@ msgstr "" msgid "Merge with existing" msgstr "" -#: utils/nestedset.py:304 +#: utils/nestedset.py:307 msgid "Merging is only possible between Group-to-Group or Leaf Node-to-Leaf Node" msgstr "" @@ -14967,6 +15205,7 @@ msgstr "" #: email/doctype/email_queue/email_queue.json #: email/doctype/newsletter/newsletter.json #: email/doctype/notification/notification.json +#: email/doctype/notification/notification.py:81 #: public/js/frappe/ui/messages.js:175 #: public/js/frappe/views/communication.js:114 #: workflow/doctype/workflow_document_state/workflow_document_state.json @@ -14974,7 +15213,7 @@ msgstr "" msgid "Message" msgstr "" -#: __init__.py:618 public/js/frappe/ui/messages.js:265 +#: __init__.py:624 public/js/frappe/ui/messages.js:267 msgctxt "Default title of the message dialog" msgid "Message" msgstr "" @@ -15015,7 +15254,7 @@ msgstr "" msgid "Message clipped" msgstr "" -#: email/doctype/email_account/email_account.py:317 +#: email/doctype/email_account/email_account.py:334 msgid "Message from server: {0}" msgstr "" @@ -15094,6 +15333,10 @@ msgstr "" msgid "Method" msgstr "" +#: __init__.py:942 +msgid "Method Not Allowed" +msgstr "" + #: desk/doctype/number_card/number_card.py:70 msgid "Method is required to create a number card" msgstr "" @@ -15110,13 +15353,9 @@ msgid "Middle Name" msgstr "" #. Name of a DocType -#: automation/doctype/milestone/milestone.json -msgid "Milestone" -msgstr "" - #. Label of a Link in the Tools Workspace +#: automation/doctype/milestone/milestone.json #: automation/workspace/tools/tools.json -msgctxt "Milestone" msgid "Milestone" msgstr "" @@ -15261,13 +15500,8 @@ msgid "Module (for export)" msgstr "" #. Name of a DocType -#: core/doctype/module_def/module_def.json -msgid "Module Def" -msgstr "" - #. Label of a Link in the Build Workspace -#: core/workspace/build/build.json -msgctxt "Module Def" +#: core/doctype/module_def/module_def.json core/workspace/build/build.json msgid "Module Def" msgstr "" @@ -15283,26 +15517,18 @@ msgstr "" msgid "Module Name" msgstr "" -#. Name of a DocType -#: desk/doctype/module_onboarding/module_onboarding.json -msgid "Module Onboarding" -msgstr "" - #. Label of a Link in the Build Workspace +#. Name of a DocType #: core/workspace/build/build.json -msgctxt "Module Onboarding" +#: desk/doctype/module_onboarding/module_onboarding.json msgid "Module Onboarding" msgstr "" #. Name of a DocType #. Label of the module_profile (Link) field in DocType 'User' -#: core/doctype/module_profile/module_profile.json core/doctype/user/user.json -msgid "Module Profile" -msgstr "" - #. Label of a Link in the Users Workspace +#: core/doctype/module_profile/module_profile.json core/doctype/user/user.json #: core/workspace/users/users.json -msgctxt "Module Profile" msgid "Module Profile" msgstr "" @@ -15319,7 +15545,7 @@ msgstr "" msgid "Module to Export" msgstr "" -#: modules/utils.py:268 +#: modules/utils.py:272 msgid "Module {} not found" msgstr "" @@ -15403,7 +15629,7 @@ msgstr "" #: public/js/frappe/form/multi_select_dialog.js:72 #: public/js/frappe/ui/toolbar/search.js:285 #: public/js/frappe/ui/toolbar/search.js:300 -#: public/js/frappe/widgets/chart_widget.js:674 +#: public/js/frappe/widgets/chart_widget.js:677 #: templates/includes/list/list.html:23 #: templates/includes/search_template.html:13 msgid "More" @@ -15454,6 +15680,10 @@ msgstr "" msgid "Move To Trash" msgstr "" +#: public/js/form_builder/components/Section.vue:295 +msgid "Move current and all subsequent sections to a new tab" +msgstr "" + #: public/js/frappe/form/form.js:176 msgid "Move cursor to above row" msgstr "" @@ -15470,6 +15700,14 @@ msgstr "" msgid "Move cursor to previous column" msgstr "" +#: public/js/form_builder/components/Section.vue:294 +msgid "Move sections to new tab" +msgstr "" + +#: public/js/form_builder/components/Field.vue:237 +msgid "Move the current field and the following fields to a new column" +msgstr "" + #: public/js/frappe/form/grid_row.js:165 msgid "Move to Row Number" msgstr "" @@ -15485,7 +15723,7 @@ msgstr "" msgid "Mozilla doesn't support :has() so you can pass parent selector here as workaround" msgstr "" -#: utils/nestedset.py:328 +#: utils/nestedset.py:331 msgid "Multiple root nodes not allowed." msgstr "" @@ -15533,6 +15771,10 @@ msgstr "" msgid "My Account" msgstr "" +#: public/js/frappe/file_uploader/FileUploader.vue:57 +msgid "My Device" +msgstr "" + #. Label of a standard navbar item #. Type: Route #: hooks.py @@ -15662,13 +15904,9 @@ msgid "Navbar Item" msgstr "" #. Name of a DocType -#: core/doctype/navbar_settings/navbar_settings.json -msgid "Navbar Settings" -msgstr "" - #. Label of a Link in the Build Workspace +#: core/doctype/navbar_settings/navbar_settings.json #: core/workspace/build/build.json -msgctxt "Navbar Settings" msgid "Navbar Settings" msgstr "" @@ -15689,12 +15927,12 @@ msgstr "" msgid "Navigate Home" msgstr "" -#: public/js/frappe/list/list_view.js:1161 +#: public/js/frappe/list/list_view.js:1198 msgctxt "Description of a list view shortcut" msgid "Navigate list down" msgstr "" -#: public/js/frappe/list/list_view.js:1168 +#: public/js/frappe/list/list_view.js:1205 msgctxt "Description of a list view shortcut" msgid "Navigate list up" msgstr "" @@ -15709,11 +15947,11 @@ msgstr "" msgid "Navigation Settings" msgstr "" -#: desk/doctype/workspace/workspace.py:301 +#: desk/doctype/workspace/workspace.py:305 msgid "Need Workspace Manager role to edit private workspace of other users" msgstr "" -#: desk/doctype/workspace/workspace.py:345 +#: desk/doctype/workspace/workspace.py:349 msgid "Need Workspace Manager role to hide/unhide public workspaces" msgstr "" @@ -15721,7 +15959,7 @@ msgstr "" msgid "Negative Value" msgstr "" -#: utils/nestedset.py:93 +#: utils/nestedset.py:94 msgid "Nested set error. Please contact the Administrator." msgstr "" @@ -15740,6 +15978,7 @@ msgstr "" #: email/doctype/notification/notification.json #: public/js/frappe/form/success_action.js:77 #: public/js/frappe/views/treeview.js:450 +#: public/js/frappe/views/workspace/workspace.js:95 #: social/doctype/energy_point_rule/energy_point_rule.json #: website/doctype/web_form/templates/web_list.html:15 www/list.html:19 msgid "New" @@ -15778,11 +16017,11 @@ msgstr "" msgid "New Document Form" msgstr "" -#: desk/doctype/notification_log/notification_log.py:158 +#: desk/doctype/notification_log/notification_log.py:159 msgid "New Document Shared {0}" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:26 +#: public/js/frappe/form/footer/form_timeline.js:27 #: public/js/frappe/views/communication.js:23 msgid "New Email" msgstr "" @@ -15792,7 +16031,7 @@ msgstr "" msgid "New Email Account" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:45 +#: public/js/frappe/form/footer/form_timeline.js:47 msgid "New Event" msgstr "" @@ -15808,7 +16047,7 @@ msgstr "" msgid "New Links" msgstr "" -#: desk/doctype/notification_log/notification_log.py:156 +#: desk/doctype/notification_log/notification_log.py:157 msgid "New Mention on {0}" msgstr "" @@ -15826,7 +16065,7 @@ msgstr "" msgid "New Newsletter" msgstr "" -#: desk/doctype/notification_log/notification_log.py:155 +#: desk/doctype/notification_log/notification_log.py:156 msgid "New Notification" msgstr "" @@ -15873,7 +16112,7 @@ msgstr "" msgid "New Workflow Name" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:1186 +#: public/js/frappe/views/workspace/workspace.js:1213 msgid "New Workspace" msgstr "" @@ -15931,23 +16170,18 @@ msgstr "" msgid "New {} releases for the following apps are available" msgstr "" -#: core/doctype/user/user.py:753 +#: core/doctype/user/user.py:772 msgid "Newly created user {0} has no roles enabled." msgstr "" #. Label of a Card Break in the Tools Workspace +#. Label of a Link in the Tools Workspace #. Name of a DocType #: automation/workspace/tools/tools.json #: email/doctype/newsletter/newsletter.json msgid "Newsletter" msgstr "" -#. Label of a Link in the Tools Workspace -#: automation/workspace/tools/tools.json -msgctxt "Newsletter" -msgid "Newsletter" -msgstr "" - #. Name of a DocType #: email/doctype/newsletter_attachment/newsletter_attachment.json msgid "Newsletter Attachment" @@ -15982,7 +16216,7 @@ msgstr "" msgid "Newsletters" msgstr "" -#: public/js/frappe/form/form_tour.js:318 +#: public/js/frappe/form/form_tour.js:14 public/js/frappe/form/form_tour.js:324 #: public/js/frappe/web_form/web_form.js:91 #: public/js/onboarding_tours/onboarding_tours.js:15 #: public/js/onboarding_tours/onboarding_tours.js:240 @@ -16062,13 +16296,14 @@ msgstr "" #. Settings' #. Option for the 'Standard' (Select) field in DocType 'Print Format' #: core/doctype/page/page.json core/doctype/report/report.json +#: email/doctype/notification/notification.py:100 #: integrations/doctype/ldap_settings/ldap_settings.json #: integrations/doctype/webhook/webhook.py:140 #: printing/doctype/print_format/print_format.json #: public/js/form_builder/utils.js:341 #: public/js/frappe/form/controls/link.js:475 #: public/js/frappe/list/list_sidebar_group_by.js:223 -#: public/js/frappe/views/reports/query_report.js:1541 +#: public/js/frappe/views/reports/query_report.js:1526 #: website/doctype/help_article/templates/help_article.html:26 msgid "No" msgstr "" @@ -16098,6 +16333,7 @@ msgstr "" #: core/doctype/data_export/exporter.py:162 #: email/doctype/auto_email_report/auto_email_report.py:288 +#: public/js/form_builder/components/controls/TableControl.vue:64 #: public/js/frappe/data_import/import_preview.js:142 #: public/js/frappe/form/grid.js:63 #: public/js/frappe/form/multi_select_dialog.js:225 @@ -16112,7 +16348,7 @@ msgstr "" msgid "No Data to Show" msgstr "" -#: public/js/frappe/widgets/quick_list_widget.js:131 +#: public/js/frappe/widgets/quick_list_widget.js:133 msgid "No Data..." msgstr "" @@ -16132,7 +16368,7 @@ msgstr "" msgid "No Entry for the User {0} found within LDAP!" msgstr "" -#: public/js/frappe/widgets/chart_widget.js:366 +#: public/js/frappe/widgets/chart_widget.js:367 msgid "No Filters Set" msgstr "" @@ -16152,13 +16388,20 @@ msgstr "" msgid "No LDAP User found for email: {0}" msgstr "" +#: public/js/form_builder/components/EditableInput.vue:11 +#: public/js/form_builder/components/EditableInput.vue:14 +#: public/js/form_builder/components/Field.vue:209 +#: public/js/form_builder/components/controls/FetchFromControl.vue:55 +#: public/js/print_format_builder/Field.vue:24 +#: public/js/workflow_builder/components/ActionNode.vue:53 +#: public/js/workflow_builder/components/StateNode.vue:47 #: public/js/workflow_builder/store.js:51 msgid "No Label" msgstr "" #: printing/page/print/print.js:700 printing/page/print/print.js:782 -#: public/js/frappe/list/bulk_operations.js:90 -#: public/js/frappe/list/bulk_operations.js:140 utils/weasyprint.py:52 +#: public/js/frappe/list/bulk_operations.js:98 +#: public/js/frappe/list/bulk_operations.js:170 utils/weasyprint.py:52 msgid "No Letterhead" msgstr "" @@ -16210,7 +16453,7 @@ msgstr "" msgid "No Results found" msgstr "" -#: core/doctype/user/user.py:754 +#: core/doctype/user/user.py:773 msgid "No Roles Specified" msgstr "" @@ -16238,7 +16481,7 @@ msgstr "" msgid "No address added yet." msgstr "" -#: email/doctype/notification/notification.js:180 +#: email/doctype/notification/notification.js:215 msgid "No alerts for today" msgstr "" @@ -16258,7 +16501,7 @@ msgstr "" msgid "No changes made because old and new name are the same." msgstr "" -#: public/js/frappe/views/workspace/workspace.js:1491 +#: public/js/frappe/views/workspace/workspace.js:1518 msgid "No changes made on the page" msgstr "" @@ -16365,11 +16608,11 @@ msgstr "" msgid "No of Sent SMS" msgstr "" -#: __init__.py:1126 client.py:109 client.py:151 +#: __init__.py:1132 client.py:109 client.py:151 msgid "No permission for {0}" msgstr "" -#: public/js/frappe/form/form.js:1137 +#: public/js/frappe/form/form.js:1141 msgctxt "{0} = verb, {1} = object" msgid "No permission to '{0}' {1}" msgstr "" @@ -16394,10 +16637,14 @@ msgstr "" msgid "No records tagged." msgstr "" -#: public/js/frappe/data_import/data_exporter.js:224 +#: public/js/frappe/data_import/data_exporter.js:225 msgid "No records will be exported" msgstr "" +#: email/doctype/notification/notification.py:133 +msgid "No subject" +msgstr "" + #: www/printview.py:442 msgid "No template found at path: {0}" msgstr "" @@ -16418,7 +16665,7 @@ msgstr "" msgid "No {0} found" msgstr "" -#: public/js/frappe/list/list_view.js:469 +#: public/js/frappe/list/list_view.js:466 msgid "No {0} found with matching filters. Clear filters to see all {0}." msgstr "" @@ -16460,7 +16707,7 @@ msgstr "" msgid "Normalized Query" msgstr "" -#: core/doctype/user/user.py:959 templates/includes/login/login.js:257 +#: core/doctype/user/user.py:978 templates/includes/login/login.js:257 #: utils/oauth.py:265 msgid "Not Allowed" msgstr "" @@ -16507,7 +16754,7 @@ msgstr "" msgid "Not Nullable" msgstr "" -#: __init__.py:1018 app.py:357 desk/calendar.py:26 geo/utils.py:97 +#: __init__.py:1024 app.py:357 desk/calendar.py:26 geo/utils.py:97 #: public/js/frappe/web_form/webform_script.js:15 #: website/doctype/web_form/web_form.py:602 #: website/page_renderers/not_permitted_page.py:20 www/login.py:181 @@ -16559,7 +16806,7 @@ msgstr "" msgid "Not a valid Comma Separated Value (CSV File)" msgstr "" -#: core/doctype/user/user.py:235 +#: core/doctype/user/user.py:240 msgid "Not a valid User Image." msgstr "" @@ -16579,7 +16826,7 @@ msgstr "" msgid "Not allowed for {0}: {1}" msgstr "" -#: email/doctype/notification/notification.py:391 +#: email/doctype/notification/notification.py:501 msgid "Not allowed to attach {0} document, please enable Allow Print For {0} in Print Settings" msgstr "" @@ -16624,15 +16871,10 @@ msgstr "" msgid "Not permitted to view {0}" msgstr "" +#. Label of a Link in the Tools Workspace #. Name of a DocType #: automation/doctype/auto_repeat/auto_repeat.py:396 -#: desk/doctype/note/note.json -msgid "Note" -msgstr "" - -#. Label of a Link in the Tools Workspace -#: automation/workspace/tools/tools.json -msgctxt "Note" +#: automation/workspace/tools/tools.json desk/doctype/note/note.json msgid "Note" msgstr "" @@ -16698,7 +16940,7 @@ msgstr "" msgid "Nothing left to undo" msgstr "" -#: public/js/frappe/list/base_list.js:362 +#: public/js/frappe/list/base_list.js:370 #: public/js/frappe/views/reports/query_report.js:105 #: templates/includes/list/list.html:7 #: website/doctype/blog_post/templates/blog_post_list.html:41 @@ -16711,12 +16953,14 @@ msgid "Nothing to update" msgstr "" #. Label of the notification (Section Break) field in DocType 'Auto Repeat' +#. Label of a Link in the Tools Workspace #. Option for the 'Communication Type' (Select) field in DocType #. 'Communication' #. Name of a DocType #. Label of the notification_section (Section Break) field in DocType 'S3 #. Backup Settings' #: automation/doctype/auto_repeat/auto_repeat.json +#: automation/workspace/tools/tools.json #: core/doctype/communication/communication.json #: core/doctype/communication/mixins.py:142 #: email/doctype/notification/notification.json @@ -16724,12 +16968,6 @@ msgstr "" msgid "Notification" msgstr "" -#. Label of a Link in the Tools Workspace -#: automation/workspace/tools/tools.json -msgctxt "Notification" -msgid "Notification" -msgstr "" - #. Name of a DocType #: desk/doctype/notification_log/notification_log.json msgid "Notification Log" @@ -16740,18 +16978,14 @@ msgstr "" msgid "Notification Recipient" msgstr "" +#. Label of a Link in the Tools Workspace #. Name of a DocType +#: automation/workspace/tools/tools.json #: desk/doctype/notification_settings/notification_settings.json #: public/js/frappe/ui/notifications/notifications.js:37 msgid "Notification Settings" msgstr "" -#. Label of a Link in the Tools Workspace -#: automation/workspace/tools/tools.json -msgctxt "Notification Settings" -msgid "Notification Settings" -msgstr "" - #. Name of a DocType #: desk/doctype/notification_subscribed_document/notification_subscribed_document.json msgid "Notification Subscribed Document" @@ -16761,6 +16995,18 @@ msgstr "" msgid "Notification sent to" msgstr "" +#: email/doctype/notification/notification.py:406 +msgid "Notification: customer {0} has no Mobile number set" +msgstr "" + +#: email/doctype/notification/notification.py:392 +msgid "Notification: document {0} has no {1} number set (field: {2})" +msgstr "" + +#: email/doctype/notification/notification.py:401 +msgid "Notification: user {0} has no Mobile number set" +msgstr "" + #. Label of the notifications (Check) field in DocType 'Role' #: core/doctype/role/role.json #: public/js/frappe/ui/notifications/notifications.js:50 @@ -16925,13 +17171,9 @@ msgid "OAuth Bearer Token" msgstr "" #. Name of a DocType -#: integrations/doctype/oauth_client/oauth_client.json -msgid "OAuth Client" -msgstr "" - #. Label of a Link in the Integrations Workspace +#: integrations/doctype/oauth_client/oauth_client.json #: integrations/workspace/integrations/integrations.json -msgctxt "OAuth Client" msgid "OAuth Client" msgstr "" @@ -16950,13 +17192,9 @@ msgid "OAuth Error" msgstr "" #. Name of a DocType -#: integrations/doctype/oauth_provider_settings/oauth_provider_settings.json -msgid "OAuth Provider Settings" -msgstr "" - #. Label of a Link in the Integrations Workspace +#: integrations/doctype/oauth_provider_settings/oauth_provider_settings.json #: integrations/workspace/integrations/integrations.json -msgctxt "OAuth Provider Settings" msgid "OAuth Provider Settings" msgstr "" @@ -16965,7 +17203,7 @@ msgstr "" msgid "OAuth Scope" msgstr "" -#: email/doctype/email_account/email_account.js:182 +#: email/doctype/email_account/email_account.js:215 msgid "OAuth has been enabled but not authorised. Please use \"Authorise API Access\" button to do the same." msgstr "" @@ -16978,6 +17216,10 @@ msgstr "" msgid "OPTIONS" msgstr "" +#: public/js/form_builder/components/Tabs.vue:190 +msgid "OR" +msgstr "" + #. Option for the 'Two Factor Authentication method' (Select) field in DocType #. 'System Settings' #: core/doctype/system_settings/system_settings.json @@ -16989,11 +17231,11 @@ msgstr "" msgid "OTP Issuer Name" msgstr "" -#: twofactor.py:461 +#: twofactor.py:445 msgid "OTP Secret Reset - {0}" msgstr "" -#: twofactor.py:480 +#: twofactor.py:464 msgid "OTP Secret has been reset. Re-registration will be required on next login." msgstr "" @@ -17104,9 +17346,14 @@ msgstr "" #. Label of the onboard (Check) field in DocType 'Workspace Link' #: desk/doctype/workspace_link/workspace_link.json +#: public/js/frappe/widgets/widget_dialog.js:330 msgid "Onboard" msgstr "" +#: public/js/frappe/widgets/widget_dialog.js:236 +msgid "Onboarding Name" +msgstr "" + #. Name of a DocType #: desk/doctype/onboarding_permission/onboarding_permission.json msgid "Onboarding Permission" @@ -17152,7 +17399,7 @@ msgstr "" msgid "One of" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:1326 +#: public/js/frappe/views/workspace/workspace.js:1353 msgid "One of the child page with name {0} already exist in {1} Section. Please update the name of the child page first before moving" msgstr "" @@ -17160,7 +17407,7 @@ msgstr "" msgid "Only 200 inserts allowed in one request" msgstr "" -#: email/doctype/email_queue/email_queue.py:81 +#: email/doctype/email_queue/email_queue.py:82 msgid "Only Administrator can delete Email Queue" msgstr "" @@ -17194,7 +17441,7 @@ msgstr "" msgid "Only Workspace Manager can edit public workspaces" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:550 +#: public/js/frappe/views/workspace/workspace.js:577 msgid "Only Workspace Manager can sort or edit this page" msgstr "" @@ -17214,6 +17461,7 @@ msgstr "" #. Label of the only_for (Link) field in DocType 'Workspace Link' #: desk/doctype/workspace_link/workspace_link.json +#: public/js/frappe/widgets/widget_dialog.js:323 msgid "Only for" msgstr "" @@ -17323,7 +17571,11 @@ msgstr "" msgid "Open a module or tool" msgstr "" -#: public/js/frappe/list/list_view.js:1214 +#: public/js/print_format_builder/Preview.vue:17 +msgid "Open in a new tab" +msgstr "" + +#: public/js/frappe/list/list_view.js:1251 msgctxt "Description of a list view shortcut" msgid "Open list item" msgstr "" @@ -17375,6 +17627,7 @@ msgstr "" #: core/doctype/file/file.js:24 #: core/report/database_storage_usage_by_tables/database_storage_usage_by_tables.js:8 +#: public/js/frappe/file_uploader/FilePreview.vue:27 msgid "Optimize" msgstr "" @@ -17498,9 +17751,9 @@ msgstr "" msgid "Other" msgstr "" -#. Label of the outgoing_smtp_tab (Tab Break) field in DocType 'Email Account' +#. Label of the outgoing_tab (Tab Break) field in DocType 'Email Account' #: email/doctype/email_account/email_account.json -msgid "Outgoing (SMTP)" +msgid "Outgoing" msgstr "" #. Label of the outgoing_mail_settings (Section Break) field in DocType 'Email @@ -17563,7 +17816,7 @@ msgstr "" #: printing/page/print/print.js:71 #: public/js/frappe/form/templates/print_layout.html:44 -#: public/js/frappe/views/reports/query_report.js:1669 +#: public/js/frappe/views/reports/query_report.js:1654 msgid "PDF" msgstr "" @@ -17629,25 +17882,17 @@ msgstr "" #. Label of the package (Link) field in DocType 'Module Def' #. Name of a DocType #. Label of the package (Link) field in DocType 'Package Release' -#: core/doctype/module_def/module_def.json core/doctype/package/package.json -#: core/doctype/package_release/package_release.json www/attribution.html:34 -msgid "Package" -msgstr "" - #. Label of a Link in the Build Workspace -#: core/workspace/build/build.json -msgctxt "Package" +#: core/doctype/module_def/module_def.json core/doctype/package/package.json +#: core/doctype/package_release/package_release.json +#: core/workspace/build/build.json www/attribution.html:34 msgid "Package" msgstr "" #. Name of a DocType -#: core/doctype/package_import/package_import.json -msgid "Package Import" -msgstr "" - #. Label of a Link in the Build Workspace +#: core/doctype/package_import/package_import.json #: core/workspace/build/build.json -msgctxt "Package Import" msgid "Package Import" msgstr "" @@ -17689,6 +17934,7 @@ msgid "Page" msgstr "" #. Option for the 'Fieldtype' (Select) field in DocType 'Web Form Field' +#: public/js/print_format_builder/PrintFormatSection.vue:63 #: website/doctype/web_form_field/web_form_field.json msgid "Page Break" msgstr "" @@ -17709,10 +17955,14 @@ msgstr "" msgid "Page HTML" msgstr "" -#: public/js/frappe/list/bulk_operations.js:72 +#: public/js/frappe/list/bulk_operations.js:73 msgid "Page Height (in mm)" msgstr "" +#: public/js/print_format_builder/PrintFormatControls.vue:5 +msgid "Page Margins" +msgstr "" + #. Label of the page_name (Data) field in DocType 'Page' #: core/doctype/page/page.json msgid "Page Name" @@ -17720,6 +17970,7 @@ msgstr "" #. Label of the page_number (Select) field in DocType 'Print Format' #: printing/doctype/print_format/print_format.json +#: public/js/print_format_builder/PrintFormatControls.vue:63 msgid "Page Number" msgstr "" @@ -17728,7 +17979,7 @@ msgstr "" msgid "Page Route" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:1513 +#: public/js/frappe/views/workspace/workspace.js:1540 msgid "Page Saved Successfully" msgstr "" @@ -17742,7 +17993,7 @@ msgstr "" msgid "Page Shortcuts" msgstr "" -#: public/js/frappe/list/bulk_operations.js:65 +#: public/js/frappe/list/bulk_operations.js:66 msgid "Page Size" msgstr "" @@ -17751,7 +18002,7 @@ msgstr "" msgid "Page Title" msgstr "" -#: public/js/frappe/list/bulk_operations.js:79 +#: public/js/frappe/list/bulk_operations.js:80 msgid "Page Width (in mm)" msgstr "" @@ -17760,7 +18011,7 @@ msgid "Page has expired!" msgstr "" #: printing/doctype/print_settings/print_settings.py:70 -#: public/js/frappe/list/bulk_operations.js:98 +#: public/js/frappe/list/bulk_operations.js:106 msgid "Page height and width cannot be zero" msgstr "" @@ -17773,7 +18024,7 @@ msgstr "" msgid "Page to show on the website\n" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:1313 +#: public/js/frappe/views/workspace/workspace.js:1340 msgid "Page with title {0} already exist." msgstr "" @@ -17790,9 +18041,9 @@ msgid "Parameter" msgstr "" #: public/js/frappe/model/model.js:142 -#: public/js/frappe/views/workspace/workspace.js:620 -#: public/js/frappe/views/workspace/workspace.js:948 -#: public/js/frappe/views/workspace/workspace.js:1195 +#: public/js/frappe/views/workspace/workspace.js:647 +#: public/js/frappe/views/workspace/workspace.js:975 +#: public/js/frappe/views/workspace/workspace.js:1222 msgid "Parent" msgstr "" @@ -17850,7 +18101,7 @@ msgstr "" msgid "Parent Table" msgstr "" -#: desk/doctype/dashboard_chart/dashboard_chart.py:393 +#: desk/doctype/dashboard_chart/dashboard_chart.py:403 msgid "Parent document type is required to create a dashboard chart" msgstr "" @@ -17916,11 +18167,11 @@ msgstr "" msgid "Password" msgstr "" -#: core/doctype/user/user.py:1022 +#: core/doctype/user/user.py:1041 msgid "Password Email Sent" msgstr "" -#: core/doctype/user/user.py:406 +#: core/doctype/user/user.py:416 msgid "Password Reset" msgstr "" @@ -17942,7 +18193,7 @@ msgstr "" msgid "Password for Base DN" msgstr "" -#: email/doctype/email_account/email_account.py:172 +#: email/doctype/email_account/email_account.py:183 msgid "Password is required or select Awaiting Password" msgstr "" @@ -17954,8 +18205,8 @@ msgstr "" msgid "Password not found for {0} {1} {2}" msgstr "" -#: core/doctype/user/user.py:1021 -msgid "Password reset instructions have been sent to your email" +#: core/doctype/user/user.py:1040 +msgid "Password reset instructions have been sent to {}'s email" msgstr "" #: www/update-password.html:164 @@ -17966,7 +18217,7 @@ msgstr "" msgid "Password size exceeded the maximum allowed size" msgstr "" -#: core/doctype/user/user.py:817 +#: core/doctype/user/user.py:836 msgid "Password size exceeded the maximum allowed size." msgstr "" @@ -18104,15 +18355,15 @@ msgstr "" msgid "Permanent" msgstr "" -#: public/js/frappe/form/form.js:1023 +#: public/js/frappe/form/form.js:1027 msgid "Permanently Cancel {0}?" msgstr "" -#: public/js/frappe/form/form.js:1069 +#: public/js/frappe/form/form.js:1073 msgid "Permanently Discard {0}?" msgstr "" -#: public/js/frappe/form/form.js:853 +#: public/js/frappe/form/form.js:857 msgid "Permanently Submit {0}?" msgstr "" @@ -18299,6 +18550,10 @@ msgstr "" msgid "Plant" msgstr "" +#: email/doctype/email_account/email_account.py:536 +msgid "Please Authorize OAuth for Email Account {0}" +msgstr "" + #: email/oauth.py:29 msgid "Please Authorize OAuth for Email Account {}" msgstr "" @@ -18327,7 +18582,7 @@ msgstr "" msgid "Please add a valid comment." msgstr "" -#: core/doctype/user/user.py:1004 +#: core/doctype/user/user.py:1023 msgid "Please ask your administrator to verify your sign-up" msgstr "" @@ -18355,11 +18610,11 @@ msgstr "" msgid "Please check the filter values set for Dashboard Chart: {}" msgstr "" -#: model/base_document.py:872 +#: model/base_document.py:873 msgid "Please check the value of \"Fetch From\" set for field {0}" msgstr "" -#: core/doctype/user/user.py:1002 +#: core/doctype/user/user.py:1021 msgid "Please check your email for verification" msgstr "" @@ -18422,7 +18677,8 @@ msgstr "" #: desk/doctype/notification_log/notification_log.js:45 #: email/doctype/auto_email_report/auto_email_report.js:17 #: printing/page/print/print.js:635 printing/page/print/print.js:665 -#: public/js/frappe/utils/utils.js:1426 +#: public/js/frappe/list/bulk_operations.js:161 +#: public/js/frappe/utils/utils.js:1427 msgid "Please enable pop-ups" msgstr "" @@ -18563,6 +18819,10 @@ msgstr "" msgid "Please select a country code for field {1}." msgstr "" +#: public/js/frappe/file_uploader/FileUploader.vue:487 +msgid "Please select a file first." +msgstr "" + #: utils/file_manager.py:50 msgid "Please select a file or url" msgstr "" @@ -18641,11 +18901,11 @@ msgstr "" msgid "Please setup a message first" msgstr "" -#: email/doctype/email_account/email_account.py:407 +#: email/doctype/email_account/email_account.py:424 msgid "Please setup default Email Account from Settings > Email Account" msgstr "" -#: core/doctype/user/user.py:371 +#: core/doctype/user/user.py:381 msgid "Please setup default outgoing Email Account from Settings > Email Account" msgstr "" @@ -18657,11 +18917,11 @@ msgstr "" msgid "Please specify a valid parent DocType for {0}" msgstr "" -#: email/doctype/notification/notification.py:87 +#: email/doctype/notification/notification.py:149 msgid "Please specify which date field must be checked" msgstr "" -#: email/doctype/notification/notification.py:90 +#: email/doctype/notification/notification.py:152 msgid "Please specify which value field must be checked" msgstr "" @@ -18748,13 +19008,9 @@ msgid "Portal Menu Item" msgstr "" #. Name of a DocType -#: website/doctype/portal_settings/portal_settings.json -msgid "Portal Settings" -msgstr "" - #. Label of a Link in the Website Workspace +#: website/doctype/portal_settings/portal_settings.json #: website/workspace/website/website.json -msgctxt "Portal Settings" msgid "Portal Settings" msgstr "" @@ -18887,6 +19143,7 @@ msgstr "" #: desk/doctype/custom_html_block/custom_html_block.json #: email/doctype/newsletter/newsletter.js:14 #: email/doctype/newsletter/newsletter.js:42 +#: email/doctype/notification/notification.js:184 #: integrations/doctype/webhook/webhook.json #: printing/doctype/print_style/print_style.json #: public/js/frappe/form/controls/markdown_editor.js:17 @@ -18922,10 +19179,19 @@ msgstr "" msgid "Preview of generated names" msgstr "" +#: public/js/frappe/views/render_preview.js:19 +msgid "Preview on" +msgstr "" + +#: public/js/print_format_builder/Preview.vue:103 +msgid "Preview type" +msgstr "" + #: email/doctype/email_group/email_group.js:90 msgid "Preview:" msgstr "" +#: public/js/frappe/form/form_tour.js:15 #: public/js/frappe/web_form/web_form.js:95 #: public/js/onboarding_tours/onboarding_tours.js:16 #: templates/includes/slideshow.html:34 @@ -18947,7 +19213,7 @@ msgstr "" msgid "Previous Hash" msgstr "" -#: public/js/frappe/form/form.js:2217 +#: public/js/frappe/form/form.js:2222 msgid "Previous Submission" msgstr "" @@ -18987,47 +19253,44 @@ msgstr "" #. Label of the print (Check) field in DocType 'Custom DocPerm' #. Label of the print (Check) field in DocType 'DocPerm' +#. Label of the print (Check) field in DocType 'User Document Type' #: core/doctype/custom_docperm/custom_docperm.json #: core/doctype/docperm/docperm.json #: core/doctype/success_action/success_action.js:56 +#: core/doctype/user_document_type/user_document_type.json #: printing/page/print/print.js:65 public/js/frappe/form/success_action.js:81 #: public/js/frappe/form/templates/print_layout.html:46 #: public/js/frappe/form/toolbar.js:332 public/js/frappe/form/toolbar.js:344 -#: public/js/frappe/list/bulk_operations.js:87 -#: public/js/frappe/views/reports/query_report.js:1655 +#: public/js/frappe/list/bulk_operations.js:95 +#: public/js/frappe/views/reports/query_report.js:1640 #: public/js/frappe/views/reports/report_view.js:1460 #: public/js/frappe/views/treeview.js:469 www/printview.html:18 msgid "Print" msgstr "" -#: public/js/frappe/list/list_view.js:1918 +#: public/js/frappe/list/list_view.js:1972 msgctxt "Button in list view actions menu" msgid "Print" msgstr "" -#: public/js/frappe/list/bulk_operations.js:47 +#: public/js/frappe/list/bulk_operations.js:48 msgid "Print Documents" msgstr "" #. Label of the print_format (Link) field in DocType 'Auto Repeat' +#. Label of a Link in the Build Workspace #. Label of the print_format (Link) field in DocType 'Notification' #. Name of a DocType #. Label of the print_format (Link) field in DocType 'Web Form' #: automation/doctype/auto_repeat/auto_repeat.json -#: email/doctype/notification/notification.json +#: core/workspace/build/build.json email/doctype/notification/notification.json #: printing/doctype/print_format/print_format.json #: printing/page/print/print.js:94 printing/page/print/print.js:819 -#: public/js/frappe/list/bulk_operations.js:58 +#: public/js/frappe/list/bulk_operations.js:59 #: website/doctype/web_form/web_form.json msgid "Print Format" msgstr "" -#. Label of a Link in the Build Workspace -#: core/workspace/build/build.json -msgctxt "Print Format" -msgid "Print Format" -msgstr "" - #. Label of a Link in the Tools Workspace #. Label of a shortcut in the Build Workspace #. Label of the print_format_builder (Check) field in DocType 'Print Format' @@ -19078,15 +19341,11 @@ msgstr "" msgid "Print Formats allow you can define looks for documents when printed or converted to PDF. You can also create a custom Print Format using drag-and-drop tools." msgstr "" +#. Label of a Link in the Tools Workspace #. Name of a DocType #. Label of the print_heading (Data) field in DocType 'Print Heading' -#: printing/doctype/print_heading/print_heading.json -msgid "Print Heading" -msgstr "" - -#. Label of a Link in the Tools Workspace #: automation/workspace/tools/tools.json -msgctxt "Print Heading" +#: printing/doctype/print_heading/print_heading.json msgid "Print Heading" msgstr "" @@ -19123,8 +19382,10 @@ msgstr "" msgid "Print Server" msgstr "" +#. Label of a Link in the Tools Workspace #. Label of the column_break_25 (Section Break) field in DocType 'Notification' #. Name of a DocType +#: automation/workspace/tools/tools.json #: email/doctype/notification/notification.json #: printing/doctype/print_settings/print_settings.json #: printing/doctype/print_style/print_style.js:6 @@ -19133,12 +19394,6 @@ msgstr "" msgid "Print Settings" msgstr "" -#. Label of a Link in the Tools Workspace -#: automation/workspace/tools/tools.json -msgctxt "Print Settings" -msgid "Print Settings" -msgstr "" - #. Label of the print_style_section (Section Break) field in DocType 'Print #. Settings' #. Label of the print_style (Link) field in DocType 'Print Settings' @@ -19233,6 +19488,7 @@ msgstr "" #: desk/doctype/custom_html_block/custom_html_block.json #: desk/doctype/event/event.json desk/doctype/kanban_board/kanban_board.json #: desk/doctype/note/note_list.js:8 +#: public/js/frappe/file_uploader/FilePreview.vue:34 msgid "Private" msgstr "" @@ -19260,7 +19516,7 @@ msgstr "" msgid "Processing" msgstr "" -#: email/doctype/email_queue/email_queue.py:434 +#: email/doctype/email_queue/email_queue.py:454 msgid "Processing..." msgstr "" @@ -19335,9 +19591,9 @@ msgstr "" #: desk/doctype/event/event.json desk/doctype/note/note.json #: desk/doctype/note/note_list.js:6 desk/doctype/workspace/workspace.json #: public/js/frappe/views/interaction.js:78 -#: public/js/frappe/views/workspace/workspace.js:627 -#: public/js/frappe/views/workspace/workspace.js:955 -#: public/js/frappe/views/workspace/workspace.js:1201 +#: public/js/frappe/views/workspace/workspace.js:654 +#: public/js/frappe/views/workspace/workspace.js:982 +#: public/js/frappe/views/workspace/workspace.js:1228 msgid "Public" msgstr "" @@ -19396,7 +19652,7 @@ msgstr "" msgid "Publishing Dates" msgstr "" -#: email/doctype/email_account/email_account.js:159 +#: email/doctype/email_account/email_account.js:179 msgid "Pull Emails" msgstr "" @@ -19446,13 +19702,9 @@ msgid "Purple" msgstr "" #. Name of a DocType -#: integrations/doctype/push_notification_settings/push_notification_settings.json -msgid "Push Notification Settings" -msgstr "" - #. Label of a Link in the Integrations Workspace +#: integrations/doctype/push_notification_settings/push_notification_settings.json #: integrations/workspace/integrations/integrations.json -msgctxt "Push Notification Settings" msgid "Push Notification Settings" msgstr "" @@ -19743,12 +19995,12 @@ msgstr "" msgid "Re-Run in Console" msgstr "" -#: email/doctype/email_account/email_account.py:669 +#: email/doctype/email_account/email_account.py:721 msgid "Re:" msgstr "" #: core/doctype/communication/communication.js:268 -#: public/js/frappe/form/footer/form_timeline.js:587 +#: public/js/frappe/form/footer/form_timeline.js:589 #: public/js/frappe/views/communication.js:355 msgid "Re: {0}" msgstr "" @@ -19856,7 +20108,7 @@ msgstr "" msgid "Rebuild Tree" msgstr "" -#: utils/nestedset.py:176 +#: utils/nestedset.py:177 msgid "Rebuilding of tree is not supported for {}" msgstr "" @@ -20064,6 +20316,7 @@ msgstr "" #. Label of the reference_doctype (Link) field in DocType 'Discussion Topic' #: core/doctype/communication/communication.js:143 #: core/report/transaction_log_report/transaction_log_report.py:88 +#: public/js/frappe/views/render_preview.js:34 #: website/doctype/discussion_topic/discussion_topic.json msgid "Reference Doctype" msgstr "" @@ -20211,13 +20464,14 @@ msgid "Referrer" msgstr "" #: printing/page/print/print.js:73 public/js/frappe/desk.js:134 -#: public/js/frappe/desk.js:533 public/js/frappe/form/form.js:1196 +#: public/js/frappe/desk.js:533 public/js/frappe/form/form.js:1200 #: public/js/frappe/form/templates/print_layout.html:6 #: public/js/frappe/list/base_list.js:66 -#: public/js/frappe/views/reports/query_report.js:1644 +#: public/js/frappe/views/reports/query_report.js:1629 #: public/js/frappe/views/treeview.js:475 -#: public/js/frappe/widgets/chart_widget.js:290 +#: public/js/frappe/widgets/chart_widget.js:291 #: public/js/frappe/widgets/number_card_widget.js:324 +#: public/js/print_format_builder/Preview.vue:24 msgid "Refresh" msgstr "" @@ -20243,7 +20497,7 @@ msgstr "" msgid "Refresh Token" msgstr "" -#: public/js/frappe/list/list_view.js:507 +#: public/js/frappe/list/list_view.js:504 msgctxt "Document count in list view" msgid "Refreshing" msgstr "" @@ -20253,7 +20507,7 @@ msgstr "" msgid "Refreshing..." msgstr "" -#: core/doctype/user/user.py:966 +#: core/doctype/user/user.py:985 msgid "Registered but disabled" msgstr "" @@ -20312,7 +20566,7 @@ msgstr "" msgid "Reload File" msgstr "" -#: public/js/frappe/list/base_list.js:242 +#: public/js/frappe/list/base_list.js:250 msgid "Reload List" msgstr "" @@ -20378,10 +20632,37 @@ msgstr "" msgid "Remove all customizations?" msgstr "" +#: public/js/form_builder/components/Section.vue:286 +msgid "Remove all fields in the column" +msgstr "" + +#: public/js/form_builder/components/Section.vue:278 #: public/js/frappe/utils/datatable.js:9 +#: public/js/print_format_builder/PrintFormatSection.vue:120 msgid "Remove column" msgstr "" +#: public/js/form_builder/components/Field.vue:260 +msgid "Remove field" +msgstr "" + +#: public/js/form_builder/components/Section.vue:279 +msgid "Remove last column" +msgstr "" + +#: public/js/print_format_builder/PrintFormatSection.vue:130 +msgid "Remove page break" +msgstr "" + +#: public/js/form_builder/components/Section.vue:266 +#: public/js/print_format_builder/PrintFormatSection.vue:135 +msgid "Remove section" +msgstr "" + +#: public/js/form_builder/components/Tabs.vue:140 +msgid "Remove tab" +msgstr "" + #: core/doctype/file/file.py:156 msgid "Removed {0}" msgstr "" @@ -20406,6 +20687,10 @@ msgstr "" msgid "Renamed files and replaced code in controllers, please check!" msgstr "" +#: public/js/print_format_builder/PrintFormatSection.vue:17 +msgid "Render labels to the left and values to the right in this section" +msgstr "" + #: core/doctype/communication/communication.js:43 desk/doctype/todo/todo.js:36 msgid "Reopen" msgstr "" @@ -20470,7 +20755,7 @@ msgstr "" #. Label of the reply (Text Editor) field in DocType 'Discussion Reply' #: core/doctype/communication/communication.js:57 -#: public/js/frappe/form/footer/form_timeline.js:550 +#: public/js/frappe/form/footer/form_timeline.js:552 #: website/doctype/discussion_reply/discussion_reply.json msgid "Reply" msgstr "" @@ -20487,6 +20772,8 @@ msgstr "" #. Page and Report' #. Label of the report (Link) field in DocType 'Role Permission for Page and #. Report' +#. Label of a Link in the Build Workspace +#. Label of a shortcut in the Build Workspace #. Option for the 'Chart Type' (Select) field in DocType 'Dashboard Chart' #. Option for the 'Select List View' (Select) field in DocType 'Form Tour' #. Option for the 'Type' (Select) field in DocType 'Number Card' @@ -20499,6 +20786,7 @@ msgstr "" #: core/doctype/custom_role/custom_role.json core/doctype/docperm/docperm.json #: core/doctype/report/report.json #: core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.json +#: core/workspace/build/build.json #: desk/doctype/dashboard_chart/dashboard_chart.json #: desk/doctype/form_tour/form_tour.json #: desk/doctype/number_card/number_card.json @@ -20510,13 +20798,6 @@ msgstr "" msgid "Report" msgstr "" -#. Label of a Link in the Build Workspace -#. Label of a shortcut in the Build Workspace -#: core/workspace/build/build.json -msgctxt "Report" -msgid "Report" -msgstr "" - #. Option for the 'Report Type' (Select) field in DocType 'Report' #. Option for the 'DocType View' (Select) field in DocType 'Workspace Shortcut' #: core/doctype/report/report.json @@ -20581,7 +20862,7 @@ msgstr "" #: core/doctype/report/report.json #: desk/doctype/dashboard_chart/dashboard_chart.json #: desk/doctype/number_card/number_card.json -#: public/js/frappe/views/reports/query_report.js:1825 +#: public/js/frappe/views/reports/query_report.js:1810 msgid "Report Name" msgstr "" @@ -20589,6 +20870,11 @@ msgstr "" msgid "Report Name, Report Field and Fucntion are required to create a number card" msgstr "" +#. Label of the report_ref_doctype (Link) field in DocType 'Workspace Link' +#: desk/doctype/workspace_link/workspace_link.json +msgid "Report Ref DocType" +msgstr "" + #. Label of the report_reference_doctype (Data) field in DocType 'Onboarding #. Step' #: desk/doctype/onboarding_step/onboarding_step.json @@ -20604,6 +20890,10 @@ msgstr "" msgid "Report Type" msgstr "" +#: public/js/frappe/list/base_list.js:204 +msgid "Report View" +msgstr "" + #: core/doctype/doctype/doctype.py:1780 msgid "Report cannot be set for Single types" msgstr "" @@ -20638,7 +20928,7 @@ msgstr "" msgid "Report was not saved (there were errors)" msgstr "" -#: public/js/frappe/views/reports/query_report.js:1863 +#: public/js/frappe/views/reports/query_report.js:1848 msgid "Report with more than 10 columns looks better in Landscape mode." msgstr "" @@ -20792,7 +21082,7 @@ msgstr "" msgid "Reset Changes" msgstr "" -#: public/js/frappe/widgets/chart_widget.js:305 +#: public/js/frappe/widgets/chart_widget.js:306 msgid "Reset Chart" msgstr "" @@ -20842,6 +21132,10 @@ msgstr "" msgid "Reset Permissions for {0}?" msgstr "" +#: public/js/form_builder/components/Field.vue:114 +msgid "Reset To Default" +msgstr "" + #: public/js/frappe/utils/datatable.js:8 msgid "Reset sorting" msgstr "" @@ -20939,8 +21233,8 @@ msgctxt "Title of message showing restrictions in list view" msgid "Restrictions" msgstr "" -#: public/js/frappe/ui/toolbar/awesome_bar.js:356 -#: public/js/frappe/ui/toolbar/awesome_bar.js:371 +#: public/js/frappe/ui/toolbar/awesome_bar.js:379 +#: public/js/frappe/ui/toolbar/awesome_bar.js:394 msgid "Result" msgstr "" @@ -21048,6 +21342,7 @@ msgid "Right" msgstr "" #: printing/page/print_format_builder/print_format_builder.js:484 +#: public/js/print_format_builder/PrintFormatControls.vue:156 msgctxt "alignment" msgid "Right" msgstr "" @@ -21073,6 +21368,8 @@ msgstr "" #. Label of the role (Link) field in DocType 'Has Role' #. Name of a DocType #. Label of the role (Link) field in DocType 'User Type' +#. Label of a Link in the Users Workspace +#. Label of a shortcut in the Users Workspace #. Label of the role (Link) field in DocType 'Onboarding Permission' #. Label of the role (Link) field in DocType 'ToDo' #. Label of the role (Link) field in DocType 'OAuth Client Role' @@ -21086,6 +21383,7 @@ msgstr "" #: core/doctype/user_type/user_type.py:109 #: core/page/permission_manager/permission_manager.js:212 #: core/page/permission_manager/permission_manager.js:450 +#: core/workspace/users/users.json #: desk/doctype/onboarding_permission/onboarding_permission.json #: desk/doctype/todo/todo.json #: integrations/doctype/oauth_client_role/oauth_client_role.json @@ -21095,13 +21393,6 @@ msgstr "" msgid "Role" msgstr "" -#. Label of a Link in the Users Workspace -#. Label of a shortcut in the Users Workspace -#: core/workspace/users/users.json -msgctxt "Role" -msgid "Role" -msgstr "" - #: core/doctype/role/role.js:8 msgid "Role 'All' will be given to all system + website users." msgstr "" @@ -21117,13 +21408,9 @@ msgid "Role Name" msgstr "" #. Name of a DocType -#: core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.json -msgid "Role Permission for Page and Report" -msgstr "" - #. Label of a Link in the Users Workspace +#: core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.json #: core/workspace/users/users.json -msgctxt "Role Permission for Page and Report" msgid "Role Permission for Page and Report" msgstr "" @@ -21140,7 +21427,7 @@ msgstr "" msgid "Role Permissions Manager" msgstr "" -#: public/js/frappe/list/list_view.js:1695 +#: public/js/frappe/list/list_view.js:1749 msgctxt "Button in list view menu" msgid "Role Permissions Manager" msgstr "" @@ -21148,14 +21435,10 @@ msgstr "" #. Name of a DocType #. Label of the role_profile_name (Link) field in DocType 'User' #. Label of the role_profile (Link) field in DocType 'User Role Profile' +#. Label of a Link in the Users Workspace #: core/doctype/role_profile/role_profile.json core/doctype/user/user.json #: core/doctype/user_role_profile/user_role_profile.json -msgid "Role Profile" -msgstr "" - -#. Label of a Link in the Users Workspace #: core/workspace/users/users.json -msgctxt "Role Profile" msgid "Role Profile" msgstr "" @@ -21172,7 +21455,7 @@ msgstr "" msgid "Role and Level" msgstr "" -#: core/doctype/user/user.py:316 +#: core/doctype/user/user.py:322 msgid "Role has been set as per the user type {0}" msgstr "" @@ -21224,7 +21507,7 @@ msgstr "" msgid "Roles can be set for users from their User page." msgstr "" -#: utils/nestedset.py:277 +#: utils/nestedset.py:280 msgid "Root {0} cannot be deleted" msgstr "" @@ -21297,7 +21580,7 @@ msgstr "" msgid "Row # {0}: Non administrator user can not set the role {1} to the custom doctype" msgstr "" -#: model/base_document.py:903 +#: model/base_document.py:904 msgid "Row #{0}:" msgstr "" @@ -21409,13 +21692,9 @@ msgid "Run scheduled jobs only if checked" msgstr "" #. Name of a DocType -#: integrations/doctype/s3_backup_settings/s3_backup_settings.json -msgid "S3 Backup Settings" -msgstr "" - #. Label of a Link in the Integrations Workspace +#: integrations/doctype/s3_backup_settings/s3_backup_settings.json #: integrations/workspace/integrations/integrations.json -msgctxt "S3 Backup Settings" msgid "S3 Backup Settings" msgstr "" @@ -21455,13 +21734,9 @@ msgid "SMS Parameter" msgstr "" #. Name of a DocType -#: core/doctype/sms_settings/sms_settings.json -msgid "SMS Settings" -msgstr "" - #. Label of a Link in the Integrations Workspace +#: core/doctype/sms_settings/sms_settings.json #: integrations/workspace/integrations/integrations.json -msgctxt "SMS Settings" msgid "SMS Settings" msgstr "" @@ -21473,7 +21748,7 @@ msgstr "" msgid "SMS was not sent. Please contact Administrator." msgstr "" -#: email/doctype/email_account/email_account.py:189 +#: email/doctype/email_account/email_account.py:206 msgid "SMTP Server is required" msgstr "" @@ -21571,7 +21846,7 @@ msgstr "" #: email/doctype/notification/notification.json #: printing/page/print/print.js:856 #: printing/page/print_format_builder/print_format_builder.js:160 -#: public/js/frappe/form/footer/form_timeline.js:661 +#: public/js/frappe/form/footer/form_timeline.js:663 #: public/js/frappe/form/quick_entry.js:161 #: public/js/frappe/list/list_settings.js:36 #: public/js/frappe/list/list_settings.js:244 @@ -21581,11 +21856,11 @@ msgstr "" #: public/js/frappe/views/kanban/kanban_settings.js:45 #: public/js/frappe/views/kanban/kanban_settings.js:189 #: public/js/frappe/views/kanban/kanban_view.js:343 -#: public/js/frappe/views/reports/query_report.js:1817 +#: public/js/frappe/views/reports/query_report.js:1802 #: public/js/frappe/views/reports/report_view.js:1640 -#: public/js/frappe/views/workspace/workspace.js:501 +#: public/js/frappe/views/workspace/workspace.js:528 #: public/js/frappe/widgets/base_widget.js:142 -#: public/js/frappe/widgets/quick_list_widget.js:117 +#: public/js/frappe/widgets/quick_list_widget.js:119 #: public/js/print_format_builder/print_format_builder.bundle.js:15 #: public/js/workflow_builder/workflow_builder.bundle.js:33 msgid "Save" @@ -21612,7 +21887,7 @@ msgstr "" msgid "Save Filter" msgstr "" -#: public/js/frappe/views/reports/query_report.js:1820 +#: public/js/frappe/views/reports/query_report.js:1805 msgid "Save Report" msgstr "" @@ -21625,7 +21900,7 @@ msgstr "" msgid "Save on Completion" msgstr "" -#: public/js/frappe/form/form_tour.js:289 +#: public/js/frappe/form/form_tour.js:295 msgid "Save the document." msgstr "" @@ -21638,7 +21913,7 @@ msgstr "" #: public/js/frappe/list/list_settings.js:40 #: public/js/frappe/views/kanban/kanban_settings.js:47 -#: public/js/frappe/views/workspace/workspace.js:513 +#: public/js/frappe/views/workspace/workspace.js:540 msgid "Saving" msgstr "" @@ -21709,22 +21984,17 @@ msgid "Scheduled Job Log" msgstr "" #. Name of a DocType +#. Label of a Link in the Build Workspace #. Label of the scheduled_job_type (Link) field in DocType 'System Health #. Report Failing Jobs' #: core/doctype/scheduled_job_type/scheduled_job_type.json +#: core/workspace/build/build.json #: desk/doctype/system_health_report_failing_jobs/system_health_report_failing_jobs.json msgid "Scheduled Job Type" msgstr "" #. Label of a Link in the Build Workspace #: core/workspace/build/build.json -msgctxt "Scheduled Job Type" -msgid "Scheduled Job Type" -msgstr "" - -#. Label of a Link in the Build Workspace -#: core/workspace/build/build.json -msgctxt "Scheduled Job Log" msgid "Scheduled Jobs Logs" msgstr "" @@ -21888,14 +22158,30 @@ msgstr "" msgid "Search Priorities" msgstr "" +#: public/js/frappe/file_uploader/FileBrowser.vue:132 +msgid "Search Results" +msgstr "" + #: www/search.py:14 msgid "Search Results for" msgstr "" +#: public/js/frappe/file_uploader/FileBrowser.vue:13 +msgid "Search by filename or extension" +msgstr "" + #: core/doctype/doctype/doctype.py:1436 msgid "Search field {0} is not valid" msgstr "" +#: public/js/print_format_builder/PrintFormatControls.vue:87 +msgid "Search fields" +msgstr "" + +#: public/js/form_builder/components/AddFieldButton.vue:19 +msgid "Search fieldtypes..." +msgstr "" + #: public/js/frappe/ui/toolbar/search.js:50 #: public/js/frappe/ui/toolbar/search.js:69 msgid "Search for anything" @@ -21914,6 +22200,10 @@ msgstr "" msgid "Search or type a command ({0})" msgstr "" +#: public/js/form_builder/components/SearchBox.vue:8 +msgid "Search properties..." +msgstr "" + #: templates/includes/search_box.html:8 msgid "Search results for" msgstr "" @@ -21929,6 +22219,7 @@ msgid "Searching ..." msgstr "" #. Option for the 'Type' (Select) field in DocType 'Web Template' +#: public/js/form_builder/components/Section.vue:263 #: website/doctype/web_template/web_template.json msgid "Section" msgstr "" @@ -21955,6 +22246,16 @@ msgstr "" msgid "Section ID" msgstr "" +#: public/js/form_builder/components/Section.vue:28 +#: public/js/print_format_builder/PrintFormatSection.vue:8 +msgid "Section Title" +msgstr "" + +#: public/js/form_builder/components/Section.vue:217 +#: public/js/form_builder/components/Section.vue:240 +msgid "Section must have at least one column" +msgstr "" + #. Label of the sb3 (Section Break) field in DocType 'User' #: core/doctype/user/user.json msgid "Security Settings" @@ -21968,7 +22269,7 @@ msgstr "" msgid "See all past reports." msgstr "" -#: public/js/frappe/form/form.js:1230 +#: public/js/frappe/form/form.js:1234 #: website/doctype/contact_us_settings/contact_us_settings.js:4 msgid "See on Website" msgstr "" @@ -22027,7 +22328,7 @@ msgstr "" msgid "Select" msgstr "" -#: public/js/frappe/data_import/data_exporter.js:148 +#: public/js/frappe/data_import/data_exporter.js:149 #: public/js/frappe/form/controls/multicheck.js:166 msgid "Select All" msgstr "" @@ -22073,6 +22374,7 @@ msgid "Select Date Range" msgstr "" #. Label of the doc_type (Link) field in DocType 'Web Form' +#: public/js/form_builder/components/controls/FetchFromControl.vue:28 #: public/js/frappe/doctype/index.js:171 website/doctype/web_form/web_form.json msgid "Select DocType" msgstr "" @@ -22100,6 +22402,7 @@ msgstr "" msgid "Select Document Types to set which User Permissions are used to limit access." msgstr "" +#: public/js/form_builder/components/controls/FetchFromControl.vue:33 #: public/js/frappe/doctype/index.js:200 public/js/frappe/form/toolbar.js:771 msgid "Select Field" msgstr "" @@ -22115,11 +22418,11 @@ msgstr "" msgid "Select Fields" msgstr "" -#: public/js/frappe/data_import/data_exporter.js:146 +#: public/js/frappe/data_import/data_exporter.js:147 msgid "Select Fields To Insert" msgstr "" -#: public/js/frappe/data_import/data_exporter.js:147 +#: public/js/frappe/data_import/data_exporter.js:148 msgid "Select Fields To Update" msgstr "" @@ -22152,7 +22455,7 @@ msgstr "" msgid "Select List View" msgstr "" -#: public/js/frappe/data_import/data_exporter.js:157 +#: public/js/frappe/data_import/data_exporter.js:158 msgid "Select Mandatory" msgstr "" @@ -22222,6 +22525,10 @@ msgstr "" msgid "Select a document to preview request data" msgstr "" +#: public/js/form_builder/components/Sidebar.vue:56 +msgid "Select a field to edit its properties." +msgstr "" + #: public/js/frappe/views/treeview.js:337 msgid "Select a group node first." msgstr "" @@ -22234,7 +22541,7 @@ msgstr "" msgid "Select a valid Subject field for creating documents from Email" msgstr "" -#: public/js/frappe/form/form_tour.js:315 +#: public/js/frappe/form/form_tour.js:321 msgid "Select an Image" msgstr "" @@ -22248,7 +22555,7 @@ msgstr "" msgid "Select an image of approx width 150px with a transparent background for best results." msgstr "" -#: public/js/frappe/list/bulk_operations.js:35 +#: public/js/frappe/list/bulk_operations.js:36 msgid "Select atleast 1 record for printing" msgstr "" @@ -22256,13 +22563,13 @@ msgstr "" msgid "Select atleast 2 actions" msgstr "" -#: public/js/frappe/list/list_view.js:1228 +#: public/js/frappe/list/list_view.js:1265 msgctxt "Description of a list view shortcut" msgid "Select list item" msgstr "" -#: public/js/frappe/list/list_view.js:1180 -#: public/js/frappe/list/list_view.js:1196 +#: public/js/frappe/list/list_view.js:1217 +#: public/js/frappe/list/list_view.js:1233 msgctxt "Description of a list view shortcut" msgid "Select multiple list items" msgstr "" @@ -22271,11 +22578,11 @@ msgstr "" msgid "Select or drag across time slots to create a new event." msgstr "" -#: public/js/frappe/list/bulk_operations.js:209 +#: public/js/frappe/list/bulk_operations.js:239 msgid "Select records for assignment" msgstr "" -#: public/js/frappe/list/bulk_operations.js:230 +#: public/js/frappe/list/bulk_operations.js:260 msgid "Select records for removing assignment" msgstr "" @@ -22292,6 +22599,7 @@ msgstr "" #: public/js/frappe/form/multi_select_dialog.js:81 #: public/js/frappe/form/multi_select_dialog.js:281 #: public/js/frappe/list/list_view_select.js:153 +#: public/js/print_format_builder/Preview.vue:90 msgid "Select {0}" msgstr "" @@ -22636,15 +22944,11 @@ msgstr "" #. Label of the server_script (Link) field in DocType 'Scheduled Job Type' #. Name of a DocType -#: core/doctype/scheduled_job_type/scheduled_job_type.json -#: core/doctype/server_script/server_script.json -msgid "Server Script" -msgstr "" - #. Label of a Link in the Build Workspace #. Label of a shortcut in the Build Workspace +#: core/doctype/scheduled_job_type/scheduled_job_type.json +#: core/doctype/server_script/server_script.json #: core/workspace/build/build.json -msgctxt "Server Script" msgid "Server Script" msgstr "" @@ -22704,6 +23008,14 @@ msgstr "" msgid "Session Expiry must be in format {0}" msgstr "" +#: desk/doctype/dashboard_chart/dashboard_chart.js:400 +#: desk/doctype/dashboard_chart/dashboard_chart.js:487 +#: desk/doctype/number_card/number_card.js:295 +#: desk/doctype/number_card/number_card.js:387 +#: public/js/frappe/widgets/chart_widget.js:407 +msgid "Set" +msgstr "" + #: public/js/frappe/ui/filters/filter.js:569 msgctxt "Field value is set" msgid "Set" @@ -22731,12 +23043,13 @@ msgstr "" #: desk/doctype/dashboard_chart/dashboard_chart.js:381 #: desk/doctype/number_card/number_card.js:280 +#: public/js/form_builder/components/Field.vue:80 #: website/doctype/web_form/web_form.js:269 msgid "Set Filters" msgstr "" -#: public/js/frappe/widgets/chart_widget.js:395 -#: public/js/frappe/widgets/quick_list_widget.js:102 +#: public/js/frappe/widgets/chart_widget.js:396 +#: public/js/frappe/widgets/quick_list_widget.js:104 msgid "Set Filters for {0}" msgstr "" @@ -22824,6 +23137,10 @@ msgstr "" msgid "Set by user" msgstr "" +#: public/js/frappe/utils/dashboard_utils.js:162 +msgid "Set dynamic filter values in JavaScript for the required fields here." +msgstr "" + #. Description of the 'Precision' (Select) field in DocType 'DocField' #. Description of the 'Precision' (Select) field in DocType 'Custom Field' #. Description of the 'Precision' (Select) field in DocType 'Customize Form @@ -22901,7 +23218,7 @@ msgstr "" #: integrations/workspace/integrations/integrations.json #: public/js/frappe/form/templates/print_layout.html:25 #: public/js/frappe/ui/toolbar/toolbar.js:289 -#: public/js/frappe/views/workspace/workspace.js:529 +#: public/js/frappe/views/workspace/workspace.js:556 #: website/doctype/web_form/web_form.json #: website/doctype/web_page/web_page.json msgid "Settings" @@ -22952,7 +23269,7 @@ msgstr "" msgid "Setup Approval Workflows" msgstr "" -#: public/js/frappe/views/reports/query_report.js:1690 +#: public/js/frappe/views/reports/query_report.js:1675 #: public/js/frappe/views/reports/report_view.js:1618 msgid "Setup Auto Email" msgstr "" @@ -22982,9 +23299,11 @@ msgstr "" #. Label of the share (Check) field in DocType 'Custom DocPerm' #. Label of the share (Check) field in DocType 'DocPerm' #. Label of the share (Check) field in DocType 'DocShare' +#. Label of the share (Check) field in DocType 'User Document Type' #. Option for the 'Type' (Select) field in DocType 'Notification Log' #: core/doctype/custom_docperm/custom_docperm.json #: core/doctype/docperm/docperm.json core/doctype/docshare/docshare.json +#: core/doctype/user_document_type/user_document_type.json #: desk/doctype/notification_log/notification_log.json #: public/js/frappe/form/templates/form_sidebar.html:110 msgid "Share" @@ -23096,7 +23415,7 @@ msgstr "" msgid "Show Error" msgstr "" -#: public/js/frappe/form/layout.js:561 +#: public/js/frappe/form/layout.js:563 msgid "Show Fieldname (click to copy on clipboard)" msgstr "" @@ -23214,7 +23533,7 @@ msgid "Show Sidebar" msgstr "" #: public/js/frappe/list/list_sidebar.html:66 -#: public/js/frappe/list/list_view.js:1611 +#: public/js/frappe/list/list_view.js:1665 msgid "Show Tags" msgstr "" @@ -23261,7 +23580,7 @@ msgstr "" msgid "Show all Versions" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:67 +#: public/js/frappe/form/footer/form_timeline.js:69 msgid "Show all activity" msgstr "" @@ -23301,10 +23620,15 @@ msgstr "" msgid "Show link to document" msgstr "" -#: public/js/frappe/form/layout.js:255 public/js/frappe/form/layout.js:273 +#: public/js/frappe/form/layout.js:257 public/js/frappe/form/layout.js:275 msgid "Show more details" msgstr "" +#. Label of the show_on_timeline (Check) field in DocType 'DocField' +#: core/doctype/docfield/docfield.json +msgid "Show on Timeline" +msgstr "" + #. Description of the 'Stats Time Interval' (Select) field in DocType 'Number #. Card' #: desk/doctype/number_card/number_card.json @@ -23355,7 +23679,7 @@ msgstr "" msgid "Sign Up and Confirmation" msgstr "" -#: core/doctype/user/user.py:959 +#: core/doctype/user/user.py:978 msgid "Sign Up is disabled" msgstr "" @@ -23471,7 +23795,7 @@ msgstr "" msgid "Skipping column {0}" msgstr "" -#: modules/utils.py:171 +#: modules/utils.py:175 msgid "Skipping fixture syncing for doctype {0} from file {1}" msgstr "" @@ -23499,13 +23823,9 @@ msgid "Slack Webhook Error" msgstr "" #. Name of a DocType -#: integrations/doctype/slack_webhook_url/slack_webhook_url.json -msgid "Slack Webhook URL" -msgstr "" - #. Label of a Link in the Integrations Workspace +#: integrations/doctype/slack_webhook_url/slack_webhook_url.json #: integrations/workspace/integrations/integrations.json -msgctxt "Slack Webhook URL" msgid "Slack Webhook URL" msgstr "" @@ -23571,13 +23891,9 @@ msgid "Social Link Type" msgstr "" #. Name of a DocType -#: integrations/doctype/social_login_key/social_login_key.json -msgid "Social Login Key" -msgstr "" - #. Label of a Link in the Integrations Workspace +#: integrations/doctype/social_login_key/social_login_key.json #: integrations/workspace/integrations/integrations.json -msgctxt "Social Login Key" msgid "Social Login Key" msgstr "" @@ -23670,7 +23986,7 @@ msgstr "" #. Label of the source (Data) field in DocType 'Web Page View' #. Label of the source (Small Text) field in DocType 'Website Route Redirect' -#: public/js/frappe/ui/toolbar/about.js:8 public/js/frappe/utils/utils.js:1715 +#: public/js/frappe/ui/toolbar/about.js:8 public/js/frappe/utils/utils.js:1716 #: website/doctype/web_page_view/web_page_view.json #: website/doctype/website_route_redirect/website_route_redirect.json #: website/report/website_analytics/website_analytics.js:38 @@ -23689,6 +24005,7 @@ msgid "Source Text" msgstr "" #: public/js/frappe/views/workspace/blocks/spacer.js:23 +#: public/js/print_format_builder/PrintFormatControls.vue:204 msgid "Spacer" msgstr "" @@ -23720,6 +24037,11 @@ msgstr "" msgid "Sr" msgstr "" +#: public/js/print_format_builder/Field.vue:143 +#: public/js/print_format_builder/Field.vue:164 +msgid "Sr No." +msgstr "" + #. Label of the stack_html (HTML) field in DocType 'Recorder Query' #: core/doctype/recorder/recorder.js:82 #: core/doctype/recorder_query/recorder_query.json @@ -23753,6 +24075,10 @@ msgstr "" msgid "Standard Not Set" msgstr "" +#: core/page/permission_manager/permission_manager.js:125 +msgid "Standard Permissions" +msgstr "" + #: printing/doctype/print_format/print_format.py:74 msgid "Standard Print Format cannot be updated" msgstr "" @@ -23885,6 +24211,10 @@ msgstr "" msgid "State" msgstr "" +#: public/js/workflow_builder/components/Properties.vue:24 +msgid "State Properties" +msgstr "" + #. Label of the state (Data) field in DocType 'Address' #: contacts/doctype/address/address.json msgid "State/Province" @@ -24111,6 +24441,7 @@ msgstr "" #: email/doctype/email_template/email_template.json #: email/doctype/newsletter/newsletter.json #: email/doctype/notification/notification.json +#: email/doctype/notification/notification.py:80 #: public/js/frappe/views/communication.js:107 #: public/js/frappe/views/inbox/inbox_view.js:63 msgid "Subject" @@ -24155,7 +24486,7 @@ msgstr "" msgid "Submit" msgstr "" -#: public/js/frappe/list/list_view.js:1985 +#: public/js/frappe/list/list_view.js:2039 msgctxt "Button in list view actions menu" msgid "Submit" msgstr "" @@ -24208,11 +24539,11 @@ msgstr "" msgid "Submit this document to complete this step." msgstr "" -#: public/js/frappe/form/form.js:1216 +#: public/js/frappe/form/form.js:1220 msgid "Submit this document to confirm" msgstr "" -#: public/js/frappe/list/list_view.js:1990 +#: public/js/frappe/list/list_view.js:2044 msgctxt "Title of confirmation dialog" msgid "Submit {0} documents?" msgstr "" @@ -24362,7 +24693,7 @@ msgstr "" msgid "Suggested Indexes" msgstr "" -#: core/doctype/user/user.py:674 +#: core/doctype/user/user.py:693 msgid "Suggested Username: {0}" msgstr "" @@ -24687,13 +25018,9 @@ msgid "System Page" msgstr "" #. Name of a DocType -#: core/doctype/system_settings/system_settings.json -msgid "System Settings" -msgstr "" - #. Label of a shortcut in the Build Workspace +#: core/doctype/system_settings/system_settings.json #: core/workspace/build/build.json -msgctxt "System Settings" msgid "System Settings" msgstr "" @@ -24717,6 +25044,10 @@ msgstr "" msgid "Tab Break" msgstr "" +#: public/js/form_builder/components/Tabs.vue:135 +msgid "Tab Label" +msgstr "" + #. Option for the 'Type' (Select) field in DocType 'DocField' #. Label of the table (Data) field in DocType 'Recorder Suggested Index' #. Option for the 'Field Type' (Select) field in DocType 'Custom Field' @@ -24793,7 +25124,7 @@ msgid "Tag Link" msgstr "" #: model/meta.py:52 public/js/frappe/form/templates/form_sidebar.html:100 -#: public/js/frappe/list/bulk_operations.js:400 +#: public/js/frappe/list/bulk_operations.js:430 #: public/js/frappe/list/list_sidebar.html:50 #: public/js/frappe/list/list_sidebar.js:228 public/js/frappe/model/meta.js:204 #: public/js/frappe/model/model.js:133 @@ -24885,7 +25216,7 @@ msgstr "" msgid "Templates" msgstr "" -#: core/doctype/user/user.py:970 +#: core/doctype/user/user.py:989 msgid "Temporarily Disabled" msgstr "" @@ -24991,7 +25322,7 @@ msgid "" "
" msgstr "" -#: email/doctype/notification/notification.py:130 +#: email/doctype/notification/notification.py:192 msgid "The Condition '{0}' is invalid" msgstr "" @@ -25041,7 +25372,11 @@ msgstr "" msgid "The comment cannot be empty" msgstr "" -#: public/js/frappe/list/list_view.js:630 +#: templates/emails/workflow_action.html:9 +msgid "The contents of this email are strictly confidential. Please do not forward this email to anyone." +msgstr "" + +#: public/js/frappe/list/list_view.js:629 msgid "The count shown is an estimated count. Click here to see the accurate count." msgstr "" @@ -25141,11 +25476,11 @@ msgid "" "" msgstr "" -#: core/doctype/user/user.py:930 +#: core/doctype/user/user.py:949 msgid "The reset password link has been expired" msgstr "" -#: core/doctype/user/user.py:932 +#: core/doctype/user/user.py:951 msgid "The reset password link has either been used before or is invalid" msgstr "" @@ -25183,7 +25518,7 @@ msgstr "" msgid "The user from this field will be rewarded points" msgstr "" -#: public/js/frappe/form/controls/data.js:24 +#: public/js/frappe/form/controls/data.js:25 msgid "The value you pasted was {0} characters long. Max allowed characters is {1}." msgstr "" @@ -25344,7 +25679,7 @@ msgstr "" msgid "This action is irreversible. Do you wish to continue?" msgstr "" -#: __init__.py:1014 +#: __init__.py:1020 msgid "This action is only allowed for {}" msgstr "" @@ -25390,11 +25725,11 @@ msgstr "" msgid "This document has been reverted" msgstr "" -#: public/js/frappe/form/form.js:1304 +#: public/js/frappe/form/form.js:1308 msgid "This document has unsaved changes which might not appear in final PDF.
Consider saving the document before printing." msgstr "" -#: public/js/frappe/form/form.js:1097 +#: public/js/frappe/form/form.js:1101 msgid "This document is already amended, you cannot ammend it again" msgstr "" @@ -25430,7 +25765,7 @@ msgstr "" msgid "This file is public. It can be accessed without authentication." msgstr "" -#: public/js/frappe/form/form.js:1194 +#: public/js/frappe/form/form.js:1198 msgid "This form has been modified after you have loaded it" msgstr "" @@ -25449,7 +25784,7 @@ msgstr "" msgid "This goes above the slideshow." msgstr "" -#: public/js/frappe/views/reports/query_report.js:2027 +#: public/js/frappe/views/reports/query_report.js:2012 msgid "This is a background report. Please set the appropriate filters and then generate a new one." msgstr "" @@ -25577,7 +25912,7 @@ msgstr "" msgid "This will terminate the job immediately and might be dangerous, are you sure? " msgstr "" -#: core/doctype/user/user.py:1190 +#: core/doctype/user/user.py:1209 msgid "Throttled" msgstr "" @@ -25677,7 +26012,7 @@ msgstr "" msgid "Time in seconds to retain QR code image on server. Min:240" msgstr "" -#: desk/doctype/dashboard_chart/dashboard_chart.py:402 +#: desk/doctype/dashboard_chart/dashboard_chart.py:412 msgid "Time series based on is required to create a dashboard chart" msgstr "" @@ -25791,9 +26126,9 @@ msgstr "" #: desk/doctype/system_health_report_errors/system_health_report_errors.json #: desk/doctype/workspace/workspace.json #: email/doctype/email_group/email_group.json -#: public/js/frappe/views/workspace/workspace.js:613 -#: public/js/frappe/views/workspace/workspace.js:942 -#: public/js/frappe/views/workspace/workspace.js:1189 +#: public/js/frappe/views/workspace/workspace.js:640 +#: public/js/frappe/views/workspace/workspace.js:969 +#: public/js/frappe/views/workspace/workspace.js:1216 #: website/doctype/blog_category/blog_category.json #: website/doctype/blog_post/blog_post.json #: website/doctype/blog_settings/blog_settings.json @@ -25847,13 +26182,8 @@ msgstr "" msgid "To Date Field" msgstr "" -#: desk/doctype/todo/todo_list.js:6 -msgid "To Do" -msgstr "" - #. Label of a Link in the Tools Workspace -#: automation/workspace/tools/tools.json -msgctxt "ToDo" +#: automation/workspace/tools/tools.json desk/doctype/todo/todo_list.js:6 msgid "To Do" msgstr "" @@ -25933,7 +26263,7 @@ msgstr "" msgid "To print output use print(text)" msgstr "" -#: core/doctype/user_type/user_type.py:295 +#: core/doctype/user_type/user_type.py:292 msgid "To set the role {0} in the user {1}, kindly set the {2} field as {3} in one of the {4} record." msgstr "" @@ -25964,15 +26294,11 @@ msgstr "" msgid "To version" msgstr "" +#. Label of a shortcut in the Tools Workspace #. Name of a DocType #. Name of a report -#: desk/doctype/todo/todo.json desk/report/todo/todo.json -msgid "ToDo" -msgstr "" - -#. Label of a shortcut in the Tools Workspace -#: automation/workspace/tools/tools.json -msgctxt "ToDo" +#: automation/workspace/tools/tools.json desk/doctype/todo/todo.json +#: desk/report/todo/todo.json msgid "ToDo" msgstr "" @@ -26000,7 +26326,7 @@ msgstr "" msgid "Toggle Sidebar" msgstr "" -#: public/js/frappe/list/list_view.js:1726 +#: public/js/frappe/list/list_view.js:1780 msgctxt "Button in list view menu" msgid "Toggle Sidebar" msgstr "" @@ -26047,7 +26373,7 @@ msgstr "" msgid "Too many changes to database in single action." msgstr "" -#: core/doctype/user/user.py:971 +#: core/doctype/user/user.py:990 msgid "Too many users signed up recently, so the registration is disabled. Please try back in an hour" msgstr "" @@ -26059,6 +26385,7 @@ msgstr "" #. Option for the 'Position' (Select) field in DocType 'Form Tour Step' #: desk/doctype/form_tour_step/form_tour_step.json +#: public/js/print_format_builder/PrintFormatControls.vue:153 msgid "Top" msgstr "" @@ -26076,6 +26403,7 @@ msgstr "" #. Option for the 'Page Number' (Select) field in DocType 'Print Format' #: desk/doctype/form_tour_step/form_tour_step.json #: printing/doctype/print_format/print_format.json +#: public/js/print_format_builder/PrintFormatControls.vue:245 msgid "Top Center" msgstr "" @@ -26086,6 +26414,7 @@ msgstr "" #. Option for the 'Page Number' (Select) field in DocType 'Print Format' #: printing/doctype/print_format/print_format.json +#: public/js/print_format_builder/PrintFormatControls.vue:244 msgid "Top Left" msgstr "" @@ -26101,6 +26430,7 @@ msgstr "" #. Option for the 'Page Number' (Select) field in DocType 'Print Format' #: desk/doctype/form_tour_step/form_tour_step.json #: printing/doctype/print_format/print_format.json +#: public/js/print_format_builder/PrintFormatControls.vue:246 msgid "Top Right" msgstr "" @@ -26173,6 +26503,10 @@ msgstr "" msgid "Total number of emails to sync in initial sync process " msgstr "" +#: public/js/print_format_builder/ConfigureColumns.vue:12 +msgid "Total:" +msgstr "" + #: public/js/frappe/views/reports/report_view.js:1178 msgid "Totals" msgstr "" @@ -26239,7 +26573,7 @@ msgstr "" msgid "Track milestones for any document" msgstr "" -#: public/js/frappe/utils/utils.js:1766 +#: public/js/frappe/utils/utils.js:1767 msgid "Tracking URL generated and copied to clipboard" msgstr "" @@ -26259,6 +26593,10 @@ msgstr "" msgid "Transaction Log Report" msgstr "" +#: public/js/workflow_builder/components/Properties.vue:19 +msgid "Transition Properties" +msgstr "" + #. Label of the transition_rules (Section Break) field in DocType 'Workflow' #: workflow/doctype/workflow/workflow.json msgid "Transition Rules" @@ -26315,6 +26653,10 @@ msgstr "" msgid "Tree" msgstr "" +#: public/js/frappe/list/base_list.js:211 +msgid "Tree View" +msgstr "" + #. Description of the 'Is Tree' (Check) field in DocType 'DocType' #: core/doctype/doctype/doctype.json msgid "Tree structures are implemented using Nested Set" @@ -26420,6 +26762,7 @@ msgstr "" #: desk/doctype/workspace_link/workspace_link.json #: desk/doctype/workspace_shortcut/workspace_shortcut.json #: public/js/frappe/views/file/file_view.js:337 +#: public/js/frappe/widgets/widget_dialog.js:399 #: social/doctype/energy_point_log/energy_point_log.json #: website/doctype/web_template/web_template.json www/attribution.html:35 msgid "Type" @@ -26502,6 +26845,7 @@ msgstr "" #: desk/doctype/workspace_shortcut/workspace_shortcut.json #: integrations/doctype/integration_request/integration_request.json #: integrations/doctype/webhook_request_log/webhook_request_log.json +#: public/js/frappe/widgets/widget_dialog.js:469 #: website/doctype/top_bar_item/top_bar_item.json #: website/doctype/website_slideshow_item/website_slideshow_item.json msgid "URL" @@ -26546,7 +26890,7 @@ msgstr "" msgid "Unable to open attached file. Did you export it as CSV?" msgstr "" -#: core/doctype/file/utils.py:97 core/doctype/file/utils.py:129 +#: core/doctype/file/utils.py:98 core/doctype/file/utils.py:130 msgid "Unable to read file format for {0}" msgstr "" @@ -26598,7 +26942,7 @@ msgstr "" msgid "Unhandled Emails" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:570 +#: public/js/frappe/views/workspace/workspace.js:597 msgid "Unhide Workspace" msgstr "" @@ -26655,7 +26999,7 @@ msgstr "" msgid "Unsafe SQL query" msgstr "" -#: public/js/frappe/data_import/data_exporter.js:158 +#: public/js/frappe/data_import/data_exporter.js:159 #: public/js/frappe/form/controls/multicheck.js:166 msgid "Unselect All" msgstr "" @@ -26720,7 +27064,7 @@ msgstr "" #: printing/page/print_format_builder/print_format_builder.js:670 #: printing/page/print_format_builder/print_format_builder.js:757 #: public/js/frappe/form/grid_row.js:404 -#: public/js/frappe/views/workspace/workspace.js:661 +#: public/js/frappe/views/workspace/workspace.js:688 msgid "Update" msgstr "" @@ -26730,7 +27074,7 @@ msgstr "" msgid "Update Amendment Naming" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:610 +#: public/js/frappe/views/workspace/workspace.js:637 msgid "Update Details" msgstr "" @@ -26786,7 +27130,7 @@ msgstr "" msgid "Update from Frappe Cloud" msgstr "" -#: public/js/frappe/list/bulk_operations.js:345 +#: public/js/frappe/list/bulk_operations.js:375 msgid "Update {0} records" msgstr "" @@ -26807,7 +27151,7 @@ msgstr "" msgid "Updated To A New Version 🎉" msgstr "" -#: public/js/frappe/list/bulk_operations.js:342 +#: public/js/frappe/list/bulk_operations.js:372 msgid "Updated successfully" msgstr "" @@ -26825,7 +27169,7 @@ msgctxt "Freeze message while updating a document" msgid "Updating" msgstr "" -#: email/doctype/email_queue/email_queue.py:433 +#: email/doctype/email_queue/email_queue.py:453 msgid "Updating Email Queue Statuses. The emails will be picked up in the next scheduled run." msgstr "" @@ -26860,6 +27204,18 @@ msgstr "" msgid "Upload" msgstr "" +#: public/js/print_format_builder/LetterHeadEditor.vue:93 +msgid "Upload Image" +msgstr "" + +#: public/js/frappe/file_uploader/FileUploader.vue:193 +msgid "Upload file" +msgstr "" + +#: public/js/frappe/file_uploader/FileUploader.vue:196 +msgid "Upload {0} files" +msgstr "" + #. Label of the uploaded_to_dropbox (Check) field in DocType 'File' #: core/doctype/file/file.json msgid "Uploaded To Dropbox" @@ -26986,6 +27342,8 @@ msgstr "" #. Name of a DocType #. Label of the user (Link) field in DocType 'User Group Member' #. Label of the user (Link) field in DocType 'User Permission' +#. Label of a Link in the Users Workspace +#. Label of a shortcut in the Users Workspace #. Label of the user (Link) field in DocType 'Dashboard Settings' #. Label of the user (Link) field in DocType 'Note Seen By' #. Label of the user (Link) field in DocType 'Notification Settings' @@ -27012,6 +27370,7 @@ msgstr "" #: core/doctype/user_group_member/user_group_member.json #: core/doctype/user_permission/user_permission.json #: core/report/permitted_documents_for_user/permitted_documents_for_user.js:8 +#: core/workspace/users/users.json #: desk/doctype/dashboard_settings/dashboard_settings.json #: desk/doctype/note_seen_by/note_seen_by.json #: desk/doctype/notification_settings/notification_settings.json @@ -27033,13 +27392,6 @@ msgstr "" msgid "User" msgstr "" -#. Label of a Link in the Users Workspace -#. Label of a shortcut in the Users Workspace -#: core/workspace/users/users.json -msgctxt "User" -msgid "User" -msgstr "" - #. Label of the user (Link) field in DocType 'Access Log' #: core/doctype/access_log/access_log.json msgid "User " @@ -27153,7 +27505,7 @@ msgstr "" msgid "User Id Field" msgstr "" -#: core/doctype/user_type/user_type.py:287 +#: core/doctype/user_type/user_type.py:284 msgid "User Id Field is mandatory in the user type {0}" msgstr "" @@ -27177,23 +27529,19 @@ msgstr "" msgid "User Permission" msgstr "" +#. Label of a Link in the Users Workspace #: core/page/permission_manager/permission_manager_help.html:30 -#: public/js/frappe/views/reports/query_report.js:1804 +#: core/workspace/users/users.json +#: public/js/frappe/views/reports/query_report.js:1789 #: public/js/frappe/views/reports/report_view.js:1666 msgid "User Permissions" msgstr "" -#: public/js/frappe/list/list_view.js:1684 +#: public/js/frappe/list/list_view.js:1738 msgctxt "Button in list view menu" msgid "User Permissions" msgstr "" -#. Label of a Link in the Users Workspace -#: core/workspace/users/users.json -msgctxt "User Permission" -msgid "User Permissions" -msgstr "" - #: core/page/permission_manager/permission_manager_help.html:32 msgid "User Permissions are used to limit users to specific records." msgstr "" @@ -27238,14 +27586,9 @@ msgstr "" #. Label of the user_type (Link) field in DocType 'User' #. Name of a DocType -#: core/doctype/user/user.json core/doctype/user_type/user_type.json -#: core/doctype/user_type/user_type.py:82 -msgid "User Type" -msgstr "" - #. Label of a shortcut in the Users Workspace -#: core/workspace/users/users.json -msgctxt "User Type" +#: core/doctype/user/user.json core/doctype/user_type/user_type.json +#: core/doctype/user_type/user_type.py:82 core/workspace/users/users.json msgid "User Type" msgstr "" @@ -27290,7 +27633,7 @@ msgstr "" msgid "User must always select" msgstr "" -#: model/delete_doc.py:235 +#: model/delete_doc.py:244 msgid "User not allowed to delete {0}: {1}" msgstr "" @@ -27306,15 +27649,15 @@ msgstr "" msgid "User with email: {0} does not exist in the system. Please ask 'System Administrator' to create the user for you." msgstr "" -#: core/doctype/user/user.py:485 +#: core/doctype/user/user.py:495 msgid "User {0} cannot be deleted" msgstr "" -#: core/doctype/user/user.py:280 +#: core/doctype/user/user.py:285 msgid "User {0} cannot be disabled" msgstr "" -#: core/doctype/user/user.py:556 +#: core/doctype/user/user.py:575 msgid "User {0} cannot be renamed" msgstr "" @@ -27326,7 +27669,7 @@ msgstr "" msgid "User {0} does not have doctype access via role permission for document {1}" msgstr "" -#: desk/doctype/workspace/workspace.py:253 +#: desk/doctype/workspace/workspace.py:257 msgid "User {0} does not have the permission to create a Workspace." msgstr "" @@ -27335,7 +27678,7 @@ msgstr "" msgid "User {0} has requested for data deletion" msgstr "" -#: core/doctype/user/user.py:1319 +#: core/doctype/user/user.py:1338 msgid "User {0} impersonated as {1}" msgstr "" @@ -27363,7 +27706,7 @@ msgstr "" msgid "Username" msgstr "" -#: core/doctype/user/user.py:641 +#: core/doctype/user/user.py:660 msgid "Username {0} already exists" msgstr "" @@ -27426,6 +27769,12 @@ msgstr "" msgid "Validate Field" msgstr "" +#. Label of the validate_frappe_mail_settings (Button) field in DocType 'Email +#. Account' +#: email/doctype/email_account/email_account.json +msgid "Validate Frappe Mail Settings" +msgstr "" + #. Label of the validate_ssl_certificate (Check) field in DocType 'Email #. Account' #. Label of the validate_ssl_certificate (Check) field in DocType 'Email @@ -27465,8 +27814,8 @@ msgstr "" #: email/doctype/auto_email_report/auto_email_report.js:92 #: integrations/doctype/query_parameters/query_parameters.json #: integrations/doctype/webhook_header/webhook_header.json -#: public/js/frappe/list/bulk_operations.js:306 -#: public/js/frappe/list/bulk_operations.js:368 +#: public/js/frappe/list/bulk_operations.js:336 +#: public/js/frappe/list/bulk_operations.js:398 #: public/js/frappe/list/list_view_permission_restrictions.html:4 #: website/doctype/web_form/web_form.js:197 #: website/doctype/website_meta_tag/website_meta_tag.json @@ -27496,7 +27845,7 @@ msgstr "" msgid "Value To Be Set" msgstr "" -#: model/base_document.py:965 model/document.py:682 +#: model/base_document.py:966 model/document.py:682 msgid "Value cannot be changed for {0}" msgstr "" @@ -27539,7 +27888,7 @@ msgstr "" msgid "Value to Validate" msgstr "" -#: model/base_document.py:1035 +#: model/base_document.py:1036 msgid "Value too big" msgstr "" @@ -27564,8 +27913,8 @@ msgstr "" msgid "Verdana" msgstr "" -#: twofactor.py:357 -msgid "Verfication Code" +#: twofactor.py:352 +msgid "Verification Code" msgstr "" #: templates/emails/delete_data_confirmation.html:10 @@ -27585,11 +27934,11 @@ msgstr "" msgid "Verified" msgstr "" -#: public/js/frappe/ui/messages.js:350 +#: public/js/frappe/ui/messages.js:352 msgid "Verify" msgstr "" -#: public/js/frappe/ui/messages.js:349 +#: public/js/frappe/ui/messages.js:351 msgid "Verify Password" msgstr "" @@ -27638,7 +27987,7 @@ msgid "View Full Log" msgstr "" #: public/js/frappe/views/treeview.js:463 -#: public/js/frappe/widgets/quick_list_widget.js:245 +#: public/js/frappe/widgets/quick_list_widget.js:247 msgid "View List" msgstr "" @@ -27816,14 +28165,10 @@ msgid "Weak" msgstr "" #. Name of a DocType -#: website/doctype/web_form/web_form.json -msgid "Web Form" -msgstr "" - #. Label of a Link in the Website Workspace #. Label of a shortcut in the Website Workspace +#: website/doctype/web_form/web_form.json #: website/workspace/website/website.json -msgctxt "Web Form" msgid "Web Form" msgstr "" @@ -27843,14 +28188,10 @@ msgid "Web Form List Column" msgstr "" #. Name of a DocType -#: website/doctype/web_page/web_page.json -msgid "Web Page" -msgstr "" - #. Label of a Link in the Website Workspace #. Label of a shortcut in the Website Workspace +#: website/doctype/web_page/web_page.json #: website/workspace/website/website.json -msgctxt "Web Page" msgid "Web Page" msgstr "" @@ -27859,7 +28200,7 @@ msgstr "" msgid "Web Page Block" msgstr "" -#: public/js/frappe/utils/utils.js:1707 +#: public/js/frappe/utils/utils.js:1708 msgid "Web Page URL" msgstr "" @@ -27901,14 +28242,10 @@ msgstr "" #. Name of a DocType #. Label of the webhook (Link) field in DocType 'Webhook Request Log' +#. Label of a Link in the Integrations Workspace #: integrations/doctype/webhook/webhook.json #: integrations/doctype/webhook_request_log/webhook_request_log.json -msgid "Webhook" -msgstr "" - -#. Label of a Link in the Integrations Workspace #: integrations/workspace/integrations/integrations.json -msgctxt "Webhook" msgid "Webhook" msgstr "" @@ -27962,7 +28299,7 @@ msgstr "" #. Group in Module Def's connections #. Name of a Workspace #: core/doctype/module_def/module_def.json -#: email/doctype/newsletter/newsletter.py:449 +#: email/doctype/newsletter/newsletter.py:453 #: public/js/frappe/ui/toolbar/about.js:8 #: website/workspace/website/website.json msgid "Website" @@ -27999,13 +28336,9 @@ msgid "Website Meta Tag" msgstr "" #. Name of a DocType -#: website/doctype/website_route_meta/website_route_meta.json -msgid "Website Route Meta" -msgstr "" - #. Label of a Link in the Website Workspace +#: website/doctype/website_route_meta/website_route_meta.json #: website/workspace/website/website.json -msgctxt "Website Route Meta" msgid "Website Route Meta" msgstr "" @@ -28015,13 +28348,9 @@ msgid "Website Route Redirect" msgstr "" #. Name of a DocType -#: website/doctype/website_script/website_script.json -msgid "Website Script" -msgstr "" - #. Label of a Link in the Website Workspace +#: website/doctype/website_script/website_script.json #: website/workspace/website/website.json -msgctxt "Website Script" msgid "Website Script" msgstr "" @@ -28035,29 +28364,21 @@ msgid "Website Search Field must be a valid fieldname" msgstr "" #. Name of a DocType -#: website/doctype/website_settings/website_settings.json -msgid "Website Settings" -msgstr "" - #. Label of a Link in the Website Workspace #. Label of a shortcut in the Website Workspace +#: website/doctype/website_settings/website_settings.json #: website/workspace/website/website.json -msgctxt "Website Settings" msgid "Website Settings" msgstr "" #. Label of the website_sidebar (Link) field in DocType 'Web Form' #. Label of the website_sidebar (Link) field in DocType 'Web Page' #. Name of a DocType +#. Label of a Link in the Website Workspace #: website/doctype/web_form/web_form.json #: website/doctype/web_page/web_page.json #: website/doctype/website_sidebar/website_sidebar.json -msgid "Website Sidebar" -msgstr "" - -#. Label of a Link in the Website Workspace #: website/workspace/website/website.json -msgctxt "Website Sidebar" msgid "Website Sidebar" msgstr "" @@ -28067,13 +28388,9 @@ msgid "Website Sidebar Item" msgstr "" #. Name of a DocType -#: website/doctype/website_slideshow/website_slideshow.json -msgid "Website Slideshow" -msgstr "" - #. Label of a Link in the Website Workspace +#: website/doctype/website_slideshow/website_slideshow.json #: website/workspace/website/website.json -msgctxt "Website Slideshow" msgid "Website Slideshow" msgstr "" @@ -28084,14 +28401,10 @@ msgstr "" #. Label of the website_theme (Link) field in DocType 'Website Settings' #. Name of a DocType +#. Label of a Link in the Website Workspace #: website/doctype/website_settings/website_settings.json #: website/doctype/website_theme/website_theme.json -msgid "Website Theme" -msgstr "" - -#. Label of a Link in the Website Workspace #: website/workspace/website/website.json -msgctxt "Website Theme" msgid "Website Theme" msgstr "" @@ -28200,11 +28513,11 @@ msgstr "" msgid "Welcome Workspace" msgstr "" -#: core/doctype/user/user.py:363 +#: core/doctype/user/user.py:373 msgid "Welcome email sent" msgstr "" -#: core/doctype/user/user.py:424 +#: core/doctype/user/user.py:434 msgid "Welcome to {0}" msgstr "" @@ -28252,6 +28565,7 @@ msgstr "" #: custom/doctype/customize_form_field/customize_form_field.json #: desk/doctype/dashboard_chart_link/dashboard_chart_link.json #: printing/page/print_format_builder/print_format_builder_column_selector.html:8 +#: public/js/print_format_builder/ConfigureColumns.vue:11 msgid "Width" msgstr "" @@ -28311,20 +28625,16 @@ msgstr "" #. Option for the 'Comment Type' (Select) field in DocType 'Comment' #. Option for the 'Comment Type' (Select) field in DocType 'Communication' #. Group in DocType's connections +#. Label of a Link in the Build Workspace #. Name of a DocType #: core/doctype/comment/comment.json #: core/doctype/communication/communication.json -#: core/doctype/doctype/doctype.json public/js/workflow_builder/store.js:129 +#: core/doctype/doctype/doctype.json core/workspace/build/build.json +#: public/js/workflow_builder/store.js:129 #: workflow/doctype/workflow/workflow.json msgid "Workflow" msgstr "" -#. Label of a Link in the Build Workspace -#: core/workspace/build/build.json -msgctxt "Workflow" -msgid "Workflow" -msgstr "" - #. Name of a DocType #: workflow/doctype/workflow_action/workflow_action.json #: workflow/doctype/workflow_action/workflow_action.py:438 @@ -28378,6 +28688,10 @@ msgstr "" msgid "Workflow Data" msgstr "" +#: public/js/workflow_builder/components/Properties.vue:42 +msgid "Workflow Details" +msgstr "" + #. Name of a DocType #: workflow/doctype/workflow_document_state/workflow_document_state.json msgid "Workflow Document State" @@ -28432,19 +28746,15 @@ msgid "Workflows allow you to define custom rules for the approval process of a msgstr "" #. Label of the workspace_section (Section Break) field in DocType 'User' +#. Label of a Link in the Build Workspace #. Name of a DocType -#: core/doctype/user/user.json desk/doctype/workspace/workspace.json +#: core/doctype/user/user.json core/workspace/build/build.json +#: desk/doctype/workspace/workspace.json #: public/js/frappe/ui/toolbar/search_utils.js:557 #: public/js/frappe/views/workspace/workspace.js:10 msgid "Workspace" msgstr "" -#. Label of a Link in the Build Workspace -#: core/workspace/build/build.json -msgctxt "Workspace" -msgid "Workspace" -msgstr "" - #: public/js/frappe/router.js:179 msgid "Workspace {0} does not exist" msgstr "" @@ -28485,19 +28795,19 @@ msgstr "" msgid "Workspace Shortcut" msgstr "" -#: desk/doctype/workspace/workspace.py:285 +#: desk/doctype/workspace/workspace.py:289 msgid "Workspace not found" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:1279 +#: public/js/frappe/views/workspace/workspace.js:1306 msgid "Workspace {0} Created Successfully" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:908 +#: public/js/frappe/views/workspace/workspace.js:935 msgid "Workspace {0} Deleted Successfully" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:686 +#: public/js/frappe/views/workspace/workspace.js:713 msgid "Workspace {0} Edited Successfully" msgstr "" @@ -28520,7 +28830,7 @@ msgstr "" msgid "Write" msgstr "" -#: model/base_document.py:875 +#: model/base_document.py:876 msgid "Wrong Fetch From value" msgstr "" @@ -28600,6 +28910,8 @@ msgstr "" #. Settings' #. Option for the 'Standard' (Select) field in DocType 'Print Format' #: core/doctype/page/page.json core/doctype/report/report.json +#: email/doctype/notification/notification.py:94 +#: email/doctype/notification/notification.py:100 #: integrations/doctype/ldap_settings/ldap_settings.json #: integrations/doctype/webhook/webhook.py:130 #: integrations/doctype/webhook/webhook.py:140 @@ -28607,7 +28919,7 @@ msgstr "" #: public/js/form_builder/utils.js:336 #: public/js/frappe/form/controls/link.js:475 #: public/js/frappe/list/list_sidebar_group_by.js:223 -#: public/js/frappe/views/reports/query_report.js:1541 +#: public/js/frappe/views/reports/query_report.js:1526 #: website/doctype/help_article/templates/help_article.html:25 msgid "Yes" msgstr "" @@ -28627,7 +28939,7 @@ msgctxt "Name of the current user. For example: You edited this 5 hours ago." msgid "You" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:462 +#: public/js/frappe/form/footer/form_timeline.js:464 msgid "You Liked" msgstr "" @@ -28691,7 +29003,7 @@ msgstr "" msgid "You are not permitted to access this page." msgstr "" -#: __init__.py:933 +#: __init__.py:939 msgid "You are not permitted to access this resource." msgstr "" @@ -28703,11 +29015,11 @@ msgstr "" msgid "You are only allowed to update order, do not remove or add apps." msgstr "" -#: email/doctype/email_account/email_account.js:216 +#: email/doctype/email_account/email_account.js:249 msgid "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)." msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:413 +#: public/js/frappe/form/footer/form_timeline.js:415 msgctxt "Form timeline" msgid "You attached {0}" msgstr "" @@ -28744,8 +29056,8 @@ msgstr "" msgid "You can continue with the onboarding after exploring this page" msgstr "" -#: core/doctype/user/user.py:543 -msgid "You can disable the user instead of deleting it." +#: model/delete_doc.py:136 +msgid "You can disable this {0} instead of deleting it." msgstr "" #: core/doctype/file/file.py:691 @@ -28760,7 +29072,7 @@ msgstr "" msgid "You can only insert images in Markdown fields" msgstr "" -#: public/js/frappe/list/bulk_operations.js:41 +#: public/js/frappe/list/bulk_operations.js:42 msgid "You can only print upto {0} documents at a time" msgstr "" @@ -28810,7 +29122,7 @@ msgctxt "Form timeline" msgid "You cancelled this document {1}" msgstr "" -#: desk/doctype/dashboard_chart/dashboard_chart.py:406 +#: desk/doctype/dashboard_chart/dashboard_chart.py:416 msgid "You cannot create a dashboard chart from single DocTypes" msgstr "" @@ -28822,28 +29134,28 @@ msgstr "" msgid "You cannot unset 'Read Only' for field {0}" msgstr "" -#: public/js/frappe/form/footer/version_timeline_content_builder.js:121 +#: public/js/frappe/form/footer/version_timeline_content_builder.js:125 msgid "You changed the value of {0}" msgstr "" -#: public/js/frappe/form/footer/version_timeline_content_builder.js:110 +#: public/js/frappe/form/footer/version_timeline_content_builder.js:114 msgid "You changed the value of {0} {1}" msgstr "" -#: public/js/frappe/form/footer/version_timeline_content_builder.js:183 +#: public/js/frappe/form/footer/version_timeline_content_builder.js:191 msgid "You changed the values for {0}" msgstr "" -#: public/js/frappe/form/footer/version_timeline_content_builder.js:172 +#: public/js/frappe/form/footer/version_timeline_content_builder.js:180 msgid "You changed the values for {0} {1}" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:442 +#: public/js/frappe/form/footer/form_timeline.js:444 msgctxt "Form timeline" msgid "You changed {0} to {1}" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:138 +#: public/js/frappe/form/footer/form_timeline.js:140 #: public/js/frappe/form/sidebar/form_sidebar.js:106 msgid "You created this" msgstr "" @@ -28873,7 +29185,7 @@ msgstr "" msgid "You do not have permission to view this document" msgstr "" -#: public/js/frappe/form/form.js:955 +#: public/js/frappe/form/form.js:959 msgid "You do not have permissions to cancel all linked documents." msgstr "" @@ -28917,7 +29229,7 @@ msgstr "" msgid "You have hit the row size limit on database table: {0}" msgstr "" -#: public/js/frappe/list/bulk_operations.js:382 +#: public/js/frappe/list/bulk_operations.js:412 msgid "You have not entered a value. The field will be set to empty." msgstr "" @@ -28925,7 +29237,7 @@ msgstr "" msgid "You have received a ❤️ like on your blog post" msgstr "" -#: twofactor.py:448 +#: twofactor.py:432 msgid "You have to enable Two Factor Auth from System Settings." msgstr "" @@ -28945,7 +29257,7 @@ msgstr "" msgid "You haven't added any Dashboard Charts or Number Cards yet." msgstr "" -#: public/js/frappe/list/list_view.js:473 +#: public/js/frappe/list/list_view.js:470 msgid "You haven't created a {0} yet" msgstr "" @@ -28953,7 +29265,7 @@ msgstr "" msgid "You hit the rate limit because of too many requests. Please try after sometime." msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:149 +#: public/js/frappe/form/footer/form_timeline.js:151 #: public/js/frappe/form/sidebar/form_sidebar.js:95 msgid "You last edited this" msgstr "" @@ -29014,7 +29326,7 @@ msgstr "" msgid "You need to select indexes you want to add first." msgstr "" -#: email/doctype/email_account/email_account.py:147 +#: email/doctype/email_account/email_account.py:154 msgid "You need to set one IMAP folder for {0}" msgstr "" @@ -29026,7 +29338,7 @@ msgstr "" msgid "You need {0} permission to fetch values from {1} {2}" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:418 +#: public/js/frappe/form/footer/form_timeline.js:420 msgctxt "Form timeline" msgid "You removed attachment {0}" msgstr "" @@ -29035,7 +29347,7 @@ msgstr "" msgid "You seem good to go!" msgstr "" -#: public/js/frappe/list/bulk_operations.js:30 +#: public/js/frappe/list/bulk_operations.js:31 msgid "You selected Draft or Cancelled documents" msgstr "" @@ -29053,7 +29365,7 @@ msgstr "" msgid "You unfollowed this document" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:182 +#: public/js/frappe/form/footer/form_timeline.js:184 msgid "You viewed this" msgstr "" @@ -29073,7 +29385,7 @@ msgstr "" msgid "Your Name" msgstr "" -#: public/js/frappe/list/bulk_operations.js:123 +#: public/js/frappe/list/bulk_operations.js:132 msgid "Your PDF is ready for download" msgstr "" @@ -29181,7 +29493,7 @@ msgstr "" msgid "`job_id` paramater is required for deduplication." msgstr "" -#: public/js/frappe/form/footer/version_timeline_content_builder.js:219 +#: public/js/frappe/form/footer/version_timeline_content_builder.js:232 msgid "added rows for {0}" msgstr "" @@ -29661,7 +29973,7 @@ msgstr "" msgid "red" msgstr "" -#: public/js/frappe/form/footer/version_timeline_content_builder.js:221 +#: public/js/frappe/form/footer/version_timeline_content_builder.js:234 msgid "removed rows for {0}" msgstr "" @@ -29775,7 +30087,7 @@ msgstr "" msgid "text in document type" msgstr "" -#: public/js/frappe/form/controls/data.js:35 +#: public/js/frappe/form/controls/data.js:36 msgid "this form" msgstr "" @@ -29820,7 +30132,7 @@ msgstr "" msgid "via Google Meet" msgstr "" -#: email/doctype/notification/notification.py:215 +#: email/doctype/notification/notification.py:281 msgid "via Notification" msgstr "" @@ -29888,12 +30200,12 @@ msgstr "" msgid "{0} ${type}" msgstr "" -#: public/js/frappe/data_import/data_exporter.js:79 +#: public/js/frappe/data_import/data_exporter.js:80 #: public/js/frappe/views/gantt/gantt_view.js:54 msgid "{0} ({1})" msgstr "" -#: public/js/frappe/data_import/data_exporter.js:76 +#: public/js/frappe/data_import/data_exporter.js:77 msgid "{0} ({1}) (1 row mandatory)" msgstr "" @@ -29901,8 +30213,8 @@ msgstr "" msgid "{0} ({1}) - {2}%" msgstr "" -#: public/js/frappe/ui/toolbar/awesome_bar.js:348 -#: public/js/frappe/ui/toolbar/awesome_bar.js:351 +#: public/js/frappe/ui/toolbar/awesome_bar.js:371 +#: public/js/frappe/ui/toolbar/awesome_bar.js:374 msgid "{0} = {1}" msgstr "" @@ -29936,14 +30248,14 @@ msgstr "" msgid "{0} Google Contacts synced." msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:463 +#: public/js/frappe/form/footer/form_timeline.js:465 msgid "{0} Liked" msgstr "" #: public/js/frappe/ui/toolbar/search_utils.js:83 #: public/js/frappe/ui/toolbar/search_utils.js:84 #: public/js/frappe/utils/utils.js:924 -#: public/js/frappe/widgets/chart_widget.js:317 www/list.html:4 www/list.html:8 +#: public/js/frappe/widgets/chart_widget.js:318 www/list.html:4 www/list.html:8 msgid "{0} List" msgstr "" @@ -29963,14 +30275,14 @@ msgstr "" msgid "{0} Name" msgstr "" -#: model/base_document.py:1065 +#: model/base_document.py:1066 msgid "{0} Not allowed to change {1} after submission from {2} to {3}" msgstr "" #: public/js/frappe/ui/toolbar/search_utils.js:95 #: public/js/frappe/ui/toolbar/search_utils.js:96 #: public/js/frappe/utils/utils.js:921 -#: public/js/frappe/widgets/chart_widget.js:325 +#: public/js/frappe/widgets/chart_widget.js:326 msgid "{0} Report" msgstr "" @@ -29989,11 +30301,7 @@ msgstr "" msgid "{0} Tree" msgstr "" -#: public/js/frappe/list/base_list.js:209 -msgid "{0} View" -msgstr "" - -#: public/js/frappe/form/footer/form_timeline.js:126 +#: public/js/frappe/form/footer/form_timeline.js:128 #: public/js/frappe/form/sidebar/form_sidebar.js:86 msgid "{0} Web page views" msgstr "" @@ -30007,7 +30315,7 @@ msgstr "" msgid "{0} added" msgstr "" -#: public/js/frappe/form/controls/data.js:203 +#: public/js/frappe/form/controls/data.js:204 msgid "{0} already exists. Select another name" msgstr "" @@ -30065,7 +30373,7 @@ msgstr "" msgid "{0} assigned {1}: {2}" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:414 +#: public/js/frappe/form/footer/form_timeline.js:416 msgctxt "Form timeline" msgid "{0} attached {1}" msgstr "" @@ -30087,23 +30395,23 @@ msgstr "" msgid "{0} cannot be hidden and mandatory without any default value" msgstr "" -#: public/js/frappe/form/footer/version_timeline_content_builder.js:124 +#: public/js/frappe/form/footer/version_timeline_content_builder.js:128 msgid "{0} changed the value of {1}" msgstr "" -#: public/js/frappe/form/footer/version_timeline_content_builder.js:115 +#: public/js/frappe/form/footer/version_timeline_content_builder.js:119 msgid "{0} changed the value of {1} {2}" msgstr "" -#: public/js/frappe/form/footer/version_timeline_content_builder.js:186 +#: public/js/frappe/form/footer/version_timeline_content_builder.js:194 msgid "{0} changed the values for {1}" msgstr "" -#: public/js/frappe/form/footer/version_timeline_content_builder.js:177 +#: public/js/frappe/form/footer/version_timeline_content_builder.js:185 msgid "{0} changed the values for {1} {2}" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:443 +#: public/js/frappe/form/footer/form_timeline.js:445 msgctxt "Form timeline" msgid "{0} changed {1} to {2}" msgstr "" @@ -30120,7 +30428,7 @@ msgstr "" msgid "{0} created successfully" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:139 +#: public/js/frappe/form/footer/form_timeline.js:141 #: public/js/frappe/form/sidebar/form_sidebar.js:107 msgid "{0} created this" msgstr "" @@ -30172,11 +30480,11 @@ msgstr "" msgid "{0} format could not be determined from the values in this column. Defaulting to {1}." msgstr "" -#: public/js/frappe/form/footer/version_timeline_content_builder.js:97 +#: public/js/frappe/form/footer/version_timeline_content_builder.js:101 msgid "{0} from {1} to {2}" msgstr "" -#: public/js/frappe/form/footer/version_timeline_content_builder.js:157 +#: public/js/frappe/form/footer/version_timeline_content_builder.js:165 msgid "{0} from {1} to {2} in row #{3}" msgstr "" @@ -30212,7 +30520,7 @@ msgstr "" msgid "{0} has left the conversation in {1} {2}" msgstr "" -#: __init__.py:2493 +#: __init__.py:2499 msgid "{0} has no versions tracked." msgstr "" @@ -30278,7 +30586,7 @@ msgstr "" msgid "{0} is like {1}" msgstr "" -#: email/doctype/email_account/email_account.py:176 +#: email/doctype/email_account/email_account.py:187 msgid "{0} is mandatory" msgstr "" @@ -30358,7 +30666,7 @@ msgstr "" msgid "{0} is one of {1}" msgstr "" -#: email/doctype/email_account/email_account.py:277 model/naming.py:217 +#: email/doctype/email_account/email_account.py:294 model/naming.py:217 #: printing/doctype/print_format/print_format.py:91 utils/csvutils.py:153 msgid "{0} is required" msgstr "" @@ -30371,15 +30679,15 @@ msgstr "" msgid "{0} is within {1}" msgstr "" -#: public/js/frappe/list/list_view.js:1601 +#: public/js/frappe/list/list_view.js:1655 msgid "{0} items selected" msgstr "" -#: core/doctype/user/user.py:1328 +#: core/doctype/user/user.py:1347 msgid "{0} just impersonated as you. They gave this reason: {1}" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:150 +#: public/js/frappe/form/footer/form_timeline.js:152 #: public/js/frappe/form/sidebar/form_sidebar.js:96 msgid "{0} last edited this" msgstr "" @@ -30442,11 +30750,11 @@ msgstr "" msgid "{0} not found" msgstr "" -#: core/doctype/report/report.py:413 public/js/frappe/list/list_view.js:992 +#: core/doctype/report/report.py:413 public/js/frappe/list/list_view.js:1029 msgid "{0} of {1}" msgstr "" -#: public/js/frappe/list/list_view.js:994 +#: public/js/frappe/list/list_view.js:1031 msgid "{0} of {1} ({2} rows with children)" msgstr "" @@ -30479,11 +30787,11 @@ msgstr "" msgid "{0} records deleted" msgstr "" -#: public/js/frappe/data_import/data_exporter.js:228 +#: public/js/frappe/data_import/data_exporter.js:229 msgid "{0} records will be exported" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:419 +#: public/js/frappe/form/footer/form_timeline.js:421 msgctxt "Form timeline" msgid "{0} removed attachment {1}" msgstr "" @@ -30575,7 +30883,7 @@ msgstr "" msgid "{0} values selected" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:183 +#: public/js/frappe/form/footer/form_timeline.js:185 msgid "{0} viewed this" msgstr "" @@ -30607,11 +30915,11 @@ msgstr "" msgid "{0} {1} already exists" msgstr "" -#: model/base_document.py:908 +#: model/base_document.py:909 msgid "{0} {1} cannot be \"{2}\". It should be one of \"{3}\"" msgstr "" -#: utils/nestedset.py:337 +#: utils/nestedset.py:340 msgid "{0} {1} cannot be a leaf node as it has children" msgstr "" @@ -30619,7 +30927,7 @@ msgstr "" msgid "{0} {1} does not exist, select a new target to merge" msgstr "" -#: public/js/frappe/form/form.js:946 +#: public/js/frappe/form/form.js:950 msgid "{0} {1} is linked with the following submitted documents: {2}" msgstr "" @@ -30627,15 +30935,15 @@ msgstr "" msgid "{0} {1} not found" msgstr "" -#: model/delete_doc.py:242 +#: model/delete_doc.py:251 msgid "{0} {1}: Submitted Record cannot be deleted. You must {2} Cancel {3} it first." msgstr "" -#: model/base_document.py:1026 +#: model/base_document.py:1027 msgid "{0}, Row {1}" msgstr "" -#: model/base_document.py:1031 +#: model/base_document.py:1032 msgid "{0}: '{1}' ({3}) will get truncated, as max characters allowed is {2}" msgstr "" @@ -30719,7 +31027,7 @@ msgstr "" msgid "{0}: Permission at level 0 must be set before higher levels are set" msgstr "" -#: public/js/frappe/form/controls/data.js:50 +#: public/js/frappe/form/controls/data.js:51 msgid "{0}: You can increase the limit for the field if required via {1}" msgstr "" @@ -30728,8 +31036,8 @@ msgid "{0}: fieldname cannot be set to reserved keyword {1}" msgstr "" #: contacts/doctype/address/address.js:35 -#: contacts/doctype/contact/contact.js:83 -#: public/js/frappe/views/workspace/workspace.js:170 +#: contacts/doctype/contact/contact.js:88 +#: public/js/frappe/views/workspace/workspace.js:209 msgid "{0}: {1}" msgstr "" @@ -30767,7 +31075,6 @@ msgstr "" #. Count format of shortcut in the Website Workspace #: website/workspace/website/website.json -msgctxt "Blogger" msgid "{} Active" msgstr "" @@ -30785,13 +31092,6 @@ msgstr "" #. Count format of shortcut in the Website Workspace #: website/workspace/website/website.json -msgctxt "Blog Post" -msgid "{} Published" -msgstr "" - -#. Count format of shortcut in the Website Workspace -#: website/workspace/website/website.json -msgctxt "Web Page" msgid "{} Published" msgstr "" @@ -30803,8 +31103,8 @@ msgstr "" msgid "{} field cannot be empty." msgstr "" -#: email/doctype/email_account/email_account.py:200 -#: email/doctype/email_account/email_account.py:208 +#: email/doctype/email_account/email_account.py:217 +#: email/doctype/email_account/email_account.py:225 msgid "{} has been disabled. It can only be enabled if {} is checked." msgstr "" @@ -30824,3 +31124,8 @@ msgstr "" msgid "{} not found in PATH! This is required to take a backup." msgstr "" +#: public/js/frappe/file_uploader/FileBrowser.vue:5 +#: public/js/frappe/file_uploader/WebLink.vue:4 +msgid "← Back to upload files" +msgstr "" + diff --git a/frappe/locale/sv.po b/frappe/locale/sv.po index 40911e214d..4e1e7877d5 100644 --- a/frappe/locale/sv.po +++ b/frappe/locale/sv.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: frappe\n" "Report-Msgid-Bugs-To: developers@frappe.io\n" -"POT-Creation-Date: 2024-06-30 09:33+0000\n" -"PO-Revision-Date: 2024-07-02 15:49\n" +"POT-Creation-Date: 2024-07-21 09:33+0000\n" +"PO-Revision-Date: 2024-07-23 01:05\n" "Last-Translator: developers@frappe.io\n" "Language-Team: Swedish\n" "MIME-Version: 1.0\n" @@ -44,7 +44,7 @@ msgstr "'Överordnad' betyder överordnad tabell där denna rad skall infogas" msgid "\"Team Members\" or \"Management\"" msgstr "\"Team Medlemmar\" eller \"Ledning\"" -#: public/js/frappe/form/form.js:1085 +#: public/js/frappe/form/form.js:1089 msgid "\"amended_from\" field must be present to do an amendment." msgstr "'amend_from' fält måste finnas att skapa ändring." @@ -98,7 +98,7 @@ msgstr "'{0}' är inte en giltig webbadress" msgid "'{0}' not allowed for type {1} in row {2}" msgstr "'{0}' är otillåtet för typ {1} på rad {2}" -#: public/js/frappe/data_import/data_exporter.js:301 +#: public/js/frappe/data_import/data_exporter.js:302 msgid "(Mandatory)" msgstr "(Erfodrad)" @@ -168,7 +168,7 @@ msgstr "1 minut sedan" msgid "1 month ago" msgstr "1 månad sedan" -#: public/js/frappe/data_import/data_exporter.js:226 +#: public/js/frappe/data_import/data_exporter.js:227 msgid "1 record will be exported" msgstr "1 post exporteras" @@ -540,7 +540,7 @@ msgstr "

E-post Svar Exempel

\n\n" "- Kund: {{ customer }}\n" "- Belopp: {{ grand_total }}\n" "\n\n" -"

Hur man får fältnamn

\n\n" +"

Hur hämtas fältnamn

\n\n" "

Fältnamn som kan använda i e-post mall är fält i dokument som du skickar e-post meddelande från. Ta reda på fält namn för alla dokument via Inställningar > Anpassa formulär vy och välja dokument typ (t.ex. Försäljning Faktura)

\n\n" "

Mallar

\n\n" "

Mallar kompileras med Jinja Templating Language. För att lära dig mer om Jinja, läs denna dokumentation.

\n" @@ -627,7 +627,7 @@ msgstr "

För att interagera med ovanstående HTML måste du använda `root_el "some_class_element.textContent = \"Ny innehåll\";\n" "" -#: twofactor.py:462 +#: twofactor.py:446 msgid "

Your OTP secret on {0} has been reset. If you did not perform this reset and did not request it, please contact your System Administrator immediately.

" msgstr "

Din OTP-hemlighet på {0} har återställts. Om du inte utförde denna återställning och inte begärde den, kontakta din systemadministratör omedelbart.

" @@ -838,10 +838,11 @@ msgid "API Endpoint Args" msgstr "API Slutpunkt Argument" #. Label of the api_key (Data) field in DocType 'User' +#. Label of the api_key (Data) field in DocType 'Email Account' #. Label of the api_key (Data) field in DocType 'Google Settings' #. Label of the sb_01 (Section Break) field in DocType 'Google Settings' #. Label of the api_key (Data) field in DocType 'Push Notification Settings' -#: core/doctype/user/user.json +#: core/doctype/user/user.json email/doctype/email_account/email_account.json #: integrations/doctype/google_settings/google_settings.json #: integrations/doctype/push_notification_settings/push_notification_settings.json msgid "API Key" @@ -864,9 +865,10 @@ msgid "API Method" msgstr "API Metod" #. Label of the api_secret (Password) field in DocType 'User' +#. Label of the api_secret (Password) field in DocType 'Email Account' #. Label of the api_secret (Password) field in DocType 'Push Notification #. Settings' -#: core/doctype/user/user.json +#: core/doctype/user/user.json email/doctype/email_account/email_account.json #: integrations/doctype/push_notification_settings/push_notification_settings.json msgid "API Secret" msgstr "API Hemlighet " @@ -1102,7 +1104,7 @@ msgstr "Aktiva Sessioner" #. Group in User's connections #: core/doctype/user/user.json public/js/frappe/form/dashboard.js:22 -#: public/js/frappe/form/footer/form_timeline.js:58 +#: public/js/frappe/form/footer/form_timeline.js:60 msgid "Activity" msgstr "Aktivitet" @@ -1131,11 +1133,6 @@ msgstr "Aktivitet Logg" msgid "Add" msgstr "Lägga till" -#: public/js/frappe/list/list_view.js:266 -msgctxt "Primary action in list view" -msgid "Add" -msgstr "Lägg till" - #: public/js/frappe/form/grid_row.js:431 msgid "Add / Remove Columns" msgstr "Lägg till/Ta Bort Kolumn" @@ -1173,6 +1170,10 @@ msgstr "Lägg till Kant Längst Ner" msgid "Add Border at Top" msgstr "Lägg till Kant Längst Upp" +#: desk/doctype/number_card/number_card.js:36 +msgid "Add Card to Dashboard" +msgstr "Lägg till i Översikt Panel" + #: public/js/frappe/views/reports/query_report.js:210 msgid "Add Chart to Dashboard" msgstr "Lägg till Diagram i Översikt Panel" @@ -1182,8 +1183,8 @@ msgid "Add Child" msgstr "Lägg till Underval" #: public/js/frappe/views/kanban/kanban_board.html:4 -#: public/js/frappe/views/reports/query_report.js:1696 -#: public/js/frappe/views/reports/query_report.js:1699 +#: public/js/frappe/views/reports/query_report.js:1681 +#: public/js/frappe/views/reports/query_report.js:1684 #: public/js/frappe/views/reports/report_view.js:324 #: public/js/frappe/views/reports/report_view.js:349 msgid "Add Column" @@ -1247,7 +1248,7 @@ msgstr "Lägg till Fråge Parametrar" msgid "Add Review" msgstr "Lägg till Recension" -#: core/doctype/user/user.py:757 +#: core/doctype/user/user.py:772 msgid "Add Roles" msgstr "Lägg till Roller" @@ -1280,7 +1281,7 @@ msgstr "Lägg till Prenumeranter" msgid "Add Tags" msgstr "Lägg till Taggar" -#: public/js/frappe/list/list_view.js:1903 +#: public/js/frappe/list/list_view.js:1957 msgctxt "Button in list view actions menu" msgid "Add Tags" msgstr "Lägg till Taggar" @@ -1292,7 +1293,7 @@ msgstr "Lägg till Mall" #. Label of the add_total_row (Check) field in DocType 'Report' #: core/doctype/report/report.json msgid "Add Total Row" -msgstr "Lägg till Totalt Rad" +msgstr "Lägg till Totalt Antal Rader" #. Label of the add_unsubscribe_link (Check) field in DocType 'Email Queue' #: email/doctype/email_queue/email_queue.json @@ -1316,7 +1317,7 @@ msgstr "Lägg till Filter" msgid "Add a New Role" msgstr "Lägg till Ny Regel " -#: public/js/frappe/form/form_tour.js:205 +#: public/js/frappe/form/form_tour.js:211 msgid "Add a Row" msgstr "Lägg till Rad" @@ -1366,7 +1367,7 @@ msgstr "Lägg till i Att-Göra lista" msgid "Add to table" msgstr "Lägg till Tabell" -#: public/js/frappe/form/footer/form_timeline.js:97 +#: public/js/frappe/form/footer/form_timeline.js:99 msgid "Add to this activity by mailing to {0}" msgstr "Lägg till den här aktiviteten genom att skicka E-post till {0}" @@ -1374,6 +1375,11 @@ msgstr "Lägg till den här aktiviteten genom att skicka E-post till {0}" msgid "Add {0}" msgstr "Lägg till {0} " +#: public/js/frappe/list/list_view.js:264 +msgctxt "Primary action in list view" +msgid "Add {0}" +msgstr "Lägg till {0} " + #. Description of the '<head> HTML' (Code) field in DocType 'Website #. Settings' #: website/doctype/website_settings/website_settings.json @@ -1397,8 +1403,11 @@ msgstr "la till {0} ({1})" #. DocPerm' #. Label of the additional_permissions (Section Break) field in DocType #. 'DocPerm' +#. Label of the additional_permissions_section (Section Break) field in DocType +#. 'User Document Type' #: core/doctype/custom_docperm/custom_docperm.json #: core/doctype/docperm/docperm.json +#: core/doctype/user_document_type/user_document_type.json msgid "Additional Permissions" msgstr "Extra Behörigheter" @@ -1493,11 +1502,11 @@ msgstr "Administration" msgid "Administrator" msgstr "Administratör" -#: core/doctype/user/user.py:1161 +#: core/doctype/user/user.py:1176 msgid "Administrator Logged In" msgstr "Administratör Inloggad" -#: core/doctype/user/user.py:1155 +#: core/doctype/user/user.py:1170 msgid "Administrator accessed {0} on {1} via IP Address {2}." msgstr "Administratör loggade in {0} {1} via IP Adress {2}." @@ -1653,7 +1662,7 @@ msgstr "Alla Bilder bifogade till Hemsida Bildspel ska vara publika" msgid "All Records" msgstr "Alla Poster" -#: public/js/frappe/form/form.js:2225 +#: public/js/frappe/form/form.js:2230 msgid "All Submissions" msgstr "Alla Godkännande" @@ -1971,11 +1980,11 @@ msgstr "Tillåtna Moduler" msgid "Allowed Roles" msgstr "Tillåtna Roller" -#: public/js/frappe/form/form.js:1251 +#: public/js/frappe/form/form.js:1255 msgid "Allowing DocType, DocType. Be careful!" msgstr "Tillåter DocType, DocType. Var försiktig!" -#: core/doctype/user/user.py:964 +#: core/doctype/user/user.py:979 msgid "Already Registered" msgstr "Redan Registrerad" @@ -2187,11 +2196,11 @@ msgstr "App Namn" msgid "App Secret Key" msgstr "Hemliget" -#: modules/utils.py:275 +#: modules/utils.py:279 msgid "App not found for module: {0}" msgstr "App hittades inte för modul: {0}" -#: __init__.py:1794 +#: __init__.py:1800 msgid "App {0} is not installed" msgstr "App {0} är inte installerad" @@ -2211,7 +2220,7 @@ msgstr "Lägg E-post meddelande till Skickad Mapp" msgid "Append To" msgstr "E-post Till" -#: email/doctype/email_account/email_account.py:185 +#: email/doctype/email_account/email_account.py:195 msgid "Append To can be one of {0}" msgstr "E-post Till kan vara en av {0}" @@ -2252,7 +2261,7 @@ msgstr "Applikation Version" msgid "Applied On" msgstr "Tillämpad På" -#: public/js/frappe/list/list_view.js:1888 +#: public/js/frappe/list/list_view.js:1942 msgctxt "Button in list view actions menu" msgid "Apply Assignment Rule" msgstr "Tillämpa Tilldelning Regel" @@ -2346,7 +2355,7 @@ msgstr "Arkiverad" msgid "Archived Columns" msgstr "Arkiverade Kolumner" -#: public/js/frappe/list/list_view.js:1867 +#: public/js/frappe/list/list_view.js:1921 msgid "Are you sure you want to clear the assignments?" msgstr "Är du säker på att du vill ta bort tilldelningar?" @@ -2442,7 +2451,7 @@ msgstr "Tilldela Villkor" msgid "Assign To" msgstr "Tilldela till" -#: public/js/frappe/list/list_view.js:1849 +#: public/js/frappe/list/list_view.js:1903 msgctxt "Button in list view actions menu" msgid "Assign To" msgstr "Tilldela till" @@ -2561,7 +2570,7 @@ msgstr "Tilldelning Regel är ej tillåtet på {0} dokument typ" msgid "Assignment Rules" msgstr "Tilldelning Regler" -#: desk/doctype/notification_log/notification_log.py:157 +#: desk/doctype/notification_log/notification_log.py:158 msgid "Assignment Update on {0}" msgstr "Tilldelning Uppdatering {0}" @@ -2749,7 +2758,15 @@ msgstr "Autentisering" msgid "Authentication Apps you can use are: " msgstr "Autentisering App som kan användas är: " -#: email/doctype/email_account/email_account.py:312 +#: email/frappemail.py:89 +msgid "Authentication Error: Invalid API Key or Secret" +msgstr "Autentiseringsfel: Ogiltig API Nyckel eller Hemlighet" + +#: email/frappemail.py:85 +msgid "Authentication Error: Reauthorize OAuth for Email Account {0}." +msgstr "Autentiseringsfel: Återauktorisera OAuth för E-post Konto {0}." + +#: email/doctype/email_account/email_account.py:328 msgid "Authentication failed while receiving emails from Email Account: {0}." msgstr "Autentisering misslyckades när E-post meddelande togs emot från E-post Konto: {0}." @@ -2963,11 +2980,11 @@ msgstr "Automatiskt Meddelande" msgid "Automatic" msgstr "Automatisk" -#: email/doctype/email_account/email_account.py:715 +#: email/doctype/email_account/email_account.py:766 msgid "Automatic Linking can be activated only for one Email Account." msgstr "Automatisk länkning kan endast aktiveras för ett E-post konto." -#: email/doctype/email_account/email_account.py:709 +#: email/doctype/email_account/email_account.py:760 msgid "Automatic Linking can be activated only if Incoming is enabled." msgstr "Automatisk länkning kan endast aktiveras om Inkommande E-post är aktiverad." @@ -3154,7 +3171,7 @@ msgstr "Bakgrund Jobb" #. Report' #: desk/doctype/system_health_report/system_health_report.json msgid "Background Jobs Check" -msgstr "Bakgrund Jobb Koll" +msgstr "Bakgrund Jobb Status" #. Label of the background_jobs_queue (Autocomplete) field in DocType 'Webhook' #: integrations/doctype/webhook/webhook.json @@ -3407,7 +3424,7 @@ msgstr "Faktura Kontakt" #. Label of the binary_logging (Data) field in DocType 'System Health Report' #: desk/doctype/system_health_report/system_health_report.json msgid "Binary Logging" -msgstr "Fakturering Logg" +msgstr "Binär Logg" #. Label of the bio (Small Text) field in DocType 'User' #. Label of the bio (Small Text) field in DocType 'About Us Team Member' @@ -3899,6 +3916,7 @@ msgstr "Kalender Namn" #. Name of a DocType #: desk/doctype/calendar_view/calendar_view.json +#: public/js/frappe/list/base_list.js:208 msgid "Calendar View" msgstr "Kalender Vy" @@ -4005,7 +4023,7 @@ msgstr "Kan inte byta namn på {0} till {1} eftersom {0} inte finns." msgid "Cancel" msgstr "Annullera" -#: public/js/frappe/list/list_view.js:1958 +#: public/js/frappe/list/list_view.js:2012 msgctxt "Button in list view actions menu" msgid "Cancel" msgstr "Annullera" @@ -4015,11 +4033,11 @@ msgctxt "Secondary button in warning dialog" msgid "Cancel" msgstr "Annullera" -#: public/js/frappe/form/form.js:974 +#: public/js/frappe/form/form.js:978 msgid "Cancel All" msgstr "Annullera" -#: public/js/frappe/form/form.js:961 +#: public/js/frappe/form/form.js:965 msgid "Cancel All Documents" msgstr "Annullera Alla Dokument" @@ -4027,7 +4045,7 @@ msgstr "Annullera Alla Dokument" msgid "Cancel Scheduling" msgstr "Annullera Schemaläggning" -#: public/js/frappe/list/list_view.js:1963 +#: public/js/frappe/list/list_view.js:2017 msgctxt "Title of confirmation dialog" msgid "Cancel {0} documents?" msgstr "Annullera {0} dokument?" @@ -4075,7 +4093,7 @@ msgstr "Kan inte Hämta Värden" msgid "Cannot Remove" msgstr "Kan inte Ta Bort" -#: model/base_document.py:1072 +#: model/base_document.py:1073 msgid "Cannot Update After Submit" msgstr "Kan inte Uppdatera efter Godkännande" @@ -4127,7 +4145,7 @@ msgstr "Kan inte skapa privat arbetsyta för andra användare" msgid "Cannot delete Home and Attachments folders" msgstr "Kan inte radera Hem och Bilaga mappar" -#: model/delete_doc.py:373 +#: model/delete_doc.py:382 msgid "Cannot delete or cancel because {0} {1} is linked with {2} {3} {4}" msgstr "Kan inte ta bort eller annullera eftersom {0} {1} är länkat till {2} {3} {4}" @@ -4163,7 +4181,7 @@ msgstr "Kan inte ta bort system skapad fält {0}. Dölj det ist msgid "Cannot delete {0}" msgstr "Kan inte radera {0}" -#: utils/nestedset.py:296 +#: utils/nestedset.py:299 msgid "Cannot delete {0} as it has child nodes" msgstr "Kan inte radera {0} eftersom det har underordnade noder" @@ -4171,7 +4189,7 @@ msgstr "Kan inte radera {0} eftersom det har underordnade noder" msgid "Cannot edit Standard Dashboards" msgstr "Kan inte redigera standard översikt panel" -#: email/doctype/notification/notification.py:121 +#: email/doctype/notification/notification.py:122 msgid "Cannot edit Standard Notification. To edit, please disable this and duplicate it" msgstr "Kan inte redigera standard avisering. Kopiera och skapa ny" @@ -4240,9 +4258,9 @@ msgstr "Kan inte ta bort ID fält" msgid "Cannot set 'Report' permission if 'Only If Creator' permission is set" msgstr "Kan inte ange \"Rapport\" behörighet om behörighet \"Endast om Ägare\" är angiven" -#: email/doctype/notification/notification.py:137 -msgid "Cannot set Notification on Document Type {0}" -msgstr "Kan inte ange Avisering för DocType {0}" +#: email/doctype/notification/notification.py:139 +msgid "Cannot set Notification with event {0} on Document Type {1}" +msgstr "Kan inte ange Avisering med händelse {0} på Dokument Typ {1}" #: core/doctype/docshare/docshare.py:67 msgid "Cannot share {0} with submit permission as the doctype {1} is not submittable" @@ -4354,7 +4372,7 @@ msgstr "Ändra" #: tests/test_translate.py:99 msgctxt "Coins" msgid "Change" -msgstr "Ändra" +msgstr "Växel" #. Label of the label (Data) field in DocType 'Customize Form' #: custom/doctype/customize_form/customize_form.json @@ -4415,6 +4433,8 @@ msgstr "Diagram Inställningar" #. Label of the chart_name (Link) field in DocType 'Workspace Chart' #: desk/doctype/dashboard_chart/dashboard_chart.json #: desk/doctype/workspace_chart/workspace_chart.json +#: public/js/frappe/views/reports/query_report.js:289 +#: public/js/frappe/widgets/widget_dialog.js:137 msgid "Chart Name" msgstr "Diagram Namn" @@ -4587,7 +4607,7 @@ msgstr "Rensa & Lägg till Mall" msgid "Clear & Add template" msgstr "Rensa & Lägg till Mall" -#: public/js/frappe/list/list_view.js:1864 +#: public/js/frappe/list/list_view.js:1918 msgctxt "Button in list view actions menu" msgid "Clear Assignment" msgstr "Rensa Tilldelning" @@ -4686,7 +4706,7 @@ msgstr "Klicka på att Ange Dynamisk Filter" msgid "Click to Set Filters" msgstr "Klicka på att Ange Filter" -#: public/js/frappe/list/list_view.js:680 +#: public/js/frappe/list/list_view.js:679 msgid "Click to sort by {0}" msgstr "Klicka på att sortera efter {0}" @@ -4766,7 +4786,8 @@ msgid "Client URLs" msgstr "Klient Adresser" #: core/doctype/communication/communication.js:39 desk/doctype/todo/todo.js:23 -#: public/js/frappe/ui/messages.js:243 website/js/bootstrap-4.js:24 +#: public/js/frappe/form/form_tour.js:17 public/js/frappe/ui/messages.js:244 +#: website/js/bootstrap-4.js:24 msgid "Close" msgstr "Stäng" @@ -4821,7 +4842,7 @@ msgstr "Kod Redigerare Typ" msgid "Code challenge method" msgstr "Kod utmaning sätt" -#: public/js/frappe/form/form_tour.js:270 +#: public/js/frappe/form/form_tour.js:276 #: public/js/frappe/widgets/base_widget.js:159 msgid "Collapse" msgstr "Fäll In" @@ -4831,7 +4852,7 @@ msgctxt "Shrink code field." msgid "Collapse" msgstr "Fäll In" -#: public/js/frappe/views/reports/query_report.js:1979 +#: public/js/frappe/views/reports/query_report.js:1964 #: public/js/frappe/views/treeview.js:121 msgid "Collapse All" msgstr "Fäll In Alla" @@ -5123,7 +5144,7 @@ msgstr "Klar" msgid "Complete By" msgstr "Klar Senast" -#: core/doctype/user/user.py:426 templates/emails/new_user.html:10 +#: core/doctype/user/user.py:432 templates/emails/new_user.html:10 msgid "Complete Registration" msgstr "Slutför Registrering" @@ -5687,7 +5708,7 @@ msgstr "Skapa Logg" msgid "Create New" msgstr "Skapa Ny" -#: public/js/frappe/list/list_view.js:487 +#: public/js/frappe/list/list_view.js:484 msgctxt "Create a new document from list view" msgid "Create New" msgstr "Skapa Ny " @@ -5727,7 +5748,7 @@ msgstr "Skapa ny Post" #: public/js/frappe/form/controls/link.js:295 #: public/js/frappe/form/controls/link.js:297 #: public/js/frappe/form/link_selector.js:139 -#: public/js/frappe/list/list_view.js:476 +#: public/js/frappe/list/list_view.js:473 #: public/js/frappe/web_form/web_form_list.js:225 msgid "Create a new {0}" msgstr "Skapa {0}" @@ -5754,7 +5775,7 @@ msgstr "Skapa eller Redigera Utskrift Format" msgid "Create or Edit Workflow" msgstr "Skapa eller Redigera Arbetsflöde" -#: public/js/frappe/list/list_view.js:479 +#: public/js/frappe/list/list_view.js:476 msgid "Create your first {0}" msgstr "Skapa {0}" @@ -5785,7 +5806,7 @@ msgid "Created Custom Field {0} in {1}" msgstr "Skapade Anpassad Fält {0} i {1}" #: desk/doctype/dashboard_chart/dashboard_chart.js:241 -#: email/doctype/notification/notification.js:30 model/meta.py:46 +#: email/doctype/notification/notification.js:33 model/meta.py:46 #: public/js/frappe/model/meta.js:198 public/js/frappe/model/model.js:125 #: public/js/frappe/views/dashboard/dashboard_view.js:478 msgid "Created On" @@ -6144,7 +6165,7 @@ msgstr "Anpassningar Bortkastade" msgid "Customizations Reset" msgstr "Anpassningar Återställda " -#: modules/utils.py:91 +#: modules/utils.py:95 msgid "Customizations for {0} exported to:
{1}" msgstr "Anpassningar för {0} som exporterades till:
{1}" @@ -6155,7 +6176,7 @@ msgstr "Anpassningar för {0} som exporterades till:
{1}" msgid "Customize" msgstr "Anpassa" -#: public/js/frappe/list/list_view.js:1709 +#: public/js/frappe/list/list_view.js:1763 msgctxt "Button in list view menu" msgid "Customize" msgstr "Anpassa" @@ -6170,6 +6191,7 @@ msgstr "Anpassa Översikt Panel" #. Name of a DocType #: automation/doctype/auto_repeat/auto_repeat.js:33 +#: core/doctype/doctype/doctype.js:65 #: custom/doctype/customize_form/customize_form.json #: public/js/frappe/views/kanban/kanban_view.js:343 msgid "Customize Form" @@ -6362,6 +6384,10 @@ msgstr "Översikt Panel Namn" msgid "Dashboard Settings" msgstr "Översikt Panel Inställningar" +#: public/js/frappe/list/base_list.js:205 +msgid "Dashboard View" +msgstr "Översikt Panel Vy" + #. Label of the tab_break_2 (Tab Break) field in DocType 'Workspace' #: desk/doctype/workspace/workspace.json msgid "Dashboards" @@ -6396,7 +6422,7 @@ msgstr "Översikt Paneler" msgid "Data" msgstr "Data" -#: public/js/frappe/form/controls/data.js:58 +#: public/js/frappe/form/controls/data.js:59 msgid "Data Clipped" msgstr "Data Urklippt" @@ -6501,6 +6527,7 @@ msgstr "Datum Format" #. Trail' #: core/doctype/audit_trail/audit_trail.json #: desk/page/leaderboard/leaderboard.js:165 +#: public/js/frappe/widgets/chart_widget.js:237 msgid "Date Range" msgstr "Datum Intervall" @@ -6634,7 +6661,7 @@ msgstr "Standard Inkorg" #. Label of the default_incoming (Check) field in DocType 'Email Account' #: email/doctype/email_account/email_account.json -#: email/doctype/email_account/email_account.py:201 +#: email/doctype/email_account/email_account.py:217 msgid "Default Incoming" msgstr "Standard Inkommande" @@ -6654,7 +6681,7 @@ msgstr "Standard Nummer Serie" #. Label of the default_outgoing (Check) field in DocType 'Email Account' #: email/doctype/email_account/email_account.json -#: email/doctype/email_account/email_account.py:209 +#: email/doctype/email_account/email_account.py:225 msgid "Default Outgoing" msgstr "Standard Utgående" @@ -6769,7 +6796,7 @@ msgstr "Standard Värde" msgid "Defaults" msgstr "Standard" -#: email/doctype/email_account/email_account.py:220 +#: email/doctype/email_account/email_account.py:236 msgid "Defaults Updated" msgstr "Standard Inställningar Uppdaterade" @@ -6795,7 +6822,7 @@ msgstr "Försenad" #: core/doctype/docperm/docperm.json #: core/doctype/user_document_type/user_document_type.json #: core/doctype/user_permission/user_permission_list.js:189 -#: public/js/frappe/form/footer/form_timeline.js:613 +#: public/js/frappe/form/footer/form_timeline.js:615 #: public/js/frappe/form/grid.js:63 public/js/frappe/form/toolbar.js:434 #: public/js/frappe/views/reports/report_view.js:1654 #: public/js/frappe/views/treeview.js:308 @@ -6805,7 +6832,7 @@ msgstr "Försenad" msgid "Delete" msgstr "Ta Bort" -#: public/js/frappe/list/list_view.js:1926 +#: public/js/frappe/list/list_view.js:1980 msgctxt "Button in list view actions menu" msgid "Delete" msgstr "Ta Bort" @@ -6834,7 +6861,7 @@ msgstr "Ta Bort Arbetsyta" msgid "Delete and Generate New" msgstr "Ta bort och Skapa Ny" -#: public/js/frappe/form/footer/form_timeline.js:719 +#: public/js/frappe/form/footer/form_timeline.js:721 msgid "Delete comment?" msgstr "Ta Bort Kommentar?" @@ -6842,12 +6869,12 @@ msgstr "Ta Bort Kommentar?" msgid "Delete this record to allow sending to this email address" msgstr "Ta Bort denna post för att tillåta utskick till denna E-post" -#: public/js/frappe/list/list_view.js:1931 +#: public/js/frappe/list/list_view.js:1985 msgctxt "Title of confirmation dialog" msgid "Delete {0} item permanently?" msgstr "Ta Bort {0} Post permanent?" -#: public/js/frappe/list/list_view.js:1937 +#: public/js/frappe/list/list_view.js:1991 msgctxt "Title of confirmation dialog" msgid "Delete {0} items permanently?" msgstr "Radera {0} Poster permanent?" @@ -6943,7 +6970,8 @@ msgid "Department" msgstr "Avdelning" #. Label of the dependencies (Data) field in DocType 'Workspace Link' -#: desk/doctype/workspace_link/workspace_link.json www/attribution.html:29 +#: desk/doctype/workspace_link/workspace_link.json +#: public/js/frappe/widgets/widget_dialog.js:318 www/attribution.html:29 msgid "Dependencies" msgstr "Beroenden " @@ -7085,7 +7113,7 @@ msgstr "Skrivbord Ikon finns redan" #: desk/doctype/event/event.json #: desk/page/user_profile/user_profile_sidebar.html:45 #: public/js/form_builder/store.js:259 public/js/form_builder/utils.js:38 -#: public/js/frappe/form/layout.js:135 public/js/frappe/views/treeview.js:271 +#: public/js/frappe/form/layout.js:137 public/js/frappe/views/treeview.js:271 msgid "Details" msgstr "Detaljer" @@ -7233,7 +7261,7 @@ msgstr "Inaktivera Registrering" msgid "Disabled" msgstr "Inaktiverad" -#: email/doctype/email_account/email_account.js:232 +#: email/doctype/email_account/email_account.js:261 msgid "Disabled Auto Reply" msgstr "Inaktiverad Autosvar" @@ -7250,7 +7278,7 @@ msgctxt "Button in web form" msgid "Discard" msgstr "Avvisa" -#: public/js/frappe/form/form.js:840 +#: public/js/frappe/form/form.js:844 msgid "Discard {0}" msgstr "Avvisa {0}" @@ -7277,7 +7305,7 @@ msgstr "Diskussion Svar" msgid "Discussion Topic" msgstr "Diskussion Ämne" -#: public/js/frappe/form/footer/form_timeline.js:623 +#: public/js/frappe/form/footer/form_timeline.js:625 #: templates/discussions/reply_card.html:16 #: templates/discussions/reply_section.html:29 msgid "Dismiss" @@ -7328,7 +7356,7 @@ msgstr "Behörigheter saknas att komma åt skop {0}." msgid "Do you still want to proceed?" msgstr "Vill du fortfarande fortsätta?" -#: public/js/frappe/form/form.js:953 +#: public/js/frappe/form/form.js:957 msgid "Do you want to cancel all linked documents?" msgstr "Vill du annullera alla länkade dokument?" @@ -7405,6 +7433,7 @@ msgstr "Status för följande tillstånd är ändrad:
{0}
5, <10 or =324. For ranges, use 5:10 (for values between 5 & 10)." msgstr "För jämförelse, använd >5, <10 eller = 324. För intervall, använd 5:10 (för värden mellan 5 och 10)." @@ -10492,6 +10530,10 @@ msgstr "För jämförelse, använd >5, <10 eller = 324. För intervall, använd msgid "For example if you cancel and amend INV004 it will become a new document INV004-1. This helps you to keep track of each amendment." msgstr "Om du till exempel annullerar och ändrar INV004 skapas ny dokument INV004-1. Detta hjälper med att hålla reda på varje ändring." +#: public/js/frappe/utils/dashboard_utils.js:162 +msgid "For example:" +msgstr "Till exempel:" + #: printing/page/print_format_builder/print_format_builder.js:744 msgid "For example: If you want to include the document ID, use {0}" msgstr "Till exempel: Om du vill inkludera Dokument ID, använd {0}" @@ -10671,6 +10713,20 @@ msgstr "Frappe Framework" msgid "Frappe Light" msgstr "Frappe Light" +#. Option for the 'Service' (Select) field in DocType 'Email Account' +#: email/doctype/email_account/email_account.json email/frappemail.py:91 +msgid "Frappe Mail" +msgstr "Frappe Mail" + +#: email/doctype/email_account/email_account.py:538 +msgid "Frappe Mail OAuth Error" +msgstr "Frappe Mail OAuth fel" + +#. Label of the frappe_mail_site (Data) field in DocType 'Email Account' +#: email/doctype/email_account/email_account.json +msgid "Frappe Mail Site" +msgstr "Frappe Mail Site" + #. Label of a standard help item #. Type: Action #: hooks.py @@ -10730,7 +10786,7 @@ msgstr "Från Datum" msgid "From Date Field" msgstr "Från Datum" -#: public/js/frappe/views/reports/query_report.js:1704 +#: public/js/frappe/views/reports/query_report.js:1689 msgid "From Document Type" msgstr "Från DocType" @@ -10788,7 +10844,7 @@ msgstr "Funktion" msgid "Function Based On" msgstr "Funktion Baserad på" -#: __init__.py:934 +#: __init__.py:940 msgid "Function {0} is not whitelisted." msgstr "Funktion {0} är inte vitlistad." @@ -10826,6 +10882,10 @@ msgstr "GNU General Public License" msgid "Gantt" msgstr "Gantt" +#: public/js/frappe/list/base_list.js:206 +msgid "Gantt View" +msgstr "Gantt Vy" + #. Label of the gender (Link) field in DocType 'Contact' #. Name of a DocType #. Label of the gender (Data) field in DocType 'Gender' @@ -10871,7 +10931,7 @@ msgstr "Skapa Spårning URL" msgid "Geolocation" msgstr "Geolocation" -#: email/doctype/notification/notification.js:170 +#: email/doctype/notification/notification.js:193 msgid "Get Alerts for Today" msgstr "Hämta Dagens Alerts" @@ -11696,7 +11756,7 @@ msgstr "Dölj Sidofält, Meny och Kommentarer" msgid "Hide Standard Menu" msgstr "Dölj Standard Meny" -#: public/js/frappe/list/list_view.js:1611 +#: public/js/frappe/list/list_view.js:1665 msgid "Hide Tags" msgstr "Dölj Taggar" @@ -11714,7 +11774,7 @@ msgstr "Dölj Arbetsyta" msgid "Hide descendant records of For Value." msgstr "Dölj Underordnade poster för För Värde." -#: public/js/frappe/form/layout.js:268 +#: public/js/frappe/form/layout.js:270 msgid "Hide details" msgstr "Dölj Detaljer" @@ -11817,11 +11877,11 @@ msgstr "Hur ska denna valuta formateras? Om inte angiven, kommer system standard #: core/doctype/data_import/importer.py:1139 #: core/doctype/data_import/importer.py:1204 #: core/doctype/data_import/importer.py:1207 desk/report/todo/todo.py:36 -#: model/meta.py:45 public/js/frappe/data_import/data_exporter.js:329 -#: public/js/frappe/data_import/data_exporter.js:344 +#: model/meta.py:45 public/js/frappe/data_import/data_exporter.js:330 +#: public/js/frappe/data_import/data_exporter.js:345 #: public/js/frappe/list/list_settings.js:334 -#: public/js/frappe/list/list_view.js:358 -#: public/js/frappe/list/list_view.js:422 public/js/frappe/model/meta.js:197 +#: public/js/frappe/list/list_view.js:355 +#: public/js/frappe/list/list_view.js:419 public/js/frappe/model/meta.js:197 #: public/js/frappe/model/model.js:122 msgid "ID" msgstr "ID" @@ -12197,6 +12257,10 @@ msgstr "Bild Höjd" msgid "Image Link" msgstr "Bild Länk" +#: public/js/frappe/list/base_list.js:209 +msgid "Image View" +msgstr "Visa Bild" + #. Label of the image_width (Float) field in DocType 'Letter Head' #. Label of the footer_image_width (Float) field in DocType 'Letter Head' #: printing/doctype/letter_head/letter_head.json @@ -12211,7 +12275,7 @@ msgstr "Bild Fält måste vara giltig Fält Namn" msgid "Image field must be of type Attach Image" msgstr "Bild Fält måste vara av typ Bifoga Bild" -#: core/doctype/file/utils.py:135 +#: core/doctype/file/utils.py:136 msgid "Image link '{0}' is not valid" msgstr "Bild Länk \"{0}\" är inte giltig" @@ -12219,6 +12283,10 @@ msgstr "Bild Länk \"{0}\" är inte giltig" msgid "Image optimized" msgstr "Bild Optimerad" +#: core/doctype/file/utils.py:283 +msgid "Image: Corrupted Data Stream" +msgstr "Bild: Skadad Dataström" + #: public/js/frappe/views/image/image_view.js:13 msgid "Images" msgstr "Bilder" @@ -12257,7 +12325,7 @@ msgstr "Implicit" msgid "Import" msgstr "Importera" -#: public/js/frappe/list/list_view.js:1673 +#: public/js/frappe/list/list_view.js:1727 msgctxt "Button in list view menu" msgid "Import" msgstr "Importera" @@ -12468,6 +12536,10 @@ msgstr "Inkorg" msgid "Inbox User" msgstr "Inkorg Användare" +#: public/js/frappe/list/base_list.js:210 +msgid "Inbox View" +msgstr "Inkorg Vy" + #. Label of the include_name_field (Check) field in DocType 'Form Tour' #: desk/doctype/form_tour/form_tour.json msgid "Include Name Field" @@ -12487,11 +12559,11 @@ msgstr "Inkludera Tema från Appar" msgid "Include Web View Link in Email" msgstr "Inkludera Länk till Webbvy i E-post" -#: public/js/frappe/views/reports/query_report.js:1521 +#: public/js/frappe/views/reports/query_report.js:1506 msgid "Include filters" msgstr "Inkludera Filter" -#: public/js/frappe/views/reports/query_report.js:1513 +#: public/js/frappe/views/reports/query_report.js:1498 msgid "Include indentation" msgstr "Inkludera Fördjupning" @@ -12502,8 +12574,8 @@ msgstr "Inkludera symboler, siffror och stora bokstäver i lösenord" #. Label of the incoming_popimap_tab (Tab Break) field in DocType 'Email #. Account' #: email/doctype/email_account/email_account.json -msgid "Incoming (POP/IMAP)" -msgstr "Inkommande (POP/IMAP)" +msgid "Incoming" +msgstr "Inkommande" #. Label of the mailbox_settings (Section Break) field in DocType 'Email #. Account' @@ -12647,7 +12719,7 @@ msgstr "Infoga \tOvan" #. Label of the insert_after (Select) field in DocType 'Custom Field' #: custom/doctype/custom_field/custom_field.json -#: public/js/frappe/views/reports/query_report.js:1744 +#: public/js/frappe/views/reports/query_report.js:1729 msgid "Insert After" msgstr "Infoga Efter" @@ -12842,7 +12914,7 @@ msgid "Invalid" msgstr "Ogiltig" #: public/js/form_builder/utils.js:221 public/js/frappe/form/grid_row.js:770 -#: public/js/frappe/form/layout.js:793 +#: public/js/frappe/form/layout.js:795 msgid "Invalid \"depends_on\" expression" msgstr "Ogiltig 'depends_on' uttryck" @@ -12854,7 +12926,7 @@ msgstr "Ogiltig uttryck 'beroende på' i filter {0}" msgid "Invalid \"mandatory_depends_on\" expression" msgstr "Ogiltigt uttryck för \"obligatoriskt_beror_på\"" -#: utils/nestedset.py:177 +#: utils/nestedset.py:178 msgid "Invalid Action" msgstr "Ogiltig åtgärd" @@ -12946,7 +13018,7 @@ msgstr "Ogiltig Åsidosättning" msgid "Invalid Parameters." msgstr "Ogiltiga Parametrar" -#: core/doctype/user/user.py:1176 www/update-password.html:121 +#: core/doctype/user/user.py:1191 www/update-password.html:121 #: www/update-password.html:142 www/update-password.html:144 #: www/update-password.html:245 msgid "Invalid Password" @@ -13048,7 +13120,7 @@ msgstr "Ogiltiga begäran argument" #: integrations/doctype/connected_app/connected_app.py:173 msgid "Invalid state." -msgstr "Ogiltig status." +msgstr "Ogiltigt tillstånd." #: core/doctype/data_import/importer.py:423 msgid "Invalid template file for import" @@ -13225,6 +13297,7 @@ msgstr "Är Publicerad Fält måste vara giltig Fält Namn" #. Label of the is_query_report (Check) field in DocType 'Workspace Link' #: desk/doctype/workspace_link/workspace_link.json +#: public/js/frappe/widgets/widget_dialog.js:336 msgid "Is Query Report" msgstr "Är Dataförfråga Rapport" @@ -13314,7 +13387,7 @@ msgstr "Är Unik" msgid "Is Virtual" msgstr "Är Virtuell" -#: core/doctype/file/utils.py:156 utils/file_manager.py:311 +#: core/doctype/file/utils.py:157 utils/file_manager.py:311 msgid "It is risky to delete this file: {0}. Please contact your System Manager." msgstr "Det är riskabelt att radera denna fil: {0}. Kontakta System Administratör." @@ -13328,7 +13401,7 @@ msgstr "Artikel Titel" msgid "Item Type" msgstr "Artikel Typ" -#: utils/nestedset.py:228 +#: utils/nestedset.py:229 msgid "Item cannot be added to its own descendants" msgstr "Artikel kan inte läggas till egna undertyper" @@ -13453,6 +13526,7 @@ msgstr "Anslag Tavla" #. Label of the kanban_board (Link) field in DocType 'Workspace Shortcut' #: desk/doctype/kanban_board/kanban_board.json #: desk/doctype/workspace_shortcut/workspace_shortcut.json +#: public/js/frappe/widgets/widget_dialog.js:509 msgid "Kanban Board" msgstr "Anslag Tavla" @@ -13472,6 +13546,10 @@ msgctxt "Button in kanban view menu" msgid "Kanban Settings" msgstr "Anslag Tavla Inställningar" +#: public/js/frappe/list/base_list.js:207 +msgid "Kanban View" +msgstr "Anslag Tavla Vy" + #. Description of a DocType #: core/doctype/activity_log/activity_log.json msgid "Keep track of all update feeds" @@ -13717,7 +13795,10 @@ msgstr "LDAP Inställningar felaktiga. validering svar var: {0}" #: desk/doctype/workspace_quick_list/workspace_quick_list.json #: desk/doctype/workspace_shortcut/workspace_shortcut.json #: printing/page/print_format_builder/print_format_builder.js:474 +#: public/js/frappe/widgets/widget_dialog.js:187 #: public/js/frappe/widgets/widget_dialog.js:255 +#: public/js/frappe/widgets/widget_dialog.js:304 +#: public/js/frappe/widgets/widget_dialog.js:421 #: public/js/frappe/widgets/widget_dialog.js:645 #: public/js/frappe/widgets/widget_dialog.js:678 #: templates/form_grid/fields.html:37 @@ -13813,7 +13894,7 @@ msgstr "Senaste Kända Versioner" msgid "Last Login" msgstr "Senaste Inloggning" -#: email/doctype/notification/notification.js:31 +#: email/doctype/notification/notification.js:34 msgid "Last Modified Date" msgstr "Senast Ändrad Datum" @@ -13848,7 +13929,7 @@ msgstr "Senaste Tilldelning Datum" #. Option for the 'Timespan' (Select) field in DocType 'Dashboard Chart' #: desk/doctype/dashboard_chart/dashboard_chart.json msgid "Last Quarter" -msgstr "Sista Kvartal" +msgstr "Förra Kvartal" #. Label of the last_reset_password_key_generated_on (Datetime) field in #. DocType 'User' @@ -13861,6 +13942,11 @@ msgstr "Senast Återställning Lösenord Nyckel Skapades" msgid "Last Sync On" msgstr "Senast Synkroniserad" +#. Label of the last_synced_at (Datetime) field in DocType 'Email Account' +#: email/doctype/email_account/email_account.json +msgid "Last Synced At" +msgstr "Senast Synkroniserad" + #. Label of the last_synced_on (Datetime) field in DocType 'Dashboard Chart' #: desk/doctype/dashboard_chart/dashboard_chart.json msgid "Last Synced On" @@ -13891,7 +13977,7 @@ msgstr "Förra Vecka" msgid "Last Year" msgstr "Förra Året" -#: public/js/frappe/widgets/chart_widget.js:698 +#: public/js/frappe/widgets/chart_widget.js:701 msgid "Last synced {0}" msgstr "Senast Synkroniserad {0}" @@ -13943,7 +14029,7 @@ msgid "Leave blank to repeat always" msgstr "Lämna tom för ingen slut datum" #: core/doctype/communication/mixins.py:207 -#: email/doctype/email_account/email_account.py:663 +#: email/doctype/email_account/email_account.py:714 msgid "Leave this conversation" msgstr "Lämna denna konversation" @@ -14002,7 +14088,7 @@ msgstr "Längd av datamatrisen är större än värdet för maximum tillåtna et msgid "Length of {0} should be between 1 and 1000" msgstr "Längd av {0} ska vara mellan 1 och 1000" -#: public/js/frappe/widgets/chart_widget.js:674 +#: public/js/frappe/widgets/chart_widget.js:677 msgid "Less" msgstr "Mindre" @@ -14085,6 +14171,7 @@ msgstr "Sidhuvud i HTML" #. Label of the level (Select) field in DocType 'Help Article' #: core/doctype/custom_docperm/custom_docperm.json #: core/doctype/docperm/docperm.json +#: core/page/permission_manager/permission_manager.js:137 #: core/page/permission_manager/permission_manager.js:213 #: public/js/frappe/roles_editor.js:66 #: website/doctype/help_article/help_article.json @@ -14284,6 +14371,8 @@ msgstr "Länk Titel" #. Label of the link_to (Dynamic Link) field in DocType 'Workspace Shortcut' #: desk/doctype/workspace_link/workspace_link.json #: desk/doctype/workspace_shortcut/workspace_shortcut.json +#: public/js/frappe/widgets/widget_dialog.js:285 +#: public/js/frappe/widgets/widget_dialog.js:430 msgid "Link To" msgstr "Länk Till" @@ -14293,6 +14382,7 @@ msgstr "Länk Till i Rad" #. Label of the link_type (Select) field in DocType 'Workspace Link' #: desk/doctype/workspace_link/workspace_link.json +#: public/js/frappe/widgets/widget_dialog.js:277 msgid "Link Type" msgstr "Länk Typ" @@ -14336,7 +14426,7 @@ msgstr "Länkad Med" #. Label of the links (Table) field in DocType 'Customize Form' #. Label of the links (Table) field in DocType 'Workspace' #: contacts/doctype/address/address.js:39 contacts/doctype/address/address.json -#: contacts/doctype/contact/contact.js:87 contacts/doctype/contact/contact.json +#: contacts/doctype/contact/contact.js:92 contacts/doctype/contact/contact.json #: core/doctype/doctype/doctype.json #: custom/doctype/customize_form/customize_form.json #: desk/doctype/workspace/workspace.json public/js/frappe/form/toolbar.js:377 @@ -14384,11 +14474,15 @@ msgstr "List Inställning Meddelande" msgid "List Settings" msgstr "Lista Inställningar" -#: public/js/frappe/list/list_view.js:1753 +#: public/js/frappe/list/list_view.js:1807 msgctxt "Button in list view menu" msgid "List Settings" msgstr "Lista Inställningar" +#: public/js/frappe/list/base_list.js:203 +msgid "List View" +msgstr "List Vy" + #. Name of a DocType #: desk/doctype/list_view_settings/list_view_settings.json msgid "List View Settings" @@ -14425,13 +14519,13 @@ msgstr "Listor" msgid "Load Balancing" msgstr "Last Balansering" -#: public/js/frappe/list/base_list.js:378 +#: public/js/frappe/list/base_list.js:386 #: website/doctype/blog_post/templates/blog_post_list.html:50 #: website/doctype/help_article/templates/help_article_list.html:30 msgid "Load More" msgstr "Ladda Mer" -#: public/js/frappe/form/footer/form_timeline.js:214 +#: public/js/frappe/form/footer/form_timeline.js:216 msgctxt "Form timeline" msgid "Load More Communications" msgstr "Ladda Mer Korenspondens" @@ -14439,8 +14533,8 @@ msgstr "Ladda Mer Korenspondens" #: core/page/permission_manager/permission_manager.js:165 #: public/js/frappe/form/controls/multicheck.js:13 #: public/js/frappe/form/linked_with.js:13 -#: public/js/frappe/list/base_list.js:490 -#: public/js/frappe/list/list_view.js:335 public/js/frappe/ui/listing.html:16 +#: public/js/frappe/list/base_list.js:498 +#: public/js/frappe/list/list_view.js:332 public/js/frappe/ui/listing.html:16 #: public/js/frappe/views/reports/query_report.js:1017 msgid "Loading" msgstr "Laddar" @@ -14467,7 +14561,7 @@ msgstr "Laddar versioner..." #: public/js/frappe/views/kanban/kanban_board.html:11 #: public/js/frappe/widgets/chart_widget.js:50 #: public/js/frappe/widgets/number_card_widget.js:174 -#: public/js/frappe/widgets/quick_list_widget.js:126 +#: public/js/frappe/widgets/quick_list_widget.js:128 msgid "Loading..." msgstr "Laddar..." @@ -14551,7 +14645,7 @@ msgstr "Logga in Före" msgid "Login Failed please try again" msgstr "Inloggning Misslyckades, försök igen" -#: email/doctype/email_account/email_account.py:141 +#: email/doctype/email_account/email_account.py:140 msgid "Login Id is required" msgstr "Inloggning Erfodras" @@ -14852,6 +14946,10 @@ msgstr "Mapp" msgid "Map Columns" msgstr "Mappa Kolumner" +#: public/js/frappe/list/base_list.js:212 +msgid "Map View" +msgstr "Mapp Vy" + #: public/js/frappe/data_import/import_preview.js:290 msgid "Map columns from {0} to fields in {1}" msgstr "Mappa Kolumner från {0} till fält i {1}" @@ -15081,7 +15179,7 @@ msgstr "Meny" msgid "Merge with existing" msgstr "Slå samman med befintlig" -#: utils/nestedset.py:304 +#: utils/nestedset.py:307 msgid "Merging is only possible between Group-to-Group or Leaf Node-to-Leaf Node" msgstr "Sammanslafning är endast möjlig mellan grupp till grupp eller underordnad till underordnad" @@ -15117,7 +15215,7 @@ msgstr "Sammanslafning är endast möjlig mellan grupp till grupp eller underord msgid "Message" msgstr "Meddelande" -#: __init__.py:618 public/js/frappe/ui/messages.js:265 +#: __init__.py:624 public/js/frappe/ui/messages.js:267 msgctxt "Default title of the message dialog" msgid "Message" msgstr "Meddelande" @@ -15158,7 +15256,7 @@ msgstr "Meddelande Typ" msgid "Message clipped" msgstr "Meddelande Urlippt" -#: email/doctype/email_account/email_account.py:317 +#: email/doctype/email_account/email_account.py:333 msgid "Message from server: {0}" msgstr "Meddelande från Server: {0}" @@ -15237,6 +15335,10 @@ msgstr "Meta Titel för SEO" msgid "Method" msgstr "Sätt" +#: __init__.py:942 +msgid "Method Not Allowed" +msgstr "Metod ej Tillåten" + #: desk/doctype/number_card/number_card.py:70 msgid "Method is required to create a number card" msgstr "Sätt erfodras för att skapa nummerkort" @@ -15462,7 +15564,7 @@ msgstr "Modul Introduktion förlopp återställning" msgid "Module to Export" msgstr "Modul att Exportera" -#: modules/utils.py:268 +#: modules/utils.py:272 msgid "Module {} not found" msgstr "Modul {} hittades inte" @@ -15546,7 +15648,7 @@ msgstr "Månads Position" #: public/js/frappe/form/multi_select_dialog.js:72 #: public/js/frappe/ui/toolbar/search.js:285 #: public/js/frappe/ui/toolbar/search.js:300 -#: public/js/frappe/widgets/chart_widget.js:674 +#: public/js/frappe/widgets/chart_widget.js:677 #: templates/includes/list/list.html:23 #: templates/includes/search_template.html:13 msgid "More" @@ -15628,7 +15730,7 @@ msgstr "Flytta till nästa steg när du klickar i det markerade området." msgid "Mozilla doesn't support :has() so you can pass parent selector here as workaround" msgstr "Mozilla stöder inte :has() så du kan skicka överordnad väljare här som lösning" -#: utils/nestedset.py:328 +#: utils/nestedset.py:331 msgid "Multiple root nodes not allowed." msgstr "Flera rot noder är inte tillåtna." @@ -15834,12 +15936,12 @@ msgstr "Toppfält Mall Värden" msgid "Navigate Home" msgstr "Navigera Hem" -#: public/js/frappe/list/list_view.js:1161 +#: public/js/frappe/list/list_view.js:1198 msgctxt "Description of a list view shortcut" msgid "Navigate list down" msgstr "Navigera lista ner" -#: public/js/frappe/list/list_view.js:1168 +#: public/js/frappe/list/list_view.js:1205 msgctxt "Description of a list view shortcut" msgid "Navigate list up" msgstr "Navigera lista upp" @@ -15866,7 +15968,7 @@ msgstr "Arbetsyta Ansvarig roll erfodras för att dölja/visa publika arbetsyto msgid "Negative Value" msgstr "Negativ Värde" -#: utils/nestedset.py:93 +#: utils/nestedset.py:94 msgid "Nested set error. Please contact the Administrator." msgstr "Nested set fel. Kontakta Administratör." @@ -15923,11 +16025,11 @@ msgstr "Ny Anpassad Utskrift Mall" msgid "New Document Form" msgstr "Ny Dokument Form" -#: desk/doctype/notification_log/notification_log.py:158 +#: desk/doctype/notification_log/notification_log.py:159 msgid "New Document Shared {0}" msgstr "Ny Dokument Delad {0}" -#: public/js/frappe/form/footer/form_timeline.js:26 +#: public/js/frappe/form/footer/form_timeline.js:27 #: public/js/frappe/views/communication.js:23 msgid "New Email" msgstr "Ny E-post" @@ -15937,7 +16039,7 @@ msgstr "Ny E-post" msgid "New Email Account" msgstr "Ny E-post Konto" -#: public/js/frappe/form/footer/form_timeline.js:45 +#: public/js/frappe/form/footer/form_timeline.js:47 msgid "New Event" msgstr "Ny Händelse" @@ -15953,7 +16055,7 @@ msgstr "Ny Anslag Tavla" msgid "New Links" msgstr "Nya Länkar" -#: desk/doctype/notification_log/notification_log.py:156 +#: desk/doctype/notification_log/notification_log.py:157 msgid "New Mention on {0}" msgstr "Ny Hänvisning {0}" @@ -15971,7 +16073,7 @@ msgstr "Ny Namn" msgid "New Newsletter" msgstr "Ny Nyhetsbrev" -#: desk/doctype/notification_log/notification_log.py:155 +#: desk/doctype/notification_log/notification_log.py:156 msgid "New Notification" msgstr "Ny Avisering" @@ -16074,9 +16176,9 @@ msgstr "Ny {0}: {1}" #: utils/change_log.py:373 msgid "New {} releases for the following apps are available" -msgstr "Nya {} utgåvor för följande appar finns tillgängliga" +msgstr "Nya {} versioner för följande appar finns tillgängliga" -#: core/doctype/user/user.py:753 +#: core/doctype/user/user.py:768 msgid "Newly created user {0} has no roles enabled." msgstr "Nyskapad användare {0} har inga roller aktiverade." @@ -16127,7 +16229,7 @@ msgstr "Nyhetsbrev ska ha minst en mottagare" msgid "Newsletters" msgstr "Nyhetsbrev" -#: public/js/frappe/form/form_tour.js:318 +#: public/js/frappe/form/form_tour.js:14 public/js/frappe/form/form_tour.js:324 #: public/js/frappe/web_form/web_form.js:91 #: public/js/onboarding_tours/onboarding_tours.js:15 #: public/js/onboarding_tours/onboarding_tours.js:240 @@ -16213,7 +16315,7 @@ msgstr "Nästa på Klick" #: public/js/form_builder/utils.js:341 #: public/js/frappe/form/controls/link.js:475 #: public/js/frappe/list/list_sidebar_group_by.js:223 -#: public/js/frappe/views/reports/query_report.js:1541 +#: public/js/frappe/views/reports/query_report.js:1526 #: website/doctype/help_article/templates/help_article.html:26 msgid "No" msgstr "Nej" @@ -16257,7 +16359,7 @@ msgstr "Ingen Data" msgid "No Data to Show" msgstr "Ingen Data att visa" -#: public/js/frappe/widgets/quick_list_widget.js:131 +#: public/js/frappe/widgets/quick_list_widget.js:133 msgid "No Data..." msgstr "Ingen Data..." @@ -16277,7 +16379,7 @@ msgstr "Inga E-post" msgid "No Entry for the User {0} found within LDAP!" msgstr "Ingen Konto för Användare {0} hittades i LDAP!" -#: public/js/frappe/widgets/chart_widget.js:366 +#: public/js/frappe/widgets/chart_widget.js:367 msgid "No Filters Set" msgstr "Inga Filter Angivna" @@ -16355,7 +16457,7 @@ msgstr "Inga Träffar" msgid "No Results found" msgstr "Inga Träffar" -#: core/doctype/user/user.py:754 +#: core/doctype/user/user.py:769 msgid "No Roles Specified" msgstr "Inga Roller Specificerade" @@ -16383,7 +16485,7 @@ msgstr "Inga aktiviteter att visa" msgid "No address added yet." msgstr "Ingen adress upplagd än" -#: email/doctype/notification/notification.js:180 +#: email/doctype/notification/notification.js:203 msgid "No alerts for today" msgstr "Inga varningar för idag" @@ -16510,11 +16612,11 @@ msgstr "Antal Rader (Max 500)" msgid "No of Sent SMS" msgstr "Antal Skickade SMS" -#: __init__.py:1126 client.py:109 client.py:151 +#: __init__.py:1132 client.py:109 client.py:151 msgid "No permission for {0}" msgstr "Ingen Behörighet för {0}" -#: public/js/frappe/form/form.js:1137 +#: public/js/frappe/form/form.js:1141 msgctxt "{0} = verb, {1} = object" msgid "No permission to '{0}' {1}" msgstr "Behörigheter saknas att '{0}' {1}" @@ -16539,7 +16641,7 @@ msgstr "Inga poster finns i {0}" msgid "No records tagged." msgstr "Inga taggade poster" -#: public/js/frappe/data_import/data_exporter.js:224 +#: public/js/frappe/data_import/data_exporter.js:225 msgid "No records will be exported" msgstr "Inga poster kommer att exporteras" @@ -16563,7 +16665,7 @@ msgstr "Ingen {0} Hittades" msgid "No {0} found" msgstr "Ingen {0} Hittades" -#: public/js/frappe/list/list_view.js:469 +#: public/js/frappe/list/list_view.js:466 msgid "No {0} found with matching filters. Clear filters to see all {0}." msgstr "{0} hittades med vald filter. Rensa filter för att se alla {0}." @@ -16605,7 +16707,7 @@ msgstr "Normaliserade Kopior" msgid "Normalized Query" msgstr "Normaliserad Fråga" -#: core/doctype/user/user.py:959 templates/includes/login/login.js:257 +#: core/doctype/user/user.py:974 templates/includes/login/login.js:257 #: utils/oauth.py:265 msgid "Not Allowed" msgstr "Ej Tillåtet" @@ -16652,7 +16754,7 @@ msgstr "Ej Länkad till någon post" msgid "Not Nullable" msgstr "Ej Nullbar" -#: __init__.py:1018 app.py:357 desk/calendar.py:26 geo/utils.py:97 +#: __init__.py:1024 app.py:357 desk/calendar.py:26 geo/utils.py:97 #: public/js/frappe/web_form/webform_script.js:15 #: website/doctype/web_form/web_form.py:602 #: website/page_renderers/not_permitted_page.py:20 www/login.py:181 @@ -16704,7 +16806,7 @@ msgstr "Ej Angiven" msgid "Not a valid Comma Separated Value (CSV File)" msgstr "Ej giltig Komma Separerad Värde (CSV Fil)" -#: core/doctype/user/user.py:235 +#: core/doctype/user/user.py:240 msgid "Not a valid User Image." msgstr "Ej giltig Användare Bild." @@ -16724,7 +16826,7 @@ msgstr "Inte Aktiv" msgid "Not allowed for {0}: {1}" msgstr "Ej tillåtet för {0}: {1}" -#: email/doctype/notification/notification.py:391 +#: email/doctype/notification/notification.py:440 msgid "Not allowed to attach {0} document, please enable Allow Print For {0} in Print Settings" msgstr "Ej Tillåtet att bifoga {0} dokument, aktivera \"Tillåt Utskrift\" för {0} i Utskrift Inställningar" @@ -16843,7 +16945,7 @@ msgstr "Inget mer att göra om" msgid "Nothing left to undo" msgstr "Inget mer att ångra" -#: public/js/frappe/list/base_list.js:362 +#: public/js/frappe/list/base_list.js:370 #: public/js/frappe/views/reports/query_report.js:105 #: templates/includes/list/list.html:7 #: website/doctype/blog_post/templates/blog_post_list.html:41 @@ -16906,6 +17008,18 @@ msgstr "Avisering Prenumererad Dokument" msgid "Notification sent to" msgstr "Avisering skickad till" +#: email/doctype/notification/notification.py:345 +msgid "Notification: customer {0} has no Mobile number set" +msgstr "Meddelande: kund {0} har inget mobil nummer angivet" + +#: email/doctype/notification/notification.py:331 +msgid "Notification: document {0} has no {1} number set (field: {2})" +msgstr "Meddelande: dokument {0} har inget {1} nummer angivet (fält: {2})" + +#: email/doctype/notification/notification.py:340 +msgid "Notification: user {0} has no Mobile number set" +msgstr "Meddelande: användare {0} har inget mobil nummer angivet" + #. Label of the notifications (Check) field in DocType 'Role' #: core/doctype/role/role.json #: public/js/frappe/ui/notifications/notifications.js:50 @@ -17047,7 +17161,7 @@ msgstr "Antal dagar efter vilka dokument Webb Vy länk delad i e-post kommer att #. Label of the cache_keys (Int) field in DocType 'System Health Report' #: desk/doctype/system_health_report/system_health_report.json msgid "Number of keys" -msgstr "Antal nycklar" +msgstr "Antal Nycklar" #. Label of the onsite_backups (Int) field in DocType 'System Health Report' #: desk/doctype/system_health_report/system_health_report.json @@ -17110,7 +17224,7 @@ msgstr "OAuth Inställningar" msgid "OAuth Scope" msgstr "OAuth omfattning" -#: email/doctype/email_account/email_account.js:182 +#: email/doctype/email_account/email_account.js:211 msgid "OAuth has been enabled but not authorised. Please use \"Authorise API Access\" button to do the same." msgstr "OAuth är aktiverad men inte auktoriserad. Använd \"Auktorisera API Tillgång\" knapp för att göra detta." @@ -17134,11 +17248,11 @@ msgstr "OTP App" msgid "OTP Issuer Name" msgstr "OTP Utgivarens Namn" -#: twofactor.py:461 +#: twofactor.py:445 msgid "OTP Secret Reset - {0}" msgstr "OTP Hemlighet Återställning - {0}" -#: twofactor.py:480 +#: twofactor.py:464 msgid "OTP Secret has been reset. Re-registration will be required on next login." msgstr "OTP Hemlighet är återställd. Omgistrering erfodras vid nästa inloggning." @@ -17249,9 +17363,14 @@ msgstr "{0}, {1} skrev" #. Label of the onboard (Check) field in DocType 'Workspace Link' #: desk/doctype/workspace_link/workspace_link.json +#: public/js/frappe/widgets/widget_dialog.js:330 msgid "Onboard" msgstr "Introduktion" +#: public/js/frappe/widgets/widget_dialog.js:236 +msgid "Onboarding Name" +msgstr "Introduktion Namn" + #. Name of a DocType #: desk/doctype/onboarding_permission/onboarding_permission.json msgid "Onboarding Permission" @@ -17305,7 +17424,7 @@ msgstr "En av de underordnade sidorna med namnet {0} finns redan i sektion {1}. msgid "Only 200 inserts allowed in one request" msgstr "Endast 200 infogningar tillåts per begäran" -#: email/doctype/email_queue/email_queue.py:81 +#: email/doctype/email_queue/email_queue.py:82 msgid "Only Administrator can delete Email Queue" msgstr "Endast Administratör kan radera E-post Kö" @@ -17359,6 +17478,7 @@ msgstr "Endast utkast dokument kan förkastas" #. Label of the only_for (Link) field in DocType 'Workspace Link' #: desk/doctype/workspace_link/workspace_link.json +#: public/js/frappe/widgets/widget_dialog.js:323 msgid "Only for" msgstr "Endast för" @@ -17468,7 +17588,7 @@ msgstr "Öppna dialogruta med erfodrade fält för att snabbt skapa ny post" msgid "Open a module or tool" msgstr "Öppna modul eller verktyg" -#: public/js/frappe/list/list_view.js:1214 +#: public/js/frappe/list/list_view.js:1251 msgctxt "Description of a list view shortcut" msgid "Open list item" msgstr "Öppna List Post" @@ -17643,10 +17763,10 @@ msgstr "Ursprung Värde" msgid "Other" msgstr "Annat" -#. Label of the outgoing_smtp_tab (Tab Break) field in DocType 'Email Account' +#. Label of the outgoing_tab (Tab Break) field in DocType 'Email Account' #: email/doctype/email_account/email_account.json -msgid "Outgoing (SMTP)" -msgstr "Utgående (SMTP)" +msgid "Outgoing" +msgstr "Utgående" #. Label of the outgoing_mail_settings (Section Break) field in DocType 'Email #. Account' @@ -17658,7 +17778,7 @@ msgstr "Utgående (SMTP) Inställningar" #. Health Report' #: desk/doctype/system_health_report/system_health_report.json msgid "Outgoing Emails (Last 7 days)" -msgstr "Utgående E-post (sista 7 dagar)" +msgstr "Utgående E-post (Senaste 7 dagar)" #. Label of the smtp_server (Data) field in DocType 'Email Account' #. Label of the smtp_server (Data) field in DocType 'Email Domain' @@ -17708,7 +17828,7 @@ msgstr "PATCH" #: printing/page/print/print.js:71 #: public/js/frappe/form/templates/print_layout.html:44 -#: public/js/frappe/views/reports/query_report.js:1669 +#: public/js/frappe/views/reports/query_report.js:1654 msgid "PDF" msgstr "PDF" @@ -18061,11 +18181,11 @@ msgstr "Passiv" msgid "Password" msgstr "Lösenord" -#: core/doctype/user/user.py:1022 +#: core/doctype/user/user.py:1037 msgid "Password Email Sent" msgstr "Lösenord E-post Skickad" -#: core/doctype/user/user.py:406 +#: core/doctype/user/user.py:412 msgid "Password Reset" msgstr "Lösenord Återställning" @@ -18087,7 +18207,7 @@ msgstr "Lösenord ändrad." msgid "Password for Base DN" msgstr "Lösenord för Base DN" -#: email/doctype/email_account/email_account.py:172 +#: email/doctype/email_account/email_account.py:182 msgid "Password is required or select Awaiting Password" msgstr "Lösenord erfodras eller välj Väntar på Lösenord" @@ -18099,9 +18219,9 @@ msgstr "Lösenord saknas i E-post Konto" msgid "Password not found for {0} {1} {2}" msgstr "Lösenord hittades inte för {0} {1} {2}" -#: core/doctype/user/user.py:1021 -msgid "Password reset instructions have been sent to your email" -msgstr "Lösenord Återställning instruktioner har skickats till din E-post" +#: core/doctype/user/user.py:1036 +msgid "Password reset instructions have been sent to {}'s email" +msgstr "Instruktioner för återställning av lösenord är skickade till {}'s e-post" #: www/update-password.html:164 msgid "Password set" @@ -18111,7 +18231,7 @@ msgstr "Lösenord angiven" msgid "Password size exceeded the maximum allowed size" msgstr "Lösenord längd överskred maximum tillåten längd." -#: core/doctype/user/user.py:817 +#: core/doctype/user/user.py:832 msgid "Password size exceeded the maximum allowed size." msgstr "Lösenord längd överskred maximum tillåten längd." @@ -18198,24 +18318,24 @@ msgstr "Pågående" #. Request' #: website/doctype/personal_data_deletion_request/personal_data_deletion_request.json msgid "Pending Approval" -msgstr "Pågående Godkännande" +msgstr "Godkännande Kö" #. Label of the pending_emails (Int) field in DocType 'System Health Report' #: desk/doctype/system_health_report/system_health_report.json msgid "Pending Emails" -msgstr "Pågående E-post" +msgstr "E-post Kö" #. Label of the pending_jobs (Int) field in DocType 'System Health Report #. Queue' #: desk/doctype/system_health_report_queue/system_health_report_queue.json msgid "Pending Jobs" -msgstr "Pågående Jobb" +msgstr "Jobb Kö" #. Option for the 'Status' (Select) field in DocType 'Personal Data Deletion #. Request' #: website/doctype/personal_data_deletion_request/personal_data_deletion_request.json msgid "Pending Verification" -msgstr "Pågående Verifiering" +msgstr "Verifiering Kö" #. Option for the 'Type' (Select) field in DocType 'DocField' #. Option for the 'Field Type' (Select) field in DocType 'Custom Field' @@ -18249,15 +18369,15 @@ msgstr "Behörighet Nivå" msgid "Permanent" msgstr "Permanent" -#: public/js/frappe/form/form.js:1023 +#: public/js/frappe/form/form.js:1027 msgid "Permanently Cancel {0}?" msgstr "Avbryt {0}?" -#: public/js/frappe/form/form.js:1069 +#: public/js/frappe/form/form.js:1073 msgid "Permanently Discard {0}?" msgstr "Annullera {0}? " -#: public/js/frappe/form/form.js:853 +#: public/js/frappe/form/form.js:857 msgid "Permanently Submit {0}?" msgstr "Godkänn {0}?" @@ -18444,6 +18564,10 @@ msgstr "Vanlig Text" msgid "Plant" msgstr "Fastighet" +#: email/doctype/email_account/email_account.py:535 +msgid "Please Authorize OAuth for Email Account {0}" +msgstr "Auktorisera OAuth för E-post Konto {0}" + #: email/oauth.py:29 msgid "Please Authorize OAuth for Email Account {}" msgstr "Vänligen Auktorisera OAuth för E-post Konto {}" @@ -18472,7 +18596,7 @@ msgstr "Lägg till ämne i E-post" msgid "Please add a valid comment." msgstr "Lägg till giltig kommentar." -#: core/doctype/user/user.py:1004 +#: core/doctype/user/user.py:1019 msgid "Please ask your administrator to verify your sign-up" msgstr "Be Administratör att verifiera din registrering" @@ -18500,11 +18624,11 @@ msgstr "Kontrollera OpenID Configuration URL" msgid "Please check the filter values set for Dashboard Chart: {}" msgstr "Kontrollera filter värden angivna för Översikt Panel Diagram: {}" -#: model/base_document.py:872 +#: model/base_document.py:873 msgid "Please check the value of \"Fetch From\" set for field {0}" msgstr "Kontrollera värde för uppsättning 'Hämta från' för fält {0}" -#: core/doctype/user/user.py:1002 +#: core/doctype/user/user.py:1017 msgid "Please check your email for verification" msgstr "Kontrollera din E-post för verifiering" @@ -18786,11 +18910,11 @@ msgstr "Konfigurera SMS före du anger den som Autentisering Sätt via SMS Inst msgid "Please setup a message first" msgstr "Försäljning Order Meddelande" -#: email/doctype/email_account/email_account.py:407 +#: email/doctype/email_account/email_account.py:423 msgid "Please setup default Email Account from Settings > Email Account" msgstr "Ange Standard E-Post Konto från Inställningar > E-post Konto" -#: core/doctype/user/user.py:371 +#: core/doctype/user/user.py:377 msgid "Please setup default outgoing Email Account from Settings > Email Account" msgstr "Ange Standard E-post Konto från Inställningar > E-post > E-post Konto" @@ -18802,11 +18926,11 @@ msgstr "Specificera" msgid "Please specify a valid parent DocType for {0}" msgstr "Ange giltig överordnad DocType för {0}" -#: email/doctype/notification/notification.py:87 +#: email/doctype/notification/notification.py:88 msgid "Please specify which date field must be checked" msgstr "Ange Datum Fält som måste kontrolleras" -#: email/doctype/notification/notification.py:90 +#: email/doctype/notification/notification.py:91 msgid "Please specify which value field must be checked" msgstr "Ange Värde Fält som måste kontrolleras" @@ -19071,6 +19195,7 @@ msgstr "Förhandsgranskning av genererade namn" msgid "Preview:" msgstr "Förhandsgranska:" +#: public/js/frappe/form/form_tour.js:15 #: public/js/frappe/web_form/web_form.js:95 #: public/js/onboarding_tours/onboarding_tours.js:16 #: templates/includes/slideshow.html:34 @@ -19092,7 +19217,7 @@ msgstr "Föregående Dokument" msgid "Previous Hash" msgstr "Föregående Hash" -#: public/js/frappe/form/form.js:2217 +#: public/js/frappe/form/form.js:2222 msgid "Previous Submission" msgstr "Föregående Godkännande" @@ -19132,20 +19257,22 @@ msgstr "Primär nyckel för doctype {0} kan inte ändras eftersom det finns befi #. Label of the print (Check) field in DocType 'Custom DocPerm' #. Label of the print (Check) field in DocType 'DocPerm' +#. Label of the print (Check) field in DocType 'User Document Type' #: core/doctype/custom_docperm/custom_docperm.json #: core/doctype/docperm/docperm.json #: core/doctype/success_action/success_action.js:56 +#: core/doctype/user_document_type/user_document_type.json #: printing/page/print/print.js:65 public/js/frappe/form/success_action.js:81 #: public/js/frappe/form/templates/print_layout.html:46 #: public/js/frappe/form/toolbar.js:332 public/js/frappe/form/toolbar.js:344 #: public/js/frappe/list/bulk_operations.js:87 -#: public/js/frappe/views/reports/query_report.js:1655 +#: public/js/frappe/views/reports/query_report.js:1640 #: public/js/frappe/views/reports/report_view.js:1460 #: public/js/frappe/views/treeview.js:469 www/printview.html:18 msgid "Print" msgstr "Utskrift" -#: public/js/frappe/list/list_view.js:1918 +#: public/js/frappe/list/list_view.js:1972 msgctxt "Button in list view actions menu" msgid "Print" msgstr "Utskrift" @@ -19405,7 +19532,7 @@ msgstr "Fortsätt Ändå" msgid "Processing" msgstr "Behandlar" -#: email/doctype/email_queue/email_queue.py:434 +#: email/doctype/email_queue/email_queue.py:447 msgid "Processing..." msgstr "Behandlar..." @@ -19541,7 +19668,7 @@ msgstr "Publicerad" msgid "Publishing Dates" msgstr "Publicering Datum" -#: email/doctype/email_account/email_account.js:159 +#: email/doctype/email_account/email_account.js:179 msgid "Pull Emails" msgstr "Hämta E-post" @@ -19888,12 +20015,12 @@ msgstr "Direkt Utskrift Inställningar " msgid "Re-Run in Console" msgstr "Kör igen i Konsol" -#: email/doctype/email_account/email_account.py:669 +#: email/doctype/email_account/email_account.py:720 msgid "Re:" msgstr "Sv:" #: core/doctype/communication/communication.js:268 -#: public/js/frappe/form/footer/form_timeline.js:587 +#: public/js/frappe/form/footer/form_timeline.js:589 #: public/js/frappe/views/communication.js:355 msgid "Re: {0}" msgstr "Sv: {0}" @@ -20001,7 +20128,7 @@ msgstr "Uppdatera" msgid "Rebuild Tree" msgstr "Uppdatera Träd Vy" -#: utils/nestedset.py:176 +#: utils/nestedset.py:177 msgid "Rebuilding of tree is not supported for {}" msgstr "Uppdatering av Träd Vy stöds inte för {}" @@ -20356,12 +20483,12 @@ msgid "Referrer" msgstr "Referens" #: printing/page/print/print.js:73 public/js/frappe/desk.js:134 -#: public/js/frappe/desk.js:533 public/js/frappe/form/form.js:1196 +#: public/js/frappe/desk.js:533 public/js/frappe/form/form.js:1200 #: public/js/frappe/form/templates/print_layout.html:6 #: public/js/frappe/list/base_list.js:66 -#: public/js/frappe/views/reports/query_report.js:1644 +#: public/js/frappe/views/reports/query_report.js:1629 #: public/js/frappe/views/treeview.js:475 -#: public/js/frappe/widgets/chart_widget.js:290 +#: public/js/frappe/widgets/chart_widget.js:291 #: public/js/frappe/widgets/number_card_widget.js:324 msgid "Refresh" msgstr "Uppdatera" @@ -20388,7 +20515,7 @@ msgstr "Uppdatera Google Sheet" msgid "Refresh Token" msgstr "Uppdatera Token" -#: public/js/frappe/list/list_view.js:507 +#: public/js/frappe/list/list_view.js:504 msgctxt "Document count in list view" msgid "Refreshing" msgstr "Uppdaterar" @@ -20398,7 +20525,7 @@ msgstr "Uppdaterar" msgid "Refreshing..." msgstr "Uppdaterar..." -#: core/doctype/user/user.py:966 +#: core/doctype/user/user.py:981 msgid "Registered but disabled" msgstr "Registrerad men inaktiverad" @@ -20457,7 +20584,7 @@ msgstr "Ladda om" msgid "Reload File" msgstr "Ladda om Fil" -#: public/js/frappe/list/base_list.js:242 +#: public/js/frappe/list/base_list.js:250 msgid "Reload List" msgstr "Ladda om Lista" @@ -20615,7 +20742,7 @@ msgstr "Besvarad" #. Label of the reply (Text Editor) field in DocType 'Discussion Reply' #: core/doctype/communication/communication.js:57 -#: public/js/frappe/form/footer/form_timeline.js:550 +#: public/js/frappe/form/footer/form_timeline.js:552 #: website/doctype/discussion_reply/discussion_reply.json msgid "Reply" msgstr "Svara" @@ -20726,7 +20853,7 @@ msgstr "Rapport Ansvarig" #: core/doctype/report/report.json #: desk/doctype/dashboard_chart/dashboard_chart.json #: desk/doctype/number_card/number_card.json -#: public/js/frappe/views/reports/query_report.js:1825 +#: public/js/frappe/views/reports/query_report.js:1810 msgid "Report Name" msgstr "Rapport Namn" @@ -20749,6 +20876,10 @@ msgstr "Rapportera Referens DocType" msgid "Report Type" msgstr "Rapport Typ" +#: public/js/frappe/list/base_list.js:204 +msgid "Report View" +msgstr "Rapport Vy" + #: core/doctype/doctype/doctype.py:1780 msgid "Report cannot be set for Single types" msgstr "Rapport kan inte anges för Enskilda Typer" @@ -20783,7 +20914,7 @@ msgstr "Rapport är uppdaterad" msgid "Report was not saved (there were errors)" msgstr "Rapport är inte sparad (det fanns fel)" -#: public/js/frappe/views/reports/query_report.js:1863 +#: public/js/frappe/views/reports/query_report.js:1848 msgid "Report with more than 10 columns looks better in Landscape mode." msgstr "Rapport med mer än 10 kolumner ser bättre ut i Liggande Läge." @@ -20937,7 +21068,7 @@ msgstr "Återställ Alla Anpassningar" msgid "Reset Changes" msgstr "Återställ ändringar" -#: public/js/frappe/widgets/chart_widget.js:305 +#: public/js/frappe/widgets/chart_widget.js:306 msgid "Reset Chart" msgstr "Återställ Diagram" @@ -21285,7 +21416,7 @@ msgstr "Roll Behörigheter" msgid "Role Permissions Manager" msgstr "Roll Behörigheter Hanterare" -#: public/js/frappe/list/list_view.js:1695 +#: public/js/frappe/list/list_view.js:1749 msgctxt "Button in list view menu" msgid "Role Permissions Manager" msgstr "Roll Behörigheter Hanterare" @@ -21317,7 +21448,7 @@ msgstr "Roll Profiler " msgid "Role and Level" msgstr "Roll och Nivå" -#: core/doctype/user/user.py:316 +#: core/doctype/user/user.py:322 msgid "Role has been set as per the user type {0}" msgstr "Rollen angiven enligt användare typ {0}" @@ -21369,7 +21500,7 @@ msgstr "Roller HTML" msgid "Roles can be set for users from their User page." msgstr "Roller kan anges för användare från deras Användarsida." -#: utils/nestedset.py:277 +#: utils/nestedset.py:280 msgid "Root {0} cannot be deleted" msgstr "Root {0} kan inte raderas" @@ -21442,7 +21573,7 @@ msgstr "Rad #" msgid "Row # {0}: Non administrator user can not set the role {1} to the custom doctype" msgstr "Rad # {0}: Användare som inte är administratör kan inte ange roll {1} till anpassad Dokument Typ" -#: model/base_document.py:903 +#: model/base_document.py:904 msgid "Row #{0}:" msgstr "Rad # {0}:" @@ -21618,7 +21749,7 @@ msgstr "SMS skickad till följande nummer: {0}" msgid "SMS was not sent. Please contact Administrator." msgstr "SMS inte skickad. Kontakta Administratör." -#: email/doctype/email_account/email_account.py:189 +#: email/doctype/email_account/email_account.py:205 msgid "SMTP Server is required" msgstr "SMTP Server erfodras" @@ -21716,7 +21847,7 @@ msgstr "Lördag" #: email/doctype/notification/notification.json #: printing/page/print/print.js:856 #: printing/page/print_format_builder/print_format_builder.js:160 -#: public/js/frappe/form/footer/form_timeline.js:661 +#: public/js/frappe/form/footer/form_timeline.js:663 #: public/js/frappe/form/quick_entry.js:161 #: public/js/frappe/list/list_settings.js:36 #: public/js/frappe/list/list_settings.js:244 @@ -21726,11 +21857,11 @@ msgstr "Lördag" #: public/js/frappe/views/kanban/kanban_settings.js:45 #: public/js/frappe/views/kanban/kanban_settings.js:189 #: public/js/frappe/views/kanban/kanban_view.js:343 -#: public/js/frappe/views/reports/query_report.js:1817 +#: public/js/frappe/views/reports/query_report.js:1802 #: public/js/frappe/views/reports/report_view.js:1640 #: public/js/frappe/views/workspace/workspace.js:501 #: public/js/frappe/widgets/base_widget.js:142 -#: public/js/frappe/widgets/quick_list_widget.js:117 +#: public/js/frappe/widgets/quick_list_widget.js:119 #: public/js/print_format_builder/print_format_builder.bundle.js:15 #: public/js/workflow_builder/workflow_builder.bundle.js:33 msgid "Save" @@ -21757,7 +21888,7 @@ msgstr "Spara Anpassningar" msgid "Save Filter" msgstr "Spara Filter " -#: public/js/frappe/views/reports/query_report.js:1820 +#: public/js/frappe/views/reports/query_report.js:1805 msgid "Save Report" msgstr "Spara Rapport" @@ -21770,7 +21901,7 @@ msgstr "Spara Filter" msgid "Save on Completion" msgstr "Spara Vid Klar" -#: public/js/frappe/form/form_tour.js:289 +#: public/js/frappe/form/form_tour.js:295 msgid "Save the document." msgstr "Spara Dokument ==>" @@ -22113,7 +22244,7 @@ msgstr "Visa All Aktivitet" msgid "See all past reports." msgstr "Visa alla tidigare rapporter." -#: public/js/frappe/form/form.js:1230 +#: public/js/frappe/form/form.js:1234 #: website/doctype/contact_us_settings/contact_us_settings.js:4 msgid "See on Website" msgstr "Visapå Webbplats" @@ -22172,7 +22303,7 @@ msgstr "Visning Tabell" msgid "Select" msgstr "Välj i Listan" -#: public/js/frappe/data_import/data_exporter.js:148 +#: public/js/frappe/data_import/data_exporter.js:149 #: public/js/frappe/form/controls/multicheck.js:166 msgid "Select All" msgstr "Välj Alla" @@ -22260,11 +22391,11 @@ msgstr "Välj Fält..." msgid "Select Fields" msgstr "Välj Fält" -#: public/js/frappe/data_import/data_exporter.js:146 +#: public/js/frappe/data_import/data_exporter.js:147 msgid "Select Fields To Insert" msgstr "Välj Fält att Infoga" -#: public/js/frappe/data_import/data_exporter.js:147 +#: public/js/frappe/data_import/data_exporter.js:148 msgid "Select Fields To Update" msgstr "Välj Fält att Uppdatera" @@ -22297,7 +22428,7 @@ msgstr "Välj Språk" msgid "Select List View" msgstr "Välj List Vy" -#: public/js/frappe/data_import/data_exporter.js:157 +#: public/js/frappe/data_import/data_exporter.js:158 msgid "Select Mandatory" msgstr "Välj Erfordrad" @@ -22379,7 +22510,7 @@ msgstr "Välj giltig Avsändar Fält att skapa dokument från E-post" msgid "Select a valid Subject field for creating documents from Email" msgstr "Välj giltig Ämne Fält att skapa dokument från E-post" -#: public/js/frappe/form/form_tour.js:315 +#: public/js/frappe/form/form_tour.js:321 msgid "Select an Image" msgstr "Välj Bild" @@ -22401,13 +22532,13 @@ msgstr "Välj minst en post för utskrift" msgid "Select atleast 2 actions" msgstr "Välj minst två åtgärder" -#: public/js/frappe/list/list_view.js:1228 +#: public/js/frappe/list/list_view.js:1265 msgctxt "Description of a list view shortcut" msgid "Select list item" msgstr "Välj List Artikel" -#: public/js/frappe/list/list_view.js:1180 -#: public/js/frappe/list/list_view.js:1196 +#: public/js/frappe/list/list_view.js:1217 +#: public/js/frappe/list/list_view.js:1233 msgctxt "Description of a list view shortcut" msgid "Select multiple list items" msgstr "Välj flera List Artiklar" @@ -22849,6 +22980,14 @@ msgstr "Session Förfaller (Tid av Inaktivitet)" msgid "Session Expiry must be in format {0}" msgstr "Session Förfallo tid måste vara i format {0}" +#: desk/doctype/dashboard_chart/dashboard_chart.js:400 +#: desk/doctype/dashboard_chart/dashboard_chart.js:487 +#: desk/doctype/number_card/number_card.js:295 +#: desk/doctype/number_card/number_card.js:387 +#: public/js/frappe/widgets/chart_widget.js:407 +msgid "Set" +msgstr "Ange" + #: public/js/frappe/ui/filters/filter.js:569 msgctxt "Field value is set" msgid "Set" @@ -22880,8 +23019,8 @@ msgstr "Ange Dynamisk Filter" msgid "Set Filters" msgstr "Ange Filter" -#: public/js/frappe/widgets/chart_widget.js:395 -#: public/js/frappe/widgets/quick_list_widget.js:102 +#: public/js/frappe/widgets/chart_widget.js:396 +#: public/js/frappe/widgets/quick_list_widget.js:104 msgid "Set Filters for {0}" msgstr "Ange Filter för {0}" @@ -22969,6 +23108,10 @@ msgstr "Ange som Standard Tema" msgid "Set by user" msgstr "Anges av Användare" +#: public/js/frappe/utils/dashboard_utils.js:162 +msgid "Set dynamic filter values in JavaScript for the required fields here." +msgstr "Ange dynamiska filtervärden i JavaScript för erfordrade fält här." + #. Description of the 'Precision' (Select) field in DocType 'DocField' #. Description of the 'Precision' (Select) field in DocType 'Custom Field' #. Description of the 'Precision' (Select) field in DocType 'Customize Form @@ -23118,7 +23261,7 @@ msgstr "Inställningar > Användar Behörigheter" msgid "Setup Approval Workflows" msgstr "Ange Arbetsflöde för Godkännande " -#: public/js/frappe/views/reports/query_report.js:1690 +#: public/js/frappe/views/reports/query_report.js:1675 #: public/js/frappe/views/reports/report_view.js:1618 msgid "Setup Auto Email" msgstr "Automatisk E-post Rapport" @@ -23148,9 +23291,11 @@ msgstr "Ange Nummer Serie för Transaktioner" #. Label of the share (Check) field in DocType 'Custom DocPerm' #. Label of the share (Check) field in DocType 'DocPerm' #. Label of the share (Check) field in DocType 'DocShare' +#. Label of the share (Check) field in DocType 'User Document Type' #. Option for the 'Type' (Select) field in DocType 'Notification Log' #: core/doctype/custom_docperm/custom_docperm.json #: core/doctype/docperm/docperm.json core/doctype/docshare/docshare.json +#: core/doctype/user_document_type/user_document_type.json #: desk/doctype/notification_log/notification_log.json #: public/js/frappe/form/templates/form_sidebar.html:110 msgid "Share" @@ -23262,7 +23407,7 @@ msgstr "Visa Dokument" msgid "Show Error" msgstr "Visa Fel" -#: public/js/frappe/form/layout.js:561 +#: public/js/frappe/form/layout.js:563 msgid "Show Fieldname (click to copy on clipboard)" msgstr "Visa Fältnamn (klicka för att kopiera till urklipp)" @@ -23380,7 +23525,7 @@ msgid "Show Sidebar" msgstr "Visa Sidofält" #: public/js/frappe/list/list_sidebar.html:66 -#: public/js/frappe/list/list_view.js:1611 +#: public/js/frappe/list/list_view.js:1665 msgid "Show Tags" msgstr "Visa Taggar" @@ -23427,7 +23572,7 @@ msgstr "Visa konto borttagning länk på Mitt Konto sida" msgid "Show all Versions" msgstr "Visa alla versioner" -#: public/js/frappe/form/footer/form_timeline.js:67 +#: public/js/frappe/form/footer/form_timeline.js:69 msgid "Show all activity" msgstr "Visa All Aktivitet" @@ -23467,7 +23612,7 @@ msgstr "Visa i Filter" msgid "Show link to document" msgstr "Visa Länk till Dokument" -#: public/js/frappe/form/layout.js:255 public/js/frappe/form/layout.js:273 +#: public/js/frappe/form/layout.js:257 public/js/frappe/form/layout.js:275 msgid "Show more details" msgstr "Visa fler detaljer" @@ -23521,7 +23666,7 @@ msgstr "Sidofält och Kommentarer" msgid "Sign Up and Confirmation" msgstr "Registrering och Bekräftelse" -#: core/doctype/user/user.py:959 +#: core/doctype/user/user.py:974 msgid "Sign Up is disabled" msgstr "Registrering är inaktiverad" @@ -23637,7 +23782,7 @@ msgstr "Hoppar över Namnlös Kolumn" msgid "Skipping column {0}" msgstr "Hoppar över Kolumn {0}" -#: modules/utils.py:171 +#: modules/utils.py:175 msgid "Skipping fixture syncing for doctype {0} from file {1}" msgstr "Hoppar över fixture synkronisering för doctype {0} från fil {1}" @@ -23919,6 +24064,10 @@ msgstr "Standard DocType kan inte ha standard utskrift mall, använd Anpassa For msgid "Standard Not Set" msgstr "Standard Ej Angiven" +#: core/page/permission_manager/permission_manager.js:125 +msgid "Standard Permissions" +msgstr "Standard Behörigheter" + #: printing/doctype/print_format/print_format.py:74 msgid "Standard Print Format cannot be updated" msgstr "Standard Utskrift Format kan inte uppdateras" @@ -24321,7 +24470,7 @@ msgstr "Godkännande Kö" msgid "Submit" msgstr "Godkänn" -#: public/js/frappe/list/list_view.js:1985 +#: public/js/frappe/list/list_view.js:2039 msgctxt "Button in list view actions menu" msgid "Submit" msgstr "Godkänn" @@ -24374,11 +24523,11 @@ msgstr "Godkänn vid Skapande" msgid "Submit this document to complete this step." msgstr "Godkänn detta dokument för att slutföra detta steg." -#: public/js/frappe/form/form.js:1216 +#: public/js/frappe/form/form.js:1220 msgid "Submit this document to confirm" msgstr "Tryck på Spara/Godkänn för att genomföra." -#: public/js/frappe/list/list_view.js:1990 +#: public/js/frappe/list/list_view.js:2044 msgctxt "Title of confirmation dialog" msgid "Submit {0} documents?" msgstr "Godkänn {0} dokument?" @@ -24528,7 +24677,7 @@ msgstr "Föreslå Optimeringar" msgid "Suggested Indexes" msgstr "Föreslagen Indexering" -#: core/doctype/user/user.py:674 +#: core/doctype/user/user.py:689 msgid "Suggested Username: {0}" msgstr "Föreslagen Användarnamn: {0}" @@ -25051,7 +25200,7 @@ msgstr "Mall Varningar" msgid "Templates" msgstr "Mallar" -#: core/doctype/user/user.py:970 +#: core/doctype/user/user.py:985 msgid "Temporarily Disabled" msgstr "Tillfälligt Inaktiverad" @@ -25154,7 +25303,7 @@ msgid "The Client ID obtained from the Google Cloud Console under " msgstr "Klient ID som erhållits från Google Cloud Console under \"API och tjänster\" > \"Inloggningsuppgifter\"" -#: email/doctype/notification/notification.py:130 +#: email/doctype/notification/notification.py:131 msgid "The Condition '{0}' is invalid" msgstr "Villkor '{0}' är ogiltig" @@ -25203,7 +25352,11 @@ msgstr "Kolumn {0} har {1} olika datum format. Automatiskt ange {2} som standard msgid "The comment cannot be empty" msgstr "Kommentar kan inte vara tom" -#: public/js/frappe/list/list_view.js:630 +#: templates/emails/workflow_action.html:9 +msgid "The contents of this email are strictly confidential. Please do not forward this email to anyone." +msgstr "Innehållet i detta e-post meddelande är strikt konfidentiellt. Vänligen vidarebefordra inte detta e-post meddelande till någon." + +#: public/js/frappe/list/list_view.js:629 msgid "The count shown is an estimated count. Click here to see the accurate count." msgstr "Antal som visas är uppskattat antal. Klicka här för att se exakt antal." @@ -25304,11 +25457,11 @@ msgstr "Projekt Nummer erhålln från Google Cloud Console under " -#: core/doctype/user/user.py:930 +#: core/doctype/user/user.py:945 msgid "The reset password link has been expired" msgstr "Länk för återställning av lösenord har upphört att gälla" -#: core/doctype/user/user.py:932 +#: core/doctype/user/user.py:947 msgid "The reset password link has either been used before or is invalid" msgstr "Länk för återställning av lösenord har antingen använts tidigare eller är ogiltig" @@ -25346,7 +25499,7 @@ msgstr "Totalt antal användar dokument typer är passerad." msgid "The user from this field will be rewarded points" msgstr "Användare från detta fält kommer att belönas med poäng" -#: public/js/frappe/form/controls/data.js:24 +#: public/js/frappe/form/controls/data.js:25 msgid "The value you pasted was {0} characters long. Max allowed characters is {1}." msgstr "Antal tecken som klistrades in var {0}. Max tillåtet antal är {1}." @@ -25507,7 +25660,7 @@ msgstr "Detta Anslag Tavla kommer att vara privat" msgid "This action is irreversible. Do you wish to continue?" msgstr "Denna åtgärd är oåterkallelig. Vill du fortsätta?" -#: __init__.py:1014 +#: __init__.py:1020 msgid "This action is only allowed for {}" msgstr "Åtgärd är endast tillåten för {}" @@ -25553,11 +25706,11 @@ msgstr "Dokument har ändrats efter att e-post meddelande skickades." msgid "This document has been reverted" msgstr "Dokument är återställd" -#: public/js/frappe/form/form.js:1304 +#: public/js/frappe/form/form.js:1308 msgid "This document has unsaved changes which might not appear in final PDF.
Consider saving the document before printing." msgstr "Detta dokument har osparade ändringar som kanske inte visas i slutlig PDF fil.
Spara dokument innan utskrift." -#: public/js/frappe/form/form.js:1097 +#: public/js/frappe/form/form.js:1101 msgid "This document is already amended, you cannot ammend it again" msgstr "Detta dokument är redan ändrad, du kan inte ändra det igen" @@ -25594,7 +25747,7 @@ msgstr "Detta fält visas endast om fält namn definieras här har värde eller msgid "This file is public. It can be accessed without authentication." msgstr "Denna fil är publik. Den kan nås utan autentisering." -#: public/js/frappe/form/form.js:1194 +#: public/js/frappe/form/form.js:1198 msgid "This form has been modified after you have loaded it" msgstr "Denna form har ändrats efter öppnande" @@ -25613,7 +25766,7 @@ msgstr "Detta format används om land specifika format inte hittas" msgid "This goes above the slideshow." msgstr "Text ovanför Bildspel." -#: public/js/frappe/views/reports/query_report.js:2027 +#: public/js/frappe/views/reports/query_report.js:2012 msgid "This is a background report. Please set the appropriate filters and then generate a new one." msgstr "Detta är bakgrund rapport. Ange lämplig filter och skapa ny rapport." @@ -25741,7 +25894,7 @@ msgstr "Detta återställer Formulär Tur och visar den för alla användare. Ä msgid "This will terminate the job immediately and might be dangerous, are you sure? " msgstr "Detta avslutar jobb omedelbart och kan vara farligt, är du säker?" -#: core/doctype/user/user.py:1190 +#: core/doctype/user/user.py:1205 msgid "Throttled" msgstr "Strypt" @@ -26095,7 +26248,7 @@ msgstr "Hantera Tredje Part Appar" msgid "To print output use print(text)" msgstr "För att skriva ut, använd print(text)" -#: core/doctype/user_type/user_type.py:295 +#: core/doctype/user_type/user_type.py:292 msgid "To set the role {0} in the user {1}, kindly set the {2} field as {3} in one of the {4} record." msgstr "För att ange roll {0} för användare {1}, ange {2}-fält som {3} i en av {4}-poster." @@ -26162,7 +26315,7 @@ msgstr "Växla Rutnät Vy" msgid "Toggle Sidebar" msgstr "Växla Sidofält" -#: public/js/frappe/list/list_view.js:1726 +#: public/js/frappe/list/list_view.js:1780 msgctxt "Button in list view menu" msgid "Toggle Sidebar" msgstr "Växla Sidofält" @@ -26209,7 +26362,7 @@ msgstr "För Många Begäran" msgid "Too many changes to database in single action." msgstr "För många ändringar i databas i en enda åtgärd." -#: core/doctype/user/user.py:971 +#: core/doctype/user/user.py:986 msgid "Too many users signed up recently, so the registration is disabled. Please try back in an hour" msgstr "Alltför många Användare registrerade sig nyligen, så registrering är inaktiverad. Försök igen om en timme" @@ -26284,16 +26437,16 @@ msgstr "Totalt" #. Report' #: desk/doctype/system_health_report/system_health_report.json msgid "Total Background Workers" -msgstr "Totalt Bakgrund Tjänster" +msgstr "Totalt Antal Bakgrund Tjänster" #. Label of the total_errors (Int) field in DocType 'System Health Report' #: desk/doctype/system_health_report/system_health_report.json msgid "Total Errors (last 1 day)" -msgstr "Totalt Fel (sista dagen)" +msgstr "Totalt Antal Fel (Senaste dag)" #: public/js/frappe/ui/capture.js:259 msgid "Total Images" -msgstr "Totalt Bilder" +msgstr "Totalt Antal Bilder" #. Label of the total_outgoing_emails (Int) field in DocType 'System Health #. Report' @@ -26322,18 +26475,18 @@ msgstr "Totalt Användare" #. Label of the total_views (Int) field in DocType 'Newsletter' #: email/doctype/newsletter/newsletter.json msgid "Total Views" -msgstr "Totalt Visningar" +msgstr "Totalt Antal Visningar" #. Label of the total_working_time (Duration) field in DocType 'RQ Worker' #: core/doctype/rq_worker/rq_worker.json msgid "Total Working Time" -msgstr "Totalt Antal Arbetstimmar" +msgstr "Totalt Antal Arbetade Timmar" #. Description of the 'Initial Sync Count' (Select) field in DocType 'Email #. Account' #: email/doctype/email_account/email_account.json msgid "Total number of emails to sync in initial sync process " -msgstr "Totalt antal E-post meddelande som ska synkroniseras i första synkronisering behandling" +msgstr "Totalt antal E-post meddelande som ska synkroniseras i första synkronisering " #: public/js/frappe/views/reports/report_view.js:1178 msgid "Totals" @@ -26341,7 +26494,7 @@ msgstr "Totals" #: public/js/frappe/views/reports/report_view.js:1153 msgid "Totals Row" -msgstr "Totalt Rad" +msgstr "Totalt Antal Rader" #. Label of the trace_id (Data) field in DocType 'Error Log' #: core/doctype/error_log/error_log.json @@ -26478,6 +26631,10 @@ msgstr "Skräp" msgid "Tree" msgstr "Träd Vy" +#: public/js/frappe/list/base_list.js:211 +msgid "Tree View" +msgstr "Träd Vy" + #. Description of the 'Is Tree' (Check) field in DocType 'DocType' #: core/doctype/doctype/doctype.json msgid "Tree structures are implemented using Nested Set" @@ -26583,6 +26740,7 @@ msgstr "Två Faktor Autentisering Sätt" #: desk/doctype/workspace_link/workspace_link.json #: desk/doctype/workspace_shortcut/workspace_shortcut.json #: public/js/frappe/views/file/file_view.js:337 +#: public/js/frappe/widgets/widget_dialog.js:399 #: social/doctype/energy_point_log/energy_point_log.json #: website/doctype/web_template/web_template.json www/attribution.html:35 msgid "Type" @@ -26665,6 +26823,7 @@ msgstr "URI för att ta emot behörighet kod när Användare tillåter tillgång #: desk/doctype/workspace_shortcut/workspace_shortcut.json #: integrations/doctype/integration_request/integration_request.json #: integrations/doctype/webhook_request_log/webhook_request_log.json +#: public/js/frappe/widgets/widget_dialog.js:469 #: website/doctype/top_bar_item/top_bar_item.json #: website/doctype/website_slideshow_item/website_slideshow_item.json msgid "URL" @@ -26709,7 +26868,7 @@ msgstr "Kan inte ladda: {0}" msgid "Unable to open attached file. Did you export it as CSV?" msgstr "Kan inte öppna bifogad fil. Är den exporterad som CSV?" -#: core/doctype/file/utils.py:97 core/doctype/file/utils.py:129 +#: core/doctype/file/utils.py:98 core/doctype/file/utils.py:130 msgid "Unable to read file format for {0}" msgstr "Kan inte läsa fil format för {0}" @@ -26818,7 +26977,7 @@ msgstr "Oläst Avisering Skickad" msgid "Unsafe SQL query" msgstr "Osäker SQL Fråga" -#: public/js/frappe/data_import/data_exporter.js:158 +#: public/js/frappe/data_import/data_exporter.js:159 #: public/js/frappe/form/controls/multicheck.js:166 msgid "Unselect All" msgstr "Avmarkera Alla" @@ -26988,7 +27147,7 @@ msgctxt "Freeze message while updating a document" msgid "Updating" msgstr "Uppdaterar" -#: email/doctype/email_queue/email_queue.py:433 +#: email/doctype/email_queue/email_queue.py:446 msgid "Updating Email Queue Statuses. The emails will be picked up in the next scheduled run." msgstr "Uppdatera E-post kö status. E-post kommer att hämtas vid nästa schemalagda körning." @@ -27316,7 +27475,7 @@ msgstr "Användare" msgid "User Id Field" msgstr "Användar ID Fält" -#: core/doctype/user_type/user_type.py:287 +#: core/doctype/user_type/user_type.py:284 msgid "User Id Field is mandatory in the user type {0}" msgstr "Fält Användare ID erfodras i användare typ {0}" @@ -27341,12 +27500,12 @@ msgid "User Permission" msgstr "Användare Behörighet" #: core/page/permission_manager/permission_manager_help.html:30 -#: public/js/frappe/views/reports/query_report.js:1804 +#: public/js/frappe/views/reports/query_report.js:1789 #: public/js/frappe/views/reports/report_view.js:1666 msgid "User Permissions" msgstr "Användare Behörigheter" -#: public/js/frappe/list/list_view.js:1684 +#: public/js/frappe/list/list_view.js:1738 msgctxt "Button in list view menu" msgid "User Permissions" msgstr "Användare Behörigheter" @@ -27453,7 +27612,7 @@ msgstr "Användare erfodras för Delad Mapp" msgid "User must always select" msgstr "Användare måste altid välja" -#: model/delete_doc.py:235 +#: model/delete_doc.py:244 msgid "User not allowed to delete {0}: {1}" msgstr "Användare är inte tillåten radera {0}: {1}" @@ -27469,15 +27628,15 @@ msgstr "Användare med E-post {0} finns inte" msgid "User with email: {0} does not exist in the system. Please ask 'System Administrator' to create the user for you." msgstr "Användare med E-post: {0} finns inte. Be 'System Administratör' om hjälp." -#: core/doctype/user/user.py:485 +#: core/doctype/user/user.py:491 msgid "User {0} cannot be deleted" msgstr "Användare {0} kan inte raderas" -#: core/doctype/user/user.py:280 +#: core/doctype/user/user.py:285 msgid "User {0} cannot be disabled" msgstr "Användare {0} kan inte inaktiveras" -#: core/doctype/user/user.py:556 +#: core/doctype/user/user.py:571 msgid "User {0} cannot be renamed" msgstr "Användare {0} kan inte byta namn" @@ -27498,7 +27657,7 @@ msgstr "Användare {0} har inte behörighet att skapa Arbetsyta." msgid "User {0} has requested for data deletion" msgstr "Användare {0} begärde radering av data" -#: core/doctype/user/user.py:1319 +#: core/doctype/user/user.py:1334 msgid "User {0} impersonated as {1}" msgstr "Användare {0} efterliknade som {1}" @@ -27526,7 +27685,7 @@ msgstr "Användare Info URI" msgid "Username" msgstr "Användare Namn" -#: core/doctype/user/user.py:641 +#: core/doctype/user/user.py:656 msgid "Username {0} already exists" msgstr "Användare Namn {0} finns redan" @@ -27589,6 +27748,12 @@ msgstr "Giltig e-post och namn erfodras" msgid "Validate Field" msgstr "Validera Fält" +#. Label of the validate_frappe_mail_settings (Button) field in DocType 'Email +#. Account' +#: email/doctype/email_account/email_account.json +msgid "Validate Frappe Mail Settings" +msgstr "Validera Frappe Mail Inställningar" + #. Label of the validate_ssl_certificate (Check) field in DocType 'Email #. Account' #. Label of the validate_ssl_certificate (Check) field in DocType 'Email @@ -27659,7 +27824,7 @@ msgstr "Värde Ändrad" msgid "Value To Be Set" msgstr "Värde som ska Anges" -#: model/base_document.py:965 model/document.py:682 +#: model/base_document.py:966 model/document.py:682 msgid "Value cannot be changed for {0}" msgstr "Värde kan inte ändras för {0}" @@ -27702,7 +27867,7 @@ msgstr "Värde måste vara ett av {0}" msgid "Value to Validate" msgstr "Värde att Validera" -#: model/base_document.py:1035 +#: model/base_document.py:1036 msgid "Value too big" msgstr "Värde för hög" @@ -27727,7 +27892,7 @@ msgstr "Värde Ändrad " msgid "Verdana" msgstr "Verdana" -#: twofactor.py:357 +#: twofactor.py:352 msgid "Verfication Code" msgstr "Verifiering Kod" @@ -27748,11 +27913,11 @@ msgstr "Verifiering Kod är skickad till din E-post." msgid "Verified" msgstr "Verifierad" -#: public/js/frappe/ui/messages.js:350 +#: public/js/frappe/ui/messages.js:352 msgid "Verify" msgstr "Verifiera" -#: public/js/frappe/ui/messages.js:349 +#: public/js/frappe/ui/messages.js:351 msgid "Verify Password" msgstr "Verifiera Lösenord" @@ -27801,7 +27966,7 @@ msgid "View Full Log" msgstr "Visa Full Logg" #: public/js/frappe/views/treeview.js:463 -#: public/js/frappe/widgets/quick_list_widget.js:245 +#: public/js/frappe/widgets/quick_list_widget.js:247 msgid "View List" msgstr "Visa Lista" @@ -28125,7 +28290,7 @@ msgstr "Webhook URL" #. Group in Module Def's connections #. Name of a Workspace #: core/doctype/module_def/module_def.json -#: email/doctype/newsletter/newsletter.py:449 +#: email/doctype/newsletter/newsletter.py:453 #: public/js/frappe/ui/toolbar/about.js:8 #: website/workspace/website/website.json msgid "Website" @@ -28363,11 +28528,11 @@ msgstr "Välkommen URL" msgid "Welcome Workspace" msgstr "Välkommen Arbetsyta" -#: core/doctype/user/user.py:363 +#: core/doctype/user/user.py:369 msgid "Welcome email sent" msgstr "Välkomst E-post skickad" -#: core/doctype/user/user.py:424 +#: core/doctype/user/user.py:430 msgid "Welcome to {0}" msgstr "Välkommen till {0}" @@ -28569,7 +28734,7 @@ msgstr "Arbetsflöde Tillstånd inte angiven" #: model/workflow.py:197 model/workflow.py:205 msgid "Workflow State transition not allowed from {0} to {1}" -msgstr "Arbetsflöde Övergång inte tillåten från {0} till {1}" +msgstr "Arbetsflöde Tillstånd Övergång inte tillåten från {0} till {1}" #: model/workflow.py:320 msgid "Workflow Status" @@ -28683,7 +28848,7 @@ msgstr "Slutför" msgid "Write" msgstr "Skriva" -#: model/base_document.py:875 +#: model/base_document.py:876 msgid "Wrong Fetch From value" msgstr "Fel Hämtning Från Värde" @@ -28770,7 +28935,7 @@ msgstr "Gul" #: public/js/form_builder/utils.js:336 #: public/js/frappe/form/controls/link.js:475 #: public/js/frappe/list/list_sidebar_group_by.js:223 -#: public/js/frappe/views/reports/query_report.js:1541 +#: public/js/frappe/views/reports/query_report.js:1526 #: website/doctype/help_article/templates/help_article.html:25 msgid "Yes" msgstr "Ja" @@ -28790,7 +28955,7 @@ msgctxt "Name of the current user. For example: You edited this 5 hours ago." msgid "You" msgstr "Du" -#: public/js/frappe/form/footer/form_timeline.js:462 +#: public/js/frappe/form/footer/form_timeline.js:464 msgid "You Liked" msgstr "Du Gillade" @@ -28854,7 +29019,7 @@ msgstr "Du har inte behörighet att komma åt denna sida utan inloggning." msgid "You are not permitted to access this page." msgstr "Du har inte behörighet att komma åt den här sidan." -#: __init__.py:933 +#: __init__.py:939 msgid "You are not permitted to access this resource." msgstr "Du har inte behörighet att komma åt denna resurs." @@ -28866,11 +29031,11 @@ msgstr "Du följer nu detta dokument och kommer att få dagliga uppdateringar vi msgid "You are only allowed to update order, do not remove or add apps." msgstr "Du får bara uppdatera ordning, inte ta bort eller lägga till appar." -#: email/doctype/email_account/email_account.js:216 +#: email/doctype/email_account/email_account.js:245 msgid "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)." msgstr "Du väljer Synkronisering Alternativ som ALLA. Det kommer att synkronisera alla lästa såväl som olästa meddelanden från server. Detta kan också orsaka kopior av korrespondens (e-post)." -#: public/js/frappe/form/footer/form_timeline.js:413 +#: public/js/frappe/form/footer/form_timeline.js:415 msgctxt "Form timeline" msgid "You attached {0}" msgstr "Du {0}" @@ -28907,9 +29072,9 @@ msgstr "Du kan ändra lagring princip från {0}." msgid "You can continue with the onboarding after exploring this page" msgstr "Du kan fortsätta med Introduktion efter att utforskning av denna sida" -#: core/doctype/user/user.py:543 -msgid "You can disable the user instead of deleting it." -msgstr "Du kan inaktivera användare istället för att ta bort den." +#: model/delete_doc.py:136 +msgid "You can disable this {0} instead of deleting it." +msgstr "Du kan inaktivera denna {0} istället för att radera den." #: core/doctype/file/file.py:691 msgid "You can increase the limit from System Settings." @@ -29001,12 +29166,12 @@ msgstr "Du ändrade värde av {0}" msgid "You changed the values for {0} {1}" msgstr "Du ändrade värde av {0} {1}" -#: public/js/frappe/form/footer/form_timeline.js:442 +#: public/js/frappe/form/footer/form_timeline.js:444 msgctxt "Form timeline" msgid "You changed {0} to {1}" msgstr "Du ändrade {0} till {1}" -#: public/js/frappe/form/footer/form_timeline.js:138 +#: public/js/frappe/form/footer/form_timeline.js:140 #: public/js/frappe/form/sidebar/form_sidebar.js:106 msgid "You created this" msgstr "Du skapade detta" @@ -29036,7 +29201,7 @@ msgstr "Du har inte tillräckligt med recension poäng" msgid "You do not have permission to view this document" msgstr "Du har inte behörighet att se detta dokument" -#: public/js/frappe/form/form.js:955 +#: public/js/frappe/form/form.js:959 msgid "You do not have permissions to cancel all linked documents." msgstr "Du har inte behörighet att annullera alla länkade dokument." @@ -29088,7 +29253,7 @@ msgstr "Du har inte anget någon värde. Fält kommer att vara tom." msgid "You have received a ❤️ like on your blog post" msgstr "Du fick ❤️ gilla på ditt blogg inlägg" -#: twofactor.py:448 +#: twofactor.py:432 msgid "You have to enable Two Factor Auth from System Settings." msgstr "Du behöver ktivera \"\"Two Factor Auth\"\" från System Inställningar." @@ -29108,7 +29273,7 @@ msgstr "Visa {0}" msgid "You haven't added any Dashboard Charts or Number Cards yet." msgstr "Du har inte lagt till några Översiktpanel Diagram eller Nummerkort än." -#: public/js/frappe/list/list_view.js:473 +#: public/js/frappe/list/list_view.js:470 msgid "You haven't created a {0} yet" msgstr "{0} är inte skapad än" @@ -29116,7 +29281,7 @@ msgstr "{0} är inte skapad än" msgid "You hit the rate limit because of too many requests. Please try after sometime." msgstr "Du nådde gräns på grund av för många förfrågningar. Försök igen senare." -#: public/js/frappe/form/footer/form_timeline.js:149 +#: public/js/frappe/form/footer/form_timeline.js:151 #: public/js/frappe/form/sidebar/form_sidebar.js:95 msgid "You last edited this" msgstr "Du ändrade detta för" @@ -29177,7 +29342,7 @@ msgstr "Du måste installera pycups för att använda denna funktion!" msgid "You need to select indexes you want to add first." msgstr "Du måste välja index du vill lägga till först." -#: email/doctype/email_account/email_account.py:147 +#: email/doctype/email_account/email_account.py:153 msgid "You need to set one IMAP folder for {0}" msgstr "Du måste ange en IMAP mapp för {0}" @@ -29189,7 +29354,7 @@ msgstr "Du har inte behörighet för att byta namn" msgid "You need {0} permission to fetch values from {1} {2}" msgstr "Du behöver {0} behörighet för att hämta värden från {1} {2}" -#: public/js/frappe/form/footer/form_timeline.js:418 +#: public/js/frappe/form/footer/form_timeline.js:420 msgctxt "Form timeline" msgid "You removed attachment {0}" msgstr "Du tog bort bilaga {0}" @@ -29216,7 +29381,7 @@ msgstr "Du godkännde detta dokument {0}" msgid "You unfollowed this document" msgstr "Du slutade följa detta dokument" -#: public/js/frappe/form/footer/form_timeline.js:182 +#: public/js/frappe/form/footer/form_timeline.js:184 msgid "You viewed this" msgstr "Du visade detta" @@ -29938,7 +30103,7 @@ msgstr "tagg namn... t.ex. #tagg" msgid "text in document type" msgstr "text i doctype" -#: public/js/frappe/form/controls/data.js:35 +#: public/js/frappe/form/controls/data.js:36 msgid "this form" msgstr "detta formulär" @@ -29983,7 +30148,7 @@ msgstr "via Data Import" msgid "via Google Meet" msgstr "via Google Meet" -#: email/doctype/notification/notification.py:215 +#: email/doctype/notification/notification.py:220 msgid "via Notification" msgstr "via Avisering" @@ -30051,12 +30216,12 @@ msgstr "{0} ${skip_list ? \"\" : type}" msgid "{0} ${type}" msgstr "{0} ${type}" -#: public/js/frappe/data_import/data_exporter.js:79 +#: public/js/frappe/data_import/data_exporter.js:80 #: public/js/frappe/views/gantt/gantt_view.js:54 msgid "{0} ({1})" msgstr "{0} ({1})" -#: public/js/frappe/data_import/data_exporter.js:76 +#: public/js/frappe/data_import/data_exporter.js:77 msgid "{0} ({1}) (1 row mandatory)" msgstr "{0} ({1}) (1 rad erfodras)" @@ -30099,14 +30264,14 @@ msgstr "{0} Google Kalender Händelser synkroniseras." msgid "{0} Google Contacts synced." msgstr "{0} Google Kontakter synkroniseras." -#: public/js/frappe/form/footer/form_timeline.js:463 +#: public/js/frappe/form/footer/form_timeline.js:465 msgid "{0} Liked" msgstr "{0} Gillade" #: public/js/frappe/ui/toolbar/search_utils.js:83 #: public/js/frappe/ui/toolbar/search_utils.js:84 #: public/js/frappe/utils/utils.js:924 -#: public/js/frappe/widgets/chart_widget.js:317 www/list.html:4 www/list.html:8 +#: public/js/frappe/widgets/chart_widget.js:318 www/list.html:4 www/list.html:8 msgid "{0} List" msgstr "{0} Lista" @@ -30126,14 +30291,14 @@ msgstr "{0} Moduler" msgid "{0} Name" msgstr "{0} Namn" -#: model/base_document.py:1065 +#: model/base_document.py:1066 msgid "{0} Not allowed to change {1} after submission from {2} to {3}" msgstr "{0} Ej Tillåtet att ändra {1} efter godkännande från {2} till {3}" #: public/js/frappe/ui/toolbar/search_utils.js:95 #: public/js/frappe/ui/toolbar/search_utils.js:96 #: public/js/frappe/utils/utils.js:921 -#: public/js/frappe/widgets/chart_widget.js:325 +#: public/js/frappe/widgets/chart_widget.js:326 msgid "{0} Report" msgstr "{0} Rapport" @@ -30152,11 +30317,7 @@ msgstr "{0} Inställningar" msgid "{0} Tree" msgstr "{0} Träd Vy" -#: public/js/frappe/list/base_list.js:209 -msgid "{0} View" -msgstr "{0} Vy" - -#: public/js/frappe/form/footer/form_timeline.js:126 +#: public/js/frappe/form/footer/form_timeline.js:128 #: public/js/frappe/form/sidebar/form_sidebar.js:86 msgid "{0} Web page views" msgstr "{0} Webbsida Visningar" @@ -30170,7 +30331,7 @@ msgstr "{0} Arbetsyta" msgid "{0} added" msgstr "{0} tillagd" -#: public/js/frappe/form/controls/data.js:203 +#: public/js/frappe/form/controls/data.js:204 msgid "{0} already exists. Select another name" msgstr "{0} finns redan. Välj ett annat namn" @@ -30228,7 +30389,7 @@ msgstr "{0} tilldelade dig ny uppgift {1} {2}" msgid "{0} assigned {1}: {2}" msgstr "{0} tilldelad {1}: {2}" -#: public/js/frappe/form/footer/form_timeline.js:414 +#: public/js/frappe/form/footer/form_timeline.js:416 msgctxt "Form timeline" msgid "{0} attached {1}" msgstr "{0} bifogade {1}" @@ -30266,7 +30427,7 @@ msgstr "{0} ändrade värde på {1}" msgid "{0} changed the values for {1} {2}" msgstr "{0} ändrade värdena för {1} {2}" -#: public/js/frappe/form/footer/form_timeline.js:443 +#: public/js/frappe/form/footer/form_timeline.js:445 msgctxt "Form timeline" msgid "{0} changed {1} to {2}" msgstr "{0} ändrade {1} till {2}" @@ -30283,7 +30444,7 @@ msgstr "{0} innehåller ogiltigt Hämta Från uttryck, Hämta från kan inte var msgid "{0} created successfully" msgstr "{0} skapades" -#: public/js/frappe/form/footer/form_timeline.js:139 +#: public/js/frappe/form/footer/form_timeline.js:141 #: public/js/frappe/form/sidebar/form_sidebar.js:107 msgid "{0} created this" msgstr "{0} skapade detta" @@ -30375,7 +30536,7 @@ msgstr "{0} är lagd till E-post Grupp." msgid "{0} has left the conversation in {1} {2}" msgstr "{0} har lämnat konversation i {1} {2}" -#: __init__.py:2493 +#: __init__.py:2499 msgid "{0} has no versions tracked." msgstr "{0} har inga spårade versioner." @@ -30441,7 +30602,7 @@ msgstr "{0} är mindre än {1}" msgid "{0} is like {1}" msgstr "{0} är som {1}" -#: email/doctype/email_account/email_account.py:176 +#: email/doctype/email_account/email_account.py:186 msgid "{0} is mandatory" msgstr "{0} är erfodrad" @@ -30521,7 +30682,7 @@ msgstr "{0} är nu standard utskrift format för {1} DocType" msgid "{0} is one of {1}" msgstr "{0} är en av {1}" -#: email/doctype/email_account/email_account.py:277 model/naming.py:217 +#: email/doctype/email_account/email_account.py:293 model/naming.py:217 #: printing/doctype/print_format/print_format.py:91 utils/csvutils.py:153 msgid "{0} is required" msgstr "{0} erfodras" @@ -30534,15 +30695,15 @@ msgstr "{0} är angiven" msgid "{0} is within {1}" msgstr "{0} är inom {1}" -#: public/js/frappe/list/list_view.js:1601 +#: public/js/frappe/list/list_view.js:1655 msgid "{0} items selected" msgstr "{0} artiklar valda" -#: core/doctype/user/user.py:1328 +#: core/doctype/user/user.py:1343 msgid "{0} just impersonated as you. They gave this reason: {1}" msgstr "{0} efterliknade som du. De gav detta skäl: {1}" -#: public/js/frappe/form/footer/form_timeline.js:150 +#: public/js/frappe/form/footer/form_timeline.js:152 #: public/js/frappe/form/sidebar/form_sidebar.js:96 msgid "{0} last edited this" msgstr "{0} senast redigerade detta" @@ -30595,7 +30756,7 @@ msgstr "{0} måste börja och sluta med bokstav och får bara innehålla bokstä #: workflow/doctype/workflow/workflow.py:91 msgid "{0} not a valid State" -msgstr "{0} inte en giltig Tillstånd" +msgstr "{0} är inte giltig Tillstånd" #: model/rename_doc.py:380 msgid "{0} not allowed to be renamed" @@ -30605,11 +30766,11 @@ msgstr "{0} Ej Tillåtet att ändra namn på" msgid "{0} not found" msgstr "{0} hittades inte" -#: core/doctype/report/report.py:413 public/js/frappe/list/list_view.js:992 +#: core/doctype/report/report.py:413 public/js/frappe/list/list_view.js:1029 msgid "{0} of {1}" msgstr "{0} av {1}" -#: public/js/frappe/list/list_view.js:994 +#: public/js/frappe/list/list_view.js:1031 msgid "{0} of {1} ({2} rows with children)" msgstr "{0} av {1} ({2} rader med underordnade)" @@ -30642,11 +30803,11 @@ msgstr "{0} poster sparas i {1} dagar." msgid "{0} records deleted" msgstr "{0} poster raderade" -#: public/js/frappe/data_import/data_exporter.js:228 +#: public/js/frappe/data_import/data_exporter.js:229 msgid "{0} records will be exported" msgstr "{0} poster kommer att exporteras" -#: public/js/frappe/form/footer/form_timeline.js:419 +#: public/js/frappe/form/footer/form_timeline.js:421 msgctxt "Form timeline" msgid "{0} removed attachment {1}" msgstr "{0} tog bort bilaga {1}" @@ -30738,7 +30899,7 @@ msgstr "{0} uppdaterat" msgid "{0} values selected" msgstr "{0} värden valda" -#: public/js/frappe/form/footer/form_timeline.js:183 +#: public/js/frappe/form/footer/form_timeline.js:185 msgid "{0} viewed this" msgstr "{0} visade detta" @@ -30770,11 +30931,11 @@ msgstr "{0} {1} är lagd till i Översikt Panel {2}" msgid "{0} {1} already exists" msgstr "{0} {1} finns redan" -#: model/base_document.py:908 +#: model/base_document.py:909 msgid "{0} {1} cannot be \"{2}\". It should be one of \"{3}\"" msgstr "{0} {1} kan inte vara \"{2}\". Det kan vara en av följande: \"{3}\"" -#: utils/nestedset.py:337 +#: utils/nestedset.py:340 msgid "{0} {1} cannot be a leaf node as it has children" msgstr "{0} {1} kan inte vara undernod då den har undernoder" @@ -30782,7 +30943,7 @@ msgstr "{0} {1} kan inte vara undernod då den har undernoder" msgid "{0} {1} does not exist, select a new target to merge" msgstr "{0} {1} existerar inte. Välj ny mål att sammanfoga" -#: public/js/frappe/form/form.js:946 +#: public/js/frappe/form/form.js:950 msgid "{0} {1} is linked with the following submitted documents: {2}" msgstr "{0} {1} är länkad till följande godkända dokument: {2}" @@ -30790,15 +30951,15 @@ msgstr "{0} {1} är länkad till följande godkända dokument: {2}" msgid "{0} {1} not found" msgstr "{0} {1} hittades inte" -#: model/delete_doc.py:242 +#: model/delete_doc.py:251 msgid "{0} {1}: Submitted Record cannot be deleted. You must {2} Cancel {3} it first." msgstr "{0} {1}: Godkänd Post kan inte raderas. Du måste {2} Annullera {3} det först." -#: model/base_document.py:1026 +#: model/base_document.py:1027 msgid "{0}, Row {1}" msgstr "{0}, Rad {1}" -#: model/base_document.py:1031 +#: model/base_document.py:1032 msgid "{0}: '{1}' ({3}) will get truncated, as max characters allowed is {2}" msgstr "{0}: {1} ({3}) kommer att förminskas då maximum tillåtna antal tecken är {2}" @@ -30882,7 +31043,7 @@ msgstr "{0}: Andra behörighet regler kan också gälla" msgid "{0}: Permission at level 0 must be set before higher levels are set" msgstr "{0}: Behörighet på nivå 0 måste anges före högre nivåer anges" -#: public/js/frappe/form/controls/data.js:50 +#: public/js/frappe/form/controls/data.js:51 msgid "{0}: You can increase the limit for the field if required via {1}" msgstr "{0}: Öka gräns för fältet vid behov via {1}" @@ -30891,7 +31052,7 @@ msgid "{0}: fieldname cannot be set to reserved keyword {1}" msgstr "{0}: fältnamn kan inte anges för reserverad sökord {1}" #: contacts/doctype/address/address.js:35 -#: contacts/doctype/contact/contact.js:83 +#: contacts/doctype/contact/contact.js:88 #: public/js/frappe/views/workspace/workspace.js:170 msgid "{0}: {1}" msgstr "{0}: {1}" @@ -30966,8 +31127,8 @@ msgstr "{} stöder inte automatisk logg rensning." msgid "{} field cannot be empty." msgstr "{} fält kan inte vara tom." -#: email/doctype/email_account/email_account.py:200 -#: email/doctype/email_account/email_account.py:208 +#: email/doctype/email_account/email_account.py:216 +#: email/doctype/email_account/email_account.py:224 msgid "{} has been disabled. It can only be enabled if {} is checked." msgstr "{} är inaktiverad. Den kan bara aktiveras om {} är markerad." diff --git a/frappe/migrate.py b/frappe/migrate.py index 8afdd765f3..b6ebf00a2b 100644 --- a/frappe/migrate.py +++ b/frappe/migrate.py @@ -13,6 +13,7 @@ import frappe.modules.patch_handler import frappe.translate from frappe.cache_manager import clear_global_cache from frappe.core.doctype.language.language import sync_languages +from frappe.core.doctype.navbar_settings.navbar_settings import sync_standard_items from frappe.core.doctype.scheduled_job_type.scheduled_job_type import sync_jobs from frappe.database.schema import add_column from frappe.deferred_insert import save_to_db as flush_deferred_inserts @@ -141,6 +142,7 @@ class SiteMigration: print("Syncing fixtures...") sync_fixtures() + sync_standard_items() print("Syncing dashboards...") sync_dashboards() diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index 595730858b..43e88ffced 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -252,7 +252,7 @@ class BaseDocument: if key in self.__dict__: del self.__dict__[key] - def append(self, key: str, value: D | dict | None = None) -> D: + def append(self, key: str, value: D | dict | None = None, position: int = -1) -> D: """Append an item to a child table. Example: @@ -268,13 +268,22 @@ class BaseDocument: if (table := self.__dict__.get(key)) is None: self.__dict__[key] = table = [] - ret_value = self._init_child(value, key) - table.append(ret_value) + d = self._init_child(value, key) + + if position == -1: + table.append(d) + else: + # insert at specific position + table.insert(position, d) + + # re number idx + for i, _d in enumerate(table): + _d.idx = i + 1 # reference parent document but with weak reference, parent_doc will be deleted if self is garbage collected. - ret_value.parent_doc = weakref.ref(self) + d.parent_doc = weakref.ref(self) - return ret_value + return d @property def parent_doc(self): diff --git a/frappe/model/delete_doc.py b/frappe/model/delete_doc.py index 3d83af16b7..c1c8f2cb70 100644 --- a/frappe/model/delete_doc.py +++ b/frappe/model/delete_doc.py @@ -127,8 +127,17 @@ def delete_doc( # check if links exist if not force: - check_if_doc_is_linked(doc) - check_if_doc_is_dynamically_linked(doc) + try: + check_if_doc_is_linked(doc) + check_if_doc_is_dynamically_linked(doc) + except frappe.LinkExistsError as e: + if doc.meta.has_field("enabled") or doc.meta.has_field("disabled"): + frappe.throw( + _("You can disable this {0} instead of deleting it.").format(_(doctype)), + frappe.LinkExistsError, + ) + else: + raise e update_naming_series(doc) delete_from_table(doctype, name, ignore_doctypes, doc) diff --git a/frappe/model/document.py b/frappe/model/document.py index 01278775b3..d216aebacc 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -238,7 +238,7 @@ class Document(BaseDocument): def raise_no_permission_to(self, perm_type): """Raise `frappe.PermissionError`.""" frappe.flags.error_message = ( - _("Insufficient Permission for {0}").format(self.doctype) + f" ({frappe.bold(_(perm_type))})" + _("Insufficient Permission for {0}").format(_(self.doctype)) + f" ({frappe.bold(_(perm_type))})" ) raise frappe.PermissionError @@ -458,7 +458,7 @@ class Document(BaseDocument): d: Document d.db_update() - def get_doc_before_save(self) -> "Document": + def get_doc_before_save(self) -> "Self": return getattr(self, "_doc_before_save", None) def has_value_changed(self, fieldname): @@ -1031,7 +1031,7 @@ class Document(BaseDocument): "on_cancel": "Cancel", } - if not self.flags.in_insert: + if not self.flags.in_insert and not self.flags.in_delete: # value change is not applicable in insert event_map["on_change"] = "Value Change" diff --git a/frappe/modules/utils.py b/frappe/modules/utils.py index adcc55e4a8..2c034d3bbf 100644 --- a/frappe/modules/utils.py +++ b/frappe/modules/utils.py @@ -64,16 +64,20 @@ def export_customizations( frappe.throw(_("Only allowed to export customizations in developer mode")) custom = { - "custom_fields": frappe.get_all("Custom Field", fields="*", filters={"dt": doctype}), - "property_setters": frappe.get_all("Property Setter", fields="*", filters={"doc_type": doctype}), + "custom_fields": frappe.get_all("Custom Field", fields="*", filters={"dt": doctype}, order_by="name"), + "property_setters": frappe.get_all( + "Property Setter", fields="*", filters={"doc_type": doctype}, order_by="name" + ), "custom_perms": [], - "links": frappe.get_all("DocType Link", fields="*", filters={"parent": doctype}), + "links": frappe.get_all("DocType Link", fields="*", filters={"parent": doctype}, order_by="name"), "doctype": doctype, "sync_on_migrate": sync_on_migrate, } if with_permissions: - custom["custom_perms"] = frappe.get_all("Custom DocPerm", fields="*", filters={"parent": doctype}) + custom["custom_perms"] = frappe.get_all( + "Custom DocPerm", fields="*", filters={"parent": doctype}, order_by="name" + ) # also update the custom fields and property setters for all child tables for d in frappe.get_meta(doctype).get_table_fields(): diff --git a/frappe/patches.txt b/frappe/patches.txt index a937f535fc..cead1d85ad 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -237,3 +237,5 @@ frappe.patches.v15_0.migrate_session_data frappe.custom.doctype.property_setter.patches.remove_invalid_fetch_from_expressions frappe.patches.v16_0.switch_default_sort_order frappe.integrations.doctype.oauth_client.patches.set_default_allowed_role_in_oauth_client +execute:frappe.db.set_single_value("Workspace Settings", "workspace_setup_completed", 1) + diff --git a/frappe/public/js/form.bundle.js b/frappe/public/js/form.bundle.js index f2d19f5f3b..84af6d3f60 100644 --- a/frappe/public/js/form.bundle.js +++ b/frappe/public/js/form.bundle.js @@ -11,6 +11,7 @@ import "./frappe/form/templates/timeline_message_box.html"; import "./frappe/form/templates/users_in_sidebar.html"; import "./frappe/views/formview.js"; +import "./frappe/views/render_preview.js"; import "./frappe/form/form.js"; import "./frappe/meta_tag.js"; import "./frappe/doctype/"; diff --git a/frappe/public/js/form_builder/components/controls/FetchFromControl.vue b/frappe/public/js/form_builder/components/controls/FetchFromControl.vue index 1873a7b5d4..3afdaa69b7 100644 --- a/frappe/public/js/form_builder/components/controls/FetchFromControl.vue +++ b/frappe/public/js/form_builder/components/controls/FetchFromControl.vue @@ -63,7 +63,7 @@ let field_df = computedAsync(async () => { watch( () => props.value, (value) => { - [doctype.value, fieldname.value] = value?.split(".") || ["", ""]; + if (value) [doctype.value, fieldname.value] = value.split(".") || ["", ""]; }, { immediate: true } ); diff --git a/frappe/public/js/frappe/form/controls/base_input.js b/frappe/public/js/frappe/form/controls/base_input.js index 22958701be..fcb1a8ad31 100644 --- a/frappe/public/js/frappe/form/controls/base_input.js +++ b/frappe/public/js/frappe/form/controls/base_input.js @@ -7,6 +7,11 @@ frappe.ui.form.ControlInput = class ControlInput extends frappe.ui.form.Control // set description this.set_max_width(); + + // set initial value if set + if (this.df.initial_value) { + this.set_value(this.df.initial_value); + } } make_wrapper() { if (this.only_input) { diff --git a/frappe/public/js/frappe/form/controls/data.js b/frappe/public/js/frappe/form/controls/data.js index b090ed3cf2..a66aaa30b8 100644 --- a/frappe/public/js/frappe/form/controls/data.js +++ b/frappe/public/js/frappe/form/controls/data.js @@ -7,10 +7,11 @@ frappe.ui.form.ControlData = class ControlData extends frappe.ui.form.ControlInp make_input() { if (this.$input) return; - let { html_element, input_type } = this.constructor; + let { html_element, input_type, input_mode } = this.constructor; this.$input = $("<" + html_element + ">") .attr("type", input_type) + .attr("inputmode", input_mode) .attr("autocomplete", "off") .addClass("input-with-feedback form-control") .prependTo(this.input_area); diff --git a/frappe/public/js/frappe/form/controls/duration.js b/frappe/public/js/frappe/form/controls/duration.js index 9ef8b3b1e2..66f73060b2 100644 --- a/frappe/public/js/frappe/form/controls/duration.js +++ b/frappe/public/js/frappe/form/controls/duration.js @@ -4,6 +4,13 @@ frappe.ui.form.ControlDuration = class ControlDuration extends frappe.ui.form.Co this.make_picker(); } + validate(value) { + if (!value) { + return null; + } + return super.validate(value); + } + make_picker() { this.inputs = []; this.set_duration_options(); diff --git a/frappe/public/js/frappe/form/controls/int.js b/frappe/public/js/frappe/form/controls/int.js index 122b43b498..48175a92c0 100644 --- a/frappe/public/js/frappe/form/controls/int.js +++ b/frappe/public/js/frappe/form/controls/int.js @@ -1,5 +1,6 @@ frappe.ui.form.ControlInt = class ControlInt extends frappe.ui.form.ControlData { static trigger_change_on_input_event = false; + static input_mode = "numeric"; make() { super.make(); } diff --git a/frappe/public/js/frappe/form/controls/link.js b/frappe/public/js/frappe/form/controls/link.js index 86b30757d7..e391706161 100644 --- a/frappe/public/js/frappe/form/controls/link.js +++ b/frappe/public/js/frappe/form/controls/link.js @@ -255,7 +255,7 @@ frappe.ui.form.ControlLink = class ControlLink extends frappe.ui.form.ControlDat doctype: doctype, ignore_user_permissions: me.df.ignore_user_permissions, reference_doctype: me.get_reference_doctype() || "", - page_length: cint(frappe.boot.sysdefaults.link_field_results_limit) || 10, + page_length: cint(frappe.boot.sysdefaults?.link_field_results_limit) || 10, }; me.set_custom_query(args); @@ -638,13 +638,18 @@ frappe.ui.form.ControlLink = class ControlLink extends frappe.ui.form.ControlDat if (value) { field_value = response[source_field]; } - frappe.model.set_value( - this.df.parent, - this.docname, - target_field, - field_value, - this.df.fieldtype - ); + + if (this.layout?.set_value) { + this.layout.set_value(target_field, field_value); + } else if (this.frm) { + frappe.model.set_value( + this.df.parent, + this.docname, + target_field, + field_value, + this.df.fieldtype + ); + } } }; @@ -669,8 +674,73 @@ frappe.ui.form.ControlLink = class ControlLink extends frappe.ui.form.ControlDat } } + fetch_map_for_quick_entry() { + let me = this; + let fetch_map = {}; + function add_fetch(link_field, source_field, target_field, target_doctype) { + if (!target_doctype) target_doctype = "*"; + + if (!me.layout.fetch_dict) { + me.layout.fetch_dict = {}; + } + + // Target field kept as key because source field could be non-unique + me.layout.fetch_dict.setDefault(target_doctype, {}).setDefault(link_field, {})[ + target_field + ] = source_field; + } + + function setup_add_fetch(df) { + let is_read_only_field = + [ + "Data", + "Read Only", + "Text", + "Small Text", + "Currency", + "Check", + "Text Editor", + "Attach Image", + "Code", + "Link", + "Float", + "Int", + "Date", + "Select", + "Duration", + "Time", + ].includes(df.fieldtype) || + df.read_only == 1 || + df.is_virtual == 1; + + if (is_read_only_field && df.fetch_from && df.fetch_from.indexOf(".") != -1) { + var parts = df.fetch_from.split("."); + add_fetch(parts[0], parts[1], df.fieldname, df.parent); + } + } + + $.each(this.layout.fields, (i, field) => setup_add_fetch(field)); + + for (const key of ["*", this.df.parent]) { + if (!this.layout.fetch_dict) { + this.layout.fetch_dict = {}; + } + if (this.layout.fetch_dict[key] && this.layout.fetch_dict[key][this.df.fieldname]) { + Object.assign(fetch_map, this.layout.fetch_dict[key][this.df.fieldname]); + } + } + + return fetch_map; + } + get fetch_map() { const fetch_map = {}; + + // Create fetch_map from quick entry fields + if (!this.frm && this.layout && this.layout.fields) { + return this.fetch_map_for_quick_entry(); + } + if (!this.frm) return fetch_map; for (const key of ["*", this.df.parent]) { diff --git a/frappe/public/js/frappe/form/controls/multiselect_list.js b/frappe/public/js/frappe/form/controls/multiselect_list.js index 7ccde751ca..0e6198085a 100644 --- a/frappe/public/js/frappe/form/controls/multiselect_list.js +++ b/frappe/public/js/frappe/form/controls/multiselect_list.js @@ -139,7 +139,7 @@ frappe.ui.form.ControlMultiSelectList = class ControlMultiSelectList extends ( //Unselect old values this.values.forEach((value) => { this.$list_wrapper - .find(`.selectable-item[data-value=${value}]`) + .find(`.selectable-item[data-value=${CSS.escape(value)}]`) .toggleClass("selected"); }); this.values = value; @@ -147,7 +147,7 @@ frappe.ui.form.ControlMultiSelectList = class ControlMultiSelectList extends ( this.update_selected_values(value); //Select new values this.$list_wrapper - .find(`.selectable-item[data-value=${value}]`) + .find(`.selectable-item[data-value=${CSS.escape(value)}]`) .toggleClass("selected"); }); this.parse_validate_and_set_in_model(""); diff --git a/frappe/public/js/frappe/form/dashboard.js b/frappe/public/js/frappe/form/dashboard.js index 6efcdd3079..d1a2fde9d2 100644 --- a/frappe/public/js/frappe/form/dashboard.js +++ b/frappe/public/js/frappe/form/dashboard.js @@ -633,8 +633,8 @@ frappe.ui.form.Dashboard = class FormDashboard { } // TODO: Review! code related to headline should be the part of layout/form - set_headline(html, color) { - this.frm.layout.show_message(html, color); + set_headline(html, color, permanent = false) { + this.frm.layout.show_message(html, color, permanent); } clear_headline() { @@ -642,7 +642,7 @@ frappe.ui.form.Dashboard = class FormDashboard { } add_comment(text, alert_class, permanent) { - this.set_headline_alert(text, alert_class); + this.set_headline_alert(text, alert_class, permanent); if (!permanent) { setTimeout(() => { this.clear_headline(); @@ -654,9 +654,9 @@ frappe.ui.form.Dashboard = class FormDashboard { this.clear_headline(); } - set_headline_alert(text, color) { + set_headline_alert(text, color, permanent = false) { if (text) { - this.set_headline(`
${text}
`, color); + this.set_headline(`
${text}
`, color, permanent); } else { this.clear_headline(); } diff --git a/frappe/public/js/frappe/form/footer/form_timeline.js b/frappe/public/js/frappe/form/footer/form_timeline.js index 2d27fe12c3..c79c17619f 100644 --- a/frappe/public/js/frappe/form/footer/form_timeline.js +++ b/frappe/public/js/frappe/form/footer/form_timeline.js @@ -22,12 +22,14 @@ class FormTimeline extends BaseTimeline { } setup_timeline_actions() { - this.add_action_button( - __("New Email"), - () => this.compose_mail(), - "es-line-add", - "btn-secondary" - ); + if (frappe.model.can_email(null, this.frm)) { + this.add_action_button( + __("New Email"), + () => this.compose_mail(), + "es-line-add", + "btn-secondary" + ); + } this.setup_new_event_button(); } diff --git a/frappe/public/js/frappe/form/footer/version_timeline_content_builder.js b/frappe/public/js/frappe/form/footer/version_timeline_content_builder.js index 03936d9a1f..43d55fe5da 100644 --- a/frappe/public/js/frappe/form/footer/version_timeline_content_builder.js +++ b/frappe/public/js/frappe/form/footer/version_timeline_content_builder.js @@ -83,13 +83,17 @@ function get_version_timeline_content(version_doc, frm) { } } else { const df = frappe.meta.get_docfield(frm.doctype, p[0], frm.docname); - if (df && !df.hidden) { + if (df && (!df.hidden || df.show_on_timeline)) { const field_display_status = frappe.perm.get_field_display_status( df, null, frm.perm ); - if (field_display_status === "Read" || field_display_status === "Write") { + if ( + field_display_status === "Read" || + field_display_status === "Write" || + (df.hidden && df.show_on_timeline) + ) { parts.push( __("{0} from {1} to {2}", [ __(df.label, null, df.parent), @@ -142,14 +146,18 @@ function get_version_timeline_content(version_doc, frm) { frm.docname ); - if (df && !df.hidden) { + if (df && (!df.hidden || df.show_on_timeline)) { var field_display_status = frappe.perm.get_field_display_status( df, null, frm.perm ); - if (field_display_status === "Read" || field_display_status === "Write") { + if ( + field_display_status === "Read" || + field_display_status === "Write" || + (df.hidden && df.show_on_timeline) + ) { parts.push( __("{0} from {1} to {2} in row #{3}", [ frappe.meta.get_label(frm.fields_dict[row[0]].grid.doctype, p[0]), @@ -197,14 +205,19 @@ function get_version_timeline_content(version_doc, frm) { if (data[key] && data[key].length) { let parts = (data[key] || []).map(function (p) { var df = frappe.meta.get_docfield(frm.doctype, p[0], frm.docname); - if (df && !df.hidden) { + + if (df && (!df.hidden || df.show_on_timeline)) { var field_display_status = frappe.perm.get_field_display_status( df, null, frm.perm ); - if (field_display_status === "Read" || field_display_status === "Write") { + if ( + field_display_status === "Read" || + field_display_status === "Write" || + (df.hidden && df.show_on_timeline) + ) { return __(frappe.meta.get_label(frm.doctype, p[0])); } } diff --git a/frappe/public/js/frappe/form/form.js b/frappe/public/js/frappe/form/form.js index 5410b1caec..458851e698 100644 --- a/frappe/public/js/frappe/form/form.js +++ b/frappe/public/js/frappe/form/form.js @@ -418,7 +418,7 @@ frappe.ui.form.Form = class FrappeForm { // read only (workflow) this.read_only = frappe.workflow.is_read_only(this.doctype, this.docname); if (this.read_only) { - this.set_read_only(true); + this.set_read_only(); frappe.show_alert(__("This form is not editable due to a Workflow.")); } @@ -515,7 +515,7 @@ frappe.ui.form.Form = class FrappeForm { // feedback frappe.msgprint({ - message: __("{} Complete", [action.label]), + message: __("{} Complete", [__(action.label)]), alert: true, }); }); @@ -550,7 +550,6 @@ frappe.ui.form.Form = class FrappeForm { } trigger_onload(switched) { - this.cscript.is_onload = false; if (!this.opendocs[this.docname]) { var me = this; this.cscript.is_onload = true; @@ -628,6 +627,7 @@ frappe.ui.form.Form = class FrappeForm { () => this.cscript.is_onload && this.is_new() && this.focus_on_first_input(), () => this.run_after_load_hook(), () => this.dashboard.after_refresh(), + () => (this.cscript.is_onload = false), ]); } else { this.refresh_header(switched); @@ -671,6 +671,10 @@ frappe.ui.form.Form = class FrappeForm { } refresh_fields() { + if (this.layout === undefined) { + return; + } + this.layout.refresh(this.doc); this.layout.primary_button = this.$wrapper.find(".btn-primary"); @@ -1843,6 +1847,7 @@ frappe.ui.form.Form = class FrappeForm { email: p.email, }; }); + this.refresh_fields(); } trigger(event, doctype, docname) { diff --git a/frappe/public/js/frappe/form/form_tour.js b/frappe/public/js/frappe/form/form_tour.js index 94f37876bd..61f9ec07e2 100644 --- a/frappe/public/js/frappe/form/form_tour.js +++ b/frappe/public/js/frappe/form/form_tour.js @@ -11,8 +11,10 @@ frappe.ui.form.FormTour = class FormTour { padding: 10, overlayClickNext: true, keyboardControl: true, - nextBtnText: "Next", - prevBtnText: "Previous", + nextBtnText: __("Next"), + prevBtnText: __("Previous"), + doneBtnText: __("Done"), + closeBtnText: __("Close"), opacity: 0.25, onHighlighted: (step) => { // if last step is to save, then attach a listener to save button @@ -135,7 +137,11 @@ frappe.ui.form.FormTour = class FormTour { return { element, name, - popover: { title, description, position: frappe.router.slug(position || "Bottom") }, + popover: { + title: __(title), + description: __(description), + position: frappe.router.slug(position || "Bottom"), + }, onNext: on_next, onPrevious: on_prev, }; diff --git a/frappe/public/js/frappe/form/grid_row.js b/frappe/public/js/frappe/form/grid_row.js index 5c0a5cbe22..b6688d754e 100644 --- a/frappe/public/js/frappe/form/grid_row.js +++ b/frappe/public/js/frappe/form/grid_row.js @@ -95,11 +95,10 @@ export default class GridRow { remove() { var me = this; if (this.grid.is_editable()) { + if (this.get_open_form()) { + this.hide_form(); + } if (this.frm) { - if (this.get_open_form()) { - this.hide_form(); - } - frappe .run_serially([ () => { @@ -840,10 +839,12 @@ export default class GridRow { delete this.grid.filter[df.fieldname]; } - this.grid.grid_sortable.option( - "disabled", - Object.keys(this.grid.filter).length !== 0 - ); + if (this.grid.grid_sortable) { + this.grid.grid_sortable.option( + "disabled", + Object.keys(this.grid.filter).length !== 0 + ); + } this.grid.prevent_build = true; this.grid.grid_pagination.go_to_page(1); diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js index d761403489..038e3c55ef 100644 --- a/frappe/public/js/frappe/form/layout.js +++ b/frappe/public/js/frappe/form/layout.js @@ -97,7 +97,7 @@ frappe.ui.form.Layout = class Layout { return fields; } - show_message(html, color) { + show_message(html, color, permanent = false) { if (this.message_color) { // remove previous color this.message.removeClass(this.message_color); @@ -112,8 +112,10 @@ frappe.ui.form.Layout = class Layout { } this.message.removeClass("hidden").addClass(this.message_color); $(html).appendTo(this.message); - close_message.appendTo(this.message); - close_message.on("click", () => this.message.empty().addClass("hidden")); + if (!permanent) { + close_message.appendTo(this.message); + close_message.on("click", () => this.message.empty().addClass("hidden")); + } } else { this.message.empty().addClass("hidden"); } diff --git a/frappe/public/js/frappe/form/quick_entry.js b/frappe/public/js/frappe/form/quick_entry.js index 662891eccc..3cfb3aa530 100644 --- a/frappe/public/js/frappe/form/quick_entry.js +++ b/frappe/public/js/frappe/form/quick_entry.js @@ -1,6 +1,7 @@ frappe.provide("frappe.ui.form"); frappe.quick_edit = function (doctype, name) { + if (!name) name = doctype; // single frappe.db.get_doc(doctype, name).then((doc) => { frappe.ui.form.make_quick_entry(doctype, null, null, doc); }); @@ -24,13 +25,15 @@ frappe.ui.form.make_quick_entry = (doctype, after_insert, init_callback, doc, fo return frappe.quick_entry.setup(); }; -frappe.ui.form.QuickEntryForm = class QuickEntryForm { +frappe.ui.form.QuickEntryForm = class QuickEntryForm extends frappe.ui.Dialog { constructor(doctype, after_insert, init_callback, doc, force) { + super({ auto_make: false }); this.doctype = doctype; this.after_insert = after_insert; this.init_callback = init_callback; this.doc = doc; this.force = force ? force : false; + this.dialog = this; // for backward compatibility } setup() { @@ -39,6 +42,7 @@ frappe.ui.form.QuickEntryForm = class QuickEntryForm { this.check_quick_entry_doc(); this.set_meta_and_mandatory_fields(); if (this.is_quick_entry() || this.force) { + this.setup_script_manager(); this.render_dialog(); resolve(this); } else { @@ -60,7 +64,7 @@ frappe.ui.form.QuickEntryForm = class QuickEntryForm { this.meta = frappe.get_meta(this.doctype); let fields = this.meta.fields; - this.mandatory = fields.filter((df) => { + this.docfields = fields.filter((df) => { return ( (df.reqd || df.allow_in_quick_entry) && !df.read_only && @@ -83,7 +87,7 @@ frappe.ui.form.QuickEntryForm = class QuickEntryForm { this.validate_for_prompt_autoname(); - if (this.has_child_table() || !this.mandatory.length) { + if (this.has_child_table() || !this.docfields.length) { return false; } @@ -91,7 +95,7 @@ frappe.ui.form.QuickEntryForm = class QuickEntryForm { } too_many_mandatory_fields() { - if (this.mandatory.length > 7) { + if (this.docfields.length > 7) { // too many fields, show form return true; } @@ -100,7 +104,7 @@ frappe.ui.form.QuickEntryForm = class QuickEntryForm { has_child_table() { if ( - $.map(this.mandatory, function (d) { + $.map(this.docfields, function (d) { return d.fieldtype === "Table" ? d : null; }).length ) { @@ -112,53 +116,73 @@ frappe.ui.form.QuickEntryForm = class QuickEntryForm { validate_for_prompt_autoname() { if (this.meta.autoname && this.meta.autoname.toLowerCase() === "prompt") { - this.mandatory = [ + this.docfields = [ { fieldname: "__newname", label: __("{0} Name", [__(this.meta.name)]), reqd: 1, fieldtype: "Data", }, - ].concat(this.mandatory); + ].concat(this.docfields); } } + setup_script_manager() { + this.script_manager = new frappe.ui.form.ScriptManager({ + frm: this, + }); + this.script_manager.setup(); + } + + get mandatory() { + // Backwards compatibility + console.warn("QuickEntryForm: .mandatory is deprecated, use .docfields instead"); + return this.docfields; + } + + set mandatory(value) { + // Backwards compatibility + console.warn("QuickEntryForm: .mandatory is deprecated, use .docfields instead"); + this.docfields = value; + } + render_dialog() { var me = this; - this.dialog = new frappe.ui.Dialog({ - title: __("New {0}", [__(this.doctype)]), - fields: this.mandatory, - doc: this.doc, - }); + this.fields = this.docfields; + this.title = this.get_title(); + + super.make(); this.register_primary_action(); - !this.force && this.render_edit_in_full_page_link(); - // ctrl+enter to save - this.dialog.wrapper.keydown(function (e) { - if ((e.ctrlKey || e.metaKey) && e.which == 13) { - if (!frappe.request.ajax_count) { - // not already working -- double entry - me.dialog.get_primary_btn().trigger("click"); - e.preventDefault(); - return false; - } - } - }); + this.render_edit_in_full_page_link(); + this.setup_cmd_enter_for_save(); - this.dialog.onhide = () => (frappe.quick_entry = null); - this.dialog.show(); + this.onhide = () => (frappe.quick_entry = null); + this.show(); - this.dialog.refresh_dependency(); + this.refresh_dependency(); this.set_defaults(); + this.script_manager.trigger("refresh"); + if (this.init_callback) { - this.init_callback(this.dialog); + this.init_callback(this); + } + } + + get_title() { + if (this.title) { + return this.title; + } else if (this.meta.issingle) { + return __(this.doctype); + } else { + return __("New {0}", [__(this.doctype)]); } } register_primary_action() { var me = this; - this.dialog.set_primary_action(__("Save"), function () { + this.set_primary_action(__("Save"), function () { if (me.dialog.working) { return; } @@ -166,16 +190,15 @@ frappe.ui.form.QuickEntryForm = class QuickEntryForm { if (data) { me.dialog.working = true; - me.insert().then(() => { - let messagetxt = __("New {0} {1} created", [ - __(me.doctype), - this.doc.name.bold(), - ]); - me.dialog.animation_speed = "slow"; - me.dialog.hide(); - setTimeout(function () { - frappe.show_alert({ message: messagetxt, indicator: "green" }, 3); - }, 500); + me.script_manager.trigger("validate").then(() => { + me.insert().then(() => { + let messagetxt = __("{1} saved", [__(me.doctype), this.doc.name.bold()]); + me.dialog.animation_speed = "slow"; + me.dialog.hide(); + setTimeout(function () { + frappe.show_alert({ message: messagetxt, indicator: "green" }, 3); + }, 500); + }); }); } }); @@ -236,20 +259,38 @@ frappe.ui.form.QuickEntryForm = class QuickEntryForm { process_after_insert(r) { // delete the old doc - frappe.model.clear_doc(this.dialog.doc.doctype, this.dialog.doc.name); - this.dialog.doc = r.message; - if (frappe._from_link) { - frappe.ui.form.update_calling_link(this.dialog.doc); + frappe.model.clear_doc(this.doc.doctype, this.doc.name); + this.doc = r.message; + if (this.script_manager.has_handler("after_save")) { + return this.script_manager.trigger("after_save"); + } else if (frappe._from_link) { + frappe.ui.form.update_calling_link(this.doc); } else if (this.after_insert) { - this.after_insert(this.dialog.doc); + this.after_insert(this.doc); } else { this.open_form_if_not_list(); } } + setup_cmd_enter_for_save() { + var me = this; + // ctrl+enter to save + this.wrapper.keydown(function (e) { + if ((e.ctrlKey || e.metaKey) && e.which == 13) { + if (!frappe.request.ajax_count) { + // not already working -- double entry + me.dialog.get_primary_btn().trigger("click"); + e.preventDefault(); + return false; + } + } + }); + } + open_form_if_not_list() { + if (this.meta.issingle) return; let route = frappe.get_route(); - let doc = this.dialog.doc; + let doc = this.doc; if (route && !(route[0] === "List" && route[1] === doc.doctype)) { frappe.run_serially([() => frappe.set_route("Form", doc.doctype, doc.name)]); } @@ -257,17 +298,17 @@ frappe.ui.form.QuickEntryForm = class QuickEntryForm { update_doc() { var me = this; - var data = this.dialog.get_values(true); + var data = this.get_values(true); $.each(data, function (key, value) { if (!is_null(value)) { me.dialog.doc[key] = value; } }); - return this.dialog.doc; + return this.doc; } open_doc(set_hooks) { - this.dialog.hide(); + this.hide(); this.update_doc(); if (set_hooks && this.after_insert) { frappe.route_options = frappe.route_options || {}; @@ -279,14 +320,14 @@ frappe.ui.form.QuickEntryForm = class QuickEntryForm { } render_edit_in_full_page_link() { - var me = this; - this.dialog.add_custom_action(__("Edit Full Form"), () => me.open_doc(true)); + if (this.force || this.hide_full_form_button) return; + this.add_custom_action(__("Edit Full Form"), () => this.open_doc(true)); } set_defaults() { var me = this; // set defaults - $.each(this.dialog.fields_dict, function (fieldname, field) { + $.each(this.fields_dict, function (fieldname, field) { field.doctype = me.doc.doctype; field.docname = me.doc.name; diff --git a/frappe/public/js/frappe/form/script_helpers.js b/frappe/public/js/frappe/form/script_helpers.js index 4f29a0a487..f47ce99ce6 100644 --- a/frappe/public/js/frappe/form/script_helpers.js +++ b/frappe/public/js/frappe/form/script_helpers.js @@ -33,7 +33,7 @@ window.refresh_field = function (n, docname, table_field) { }; window.set_field_options = function (n, txt) { - cur_frm.set_df_property(n, "options", txt); + cur_frm?.set_df_property(n, "options", txt); }; window.toggle_field = function (n, hidden) { diff --git a/frappe/public/js/frappe/form/script_manager.js b/frappe/public/js/frappe/form/script_manager.js index 1d56a15232..3ff3fb92cb 100644 --- a/frappe/public/js/frappe/form/script_manager.js +++ b/frappe/public/js/frappe/form/script_manager.js @@ -140,6 +140,13 @@ frappe.ui.form.ScriptManager = class ScriptManager { // run them serially return frappe.run_serially(tasks); } + has_handler(event_name) { + // return true if there exist an event handler (new style only) + return ( + frappe.ui.form.handlers[this.frm.doctype] && + frappe.ui.form.handlers[this.frm.doctype][event_name] + ); + } has_handlers(event_name, doctype) { let handlers = this.get_handlers(event_name, doctype); return handlers && (handlers.old_style.length || handlers.new_style.length); @@ -156,10 +163,10 @@ frappe.ui.form.ScriptManager = class ScriptManager { handlers.new_style.push(fn); }); } - if (this.frm.cscript[event_name]) { + if (this.frm.cscript && this.frm.cscript[event_name]) { handlers.old_style.push(event_name); } - if (this.frm.cscript["custom_" + event_name]) { + if (this.frm.cscript && this.frm.cscript["custom_" + event_name]) { handlers.old_style.push("custom_" + event_name); } return handlers; @@ -238,6 +245,7 @@ frappe.ui.form.ScriptManager = class ScriptManager { this.trigger("setup"); } + log_error(caller, e) { frappe.show_alert({ message: __("Error in Client Script."), indicator: "error" }); console.group && console.group(); diff --git a/frappe/public/js/frappe/list/base_list.js b/frappe/public/js/frappe/list/base_list.js index feb60154cb..890c89ef0d 100644 --- a/frappe/public/js/frappe/list/base_list.js +++ b/frappe/public/js/frappe/list/base_list.js @@ -455,12 +455,9 @@ frappe.views.BaseList = class BaseList { get_filter_value(fieldname) { const filter = this.get_filters_for_args().filter((f) => f[1] == fieldname)[0]; if (!filter) return; - return ( - { - like: filter[3]?.replace(/^%?|%$/g, ""), - "not set": null, - }[filter[2]] || filter[3] - ); + if (filter[2] === "like") return filter[3]?.replace(/^%?|%$/g, ""); + else if (filter[2] === "not set") return null; + else return filter[3]; } get_filters_for_args() { diff --git a/frappe/public/js/frappe/list/bulk_operations.js b/frappe/public/js/frappe/list/bulk_operations.js index 464c90a8e8..1c045bc6ae 100644 --- a/frappe/public/js/frappe/list/bulk_operations.js +++ b/frappe/public/js/frappe/list/bulk_operations.js @@ -11,6 +11,7 @@ export default class BulkOperations { const allow_print_for_cancelled = cint(print_settings.allow_print_for_cancelled); const letterheads = this.get_letterhead_options(); const MAX_PRINT_LIMIT = 500; + const BACKGROUND_PRINT_THRESHOLD = 25; const valid_docs = docs .filter((doc) => { @@ -81,6 +82,13 @@ export default class BulkOperations { depends_on: 'eval:doc.page_size == "Custom"', default: print_settings.pdf_page_width, }, + { + fieldtype: "Check", + label: __("Background Print (required for >25 documents)"), + fieldname: "background_print", + default: valid_docs.length > BACKGROUND_PRINT_THRESHOLD, + read_only: valid_docs.length > BACKGROUND_PRINT_THRESHOLD, + }, ], }); @@ -105,33 +113,55 @@ export default class BulkOperations { pdf_options = JSON.stringify({ "page-size": args.page_size }); } - frappe - .call("frappe.utils.print_format.download_multi_pdf_async", { - doctype: this.doctype, - name: json_string, - format: print_format, - no_letterhead: with_letterhead ? "0" : "1", - letterhead: letterhead, - options: pdf_options, - }) - .then((response) => { - let task_id = response.message.task_id; - frappe.realtime.task_subscribe(task_id); - frappe.realtime.on(`task_complete:${task_id}`, (data) => { - frappe.msgprint({ - title: __("Bulk PDF Export"), - message: __("Your PDF is ready for download"), - primary_action: { - label: __("Download PDF"), - client_action: "window.open", - args: data.file_url, - }, + if (args.background_print) { + frappe + .call("frappe.utils.print_format.download_multi_pdf_async", { + doctype: this.doctype, + name: json_string, + format: print_format, + no_letterhead: with_letterhead ? "0" : "1", + letterhead: letterhead, + options: pdf_options, + }) + .then((response) => { + let task_id = response.message.task_id; + frappe.realtime.task_subscribe(task_id); + frappe.realtime.on(`task_complete:${task_id}`, (data) => { + frappe.msgprint({ + title: __("Bulk PDF Export"), + message: __("Your PDF is ready for download"), + primary_action: { + label: __("Download PDF"), + client_action: "window.open", + args: data.file_url, + }, + }); + frappe.realtime.task_unsubscribe(task_id); + frappe.realtime.off(`task_complete:${task_id}`); }); - frappe.realtime.task_unsubscribe(task_id); - frappe.realtime.off(`task_complete:${task_id}`); }); - dialog.hide(); - }); + } else { + const w = window.open( + "/api/method/frappe.utils.print_format.download_multi_pdf?" + + "doctype=" + + encodeURIComponent(this.doctype) + + "&name=" + + encodeURIComponent(json_string) + + "&format=" + + encodeURIComponent(print_format) + + "&no_letterhead=" + + (with_letterhead ? "0" : "1") + + "&letterhead=" + + encodeURIComponent(letterhead) + + "&options=" + + encodeURIComponent(pdf_options) + ); + + if (!w) { + frappe.msgprint(__("Please enable pop-ups")); + } + } + dialog.hide(); }); dialog.show(); } diff --git a/frappe/public/js/frappe/list/list_view.js b/frappe/public/js/frappe/list/list_view.js index 50b49f265c..c904dd7544 100644 --- a/frappe/public/js/frappe/list/list_view.js +++ b/frappe/public/js/frappe/list/list_view.js @@ -260,12 +260,8 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { set_primary_action() { if (this.can_create && !frappe.boot.read_only) { const doctype_name = __(frappe.router.doctype_layout) || __(this.doctype); - - // Better style would be __("Add {0}", [doctype_name], "Primary action in list view") - // Keeping it like this to not disrupt existing translations - const label = `${__("Add", null, "Primary action in list view")} ${doctype_name}`; this.page.set_primary_action( - label, + __("Add {0}", [doctype_name], "Primary action in list view"), () => { if (this.settings.primary_action) { this.settings.primary_action(); @@ -548,7 +544,9 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { toggle_result_area() { super.toggle_result_area(); - this.toggle_actions_menu_button(this.$result.find(".list-row-check:checked").length > 0); + this.toggle_actions_menu_button( + this.$result.find(".list-row-checkbox:checked").length > 0 + ); } toggle_actions_menu_button(toggle) { @@ -788,9 +786,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { } const format = () => { - if (df.fieldtype === "Code") { - return value; - } else if (df.fieldtype === "Percent") { + if (df.fieldtype === "Percent") { return `
${_value} `; - } else if ( - ["Text Editor", "Text", "Small Text", "HTML Editor", "Markdown Editor"].includes( - df.fieldtype - ) - ) { + } else if (frappe.model.html_fieldtypes.includes(df.fieldtype)) { html = ` ${_value} `; diff --git a/frappe/public/js/frappe/model/meta.js b/frappe/public/js/frappe/model/meta.js index 2f209e048d..8253f1974f 100644 --- a/frappe/public/js/frappe/model/meta.js +++ b/frappe/public/js/frappe/model/meta.js @@ -286,13 +286,19 @@ $.extend(frappe.meta, { if (!doc && cur_frm) doc = cur_frm.doc; if (df && df.options) { - if (doc && df.options.indexOf(":") != -1) { + if (df.options.indexOf(":") != -1) { var options = df.options.split(":"); if (options.length == 3) { - // get reference record e.g. Company - var docname = doc[options[1]]; - if (!docname && cur_frm) { - docname = cur_frm.doc[options[1]]; + let docname = null; + if (doc) { + // get reference record e.g. Company + docname = doc[options[1]]; + if (!docname && cur_frm) { + docname = cur_frm.doc[options[1]]; + } + } else { + // Try to get default value, useful for cases like Company overridden in session defaults + docname = frappe.defaults.get_user_default(options[1]); } currency = frappe.model.get_value(options[0], docname, options[2]) || diff --git a/frappe/public/js/frappe/model/model.js b/frappe/public/js/frappe/model/model.js index 60270cace0..11a329e98e 100644 --- a/frappe/public/js/frappe/model/model.js +++ b/frappe/public/js/frappe/model/model.js @@ -790,7 +790,9 @@ $.extend(frappe.model, { } for (var i = 0, j = fieldnames.length; i < j; i++) { var fieldname = fieldnames[i]; - doc[fieldname] = flt(doc[fieldname], precision(fieldname, doc)); + if (doc[fieldname]) { + doc[fieldname] = flt(doc[fieldname], precision(fieldname, doc)); + } } }, diff --git a/frappe/public/js/frappe/ui/chart.js b/frappe/public/js/frappe/ui/chart.js index 642598c564..5307e631f9 100644 --- a/frappe/public/js/frappe/ui/chart.js +++ b/frappe/public/js/frappe/ui/chart.js @@ -33,7 +33,7 @@ frappe.ui.RealtimeChart = class RealtimeChart extends frappe.Chart { } else { this.currentSize++; } - this.addDataPoint(label, data); + this.addDataPoint(__(label), data); }; } }; diff --git a/frappe/public/js/frappe/ui/dialog.js b/frappe/public/js/frappe/ui/dialog.js index 90e95ef92b..da288621b8 100644 --- a/frappe/public/js/frappe/ui/dialog.js +++ b/frappe/public/js/frappe/ui/dialog.js @@ -13,8 +13,10 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup { this.display = false; this.is_dialog = true; - $.extend(this, { animate: true, size: null }, opts); - this.make(); + $.extend(this, { animate: true, size: null, auto_make: true }, opts); + if (this.auto_make) { + this.make(); + } } make() { @@ -127,10 +129,6 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup { }); } - get $backdrop() { - return $(this.$wrapper.data("bs.modal")?._backdrop); - } - set_modal_size() { if (!this.fields) { this.size = ""; @@ -164,6 +162,20 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup { return this.$wrapper.find(".modal-header .btn-modal-minimize"); } + set_alert(text, alert_class = "info") { + this.clear_alert(); + this.$alert = $(`
${text}
`).prependTo( + this.body + ); + this.$message.text(text); + } + + clear_alert() { + if (this.$alert) { + this.$alert.remove(); + } + } + set_message(text) { this.$message.removeClass("hide"); this.$body.addClass("hide"); @@ -245,7 +257,7 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup { this.$wrapper.removeClass("modal-minimize"); if (this.minimizable && this.is_minimized) { - this.$backdrop.show(); + $(".modal-backdrop").toggle(); this.is_minimized = false; } @@ -258,10 +270,6 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup { } hide() { - if (this.animate && this.animation_speed === "slow") { - this.$wrapper.addClass("slow"); - this.$backdrop.addClass("slow"); - } this.$wrapper.modal("hide"); this.is_visible = false; } @@ -283,7 +291,7 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup { } toggle_minimize() { - this.$backdrop.toggle(); + $(".modal-backdrop").toggle(); let modal = this.$wrapper.closest(".modal").toggleClass("modal-minimize"); modal.attr("tabindex") ? modal.removeAttr("tabindex") : modal.attr("tabindex", -1); this.is_minimized = !this.is_minimized; @@ -309,6 +317,8 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup { action && action_button.click(action); } + + add_custom_button() {} }; frappe.ui.hide_open_dialog = () => { diff --git a/frappe/public/js/frappe/ui/field_group.js b/frappe/public/js/frappe/ui/field_group.js index 27fe08439c..4a1022ec9f 100644 --- a/frappe/public/js/frappe/ui/field_group.js +++ b/frappe/public/js/frappe/ui/field_group.js @@ -6,6 +6,8 @@ frappe.ui.FieldGroup = class FieldGroup extends frappe.ui.form.Layout { constructor(opts) { super(opts); this.dirty = false; + this.fetch_dict = {}; + $.each(this.fields || [], function (i, f) { if (!f.fieldname && f.label) { f.fieldname = f.label.replace(/ /g, "_").toLowerCase(); @@ -197,4 +199,43 @@ frappe.ui.FieldGroup = class FieldGroup extends frappe.ui.form.Layout { field.df[prop] = value; field.refresh(); } + + set_query(fieldname, opt1, opt2) { + if (opt2) { + // on child table + // set_query(fieldname, parent fieldname, query) + if (this.fields_dict[opt1]) + this.fields_dict[opt1].grid.get_field(fieldname).get_query = opt2; + } else { + // on parent table + // set_query(fieldname, query) + if (this.fields_dict[fieldname]) { + this.fields_dict[fieldname].get_query = opt1; + } + } + } + + // UTILITIES + add_fetch(link_field, source_field, target_field, target_doctype) { + /* + Example fetch dict to get sender_email from email_id field in sender: + { + "Notification": { + "sender": { + "sender_email": "email_id" + } + } + } + */ + + if (!target_doctype) target_doctype = "*"; + + // Target field kept as key because source field could be non-unique + this.fetch_dict.setDefault(target_doctype, {}).setDefault(link_field, {})[target_field] = + source_field; + } + + is_new() { + return this.doc.__islocal; + } }; diff --git a/frappe/public/js/frappe/ui/messages.js b/frappe/public/js/frappe/ui/messages.js index 999fcc5125..4850ccb7a5 100644 --- a/frappe/public/js/frappe/ui/messages.js +++ b/frappe/public/js/frappe/ui/messages.js @@ -228,7 +228,7 @@ frappe.msgprint = function (msg, title, is_minimizable) { } frappe.msg_dialog.set_primary_action( - __(data.primary_action.label || data.primary_action_label || "Done"), + __(data.primary_action.label) || __(data.primary_action_label) || __("Done"), data.primary_action.action ); } else { @@ -240,7 +240,9 @@ frappe.msgprint = function (msg, title, is_minimizable) { if (data.secondary_action) { frappe.msg_dialog.set_secondary_action(data.secondary_action.action); - frappe.msg_dialog.set_secondary_action_label(__(data.secondary_action.label || "Close")); + frappe.msg_dialog.set_secondary_action_label( + __(data.secondary_action.label) || __("Close") + ); } if (data.message == null) { diff --git a/frappe/public/js/frappe/ui/sort_selector.js b/frappe/public/js/frappe/ui/sort_selector.js index ef19905015..33cdb28f04 100644 --- a/frappe/public/js/frappe/ui/sort_selector.js +++ b/frappe/public/js/frappe/ui/sort_selector.js @@ -103,15 +103,13 @@ frappe.ui.SortSelector = class SortSelector { var { meta_sort_field, meta_sort_order } = this.get_meta_sort_field(); - if (!this.args.sort_by) { - if (meta_sort_field) { - this.args.sort_by = meta_sort_field; - this.args.sort_order = meta_sort_order; - } else { - // default - this.args.sort_by = "creation"; - this.args.sort_order = "desc"; - } + if (meta_sort_field) { + this.args.sort_by = meta_sort_field; + this.args.sort_order = meta_sort_order; + } else { + // default + this.args.sort_by = "creation"; + this.args.sort_order = "desc"; } if (!this.args.sort_by_label) { @@ -175,11 +173,11 @@ frappe.ui.SortSelector = class SortSelector { }; } - if (meta.sort_field && meta.sort_field.includes(",")) { + if (meta.sort_field) { var parts = meta.sort_field.split(",")[0].split(" "); return { meta_sort_field: parts[0], - meta_sort_order: parts[1], + meta_sort_order: meta.sort_order ? meta.sort_order.toLowerCase() : "", }; } else { return { diff --git a/frappe/public/js/frappe/ui/toolbar/awesome_bar.js b/frappe/public/js/frappe/ui/toolbar/awesome_bar.js index 7ef9e19383..fd4f121e57 100644 --- a/frappe/public/js/frappe/ui/toolbar/awesome_bar.js +++ b/frappe/public/js/frappe/ui/toolbar/awesome_bar.js @@ -338,6 +338,11 @@ frappe.search.AwesomeBar = class AwesomeBar { } make_calculator(txt) { + function getDecimalPlaces(num) { + if (Math.floor(num) === num) return 0; + return num.toString().split(".")[1].length || 0; + } + var first = txt.substr(0, 1); if (first == parseInt(first) || first === "(" || first === "=") { if (first === "=") { @@ -345,11 +350,29 @@ frappe.search.AwesomeBar = class AwesomeBar { } try { var val = eval(txt); - var formatted_value = __("{0} = {1}", [txt, (val + "").bold()]); + + // Split the input to find the numbers and their decimal places + var numbers = txt.match(/[+-]?([0-9]*[.])?[0-9]+/g); + var maxDecimalPlaces = 0; + if (numbers) { + maxDecimalPlaces = Math.max( + ...numbers.map((num) => getDecimalPlaces(parseFloat(num))) + ); + } + + // Use a default precision of 2 decimal places if no decimal places are found + if (maxDecimalPlaces === 0) { + maxDecimalPlaces = 2; + } + + // Adjust the result to the maximum number of decimal places found or default precision + var rounded_val = parseFloat(val.toFixed(maxDecimalPlaces)); + + var formatted_value = __("{0} = {1}", [txt, (rounded_val + "").bold()]); this.options.push({ label: formatted_value, - value: __("{0} = {1}", [txt, val]), - match: val, + value: __("{0} = {1}", [txt, rounded_val]), + match: rounded_val, index: 80, default: "Calculator", onclick: function () { diff --git a/frappe/public/js/frappe/utils/dashboard_utils.js b/frappe/public/js/frappe/utils/dashboard_utils.js index 1058101fff..2ad0dcc2cb 100644 --- a/frappe/public/js/frappe/utils/dashboard_utils.js +++ b/frappe/public/js/frappe/utils/dashboard_utils.js @@ -160,9 +160,9 @@ frappe.dashboard_utils = { fieldtype: "HTML", fieldname: "description", options: `
-

Set dynamic filter values in JavaScript for the required fields here. +

${__("Set dynamic filter values in JavaScript for the required fields here.")}

-

Ex: +

${__("For example:")} frappe.defaults.get_user_default("Company")

`, diff --git a/frappe/public/js/frappe/utils/number_format.js b/frappe/public/js/frappe/utils/number_format.js index d5cef586f7..e0e8f00366 100644 --- a/frappe/public/js/frappe/utils/number_format.js +++ b/frappe/public/js/frappe/utils/number_format.js @@ -178,7 +178,6 @@ function get_currency_symbol(currency) { function get_number_format(currency) { return ( - (currency && frappe.model.get_value(":Currency", currency, "number_format")) || (frappe.boot && frappe.boot.sysdefaults && frappe.boot.sysdefaults.number_format) || "#,###.##" ); diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index 69b42134e3..c3df8e1987 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -918,18 +918,18 @@ Object.assign(frappe.utils, { let route = route_str.split("/"); if (route[2] === "Report" || route[0] === "query-report") { - return __("{0} Report", [route[3] || route[1]]); + return __("{0} Report", [__(route[3]) || __(route[1])]); } if (route[0] === "List") { - return __("{0} List", [route[1]]); + return __("{0} List", [__(route[1])]); } if (route[0] === "modules") { - return __("{0} Modules", [route[1]]); + return __("{0} Modules", [__(route[1])]); } if (route[0] === "dashboard") { - return __("{0} Dashboard", [route[1]]); + return __("{0} Dashboard", [__(route[1])]); } - return __(frappe.utils.to_title_case(route[0], true)); + return __(frappe.utils.to_title_case(__(route[0]), true)); }, report_column_total: function (values, column, type) { if (column.column.disable_total) { @@ -1213,9 +1213,7 @@ Object.assign(frappe.utils, { }, flag(country_code) { - return ``; + return ``; }, make_chart(wrapper, custom_options = {}) { @@ -1299,10 +1297,11 @@ Object.assign(frappe.utils, { } else if (type === "report") { if (item.is_query_report) { route = "query-report/" + item.name; - } else if (!item.doctype) { - route = "report/" + item.name; + } else if (!item.is_query_report && item.report_ref_doctype) { + route = + frappe.router.slug(item.report_ref_doctype) + "/view/report/" + item.name; } else { - route = frappe.router.slug(item.doctype) + "/view/report/" + item.name; + route = "/report/" + item.name; } } else if (type === "page") { route = item.name; diff --git a/frappe/public/js/frappe/views/render_preview.js b/frappe/public/js/frappe/views/render_preview.js new file mode 100644 index 0000000000..a1d5348b52 --- /dev/null +++ b/frappe/public/js/frappe/views/render_preview.js @@ -0,0 +1,100 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +// MIT License. See license.txt +frappe.provide("frappe.views"); + +frappe.views.RenderPreviewer = class RenderPreviewer { + constructor(opts) { + $.extend(this, opts); + this.make(); + } + + make() { + let me = this; + + me.set_fields(); + let fields = me.header_fields; + fields.push(...me.body_fields); + + me.dialog = new frappe.ui.Dialog({ + title: __("Preview on") + " " + __(me.doctype), + no_submit_on_enter: true, + fields: fields, + minimizable: true, + size: "large", + }); + + me.prepare(); + me.dialog.show(); + } + + set_fields() { + let me = this; + me.header_fields = [ + { + label: __("Reference Doctype"), + fieldtype: "Link", + fieldname: "doctype", + reqd: 1, + read_only: 1, + hidden: 1, + }, + { + label: __("Document"), + fieldtype: "Dynamic Link", + fieldname: "preview_document", + options: "doctype", + reqd: 1, + onchange: () => me.render_previews(), + }, + ]; + me.body_fields = [{ fieldtype: "Section Break" }]; + + me.preview_fields.forEach((spec) => { + let field = { + label: spec.label, + fieldtype: spec.fieldtype, + fieldname: spec.method, + read_only: 1, + }; + if (spec.method === "preview_meets_condition") { + me.header_fields.push({ fieldtype: "Column Break" }); + me.header_fields.push(field); + } else { + me.body_fields.push(field); + } + }); + } + + prepare() { + let me = this; + me.dialog.set_values({ + doctype: me.doctype, + }); + } + async render_previews() { + let me = this; + let preview_document = me.dialog.get_value("preview_document"); + if (preview_document) { + let promises = []; + me.preview_fields.forEach((spec) => { + let fieldname = spec.method; + promises.push( + frappe + .xcall("run_doc_method", { + dt: me.doc.doctype, + dn: me.doc.name, + method: spec.method, + arg: preview_document, + }) + .then((message) => me.dialog.set_value(fieldname, message)) + ); + }); + await Promise.all(promises); + } else { + me.preview_fields.forEach((spec) => { + let fieldname = spec.method; + me.dialog.set_value(fieldname, null); + }); + } + } +}; diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 0284639e6a..1332a186aa 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -462,7 +462,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { setup_progress_bar() { let seconds_elapsed = 0; - const execution_time = this.report_settings.execution_time || 0; + const execution_time = this.report_settings?.execution_time || 0; if (execution_time < 5) return; diff --git a/frappe/public/js/frappe/views/workspace/blocks/header.js b/frappe/public/js/frappe/views/workspace/blocks/header.js index b5b42796d4..072b054bad 100644 --- a/frappe/public/js/frappe/views/workspace/blocks/header.js +++ b/frappe/public/js/frappe/views/workspace/blocks/header.js @@ -104,8 +104,16 @@ export default class Header extends Block { this._data = this.normalizeData(data); if (data.text !== undefined) { - let text = this._data.text || ""; + let text = __(this._data.text) || ""; const contains_html_tag = /<[a-z][\s\S]*>/i.test(text); + + // apply translation to header text + let div = document.createElement("div"); + div.innerHTML = text; + let only_text = div.innerText; + only_text = frappe.utils.escape_html(only_text); + text = text.replace(only_text, __(only_text)); + this._element.innerHTML = contains_html_tag ? text : `${text}`; diff --git a/frappe/public/js/frappe/views/workspace/workspace.js b/frappe/public/js/frappe/views/workspace/workspace.js index c5f7c112e0..0311bc976c 100644 --- a/frappe/public/js/frappe/views/workspace/workspace.js +++ b/frappe/public/js/frappe/views/workspace/workspace.js @@ -59,6 +59,7 @@ frappe.views.Workspace = class Workspace { `).appendTo(this.wrapper.find(".layout-side-section")); this.sidebar = list_sidebar.find(".desk-sidebar"); this.body = this.wrapper.find(".layout-main-section"); + this.prepare_new_and_edit(); } async setup_pages(reload) { @@ -69,6 +70,9 @@ frappe.views.Workspace = class Workspace { this.all_pages = this.sidebar_pages.pages; this.has_access = this.sidebar_pages.has_access; this.has_create_access = this.sidebar_pages.has_create_access; + if (!this.sidebar_pages.workspace_setup_completed) { + frappe.quick_edit("Workspace Settings"); + } this.all_pages.forEach((page) => { page.is_editable = !page.public || this.has_access; @@ -79,17 +83,58 @@ frappe.views.Workspace = class Workspace { if (this.all_pages) { frappe.workspaces = {}; + frappe.workspace_list = []; for (let page of this.all_pages) { frappe.workspaces[frappe.router.slug(page.name)] = { title: page.title, public: page.public, }; + + frappe.workspace_list.push(page); } this.make_sidebar(); reload && this.show(); } } + prepare_new_and_edit() { + this.$page = $(` +
+ + `).appendTo(this.body); + + this.body.find(".btn-new-workspace").on("click", () => { + this.initialize_new_page(true); + }); + + this.body.find(".btn-edit-workspace").on("click", async () => { + if (!this.editor || !this.editor.readOnly) return; + this.is_read_only = false; + this.toggle_hidden_workspaces(true); + await this.editor.readOnly.toggle(); + this.editor.isReady.then(() => { + this.body.addClass("edit-mode"); + this.initialize_editorjs_undo(); + this.setup_customization_buttons(this._page); + this.show_sidebar_actions(); + this.make_blocks_sortable(); + }); + }); + } + get_pages() { return frappe.xcall("frappe.desk.desktop.get_workspace_sidebar_items"); } @@ -201,7 +246,12 @@ frappe.views.Workspace = class Workspace { } prepare_sidebar(items, child_container, item_container) { - items.forEach((item) => this.append_item(item, child_container)); + for (let item of items) { + // visibility not explicitly set to 0 + if (item.visibility !== 0) { + this.append_item(item, child_container); + } + } child_container.appendTo(item_container); } @@ -379,9 +429,9 @@ frappe.views.Workspace = class Workspace { async show_page(page) { if (!this.body.find("#editorjs")[0]) { - this.$page = $(` + $(`
- `).appendTo(this.body); + `).appendTo(this.body.find(".editor-js-container")); } if (this.all_pages.length) { @@ -390,6 +440,7 @@ frappe.views.Workspace = class Workspace { let pages = page.public && this.public_pages.length ? this.public_pages : this.private_pages; let current_page = pages.filter((p) => p.title == page.name)[0]; + this._page = current_page; this.content = current_page && JSON.parse(current_page.content); this.content && this.add_custom_cards_in_content(); @@ -456,29 +507,16 @@ frappe.views.Workspace = class Workspace { this.clear_page_actions(); if (current_page.is_editable) { - this.page.set_secondary_action( - __("Edit"), - async () => { - if (!this.editor || !this.editor.readOnly) return; - this.is_read_only = false; - this.toggle_hidden_workspaces(true); - await this.editor.readOnly.toggle(); - this.editor.isReady.then(() => { - this.body.addClass("edit-mode"); - this.initialize_editorjs_undo(); - this.setup_customization_buttons(current_page); - this.show_sidebar_actions(); - this.make_blocks_sortable(); - }); - }, - "es-line-edit" - ); + this.body.find(".btn-edit-workspace").removeClass("hide"); + } else { + this.body.find(".btn-edit-workspace").addClass("hide"); } // need to add option for icons in inner buttons as well - if (this.has_create_access) - this.page.add_inner_button(__("Create Workspace"), () => { - this.initialize_new_page(true); - }); + if (this.has_create_access) { + this.body.find(".btn-new-workspace").removeClass("hide"); + } else { + this.body.find(".btn-new-workspace").addClass("hide"); + } } initialize_editorjs_undo() { diff --git a/frappe/public/js/frappe/widgets/chart_widget.js b/frappe/public/js/frappe/widgets/chart_widget.js index 24d726ba85..cfaba04a71 100644 --- a/frappe/public/js/frappe/widgets/chart_widget.js +++ b/frappe/public/js/frappe/widgets/chart_widget.js @@ -125,7 +125,7 @@ export default class ChartWidget extends Widget { if (this.chart_doc.type == "Heatmap") { filters = [ { - label: this.chart_settings.heatmap_year || this.chart_doc.heatmap_year, + label: __(this.chart_settings.heatmap_year) || __(this.chart_doc.heatmap_year), options: frappe.dashboard_utils.get_years_since_creation( frappe.boot.user.creation ), @@ -141,7 +141,8 @@ export default class ChartWidget extends Widget { } else { filters = [ { - label: this.chart_settings.time_interval || this.chart_doc.time_interval, + label: + __(this.chart_settings.time_interval) || __(this.chart_doc.time_interval), options: ["Yearly", "Quarterly", "Monthly", "Weekly", "Daily"], icon: "calendar", class: "time-interval-filter", @@ -233,7 +234,7 @@ export default class ChartWidget extends Widget { df: { fieldtype: "DateRange", fieldname: "from_date", - placeholder: "Date Range", + placeholder: __("Date Range"), input_class: "input-xs", default: [this.chart_settings.from_date, this.chart_settings.to_date], value: [this.chart_settings.from_date, this.chart_settings.to_date], @@ -314,7 +315,7 @@ export default class ChartWidget extends Widget { if (this.chart_doc.document_type) { actions.push({ - label: __("{0} List", [this.chart_doc.document_type]), + label: __("{0} List", [__(this.chart_doc.document_type)]), action: "action-list", handler: () => { frappe.set_route("List", this.chart_doc.document_type); @@ -322,7 +323,7 @@ export default class ChartWidget extends Widget { }); } else if (this.chart_doc.chart_type === "Report") { actions.push({ - label: __("{0} Report", [this.chart_doc.report_name]), + label: __("{0} Report", [__(this.chart_doc.report_name)]), action: "action-list", handler: () => { frappe.set_route("query-report", this.chart_doc.report_name, this.filters); @@ -392,7 +393,7 @@ export default class ChartWidget extends Widget { setup_filter_dialog(fields) { let me = this; let dialog = new frappe.ui.Dialog({ - title: __("Set Filters for {0}", [this.chart_doc.chart_name]), + title: __("Set Filters for {0}", [__(this.chart_doc.chart_name)]), fields: fields, primary_action: function () { let values = this.get_values(); @@ -403,7 +404,7 @@ export default class ChartWidget extends Widget { me.fetch_and_update_chart(); } }, - primary_action_label: "Set", + primary_action_label: __("Set"), }); dialog.show(); @@ -473,7 +474,9 @@ export default class ChartWidget extends Widget { ${actions .map( (action) => - `
  • ${action.label}
  • ` + `
  • ${__( + action.label + )}
  • ` ) .join("")} diff --git a/frappe/public/js/frappe/widgets/links_widget.js b/frappe/public/js/frappe/widgets/links_widget.js index b83cf04954..d0b5513f11 100644 --- a/frappe/public/js/frappe/widgets/links_widget.js +++ b/frappe/public/js/frappe/widgets/links_widget.js @@ -92,6 +92,7 @@ export default class LinksWidget extends Widget { type: item.link_type, doctype: item.doctype, is_query_report: item.is_query_report, + report_ref_doctype: item.report_ref_doctype, }; if (item.link_type.toLowerCase() == "report" && !item.is_query_report) { diff --git a/frappe/public/js/frappe/widgets/onboarding_widget.js b/frappe/public/js/frappe/widgets/onboarding_widget.js index 4853c04b6a..ae4b86d8a4 100644 --- a/frappe/public/js/frappe/widgets/onboarding_widget.js +++ b/frappe/public/js/frappe/widgets/onboarding_widget.js @@ -129,9 +129,9 @@ export default class OnboardingWidget extends Widget { .on("click", toggle_video); } else { $( - `` + `` ) .appendTo(this.step_footer) .on("click", () => actions[step.action](step)); @@ -139,8 +139,8 @@ export default class OnboardingWidget extends Widget { }; const set_description = () => { - let content = step.description - ? frappe.markdown(step.description) + let content = __(step.description) + ? frappe.markdown(__(step.description)) : `

    ${__(step.title)}

    `; if (step.action === "Create Entry") { @@ -168,9 +168,9 @@ export default class OnboardingWidget extends Widget { }); $( - `` + `` ) .appendTo(this.step_footer) .on("click", () => { diff --git a/frappe/public/scss/desk/desktop.scss b/frappe/public/scss/desk/desktop.scss index 6d24492be0..b0c0173088 100644 --- a/frappe/public/scss/desk/desktop.scss +++ b/frappe/public/scss/desk/desktop.scss @@ -994,6 +994,10 @@ body { .links-widget-box { background-color: var(--bg-color) !important; } + + .workspace-footer { + display: none; + } } } @@ -1015,6 +1019,12 @@ body { padding: var(--padding-sm); } + .workspace-footer { + height: 30px; + display: flex; + flex-direction: row-reverse; + } + .block-menu-item-icon svg { width: 18px; height: 18px; diff --git a/frappe/public/scss/desk/print_preview.scss b/frappe/public/scss/desk/print_preview.scss index 5d7f88585b..d345a8819a 100644 --- a/frappe/public/scss/desk/print_preview.scss +++ b/frappe/public/scss/desk/print_preview.scss @@ -45,8 +45,16 @@ .layout-side-section.print-preview-sidebar { padding-right: var(--padding-md); + .checkbox label { + align-items: unset; + } + + .input-area { + margin-top: 0.2rem; + } + .label-area { - white-space: nowrap; + white-space: unset; } } diff --git a/frappe/templates/base.html b/frappe/templates/base.html index 2c992c082f..efde1ea594 100644 --- a/frappe/templates/base.html +++ b/frappe/templates/base.html @@ -44,6 +44,7 @@ - {% include "public/icons/timeless/icons.svg" %} - {% include "public/icons/espresso/icons.svg" %} {%- block banner -%} {% include "templates/includes/banner_extension.html" ignore missing %} @@ -88,6 +87,11 @@ ) }} {%- endblock -%} + + {%- for path in web_include_icons -%} + {{ include_icons(path) }} + {%- endfor -%} + {% block base_scripts %} ' +def include_icons(path, preload=True): + """Get path of bundled svg icons files. + + If preload is specified the path will be added to preload headers so browsers can prefetch + assets.""" + path = bundled_asset(path) + + if preload: + import frappe + + frappe.local.preload_assets["icons"].append(path) + + return ( + '' + ) + + def include_style(path, rtl=None, preload=True): """Get path of bundled style files. diff --git a/frappe/utils/redis_wrapper.py b/frappe/utils/redis_wrapper.py index c38f54a2f2..e494d07bab 100644 --- a/frappe/utils/redis_wrapper.py +++ b/frappe/utils/redis_wrapper.py @@ -2,6 +2,7 @@ # License: MIT. See LICENSE import pickle import re +from contextlib import suppress import redis from redis.commands.search import Search @@ -62,14 +63,8 @@ class RedisWrapper(redis.Redis): if not expires_in_sec: frappe.local.cache[key] = val - try: - if expires_in_sec: - self.setex(name=key, time=expires_in_sec, value=pickle.dumps(val)) - else: - self.set(key, pickle.dumps(val)) - - except redis.exceptions.ConnectionError: - return None + with suppress(redis.exceptions.ConnectionError): + self.set(name=key, value=pickle.dumps(val), ex=expires_in_sec) def get_value(self, key, generator=None, user=None, expires=False, shared=False): """Return cache value. If not found and generator function is diff --git a/frappe/utils/xlsxutils.py b/frappe/utils/xlsxutils.py index 9442a4c367..53b44bd5ca 100644 --- a/frappe/utils/xlsxutils.py +++ b/frappe/utils/xlsxutils.py @@ -8,6 +8,7 @@ import xlrd from openpyxl import load_workbook from openpyxl.styles import Font from openpyxl.utils import get_column_letter +from openpyxl.workbook.child import INVALID_TITLE_REGEX import frappe from frappe.utils.html_utils import unescape_html @@ -21,7 +22,8 @@ def make_xlsx(data, sheet_name, wb=None, column_widths=None): if wb is None: wb = openpyxl.Workbook(write_only=True) - ws = wb.create_sheet(sheet_name, 0) + sheet_name_sanitized = INVALID_TITLE_REGEX.sub(" ", sheet_name) + ws = wb.create_sheet(sheet_name_sanitized, 0) for i, column_width in enumerate(column_widths): if column_width: diff --git a/frappe/website/doctype/web_form/web_form.json b/frappe/website/doctype/web_form/web_form.json index c4eeca4cac..e4e29ad270 100644 --- a/frappe/website/doctype/web_form/web_form.json +++ b/frappe/website/doctype/web_form/web_form.json @@ -94,7 +94,8 @@ "default": "0", "fieldname": "is_standard", "fieldtype": "Check", - "label": "Is Standard" + "label": "Is Standard", + "no_copy": 1 }, { "default": "0", @@ -393,7 +394,7 @@ "icon": "icon-edit", "is_published_field": "published", "links": [], - "modified": "2024-03-23 16:04:01.886581", + "modified": "2024-07-27 20:32:06.331745", "modified_by": "Administrator", "module": "Website", "name": "Web Form", diff --git a/frappe/website/doctype/website_settings/website_settings.py b/frappe/website/doctype/website_settings/website_settings.py index 567c56f1d6..695c37ee3f 100644 --- a/frappe/website/doctype/website_settings/website_settings.py +++ b/frappe/website/doctype/website_settings/website_settings.py @@ -229,8 +229,8 @@ def get_website_settings(context=None): context.encoded_title = quote(encode(context.title or ""), "") context.web_include_js = hooks.web_include_js or [] - context.web_include_css = hooks.web_include_css or [] + context.web_include_icons = hooks.web_include_icons or [] via_hooks = hooks.website_context or [] for key in via_hooks: diff --git a/frappe/website/path_resolver.py b/frappe/website/path_resolver.py index ebb0595056..4af49988c3 100644 --- a/frappe/website/path_resolver.py +++ b/frappe/website/path_resolver.py @@ -134,7 +134,7 @@ def resolve_redirect(path, query_string=None): for rule in redirects: pattern = rule["source"].strip("/ ") + "$" path_to_match = path - if rule.get("match_with_query_string"): + if query_string and rule.get("match_with_query_string"): path_to_match = path + "?" + frappe.safe_decode(query_string) try: diff --git a/frappe/website/utils.py b/frappe/website/utils.py index 0e4916023e..38d78c4aea 100644 --- a/frappe/website/utils.py +++ b/frappe/website/utils.py @@ -573,7 +573,7 @@ def add_preload_for_bundled_assets(response): version = get_build_version() links.extend( - f"; rel=preload; as=fetch; crossorigin" + f"<{svg}?v={version}>; rel=preload; as=fetch; crossorigin" for svg in frappe.local.preload_assets["icons"] ) diff --git a/frappe/www/app.html b/frappe/www/app.html index a2fef3362d..d9534be770 100644 --- a/frappe/www/app.html +++ b/frappe/www/app.html @@ -21,7 +21,7 @@ href="{{ favicon or "/assets/frappe/images/frappe-favicon.svg" }}" type="image/x-icon"> - {% for include in include_css -%} + {% for include in app_include_css -%} {{ include_style(include) }} {%- endfor -%} @@ -56,17 +56,13 @@ frappe.csrf_token = "{{ csrf_token }}"; - {%- for path in include_icons -%} - fetch(`/assets/{{ path }}?v=${window._version_number}`, { credentials: "same-origin" }) - .then((r) => r.text()) - .then((svg) => { - let svg_container = document.getElementById("all-symbols"); - svg_container.insertAdjacentHTML("beforeend", svg); - }); - {%- endfor -%} - {% for include in include_js %} + {%- for path in app_include_icons -%} + {{ include_icons(path) }} + {%- endfor -%} + + {% for include in app_include_js %} {{ include_script(include) }} {% endfor %} diff --git a/frappe/www/app.py b/frappe/www/app.py index 9fe9628f53..5f27c0cf01 100644 --- a/frappe/www/app.py +++ b/frappe/www/app.py @@ -46,21 +46,20 @@ def get_context(context): boot_json = json.dumps(boot_json) hooks = frappe.get_hooks() - include_js = hooks.get("app_include_js", []) + frappe.conf.get("app_include_js", []) - include_css = hooks.get("app_include_css", []) + frappe.conf.get("app_include_css", []) - include_icons = hooks.get("app_include_icons", []) - frappe.local.preload_assets["icons"].extend(include_icons) + app_include_js = hooks.get("app_include_js", []) + frappe.conf.get("app_include_js", []) + app_include_css = hooks.get("app_include_css", []) + frappe.conf.get("app_include_css", []) + app_include_icons = hooks.get("app_include_icons", []) if frappe.get_system_settings("enable_telemetry") and os.getenv("FRAPPE_SENTRY_DSN"): - include_js.append("sentry.bundle.js") + app_include_js.append("sentry.bundle.js") context.update( { "no_cache": 1, "build_version": frappe.utils.get_build_version(), - "include_js": include_js, - "include_css": include_css, - "include_icons": include_icons, + "app_include_js": app_include_js, + "app_include_css": app_include_css, + "app_include_icons": app_include_icons, "layout_direction": "rtl" if is_rtl() else "ltr", "lang": frappe.local.lang, "sounds": hooks["sounds"], diff --git a/frappe/www/attribution.html b/frappe/www/attribution.html index 95c0ba5dc0..6a32de742e 100644 --- a/frappe/www/attribution.html +++ b/frappe/www/attribution.html @@ -8,8 +8,8 @@

    {{ _("Attribution") }}

    - {{ _("This software is built on top of many open source packages. We would like to thank the authors of these - packages for their contribution.") }} + {{ _("This software is built on top of many open source packages.") }} + {{ _("We would like to thank the authors of these packages for their contribution.") }}

    {% for app_info in apps %} diff --git a/pyproject.toml b/pyproject.toml index 79c4d519b9..bb58092aea 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,6 +26,7 @@ dependencies = [ "PyYAML~=6.0.1", "RestrictedPython~=7.0", "WeasyPrint==59.0", + "pydyf==0.10.0", "Werkzeug~=3.0.1", "Whoosh~=2.7.4", "beautifulsoup4~=4.12.2", @@ -80,7 +81,7 @@ dependencies = [ "markdownify~=0.11.6", # integration dependencies - "boto3~=1.28.10", + "boto3~=1.34.143", "dropbox~=11.36.2", "google-api-python-client~=2.2.0", "google-auth-oauthlib~=0.4.4", @@ -111,6 +112,9 @@ freezegun = "~=1.2.2" [tool.ruff] line-length = 110 target-version = "py310" +exclude = [ + "**/doctype/*/boilerplate/*.py" # boilerplate are template strings, not valid python +] [tool.ruff.lint] select = [