From 193d6b334c7f70e7222bf8e725b37d3717e63c1c Mon Sep 17 00:00:00 2001
From: Oliver <oliver.henry.walters@gmail.com>
Date: Wed, 3 Nov 2021 23:29:36 +1100
Subject: [PATCH] Add option to display "starred categories" on the index page

---
 InvenTree/common/models.py                          |  6 ++++++
 InvenTree/templates/InvenTree/index.html            | 13 ++++++++++++-
 .../templates/InvenTree/settings/user_homepage.html |  1 +
 InvenTree/templates/js/dynamic/inventree.js         |  7 ++++++-
 InvenTree/templates/js/translated/part.js           |  6 +++---
 5 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py
index 125941be14..bbc8a6721a 100644
--- a/InvenTree/common/models.py
+++ b/InvenTree/common/models.py
@@ -879,6 +879,12 @@ class InvenTreeUserSetting(BaseInvenTreeSetting):
             'default': True,
             'validator': bool,
         },
+        'HOMEPAGE_CATEGORY_STARRED': {
+            'name': _('Show subscribed categories'),
+            'description': _('Show subscribed part categories on the homepage'),
+            'default': True,
+            'validator': bool,
+        },
         'HOMEPAGE_PART_LATEST': {
             'name': _('Show latest parts'),
             'description': _('Show latest parts on the homepage'),
diff --git a/InvenTree/templates/InvenTree/index.html b/InvenTree/templates/InvenTree/index.html
index 2c407fdcd9..b87ec6d0dc 100644
--- a/InvenTree/templates/InvenTree/index.html
+++ b/InvenTree/templates/InvenTree/index.html
@@ -76,6 +76,7 @@ function addHeaderAction(label, title, icon, options) {
 }
 
 {% settings_value 'HOMEPAGE_PART_STARRED' user=request.user as setting_part_starred %}
+{% settings_value 'HOMEPAGE_CATEGORY_STARRED' user=request.user as setting_category_starred %}
 {% settings_value 'HOMEPAGE_PART_LATEST' user=request.user as setting_part_latest %}
 {% settings_value 'HOMEPAGE_BOM_VALIDATION' user=request.user as setting_bom_validation %}
 {% to_list setting_part_starred setting_part_latest setting_bom_validation as settings_list_part %}
@@ -87,12 +88,22 @@ addHeaderTitle('{% trans "Parts" %}');
 addHeaderAction('starred-parts', '{% trans "Subscribed Parts" %}', 'fa-bell');
 loadSimplePartTable("#table-starred-parts", "{% url 'api-part-list' %}", {
     params: {
-        "starred": true,
+        starred: true,
     },
     name: 'starred_parts',
 });
 {% endif %}
 
+{% if setting_category_starred %}
+addHeaderAction('starred-categories', '{% trans "Subscribed Categories" %}', 'fa-bell');
+loadPartCategoryTable($('#table-starred-categories'), {
+    params: {
+        starred: true,
+    },
+    name: 'starred_categories'
+});
+{% endif %}
+
 {% if setting_part_latest %}
 addHeaderAction('latest-parts', '{% trans "Latest Parts" %}', 'fa-newspaper');
 loadSimplePartTable("#table-latest-parts", "{% url 'api-part-list' %}", {
diff --git a/InvenTree/templates/InvenTree/settings/user_homepage.html b/InvenTree/templates/InvenTree/settings/user_homepage.html
index 8219187044..54e3bdcefd 100644
--- a/InvenTree/templates/InvenTree/settings/user_homepage.html
+++ b/InvenTree/templates/InvenTree/settings/user_homepage.html
@@ -15,6 +15,7 @@
     <table class='table table-striped table-condensed'>
         <tbody>
             {% include "InvenTree/settings/setting.html" with key="HOMEPAGE_PART_STARRED" icon='fa-bell' user_setting=True %}
+            {% include "InvenTree/settings/setting.html" with key="HOMEPAGE_CATEGORY_STARRED" icon='fa-bell' user_setting=True %}
             {% include "InvenTree/settings/setting.html" with key="HOMEPAGE_PART_LATEST" icon='fa-history' user_setting=True %}
             {% include "InvenTree/settings/setting.html" with key="PART_RECENT_COUNT" icon="fa-clock" user_setting=True %}
             {% include "InvenTree/settings/setting.html" with key="HOMEPAGE_BOM_VALIDATION" user_setting=True %}
diff --git a/InvenTree/templates/js/dynamic/inventree.js b/InvenTree/templates/js/dynamic/inventree.js
index 0172e47706..1774ba6f3d 100644
--- a/InvenTree/templates/js/dynamic/inventree.js
+++ b/InvenTree/templates/js/dynamic/inventree.js
@@ -169,7 +169,12 @@ function inventreeDocReady() {
                 html += '</span>';
                 
                 if (user_settings.SEARCH_SHOW_STOCK_LEVELS) {
-                    html += partStockLabel(item.data);
+                    html += partStockLabel(
+                        item.data,
+                        {
+                            classes: 'badge-right',
+                        }
+                    );
                 }
 
                 html += '</a>';
diff --git a/InvenTree/templates/js/translated/part.js b/InvenTree/templates/js/translated/part.js
index adc10566d7..b87e90dcc8 100644
--- a/InvenTree/templates/js/translated/part.js
+++ b/InvenTree/templates/js/translated/part.js
@@ -420,12 +420,12 @@ function toggleStar(options) {
 }
 
 
-function partStockLabel(part) {
+function partStockLabel(part, options={}) {
 
     if (part.in_stock) {
-        return `<span class='badge rounded-pill bg-success'>{% trans "Stock" %}: ${part.in_stock}</span>`;
+        return `<span class='badge rounded-pill bg-success ${options.classes}'>{% trans "Stock" %}: ${part.in_stock}</span>`;
     } else {
-        return `<span class='badge rounded-pill bg-danger'>{% trans "No Stock" %}</span>`;
+        return `<span class='badge rounded-pill bg-danger ${options.classes}'>{% trans "No Stock" %}</span>`;
     }
 }