From ef83dba4a83e23e38b67ee31b79e79c9e25a003d Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Fri, 21 Apr 2017 16:03:11 -0400 Subject: display orders per product, download as csv --- client/components/OrderList.jsx | 121 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 client/components/OrderList.jsx (limited to 'client/components/OrderList.jsx') diff --git a/client/components/OrderList.jsx b/client/components/OrderList.jsx new file mode 100644 index 0000000..5b0380b --- /dev/null +++ b/client/components/OrderList.jsx @@ -0,0 +1,121 @@ +import React from 'react' +import state_lookup from '../state_lookup' +import saveAs from 'browser-saveas' +import csvStringify from 'csv-stringify' + +export default class OrderList extends React.Component { + constructor(props) { + super() + this.downloadCsv = this.downloadCsv.bind(this) + } + downloadCsv() { + const orders = this.parseOrders().map((order) => { + return [ + order.order_id, + order.order_date, + order.order_checkout_type, + order.order_ship_name, + order.order_company, + order.order_address1, + order.order_address2, + order.order_city, + state_lookup(order.order_state), + order.order_zip, + order.order_country !== 'United States' ? '' : order.order_country, + ] + }) + csvStringify(orders, (err, csv) => { + const blob = new Blob([csv], {type : 'text/plain;charset=utf-8'}) + saveAs(blob, this.props.product.product_name.replace(/\s+/g,"") +'.csv') + }) + } + parseOrders() { + return this.props.orders.filter( (order) => { + // also filter where order.order_status == 3 (paid in full) ? + // filter weird blank orders if found + return !! order.order_ship_name + }).map( (order, i) => { + const name = order.order_ship_name + .toUpperCase() + .replace(/(Sr|Jr|I|II|III|IV)\.?$/i, "") + .split(" ") + .reverse()[0] + return [ name, order ] + }).sort((a,b) => { + return a[0] < b[0] ? -1 : a[0] === b[0] ? 0 : 1 + }).map((pair, i) => { + return pair[1] + }) + } + render() { + if (! this.props.product) { + return (
) + } + if (! this.props.orders) { + return (
Loading...
) + } + if (! this.props.orders.length) { + return (
No orders found
) + } + + const items = this.parseOrders().map((order, i) => { + const order_link = ( + + (order) + + ) + const customer_link = order.order_checkout_type === 'guest' ? '' : ( + + (customer) + + ) + let order_name, order_address + if (order.order_company && order.order_company !== order.order_ship_name) { + order_name = ( + + {order.order_ship_name}
+ {order.order_company} +
+ ) + } + else { + order_name = order.order_ship_name + } + if (order.order_address2 && order.order_address2 !== order.order_address1) { + order_address = ( + + {order.order_address1}
+ {order.order_address2} +
+ ) + } + else { + order_address = order.order_address1 + } + + const country = order.order_country !== 'United States' ? order.order_country : "" + return ( +
+
+ {order_link} {customer_link} +
+
+ {order_name}
+ {order_address}
+ {order.order_city}, {state_lookup(order.order_state)} {order.order_zip} {country} +
+
+ ) + }) + + return ( +
+ this.downloadCsv()}>Download CSV + {items} +
+
+
+
+ ) + } +} \ No newline at end of file -- cgit v1.2.3-70-g09d2