shipment Changes

This commit is contained in:
Utkarsh Khedkar
2025-12-24 13:34:44 +05:30
parent 82882e859e
commit f38a5afdd7
3 changed files with 1013 additions and 346 deletions

View File

@@ -632,24 +632,49 @@ body, .container-fluid {
}
.create-order-modal .table-wrapper {
max-height: 300px;
width: 100%;
max-height: 400px;
overflow-y: auto;
overflow-x: hidden !important; /* NO HORIZONTAL SCROLL */
border: 1px solid #e9ecef;
border-radius: 8px;
border-radius: 12px;
background: #fff;
box-shadow: 0 4px 20px rgba(0,0,0,0.08);
padding: 12px;
position: relative;
}
.create-order-modal .table {
.create-order-modal .table-wrapper .table {
margin-bottom: 0;
background: #fff;
min-width: 100% !important; /* FULL RESPONSIVE WIDTH */
font-size: 13px;
border-collapse: separate;
border-spacing: 0;
}
.create-order-modal .table th {
background: #f8f9fa;
font-weight: 600;
position: sticky;
top: 0;
z-index: 10;
font-family: 'Inter', sans-serif;
.create-order-modal .table th,
.create-order-modal .table td {
padding: 8px 6px !important;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 120px;
vertical-align: middle;
}
.create-order-modal .table th:nth-child(2), /* Description */
.create-order-modal .table td:nth-child(2) { max-width: 160px; }
.create-order-modal .table th:nth-child(9), /* TTL Amount */
.create-order-modal .table td:nth-child(9) { max-width: 90px; font-weight: 600; }
.create-order-modal .table .items-input {
width: 100%;
padding: 4px 6px;
font-size: 12px;
min-width: 60px;
max-width: 120px;
}
/* items table inputs */
@@ -1311,6 +1336,7 @@ body, .container-fluid {
</a>
</td>
<td>{{ $order->mark_no }}</td>
<td>{{ $order->created_at->format('d-m-Y') }}</td>
<td>{{ $order->origin }}</td>
<td>{{ $order->destination }}</td>
<td>{{ $order->ctn }}</td>
@@ -1322,20 +1348,48 @@ body, .container-fluid {
<td>{{ $order->kg }}</td>
<td>{{ $order->ttl_kg }}</td>
<td>
<span class="badge badge-{{ $order->status }}">
@if($order->status == 'pending')
<i class="bi bi-clock-fill status-icon"></i>
@elseif($order->status == 'in_transit')
<i class="bi bi-truck status-icon"></i>
@elseif($order->status == 'dispatched')
<i class="bi bi-box-seam status-icon"></i>
@elseif($order->status == 'delivered')
<i class="bi bi-check-circle-fill status-icon"></i>
@endif
{{ ucfirst(str_replace('_', ' ', $order->status)) }}
@php
// Badge color mapping
$badgeMap = [
'order_placed' => 'secondary',
'order_confirmed' => 'info',
'supplier_warehouse' => 'warning',
'consolidate_warehouse' => 'warning',
'export_custom' => 'primary',
'international_transit' => 'primary',
'arrived_india' => 'info',
'import_custom' => 'info',
'warehouse' => 'dark',
'domestic_distribution' => 'primary',
'out_for_delivery' => 'success',
'delivered' => 'success',
];
// Icon mapping
$iconMap = [
'order_placed' => 'bi-clock-fill',
'order_confirmed' => 'bi-check-circle',
'supplier_warehouse' => 'bi-box-seam',
'consolidate_warehouse' => 'bi-boxes',
'export_custom' => 'bi-upload',
'international_transit' => 'bi-truck',
'arrived_india' => 'bi-geo-alt',
'import_custom' => 'bi-download',
'warehouse' => 'bi-building',
'domestic_distribution' => 'bi-diagram-3',
'out_for_delivery' => 'bi-truck-flatbed',
'delivered' => 'bi-check-circle-fill',
];
$badgeClass = $badgeMap[$order->status] ?? 'secondary';
$iconClass = $iconMap[$order->status] ?? 'bi-info-circle';
@endphp
<span class="badge bg-{{ $badgeClass }}">
<i class="bi {{ $iconClass }} status-icon"></i>
{{ $order->status_label }}
</span>
</td>
<td>{{ $order->created_at->format('d-m-Y') }}</td>
<td>
<a href="{{ route('admin.orders.show', $order->id) }}" class="btn btn-sm btn-outline-primary">
<i class="bi bi-eye"></i> View
@@ -1350,76 +1404,9 @@ body, .container-fluid {
</tbody>
</table>
</div>
<td>{{ $order->mark_no }}</td>
<td>{{ $order->origin }}</td>
<td>{{ $order->destination }}</td>
<td>{{ $order->ctn }}</td>
<td>{{ $order->qty }}</td>
<td>{{ $order->ttl_qty }}</td>
<td>{{ number_format($order->ttl_amount, 2) }}</td>
<td>{{ $order->cbm }}</td>
<td>{{ $order->ttl_cbm }}</td>
<td>{{ $order->kg }}</td>
<td>{{ $order->ttl_kg }}</td>
<td>
@php
// Badge color mapping
$badgeMap = [
'order_placed' => 'secondary',
'order_confirmed' => 'info',
'supplier_warehouse' => 'warning',
'consolidate_warehouse' => 'warning',
'export_custom' => 'primary',
'international_transit' => 'primary',
'arrived_india' => 'info',
'import_custom' => 'info',
'warehouse' => 'dark',
'domestic_distribution' => 'primary',
'out_for_delivery' => 'success',
'delivered' => 'success',
];
// Icon mapping
$iconMap = [
'order_placed' => 'bi-clock-fill',
'order_confirmed' => 'bi-check-circle',
'supplier_warehouse' => 'bi-box-seam',
'consolidate_warehouse' => 'bi-boxes',
'export_custom' => 'bi-upload',
'international_transit' => 'bi-truck',
'arrived_india' => 'bi-geo-alt',
'import_custom' => 'bi-download',
'warehouse' => 'bi-building',
'domestic_distribution' => 'bi-diagram-3',
'out_for_delivery' => 'bi-truck-flatbed',
'delivered' => 'bi-check-circle-fill',
];
$badgeClass = $badgeMap[$order->status] ?? 'secondary';
$iconClass = $iconMap[$order->status] ?? 'bi-info-circle';
@endphp
<span class="badge bg-{{ $badgeClass }}">
<i class="bi {{ $iconClass }} status-icon"></i>
{{ $order->status_label }}
</span>
</td>
<td>{{ $order->created_at->format('d-m-Y') }}</td>
<td>
<a href="{{ route('admin.orders.show', $order->id) }}" class="btn btn-sm btn-outline-primary">
<i class="bi bi-eye"></i> View
</a>
</td>
</tr>
@empty
<tr>
<td colspan="16" class="text-muted">No orders found</td>
</tr>
@endforelse
</tbody>
</table>
<div class="pagination-container">
<div class="pagination-info" id="pageInfo">
Showing 1 to {{ min($orders->count(), 10) }} of {{ $orders->count() }} entries
</div>
<div class="pagination-controls">
<button class="pagination-img-btn" id="prevPageBtn" title="Previous page">
@@ -1447,7 +1434,6 @@ body, .container-fluid {
</button>
</div>
</div>
</div>
</div>
</div>
@@ -1923,6 +1909,7 @@ document.addEventListener('DOMContentLoaded', function() {
</a>
</td>
<td>${order.mark_no || ''}</td>
<td>${new Date(order.created_at).toLocaleDateString('en-GB')}</td>
<td>${order.origin || ''}</td>
<td>${order.destination || ''}</td>
<td>${order.ctn || ''}</td>
@@ -1934,15 +1921,11 @@ document.addEventListener('DOMContentLoaded', function() {
<td>${order.kg || ''}</td>
<td>${order.ttl_kg || ''}</td>
<td>
<span class="badge badge-${order.status}">
${order.status === 'pending' ? '<i class="bi bi-clock-fill status-icon"></i>' : ''}
${order.status === 'in_transit' ? '<i class="bi bi-truck status-icon"></i>' : ''}
${order.status === 'dispatched' ? '<i class="bi bi-box-seam status-icon"></i>' : ''}
${order.status === 'delivered' ? '<i class="bi bi-check-circle-fill status-icon"></i>' : ''}
${order.status ? order.status.charAt(0).toUpperCase() + order.status.slice(1).replace('_', ' ') : ''}
<span class="badge bg-${getBadgeClass(order.status)}">
<i class="bi ${getIconClass(order.status)} status-icon"></i>
${order.status_label || order.status}
</span>
</td>
<td>${new Date(order.created_at).toLocaleDateString('en-GB')}</td>
<td>
<a href="/admin/orders/${order.id}" class="btn btn-sm btn-outline-primary">
<i class="bi bi-eye"></i> View
@@ -1976,6 +1959,50 @@ document.addEventListener('DOMContentLoaded', function() {
});
}
function getBadgeClass(status) {
const badgeMap = {
'order_placed': 'secondary',
'order_confirmed': 'info',
'supplier_warehouse': 'warning',
'consolidate_warehouse': 'warning',
'export_custom': 'primary',
'international_transit': 'primary',
'arrived_india': 'info',
'import_custom': 'info',
'warehouse': 'dark',
'domestic_distribution': 'primary',
'out_for_delivery': 'success',
'delivered': 'success',
'pending': 'warning',
'in_transit': 'info',
'dispatched': 'primary',
'delivered': 'success'
};
return badgeMap[status] || 'secondary';
}
function getIconClass(status) {
const iconMap = {
'order_placed': 'bi-clock-fill',
'order_confirmed': 'bi-check-circle',
'supplier_warehouse': 'bi-box-seam',
'consolidate_warehouse': 'bi-boxes',
'export_custom': 'bi-upload',
'international_transit': 'bi-truck',
'arrived_india': 'bi-geo-alt',
'import_custom': 'bi-download',
'warehouse': 'bi-building',
'domestic_distribution': 'bi-diagram-3',
'out_for_delivery': 'bi-truck-flatbed',
'delivered': 'bi-check-circle-fill',
'pending': 'bi-clock-fill',
'in_transit': 'bi-truck',
'dispatched': 'bi-box-seam',
'delivered': 'bi-check-circle-fill'
};
return iconMap[status] || 'bi-info-circle';
}
itemsTableBody.addEventListener('keydown', function(e) {
if (e.key !== 'Enter' || e.target.tagName !== 'INPUT') return;
e.preventDefault();
@@ -2024,74 +2051,72 @@ document.addEventListener('DOMContentLoaded', function() {
reindexRows();
});
// ===== EXCEL UPLOAD LOGIC =====
const uploadExcelBtn = document.getElementById('uploadExcelBtn');
const excelInput = document.getElementById('excelInput');
// ===== EXCEL UPLOAD LOGIC =====
const uploadExcelBtn = document.getElementById('uploadExcelBtn');
const excelInput = document.getElementById('excelInput');
if (uploadExcelBtn && excelInput) {
if (uploadExcelBtn && excelInput) {
uploadExcelBtn.addEventListener('click', () => excelInput.click());
uploadExcelBtn.addEventListener('click', () => excelInput.click());
excelInput.addEventListener('change', function () {
const file = this.files[0];
if (!file) return;
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() }}');
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');
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 = '';
function populateItemsTable(items) {
itemsTableBody.innerHTML = '';
items.forEach((item, index) => {
addRow(index);
const row = itemsTableBody.children[index];
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 ?? '';
});
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();
}
reindexRows();
}
});
</script>
@@ -2103,4 +2128,4 @@ document.addEventListener("hidden.bs.modal", function () {
});
</script>
@endsection
@endsection