fix(tests): workspace tests and more style fixes
This commit is contained in:
parent
72eb501de3
commit
77b11dd1ce
27 changed files with 123 additions and 520 deletions
|
|
@ -72,84 +72,12 @@ context("Workspace 2.0", () => {
|
|||
cy.wait("@new_page");
|
||||
});
|
||||
|
||||
it("Duplicate Page", () => {
|
||||
cy.intercept({
|
||||
method: "POST",
|
||||
url: "api/method/frappe.desk.doctype.workspace.workspace.duplicate_page",
|
||||
}).as("page_duplicated");
|
||||
|
||||
cy.get(".codex-editor__redactor .ce-block");
|
||||
cy.get(".btn-edit-workspace").click();
|
||||
|
||||
cy.get('.sidebar-item-container[item-name="Test Private Page"]').as("sidebar-item");
|
||||
|
||||
cy.get("@sidebar-item").find(".standard-sidebar-item").first().click();
|
||||
cy.get("@sidebar-item").find(".dropdown-btn").first().click();
|
||||
cy.get("@sidebar-item")
|
||||
.find(".dropdown-list .dropdown-item")
|
||||
.contains("Duplicate")
|
||||
.first()
|
||||
.click({ force: true });
|
||||
|
||||
cy.get_open_dialog().fill_field("title", "Duplicate Page", "Data");
|
||||
cy.click_modal_primary_button("Duplicate");
|
||||
|
||||
cy.wait("@page_duplicated");
|
||||
});
|
||||
|
||||
it("Drag Sidebar Item", () => {
|
||||
cy.intercept({
|
||||
method: "POST",
|
||||
url: "api/method/frappe.desk.doctype.workspace.workspace.sort_pages",
|
||||
}).as("page_sorted");
|
||||
|
||||
cy.get('.sidebar-item-container[item-name="Duplicate Page"]').as("sidebar-item");
|
||||
|
||||
cy.get("@sidebar-item").find(".standard-sidebar-item").first().click();
|
||||
cy.get("@sidebar-item").find(".drag-handle").first().move({ deltaX: 0, deltaY: 100 });
|
||||
|
||||
cy.get('.sidebar-item-container[item-name="Build"]').as("sidebar-item");
|
||||
|
||||
cy.get("@sidebar-item").find(".standard-sidebar-item").first().click();
|
||||
cy.get("@sidebar-item").find(".drag-handle").first().move({ deltaX: 0, deltaY: 100 });
|
||||
|
||||
cy.wait("@page_sorted");
|
||||
});
|
||||
|
||||
it("Edit Page Detail", () => {
|
||||
cy.intercept({
|
||||
method: "POST",
|
||||
url: "api/method/frappe.desk.doctype.workspace.workspace.update_page",
|
||||
}).as("page_updated");
|
||||
|
||||
cy.get('.sidebar-item-container[item-name="Test Private Page"]').as("sidebar-item");
|
||||
|
||||
cy.get("@sidebar-item").find(".standard-sidebar-item").first().click();
|
||||
cy.get("@sidebar-item").find(".dropdown-btn").first().click();
|
||||
cy.get("@sidebar-item")
|
||||
.find(".dropdown-list .dropdown-item")
|
||||
.contains("Edit")
|
||||
.first()
|
||||
.click({ force: true });
|
||||
|
||||
cy.get_open_dialog().fill_field("title", " 1", "Data");
|
||||
cy.get_open_dialog().find('input[data-fieldname="is_public"]').check();
|
||||
cy.click_modal_primary_button("Update");
|
||||
|
||||
cy.get(
|
||||
'.standard-sidebar-section:first .sidebar-item-container[item-name="Test Private Page"]'
|
||||
).should("not.exist");
|
||||
cy.get(
|
||||
'.standard-sidebar-section:last .sidebar-item-container[item-name="Test Private Page 1"]'
|
||||
).should("exist");
|
||||
|
||||
cy.wait("@page_updated");
|
||||
});
|
||||
|
||||
it("Add New Block", () => {
|
||||
cy.get('.sidebar-item-container[item-name="Duplicate Page"]').as("sidebar-item");
|
||||
cy.get('.sidebar-item-container[item-name="Test Private Page"]').as("sidebar-item");
|
||||
|
||||
cy.get("@sidebar-item").find(".standard-sidebar-item").first().click();
|
||||
cy.get("@sidebar-item").find(".standard-sidebar-item").first().click({ force: true });
|
||||
|
||||
cy.get(".btn-edit-workspace").click({ force: true });
|
||||
|
||||
cy.get(".ce-block").click().type("{enter}");
|
||||
cy.get(".block-list-container .block-list-item").contains("Heading").click();
|
||||
|
|
@ -187,68 +115,4 @@ context("Workspace 2.0", () => {
|
|||
|
||||
cy.get('.standard-actions .btn-primary[data-label="Save"]').click();
|
||||
});
|
||||
|
||||
it("Hide/Unhide Workspaces", () => {
|
||||
// hide
|
||||
cy.intercept({
|
||||
method: "POST",
|
||||
url: "api/method/frappe.desk.doctype.workspace.workspace.hide_page",
|
||||
}).as("hide_page");
|
||||
|
||||
cy.get(".codex-editor__redactor .ce-block");
|
||||
cy.get(".btn-edit-workspace").click();
|
||||
|
||||
cy.get('.sidebar-item-container[item-name="Duplicate Page"]')
|
||||
.find(".sidebar-item-control .setting-btn")
|
||||
.click();
|
||||
cy.get('.sidebar-item-container[item-name="Duplicate Page"]')
|
||||
.find('.dropdown-item[title="Hide Workspace"]')
|
||||
.click({ force: true });
|
||||
cy.wait(300);
|
||||
cy.get('.standard-actions .btn-secondary[data-label="Discard"]').click();
|
||||
cy.get('.sidebar-item-container[item-name="Duplicate Page"]').should("not.be.visible");
|
||||
|
||||
cy.wait("@hide_page");
|
||||
|
||||
// unhide
|
||||
cy.intercept({
|
||||
method: "POST",
|
||||
url: "api/method/frappe.desk.doctype.workspace.workspace.unhide_page",
|
||||
}).as("unhide_page");
|
||||
|
||||
cy.get(".codex-editor__redactor .ce-block");
|
||||
cy.get(".btn-edit-workspace").click();
|
||||
|
||||
cy.get('.sidebar-item-container[item-name="Duplicate Page"]')
|
||||
.find('[title="Unhide Workspace"]')
|
||||
.click({ force: true });
|
||||
cy.wait(300);
|
||||
|
||||
cy.get('.standard-actions .btn-secondary[data-label="Discard"]').click();
|
||||
cy.get('.sidebar-item-container[item-name="Duplicate Page"]').should("be.visible");
|
||||
|
||||
cy.wait("@unhide_page");
|
||||
});
|
||||
|
||||
it("Delete Duplicate Page", () => {
|
||||
cy.intercept({
|
||||
method: "POST",
|
||||
url: "api/method/frappe.desk.doctype.workspace.workspace.delete_page",
|
||||
}).as("page_deleted");
|
||||
|
||||
cy.get(".codex-editor__redactor .ce-block");
|
||||
cy.get(".btn-edit-workspace").click();
|
||||
|
||||
cy.get('.sidebar-item-container[item-name="Duplicate Page"]')
|
||||
.find(".sidebar-item-control .setting-btn")
|
||||
.click();
|
||||
cy.get('.sidebar-item-container[item-name="Duplicate Page"]')
|
||||
.find('.dropdown-item[title="Delete Workspace"]')
|
||||
.click({ force: true });
|
||||
cy.wait(300);
|
||||
cy.get(".modal-footer > .standard-actions > .btn-modal-primary:visible").first().click();
|
||||
cy.get('.sidebar-item-container[item-name="Duplicate Page"]').should("not.exist");
|
||||
|
||||
cy.wait("@page_deleted");
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
"doctype": "Workspace",
|
||||
"for_user": "",
|
||||
"hide_custom": 0,
|
||||
"icon": "tool",
|
||||
"icon": "organization",
|
||||
"idx": 1,
|
||||
"is_hidden": 0,
|
||||
"label": "Build",
|
||||
|
|
@ -301,7 +301,7 @@
|
|||
"type": "Link"
|
||||
}
|
||||
],
|
||||
"modified": "2024-08-16 12:31:51.279839",
|
||||
"modified": "2024-08-26 15:14:40.193261",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Core",
|
||||
"name": "Build",
|
||||
|
|
@ -312,7 +312,7 @@
|
|||
"quick_lists": [],
|
||||
"restrict_to_domain": "",
|
||||
"roles": [],
|
||||
"sequence_id": 27.0,
|
||||
"sequence_id": 2.0,
|
||||
"shortcuts": [
|
||||
{
|
||||
"color": "Grey",
|
||||
|
|
|
|||
|
|
@ -20,15 +20,11 @@ frappe.ui.form.on("Workspace", {
|
|||
.attr("target", "_blank");
|
||||
|
||||
frm.layout.message.empty();
|
||||
let message = __(
|
||||
"This document allows you to edit limited fields. For all kinds of workspace customization, use the Edit button located on the workspace page"
|
||||
);
|
||||
let message = __("Please click Edit on the Workspace for best results");
|
||||
|
||||
if (
|
||||
frm.doc.for_user ||
|
||||
(frm.doc.public &&
|
||||
!frm.has_perm("write") &&
|
||||
!frappe.user.has_role("Workspace Manager"))
|
||||
frm.doc.for_user !== frappe.session.user ||
|
||||
(frm.doc.public && !frappe.user.has_role("Workspace Manager"))
|
||||
) {
|
||||
frm.trigger("disable_form");
|
||||
|
||||
|
|
|
|||
|
|
@ -77,8 +77,7 @@
|
|||
"in_list_view": 1,
|
||||
"in_standard_filter": 1,
|
||||
"label": "Module",
|
||||
"options": "Module Def",
|
||||
"read_only": 1
|
||||
"options": "Module Def"
|
||||
},
|
||||
{
|
||||
"fieldname": "column_break_3",
|
||||
|
|
@ -101,8 +100,7 @@
|
|||
{
|
||||
"fieldname": "for_user",
|
||||
"fieldtype": "Data",
|
||||
"label": "For User",
|
||||
"read_only": 1
|
||||
"label": "For User"
|
||||
},
|
||||
{
|
||||
"default": "0",
|
||||
|
|
@ -114,8 +112,7 @@
|
|||
{
|
||||
"fieldname": "icon",
|
||||
"fieldtype": "Icon",
|
||||
"label": "Icon",
|
||||
"read_only": 1
|
||||
"label": "Icon"
|
||||
},
|
||||
{
|
||||
"fieldname": "links",
|
||||
|
|
@ -137,7 +134,6 @@
|
|||
"fieldname": "title",
|
||||
"fieldtype": "Data",
|
||||
"label": "Title",
|
||||
"read_only": 1,
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
|
|
@ -156,8 +152,7 @@
|
|||
{
|
||||
"fieldname": "sequence_id",
|
||||
"fieldtype": "Float",
|
||||
"label": "Sequence Id",
|
||||
"read_only": 1
|
||||
"label": "Sequence Id"
|
||||
},
|
||||
{
|
||||
"fieldname": "roles",
|
||||
|
|
@ -219,7 +214,7 @@
|
|||
],
|
||||
"in_create": 1,
|
||||
"links": [],
|
||||
"modified": "2024-05-30 17:30:36.791171",
|
||||
"modified": "2024-08-26 17:16:05.820503",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Desk",
|
||||
"name": "Workspace",
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ from json import loads
|
|||
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.desk.desktop import save_new_widget
|
||||
from frappe.desk.desktop import get_workspace_sidebar_items, save_new_widget
|
||||
from frappe.desk.utils import validate_route_conflict
|
||||
from frappe.model.document import Document
|
||||
from frappe.model.rename_doc import rename_doc
|
||||
|
|
@ -261,7 +261,7 @@ def new_page(new_page):
|
|||
|
||||
doc = frappe.new_doc("Workspace")
|
||||
doc.title = page.get("title")
|
||||
doc.icon = page.get("icon")
|
||||
doc.icon = page.get("icon") or "dashboard"
|
||||
doc.indicator_color = page.get("indicator_color")
|
||||
doc.content = page.get("content")
|
||||
doc.parent_page = page.get("parent_page")
|
||||
|
|
@ -271,7 +271,7 @@ def new_page(new_page):
|
|||
doc.sequence_id = last_sequence_id(doc) + 1
|
||||
doc.save(ignore_permissions=True)
|
||||
|
||||
return doc
|
||||
return get_workspace_sidebar_items()
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
|
|
@ -341,65 +341,6 @@ def update_page(name, title, icon, indicator_color, parent, public):
|
|||
return {"name": title, "public": public, "label": new_name}
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def duplicate_page(page_name, new_page):
|
||||
if not loads(new_page):
|
||||
return
|
||||
|
||||
new_page = loads(new_page)
|
||||
|
||||
if new_page.get("is_public") and not is_workspace_manager():
|
||||
return
|
||||
|
||||
old_doc = frappe.get_doc("Workspace", page_name)
|
||||
doc = frappe.copy_doc(old_doc)
|
||||
doc.title = new_page.get("title")
|
||||
doc.icon = new_page.get("icon")
|
||||
doc.indicator_color = new_page.get("indicator_color")
|
||||
doc.parent_page = new_page.get("parent") or ""
|
||||
doc.public = new_page.get("is_public")
|
||||
doc.for_user = ""
|
||||
doc.label = doc.title
|
||||
doc.module = ""
|
||||
if not doc.public:
|
||||
doc.for_user = doc.for_user or frappe.session.user
|
||||
doc.label = f"{doc.title}-{doc.for_user}"
|
||||
doc.name = doc.label
|
||||
if old_doc.public == doc.public:
|
||||
doc.sequence_id += 0.1
|
||||
else:
|
||||
doc.sequence_id = last_sequence_id(doc) + 1
|
||||
doc.insert(ignore_permissions=True)
|
||||
|
||||
return doc
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def delete_page(page):
|
||||
if not loads(page):
|
||||
return
|
||||
|
||||
page = loads(page)
|
||||
|
||||
if page.get("public") and not is_workspace_manager():
|
||||
frappe.throw(
|
||||
_("Cannot delete public workspace without Workspace Manager role"),
|
||||
frappe.PermissionError,
|
||||
)
|
||||
elif not page.get("public") and not is_workspace_manager():
|
||||
workspace_owner = frappe.get_value("Workspace", page.get("name"), "for_user")
|
||||
if workspace_owner != frappe.session.user:
|
||||
frappe.throw(
|
||||
_("Cannot delete private workspace of other users"),
|
||||
frappe.PermissionError,
|
||||
)
|
||||
|
||||
if frappe.db.exists("Workspace", page.get("name")):
|
||||
frappe.get_doc("Workspace", page.get("name")).delete(ignore_permissions=True)
|
||||
|
||||
return {"name": page.get("name"), "public": page.get("public"), "title": page.get("title")}
|
||||
|
||||
|
||||
def last_sequence_id(doc):
|
||||
doc_exists = frappe.db.exists({"doctype": "Workspace", "public": doc.public, "for_user": doc.for_user})
|
||||
|
||||
|
|
|
|||
|
|
@ -199,7 +199,9 @@ frappe.ui.form.Sidebar = class {
|
|||
return $("<a>")
|
||||
.html(label)
|
||||
.appendTo(
|
||||
$('<li class="user-action-row">').appendTo(this.user_actions.removeClass("hidden"))
|
||||
$('<div class="user-action-row"></div>').appendTo(
|
||||
this.user_actions.removeClass("hidden")
|
||||
)
|
||||
)
|
||||
.on("click", click);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<div class="comment-box"></div>
|
||||
<div class="timeline"></div>
|
||||
</div>
|
||||
<button class="scroll-to-top btn btn-default icon-btn" onclick="frappe.utils.scroll_to(0)">
|
||||
<button class="scroll-to-top btn btn-default icon-btn" onclick="frappe.utils.scroll_page_to_top()">
|
||||
<svg class="icon icon-xs"><use href="#icon-up-line"></use></svg>
|
||||
</button>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -19,11 +19,11 @@
|
|||
</div>
|
||||
</div>
|
||||
{% if frm.meta.beta %}
|
||||
<div class="sidebar-menu">
|
||||
<div class="sidebar-section">
|
||||
<p><label class="indicator-pill yellow" title="{{ __("This feature is brand new and still experimental") }}">{{ __("Experimental") }}</label></p>
|
||||
<p><a class="small text-muted" href="https://github.com/frappe/{{ frappe.boot.module_app[frappe.scrub(frm.meta.module)] }}/issues/new"
|
||||
<div><a class="small text-muted" href="https://github.com/frappe/{{ frappe.boot.module_app[frappe.scrub(frm.meta.module)] }}/issues/new"
|
||||
target="_blank">
|
||||
{{ __("Click here to post bugs and suggestions") }}</a></p>
|
||||
{{ __("Report bug") }}</a></div>
|
||||
|
||||
</div>
|
||||
{% endif %}
|
||||
|
|
|
|||
|
|
@ -435,6 +435,20 @@ frappe.views.BaseList = class BaseList {
|
|||
});
|
||||
}
|
||||
|
||||
set_result_height() {
|
||||
// place it at the footer of the page
|
||||
this.$result.css({
|
||||
height:
|
||||
window.innerHeight -
|
||||
this.$result.get(0).offsetTop -
|
||||
this.$paging_area.get(0).offsetHeight +
|
||||
"px",
|
||||
});
|
||||
this.$no_result.css({
|
||||
height: window.innerHeight - this.$no_result.get(0).offsetTop + "px",
|
||||
});
|
||||
}
|
||||
|
||||
get_fields() {
|
||||
// convert [fieldname, Doctype] => tabDoctype.fieldname
|
||||
return this.fields.map((f) => frappe.model.get_full_column_name(f[0], f[1]));
|
||||
|
|
@ -516,6 +530,7 @@ frappe.views.BaseList = class BaseList {
|
|||
this.before_render();
|
||||
this.render();
|
||||
this.after_render();
|
||||
this.set_result_height();
|
||||
this.freeze(false);
|
||||
this.reset_defaults();
|
||||
if (this.settings.refresh) {
|
||||
|
|
@ -581,8 +596,10 @@ frappe.views.BaseList = class BaseList {
|
|||
this.$paging_area.toggle(this.data.length > 0);
|
||||
this.$no_result.toggle(this.data.length == 0);
|
||||
|
||||
const show_more = this.start + this.page_length <= this.data.length;
|
||||
this.$paging_area.find(".btn-more").toggle(show_more);
|
||||
if (this.data.length) {
|
||||
const show_more = this.start + this.page_length <= this.data.length;
|
||||
this.$paging_area.find(".btn-more").toggle(show_more);
|
||||
}
|
||||
}
|
||||
|
||||
call_for_selected_items(method, args = {}) {
|
||||
|
|
|
|||
|
|
@ -298,16 +298,8 @@ frappe.views.ListSidebar = class ListSidebar {
|
|||
const cta = "Frappe Insights";
|
||||
|
||||
this.insights_banner = $(`
|
||||
<div style="position: relative;">
|
||||
<div class="pr-3">
|
||||
${message} <a href="${link}" target="_blank" style="color: var(--text-color)">${cta} → </a>
|
||||
</div>
|
||||
<div style="position: absolute; top: -1px; right: -4px; cursor: pointer;" title="Dismiss"
|
||||
onclick="localStorage.setItem('show_insights_banner', 'false') || this.parentElement.remove()">
|
||||
<svg class="icon icon-sm" style="">
|
||||
<use class="" href="#icon-close"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="sidebar-section">
|
||||
${message} <a href="${link}" target="_blank" style="color: var(--text-color)">${cta} → </a>
|
||||
</div>
|
||||
`).appendTo(this.sidebar);
|
||||
} catch (error) {
|
||||
|
|
|
|||
|
|
@ -106,8 +106,6 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
|
|||
});
|
||||
}
|
||||
|
||||
if (this.view_name == "List") this.toggle_paging = true;
|
||||
|
||||
this.patch_refresh_and_load_lib();
|
||||
return this.get_list_view_settings();
|
||||
}
|
||||
|
|
@ -589,17 +587,11 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
|
|||
sort_by: this.sort_selector && this.sort_selector.sort_by,
|
||||
sort_order: this.sort_selector && this.sort_selector.sort_order,
|
||||
});
|
||||
this.toggle_paging && this.$paging_area.toggle(false);
|
||||
}
|
||||
|
||||
after_render() {
|
||||
this.$no_result.html(`
|
||||
<div class="no-result text-muted flex justify-center align-center">
|
||||
${this.get_no_result_message()}
|
||||
</div>
|
||||
`);
|
||||
this.$no_result.html(this.get_no_result_message());
|
||||
this.setup_new_doc_event();
|
||||
this.toggle_paging && this.$paging_area.toggle(true);
|
||||
}
|
||||
|
||||
render() {
|
||||
|
|
@ -610,6 +602,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
|
|||
render_list() {
|
||||
// clear rows
|
||||
this.$result.find(".list-row-container").remove();
|
||||
this.render_header();
|
||||
|
||||
if (this.data.length > 0) {
|
||||
// append rows
|
||||
|
|
|
|||
|
|
@ -169,12 +169,6 @@ frappe.router = {
|
|||
} 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]) {
|
||||
frappe.workspaces[private_workspace] = new_workspace;
|
||||
}
|
||||
}
|
||||
if (!frappe.workspaces[private_workspace]) {
|
||||
frappe.msgprint(__("Workspace <b>{0}</b> does not exist", [route[1]]));
|
||||
return ["Workspaces"];
|
||||
|
|
|
|||
|
|
@ -36,13 +36,20 @@ frappe.ui.Sidebar = class Sidebar {
|
|||
this.wrapper = $(`
|
||||
<div class="body-sidebar-container">
|
||||
<div class="body-sidebar-placeholder"></div>
|
||||
<div class="body-sidebar hidden-xs hidden-sm">
|
||||
<div class="body-sidebar">
|
||||
<a href="/app">
|
||||
<img
|
||||
class="app-logo"
|
||||
src="${frappe.boot.app_logo_url}"
|
||||
alt="${__("App Logo")}"
|
||||
>
|
||||
<div class="standard-sidebar-item">
|
||||
<div class="sidebar-item-icon">
|
||||
<img
|
||||
class="app-logo"
|
||||
src="${frappe.boot.app_logo_url}"
|
||||
alt="${__("App Logo")}"
|
||||
>
|
||||
</div>
|
||||
<div class="sidebar-item-label" style="margin-left: 5px; margin-top: 1px">
|
||||
${__(frappe.boot.sysdefaults.app_name)}
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
<div class="sidebar-items">
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -299,6 +299,9 @@ Object.assign(frappe.utils, {
|
|||
);
|
||||
return content.html();
|
||||
},
|
||||
scroll_page_to_top() {
|
||||
$(".main-section").scrollTop(0);
|
||||
},
|
||||
scroll_to: function (
|
||||
element,
|
||||
animate = true,
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView {
|
|||
);
|
||||
this.$paging_area
|
||||
.find(".level-left")
|
||||
.after(`<span class="comparison-message text-muted">${message}</span>`);
|
||||
.after(`<span class="comparison-message text-extra-muted">${message}</span>`);
|
||||
}
|
||||
|
||||
setup_sort_selector() {
|
||||
|
|
|
|||
|
|
@ -24,8 +24,6 @@ frappe.views.Workspace = class Workspace {
|
|||
this.blocks = frappe.workspace_block.blocks;
|
||||
this.is_read_only = true;
|
||||
this.pages = {};
|
||||
this.sorted_public_items = [];
|
||||
this.sorted_private_items = [];
|
||||
this.current_page = {};
|
||||
this.sidebar_items = {
|
||||
public: {},
|
||||
|
|
@ -89,8 +87,6 @@ frappe.views.Workspace = class Workspace {
|
|||
this.is_read_only = false;
|
||||
await this.editor.readOnly.toggle();
|
||||
this.editor.isReady.then(() => {
|
||||
this.body.addClass("edit-mode");
|
||||
this.initialize_editorjs_undo();
|
||||
this.setup_customization_buttons(this._page);
|
||||
this.make_blocks_sortable();
|
||||
});
|
||||
|
|
@ -117,40 +113,9 @@ frappe.views.Workspace = class Workspace {
|
|||
}
|
||||
|
||||
this.page.set_title(__(page.name));
|
||||
this.update_selected_sidebar(this.current_page, false); //remove selected from old page
|
||||
this.update_selected_sidebar(page, true); //add selected on new page
|
||||
this.show_page(page);
|
||||
}
|
||||
|
||||
update_selected_sidebar(page, add) {
|
||||
let section = page.public ? "public" : "private";
|
||||
if (
|
||||
this.sidebar &&
|
||||
this.sidebar_items[section] &&
|
||||
this.sidebar_items[section][page.name]
|
||||
) {
|
||||
let $sidebar = this.sidebar_items[section][page.name];
|
||||
let sidebar_page = this.sidebar.all_pages.find((p) => p.title == page.name);
|
||||
|
||||
if (add) {
|
||||
$sidebar[0].firstElementChild.classList.add("selected");
|
||||
if (sidebar_page) sidebar_page.selected = true;
|
||||
|
||||
// open child sidebar section if closed
|
||||
$sidebar.parent().hasClass("sidebar-child-item") &&
|
||||
$sidebar.parent().hasClass("hidden") &&
|
||||
$sidebar.parent().removeClass("hidden");
|
||||
|
||||
this.current_page = { name: page.name, public: page.public };
|
||||
localStorage.current_page = page.name;
|
||||
localStorage.is_current_page_public = page.public;
|
||||
} else {
|
||||
$sidebar[0].firstElementChild.classList.remove("selected");
|
||||
if (sidebar_page) sidebar_page.selected = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
get_data(page) {
|
||||
return frappe
|
||||
.call("frappe.desk.desktop.get_desktop_page", {
|
||||
|
|
@ -314,6 +279,8 @@ frappe.views.Workspace = class Workspace {
|
|||
}
|
||||
|
||||
setup_customization_buttons(page) {
|
||||
this.body.addClass("edit-mode");
|
||||
this.initialize_editorjs_undo();
|
||||
this.clear_page_actions();
|
||||
|
||||
page.is_editable &&
|
||||
|
|
@ -445,141 +412,6 @@ frappe.views.Workspace = class Workspace {
|
|||
d.show();
|
||||
}
|
||||
|
||||
delete_page(page) {
|
||||
frappe.confirm(
|
||||
__("Are you sure you want to delete page {0}?", [page.title.bold()]),
|
||||
() => {
|
||||
frappe.call({
|
||||
method: "frappe.desk.doctype.workspace.workspace.delete_page",
|
||||
args: { page: page },
|
||||
callback: function (res) {
|
||||
if (res.message) {
|
||||
let page = res.message;
|
||||
let message = __("Workspace {0} Deleted Successfully", [
|
||||
page.title.bold(),
|
||||
]);
|
||||
frappe.show_alert({ message: message, indicator: "green" });
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
this.page.clear_primary_action();
|
||||
this.update_cached_values(page);
|
||||
|
||||
if (
|
||||
this.current_page.name == page.title &&
|
||||
this.current_page.public == page.public
|
||||
) {
|
||||
frappe.set_route("/");
|
||||
}
|
||||
|
||||
this.make_sidebar();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
duplicate_page(page) {
|
||||
var me = this;
|
||||
let new_page = { ...page };
|
||||
if (!this.has_access && new_page.public) {
|
||||
new_page.public = 0;
|
||||
}
|
||||
let parent_pages = this.get_parent_pages({ public: new_page.public });
|
||||
const d = new frappe.ui.Dialog({
|
||||
title: __("Create Duplicate"),
|
||||
fields: [
|
||||
{
|
||||
label: __("Title"),
|
||||
fieldtype: "Data",
|
||||
fieldname: "title",
|
||||
reqd: 1,
|
||||
},
|
||||
{
|
||||
label: __("Parent"),
|
||||
fieldtype: "Select",
|
||||
fieldname: "parent",
|
||||
options: parent_pages,
|
||||
default: new_page.parent_page,
|
||||
},
|
||||
{
|
||||
label: __("Public"),
|
||||
fieldtype: "Check",
|
||||
fieldname: "is_public",
|
||||
depends_on: `eval:${this.has_access}`,
|
||||
default: new_page.public,
|
||||
onchange: function () {
|
||||
d.set_df_property(
|
||||
"parent",
|
||||
"options",
|
||||
this.get_value() ? me.public_parent_pages : me.private_parent_pages
|
||||
);
|
||||
d.set_df_property("icon", "hidden", this.get_value() ? 0 : 1);
|
||||
d.set_df_property("indicator_color", "hidden", this.get_value() ? 1 : 0);
|
||||
},
|
||||
},
|
||||
{
|
||||
fieldtype: "Column Break",
|
||||
},
|
||||
{
|
||||
label: __("Icon"),
|
||||
fieldtype: "Icon",
|
||||
fieldname: "icon",
|
||||
default: new_page.public && new_page.icon,
|
||||
hidden: !new_page.public,
|
||||
},
|
||||
{
|
||||
label: __("Indicator color"),
|
||||
fieldtype: "Select",
|
||||
fieldname: "indicator_color",
|
||||
options: this.indicator_colors,
|
||||
hidden: new_page.public,
|
||||
default: !new_page.public && new_page.indicator_color,
|
||||
},
|
||||
],
|
||||
primary_action_label: __("Duplicate"),
|
||||
primary_action: (values) => {
|
||||
d.hide();
|
||||
frappe.call({
|
||||
method: "frappe.desk.doctype.workspace.workspace.duplicate_page",
|
||||
args: {
|
||||
page_name: page.name,
|
||||
new_page: values,
|
||||
},
|
||||
callback: function (res) {
|
||||
if (res.message) {
|
||||
let new_page = res.message;
|
||||
let message = __(
|
||||
"Duplicate of {0} named as {1} is created successfully",
|
||||
[page.title.bold(), new_page.title.bold()]
|
||||
);
|
||||
frappe.show_alert({ message: message, indicator: "green" });
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
new_page.title = values.title;
|
||||
new_page.public = values.is_public || 0;
|
||||
new_page.name = values.title + (new_page.public ? "" : "-" + frappe.session.user);
|
||||
new_page.label = new_page.name;
|
||||
new_page.icon = values.icon;
|
||||
new_page.indicator_color = values.indicator_color;
|
||||
new_page.parent_page = values.parent || "";
|
||||
new_page.for_user = new_page.public ? "" : frappe.session.user;
|
||||
new_page.is_editable = !new_page.public;
|
||||
new_page.selected = true;
|
||||
|
||||
this.update_cached_values(page, new_page, true);
|
||||
|
||||
let pre_url = values.is_public ? "" : "private/";
|
||||
let route = pre_url + frappe.router.slug(values.title);
|
||||
frappe.set_route(route);
|
||||
|
||||
me.sidebar.make_sidebar();
|
||||
},
|
||||
});
|
||||
d.show();
|
||||
}
|
||||
|
||||
make_blocks_sortable() {
|
||||
let me = this;
|
||||
this.page_sortable = Sortable.create(
|
||||
|
|
@ -650,7 +482,6 @@ frappe.views.Workspace = class Workspace {
|
|||
primary_action: (values) => {
|
||||
values.title = strip_html(values.title);
|
||||
d.hide();
|
||||
this.initialize_editorjs_undo();
|
||||
this.setup_customization_buttons({ is_editable: true });
|
||||
|
||||
let name = values.title + (values.is_public ? "" : "-" + frappe.session.user);
|
||||
|
|
@ -690,27 +521,25 @@ frappe.views.Workspace = class Workspace {
|
|||
args: {
|
||||
new_page: new_page,
|
||||
},
|
||||
callback: function (res) {
|
||||
if (res.message) {
|
||||
let message = __("Workspace {0} Created Successfully", [
|
||||
callback: (r) => {
|
||||
if (r.message) {
|
||||
let message = __("Workspace {0} created", [
|
||||
new_page.title.bold(),
|
||||
]);
|
||||
frappe.show_alert({
|
||||
message: message,
|
||||
indicator: "green",
|
||||
});
|
||||
|
||||
frappe.boot.sidebar_pages = r.message;
|
||||
this.sidebar.setup_pages();
|
||||
|
||||
let pre_url = new_page.public ? "" : "private/";
|
||||
let route = pre_url + frappe.router.slug(new_page.title);
|
||||
frappe.set_route(route);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
this.update_cached_values(new_page, new_page, true, true);
|
||||
|
||||
let pre_url = new_page.public ? "" : "private/";
|
||||
let route = pre_url + frappe.router.slug(new_page.title);
|
||||
frappe.set_route(route);
|
||||
|
||||
this.sidebar.make_sidebar();
|
||||
localStorage.setItem("new_workspace", JSON.stringify(new_page));
|
||||
});
|
||||
},
|
||||
});
|
||||
|
|
@ -820,9 +649,8 @@ frappe.views.Workspace = class Workspace {
|
|||
page.content == JSON.stringify(blocks) &&
|
||||
Object.keys(new_widgets).length === 0
|
||||
) {
|
||||
this.setup_customization_buttons(page);
|
||||
frappe.show_alert({
|
||||
message: __("No changes made on the page"),
|
||||
message: __("No changes made"),
|
||||
indicator: "warning",
|
||||
});
|
||||
return false;
|
||||
|
|
@ -841,10 +669,9 @@ frappe.views.Workspace = class Workspace {
|
|||
callback: function (res) {
|
||||
if (res.message) {
|
||||
me.discard = true;
|
||||
me.update_cached_values(page, page);
|
||||
me.reload();
|
||||
frappe.show_alert({
|
||||
message: __("Page Saved Successfully"),
|
||||
message: __("Saved"),
|
||||
indicator: "green",
|
||||
});
|
||||
}
|
||||
|
|
@ -858,15 +685,13 @@ frappe.views.Workspace = class Workspace {
|
|||
});
|
||||
}
|
||||
|
||||
async reload() {
|
||||
this.sorted_public_items = [];
|
||||
this.sorted_private_items = [];
|
||||
|
||||
this.get_pages().then((r) => {
|
||||
reload() {
|
||||
delete this.pages[this._page.name];
|
||||
return this.get_pages().then((r) => {
|
||||
frappe.boot.sidebar_pages = r;
|
||||
this.sidebar.setup_pages();
|
||||
this.show();
|
||||
this.undo.readOnly = true;
|
||||
if (this.undo) this.undo.readOnly = true;
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ $disabled-input-height: 22px;
|
|||
--brand-color: var(--primary);
|
||||
|
||||
--padding-xs: 5px;
|
||||
--padding-sm: 6px;
|
||||
--padding-sm: 7px;
|
||||
--padding-md: 15px;
|
||||
--padding-lg: 20px;
|
||||
--padding-xl: 30px;
|
||||
|
|
|
|||
|
|
@ -144,6 +144,7 @@
|
|||
|
||||
input {
|
||||
margin-right: 0 !important;
|
||||
margin-bottom: -3px;
|
||||
}
|
||||
|
||||
&.search {
|
||||
|
|
@ -292,7 +293,8 @@
|
|||
}
|
||||
|
||||
.grid-static-col[data-fieldtype="Check"] .static-area {
|
||||
padding-top: 2px;
|
||||
padding-top: 4px;
|
||||
margin-bottom: -4px;
|
||||
}
|
||||
|
||||
.grid-static-col[data-fieldtype="Rating"] .field-area {
|
||||
|
|
@ -362,7 +364,7 @@
|
|||
}
|
||||
|
||||
.frappe-control {
|
||||
margin-bottom: 0px;
|
||||
margin-bottom: 0px !important;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@
|
|||
.horizontal {
|
||||
.selected-icon {
|
||||
top: 4px !important;
|
||||
left: calc(50% + 5px) !important;
|
||||
left: calc(38% + 5px) !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -266,7 +266,7 @@ body.modal-open[style^="padding-right"] {
|
|||
flex: 1;
|
||||
|
||||
.control-input-wrapper {
|
||||
width: 53%;
|
||||
width: 53%.6;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -623,8 +623,6 @@ body {
|
|||
}
|
||||
|
||||
@include media-breakpoint-down(md) {
|
||||
padding: 1px 8px;
|
||||
|
||||
.link-item {
|
||||
&:first-child {
|
||||
margin-top: 5px;
|
||||
|
|
@ -931,7 +929,6 @@ body {
|
|||
|
||||
.layout-main-section {
|
||||
border: 0px;
|
||||
padding: var(--padding-sm) var(--padding-md);
|
||||
|
||||
&.edit-mode {
|
||||
background-color: var(--subtle-fg) !important;
|
||||
|
|
@ -960,7 +957,7 @@ body {
|
|||
.layout-main-section {
|
||||
background-color: var(--fg-color);
|
||||
box-shadow: none;
|
||||
padding: var(--padding-sm);
|
||||
padding: var(--padding-sm) var(--padding-md);
|
||||
}
|
||||
|
||||
.workspace-footer {
|
||||
|
|
@ -992,8 +989,8 @@ body {
|
|||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
flex-direction: row;
|
||||
margin: 0px -7px;
|
||||
padding-bottom: 20px !important;
|
||||
margin: 0 -4px;
|
||||
|
||||
.ce-block {
|
||||
width: 100%;
|
||||
|
|
@ -1097,10 +1094,6 @@ body {
|
|||
height: 100%;
|
||||
padding: 7px;
|
||||
|
||||
@include media-breakpoint-down(md) {
|
||||
padding: 7px 3px;
|
||||
}
|
||||
|
||||
& > div {
|
||||
height: 100%;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -455,7 +455,7 @@
|
|||
.form-footer {
|
||||
max-width: var(--page-max-width);
|
||||
margin: auto;
|
||||
padding-left: 15px;
|
||||
padding: 0 15px;
|
||||
|
||||
h5 {
|
||||
margin: 15px 0px;
|
||||
|
|
@ -465,7 +465,8 @@
|
|||
.scroll-to-top {
|
||||
position: absolute;
|
||||
height: 28px;
|
||||
right: 0;
|
||||
right: 15px;
|
||||
bottom: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -235,7 +235,7 @@ $level-margin-right: 8px;
|
|||
.layout-main-list {
|
||||
.list-paging-area,
|
||||
.footnote-area {
|
||||
padding: var(--padding-md);
|
||||
padding: var(--padding-sm) var(--padding-md);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -176,7 +176,7 @@ body {
|
|||
}
|
||||
|
||||
.layout-side-section {
|
||||
display: none;
|
||||
max-width: 0px;
|
||||
}
|
||||
|
||||
// listviews
|
||||
|
|
|
|||
|
|
@ -4,8 +4,16 @@
|
|||
border-bottom: 1px solid var(--border-color);
|
||||
padding: 0;
|
||||
.navbar-brand {
|
||||
margin-right: 0;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
@include media-breakpoint-up(md) {
|
||||
.navbar-brand {
|
||||
// not shown for full screen
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-nav {
|
||||
.dropdown-item {
|
||||
padding: 6px 8px !important;
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
display: inline-flex;
|
||||
align-items: center;
|
||||
.title-text {
|
||||
@include get_textstyle("2xl", "bold");
|
||||
@include get_textstyle("2xl", "semibold");
|
||||
cursor: pointer;
|
||||
margin-bottom: 0px;
|
||||
margin-right: var(--margin-sm);
|
||||
|
|
@ -115,10 +115,6 @@
|
|||
height: var(--page-head-height);
|
||||
padding: 8px 0px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-weight: var(--weight-semibold);
|
||||
}
|
||||
}
|
||||
|
||||
.page-form {
|
||||
|
|
@ -188,7 +184,11 @@
|
|||
.result,
|
||||
.no-result,
|
||||
.freeze {
|
||||
min-height: #{"calc(100vh - 224px)"};
|
||||
min-height: "200px";
|
||||
}
|
||||
|
||||
.result {
|
||||
overflow: scroll;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -33,6 +33,15 @@ body[data-route^="Module"] .main-menu {
|
|||
@extend .hide-form-sidebar;
|
||||
}
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: nowrap;
|
||||
align-items: flex-start;
|
||||
justify-content: flex-start;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.main-section {
|
||||
width: 100%;
|
||||
height: 100vh;
|
||||
|
|
@ -40,18 +49,6 @@ body[data-route^="Module"] .main-menu {
|
|||
overflow-x: hidden;
|
||||
overflow-y: visible;
|
||||
}
|
||||
|
||||
@include media-breakpoint-up(md) {
|
||||
body {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: nowrap;
|
||||
align-items: flex-start;
|
||||
justify-content: flex-start;
|
||||
position: relative;
|
||||
}
|
||||
}
|
||||
|
||||
.body-sidebar-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
|
@ -125,7 +122,7 @@ body[data-route^="Module"] .main-menu {
|
|||
}
|
||||
|
||||
&:first-child {
|
||||
margin-top: var(--margin-xl);
|
||||
margin-top: 24px;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -191,32 +188,6 @@ body[data-route^="Module"] .main-menu {
|
|||
}
|
||||
}
|
||||
|
||||
.sidebar-menu {
|
||||
.data-pill {
|
||||
width: 100%;
|
||||
justify-content: unset;
|
||||
.es-icon {
|
||||
margin: 0px 6px;
|
||||
}
|
||||
}
|
||||
&.user-actions {
|
||||
margin-bottom: 15px;
|
||||
a {
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
|
||||
h6,
|
||||
.h6 {
|
||||
margin-top: 0px;
|
||||
margin-bottom: 7px;
|
||||
}
|
||||
|
||||
> li {
|
||||
position: relative;
|
||||
}
|
||||
}
|
||||
|
||||
// form sidebar
|
||||
.form-sidebar {
|
||||
.sidebar-section {
|
||||
|
|
@ -401,13 +372,12 @@ body[data-route^="Module"] .main-menu {
|
|||
top: 0;
|
||||
left: 0;
|
||||
transform: translateX(-110%);
|
||||
z-index: 1100;
|
||||
z-index: 1300;
|
||||
box-shadow: var(--shadow-base);
|
||||
height: 100%;
|
||||
width: 40%;
|
||||
display: block !important;
|
||||
transition: transform 200ms ease-in-out;
|
||||
padding: var(--padding-md);
|
||||
|
||||
&.opened {
|
||||
transform: translateX(0);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue