diff --git a/frappe/boot.py b/frappe/boot.py
index 80d7791176..bcd4c6c793 100644
--- a/frappe/boot.py
+++ b/frappe/boot.py
@@ -151,7 +151,10 @@ def load_desktop_data(bootinfo):
bootinfo.desktop_icons = get_desktop_icons()
bootinfo.workspaces = get_workspace_sidebar_items()
- bootinfo.app_name_style = (frappe.db.get_single_value("Desktop Settings", "show_app_name_in_header"),)
+ bootinfo.app_name_style = frappe.db.get_single_value("Desktop Settings", "show_app_name_in_header")
+ bootinfo.show_app_icons_as_folder = frappe.db.get_single_value(
+ "Desktop Settings", "show_app_icons_as_folder"
+ )
bootinfo.workspace_sidebar_item = get_sidebar_items()
allowed_pages = [d.name for d in bootinfo.workspaces.get("pages")]
bootinfo.module_wise_workspaces = get_controller("Workspace").get_module_wise_workspaces()
diff --git a/frappe/desk/doctype/desktop_settings/desktop_settings.json b/frappe/desk/doctype/desktop_settings/desktop_settings.json
index eb8f8077e6..e2a1b8346c 100644
--- a/frappe/desk/doctype/desktop_settings/desktop_settings.json
+++ b/frappe/desk/doctype/desktop_settings/desktop_settings.json
@@ -7,6 +7,7 @@
"field_order": [
"icon_style",
"navbar_style",
+ "show_app_icons_as_folder",
"sidebar_section",
"show_app_name_in_header"
],
@@ -34,13 +35,19 @@
"fieldtype": "Select",
"label": "Show App Name in Header",
"options": "Default\nTitle\nSubtitle"
+ },
+ {
+ "default": "0",
+ "fieldname": "show_app_icons_as_folder",
+ "fieldtype": "Check",
+ "label": "Show App Icons As Folder"
}
],
"grid_page_length": 50,
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
- "modified": "2025-10-19 04:53:14.413040",
+ "modified": "2025-11-11 00:23:53.552669",
"modified_by": "Administrator",
"module": "Desk",
"name": "Desktop Settings",
diff --git a/frappe/desk/doctype/desktop_settings/desktop_settings.py b/frappe/desk/doctype/desktop_settings/desktop_settings.py
index a76aca23d9..5c1bc3c5f9 100644
--- a/frappe/desk/doctype/desktop_settings/desktop_settings.py
+++ b/frappe/desk/doctype/desktop_settings/desktop_settings.py
@@ -23,6 +23,7 @@ class DesktopSettings(Document):
"Timeless Launchpad",
"Apps with Search",
]
+ show_app_icons_as_folder: DF.Check
show_app_name_in_header: DF.Literal["Default", "Title", "Subtitle"]
# end: auto-generated types
diff --git a/frappe/desk/page/desktop/desktop.css b/frappe/desk/page/desktop/desktop.css
index ee603e39a3..7182163a69 100644
--- a/frappe/desk/page/desktop/desktop.css
+++ b/frappe/desk/page/desktop/desktop.css
@@ -138,6 +138,11 @@
}
}
+#desktop-modal{
+ transform: none;
+ transition: none;
+}
+
.desktop-modal-body {
width: var(--desktop-modal-width);
height: var(--desktop-modal-height);
diff --git a/frappe/desk/page/desktop/desktop.html b/frappe/desk/page/desktop/desktop.html
index 70d791d3e1..3c56a587a7 100644
--- a/frappe/desk/page/desktop/desktop.html
+++ b/frappe/desk/page/desktop/desktop.html
@@ -1,20 +1,20 @@
-
+

-
+
diff --git a/frappe/desk/page/desktop/desktop.js b/frappe/desk/page/desktop/desktop.js
index 1bc22f7120..5ea3dd02f2 100644
--- a/frappe/desk/page/desktop/desktop.js
+++ b/frappe/desk/page/desktop/desktop.js
@@ -157,7 +157,7 @@ class DesktopPage {
setup() {
this.setup_avatar();
this.setup_navbar();
- this.setup_icon_search();
+ this.setup_awesomebar();
this.handke_route_change();
}
setup_avatar() {
@@ -182,6 +182,13 @@ class DesktopPage {
window.location.reload();
},
},
+ {
+ icon: "log-out",
+ label: "Logout",
+ onClick: function () {
+ frappe.app.logout();
+ },
+ },
];
frappe.ui.create_menu($(".desktop-avatar"), menu_items, null, true);
}
@@ -189,6 +196,30 @@ class DesktopPage {
$(".sticky-top > .navbar").hide();
}
+ setup_awesomebar() {
+ if (frappe.boot.desk_settings.search_bar) {
+ let awesome_bar = new frappe.search.AwesomeBar();
+ awesome_bar.setup(".desktop-search-wrapper #navbar-search");
+ }
+ frappe.ui.keys.add_shortcut({
+ shortcut: "ctrl+g",
+ action: function (e) {
+ $(".desktop-search-wrapper #navbar-search").focus();
+ e.preventDefault();
+ return false;
+ },
+ description: __("Open Awesomebar"),
+ });
+ frappe.ui.keys.add_shortcut({
+ shortcut: "ctrl+k",
+ action: function (e) {
+ $(".desktop-search-wrapper #navbar-search").focus();
+ e.preventDefault();
+ return false;
+ },
+ description: __("Open Awesomebar"),
+ });
+ }
handke_route_change() {
const me = this;
frappe.router.on("change", function () {
@@ -200,32 +231,32 @@ class DesktopPage {
});
}
- setup_icon_search() {
- let all_icons = $(".icon-title");
- let icons_to_show = [];
- $(".desktop-container .icons").append(
- " No apps found
"
- );
- $(".desktop-search-wrapper > #navbar-search").on("input", function (e) {
- let search_query = $(e.target).val().toLowerCase();
- console.log(search_query);
- icons_to_show = [];
- all_icons.each(function (index, element) {
- $(element).parent().parent().hide();
- let label = $(element).text().toLowerCase();
- if (label.includes(search_query)) {
- icons_to_show.push(element);
- }
- });
+ // setup_icon_search() {
+ // let all_icons = $(".icon-title");
+ // let icons_to_show = [];
+ // $(".desktop-container .icons").append(
+ // " No apps found
"
+ // );
+ // $(".desktop-search-wrapper > #navbar-search").on("input", function (e) {
+ // let search_query = $(e.target).val().toLowerCase();
+ // console.log(search_query);
+ // icons_to_show = [];
+ // all_icons.each(function (index, element) {
+ // $(element).parent().parent().hide();
+ // let label = $(element).text().toLowerCase();
+ // if (label.includes(search_query)) {
+ // icons_to_show.push(element);
+ // }
+ // });
- if (icons_to_show.length == 0) {
- $(".desktop-container .icons").find(".no-apps-message").removeClass("hidden");
- } else {
- $(".desktop-container .icons").find(".no-apps-message").addClass("hidden");
- }
- toggle_icons(icons_to_show);
- });
- }
+ // if (icons_to_show.length == 0) {
+ // $(".desktop-container .icons").find(".no-apps-message").removeClass("hidden");
+ // } else {
+ // $(".desktop-container .icons").find(".no-apps-message").addClass("hidden");
+ // }
+ // toggle_icons(icons_to_show);
+ // });
+ // }
}
class DesktopIconGrid {
@@ -424,7 +455,7 @@ class DesktopIcon {
}
get_child_icons_data() {
- return this.icon_data.child_icons;
+ return this.icon_data.child_icons.sort((a, b) => a.idx - b.idx);
}
get_desktop_icon_html() {
return this.icon;
@@ -448,7 +479,11 @@ class DesktopIcon {
}
render_folder_thumbnail() {
- if (this.icon_type == "Folder") {
+ let condition =
+ frappe.boot.show_app_icons_as_folder &&
+ this.icon_type == "App" &&
+ this.child_icons.length > 0;
+ if (this.icon_type == "Folder" || condition) {
if (!this.folder_wrapper) this.folder_wrapper = this.icon.find(".icon-container");
this.folder_wrapper.html("");
this.folder_grid = new DesktopIconGrid({
@@ -459,6 +494,9 @@ class DesktopIcon {
in_modal: true,
no_dragging: true,
});
+ if (this.icon_type == "App") {
+ this.folder_wrapper.addClass("folder-icon");
+ }
}
}
@@ -511,6 +549,7 @@ class DesktopModal {
this.modal = new frappe.get_modal(icon_title, "");
this.modal.find(".modal-header").addClass("desktop-modal-heading");
this.modal.addClass("desktop-modal");
+ this.modal.find(".modal-dialog").attr("id", "desktop-modal");
this.modal.find(".modal-body").addClass("desktop-modal-body");
this.$child_icons_wrapper = this.modal.find(".desktop-modal-body");
} else {