From 80320105d8a4af7b6802ba23a37cb76142442758 Mon Sep 17 00:00:00 2001
From: caryoscelus <caryoscelus@gmx.com>
Date: Sat, 6 Aug 2022 00:45:27 +0000
Subject: [PATCH] favourite/unfavourite in the sidebar

there's still a bug that doesn't update unfavouriting in real time
---
 plugins/Sidebar/SidebarPlugin.py | 15 +++++++++++++++
 plugins/Sidebar/media/all.js     | 18 +++++++++++++++++-
 src/Ui/UiWebsocket.py            | 31 +++++++++++++++++++++++++++++++
 3 files changed, 63 insertions(+), 1 deletion(-)

diff --git a/plugins/Sidebar/SidebarPlugin.py b/plugins/Sidebar/SidebarPlugin.py
index 876ea37a..ed77bbf5 100644
--- a/plugins/Sidebar/SidebarPlugin.py
+++ b/plugins/Sidebar/SidebarPlugin.py
@@ -415,11 +415,26 @@ class UiWebsocketPlugin(object):
             class_pause = "hidden"
             class_resume = ""
 
+        dashboard = config.homepage
+        dsite = self.user.sites.get(dashboard, None)
+        if not dsite:
+            print('No dashboard found, cannot favourite')
+            class_favourite = "hidden"
+            class_unfavourite = "hidden"
+        elif dsite.get('sittings', {}).get('favorite_sites', {}).get(self.site.address, False):
+            class_favourite = ""
+            class_unfavourite = "hidden"
+        else:
+            class_favourite = "hidden"
+            class_unfavourite = ""
+
         body.append(_("""
             <li>
              <label>{_[Site control]}</label>
              <a href='#Update' class='button noupdate' id='button-update'>{_[Update]}</a>
              <a href='#Pause' class='button {class_pause}' id='button-pause'>{_[Pause]}</a>
+             <a href='#Favourite' class='button {class_favourite}' id='button-favourite'>{_[Favourite]}</a>
+             <a href='#Unfavourite' class='button {class_unfavourite}' id='button-unfavourite'>{_[Unfavourite]}</a>
              <a href='#Resume' class='button {class_resume}' id='button-resume'>{_[Resume]}</a>
              <a href='#Delete' class='button noupdate' id='button-delete'>{_[Delete]}</a>
             </li>
diff --git a/plugins/Sidebar/media/all.js b/plugins/Sidebar/media/all.js
index 5a03a37c..2bff5cef 100644
--- a/plugins/Sidebar/media/all.js
+++ b/plugins/Sidebar/media/all.js
@@ -1137,6 +1137,22 @@ window.initScrollable = function () {
           return false;
         };
       })(this));
+      this.tag.find("#button-favourite").off("click touched").on("click touched", (function(_this) {
+	return function() {
+	  _this.tag.find("#button-favourite").addClass("hidden");
+	  _this.tag.find("#button-unfavourite").removeClass("hidden");
+	  _this.wrapper.ws.cmd("siteFavourite", _this.wrapper.site_info.address);
+	  return false;
+	};
+      })(this));
+      this.tag.find("#button-unfavourite").off("click touched").on("click touched", (function(_this) {
+	return function() {
+	  _this.tag.find("#button-favourite").removeClass("hidden");
+	  _this.tag.find("#button-unfavourite").addClass("hidden");
+	  _this.wrapper.ws.cmd("siteUnfavourite", _this.wrapper.site_info.address);
+	  return false;
+	};
+      })(this));
       this.tag.find("#button-delete").off("click touchend").on("click touchend", (function(_this) {
         return function() {
           _this.handleSiteDeleteClick();
@@ -1767,4 +1783,4 @@ function morphdom(fromNode, toNode, options) {
 
 module.exports = morphdom;
 },{}]},{},[1])(1)
-});
\ No newline at end of file
+});
diff --git a/src/Ui/UiWebsocket.py b/src/Ui/UiWebsocket.py
index 2bea8f2a..48a30ee2 100644
--- a/src/Ui/UiWebsocket.py
+++ b/src/Ui/UiWebsocket.py
@@ -10,6 +10,8 @@ import stat
 
 import gevent
 
+from rich import print
+
 from Config import config
 from Site import SiteManager
 from Crypt import CryptBitcoin
@@ -950,6 +952,35 @@ class UiWebsocket(object):
         else:
             self.response(to, {"error": "Unknown site: %s" % address})
 
+    def siteFavUnfav(self, to, address, action, response):
+        dashboard = config.homepage
+        dsite = self.user.sites.get(dashboard, None)
+        if not dsite:
+            raise RuntimeError(f'No dashboard {dashboard} found to add site to favourites')
+        if 'settings' not in dsite:
+            dsite['settings'] = {}
+        dsettings = dsite['settings']
+        if 'favorite_sites' not in dsettings:
+            dsettings['favorite_sites'] = {}
+        favs = dsettings['favorite_sites']
+        action(favs)
+        self.user.setSiteSettings(dashboard, dsettings)
+        self.response(to, response)
+
+    @flag.admin
+    @flag.no_multiuser
+    def actionSiteFavourite(self, to, address):
+        def do_add(favs):
+            favs[address] = True
+        self.siteFavUnfav(to, address, do_add, "Added to favourites")
+
+    @flag.admin
+    @flag.no_multiuser
+    def actionSiteUnfavourite(self, to, address):
+        def do_del(favs):
+            del favs[address]
+        self.siteFavUnfav(to, address, do_del, "Removed from favourites")
+
     @flag.admin
     @flag.no_multiuser
     def actionSiteDelete(self, to, address):