From 8da278a0721743b6e2b1eb80f45acb966bac4be3 Mon Sep 17 00:00:00 2001
From: Oliver <oliver.henry.walters@gmail.com>
Date: Fri, 20 May 2022 17:10:51 +1000
Subject: [PATCH] Adds option to hide unavailable stock items from the search
 preview window

---
 InvenTree/common/models.py                    | 23 ++++++++++++-------
 .../InvenTree/settings/user_search.html       |  1 +
 InvenTree/templates/js/translated/search.js   | 16 +++++++++----
 3 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py
index a9150a8e6d..2beeb26f1d 100644
--- a/InvenTree/common/models.py
+++ b/InvenTree/common/models.py
@@ -1428,6 +1428,13 @@ class InvenTreeUserSetting(BaseInvenTreeSetting):
             'default': True,
             'validator': bool,
         },
+        
+        'SEARCH_HIDE_INACTIVE_PARTS': {
+            'name': _("Hide Inactive Parts"),
+            'description': _('Excluded inactive parts from search preview window'),
+            'default': False,
+            'validator': bool,
+        },
 
         'SEARCH_PREVIEW_SHOW_CATEGORIES': {
             'name': _('Search Categories'),
@@ -1443,6 +1450,13 @@ class InvenTreeUserSetting(BaseInvenTreeSetting):
             'validator': bool,
         },
 
+        'SEARCH_PREVIEW_HIDE_UNAVAILABLE_STOCK': {
+            'name': _('Hide Unavailable Stock Items'),
+            'description': _('Exclude stock items which are not available from the search preview window'),
+            'validator': bool,
+            'default': False,
+        },
+
         'SEARCH_PREVIEW_SHOW_LOCATIONS': {
             'name': _('Search Locations'),
             'description': _('Display stock locations in search preview window'),
@@ -1479,7 +1493,7 @@ class InvenTreeUserSetting(BaseInvenTreeSetting):
         },
 
         'SEARCH_PREVIEW_EXCLUDE_INACTIVE_SALES_ORDERS': {
-            'name': 'Exclude Inactive Sales Orders',
+            'name': _('Exclude Inactive Sales Orders'),
             'description': _('Exclude inactive sales orders from search preview window'),
             'validator': bool,
             'default': True,
@@ -1492,13 +1506,6 @@ class InvenTreeUserSetting(BaseInvenTreeSetting):
             'validator': [int, MinValueValidator(1)]
         },
 
-        'SEARCH_HIDE_INACTIVE_PARTS': {
-            'name': _("Hide Inactive Parts"),
-            'description': _('Hide inactive parts in search preview window'),
-            'default': False,
-            'validator': bool,
-        },
-
         'PART_SHOW_QUANTITY_IN_FORMS': {
             'name': _('Show Quantity in Forms'),
             'description': _('Display available part quantity in some forms'),
diff --git a/InvenTree/templates/InvenTree/settings/user_search.html b/InvenTree/templates/InvenTree/settings/user_search.html
index f54c5fd2ef..f18fb5816c 100644
--- a/InvenTree/templates/InvenTree/settings/user_search.html
+++ b/InvenTree/templates/InvenTree/settings/user_search.html
@@ -18,6 +18,7 @@
             {% include "InvenTree/settings/setting.html" with key="SEARCH_HIDE_INACTIVE_PARTS" user_setting=True icon='fa-eye-slash' %}
             {% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_CATEGORIES" user_setting=True icon='fa-sitemap' %}
             {% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_STOCK" user_setting=True icon='fa-boxes' %}
+            {% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_HIDE_UNAVAILABLE_STOCK" user_setting=True icon='fa-eye-slash' %}
             {% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_LOCATIONS" user_setting=True icon='fa-sitemap' %}
             {% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_COMPANIES" user_setting=True icon='fa-building' %}
             {% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_PURCHASE_ORDERS" user_setting=True icon='fa-shopping-cart' %}
diff --git a/InvenTree/templates/js/translated/search.js b/InvenTree/templates/js/translated/search.js
index 5900a9b28d..9758ee2ff9 100644
--- a/InvenTree/templates/js/translated/search.js
+++ b/InvenTree/templates/js/translated/search.js
@@ -122,14 +122,22 @@ function updateSearch() {
 
     if (user_settings.SEARCH_PREVIEW_SHOW_STOCK) {
         // Search for matching stock items
+        
+        var filters = {
+            part_detail: true,
+            location_detail: true,
+        };
+
+        if (user_settings.SEARCH_PREVIEW_HIDE_UNAVAILABLE_STOCK) {
+            // Only show 'in stock' items in the preview windoww
+            filters.in_stock = true;
+        }
+
         addSearchQuery(
             'stock',
             '{% trans "Stock Items" %}',
             '{% url "api-stock-list" %}',
-            {
-                part_detail: true,
-                location_detail: true,
-            },
+            filters,
             renderStockItem,
             {
                 url: '/stock/item',