From c4eeb2e24c05aa77c3a63d85bcfa6885e7c16129 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 11 Apr 2024 22:02:41 +0530 Subject: [PATCH] fix: private workspace routing (backport #25904) (#25921) * refactor: local declaration (cherry picked from commit facff87cadf263bf7e0e0a400ae9c4693a03a775) * fix: use workspace title instead of name this is how workspaces work :shrug: (cherry picked from commit 822679246c8077beba8f44c05877727ef7a62e7b) * refactor: Simplify workspace resolution no need for if-elses eh (cherry picked from commit 84cbe3dcc53383266a72cb524a68630734db22e9) --------- Co-authored-by: Ankush Menat --- frappe/public/js/frappe/router.js | 41 +++++++++---------- .../js/frappe/views/workspace/workspace.js | 2 +- frappe/utils/user.py | 8 +++- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/frappe/public/js/frappe/router.js b/frappe/public/js/frappe/router.js index 59ce8df7882..0a2069d0632 100644 --- a/frappe/public/js/frappe/router.js +++ b/frappe/public/js/frappe/router.js @@ -177,13 +177,12 @@ frappe.router = { // /app/user/user-001 = ["Form", "User", "user-001"] // /app/event/view/calendar/default = ["List", "Event", "Calendar", "Default"] - let private_workspace = route[1] && `${route[1]}-${frappe.user.name.toLowerCase()}`; - if (frappe.workspaces[route[0]]) { // public workspace route = ["Workspaces", frappe.workspaces[route[0]].title]; } else if (route[0] == "private") { // private workspace + let private_workspace = route[1] && `${route[1]}-${frappe.user.name.toLowerCase()}`; if (!frappe.workspaces[private_workspace] && localStorage.new_workspace) { let new_workspace = JSON.parse(localStorage.new_workspace); if (frappe.router.slug(new_workspace.title) === route[1]) { @@ -464,26 +463,26 @@ frappe.router = { return "/app/" + path_string; } - // Workspace + // Resolution order + // 1. User's default workspace in user doctype + // 2. Private home + // 3. Public home + // 4. First workspace in list let private_home = `home-${frappe.user.name.toLowerCase()}`; - let default_page = null; - if (frappe.boot.user.default_workspace) { - default_page = frappe.router.slug(frappe.boot.user.default_workspace.name); - } else if (frappe.workspaces[private_home]) { - default_page = private_home; - } else if (frappe.workspaces["home"]) { - default_page = "home"; - } else { - // Fallback to first workspace - default_page = Object.keys(frappe.workspaces)[0]; - } - - if (frappe.workspaces[default_page]?.public == false) { - default_page = "private/" + default_page; - } - - if (default_page) { - return "/app/" + default_page; + let default_workspace = frappe.router.slug(frappe.boot.user.default_workspace?.name || ""); + + let workspace = + frappe.workspaces[default_workspace] || + frappe.workspaces[private_home] || + frappe.workspaces["home"] || + Object.values(frappe.workspaces)[0]; + + if (workspace) { + return ( + "/app/" + + (workspace.public ? "" : "private/") + + frappe.router.slug(workspace.title) + ); } return "/app"; diff --git a/frappe/public/js/frappe/views/workspace/workspace.js b/frappe/public/js/frappe/views/workspace/workspace.js index 735f8097b57..cdb57b321bc 100644 --- a/frappe/public/js/frappe/views/workspace/workspace.js +++ b/frappe/public/js/frappe/views/workspace/workspace.js @@ -353,7 +353,7 @@ frappe.views.Workspace = class Workspace { if (frappe.boot.user.default_workspace) { default_page = { - name: frappe.boot.user.default_workspace.name, + name: frappe.boot.user.default_workspace.title, public: frappe.boot.user.default_workspace.public, }; } else if ( diff --git a/frappe/utils/user.py b/frappe/utils/user.py index a6cc4d6db3f..e47cb1d8a22 100644 --- a/frappe/utils/user.py +++ b/frappe/utils/user.py @@ -235,8 +235,12 @@ def load_user(self): self.build_permissions() if d.get("default_workspace"): - public = frappe.get_cached_value("Workspace", d.default_workspace, "public") - d.default_workspace = {"name": d.default_workspace, "public": public} + workspace = frappe.get_cached_doc("Workspace", d.default_workspace) + d.default_workspace = { + "name": workspace.name, + "public": workspace.public, + "title": workspace.title, + } d.name = self.name d.onboarding_status = frappe.parse_json(d.onboarding_status)