feat: show private workspaces in My Workspaces
This commit is contained in:
parent
dc45418aa8
commit
219ba386ab
7 changed files with 98 additions and 73 deletions
|
|
@ -7,11 +7,12 @@ context("Workspace 2.0", () => {
|
||||||
it("Navigate to page from sidebar", () => {
|
it("Navigate to page from sidebar", () => {
|
||||||
cy.visit("/app/build");
|
cy.visit("/app/build");
|
||||||
cy.get(".codex-editor__redactor .ce-block");
|
cy.get(".codex-editor__redactor .ce-block");
|
||||||
cy.get('.sidebar-item-container[item-title="Website"]').first().click();
|
cy.get('.sidebar-item-container[item-title="Page"]').first().click();
|
||||||
cy.location("pathname").should("eq", "/app/website");
|
cy.location("pathname").should("eq", "/app/page");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Create Private Page", () => {
|
it("Create Private Page", () => {
|
||||||
|
cy.visit("/app/build");
|
||||||
cy.intercept({
|
cy.intercept({
|
||||||
method: "POST",
|
method: "POST",
|
||||||
url: "api/method/frappe.desk.doctype.workspace.workspace.new_page",
|
url: "api/method/frappe.desk.doctype.workspace.workspace.new_page",
|
||||||
|
|
@ -27,61 +28,16 @@ context("Workspace 2.0", () => {
|
||||||
cy.get_open_dialog().find(".btn-primary").click();
|
cy.get_open_dialog().find(".btn-primary").click();
|
||||||
|
|
||||||
// check if sidebar item is added in pubic section
|
// check if sidebar item is added in pubic section
|
||||||
cy.get('.sidebar-item-container[item-title="Test Private Page"]').should(
|
cy.get('.sidebar-item-container[item-title="Test Private Page"]');
|
||||||
"have.attr",
|
|
||||||
"item-public",
|
|
||||||
"0"
|
|
||||||
);
|
|
||||||
cy.wait(300);
|
cy.wait(300);
|
||||||
cy.get('.standard-actions .btn-primary[data-label="Save"]').click();
|
cy.get('.standard-actions .btn-primary[data-label="Save"]').click();
|
||||||
cy.wait(300);
|
cy.wait(300);
|
||||||
cy.get('.sidebar-item-container[item-title="Test Private Page"]').should(
|
cy.get('.sidebar-item-container[item-title="Test Private Page"]');
|
||||||
"have.attr",
|
|
||||||
"item-public",
|
|
||||||
"0"
|
|
||||||
);
|
|
||||||
|
|
||||||
cy.wait("@new_page");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Create Child Page", () => {
|
|
||||||
cy.intercept({
|
|
||||||
method: "POST",
|
|
||||||
url: "api/method/frappe.desk.doctype.workspace.workspace.new_page",
|
|
||||||
}).as("new_page");
|
|
||||||
|
|
||||||
cy.get(".codex-editor__redactor .ce-block");
|
|
||||||
cy.get(".btn-new-workspace").click();
|
|
||||||
cy.fill_field("title", "Test Child Page", "Data");
|
|
||||||
cy.fill_field("parent", "Test Private Page", "Select");
|
|
||||||
cy.fill_field("type", "Workspace", "Select");
|
|
||||||
cy.get_open_dialog().find(".modal-header").click();
|
|
||||||
cy.wait(300);
|
|
||||||
cy.get_open_dialog().find(".btn-primary").click();
|
|
||||||
|
|
||||||
// check if sidebar item is added in pubic section
|
|
||||||
cy.get('.sidebar-item-container[item-title="Test Child Page"]').should(
|
|
||||||
"have.attr",
|
|
||||||
"item-public",
|
|
||||||
"0"
|
|
||||||
);
|
|
||||||
cy.wait(300);
|
|
||||||
cy.get('.standard-actions .btn-primary[data-label="Save"]').click();
|
|
||||||
cy.wait(300);
|
|
||||||
cy.get('.sidebar-item-container[item-title="Test Child Page"]').should(
|
|
||||||
"have.attr",
|
|
||||||
"item-public",
|
|
||||||
"0"
|
|
||||||
);
|
|
||||||
|
|
||||||
cy.wait("@new_page");
|
cy.wait("@new_page");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Add New Block", () => {
|
it("Add New Block", () => {
|
||||||
cy.get('.sidebar-item-container[item-title="Test Private Page"]').as("sidebar-item");
|
|
||||||
|
|
||||||
cy.get("@sidebar-item").find(".standard-sidebar-item").first().click({ force: true });
|
|
||||||
|
|
||||||
cy.get(".btn-edit-workspace").click({ force: true });
|
cy.get(".btn-edit-workspace").click({ force: true });
|
||||||
|
|
||||||
cy.get(".ce-block").click().type("{enter}");
|
cy.get(".ce-block").click().type("{enter}");
|
||||||
|
|
|
||||||
|
|
@ -25,19 +25,11 @@ context("Workspace Blocks", () => {
|
||||||
cy.get_open_dialog().find(".btn-primary").click();
|
cy.get_open_dialog().find(".btn-primary").click();
|
||||||
|
|
||||||
// check if sidebar item is added in private section
|
// check if sidebar item is added in private section
|
||||||
cy.get('.sidebar-item-container[item-title="Test Block Page"]').should(
|
cy.get('.sidebar-item-container[item-title="Test Block Page"]');
|
||||||
"have.attr",
|
|
||||||
"item-public",
|
|
||||||
"0"
|
|
||||||
);
|
|
||||||
cy.wait(300);
|
cy.wait(300);
|
||||||
cy.get('.standard-actions .btn-primary[data-label="Save"]').click();
|
cy.get('.standard-actions .btn-primary[data-label="Save"]').click();
|
||||||
cy.wait(300);
|
cy.wait(300);
|
||||||
cy.get('.sidebar-item-container[item-title="Test Block Page"]').should(
|
cy.get('.sidebar-item-container[item-title="Test Block Page"]');
|
||||||
"have.attr",
|
|
||||||
"item-public",
|
|
||||||
"0"
|
|
||||||
);
|
|
||||||
|
|
||||||
cy.wait("@new_page");
|
cy.wait("@new_page");
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,9 @@ from json import loads
|
||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
|
from frappe.boot import get_sidebar_items
|
||||||
from frappe.desk.desktop import get_workspace_sidebar_items, save_new_widget
|
from frappe.desk.desktop import get_workspace_sidebar_items, save_new_widget
|
||||||
|
from frappe.desk.doctype.workspace_sidebar.workspace_sidebar import add_to_my_workspace
|
||||||
from frappe.desk.utils import validate_route_conflict
|
from frappe.desk.utils import validate_route_conflict
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from frappe.model.rename_doc import rename_doc
|
from frappe.model.rename_doc import rename_doc
|
||||||
|
|
@ -294,7 +296,10 @@ def new_page(new_page):
|
||||||
doc.sequence_id = last_sequence_id(doc) + 1
|
doc.sequence_id = last_sequence_id(doc) + 1
|
||||||
doc.save(ignore_permissions=True)
|
doc.save(ignore_permissions=True)
|
||||||
|
|
||||||
return get_workspace_sidebar_items()
|
# add to workspace sidebar items
|
||||||
|
if not doc.public:
|
||||||
|
add_to_my_workspace(doc)
|
||||||
|
return {"workspace_pages": get_workspace_sidebar_items(), "sidebar_items": get_sidebar_items()}
|
||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ from json import JSONDecodeError, dumps, loads
|
||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.desk.doctype.workspace.workspace import is_workspace_manager
|
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from frappe.modules.utils import create_directory_on_app_path
|
from frappe.modules.utils import create_directory_on_app_path
|
||||||
|
|
||||||
|
|
@ -52,6 +51,10 @@ class WorkspaceSidebar(Document):
|
||||||
frappe.throw(_("You need to be Workspace Manager to delete a public workspace."))
|
frappe.throw(_("You need to be Workspace Manager to delete a public workspace."))
|
||||||
|
|
||||||
|
|
||||||
|
def is_workspace_manager():
|
||||||
|
return "Workspace Manager" in frappe.get_roles()
|
||||||
|
|
||||||
|
|
||||||
def create_workspace_sidebar_for_workspaces():
|
def create_workspace_sidebar_for_workspaces():
|
||||||
from frappe.query_builder import DocType
|
from frappe.query_builder import DocType
|
||||||
|
|
||||||
|
|
@ -98,3 +101,19 @@ def add_sidebar_items(sidebar_title, sidebar_items):
|
||||||
w.items = items
|
w.items = items
|
||||||
w.save()
|
w.save()
|
||||||
return w
|
return w
|
||||||
|
|
||||||
|
|
||||||
|
def add_to_my_workspace(workspace):
|
||||||
|
private_sidebar = frappe.get_doc("Workspace Sidebar", "My Workspaces")
|
||||||
|
|
||||||
|
workspace_sidebar = {
|
||||||
|
"label": workspace.title,
|
||||||
|
"type": "Link",
|
||||||
|
"link_to": f"{workspace.title}-{workspace.for_user}",
|
||||||
|
"link_type": "Workspace",
|
||||||
|
"icon": workspace.icon,
|
||||||
|
}
|
||||||
|
|
||||||
|
private_sidebar.append("items", workspace_sidebar)
|
||||||
|
|
||||||
|
private_sidebar.save()
|
||||||
|
|
|
||||||
|
|
@ -58,12 +58,18 @@ frappe.ui.Sidebar = class Sidebar {
|
||||||
}
|
}
|
||||||
setup(workspace_title) {
|
setup(workspace_title) {
|
||||||
this.workspace_title = workspace_title;
|
this.workspace_title = workspace_title;
|
||||||
|
this.check_for_private_workspace(workspace_title);
|
||||||
this.prepare();
|
this.prepare();
|
||||||
this.$sidebar.attr("data-title", this.workspace_title);
|
this.$sidebar.attr("data-title", this.workspace_title);
|
||||||
this.sidebar_header = new frappe.ui.SidebarHeader(this);
|
this.sidebar_header = new frappe.ui.SidebarHeader(this);
|
||||||
this.make_sidebar();
|
this.make_sidebar();
|
||||||
this.setup_complete = true;
|
this.setup_complete = true;
|
||||||
}
|
}
|
||||||
|
check_for_private_workspace(workspace_title) {
|
||||||
|
if (workspace_title == "private") {
|
||||||
|
this.workspace_title = "My Workspaces";
|
||||||
|
}
|
||||||
|
}
|
||||||
setup_events() {
|
setup_events() {
|
||||||
const me = this;
|
const me = this;
|
||||||
frappe.router.on("change", function (router) {
|
frappe.router.on("change", function (router) {
|
||||||
|
|
@ -239,12 +245,6 @@ frappe.ui.Sidebar = class Sidebar {
|
||||||
this.set_active_workspace_item();
|
this.set_active_workspace_item();
|
||||||
}
|
}
|
||||||
|
|
||||||
reload() {
|
|
||||||
return frappe.workspace.get_pages().then((r) => {
|
|
||||||
frappe.boot.sidebar_pages = r;
|
|
||||||
this.setup_pages();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
set_height() {
|
set_height() {
|
||||||
$(".body-sidebar").css("height", window.innerHeight + "px");
|
$(".body-sidebar").css("height", window.innerHeight + "px");
|
||||||
$(".overlay").css("height", window.innerHeight + "px");
|
$(".overlay").css("height", window.innerHeight + "px");
|
||||||
|
|
@ -274,7 +274,13 @@ frappe.ui.Sidebar = class Sidebar {
|
||||||
let route = frappe.get_route();
|
let route = frappe.get_route();
|
||||||
if (frappe.get_route()[0] == "setup-wizard") return;
|
if (frappe.get_route()[0] == "setup-wizard") return;
|
||||||
if (route[0] == "Workspaces") {
|
if (route[0] == "Workspaces") {
|
||||||
let workspace = route[1];
|
let workspace;
|
||||||
|
if (!route[1]) {
|
||||||
|
workspace = "My Workspaces";
|
||||||
|
} else {
|
||||||
|
workspace = route[1];
|
||||||
|
}
|
||||||
|
|
||||||
frappe.app.sidebar.setup(workspace);
|
frappe.app.sidebar.setup(workspace);
|
||||||
} else if (route[0] == "List" || route[0] == "Form") {
|
} else if (route[0] == "List" || route[0] == "Form") {
|
||||||
let doctype = route[1];
|
let doctype = route[1];
|
||||||
|
|
|
||||||
|
|
@ -550,6 +550,7 @@ frappe.views.Workspace = class Workspace {
|
||||||
}
|
}
|
||||||
|
|
||||||
create_page(new_page) {
|
create_page(new_page) {
|
||||||
|
const me = this;
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
frappe.call({
|
frappe.call({
|
||||||
method: "frappe.desk.doctype.workspace.workspace.new_page",
|
method: "frappe.desk.doctype.workspace.workspace.new_page",
|
||||||
|
|
@ -565,11 +566,18 @@ frappe.views.Workspace = class Workspace {
|
||||||
indicator: "green",
|
indicator: "green",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
frappe.boot.sidebar_pages = r.message;
|
if (r.message) {
|
||||||
|
frappe.boot.sidebar_pages = r.message.workspace_pages;
|
||||||
if (!frappe.boot.app_data_map["private"] && new_page.public === 0) {
|
frappe.boot.workspaces = r.message.workspace_pages;
|
||||||
this.sidebar.apps_switcher.add_private_app();
|
me.workspaces = frappe.boot.workspaces.pages;
|
||||||
|
me.setup_pages(frappe.boot.sidebar_pages.pages);
|
||||||
|
frappe.boot.workspace_sidebar_item = r.message.sidebar_items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (new_page.public === 0) {
|
||||||
|
frappe.app.sidebar.setup("private");
|
||||||
|
}
|
||||||
|
|
||||||
resolve();
|
resolve();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -577,6 +585,31 @@ frappe.views.Workspace = class Workspace {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setup_pages(all_pages) {
|
||||||
|
all_pages.forEach((page) => {
|
||||||
|
page.is_editable = !page.public || this.has_access;
|
||||||
|
if (typeof page.content == "string") {
|
||||||
|
page.content = JSON.parse(page.content);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (all_pages) {
|
||||||
|
frappe.workspaces = {};
|
||||||
|
frappe.workspace_list = [];
|
||||||
|
frappe.workspace_map = {};
|
||||||
|
for (let page of all_pages) {
|
||||||
|
frappe.workspaces[frappe.router.slug(page.name)] = {
|
||||||
|
name: page.name,
|
||||||
|
public: page.public,
|
||||||
|
};
|
||||||
|
if (!page.app && page.module) {
|
||||||
|
page.app = frappe.boot.module_app[frappe.slug(page.module)];
|
||||||
|
}
|
||||||
|
frappe.workspace_map[page.name] = page;
|
||||||
|
frappe.workspace_list.push(page);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
initialize_editorjs(blocks) {
|
initialize_editorjs(blocks) {
|
||||||
this.tools = {
|
this.tools = {
|
||||||
header: {
|
header: {
|
||||||
|
|
@ -722,7 +755,7 @@ frappe.views.Workspace = class Workspace {
|
||||||
this._page = null;
|
this._page = null;
|
||||||
return this.get_pages().then((r) => {
|
return this.get_pages().then((r) => {
|
||||||
frappe.boot.sidebar_pages = r;
|
frappe.boot.sidebar_pages = r;
|
||||||
this.sidebar.setup_pages();
|
this.setup_pages(frappe.boot.workspaces.pages);
|
||||||
this.show();
|
this.show();
|
||||||
if (this.undo) this.undo.readOnly = true;
|
if (this.undo) this.undo.readOnly = true;
|
||||||
});
|
});
|
||||||
|
|
|
||||||
14
frappe/workspace_sidebar/my_workspaces.json
Normal file
14
frappe/workspace_sidebar/my_workspaces.json
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"app": "frappe",
|
||||||
|
"creation": "2025-11-03 03:11:08.482620",
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "Workspace Sidebar",
|
||||||
|
"header_icon": "user",
|
||||||
|
"idx": 0,
|
||||||
|
"items": [],
|
||||||
|
"modified": "2025-11-03 10:44:42.883207",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"name": "My Workspaces",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"title": "My Workspaces"
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue