From eddd5b00b62850531b76a2954ab5ac2026516141 Mon Sep 17 00:00:00 2001 From: sokumon Date: Mon, 15 Dec 2025 18:30:44 +0530 Subject: [PATCH 01/12] feat: init form sidebar redesign --- frappe/core/doctype/docfield/docfield.json | 9 ++- frappe/public/js/frappe/form/layout.js | 3 +- .../js/frappe/form/sidebar/form_sidebar.js | 17 ++++- frappe/public/js/frappe/form/tab.js | 6 ++ .../frappe/form/templates/form_sidebar.html | 46 +++++++++-- frappe/public/js/frappe/form/toolbar.js | 2 +- frappe/public/scss/desk/form.scss | 14 +++- frappe/public/scss/desk/form_sidebar.scss | 76 ++++++++++++++++--- frappe/public/scss/desk/page.scss | 7 ++ 9 files changed, 159 insertions(+), 21 deletions(-) diff --git a/frappe/core/doctype/docfield/docfield.json b/frappe/core/doctype/docfield/docfield.json index 7ef59cc20b..2b190095ee 100644 --- a/frappe/core/doctype/docfield/docfield.json +++ b/frappe/core/doctype/docfield/docfield.json @@ -76,6 +76,7 @@ "width", "max_height", "columns", + "icon", "column_break_22", "description", "documentation_url", @@ -626,6 +627,12 @@ "fieldtype": "Select", "label": "Button Color", "options": "\nDefault\nPrimary\nInfo\nSuccess\nWarning\nDanger" + }, + { + "depends_on": "eval: doc.type == \"Tab Break\"", + "fieldname": "icon", + "fieldtype": "Icon", + "label": "Icon" } ], "grid_page_length": 50, @@ -633,7 +640,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2025-12-01 06:56:29.335491", + "modified": "2025-12-15 11:28:13.492477", "modified_by": "Administrator", "module": "Core", "name": "DocField", diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js index 9657e4bbc3..aad7c8c45a 100644 --- a/frappe/public/js/frappe/form/layout.js +++ b/frappe/public/js/frappe/form/layout.js @@ -150,6 +150,7 @@ frappe.ui.form.Layout = class Layout { if (this.is_tabbed_layout()) { // add a tab without `fieldname` to avoid conflicts + this.add_default_tabs(fields); let default_tab = { label: __("Details"), fieldtype: "Tab Break", @@ -201,7 +202,7 @@ frappe.ui.form.Layout = class Layout { (this.fields[0] && this.fields[0].fieldtype != "Section Break") || !this.fields.length ); } - + add_default_tabs() {} no_opening_tab() { return (this.fields[1] && this.fields[1].fieldtype != "Tab Break") || !this.fields.length; } diff --git a/frappe/public/js/frappe/form/sidebar/form_sidebar.js b/frappe/public/js/frappe/form/sidebar/form_sidebar.js index 0f2c27ef3a..890aed1a47 100644 --- a/frappe/public/js/frappe/form/sidebar/form_sidebar.js +++ b/frappe/public/js/frappe/form/sidebar/form_sidebar.js @@ -34,10 +34,25 @@ frappe.ui.form.Sidebar = class { this.setup_keyboard_shortcuts(); this.show_auto_repeat_status(); frappe.ui.form.setup_user_image_event(this.frm); - + this.indicator = $(this.sidebar).find(".indicator-pill"); + this.set_form_indicator(); this.refresh(); } + set_form_indicator() { + let indicator = frappe.get_indicator(this.frm.doc); + if (indicator) { + this.set_indicator(indicator[0], indicator[1]); + } + } + set_indicator(label, color) { + this.clear_indicator().removeClass("hide").html(`${label}`).addClass(color); + } + + clear_indicator() { + return this.indicator.addClass("indicator-pill no-indicator-dot whitespace-nowrap hide"); + } + setup_keyboard_shortcuts() { // add assignment shortcut let assignment_link = this.sidebar.find(".add-assignment"); diff --git a/frappe/public/js/frappe/form/tab.js b/frappe/public/js/frappe/form/tab.js index f8bc2368ed..9c7422ca05 100644 --- a/frappe/public/js/frappe/form/tab.js +++ b/frappe/public/js/frappe/form/tab.js @@ -1,3 +1,8 @@ +const ICON_MAP = { + "More Info": "info", + Dashboard: "layout-dashboard", + Details: "notepad-text", +}; export default class Tab { constructor(layout, df, frm, tab_link_container, tabs_content) { this.layout = layout; @@ -29,6 +34,7 @@ export default class Tab { type="button" role="tab" aria-controls="${id}"> + ${frappe.utils.icon(this.df.icon || ICON_MAP[this.label] || "list")} ${__(this.label, null, this.doctype)} diff --git a/frappe/public/js/frappe/form/templates/form_sidebar.html b/frappe/public/js/frappe/form/templates/form_sidebar.html index c21a91a2fa..c2ab0fac1a 100644 --- a/frappe/public/js/frappe/form/templates/form_sidebar.html +++ b/frappe/public/js/frappe/form/templates/form_sidebar.html @@ -17,6 +17,36 @@ {% endif %} + + + {% if frm.meta.beta %}