Spaces:
Sleeping
Sleeping
| import { formatClock, kindLabel } from '../models.mjs'; | |
| export function renderData({ currentPlan, dataBody, onRecommend }) { | |
| dataBody.innerHTML = ''; | |
| dataBody.appendChild(buildVehicleTable(currentPlan)); | |
| dataBody.appendChild(buildDeliveryTable(currentPlan, onRecommend)); | |
| } | |
| function buildVehicleTable(currentPlan) { | |
| const wrapper = SF.el('div'); | |
| wrapper.appendChild(SF.el('h4', null, 'Vehicles')); | |
| const table = SF.el('table', { className: 'deliveries-table' }); | |
| table.appendChild( | |
| SF.el( | |
| 'thead', | |
| null, | |
| SF.el( | |
| 'tr', | |
| null, | |
| SF.el('th', null, 'Name'), | |
| SF.el('th', null, 'Depot'), | |
| SF.el('th', null, 'Capacity'), | |
| SF.el('th', null, 'Departure'), | |
| ), | |
| ), | |
| ); | |
| const body = SF.el('tbody'); | |
| currentPlan.vehicles.forEach((vehicle) => { | |
| body.appendChild( | |
| SF.el( | |
| 'tr', | |
| null, | |
| SF.el('td', null, vehicle.name), | |
| SF.el('td', null, `${vehicle.homeLat.toFixed(4)}, ${vehicle.homeLng.toFixed(4)}`), | |
| SF.el('td', null, String(vehicle.capacity)), | |
| SF.el('td', null, formatClock(vehicle.departureTime)), | |
| ), | |
| ); | |
| }); | |
| table.appendChild(body); | |
| wrapper.appendChild(table); | |
| return wrapper; | |
| } | |
| function buildDeliveryTable(currentPlan, onRecommend) { | |
| const wrapper = SF.el('div'); | |
| wrapper.appendChild(SF.el('h4', null, 'Deliveries')); | |
| const table = SF.el('table', { className: 'deliveries-table' }); | |
| table.appendChild(buildDeliveryHeader()); | |
| const body = SF.el('tbody'); | |
| const previewDeliveries = currentPlan.viewState.preview.deliveries; | |
| previewDeliveries.forEach((deliveryPreview) => { | |
| const recommendButton = SF.createButton({ text: 'Recommend', variant: 'ghost', size: 'small' }); | |
| recommendButton.addEventListener('click', () => onRecommend(deliveryPreview.deliveryId)); | |
| body.appendChild(buildDeliveryRow(deliveryPreview, recommendButton)); | |
| }); | |
| table.appendChild(body); | |
| wrapper.appendChild(table); | |
| return wrapper; | |
| } | |
| function buildDeliveryHeader() { | |
| return SF.el( | |
| 'thead', | |
| null, | |
| SF.el( | |
| 'tr', | |
| null, | |
| SF.el('th', null, 'Label'), | |
| SF.el('th', null, 'Kind'), | |
| SF.el('th', null, 'Window'), | |
| SF.el('th', null, 'Demand'), | |
| SF.el('th', null, 'Assignment'), | |
| SF.el('th', null, 'Actions'), | |
| ), | |
| ); | |
| } | |
| function buildDeliveryRow(deliveryPreview, recommendButton) { | |
| return SF.el( | |
| 'tr', | |
| null, | |
| SF.el('td', null, deliveryPreview.label), | |
| SF.el('td', null, kindLabel(deliveryPreview.kind)), | |
| SF.el( | |
| 'td', | |
| null, | |
| `${formatClock(deliveryPreview.minStartTime)} to ${formatClock(deliveryPreview.maxEndTime)}`, | |
| ), | |
| SF.el('td', null, String(deliveryPreview.demand)), | |
| SF.el('td', null, deliveryPreview.assignedVehicleName || 'Unassigned'), | |
| SF.el( | |
| 'td', | |
| null, | |
| SF.el('div', { className: 'deliveries-actions-inline' }, recommendButton), | |
| ), | |
| ); | |
| } | |