From 28f3244574c0c77f05449bd560662124d7b586cb Mon Sep 17 00:00:00 2001
From: Oliver Walters <oliver.henry.walters@gmail.com>
Date: Tue, 3 May 2022 16:52:23 +1000
Subject: [PATCH] Order parts from "supplier parts" page

- Prevent duplicate parts from loading
---
 InvenTree/build/templates/build/detail.html   |  8 ----
 .../company/templates/company/detail.html     | 22 ++++-----
 InvenTree/templates/js/translated/order.js    | 46 +++++++++++++------
 3 files changed, 41 insertions(+), 35 deletions(-)

diff --git a/InvenTree/build/templates/build/detail.html b/InvenTree/build/templates/build/detail.html
index 42bc51bb2f..2fb96e88e3 100644
--- a/InvenTree/build/templates/build/detail.html
+++ b/InvenTree/build/templates/build/detail.html
@@ -546,14 +546,6 @@ $('#allocate-selected-items').click(function() {
     );
 });
 
-$("#btn-order-parts").click(function() {
-    launchModalForm("/order/purchase-order/order-parts/", {
-        data: {
-            build: {{ build.id }},
-        },
-    });
-});
-
 {% endif %}
 
 enableSidebar('buildorder');
diff --git a/InvenTree/company/templates/company/detail.html b/InvenTree/company/templates/company/detail.html
index 8168c65609..4474278613 100644
--- a/InvenTree/company/templates/company/detail.html
+++ b/InvenTree/company/templates/company/detail.html
@@ -333,14 +333,6 @@
         orderParts(
             parts,
         );
-
-        return;
-
-        launchModalForm("/order/purchase-order/order-parts/", {
-            data: {
-                parts: parts,
-            },
-        });
     });
 
     {% endif %}
@@ -404,14 +396,16 @@
         var parts = [];
 
         selections.forEach(function(item) {
-            parts.push(item.part);
+            var part = item.part_detail;
+            parts.push(part);
         });
 
-        launchModalForm("/order/purchase-order/order-parts/", {
-            data: {
-                parts: parts,
-            },
-        });
+        orderParts(
+            parts,
+            {
+                supplier: {{ company.pk }},
+            }
+        );
     });
 
     {% endif %}
diff --git a/InvenTree/templates/js/translated/order.js b/InvenTree/templates/js/translated/order.js
index d489ffd1c7..1b197a2766 100644
--- a/InvenTree/templates/js/translated/order.js
+++ b/InvenTree/templates/js/translated/order.js
@@ -485,9 +485,16 @@ function orderParts(parts_list, options={}) {
 
     var parts = [];
 
+    var parts_seen = {};
+
     parts_list.forEach(function(part) {
         if (part.purchaseable) {
-            parts.push(part);
+
+            // Prevent duplicates
+            if (!(part.pk in parts_seen)) {
+                parts_seen[part.pk] = true;
+                parts.push(part);
+            }
         }
     });
 
@@ -622,24 +629,40 @@ function orderParts(parts_list, options={}) {
     </table>
     `;
 
+    // Construct API filters for the SupplierPart field
+    var supplier_part_filters = {
+        supplier_detail: true,
+        part_detail: true,
+    };
+
+    if (options.supplier) {
+        supplier_part_filters.supplier = options.supplier;
+    }
+
+    // Construct API filtres for the PurchaseOrder field
+    var order_filters = {
+        status: {{ PurchaseOrderStatus.PENDING }},
+        supplier_detail: true,
+    };
+
+    if (options.supplier) {
+        order_filters.supplier = options.supplier;
+    }
+
     constructFormBody({}, {
         preFormContent: html,
         title: '{% trans "Order Parts" %}',
         preventSubmit: true,
         closeText: '{% trans "Close" %}',
         afterRender: function(fields, opts) {
-            // TODO
             parts.forEach(function(part) {
 
-                var filters = {
-                    part: part.pk,
-                    supplier_detail: true,
-                    part_detail: true,
-                };
+                // Filter by base part
+                supplier_part_filters.part = part.pk;
 
                 if (part.manufacturer_part) {
                     // Filter by manufacturer part
-                    filters.manufacturer_part = part.manufacturer_part;
+                    supplier_part_filters.manufacturer_part = part.manufacturer_part;
                 }
 
                 // Configure the "supplier part" field
@@ -650,7 +673,7 @@ function orderParts(parts_list, options={}) {
                     required: true,
                     type: 'related field',
                     auto_fill: true,
-                    filters: filters,
+                    filters: supplier_part_filters,
                     noResults: function(query) {
                         return '{% trans "No matching supplier parts" %}';
                     }                    
@@ -664,10 +687,7 @@ function orderParts(parts_list, options={}) {
                     required: true,
                     type: 'related field',
                     auto_fill: false,
-                    filters: {
-                        status: {{ PurchaseOrderStatus.PENDING }},
-                        supplier_detail: true,
-                    },
+                    filters: order_filters,
                     noResults: function(query) {
                         return '{% trans "No matching purchase orders" %}';
                     }