-
Notifications
You must be signed in to change notification settings - Fork 134
/
Copy pathadmin.js
94 lines (90 loc) · 3.94 KB
/
admin.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import axios from 'axios'
import moment from 'moment'
import Noty from 'noty'
export function initAdmin(socket) {
const orderTableBody = document.querySelector('#orderTableBody')
let orders = []
let markup
axios.get('/admin/orders', {
headers: {
"X-Requested-With": "XMLHttpRequest"
}
}).then(res => {
orders = res.data
markup = generateMarkup(orders)
orderTableBody.innerHTML = markup
}).catch(err => {
console.log(err)
})
function renderItems(items) {
let parsedItems = Object.values(items)
return parsedItems.map((menuItem) => {
return `
<p>${ menuItem.item.name } - ${ menuItem.qty } pcs </p>
`
}).join('')
}
function generateMarkup(orders) {
return orders.map(order => {
return `
<tr>
<td class="border px-4 py-2 text-green-900">
<p>${ order._id }</p>
<div>${ renderItems(order.items) }</div>
</td>
<td class="border px-4 py-2">${ order.customerId.name }</td>
<td class="border px-4 py-2">${ order.address }</td>
<td class="border px-4 py-2">
<div class="inline-block relative w-64">
<form action="/admin/order/status" method="POST">
<input type="hidden" name="orderId" value="${ order._id }">
<select name="status" onchange="this.form.submit()"
class="block appearance-none w-full bg-white border border-gray-400 hover:border-gray-500 px-4 py-2 pr-8 rounded shadow leading-tight focus:outline-none focus:shadow-outline">
<option value="order_placed"
${ order.status === 'order_placed' ? 'selected' : '' }>
Placed</option>
<option value="confirmed" ${ order.status === 'confirmed' ? 'selected' : '' }>
Confirmed</option>
<option value="prepared" ${ order.status === 'prepared' ? 'selected' : '' }>
Prepared</option>
<option value="delivered" ${ order.status === 'delivered' ? 'selected' : '' }>
Delivered
</option>
<option value="completed" ${ order.status === 'completed' ? 'selected' : '' }>
Completed
</option>
</select>
</form>
<div
class="pointer-events-none absolute inset-y-0 right-0 flex items-center px-2 text-gray-700">
<svg class="fill-current h-4 w-4" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20">
<path
d="M9.293 12.95l.707.707L15.657 8l-1.414-1.414L10 10.828 5.757 6.586 4.343 8z" />
</svg>
</div>
</div>
</td>
<td class="border px-4 py-2">
${ moment(order.createdAt).format('hh:mm A') }
</td>
<td class="border px-4 py-2">
${ order.paymentStatus ? 'paid' : 'Not paid' }
</td>
</tr>
`
}).join('')
}
// Socket
socket.on('orderPlaced', (order) => {
new Noty({
type: 'success',
timeout: 1000,
text: 'New order!',
progressBar: false,
}).show();
orders.unshift(order)
orderTableBody.innerHTML = ''
orderTableBody.innerHTML = generateMarkup(orders)
})
}