excel import
This commit is contained in:
@@ -1214,6 +1214,7 @@ body, .container-fluid {
|
||||
<th>#</th>
|
||||
<th>Order ID</th>
|
||||
<th>Mark No</th>
|
||||
<th>Date</th>
|
||||
<th>Origin</th>
|
||||
<th>Destination</th>
|
||||
<th>Total CTN</th>
|
||||
@@ -1225,7 +1226,6 @@ body, .container-fluid {
|
||||
<th>Total KG</th>
|
||||
<th>Total TTL KG</th>
|
||||
<th>Status</th>
|
||||
<th>Date</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -1441,6 +1441,13 @@ body, .container-fluid {
|
||||
<button type="submit" class="btn btn-info" id="addItemBtn">
|
||||
<i class="bi bi-plus-circle"></i> Add Item
|
||||
</button>
|
||||
|
||||
<input type="file" id="excelInput" accept=".xlsx,.xls" hidden>
|
||||
|
||||
<button type="button" class="btn btn-outline-success" id="uploadExcelBtn">
|
||||
<i class="bi bi-file-earmark-excel"></i> Upload Excel
|
||||
</button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@@ -1918,6 +1925,75 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
e.target.closest('tr').remove();
|
||||
reindexRows();
|
||||
});
|
||||
|
||||
// ===== EXCEL UPLOAD LOGIC =====
|
||||
const uploadExcelBtn = document.getElementById('uploadExcelBtn');
|
||||
const excelInput = document.getElementById('excelInput');
|
||||
|
||||
if (uploadExcelBtn && excelInput) {
|
||||
|
||||
uploadExcelBtn.addEventListener('click', () => excelInput.click());
|
||||
|
||||
excelInput.addEventListener('change', function () {
|
||||
const file = this.files[0];
|
||||
if (!file) return;
|
||||
|
||||
const formData = new FormData();
|
||||
formData.append('excel', file);
|
||||
formData.append('_token', '{{ csrf_token() }}');
|
||||
|
||||
fetch('{{ route("admin.orders.upload.excel.preview") }}', {
|
||||
method: 'POST',
|
||||
body: formData,
|
||||
headers: {
|
||||
'Accept': 'application/json'
|
||||
}
|
||||
})
|
||||
.then(async res => {
|
||||
if (!res.ok) {
|
||||
const text = await res.text();
|
||||
throw new Error(text);
|
||||
}
|
||||
return res.json();
|
||||
})
|
||||
.then(res => {
|
||||
if (!res.success) {
|
||||
alert('Invalid Excel file');
|
||||
return;
|
||||
}
|
||||
populateItemsTable(res.items);
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
alert('Excel upload failed');
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function populateItemsTable(items) {
|
||||
itemsTableBody.innerHTML = '';
|
||||
|
||||
items.forEach((item, index) => {
|
||||
addRow(index);
|
||||
const row = itemsTableBody.children[index];
|
||||
|
||||
row.querySelector('[data-field="description"]').value = item.description ?? '';
|
||||
row.querySelector('[data-field="ctn"]').value = item.ctn ?? '';
|
||||
row.querySelector('[data-field="qty"]').value = item.qty ?? '';
|
||||
row.querySelector('[data-field="ttl_qty"]').value = item.ttl_qty ?? '';
|
||||
row.querySelector('[data-field="unit"]').value = item.unit ?? '';
|
||||
row.querySelector('[data-field="price"]').value = item.price ?? '';
|
||||
row.querySelector('[data-field="ttl_amount"]').value = item.ttl_amount ?? '';
|
||||
row.querySelector('[data-field="cbm"]').value = item.cbm ?? '';
|
||||
row.querySelector('[data-field="ttl_cbm"]').value = item.ttl_cbm ?? '';
|
||||
row.querySelector('[data-field="kg"]').value = item.kg ?? '';
|
||||
row.querySelector('[data-field="ttl_kg"]').value = item.ttl_kg ?? '';
|
||||
row.querySelector('[data-field="shop_no"]').value = item.shop_no ?? '';
|
||||
});
|
||||
|
||||
reindexRows();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user