diff --git a/frappe/core/doctype/user/user.js b/frappe/core/doctype/user/user.js index dc40fb0336..df79223875 100644 --- a/frappe/core/doctype/user/user.js +++ b/frappe/core/doctype/user/user.js @@ -1,4 +1,14 @@ frappe.ui.form.on("User", { + setup: function (frm) { + frm.set_query("default_workspace", () => { + return { + filters: { + parent_page: ["is", "not set"], + for_user: ["in", [null, frappe.session.user]], + }, + }; + }); + }, before_load: function (frm) { let update_tz_options = function () { frm.fields_dict.time_zone.set_data(frappe.all_timezones); diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json index 894216a3e0..0f93b340a0 100644 --- a/frappe/core/doctype/user/user.json +++ b/frappe/core/doctype/user/user.json @@ -23,6 +23,8 @@ "send_welcome_email", "unsubscribed", "user_image", + "workspaces_section", + "default_workspace", "roles_permissions_tab", "sb1", "role_profile_name", @@ -711,6 +713,18 @@ "label": "Role Profiles", "options": "User Role Profile", "permlevel": 1 + }, + { + "fieldname": "workspaces_section", + "fieldtype": "Section Break", + "label": "Workspaces" + }, + { + "description": "If left empty, the default workspace will be the last visited workspace", + "fieldname": "default_workspace", + "fieldtype": "Link", + "label": "Default Workspace", + "options": "Workspace" } ], "icon": "fa fa-user", @@ -773,7 +787,7 @@ "link_fieldname": "user" } ], - "modified": "2024-02-11 13:16:29.574666", + "modified": "2024-03-06 11:14:38.424148", "modified_by": "Administrator", "module": "Core", "name": "User", diff --git a/frappe/public/js/frappe/views/workspace/workspace.js b/frappe/public/js/frappe/views/workspace/workspace.js index 650ccb01ec..735f8097b5 100644 --- a/frappe/public/js/frappe/views/workspace/workspace.js +++ b/frappe/public/js/frappe/views/workspace/workspace.js @@ -351,7 +351,12 @@ frappe.views.Workspace = class Workspace { get_page_to_show() { let default_page; - if ( + if (frappe.boot.user.default_workspace) { + default_page = { + name: frappe.boot.user.default_workspace.name, + public: frappe.boot.user.default_workspace.public, + }; + } else if ( localStorage.current_page && this.all_pages.filter((page) => page.title == localStorage.current_page).length != 0 ) { diff --git a/frappe/utils/user.py b/frappe/utils/user.py index 027c5dbaf5..8069f22497 100644 --- a/frappe/utils/user.py +++ b/frappe/utils/user.py @@ -226,6 +226,7 @@ class UserPermissions: "send_me_a_copy", "user_type", "onboarding_status", + "default_workspace", ], as_dict=True, ) @@ -233,6 +234,10 @@ class UserPermissions: if not self.can_read: 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} + d.name = self.name d.onboarding_status = frappe.parse_json(d.onboarding_status) d.roles = self.get_roles()