From 99066a5f40085d7145b3f2709af73772634c742a Mon Sep 17 00:00:00 2001
From: Eugen Ciur <eugen@papermerge.com>
Date: Tue, 22 Feb 2022 22:39:46 +0100
Subject: [PATCH] add pinned tags on the sidebar

---
 app/components/breadcrumb/index.hbs |  3 ++-
 app/components/commander/index.hbs  |  6 +++---
 app/components/commander/index.js   | 12 ++++++++++-
 app/components/nav/sidebar.hbs      | 17 +++++++++++++++
 app/components/nav/sidebar.js       | 13 ++++++++++++
 app/controllers/authenticated.js    |  2 +-
 app/routes/application.js           |  5 +++++
 app/services/preferences.js         |  2 +-
 app/styles/button.scss              | 33 +++++++++++++++++++++++++++++
 app/templates/authenticated.hbs     |  1 +
 10 files changed, 87 insertions(+), 7 deletions(-)
 create mode 100644 app/components/nav/sidebar.js

diff --git a/app/components/breadcrumb/index.hbs b/app/components/breadcrumb/index.hbs
index badd252..aa761e2 100644
--- a/app/components/breadcrumb/index.hbs
+++ b/app/components/breadcrumb/index.hbs
@@ -6,7 +6,8 @@
           @node={{node}}
           @extranode={{@extranode}}
           @extradoc={{@extradoc}}
-          @hint={{@hint}}>
+          @hint={{@hint}}
+          {{on "click" @onNodeClicked}} >
             {{#if (is_equal node.title ".inbox")}}
               <i class="bi-inbox-fill me-2"></i>Inbox
             {{else if (is_equal node.title ".home")}}
diff --git a/app/components/commander/index.hbs b/app/components/commander/index.hbs
index fc80a2a..24a93d7 100644
--- a/app/components/commander/index.hbs
+++ b/app/components/commander/index.hbs
@@ -57,6 +57,7 @@
     @node={{@node}}
     @extranode={{@extranode}}
     @extradoc={{@extradoc}}
+    @onNodeClicked={{this.onNodeClicked}}
     @hint={{@hint}} />
 
   <div class="view-mode-{{this.view_mode}}">
@@ -74,7 +75,8 @@
               @node={{node}}
               @extranode={{@extranode}}
               @extradoc={{@extradoc}}
-              @hint={{@hint}} />
+              @hint={{@hint}}
+              {{on "click" this.onNodeClicked}} />
         </NodeType>
       {{/let}}
     {{/each}}
@@ -87,6 +89,4 @@
       @node={{@node}}
       @hint={{@hint}} />
   {{/if}}
-
-
 </div>
diff --git a/app/components/commander/index.js b/app/components/commander/index.js
index eea132a..2ddcf09 100644
--- a/app/components/commander/index.js
+++ b/app/components/commander/index.js
@@ -131,9 +131,19 @@ export default class CommanderComponent extends Component {
     this.__new_record = doc;
   }
 
+  @action
+  onNodeClicked() {
+    /**
+     * Whenever a folder is clicked reset selected node list
+     *
+     * Otherwise user will see (newly opened) folder with no
+     * selected nodes - but with visible action buttons (delete, download...)!
+     * */
+    this.selected_nodes = A([]);
+  }
+
   @action
   openNewFolderModal() {
-    console.log('on new folder');
     this.show_new_folder_modal = true;
   }
 
diff --git a/app/components/nav/sidebar.hbs b/app/components/nav/sidebar.hbs
index b382bf4..ce0abdb 100644
--- a/app/components/nav/sidebar.hbs
+++ b/app/components/nav/sidebar.hbs
@@ -20,6 +20,23 @@
             <i class="fa fa-home me-2"></i>Home
           </LinkTo>
         </li>
+        <li>
+          <button class="btn btn-toggle rounded align-items-center text-white" data-bs-toggle="collapse" data-bs-target="#home-collapse" aria-expanded="false">
+            Pinned tags
+          </button>
+          <div id="home-collapse" class="collapse">
+            <ul class="list-unstyled px-3 mx-3 my-1">
+            {{#each @pinned_tags as |pinned_tag|}}
+              <li class="mb-2 pb-1">
+                  <Tag::Item
+                      @name={{pinned_tag.name}}
+                      @fg_color={{pinned_tag.fg_color}}
+                      @bg_color={{pinned_tag.bg_color}} />
+              </li>
+            {{/each}}
+            </ul>
+          </div>
+        </li>
         <li>
           <LinkTo
             @route="authenticated.nodes"
diff --git a/app/components/nav/sidebar.js b/app/components/nav/sidebar.js
new file mode 100644
index 0000000..ec91ffe
--- /dev/null
+++ b/app/components/nav/sidebar.js
@@ -0,0 +1,13 @@
+import Component from '@glimmer/component';
+import { service } from '@ember/service';
+
+
+export default class SidebarComponent extends Component {
+  @service store;
+
+  get pinned_tags() {
+    return this.store.findAll('tag').then((tags) => {
+      return tags.filter(tag => tag.pinned);
+    });
+  }
+}
diff --git a/app/controllers/authenticated.js b/app/controllers/authenticated.js
index 516dc6f..15f5236 100644
--- a/app/controllers/authenticated.js
+++ b/app/controllers/authenticated.js
@@ -1,6 +1,6 @@
 import { action } from '@ember/object';
 import Controller from '@ember/controller';
-import { tracked } from '@glimmer/tracking'
+import { tracked } from '@glimmer/tracking';
 
 
 export default class AuthenticatedController extends Controller {
diff --git a/app/routes/application.js b/app/routes/application.js
index 6734f7b..5d98cac 100644
--- a/app/routes/application.js
+++ b/app/routes/application.js
@@ -3,4 +3,9 @@ import BaseRoute from 'papermerge/routes/base';
 
 export default class ApplicationRoute extends BaseRoute {
 
+  async model() {
+    return this.store.findAll('tag').then((tags) => {
+      return tags.filter(tag => tag.pinned);
+    });
+  }
 }
diff --git a/app/services/preferences.js b/app/services/preferences.js
index d509b03..68411f5 100644
--- a/app/services/preferences.js
+++ b/app/services/preferences.js
@@ -12,7 +12,7 @@ export default class Preferences extends Service {
 
     prefs = this.store.peekAll('preferences');
 
-    found_item = prefs.filterBy('identifier',key);
+    found_item = prefs.filterBy('identifier', key);
 
     if (found_item && found_item.length == 1) {
       return found_item[0]['value'];
diff --git a/app/styles/button.scss b/app/styles/button.scss
index a3faba5..287fdca 100644
--- a/app/styles/button.scss
+++ b/app/styles/button.scss
@@ -4,4 +4,37 @@ button {
 
 a.btn {
   border-radius: 0px !important;
+}
+
+.btn-toggle::before {
+  width: 1.25em;
+  line-height: 0;
+  content: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%28255,255,255,.8%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e");
+  transition: transform .35s ease;
+  transform-origin: .5em 50%;
+}
+
+.btn-toggle[aria-expanded="true"]::before {
+  transform: rotate(90deg);
+}
+
+.btn-toggle-nav a {
+  display: inline-flex;
+  padding: .1875rem .5rem;
+  margin-top: .125rem;
+  margin-left: 1.25rem;
+  text-decoration: none;
+}
+.btn-toggle-nav a:hover,
+.btn-toggle-nav a:focus {
+  background-color: #d2f4ea;
+}
+
+.btn-toggle {
+  display: inline-flex;
+  align-items: center;
+  padding: .25rem .5rem;
+  color: rgba(0, 0, 0, .65);
+  background-color: transparent;
+  border: 0;
 }
\ No newline at end of file
diff --git a/app/templates/authenticated.hbs b/app/templates/authenticated.hbs
index 6f5d721..b65611e 100644
--- a/app/templates/authenticated.hbs
+++ b/app/templates/authenticated.hbs
@@ -2,6 +2,7 @@
   <Nav::Sidebar
     @home_folder={{this.home_folder}}
     @inbox_folder={{this.inbox_folder}}
+    @pinned_tags={{@model}}
     @expanded={{this.expanded}} />
   <div class="w-100 central-bar">
     <Nav::Topbar
-- 
GitLab