fix(tests): workspace tests and more style fixes

This commit is contained in:
Rushabh Mehta 2024-08-26 18:15:59 +05:30
parent 72eb501de3
commit 77b11dd1ce
27 changed files with 123 additions and 520 deletions

View file

@ -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");
});
});

View file

@ -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",

View file

@ -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");

View file

@ -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",

View file

@ -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})

View file

@ -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);
}

View file

@ -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>

View file

@ -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 %}

View file

@ -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 = {}) {

View file

@ -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} &rarr; </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} &rarr; </a>
</div>
`).appendTo(this.sidebar);
} catch (error) {

View file

@ -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

View file

@ -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"];

View file

@ -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>

View file

@ -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,

View file

@ -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() {

View file

@ -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;
});
}

View file

@ -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;

View file

@ -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;
}

View file

@ -78,7 +78,7 @@
.horizontal {
.selected-icon {
top: 4px !important;
left: calc(50% + 5px) !important;
left: calc(38% + 5px) !important;
}
}

View file

@ -266,7 +266,7 @@ body.modal-open[style^="padding-right"] {
flex: 1;
.control-input-wrapper {
width: 53%;
width: 53%.6;
}
}

View file

@ -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%;
}

View file

@ -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;
}
}

View file

@ -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);
}
}

View file

@ -176,7 +176,7 @@ body {
}
.layout-side-section {
display: none;
max-width: 0px;
}
// listviews

View file

@ -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;

View file

@ -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;
}
}

View file

@ -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);