From 4ff1c690cc4db88b9a2cbdad3a04db2b1f818fb1 Mon Sep 17 00:00:00 2001
From: Oliver Walters <oliver.henry.walters@gmail.com>
Date: Tue, 2 Mar 2021 12:33:01 +1100
Subject: [PATCH 1/4] Bug fix for paginated tables

---
 InvenTree/templates/js/tables.js | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/InvenTree/templates/js/tables.js b/InvenTree/templates/js/tables.js
index f09c683bff..21e673d5ed 100644
--- a/InvenTree/templates/js/tables.js
+++ b/InvenTree/templates/js/tables.js
@@ -145,10 +145,7 @@ $.fn.inventreeTable = function(options) {
     var filters = options.queryParams || options.filters || {};
 
     options.queryParams = function(params) {
-        for (var key in filters) {
-            params[key] = filters[key];
-        }
-
+        
         // Override the way that we ask the server to sort results
         // It seems bootstrap-table does not offer a "native" way to do this...
         if ('sort' in params) {
@@ -170,6 +167,15 @@ $.fn.inventreeTable = function(options) {
 
         }
 
+        for (var key in filters) {
+            params[key] = filters[key];
+        }
+
+        // Add "order" back in (if it was originally specified by InvenTree)
+        // Annoyingly, "order" shadows some field names in InvenTree...
+        if ('order' in filters) {
+            params['order'] = filters['order'];
+        }
         return params;
     }
 

From 1c3b017283129c6c8b5160cf17a76794fed0eb30 Mon Sep 17 00:00:00 2001
From: Oliver Walters <oliver.henry.walters@gmail.com>
Date: Tue, 2 Mar 2021 12:33:41 +1100
Subject: [PATCH 2/4] Improve server-side pagination of SalesOrderLineItem

---
 InvenTree/order/api.py                         | 18 +++++++++++++++++-
 .../templates/order/sales_order_detail.html    |  3 ++-
 InvenTree/stock/api.py                         |  4 +++-
 3 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py
index ce75a47697..33937acc94 100644
--- a/InvenTree/order/api.py
+++ b/InvenTree/order/api.py
@@ -412,7 +412,23 @@ class SOLineItemList(generics.ListCreateAPIView):
 
         return queryset
 
-    filter_backends = [DjangoFilterBackend]
+    filter_backends = [
+        DjangoFilterBackend,
+        filters.SearchFilter,
+        filters.OrderingFilter
+    ]
+
+    ordering_fields = [
+        'part__name',
+        'quantity',
+        'reference',
+    ]
+
+    search_fields = [
+        'part__name',
+        'quantity',
+        'reference',
+    ]
 
     filter_fields = [
         'order',
diff --git a/InvenTree/order/templates/order/sales_order_detail.html b/InvenTree/order/templates/order/sales_order_detail.html
index c91cc6e51b..27bbd542dd 100644
--- a/InvenTree/order/templates/order/sales_order_detail.html
+++ b/InvenTree/order/templates/order/sales_order_detail.html
@@ -173,6 +173,7 @@ $("#so-lines-table").inventreeTable({
         part_detail: true,
         allocations: true,
     },
+    sidePagination: 'server',
     uniqueId: 'pk',
     url: "{% url 'api-so-line-list' %}",
     onPostBody: setupCallbacks,
@@ -201,6 +202,7 @@ $("#so-lines-table").inventreeTable({
         },
         {
             sortable: true,
+            sortName: 'part__name',
             field: 'part',
             title: 'Part',
             formatter: function(value, row, index, field) {
@@ -222,7 +224,6 @@ $("#so-lines-table").inventreeTable({
             title: 'Quantity',
         },
         {
-            sortable: true,
             field: 'allocated',
             {% if order.status == SalesOrderStatus.PENDING %}
             title: '{% trans "Allocated" %}',
diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py
index 15edfed066..60e511616a 100644
--- a/InvenTree/stock/api.py
+++ b/InvenTree/stock/api.py
@@ -853,7 +853,9 @@ class StockList(generics.ListCreateAPIView):
         'status',
     ]
 
-    ordering = ['part__name']
+    ordering = [
+        'part__name'
+    ]
 
     search_fields = [
         'serial',

From 6f4178acdb5cc9c54d5f0106dbc45b63af433347 Mon Sep 17 00:00:00 2001
From: Oliver Walters <oliver.henry.walters@gmail.com>
Date: Tue, 2 Mar 2021 12:38:37 +1100
Subject: [PATCH 3/4] Improve server-side pagination for POLineItem

---
 InvenTree/order/api.py                           | 16 ++++++++++++++++
 .../templates/order/purchase_order_detail.html   | 12 ++++++++++--
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py
index 33937acc94..95644199c5 100644
--- a/InvenTree/order/api.py
+++ b/InvenTree/order/api.py
@@ -200,6 +200,22 @@ class POLineItemList(generics.ListCreateAPIView):
 
     filter_backends = [
         DjangoFilterBackend,
+        filters.SearchFilter,
+        filters.OrderingFilter
+    ]
+
+    ordering_fields = [
+        'part__part__name',
+        'part__MPN',
+        'part__SKU',
+        'reference',
+        'quantity',
+        'received',
+    ]
+
+    search_Fields = [
+        'part__part__name',
+        'part__part__description',
     ]
 
     filter_fields = [
diff --git a/InvenTree/order/templates/order/purchase_order_detail.html b/InvenTree/order/templates/order/purchase_order_detail.html
index 268e83ef4e..b22d045258 100644
--- a/InvenTree/order/templates/order/purchase_order_detail.html
+++ b/InvenTree/order/templates/order/purchase_order_detail.html
@@ -135,6 +135,7 @@ function setupCallbacks() {
 $("#po-table").inventreeTable({
     onPostBody: setupCallbacks,
     name: 'purchaseorder',
+    sidePagination: 'server',
     formatNoMatches: function() { return "{% trans 'No line items found' %}"; },
     queryParams: {
         order: {{ order.id }},
@@ -151,6 +152,7 @@ $("#po-table").inventreeTable({
         {
             field: 'part',
             sortable: true,
+            sortName: 'part__part__name',
             title: '{% trans "Part" %}',
             switchable: false,
             formatter: function(value, row, index, field) {
@@ -162,18 +164,24 @@ $("#po-table").inventreeTable({
             },
         },
         {
-            sortable: true,
             field: 'part_detail.description',
             title: '{% trans "Description" %}',
         },
         {
             sortable: true,
+            sortName: 'part__SKU',
             field: 'supplier_part_detail.SKU',
-            title: '{% trans "Order Code" %}',
+            title: '{% trans "SKU" %}',
             formatter: function(value, row, index, field) {
                 return renderLink(value, `/supplier-part/${row.part}/`);
             },
         },
+        {
+            sortable: true,
+            sortName: 'part__MPN',
+            field: 'supplier_part_detail.MPN',
+            title: '{% trans "MPN" %}',
+        },
         {
             sortable: true,
             field: 'reference',

From 628e87cb28751dab4fb3709a930fa8e33cdb84e9 Mon Sep 17 00:00:00 2001
From: Oliver Walters <oliver.henry.walters@gmail.com>
Date: Tue, 2 Mar 2021 13:08:12 +1100
Subject: [PATCH 4/4] search field fixes

---
 InvenTree/order/api.py | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py
index 95644199c5..db4c4dcc50 100644
--- a/InvenTree/order/api.py
+++ b/InvenTree/order/api.py
@@ -213,9 +213,12 @@ class POLineItemList(generics.ListCreateAPIView):
         'received',
     ]
 
-    search_Fields = [
+    search_fields = [
         'part__part__name',
         'part__part__description',
+        'part__MPN',
+        'part__SKU',
+        'reference',
     ]
 
     filter_fields = [