From 88d8b6ce6c419f03984a93a6eb54a87111938701 Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Mon, 18 Mar 2024 14:45:08 +0530 Subject: [PATCH 1/9] feat: announcement widget in navbar settings --- .../navbar_settings/navbar_settings.json | 47 ++++++++++--------- .../navbar_settings/navbar_settings.py | 1 + 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/frappe/core/doctype/navbar_settings/navbar_settings.json b/frappe/core/doctype/navbar_settings/navbar_settings.json index 8fc0c83c82..b8142066c9 100644 --- a/frappe/core/doctype/navbar_settings/navbar_settings.json +++ b/frappe/core/doctype/navbar_settings/navbar_settings.json @@ -11,63 +11,63 @@ "logo_width", "section_break_2", "settings_dropdown", - "help_dropdown" + "help_dropdown", + "announcements_section", + "announcement_widget" ], "fields": [ { "fieldname": "app_logo", "fieldtype": "Attach Image", - "label": "Application Logo", - "show_days": 1, - "show_seconds": 1 + "label": "Application Logo" }, { "fieldname": "settings_dropdown", "fieldtype": "Table", "label": "Settings Dropdown", - "options": "Navbar Item", - "show_days": 1, - "show_seconds": 1 + "options": "Navbar Item" }, { "fieldname": "help_dropdown", "fieldtype": "Table", "label": "Help Dropdown", - "options": "Navbar Item", - "show_days": 1, - "show_seconds": 1 + "options": "Navbar Item" }, { "fieldname": "section_break_2", "fieldtype": "Section Break", - "label": "Dropdowns", - "show_days": 1, - "show_seconds": 1 + "label": "Dropdowns" }, { "fieldname": "logo_section", "fieldtype": "Section Break", - "label": "Application Logo", - "show_days": 1, - "show_seconds": 1 + "label": "Application Logo" }, { "fieldname": "column_break_3", - "fieldtype": "Column Break", - "show_days": 1, - "show_seconds": 1 + "fieldtype": "Column Break" }, { "fieldname": "logo_width", "fieldtype": "Int", - "label": "Logo Width", - "show_days": 1, - "show_seconds": 1 + "label": "Logo Width" + }, + { + "fieldname": "announcements_section", + "fieldtype": "Section Break", + "label": "Announcements" + }, + { + "description": "These announcements will appear inside a dismissible alert below the Navbar.", + "fieldname": "announcement_widget", + "fieldtype": "Text Editor", + "label": "Announcement Widget", + "max_height": "10em" } ], "issingle": 1, "links": [], - "modified": "2020-08-06 18:11:29.955835", + "modified": "2024-03-18 13:54:44.498352", "modified_by": "Administrator", "module": "Core", "name": "Navbar Settings", @@ -87,5 +87,6 @@ "quick_entry": 1, "sort_field": "modified", "sort_order": "DESC", + "states": [], "track_changes": 1 } \ No newline at end of file diff --git a/frappe/core/doctype/navbar_settings/navbar_settings.py b/frappe/core/doctype/navbar_settings/navbar_settings.py index cbab42f4ed..54a0b64dc4 100644 --- a/frappe/core/doctype/navbar_settings/navbar_settings.py +++ b/frappe/core/doctype/navbar_settings/navbar_settings.py @@ -16,6 +16,7 @@ class NavbarSettings(Document): from frappe.core.doctype.navbar_item.navbar_item import NavbarItem from frappe.types import DF + announcement_widget: DF.TextEditor | None app_logo: DF.AttachImage | None help_dropdown: DF.Table[NavbarItem] logo_width: DF.Int From 1dbd4479acc08169a335e138e0e4693bf505d98a Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Mon, 18 Mar 2024 14:46:34 +0530 Subject: [PATCH 2/9] feat: setup widget in toolbar --- frappe/public/js/frappe/ui/toolbar/toolbar.js | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/frappe/public/js/frappe/ui/toolbar/toolbar.js b/frappe/public/js/frappe/ui/toolbar/toolbar.js index 8922cfe2b3..e7ea130fd6 100644 --- a/frappe/public/js/frappe/ui/toolbar/toolbar.js +++ b/frappe/public/js/frappe/ui/toolbar/toolbar.js @@ -6,6 +6,7 @@ frappe.provide("frappe.search"); frappe.ui.toolbar.Toolbar = class { constructor() { + frappe.ui.toolbar.reset_announcement_widget(); $("header").replaceWith( frappe.render_template("navbar", { avatar: frappe.avatar(frappe.session.user, "avatar-medium"), @@ -21,6 +22,7 @@ frappe.ui.toolbar.Toolbar = class { this.setup_notifications(); this.setup_help(); this.setup_read_only_mode(); + this.setup_announcement_widget(); this.make(); } @@ -56,6 +58,19 @@ frappe.ui.toolbar.Toolbar = class { }); } + setup_announcement_widget() { + if (frappe.boot.navbar_settings.announcement_widget) { + let announcement_widget = $(".announcement-widget"); + let close_message = announcement_widget.find(".close-message"); + close_message.on( + "click", + () => + localStorage.setItem("show_announcement_widget", false) || + announcement_widget.addClass("hidden") + ); + } + } + setup_help() { if (!frappe.boot.desk_settings.notifications) { // hide the help section @@ -230,6 +245,16 @@ frappe.ui.toolbar.clear_cache = frappe.utils.throttle(function () { }); }, 10000); +frappe.ui.toolbar.reset_announcement_widget = function () { + frappe.db.get_single_value("Navbar Settings", "announcement_widget").then((value) => { + if (value != frappe.boot.navbar_settings.announcement_widget) { + localStorage.setItem("show_announcement_widget", strip_html(value) != ""); + frappe.boot.navbar_settings.announcement_widget = value; + frappe.ui.toolbar.clear_cache(); + } + }); +}; + frappe.ui.toolbar.show_about = function () { try { frappe.ui.misc.about(); From 86f97922d1c1cf8ab85969e703e6b912b75445c4 Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Mon, 18 Mar 2024 14:47:58 +0530 Subject: [PATCH 3/9] feat: add html for widget below navbar --- .../public/js/frappe/ui/toolbar/navbar.html | 278 +++++++++--------- 1 file changed, 146 insertions(+), 132 deletions(-) diff --git a/frappe/public/js/frappe/ui/toolbar/navbar.html b/frappe/public/js/frappe/ui/toolbar/navbar.html index cdae4211d2..a8031f6189 100644 --- a/frappe/public/js/frappe/ui/toolbar/navbar.html +++ b/frappe/public/js/frappe/ui/toolbar/navbar.html @@ -1,139 +1,153 @@ - + + {% if localStorage.getItem('show_announcement_widget') == 'true' && navbar_settings.announcement_widget %} +
+
+ {{ navbar_settings.announcement_widget }} +
+ {{ frappe.utils.icon("close") }} +
- + {% endif %} + + \ No newline at end of file From 1a0fe4c48d09efe7dda28ee47bafe15872af3d9d Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Mon, 18 Mar 2024 14:53:48 +0530 Subject: [PATCH 4/9] fix: toolbar condition for setting up widget --- frappe/public/js/frappe/ui/toolbar/toolbar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/ui/toolbar/toolbar.js b/frappe/public/js/frappe/ui/toolbar/toolbar.js index e7ea130fd6..68452fee90 100644 --- a/frappe/public/js/frappe/ui/toolbar/toolbar.js +++ b/frappe/public/js/frappe/ui/toolbar/toolbar.js @@ -59,7 +59,7 @@ frappe.ui.toolbar.Toolbar = class { } setup_announcement_widget() { - if (frappe.boot.navbar_settings.announcement_widget) { + if (localStorage.getItem("show_announcement_widget")) { let announcement_widget = $(".announcement-widget"); let close_message = announcement_widget.find(".close-message"); close_message.on( From 351151b0ff684113236fec10bde9d56379ebc69b Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Mon, 18 Mar 2024 14:54:36 +0530 Subject: [PATCH 5/9] fix: reset announcements after saving settings --- frappe/core/doctype/navbar_settings/navbar_settings.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/navbar_settings/navbar_settings.js b/frappe/core/doctype/navbar_settings/navbar_settings.js index c0e1113087..acdcdf8ac7 100644 --- a/frappe/core/doctype/navbar_settings/navbar_settings.js +++ b/frappe/core/doctype/navbar_settings/navbar_settings.js @@ -2,6 +2,7 @@ // For license information, please see license.txt frappe.ui.form.on("Navbar Settings", { - // refresh: function(frm) { - // } + after_save: function (frm) { + frappe.ui.toolbar.reset_announcement_widget(); + }, }); From dc53010a2aeb1cdf8c8c3d8c9e83b2f72e5a8d76 Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Wed, 20 Mar 2024 15:53:49 +0530 Subject: [PATCH 6/9] fix: use localStorage for widget content --- frappe/public/js/frappe/ui/toolbar/navbar.html | 6 +++--- frappe/public/js/frappe/ui/toolbar/toolbar.js | 9 ++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/frappe/public/js/frappe/ui/toolbar/navbar.html b/frappe/public/js/frappe/ui/toolbar/navbar.html index a8031f6189..f17203c08b 100644 --- a/frappe/public/js/frappe/ui/toolbar/navbar.html +++ b/frappe/public/js/frappe/ui/toolbar/navbar.html @@ -139,10 +139,10 @@ - {% if localStorage.getItem('show_announcement_widget') == 'true' && navbar_settings.announcement_widget %} + {% if localStorage.getItem("show_announcement_widget") == 'true' && strip_html(localStorage.getItem("announcement_widget")) != '' %}
-
- {{ navbar_settings.announcement_widget }} +
+ {{ localStorage.getItem("announcement_widget") }}
{{ frappe.utils.icon("close") }}
diff --git a/frappe/public/js/frappe/ui/toolbar/toolbar.js b/frappe/public/js/frappe/ui/toolbar/toolbar.js index 68452fee90..62bcde0f43 100644 --- a/frappe/public/js/frappe/ui/toolbar/toolbar.js +++ b/frappe/public/js/frappe/ui/toolbar/toolbar.js @@ -59,7 +59,7 @@ frappe.ui.toolbar.Toolbar = class { } setup_announcement_widget() { - if (localStorage.getItem("show_announcement_widget")) { + if (localStorage.getItem("show_announcement_widget") == "true") { let announcement_widget = $(".announcement-widget"); let close_message = announcement_widget.find(".close-message"); close_message.on( @@ -247,10 +247,9 @@ frappe.ui.toolbar.clear_cache = frappe.utils.throttle(function () { frappe.ui.toolbar.reset_announcement_widget = function () { frappe.db.get_single_value("Navbar Settings", "announcement_widget").then((value) => { - if (value != frappe.boot.navbar_settings.announcement_widget) { - localStorage.setItem("show_announcement_widget", strip_html(value) != ""); - frappe.boot.navbar_settings.announcement_widget = value; - frappe.ui.toolbar.clear_cache(); + if (value != localStorage.getItem("announcement_widget")) { + localStorage.setItem("show_announcement_widget", true); + localStorage.setItem("announcement_widget", value); } }); }; From f31dc47eebd89e64b68fd8b8652329e99e3eb6ba Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Fri, 22 Mar 2024 23:27:00 +0530 Subject: [PATCH 7/9] test(UI): navbar announcements --- cypress/integration/toolbar.js | 40 ++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 cypress/integration/toolbar.js diff --git a/cypress/integration/toolbar.js b/cypress/integration/toolbar.js new file mode 100644 index 0000000000..2ce5a2fd69 --- /dev/null +++ b/cypress/integration/toolbar.js @@ -0,0 +1,40 @@ +context("Toolbar", () => { + before(() => { + cy.login(); + }); + it("Checks the functionality for announcements added through Navbar Settings", () => { + // Navigate to the Navbar Settings DocType + cy.visit("/app/navbar-settings/"); + + // Set an initial value for the announcement + cy.fill_field("announcement_widget", "Site Maintenance: 3-4 PM", "Text Editor") + .as("announcement_widget") + .wait(300) + .save(); + + // Check if the announcement widget appears + cy.reload(); + cy.get(".announcement-widget").should("be.visible"); + cy.get(".announcement-widget div.container").should("contain", "Site Maintenance: 3-4 PM"); + + // Click on the close button to dismiss the announcement + cy.get(".announcement-widget div.close-message").click(); + + // Check if the widget is permanently dismissed + cy.reload(); + cy.get(".announcement-widget").should("not.exist"); + + // Set a new announcement from Navbar Settings + cy.get("@announcement_widget").clear({ force: true }); + cy.fill_field("announcement_widget", "Site Maintenance: 4-5 PM", "Text Editor") + .wait(300) + .save(); + + // Check if the new announcement appears + cy.reload(); + cy.get(".announcement-widget").should("be.visible"); + cy.get(".announcement-widget div.container").should("contain", "Site Maintenance: 4-5 PM"); + + cy.get("@announcement_widget").clear({ force: true }).wait(300).save(); + }); +}); From f2d343f2c3df391a4033c0d6cc4b33699860ca15 Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Wed, 27 Mar 2024 00:21:55 +0530 Subject: [PATCH 8/9] Revert "test(UI): navbar announcements" This reverts commit f31dc47eebd89e64b68fd8b8652329e99e3eb6ba. --- cypress/integration/toolbar.js | 40 ---------------------------------- 1 file changed, 40 deletions(-) delete mode 100644 cypress/integration/toolbar.js diff --git a/cypress/integration/toolbar.js b/cypress/integration/toolbar.js deleted file mode 100644 index 2ce5a2fd69..0000000000 --- a/cypress/integration/toolbar.js +++ /dev/null @@ -1,40 +0,0 @@ -context("Toolbar", () => { - before(() => { - cy.login(); - }); - it("Checks the functionality for announcements added through Navbar Settings", () => { - // Navigate to the Navbar Settings DocType - cy.visit("/app/navbar-settings/"); - - // Set an initial value for the announcement - cy.fill_field("announcement_widget", "Site Maintenance: 3-4 PM", "Text Editor") - .as("announcement_widget") - .wait(300) - .save(); - - // Check if the announcement widget appears - cy.reload(); - cy.get(".announcement-widget").should("be.visible"); - cy.get(".announcement-widget div.container").should("contain", "Site Maintenance: 3-4 PM"); - - // Click on the close button to dismiss the announcement - cy.get(".announcement-widget div.close-message").click(); - - // Check if the widget is permanently dismissed - cy.reload(); - cy.get(".announcement-widget").should("not.exist"); - - // Set a new announcement from Navbar Settings - cy.get("@announcement_widget").clear({ force: true }); - cy.fill_field("announcement_widget", "Site Maintenance: 4-5 PM", "Text Editor") - .wait(300) - .save(); - - // Check if the new announcement appears - cy.reload(); - cy.get(".announcement-widget").should("be.visible"); - cy.get(".announcement-widget div.container").should("contain", "Site Maintenance: 4-5 PM"); - - cy.get("@announcement_widget").clear({ force: true }).wait(300).save(); - }); -}); From 2c0498cbdda1bec2d31f38539704f5862dd7fe50 Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Fri, 29 Mar 2024 16:23:23 +0530 Subject: [PATCH 9/9] fix: use boot to store announcement --- .../navbar_settings/navbar_settings.js | 6 +---- .../public/js/frappe/ui/toolbar/navbar.html | 4 +-- frappe/public/js/frappe/ui/toolbar/toolbar.js | 25 ++++++++++--------- frappe/sessions.py | 1 + 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/frappe/core/doctype/navbar_settings/navbar_settings.js b/frappe/core/doctype/navbar_settings/navbar_settings.js index acdcdf8ac7..ed7e331986 100644 --- a/frappe/core/doctype/navbar_settings/navbar_settings.js +++ b/frappe/core/doctype/navbar_settings/navbar_settings.js @@ -1,8 +1,4 @@ // Copyright (c) 2020, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on("Navbar Settings", { - after_save: function (frm) { - frappe.ui.toolbar.reset_announcement_widget(); - }, -}); +frappe.ui.form.on("Navbar Settings", {}); diff --git a/frappe/public/js/frappe/ui/toolbar/navbar.html b/frappe/public/js/frappe/ui/toolbar/navbar.html index f17203c08b..db697c5c7f 100644 --- a/frappe/public/js/frappe/ui/toolbar/navbar.html +++ b/frappe/public/js/frappe/ui/toolbar/navbar.html @@ -139,10 +139,10 @@
- {% if localStorage.getItem("show_announcement_widget") == 'true' && strip_html(localStorage.getItem("announcement_widget")) != '' %} + {% if !localStorage.getItem("dismissed_announcement_widget") && strip_html(navbar_settings.announcement_widget) != '' %}
- {{ localStorage.getItem("announcement_widget") }} + {{ navbar_settings.announcement_widget }}
{{ frappe.utils.icon("close") }}
diff --git a/frappe/public/js/frappe/ui/toolbar/toolbar.js b/frappe/public/js/frappe/ui/toolbar/toolbar.js index 62bcde0f43..ca7da66e72 100644 --- a/frappe/public/js/frappe/ui/toolbar/toolbar.js +++ b/frappe/public/js/frappe/ui/toolbar/toolbar.js @@ -6,7 +6,6 @@ frappe.provide("frappe.search"); frappe.ui.toolbar.Toolbar = class { constructor() { - frappe.ui.toolbar.reset_announcement_widget(); $("header").replaceWith( frappe.render_template("navbar", { avatar: frappe.avatar(frappe.session.user, "avatar-medium"), @@ -59,13 +58,24 @@ frappe.ui.toolbar.Toolbar = class { } setup_announcement_widget() { - if (localStorage.getItem("show_announcement_widget") == "true") { + let current_announcement = frappe.boot.navbar_settings.announcement_widget; + + if (!current_announcement) return; + + // If an unseen announcement is added, overlook dismiss flag + if (current_announcement != localStorage.getItem("announcement_widget")) { + localStorage.removeItem("dismissed_announcement_widget"); + localStorage.setItem("announcement_widget", current_announcement); + } + + // When an announcement is closed, add dismiss flag + if (!localStorage.getItem("dismissed_announcement_widget")) { let announcement_widget = $(".announcement-widget"); let close_message = announcement_widget.find(".close-message"); close_message.on( "click", () => - localStorage.setItem("show_announcement_widget", false) || + localStorage.setItem("dismissed_announcement_widget", true) || announcement_widget.addClass("hidden") ); } @@ -245,15 +255,6 @@ frappe.ui.toolbar.clear_cache = frappe.utils.throttle(function () { }); }, 10000); -frappe.ui.toolbar.reset_announcement_widget = function () { - frappe.db.get_single_value("Navbar Settings", "announcement_widget").then((value) => { - if (value != localStorage.getItem("announcement_widget")) { - localStorage.setItem("show_announcement_widget", true); - localStorage.setItem("announcement_widget", value); - } - }); -}; - frappe.ui.toolbar.show_about = function () { try { frappe.ui.misc.about(); diff --git a/frappe/sessions.py b/frappe/sessions.py index 8781e7448e..9ed4be7004 100644 --- a/frappe/sessions.py +++ b/frappe/sessions.py @@ -167,6 +167,7 @@ def get(): bootinfo["desk_theme"] = frappe.db.get_value("User", frappe.session.user, "desk_theme") or "Light" bootinfo["user"]["impersonated_by"] = frappe.session.data.get("impersonated_by") + bootinfo["navbar_settings"] = frappe.get_cached_doc("Navbar Settings") return bootinfo