diff --git a/cypress/integration/web_form.js b/cypress/integration/web_form.js
index 36f65a80bc..cbcd9e5bcf 100644
--- a/cypress/integration/web_form.js
+++ b/cypress/integration/web_form.js
@@ -27,7 +27,9 @@ context("Web Form", () => {
cy.wait("@save_form");
+ cy.get('.frappe-control[data-fieldname="route"]').scrollIntoView();
cy.get_field("route").should("have.value", "note");
+
cy.get(".title-area .indicator-pill")
.should("contain.text", "Published")
.should("have.class", "green");
diff --git a/frappe/core/doctype/communication/communication.js b/frappe/core/doctype/communication/communication.js
index 86ef59f994..d6103636e8 100644
--- a/frappe/core/doctype/communication/communication.js
+++ b/frappe/core/doctype/communication/communication.js
@@ -211,8 +211,7 @@ frappe.ui.form.on("Communication", {
],
primary_action_label: __("Move"),
primary_action(values) {
- d.hide();
- frappe.call({
+ return frappe.call({
method: "frappe.email.inbox.move_email",
args: {
communication: frm.doc.name,
@@ -220,6 +219,7 @@ frappe.ui.form.on("Communication", {
},
freeze: true,
callback: function () {
+ d.hide();
window.history.back();
},
});
diff --git a/frappe/core/doctype/doctype/doctype_list.js b/frappe/core/doctype/doctype/doctype_list.js
index 46b5e5b99d..3bb353c266 100644
--- a/frappe/core/doctype/doctype/doctype_list.js
+++ b/frappe/core/doctype/doctype/doctype_list.js
@@ -103,7 +103,7 @@ frappe.listview_settings["DocType"] = {
primary_action_label: __("Create & Continue"),
primary_action(values) {
if (!values.istable) values.editable_grid = 0;
- frappe.db
+ return frappe.db
.insert({
doctype: "DocType",
...values,
diff --git a/frappe/core/doctype/file/file.py b/frappe/core/doctype/file/file.py
index 3b0514d594..4e9e06a808 100755
--- a/frappe/core/doctype/file/file.py
+++ b/frappe/core/doctype/file/file.py
@@ -890,6 +890,14 @@ def has_permission(doc, ptype=None, user=None, debug=False):
if user != "Guest" and doc.owner == user:
return True
+ if (
+ user != "Guest"
+ and ptype in ["read", "write", "share", "submit"]
+ and frappe.share.get_shared(
+ "File", filters=[["share_name", "=", doc.name]], rights=[ptype], user=user
+ )
+ ):
+ return True
if doc.attached_to_doctype and doc.attached_to_name:
attached_to_doctype = doc.attached_to_doctype
diff --git a/frappe/core/doctype/file/utils.py b/frappe/core/doctype/file/utils.py
index 67abd82879..9d2a797ae8 100644
--- a/frappe/core/doctype/file/utils.py
+++ b/frappe/core/doctype/file/utils.py
@@ -427,6 +427,29 @@ def relink_mismatched_files(doc: "Document") -> None:
for df in attach_fields:
if doc.get(df.fieldname):
relink_files(doc, df.fieldname, doc.__temporary_name)
+
+ # Relink files in child table Attach fields
+ table_fields = doc.meta.get("fields", {"fieldtype": "Table"})
+ for table_df in table_fields:
+ child_rows = doc.get(table_df.fieldname) or []
+ if not child_rows:
+ continue
+
+ child_meta = frappe.get_meta(table_df.options)
+ child_attach_fields = child_meta.get("fields", {"fieldtype": ["in", ["Attach", "Attach Image"]]})
+
+ if not child_attach_fields:
+ continue
+
+ for child_row in child_rows:
+ for child_df in child_attach_fields:
+ file_url = child_row.get(child_df.fieldname)
+ if file_url:
+ frappe.db.set_value(
+ "File",
+ {"file_url": file_url, "attached_to_name": doc.__temporary_name},
+ {"attached_to_name": doc.name},
+ )
# delete temporary name after relinking is done
doc.delete_key("__temporary_name")
diff --git a/frappe/core/doctype/user/user.js b/frappe/core/doctype/user/user.js
index 4be1cfadec..3e9ff32d5e 100644
--- a/frappe/core/doctype/user/user.js
+++ b/frappe/core/doctype/user/user.js
@@ -201,18 +201,19 @@ frappe.ui.form.on("User", {
},
],
primary_action: (values) => {
- d.hide();
if (values.new_password !== values.confirm_password) {
frappe.throw(__("Passwords do not match!"));
}
- frappe.call(
- "frappe.integrations.doctype.ldap_settings.ldap_settings.reset_password",
- {
- user: frm.doc.email,
- password: values.new_password,
- logout: values.logout_sessions,
- }
- );
+ return frappe
+ .call(
+ "frappe.integrations.doctype.ldap_settings.ldap_settings.reset_password",
+ {
+ user: frm.doc.email,
+ password: values.new_password,
+ logout: values.logout_sessions,
+ }
+ )
+ .then(() => d.hide());
},
});
d.show();
diff --git a/frappe/core/report/database_storage_usage_by_tables/database_storage_usage_by_tables.js b/frappe/core/report/database_storage_usage_by_tables/database_storage_usage_by_tables.js
index 5a1ae6f87a..093016705e 100644
--- a/frappe/core/report/database_storage_usage_by_tables/database_storage_usage_by_tables.js
+++ b/frappe/core/report/database_storage_usage_by_tables/database_storage_usage_by_tables.js
@@ -25,7 +25,7 @@ frappe.query_reports["Database Storage Usage By Tables"] = {
size: "small",
primary_action_label: "Optimize",
primary_action(values) {
- frappe.call({
+ return frappe.call({
method: "frappe.core.report.database_storage_usage_by_tables.database_storage_usage_by_tables.optimize_doctype",
args: {
doctype_name: values.doctype_name,
@@ -38,9 +38,9 @@ frappe.query_reports["Database Storage Usage By Tables"] = {
)
);
}
+ d.hide();
},
});
- d.hide();
},
});
d.show();
diff --git a/frappe/core/report/database_storage_usage_by_tables/database_storage_usage_by_tables.py b/frappe/core/report/database_storage_usage_by_tables/database_storage_usage_by_tables.py
index df0a0c9470..df8dff27ce 100644
--- a/frappe/core/report/database_storage_usage_by_tables/database_storage_usage_by_tables.py
+++ b/frappe/core/report/database_storage_usage_by_tables/database_storage_usage_by_tables.py
@@ -22,6 +22,7 @@ def execute(filters=None):
round((data_length / 1024 / 1024), 2) as data_size,
round((index_length / 1024 / 1024), 2) as index_size
FROM information_schema.TABLES
+ WHERE table_schema = DATABASE()
ORDER BY (data_length + index_length) DESC;
""",
"postgres": """
diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js
index e11d496d69..1c3f0e8f1f 100644
--- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js
+++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js
@@ -488,7 +488,13 @@ frappe.ui.form.on("Dashboard Chart", {
});
dialog.show();
- dialog.set_values(frm.dynamic_filters);
+ if (frm.dynamic_filters) {
+ let filter_values = {};
+ frm.dynamic_filters.forEach((f) => {
+ filter_values[f[0] + ":" + f[1]] = f[3];
+ });
+ dialog.set_values(filter_values);
+ }
});
},
diff --git a/frappe/desk/doctype/number_card/number_card.js b/frappe/desk/doctype/number_card/number_card.js
index c5621fe6a4..cf2c8fb690 100644
--- a/frappe/desk/doctype/number_card/number_card.js
+++ b/frappe/desk/doctype/number_card/number_card.js
@@ -124,11 +124,6 @@ frappe.ui.form.on("Number Card", {
frappe.model.with_doctype(doctype, () => {
frappe.get_meta(doctype).fields.map((df) => {
if (frappe.model.numeric_fieldtypes.includes(df.fieldtype)) {
- if (df.fieldtype == "Currency") {
- if (!df.options || df.options !== "Company:company:default_currency") {
- return;
- }
- }
aggregate_based_on_fields.push({ label: df.label, value: df.fieldname });
}
});
@@ -405,7 +400,13 @@ frappe.ui.form.on("Number Card", {
});
dialog.show();
- dialog.set_values(frm.dynamic_filters);
+ if (frm.dynamic_filters) {
+ let filter_values = {};
+ frm.dynamic_filters.forEach((f) => {
+ filter_values[f[0] + ":" + f[1]] = f[3];
+ });
+ dialog.set_values(filter_values);
+ }
});
},
diff --git a/frappe/desk/form/linked_with.py b/frappe/desk/form/linked_with.py
index 4c54d1be4a..ccb681804f 100644
--- a/frappe/desk/form/linked_with.py
+++ b/frappe/desk/form/linked_with.py
@@ -437,37 +437,19 @@ def get_linked_docs(doctype: str, name: str, linkinfo: dict | None = None) -> di
is_target_doctype_table = frappe.get_meta(doctype).istable
for linked_doctype, link_context in linkinfo.items():
- # Don't try to fetch linked documents if the user can't read the doctype
- if not frappe.has_permission(linked_doctype):
- continue
-
linked_doctype_meta = frappe.get_meta(linked_doctype)
if linked_doctype_meta.issingle:
continue
+ has_permission = frappe.has_permission(linked_doctype)
filters = []
+ or_filters = []
ret = None
parent_info = None
- 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"]
-
- if add_fields := link_context.get("add_fields"):
- fields += add_fields
-
- fields = [sf.strip() for sf in fields if sf]
-
if filters_ctx := link_context.get("filters"):
- ret = frappe.get_list(doctype=linked_doctype, fields=fields, filters=filters_ctx, order_by=None)
+ filters = filters_ctx
elif link_context.get("get_parent"):
# check for child table
@@ -478,13 +460,10 @@ def get_linked_docs(doctype: str, name: str, linkinfo: dict | None = None) -> di
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,
- )
+ if not (parent_info and parent_info.parenttype == linked_doctype):
+ continue
+
+ filters = [[linked_doctype, "name", "=", parent_info.parent]]
elif child_doctype := link_context.get("child_doctype"):
or_filters = [
@@ -495,15 +474,6 @@ def get_linked_docs(doctype: str, name: str, linkinfo: dict | None = None) -> di
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]
@@ -518,12 +488,51 @@ def get_linked_docs(doctype: str, name: str, linkinfo: dict | None = None) -> di
or frappe.db.exists(linked_doctype, {"parenttype": doctype, "parent": name})
):
continue
+
+ total_count = len(
+ frappe.get_all(
+ linked_doctype,
+ filters=filters,
+ or_filters=or_filters,
+ fields=["name"],
+ order_by=None,
+ )
+ )
+
+ if not total_count:
+ continue
+
+ if has_permission:
+ 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"]
+
+ if add_fields := link_context.get("add_fields"):
+ fields += add_fields
+
+ fields = [sf.strip() for sf in fields if sf]
+
ret = frappe.get_list(
- doctype=linked_doctype, fields=fields, filters=filters, or_filters=or_filters, order_by=None
+ doctype=linked_doctype,
+ fields=fields,
+ filters=filters,
+ or_filters=or_filters,
+ distinct=True,
+ order_by=None,
)
- if ret:
- results[linked_doctype] = ret
+ permitted_count = len(ret or [])
+ results[linked_doctype] = {
+ "docs": ret or [],
+ "hidden_count": total_count - permitted_count,
+ }
return results
diff --git a/frappe/desk/page/desktop/desktop.css b/frappe/desk/page/desktop/desktop.css
index ef5e4e6062..4c294eb722 100644
--- a/frappe/desk/page/desktop/desktop.css
+++ b/frappe/desk/page/desktop/desktop.css
@@ -87,12 +87,17 @@
}
}
.modal
-.modal-body .icons-container,.folder-icon .icons-container {
+.modal-body .icons-container, .folder-icon .icons-container {
padding:0px;
margin: 0px;
height: 100%;
+ overflow: auto;
+}
+
+.folder-icon .icons-container {
overflow: hidden;
}
+
.icons{
gap: 16px;
display: grid;
diff --git a/frappe/desk/page/desktop/desktop.js b/frappe/desk/page/desktop/desktop.js
index 514af59374..ba76bfb88f 100644
--- a/frappe/desk/page/desktop/desktop.js
+++ b/frappe/desk/page/desktop/desktop.js
@@ -548,7 +548,6 @@ class DesktopPage {
frappe.router.on("change", function () {
if (frappe.get_route()[0] == "desktop" || frappe.get_route()[0] == "") {
me.setup_navbar();
- me.setup_edit_button();
} else {
$(".navbar").show();
frappe.desktop_utils.close_desktop_modal();
diff --git a/frappe/locale/bs.po b/frappe/locale/bs.po
index c0467055e8..f05ddd2f43 100644
--- a/frappe/locale/bs.po
+++ b/frappe/locale/bs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: developers@frappe.io\n"
"POT-Creation-Date: 2026-02-22 09:42+0000\n"
-"PO-Revision-Date: 2026-02-23 22:07\n"
+"PO-Revision-Date: 2026-02-25 23:15\n"
"Last-Translator: developers@frappe.io\n"
"Language-Team: Bosnian\n"
"MIME-Version: 1.0\n"
@@ -2870,7 +2870,7 @@ msgstr "Dodjela je Završena"
#. Label of the assignment_days (Table) field in DocType 'Assignment Rule'
#: frappe/automation/doctype/assignment_rule/assignment_rule.json
msgid "Assignment Days"
-msgstr "Dani Dodjeljivanja"
+msgstr "Dani Dodjele"
#. Name of a DocType
#. Label of the assignment_rule (Link) field in DocType 'ToDo'
@@ -2888,7 +2888,7 @@ msgstr "Dan Dodjele Pravila"
#. Name of a DocType
#: frappe/automation/doctype/assignment_rule_user/assignment_rule_user.json
msgid "Assignment Rule User"
-msgstr "Korisnik Dodjele Pravila"
+msgstr "Korisnik Pravila Dodjele"
#: frappe/automation/doctype/assignment_rule/assignment_rule.py:55
msgid "Assignment Rule is not allowed on document type {0}"
diff --git a/frappe/locale/fa.po b/frappe/locale/fa.po
index cd633e0b2d..8862e8e299 100644
--- a/frappe/locale/fa.po
+++ b/frappe/locale/fa.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: developers@frappe.io\n"
"POT-Creation-Date: 2026-02-22 09:42+0000\n"
-"PO-Revision-Date: 2026-02-23 22:07\n"
+"PO-Revision-Date: 2026-02-25 23:14\n"
"Last-Translator: developers@frappe.io\n"
"Language-Team: Persian\n"
"MIME-Version: 1.0\n"
@@ -6314,7 +6314,7 @@ msgstr "سفارشیسازی"
#: frappe/custom/doctype/customize_form/customize_form.js:89
msgid "Customize Child Table"
-msgstr "سفارشی کردن جدول فرزند"
+msgstr "سفارشیسازی جدول فرزند"
#: frappe/public/js/frappe/views/dashboard/dashboard_view.js:38
msgid "Customize Dashboard"
@@ -6339,7 +6339,7 @@ msgstr "سفارشیسازی فرم - {0}"
#. Name of a DocType
#: frappe/custom/doctype/customize_form_field/customize_form_field.json
msgid "Customize Form Field"
-msgstr "سفارشی کردن فیلد فرم"
+msgstr "سفارشیسازی فیلد فرم"
#: frappe/public/js/frappe/list/list_view.js:1994
msgctxt "Customize qucik filters of List View"
@@ -18808,7 +18808,7 @@ msgstr ""
#: frappe/core/doctype/doctype/doctype.py:1699
msgid "Options for Rating field can range from 3 to 10"
-msgstr "گزینههای فیلد رتبه بندی میتواند از 3 تا 10 باشد"
+msgstr "گزینههای فیلد رتبهبندی میتواند از 3 تا 10 باشد"
#: frappe/custom/doctype/custom_field/custom_field.js:96
msgid "Options for select. Each option on a new line."
diff --git a/frappe/locale/hr.po b/frappe/locale/hr.po
index 9f534aaf36..8851d800e9 100644
--- a/frappe/locale/hr.po
+++ b/frappe/locale/hr.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: developers@frappe.io\n"
"POT-Creation-Date: 2026-02-22 09:42+0000\n"
-"PO-Revision-Date: 2026-02-23 22:07\n"
+"PO-Revision-Date: 2026-02-25 23:14\n"
"Last-Translator: developers@frappe.io\n"
"Language-Team: Croatian\n"
"MIME-Version: 1.0\n"
@@ -2870,7 +2870,7 @@ msgstr "Dodjela je Završena"
#. Label of the assignment_days (Table) field in DocType 'Assignment Rule'
#: frappe/automation/doctype/assignment_rule/assignment_rule.json
msgid "Assignment Days"
-msgstr "Dani Dodjeljivanja"
+msgstr "Dani Dodjele"
#. Name of a DocType
#. Label of the assignment_rule (Link) field in DocType 'ToDo'
diff --git a/frappe/locale/sr.po b/frappe/locale/sr.po
index 97e1c2ff25..59a68f9ff8 100644
--- a/frappe/locale/sr.po
+++ b/frappe/locale/sr.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: developers@frappe.io\n"
"POT-Creation-Date: 2026-02-22 09:42+0000\n"
-"PO-Revision-Date: 2026-02-23 22:07\n"
+"PO-Revision-Date: 2026-02-26 23:27\n"
"Last-Translator: developers@frappe.io\n"
"Language-Team: Serbian (Cyrillic)\n"
"MIME-Version: 1.0\n"
@@ -1357,7 +1357,7 @@ msgstr "Додај параметре упита"
#. Label of the add_reply_to_header (Check) field in DocType 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "Add Reply-To header"
-msgstr ""
+msgstr "Додај заглавље адресе за одговор"
#: frappe/core/doctype/user/user.py:860
msgid "Add Roles"
@@ -1523,7 +1523,7 @@ msgstr "Додај на контролну таблу"
#: frappe/desk/doctype/workspace/workspace.js:49
msgid "Add to Desktop"
-msgstr ""
+msgstr "Додај на радну површину"
#: frappe/public/js/frappe/form/sidebar/assign_to.js:110
msgid "Add to ToDo"
@@ -1646,7 +1646,7 @@ msgstr "Адресе и контакти"
#. Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "Addresses added here will be used as the Reply-To header for outgoing emails sent from this account."
-msgstr ""
+msgstr "Адресе додате овде користиће се као адреса за одговор за излазне имејлове послате са овог налога."
#. Description of a DocType
#: frappe/custom/doctype/client_script/client_script.json
@@ -3082,7 +3082,7 @@ msgstr "Историја измена"
#. Label of a Workspace Sidebar Item
#: frappe/workspace_sidebar/users.json
msgid "Audits"
-msgstr ""
+msgstr "Ревизије"
#. Label of the auth_url_data (Code) field in DocType 'Social Login Key'
#: frappe/integrations/doctype/social_login_key/social_login_key.json
@@ -3516,7 +3516,7 @@ msgstr "Слика позадине"
#. Label of a Workspace Sidebar Item
#: frappe/workspace_sidebar/system.json
msgid "Background Job"
-msgstr ""
+msgstr "Позадински задатак"
#. Label of a Link in the Build Workspace
#. Label of the background_jobs_section (Section Break) field in DocType
@@ -4934,7 +4934,7 @@ msgstr "Кликните да поставите филтере"
#: frappe/desk/page/desktop/desktop.js:1261
msgid "Click to edit"
-msgstr ""
+msgstr "Кликните за уређивање"
#: frappe/public/js/frappe/list/list_view.js:754
msgid "Click to sort by {0}"
@@ -6537,7 +6537,7 @@ msgstr "Цијан"
#. 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "DELAY"
-msgstr ""
+msgstr "ОДЛАГАЊЕ"
#. Option for the 'Method' (Select) field in DocType 'Recorder'
#. Option for the 'Request Method' (Select) field in DocType 'Webhook'
@@ -7365,7 +7365,7 @@ msgstr "Статус"
#. Label of the dsn_notify_type (Select) field in DocType 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "Delivery Status Notification Type"
-msgstr ""
+msgstr "Врста обавештења о статусу испоруке"
#. Option for the 'Sign ups' (Select) field in DocType 'Social Login Key'
#: frappe/integrations/doctype/social_login_key/social_login_key.json
@@ -9430,7 +9430,7 @@ msgstr "Планер омогућен"
#. Label of the enabled (Check) field in DocType 'Notification Settings'
#: frappe/desk/doctype/notification_settings/notification_settings.json
msgid "Enabled System Notification"
-msgstr ""
+msgstr "Омогућено системско обавештење"
#: frappe/email/doctype/email_account/email_account.py:1101
msgid "Enabled email inbox for user {0}"
@@ -10128,7 +10128,7 @@ msgstr "Додатни параметри"
#. 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "FAILURE"
-msgstr ""
+msgstr "НЕУСПЕХ"
#. Option for the 'Social Login Provider' (Select) field in DocType 'Social
#. Login Key'
@@ -10272,7 +10272,7 @@ msgstr "Неуспешан покушај пријаве на Frappe Cloud"
#: frappe/email/doctype/email_account/email_account.py:232
msgid "Failed to retrieve the list of IMAP folders from the server. Please ensure the mailbox is accessible and the account has permission to list folders."
-msgstr ""
+msgstr "Неуспешно преузимање листе IMAP директоријума са сервера. Проверите да ли је поштанско сандуче доступно и да ли налог има дозволу за приказ директоријума."
#: frappe/email/doctype/email_queue/email_queue.py:311
msgid "Failed to send email with subject:"
@@ -11339,7 +11339,7 @@ msgstr "Јединица фракције"
#. Label of a Desktop Icon
#: frappe/desktop_icon/framework.json
msgid "Framework"
-msgstr ""
+msgstr "Framework"
#. Option for the 'Social Login Provider' (Select) field in DocType 'Social
#. Login Key'
@@ -12235,7 +12235,7 @@ msgstr "Наслов"
#. Label of a Workspace Sidebar Item
#: frappe/workspace_sidebar/system.json
msgid "Health Report"
-msgstr ""
+msgstr "Извештај о стању система"
#. Option for the 'Type' (Select) field in DocType 'Dashboard Chart'
#: frappe/desk/doctype/dashboard_chart/dashboard_chart.json
@@ -12654,7 +12654,7 @@ msgstr "IMAP датотека"
#: frappe/email/doctype/email_account/email_account.py:235
#: frappe/email/doctype/email_account/email_account.py:263
msgid "IMAP Folder Not Found"
-msgstr ""
+msgstr "IMAP директоријум није пронађен"
#. Label of the ip_address (Data) field in DocType 'Activity Log'
#. Label of the ip_address (Data) field in DocType 'Comment'
@@ -13414,7 +13414,7 @@ msgstr "Погрешан верификациони код"
#: frappe/public/js/frappe/views/gantt/gantt_view.js:88
msgid "Incorrect configuration"
-msgstr ""
+msgstr "Неисправна конфигурација"
#: frappe/model/document.py:1733
msgid "Incorrect value in row {0}:"
@@ -16979,7 +16979,7 @@ msgstr "MyISAM"
#. 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "NEVER"
-msgstr ""
+msgstr "НИКАДА"
#: frappe/workflow/doctype/workflow/workflow.js:19
msgid "NOTE: If you add states or transitions in the table, it will be reflected in the Workflow Builder but you will have to position them manually. Also Workflow Builder is currently in BETA."
@@ -17750,7 +17750,7 @@ msgstr "Нема података за извоз"
#: frappe/public/js/frappe/views/reports/query_report.js:1543
msgid "No data to perform this action"
-msgstr ""
+msgstr "Нема података за извршавање ове радње"
#: frappe/contacts/doctype/address/address.py:247
msgid "No default Address Template found. Please create a new one from Setup > Printing and Branding > Address Template."
@@ -17795,7 +17795,7 @@ msgstr "Нема додатних записа"
#: frappe/public/js/frappe/views/reports/report_view.js:337
msgid "No matching entries in the current results"
-msgstr ""
+msgstr "Нема подударних записа у тренутним резултатима"
#: frappe/templates/includes/search_template.html:49
msgid "No matching records. Search something new"
@@ -18429,7 +18429,7 @@ msgstr "OAuth грешка"
#. Label of a Workspace Sidebar Item
#: frappe/workspace_sidebar/integrations.json
msgid "OAuth Provider"
-msgstr ""
+msgstr "OAuth провајдер"
#. Name of a DocType
#. Label of a Link in the Integrations Workspace
@@ -18698,7 +18698,7 @@ msgstr "Дозволи уређивање само за"
#: frappe/core/doctype/module_def/module_def.py:95
msgid "Only Custom Modules can be renamed."
-msgstr ""
+msgstr "Искључиво прилагођени модули могу бити преименовани."
#: frappe/core/doctype/doctype/doctype.py:1652
msgid "Only Options allowed for Data field are:"
@@ -19969,7 +19969,7 @@ msgstr "Молимо Вас да додате валидан коментар."
#: frappe/public/js/frappe/views/reports/query_report.js:1544
msgid "Please adjust filters to include some data"
-msgstr ""
+msgstr "Прилагодите филтере како бисте укључили неке податке"
#: frappe/core/doctype/user/user.py:1122
msgid "Please ask your administrator to verify your sign-up"
@@ -20029,7 +20029,7 @@ msgstr "Молимо Вас да кликнете на следећи линк
#: frappe/public/js/frappe/views/gantt/gantt_view.js:89
msgid "Please configure the start field for this Doctype in the controller file."
-msgstr ""
+msgstr "Молимо Вас да конфигуришете почетно поље за овај DocType у датотеци контролера."
#: frappe/www/confirm_workflow_action.html:4
msgid "Please confirm your action to {0} this document."
@@ -21132,7 +21132,7 @@ msgstr "Љубичасто"
#. Label of a Workspace Sidebar Item
#: frappe/workspace_sidebar/integrations.json
msgid "Push Notification"
-msgstr ""
+msgstr "Push обавештење"
#. Name of a DocType
#. Label of a Link in the Integrations Workspace
@@ -22225,16 +22225,16 @@ msgstr "Одговори свима"
#. Name of a DocType
#: frappe/email/doctype/reply_to_address/reply_to_address.json
msgid "Reply To Address"
-msgstr ""
+msgstr "Адреса за одговор"
#: frappe/email/doctype/email_account/email_account.py:278
msgid "Reply To email is required"
-msgstr ""
+msgstr "Адреса за одговор је обавезна"
#. Label of the reply_to_addresses (Table) field in DocType 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "Reply-To Addresses"
-msgstr ""
+msgstr "Адреса за одговор"
#. Label of the report (Check) field in DocType 'Custom DocPerm'
#. Label of the report (Link) field in DocType 'Custom Role'
@@ -23276,19 +23276,19 @@ msgstr "SSL/TLS режим"
#. 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "SUCCESS"
-msgstr ""
+msgstr "УСПЕХ"
#. Option for the 'Delivery Status Notification Type' (Select) field in DocType
#. 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "SUCCESS,FAILURE"
-msgstr ""
+msgstr "УСПЕХ, НЕУСПЕХ"
#. Option for the 'Delivery Status Notification Type' (Select) field in DocType
#. 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "SUCCESS,FAILURE,DELAY"
-msgstr ""
+msgstr "УСПЕХ, НЕУСПЕХ, ОДЛАГАЊЕ"
#: frappe/public/js/frappe/color_picker/color_picker.js:20
msgid "SWATCHES"
@@ -24115,7 +24115,7 @@ msgstr "Изабери две верзије за приказ разлика."
#. DocType 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "Select which delivery events should trigger a delivery status notification (DSN) from the SMTP server."
-msgstr ""
+msgstr "Изаберите који догађаји испоруке треба да покрену обавештење о статусу испоруке (DNS) са SMTP сервера."
#: frappe/public/js/frappe/form/link_selector.js:24
#: frappe/public/js/frappe/form/multi_select_dialog.js:80
@@ -27098,7 +27098,7 @@ msgstr "Коментар не може бити празан"
#: frappe/email/doctype/email_account/email_account.py:290
msgid "The configured SMTP server does not support DSN (Delivery Status Notification)."
-msgstr ""
+msgstr "Конфигурисани SMTP сервер не подржава DNS (обавештење о статусу испоруке)."
#: frappe/templates/emails/workflow_action.html:9
msgid "The contents of this email are strictly confidential. Please do not forward this email to anyone."
@@ -27160,7 +27160,7 @@ msgstr "Следећа скрипта заглавља ће додати тре
#: frappe/email/doctype/email_account/email_account.py:257
msgid "The following configured IMAP folder(s) were not found on the server:
{0}
Please verify the folder names exactly as they appear on the server (folder names are case-sensitive)."
-msgstr ""
+msgstr "Следећи конфигурисани IMAP директоријуми нису пронађени на серверу:
{0}
Молимо Вас да проверите називе директоријума тачно онако како су приказани на серверу (велика и мала слова су битна за називе датотека)."
#: frappe/core/doctype/data_import/importer.py:1092
msgid "The following values are invalid: {0}. Values must be one of {1}"
@@ -27252,7 +27252,7 @@ msgstr "Изабрани документ {0} није {1}."
#: frappe/email/doctype/email_account/email_account.py:247
msgid "The server did not return any IMAP folders for this account."
-msgstr ""
+msgstr "Сервер није вратио ниједан IMAP директоријум за овај налог."
#: frappe/utils/response.py:343
msgid "The system is being updated. Please refresh again after a few moments."
@@ -29089,7 +29089,7 @@ msgstr "Отпреми"
#: frappe/public/js/frappe/file_uploader/FileUploader.vue:663
msgid "Upload Failed"
-msgstr ""
+msgstr "Отпремање је неуспешно"
#: frappe/public/js/print_format_builder/LetterHeadEditor.vue:93
msgid "Upload Image"
@@ -30783,7 +30783,7 @@ msgstr "Ставка бочне траке радног простора"
#: frappe/desk/doctype/workspace/workspace.js:58
msgid "Workspace added to desktop"
-msgstr ""
+msgstr "Радни простор је додат на радну површину"
#: frappe/public/js/frappe/views/workspace/workspace.js:558
msgid "Workspace {0} created"
@@ -31698,7 +31698,7 @@ msgstr "нпр. \"Подршка\", \"Продаја\", \"Петар Петро
#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:230
msgid "e.g. (55 + 434) / 4"
-msgstr ""
+msgstr "на пример (55 + 434) / 4"
#. Description of the 'Incoming Server' (Data) field in DocType 'Email Account'
#. Description of the 'Incoming Server' (Data) field in DocType 'Email Domain'
@@ -32860,7 +32860,7 @@ msgstr "{0} од {1} ({2} редова са зависним подацима)"
#: frappe/public/js/frappe/views/reports/report_view.js:456
msgid "{0} of {1} records match (filtered on visible rows only)"
-msgstr ""
+msgstr "{0} од {1} записа одговара критеријуму (филтрирано само по видљивим редовима)"
#: frappe/utils/data.py:1571
msgctxt "Money in words"
diff --git a/frappe/locale/sr_CS.po b/frappe/locale/sr_CS.po
index 615d2f479f..48c4216803 100644
--- a/frappe/locale/sr_CS.po
+++ b/frappe/locale/sr_CS.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: developers@frappe.io\n"
"POT-Creation-Date: 2026-02-22 09:42+0000\n"
-"PO-Revision-Date: 2026-02-23 22:07\n"
+"PO-Revision-Date: 2026-02-26 23:27\n"
"Last-Translator: developers@frappe.io\n"
"Language-Team: Serbian (Latin)\n"
"MIME-Version: 1.0\n"
@@ -1358,7 +1358,7 @@ msgstr "Dodaj parametre upita"
#. Label of the add_reply_to_header (Check) field in DocType 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "Add Reply-To header"
-msgstr ""
+msgstr "Dodaj zaglavlje adrese za odgovor"
#: frappe/core/doctype/user/user.py:860
msgid "Add Roles"
@@ -1524,7 +1524,7 @@ msgstr "Dodaj na kontrolnu tablu"
#: frappe/desk/doctype/workspace/workspace.js:49
msgid "Add to Desktop"
-msgstr ""
+msgstr "Dodaj na radnu površinu"
#: frappe/public/js/frappe/form/sidebar/assign_to.js:110
msgid "Add to ToDo"
@@ -1647,7 +1647,7 @@ msgstr "Adrese i kontakti"
#. Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "Addresses added here will be used as the Reply-To header for outgoing emails sent from this account."
-msgstr ""
+msgstr "Adrese dodate ovde koristiće se kao adresa za odgovor za izlazne imejlove poslate sa ovog naloga."
#. Description of a DocType
#: frappe/custom/doctype/client_script/client_script.json
@@ -3083,7 +3083,7 @@ msgstr "Istorija izmena"
#. Label of a Workspace Sidebar Item
#: frappe/workspace_sidebar/users.json
msgid "Audits"
-msgstr ""
+msgstr "Revizije"
#. Label of the auth_url_data (Code) field in DocType 'Social Login Key'
#: frappe/integrations/doctype/social_login_key/social_login_key.json
@@ -3517,7 +3517,7 @@ msgstr "Slika pozadine"
#. Label of a Workspace Sidebar Item
#: frappe/workspace_sidebar/system.json
msgid "Background Job"
-msgstr ""
+msgstr "Pozadinski zadatak"
#. Label of a Link in the Build Workspace
#. Label of the background_jobs_section (Section Break) field in DocType
@@ -4935,7 +4935,7 @@ msgstr "Kliknite da postavite filtere"
#: frappe/desk/page/desktop/desktop.js:1261
msgid "Click to edit"
-msgstr ""
+msgstr "Kliknite za uređivanje"
#: frappe/public/js/frappe/list/list_view.js:754
msgid "Click to sort by {0}"
@@ -6538,7 +6538,7 @@ msgstr "Cijan"
#. 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "DELAY"
-msgstr ""
+msgstr "ODLAGANJE"
#. Option for the 'Method' (Select) field in DocType 'Recorder'
#. Option for the 'Request Method' (Select) field in DocType 'Webhook'
@@ -7366,7 +7366,7 @@ msgstr "Status"
#. Label of the dsn_notify_type (Select) field in DocType 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "Delivery Status Notification Type"
-msgstr ""
+msgstr "Vrsta obaveštenja o statusu isporuke"
#. Option for the 'Sign ups' (Select) field in DocType 'Social Login Key'
#: frappe/integrations/doctype/social_login_key/social_login_key.json
@@ -9431,7 +9431,7 @@ msgstr "Planer omogućen"
#. Label of the enabled (Check) field in DocType 'Notification Settings'
#: frappe/desk/doctype/notification_settings/notification_settings.json
msgid "Enabled System Notification"
-msgstr ""
+msgstr "Omogućeno sistemsko obaveštenje"
#: frappe/email/doctype/email_account/email_account.py:1101
msgid "Enabled email inbox for user {0}"
@@ -10129,7 +10129,7 @@ msgstr "Dodatni parametri"
#. 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "FAILURE"
-msgstr ""
+msgstr "NEUSPEH"
#. Option for the 'Social Login Provider' (Select) field in DocType 'Social
#. Login Key'
@@ -10273,7 +10273,7 @@ msgstr "Neuspešan pokušaj prijave na Frappe Cloud"
#: frappe/email/doctype/email_account/email_account.py:232
msgid "Failed to retrieve the list of IMAP folders from the server. Please ensure the mailbox is accessible and the account has permission to list folders."
-msgstr ""
+msgstr "Neuspešno preuzimanje liste IMAP direktorijuma sa servera. Proverite da li je poštansko sanduče dostupno i da li nalog ima dozvolu za prikaz direktorijuma."
#: frappe/email/doctype/email_queue/email_queue.py:311
msgid "Failed to send email with subject:"
@@ -11340,7 +11340,7 @@ msgstr "Jedinica frakcije"
#. Label of a Desktop Icon
#: frappe/desktop_icon/framework.json
msgid "Framework"
-msgstr ""
+msgstr "Framework"
#. Option for the 'Social Login Provider' (Select) field in DocType 'Social
#. Login Key'
@@ -12236,7 +12236,7 @@ msgstr "Naslov"
#. Label of a Workspace Sidebar Item
#: frappe/workspace_sidebar/system.json
msgid "Health Report"
-msgstr ""
+msgstr "Izveštaj o stanju sistema"
#. Option for the 'Type' (Select) field in DocType 'Dashboard Chart'
#: frappe/desk/doctype/dashboard_chart/dashboard_chart.json
@@ -12655,7 +12655,7 @@ msgstr "IMAP datoteka"
#: frappe/email/doctype/email_account/email_account.py:235
#: frappe/email/doctype/email_account/email_account.py:263
msgid "IMAP Folder Not Found"
-msgstr ""
+msgstr "IMAP direktorijum nije pronađen"
#. Label of the ip_address (Data) field in DocType 'Activity Log'
#. Label of the ip_address (Data) field in DocType 'Comment'
@@ -13415,7 +13415,7 @@ msgstr "Pogrešan verifikacioni kod"
#: frappe/public/js/frappe/views/gantt/gantt_view.js:88
msgid "Incorrect configuration"
-msgstr ""
+msgstr "Neispravna konfiguracija"
#: frappe/model/document.py:1733
msgid "Incorrect value in row {0}:"
@@ -16980,7 +16980,7 @@ msgstr "MyISAM"
#. 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "NEVER"
-msgstr ""
+msgstr "NIKADA"
#: frappe/workflow/doctype/workflow/workflow.js:19
msgid "NOTE: If you add states or transitions in the table, it will be reflected in the Workflow Builder but you will have to position them manually. Also Workflow Builder is currently in BETA."
@@ -17751,7 +17751,7 @@ msgstr "Nema podataka za izvoz"
#: frappe/public/js/frappe/views/reports/query_report.js:1543
msgid "No data to perform this action"
-msgstr ""
+msgstr "Nema podataka za izvršavanje ove radnje"
#: frappe/contacts/doctype/address/address.py:247
msgid "No default Address Template found. Please create a new one from Setup > Printing and Branding > Address Template."
@@ -17796,7 +17796,7 @@ msgstr "Nema dodatnih zapisa"
#: frappe/public/js/frappe/views/reports/report_view.js:337
msgid "No matching entries in the current results"
-msgstr ""
+msgstr "Nema podudarnih zapisa u trenutnim rezultatima"
#: frappe/templates/includes/search_template.html:49
msgid "No matching records. Search something new"
@@ -18430,7 +18430,7 @@ msgstr "OAuth greška"
#. Label of a Workspace Sidebar Item
#: frappe/workspace_sidebar/integrations.json
msgid "OAuth Provider"
-msgstr ""
+msgstr "OAuth provajder"
#. Name of a DocType
#. Label of a Link in the Integrations Workspace
@@ -18699,7 +18699,7 @@ msgstr "Dozvoli uređivanje samo za"
#: frappe/core/doctype/module_def/module_def.py:95
msgid "Only Custom Modules can be renamed."
-msgstr ""
+msgstr "Isključivo prilagođeni moduli mogu biti preimenovani."
#: frappe/core/doctype/doctype/doctype.py:1652
msgid "Only Options allowed for Data field are:"
@@ -19970,7 +19970,7 @@ msgstr "Molimo Vas da dodate validan komentar."
#: frappe/public/js/frappe/views/reports/query_report.js:1544
msgid "Please adjust filters to include some data"
-msgstr ""
+msgstr "Prilagodite filtere kako biste uključili neke podatke"
#: frappe/core/doctype/user/user.py:1122
msgid "Please ask your administrator to verify your sign-up"
@@ -20030,7 +20030,7 @@ msgstr "Molimo Vas da kliknete na sledeći link da biste postavili novu lozinku"
#: frappe/public/js/frappe/views/gantt/gantt_view.js:89
msgid "Please configure the start field for this Doctype in the controller file."
-msgstr ""
+msgstr "Molimo Vas da konfigurišete početno polje za ovaj DocType u datoteci kontrolera."
#: frappe/www/confirm_workflow_action.html:4
msgid "Please confirm your action to {0} this document."
@@ -21133,7 +21133,7 @@ msgstr "Ljubičasto"
#. Label of a Workspace Sidebar Item
#: frappe/workspace_sidebar/integrations.json
msgid "Push Notification"
-msgstr ""
+msgstr "Push obaveštenje"
#. Name of a DocType
#. Label of a Link in the Integrations Workspace
@@ -22226,16 +22226,16 @@ msgstr "Odgovori svima"
#. Name of a DocType
#: frappe/email/doctype/reply_to_address/reply_to_address.json
msgid "Reply To Address"
-msgstr ""
+msgstr "Adresa za odgovor"
#: frappe/email/doctype/email_account/email_account.py:278
msgid "Reply To email is required"
-msgstr ""
+msgstr "Adresa za odgovor je obavezna"
#. Label of the reply_to_addresses (Table) field in DocType 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "Reply-To Addresses"
-msgstr ""
+msgstr "Adrese za odgovor"
#. Label of the report (Check) field in DocType 'Custom DocPerm'
#. Label of the report (Link) field in DocType 'Custom Role'
@@ -23277,19 +23277,19 @@ msgstr "SSL/TLS režim"
#. 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "SUCCESS"
-msgstr ""
+msgstr "USPEH"
#. Option for the 'Delivery Status Notification Type' (Select) field in DocType
#. 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "SUCCESS,FAILURE"
-msgstr ""
+msgstr "USPEH, NEUSPEH"
#. Option for the 'Delivery Status Notification Type' (Select) field in DocType
#. 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "SUCCESS,FAILURE,DELAY"
-msgstr ""
+msgstr "USPEH, NEUSPEH, ODLAGANJE"
#: frappe/public/js/frappe/color_picker/color_picker.js:20
msgid "SWATCHES"
@@ -24116,7 +24116,7 @@ msgstr "Izaberi dve verzije za prikaz razlika."
#. DocType 'Email Account'
#: frappe/email/doctype/email_account/email_account.json
msgid "Select which delivery events should trigger a delivery status notification (DSN) from the SMTP server."
-msgstr ""
+msgstr "Izaberite koji događaji isporuke treba da pokrenu obaveštenje o statusu isporuke (DNS) sa SMTP servera."
#: frappe/public/js/frappe/form/link_selector.js:24
#: frappe/public/js/frappe/form/multi_select_dialog.js:80
@@ -27099,7 +27099,7 @@ msgstr "Komentar ne može biti prazan"
#: frappe/email/doctype/email_account/email_account.py:290
msgid "The configured SMTP server does not support DSN (Delivery Status Notification)."
-msgstr ""
+msgstr "Konfigurisani SMTP server ne podržava DSN (obaveštenje o statusu isporuke)."
#: frappe/templates/emails/workflow_action.html:9
msgid "The contents of this email are strictly confidential. Please do not forward this email to anyone."
@@ -27161,7 +27161,7 @@ msgstr "Sledeća skripta zaglavlja će dodati trenutni datum u element klase 'he
#: frappe/email/doctype/email_account/email_account.py:257
msgid "The following configured IMAP folder(s) were not found on the server:
{0}
Please verify the folder names exactly as they appear on the server (folder names are case-sensitive)."
-msgstr ""
+msgstr "Sledeći konfigurisani IMAP direktorijumi nisu pronađeni na serveru:
{0}
Molimo Vas da proverite nazive direktorijuma tačno onako kako su prikazani na serveru (velika i mala slova su bitna za nazive datoteka)."
#: frappe/core/doctype/data_import/importer.py:1092
msgid "The following values are invalid: {0}. Values must be one of {1}"
@@ -27253,7 +27253,7 @@ msgstr "Izabrani dokument {0} nije {1}."
#: frappe/email/doctype/email_account/email_account.py:247
msgid "The server did not return any IMAP folders for this account."
-msgstr ""
+msgstr "Server nije vratio nijedan IMAP direktorijum za ovaj nalog."
#: frappe/utils/response.py:343
msgid "The system is being updated. Please refresh again after a few moments."
@@ -29089,7 +29089,7 @@ msgstr "Otpremi"
#: frappe/public/js/frappe/file_uploader/FileUploader.vue:663
msgid "Upload Failed"
-msgstr ""
+msgstr "Otpremanje je neuspešno"
#: frappe/public/js/print_format_builder/LetterHeadEditor.vue:93
msgid "Upload Image"
@@ -30783,7 +30783,7 @@ msgstr "Stavka bočne trake radnog prostora"
#: frappe/desk/doctype/workspace/workspace.js:58
msgid "Workspace added to desktop"
-msgstr ""
+msgstr "Radni prostor je dodat na radnu površinu"
#: frappe/public/js/frappe/views/workspace/workspace.js:558
msgid "Workspace {0} created"
@@ -31698,7 +31698,7 @@ msgstr "npr. \"Podrška\", \"Prodaja\", \"Petar Petrović\""
#: frappe/public/js/frappe/ui/toolbar/awesome_bar.js:230
msgid "e.g. (55 + 434) / 4"
-msgstr ""
+msgstr "na primer (55 + 434) / 4"
#. Description of the 'Incoming Server' (Data) field in DocType 'Email Account'
#. Description of the 'Incoming Server' (Data) field in DocType 'Email Domain'
@@ -32860,7 +32860,7 @@ msgstr "{0} od {1} ({2} redova sa zavisnim podacima)"
#: frappe/public/js/frappe/views/reports/report_view.js:456
msgid "{0} of {1} records match (filtered on visible rows only)"
-msgstr ""
+msgstr "{0} od {1} zapisa odgovara kriterijumu (filtrirano samo po vidljivim redovima)"
#: frappe/utils/data.py:1571
msgctxt "Money in words"
diff --git a/frappe/locale/sv.po b/frappe/locale/sv.po
index 0b77050332..7ad41225a0 100644
--- a/frappe/locale/sv.po
+++ b/frappe/locale/sv.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: developers@frappe.io\n"
"POT-Creation-Date: 2026-02-22 09:42+0000\n"
-"PO-Revision-Date: 2026-02-23 22:07\n"
+"PO-Revision-Date: 2026-02-25 23:14\n"
"Last-Translator: developers@frappe.io\n"
"Language-Team: Swedish\n"
"MIME-Version: 1.0\n"
@@ -2868,7 +2868,7 @@ msgstr "Tilldelning Klar"
#. Label of the assignment_days (Table) field in DocType 'Assignment Rule'
#: frappe/automation/doctype/assignment_rule/assignment_rule.json
msgid "Assignment Days"
-msgstr "Automation Dagar"
+msgstr "Tilldelning Dagar"
#. Name of a DocType
#. Label of the assignment_rule (Link) field in DocType 'ToDo'
@@ -2876,7 +2876,7 @@ msgstr "Automation Dagar"
#: frappe/automation/doctype/assignment_rule/assignment_rule.json
#: frappe/desk/doctype/todo/todo.json frappe/workspace_sidebar/automation.json
msgid "Assignment Rule"
-msgstr "Automation Regel"
+msgstr "Tilldelning Regel"
#. Name of a DocType
#: frappe/automation/doctype/assignment_rule_day/assignment_rule_day.json
@@ -2890,13 +2890,13 @@ msgstr "Automation Regel Användare"
#: frappe/automation/doctype/assignment_rule/assignment_rule.py:55
msgid "Assignment Rule is not allowed on document type {0}"
-msgstr "Automation Regel är ej tillåten på dokument typ {0}"
+msgstr "Tilldelning Regel är ej tillåten på dokument typ {0}"
#. Label of the assignment_rules_section (Section Break) field in DocType
#. 'Assignment Rule'
#: frappe/automation/doctype/assignment_rule/assignment_rule.json
msgid "Assignment Rules"
-msgstr "Automation Regler"
+msgstr "Tilldelning Regler"
#: frappe/desk/doctype/notification_log/notification_log.py:153
msgid "Assignment Update on {0}"
diff --git a/frappe/model/meta.py b/frappe/model/meta.py
index add084d38e..3dc3181dac 100644
--- a/frappe/model/meta.py
+++ b/frappe/model/meta.py
@@ -894,6 +894,12 @@ def get_field_currency(df, doc=None):
if frappe.get_meta(doc.parenttype).has_field(df.get("options")):
# only get_value if parent has currency field
currency = frappe.db.get_value(doc.parenttype, doc.parent, df.get("options"))
+ if not currency:
+ # Parent may not be in DB yet (new document being saved).
+ # Use the in-memory parent document reference if available.
+ parent = getattr(doc, "parent_doc", None)
+ if parent:
+ currency = parent.get(df.get("options"))
if currency:
frappe.local.field_currency.setdefault((doc.doctype, ref_docname), frappe._dict()).setdefault(
diff --git a/frappe/printing/doctype/letter_head/letter_head.json b/frappe/printing/doctype/letter_head/letter_head.json
index 4ddafc47db..aa40d0a751 100644
--- a/frappe/printing/doctype/letter_head/letter_head.json
+++ b/frappe/printing/doctype/letter_head/letter_head.json
@@ -127,12 +127,12 @@
{
"fieldname": "image_height",
"fieldtype": "Float",
- "label": "Image Height"
+ "label": "Image Height (px)"
},
{
"fieldname": "image_width",
"fieldtype": "Float",
- "label": "Image Width"
+ "label": "Image Width (px)"
},
{
"depends_on": "eval:doc.footer_source==='Image' && doc.letter_head_name",
@@ -148,12 +148,12 @@
{
"fieldname": "footer_image_height",
"fieldtype": "Float",
- "label": "Image Height"
+ "label": "Image Height (px)"
},
{
"fieldname": "footer_image_width",
"fieldtype": "Float",
- "label": "Image Width"
+ "label": "Image Width (px)"
},
{
"fieldname": "footer_align",
@@ -203,7 +203,7 @@
"links": [],
"make_attachments_public": 1,
"max_attachments": 3,
- "modified": "2026-02-24 20:53:14.297567",
+ "modified": "2026-02-25 14:37:57.061516",
"modified_by": "Administrator",
"module": "Printing",
"name": "Letter Head",
diff --git a/frappe/printing/page/print_format_builder/print_format_builder.js b/frappe/printing/page/print_format_builder/print_format_builder.js
index bae82ba040..a40101ba87 100644
--- a/frappe/printing/page/print_format_builder/print_format_builder.js
+++ b/frappe/printing/page/print_format_builder/print_format_builder.js
@@ -35,6 +35,7 @@ frappe.PrintFormatBuilder = class PrintFormatBuilder {
this.show_start();
} else {
this.page.set_title(this.print_format.name);
+ this.page.sidebar.toggle(true);
this.setup_print_format();
}
}
@@ -65,6 +66,7 @@ frappe.PrintFormatBuilder = class PrintFormatBuilder {
this.page.main.html(frappe.render_template("print_format_builder_start", {}));
this.page.clear_actions();
this.page.set_title(__("Print Format Builder"));
+ this.page.sidebar.toggle(false);
this.start_edit_print_format();
this.start_new_print_format();
}
diff --git a/frappe/public/js/billing.bundle.js b/frappe/public/js/billing.bundle.js
index c9bf512844..2c11bc75af 100644
--- a/frappe/public/js/billing.bundle.js
+++ b/frappe/public/js/billing.bundle.js
@@ -33,7 +33,14 @@ $(document).ready(function () {
!frappe.is_mobile() &&
frappe.user.has_role("System Manager");
if (visiblity_condition && isFCUser) {
- addChatBubble();
+ frappe.router.on("change", function () {
+ if (frappe.get_route()[0] == "") {
+ addChatBubble();
+ toggleChatBubble(true);
+ } else {
+ toggleChatBubble(false);
+ }
+ });
}
if (isFCUser) {
$.extend(card_args, {
@@ -89,13 +96,18 @@ function openFrappeCloudDashboard() {
}
function addChatBubble() {
- if (checkBusinessHours()) {
+ const all_apps = frappe.utils.get_installed_apps();
+ const desk_apps = ["erpnext", "hrms"];
+
+ const apps_allowed = frappe.utils.is_sub_array(all_apps, desk_apps);
+ if (checkBusinessHours && apps_allowed) {
let chat_banner = document.createElement("script");
+ chat_banner.setAttribute("id", "chat_widget_trigger");
chat_banner.innerHTML =
'(function(d,t){var BASE_URL="https://chat.frappe.cloud";var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src=BASE_URL+"/packs/js/sdk.js";g.async=true;s.parentNode.insertBefore(g,s);g.onload=function(){window.chatwootSDK.run({websiteToken:"LdmfJzftdJGEcFjoTqk8CrSq",baseUrl:BASE_URL})}})(document,"script");';
document.body.append(chat_banner);
const root = document.documentElement;
- root.style.setProperty("--s-700", "var(--gray-50)");
+ root.style.setProperty("--s-700", "var(--gray-500)");
}
}
@@ -103,5 +115,15 @@ function checkBusinessHours() {
let currentTime = new Date();
const istTime = new Date(currentTime.toLocaleString("en-US", { timeZone: "Asia/Kolkata" }));
- return istTime.getHours() >= 11 && istTime.getHours() <= 18;
+ return istTime.getHours() >= 11 && istTime.getHours() < 18;
+}
+
+function toggleChatBubble(toggle) {
+ if (toggle) {
+ $(".woot-widget-holder").show();
+ $("#cw-bubble-holder").show();
+ } else {
+ $(".woot-widget-holder").hide();
+ $("#cw-bubble-holder").hide();
+ }
}
diff --git a/frappe/public/js/frappe/file_uploader/FileUploader.vue b/frappe/public/js/frappe/file_uploader/FileUploader.vue
index 10012c82ad..f21d925efe 100644
--- a/frappe/public/js/frappe/file_uploader/FileUploader.vue
+++ b/frappe/public/js/frappe/file_uploader/FileUploader.vue
@@ -514,22 +514,7 @@ function check_restrictions(file) {
return is_correct_type && valid_file_size;
}
-function set_loading_state(dialog, loading) {
- let $btn = dialog?.get_primary_btn();
- if (loading) {
- $btn?.css("width", $btn.outerWidth());
- $btn?.html(``);
- $btn?.prop("disabled", true);
- dialog?.get_secondary_btn().prop("disabled", true);
- } else {
- $btn?.css("width", "");
- $btn?.html(__("Upload"));
- $btn?.prop("disabled", false);
- dialog?.get_secondary_btn().prop("disabled", false);
- }
-}
-function upload_files(dialog) {
- set_loading_state(dialog, true);
+function upload_files() {
if (show_file_browser.value) {
promise = upload_via_file_browser();
} else if (show_web_link.value) {
@@ -542,7 +527,7 @@ function upload_files(dialog) {
} else {
promise = frappe.run_serially(files.value.map((file, i) => () => upload_file(file, i)));
}
- return promise.finally(() => set_loading_state(dialog, false));
+ return promise;
}
function upload_via_file_browser() {
let selected_file = file_browser.value.selected_node;
diff --git a/frappe/public/js/frappe/file_uploader/file_uploader.bundle.js b/frappe/public/js/frappe/file_uploader/file_uploader.bundle.js
index 44e9d9add6..999cc675ea 100644
--- a/frappe/public/js/frappe/file_uploader/file_uploader.bundle.js
+++ b/frappe/public/js/frappe/file_uploader/file_uploader.bundle.js
@@ -151,6 +151,7 @@ class FileUploader {
const dialog_opts = {
title: title || __("Upload"),
primary_action_label: __("Upload"),
+ primary_action_loading_label: __("Uploading"),
primary_action: () => this.upload_files(),
on_page_show: () => {
this.uploader.wrapper_ready = true;
diff --git a/frappe/public/js/frappe/form/column.js b/frappe/public/js/frappe/form/column.js
index 92ec3d8917..e46cd49ef6 100644
--- a/frappe/public/js/frappe/form/column.js
+++ b/frappe/public/js/frappe/form/column.js
@@ -37,24 +37,35 @@ export default class Column {
}
resize_all_columns() {
- // distribute all columns equally
- let columns = this.section.wrapper.find(".form-column").length;
+ // distribute visible columns equally
+ let all_columns = this.section.wrapper.find(".form-column");
+ let visible_columns = all_columns.filter(":not(.hide-control)");
+ let columns = visible_columns.length || all_columns.length;
let colspan = cint(12 / columns);
if (columns == 5) {
colspan = 20;
}
- this.section.wrapper
- .find(".form-column")
- .removeClass()
- .addClass("form-column")
- .addClass("col-sm-" + colspan);
+ all_columns.each(function () {
+ const $col = $(this);
+ const is_hidden = $col.hasClass("hide-control");
+ $col.removeClass()
+ .addClass("form-column")
+ .addClass("col-sm-" + colspan);
+ if (is_hidden) {
+ $col.addClass("hide-control");
+ }
+ });
}
add_field() {}
refresh() {
+ if (!this.df) return;
+ const hide = this.df.hidden || this.df.hidden_due_to_dependency;
+ this.wrapper.toggleClass("hide-control", !!hide);
+ this.resize_all_columns();
this.section.refresh();
}
}
diff --git a/frappe/public/js/frappe/form/controls/color.js b/frappe/public/js/frappe/form/controls/color.js
index e9f88faec5..65c9f1b1d3 100644
--- a/frappe/public/js/frappe/form/controls/color.js
+++ b/frappe/public/js/frappe/form/controls/color.js
@@ -2,7 +2,7 @@ import Picker from "../../color_picker/color_picker";
frappe.ui.form.ControlColor = class ControlColor extends frappe.ui.form.ControlData {
make_input() {
- this.df.placeholder = this.df.placeholder || __("Choose a color");
+ this.df.placeholder = __(this.df.placeholder) || __("Choose a color");
super.make_input();
this.make_color_input();
}
diff --git a/frappe/public/js/frappe/form/controls/data.js b/frappe/public/js/frappe/form/controls/data.js
index 3cd3446d2f..69f2b5d519 100644
--- a/frappe/public/js/frappe/form/controls/data.js
+++ b/frappe/public/js/frappe/form/controls/data.js
@@ -241,7 +241,7 @@ frappe.ui.form.ControlData = class ControlData extends frappe.ui.form.ControlInp
this.$input
.attr("data-fieldtype", this.df.fieldtype)
.attr("data-fieldname", this.df.fieldname)
- .attr("placeholder", this.df.placeholder || "");
+ .attr("placeholder", __(this.df.placeholder || ""));
if (this.doctype) {
this.$input.attr("data-doctype", this.doctype);
}
diff --git a/frappe/public/js/frappe/form/controls/icon.js b/frappe/public/js/frappe/form/controls/icon.js
index a964153d2b..6f86665c2b 100644
--- a/frappe/public/js/frappe/form/controls/icon.js
+++ b/frappe/public/js/frappe/form/controls/icon.js
@@ -2,7 +2,7 @@ import Picker from "../../icon_picker/icon_picker";
frappe.ui.form.ControlIcon = class ControlIcon extends frappe.ui.form.ControlData {
make_input() {
- this.df.placeholder = this.df.placeholder || __("Choose an icon");
+ this.df.placeholder = __(this.df.placeholder) || __("Choose an icon");
super.make_input();
this.get_all_icons();
this.make_icon_input();
diff --git a/frappe/public/js/frappe/form/controls/select.js b/frappe/public/js/frappe/form/controls/select.js
index eee88cb149..c6802b5984 100644
--- a/frappe/public/js/frappe/form/controls/select.js
+++ b/frappe/public/js/frappe/form/controls/select.js
@@ -28,7 +28,7 @@ frappe.ui.form.ControlSelect = class ControlSelect extends frappe.ui.form.Contro
const placeholder_html = `