From 89bc547e3c2a216774b18094f779e1f1c039fe29 Mon Sep 17 00:00:00 2001 From: Alex Mous <48971842+polarpiberry@users.noreply.github.com> Date: Mon, 21 Dec 2020 00:21:44 -0800 Subject: [PATCH] v7.0: Add support for bulk orders --- PrinterPiExtension/js/background.js | 120 ++++++++++++++++++++-------- PrinterPiExtension/js/main.js | 95 ++++++++++++++++++---- PrinterPiExtension/main.html | 14 +++- PrinterPiExtension/manifest.json | 2 +- PrinterPiExtension/options.html | 2 +- 5 files changed, 176 insertions(+), 57 deletions(-) diff --git a/PrinterPiExtension/js/background.js b/PrinterPiExtension/js/background.js index 9b4ca05..a87c5e0 100644 --- a/PrinterPiExtension/js/background.js +++ b/PrinterPiExtension/js/background.js @@ -16,45 +16,76 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +{ + let parseEbayRegular = () => { + let address = document.querySelector("#shipToAddress").innerText; + let shipping = document.querySelectorAll("._1nhS6BoY")[3].children[1].innerText; + shipping = parseFloat(shipping.substring(shipping.indexOf("$")+1)); //Shipping as a float + let grandTotal = document.querySelectorAll("._1nhS6BoY")[2].children[1].innerText; //Shipping+items+tax + grandTotal = parseFloat(grandTotal.substring(grandTotal.indexOf("$")+1)); + let itemTotal = 0; //Total cost of items + let items = document.querySelectorAll(".-CkHbnvR"); + let item_arr = []; + for (let i=0; i { + let orders = []; + document.querySelectorAll(".orders-list__item__details").forEach((order) => { + let address = order.querySelector("address").innerText; + let items = []; + order.querySelectorAll(".item__description").forEach(item => { + items.push({ + desc: item.children[0].innerText, + sku: item.querySelector(".item__details").children[0].innerText.slice(5), + qty: item.querySelector(".item__details").children[1].innerText.slice(5), + price: parseFloat(item.querySelector(".item__details").children[2].innerText.slice(11)) + }); + }); + let shipping = order.querySelector(".buyer-paid-service").children[0].innerText.slice(1); + + let itemTotal = items.length > 1 ? items.reduce((a, b) => (a .price|| a) + (b.price || b)) : items[0].price; + + orders.push({ + to: address, + shipping: shipping, + subtotal: itemTotal, + tax: 0, //No tax field available + items: items + }) }); + if (orders.length == 0) { + throw new Error("No orders found"); + } + return orders; } - chrome.runtime.sendMessage({ //Send the first data - to: address, - shipping: shipping, - subtotal: itemTotal, - tax: grandTotal-(shipping+itemTotal), - items: item_arr - }); -} catch (errA) { - try { //Otherwise, try PayPal + let parsePayPalRegular = () => { //Get the items let transaction = document.querySelector("#td_purchaseDetailsSeller").parentElement; //The main transaction purchase details let items_arr = []; let items = document.querySelectorAll(".item"); for (let i=1; i { - chrome.storage.local.get(["data"], (res) => { - if (res.data) { - setData(res.data); + chrome.storage.local.get(["orders"], (res) => { + if (res.orders) { + orders = res.orders; + showOrders(); + selectOrder(0); document.getElementById("more-info").innerHTML = "Data read from storage"; } else { document.getElementById("more-info").innerHTML = "No data in storage"; @@ -109,7 +113,7 @@ let readStorageData = (onFinish) => { */ let setStorageData = () => { if (validateInputs()) { - chrome.storage.local.set({data: getData()}, () => { + chrome.storage.local.set({orders: orders}, () => { document.getElementById("more-info").innerHTML = "Data saved"; }); } @@ -329,6 +333,46 @@ let getData = () => { //Read the data from the HTML page return data; } +/** + * Show a (global) order based on it's index + * + * @param {number} orderIndex + */ +let selectOrder = (orderIndex) => { + console.log(orders); + setData({ + to: orders[orderIndex]?.to || "", + shipping: orders[orderIndex]?.shipping || "0", + tax: orders[orderIndex]?.tax || "0", + subtotal: orders[orderIndex]?.subtotal || "0", + items: orders[orderIndex]?.items || [], + }); + validateInputs(); +} + +/** + * Remove the current order (from global orders) + */ +const removeCurrentOrder = () => { + orders.splice(document.getElementById("order-select").value, 1); + showOrders(); + selectOrder(0); +} + +/** + * Show the (global) orders in the select + */ +const showOrders = () => { + document.getElementById('order-select').innerHTML = ""; + orders.forEach((_, i) => { + let opt = document.createElement("OPTION"); + opt.value = i; + opt.innerHTML = `Order ${i+1}`; + opt.selected = i==0; + document.getElementById('order-select').appendChild(opt); + }); +} + /** * Get the complete data Packet * @@ -456,12 +500,14 @@ let validateInputs = () => { if (err_msg) { //Display any errors and disable the submit button document.getElementById("print-button").disabled = true; + document.getElementById("print-all-button").disabled = true; let done_msg = document.getElementById("done-msg"); done_msg.innerHTML = err_msg; done_msg.classList = "text-danger"; return false; } else { //No errors - remove any lock on the submit button document.getElementById("print-button").disabled = false; + document.getElementById("print-all-button").disabled = false; let done_msg = document.getElementById("done-msg"); done_msg.innerHTML = "Not connected"; done_msg.classList = "text-info"; @@ -552,14 +598,16 @@ let parseFile = (ev) => { if (data.version >= 6.0) { //Tax support added in version 6.0 tax = data.tax } - setData({ //Set the data packet + orders = []; + orders.push({ //Set the data packet to: data.to, shipping: data.shipping, tax: tax, subtotal: data.subtotal, items: data.items, }); - validateInputs(); + showOrders(); + selectOrder(0); document.getElementById("more-info").innerHTML = "Data loaded from file"; //Show the error message } reader.readAsText(files[0]); @@ -574,6 +622,13 @@ window.onload = () => { //Add event listeners, etc. let pkt = getPacket(settings); if (pkt) sendData(pkt); }); + document.getElementById('print-all-button').addEventListener('click', () => { //Get the data packet and send it + for (let orderIndex in orders) { + selectOrder(orderIndex); + let pkt = getPacket(settings); + if (pkt) sendData(pkt); + } + }); document.getElementById('envelope-button').addEventListener('click', () => { //Get the data packet and print it let pkt = getPacket(settings); if (pkt) printEnvelope(pkt); @@ -590,6 +645,8 @@ window.onload = () => { //Add event listeners, etc. done_msg.innerHTML = "Please configure the printer settings in the Setting page (via the button PrinterPi Settings below)"; done_msg.classList = "text-danger"; }); + document.getElementById('order-select').addEventListener("change", (e) => selectOrder(e.target.value)); + document.getElementById('remove-button').addEventListener("click", removeCurrentOrder); document.getElementById('save-button').addEventListener('click', setStorageData); document.getElementById('parse-button').addEventListener('click', parsePage); //Execute the background parsing script document.getElementById('file-button').addEventListener('click', () => document.getElementById('file-dialog').click()); //Parse a file for the receipt @@ -611,14 +668,18 @@ chrome.runtime.onMessage.addListener((msg) => { //Listen for messages and set th document.getElementById("more-info").innerHTML += ". Not a valid page to parse."; //Show the error message }); document.getElementById('parse-button').disabled = true; - } else { - setData({ //Set the data packet - to: msg.to, - shipping: msg.shipping, - tax: msg.tax, - subtotal: msg.subtotal, - items: msg.items, - }); - validateInputs(); + } else if (msg.orders) { + if (msg.orders.length >= 1) { + setData({ //Set the data packet + to: msg.orders[0].to, + shipping: msg.orders[0].shipping, + tax: msg.orders[0].tax, + subtotal: msg.orders[0].subtotal, + items: msg.orders[0].items, + }); + orders = msg.orders; + showOrders(); + validateInputs(); + } } -}); +}); \ No newline at end of file diff --git a/PrinterPiExtension/main.html b/PrinterPiExtension/main.html index d070a36..91f1039 100644 --- a/PrinterPiExtension/main.html +++ b/PrinterPiExtension/main.html @@ -16,11 +16,12 @@

-
- +
+ +
-
- +
+
@@ -31,6 +32,11 @@
+
+
Current Order
+ +
Address
diff --git a/PrinterPiExtension/manifest.json b/PrinterPiExtension/manifest.json index 6cb7204..7633404 100644 --- a/PrinterPiExtension/manifest.json +++ b/PrinterPiExtension/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 2, "name": "PrinterPi", - "version": "6.2", + "version": "7.0", "description": "Parse eBay Print Shipping Label or PayPal Activity pages and send the data to an application that controls a receipt printer", "options_page": "options.html", diff --git a/PrinterPiExtension/options.html b/PrinterPiExtension/options.html index 80de4ba..0911ab9 100644 --- a/PrinterPiExtension/options.html +++ b/PrinterPiExtension/options.html @@ -8,7 +8,7 @@

PrinterPi Settings


-
Version: 6.0
+
Version: 7.0

Loading...