Aryanshh commited on
Commit
ceb478a
·
1 Parent(s): 6db75c6

feat: Intelligent cart grouping and relative arrival times

Browse files
Files changed (1) hide show
  1. dashboard/app.js +16 -5
dashboard/app.js CHANGED
@@ -62,14 +62,25 @@ async function updateState() {
62
  document.getElementById('chips-count').textContent = data.inventory.chips;
63
  document.getElementById('sensors-count').textContent = data.inventory.sensors;
64
 
65
- // Update Cart
66
  const cartContainer = document.getElementById('cart-container');
67
  if (data.active_shipments && data.active_shipments.length > 0) {
68
- cartContainer.innerHTML = data.active_shipments.map(ship => `
 
 
 
 
 
 
 
 
 
 
 
69
  <div class="cart-item">
70
  <div class="cart-type">${ship.part} (x${ship.quantity})</div>
71
  <div class="cart-meta">Mode: ${ship.mode.toUpperCase()}</div>
72
- <div class="arrival-day">Arrives Day: ${currentDay + ship.eta}</div>
73
  </div>
74
  `).join('');
75
  } else {
@@ -110,7 +121,7 @@ const modeSelect = document.getElementById('mode-select');
110
  function updatePreview() {
111
  const mode = modeSelect.value;
112
  const s = SPECS[mode];
113
- const cost = 10 * 1 * s.cost; // Qty 1 now
114
  const carbon = 1 * s.carbon;
115
 
116
  document.getElementById('preview-cost').textContent = `$${cost.toFixed(0)}`;
@@ -147,7 +158,7 @@ window.execute = async function(type, event) {
147
  spawnFeedback(`+1 ${part} added to order`, event.clientX, event.clientY);
148
  actionObj.part_type = part;
149
  actionObj.mode = document.getElementById('mode-select').value;
150
- actionObj.quantity = 1; // Change to 1 as requested
151
  } else if (type === 'produce') {
152
  actionObj.product = document.getElementById('product-select').value;
153
  } else if (type === 'offset') {
 
62
  document.getElementById('chips-count').textContent = data.inventory.chips;
63
  document.getElementById('sensors-count').textContent = data.inventory.sensors;
64
 
65
+ // Update Cart with Grouping & Relative Time
66
  const cartContainer = document.getElementById('cart-container');
67
  if (data.active_shipments && data.active_shipments.length > 0) {
68
+ // Group by part and eta
69
+ const grouped = data.active_shipments.reduce((acc, ship) => {
70
+ const key = `${ship.part}-${ship.eta}`;
71
+ if (!acc[key]) {
72
+ acc[key] = { ...ship };
73
+ } else {
74
+ acc[key].quantity += ship.quantity;
75
+ }
76
+ return acc;
77
+ }, {});
78
+
79
+ cartContainer.innerHTML = Object.values(grouped).map(ship => `
80
  <div class="cart-item">
81
  <div class="cart-type">${ship.part} (x${ship.quantity})</div>
82
  <div class="cart-meta">Mode: ${ship.mode.toUpperCase()}</div>
83
+ <div class="arrival-day">Arrives in: ${ship.eta} days</div>
84
  </div>
85
  `).join('');
86
  } else {
 
121
  function updatePreview() {
122
  const mode = modeSelect.value;
123
  const s = SPECS[mode];
124
+ const cost = 10 * 1 * s.cost;
125
  const carbon = 1 * s.carbon;
126
 
127
  document.getElementById('preview-cost').textContent = `$${cost.toFixed(0)}`;
 
158
  spawnFeedback(`+1 ${part} added to order`, event.clientX, event.clientY);
159
  actionObj.part_type = part;
160
  actionObj.mode = document.getElementById('mode-select').value;
161
+ actionObj.quantity = 1;
162
  } else if (type === 'produce') {
163
  actionObj.product = document.getElementById('product-select').value;
164
  } else if (type === 'offset') {