Spaces:
Sleeping
Sleeping
Aryanshh commited on
Commit ·
6029f5c
1
Parent(s): 47e37f8
ux: Add click feedback (+1) and stabilize side-by-side layout
Browse files- dashboard/app.js +20 -8
dashboard/app.js
CHANGED
|
@@ -51,7 +51,7 @@ async function updateState() {
|
|
| 51 |
if (!response.ok) throw new Error('API Unreachable');
|
| 52 |
const data = await response.json();
|
| 53 |
|
| 54 |
-
currentDay = data.step;
|
| 55 |
|
| 56 |
const status = document.getElementById('connection-status');
|
| 57 |
status.textContent = 'ONLINE';
|
|
@@ -62,7 +62,7 @@ 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 => `
|
|
@@ -110,8 +110,8 @@ const modeSelect = document.getElementById('mode-select');
|
|
| 110 |
function updatePreview() {
|
| 111 |
const mode = modeSelect.value;
|
| 112 |
const s = SPECS[mode];
|
| 113 |
-
const cost = 10 *
|
| 114 |
-
const carbon =
|
| 115 |
|
| 116 |
document.getElementById('preview-cost').textContent = `$${cost.toFixed(0)}`;
|
| 117 |
document.getElementById('preview-carbon').textContent = `+${carbon.toFixed(1)}kg CO2`;
|
|
@@ -119,6 +119,16 @@ function updatePreview() {
|
|
| 119 |
|
| 120 |
modeSelect.addEventListener('change', updatePreview);
|
| 121 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 122 |
function log(message, type = 'system') {
|
| 123 |
const box = document.getElementById('activity-log');
|
| 124 |
const entry = document.createElement('p');
|
|
@@ -128,14 +138,16 @@ function log(message, type = 'system') {
|
|
| 128 |
}
|
| 129 |
|
| 130 |
// Global Execute Function
|
| 131 |
-
window.execute = async function(type) {
|
| 132 |
document.querySelector('main').classList.add('transitioning');
|
| 133 |
|
| 134 |
let actionObj = { action_type: type };
|
| 135 |
if (type === 'order_parts') {
|
| 136 |
-
|
|
|
|
|
|
|
| 137 |
actionObj.mode = document.getElementById('mode-select').value;
|
| 138 |
-
actionObj.quantity =
|
| 139 |
} else if (type === 'produce') {
|
| 140 |
actionObj.product = document.getElementById('product-select').value;
|
| 141 |
} else if (type === 'offset') {
|
|
@@ -238,7 +250,7 @@ async function triggerSuezJam() {
|
|
| 238 |
}
|
| 239 |
}
|
| 240 |
|
| 241 |
-
document.getElementById('skip-btn').addEventListener('click', () => window.execute('skip'));
|
| 242 |
document.getElementById('trigger-btn').addEventListener('click', triggerSuezJam);
|
| 243 |
document.getElementById('reset-btn').addEventListener('click', manualReset);
|
| 244 |
|
|
|
|
| 51 |
if (!response.ok) throw new Error('API Unreachable');
|
| 52 |
const data = await response.json();
|
| 53 |
|
| 54 |
+
currentDay = data.step;
|
| 55 |
|
| 56 |
const status = document.getElementById('connection-status');
|
| 57 |
status.textContent = 'ONLINE';
|
|
|
|
| 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 => `
|
|
|
|
| 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)}`;
|
| 117 |
document.getElementById('preview-carbon').textContent = `+${carbon.toFixed(1)}kg CO2`;
|
|
|
|
| 119 |
|
| 120 |
modeSelect.addEventListener('change', updatePreview);
|
| 121 |
|
| 122 |
+
function spawnFeedback(text, x, y) {
|
| 123 |
+
const el = document.createElement('div');
|
| 124 |
+
el.className = 'floating-feedback';
|
| 125 |
+
el.textContent = text;
|
| 126 |
+
el.style.left = `${x}px`;
|
| 127 |
+
el.style.top = `${y}px`;
|
| 128 |
+
document.body.appendChild(el);
|
| 129 |
+
setTimeout(() => el.remove(), 1000);
|
| 130 |
+
}
|
| 131 |
+
|
| 132 |
function log(message, type = 'system') {
|
| 133 |
const box = document.getElementById('activity-log');
|
| 134 |
const entry = document.createElement('p');
|
|
|
|
| 138 |
}
|
| 139 |
|
| 140 |
// Global Execute Function
|
| 141 |
+
window.execute = async function(type, event) {
|
| 142 |
document.querySelector('main').classList.add('transitioning');
|
| 143 |
|
| 144 |
let actionObj = { action_type: type };
|
| 145 |
if (type === 'order_parts') {
|
| 146 |
+
const part = document.getElementById('part-select').value;
|
| 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') {
|
|
|
|
| 250 |
}
|
| 251 |
}
|
| 252 |
|
| 253 |
+
document.getElementById('skip-btn').addEventListener('click', (e) => window.execute('skip', e));
|
| 254 |
document.getElementById('trigger-btn').addEventListener('click', triggerSuezJam);
|
| 255 |
document.getElementById('reset-btn').addEventListener('click', manualReset);
|
| 256 |
|