Spaces:
Running
Running
Update events.js
Browse files
events.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
| 2 |
|
| 3 |
import { appState, saveState } from './state.js';
|
| 4 |
import { handleUpdateStock, handleRestock } from './services.js';
|
| 5 |
-
import { refreshUI, showToast } from './ui.js';
|
| 6 |
|
| 7 |
export function attachAllListeners() {
|
| 8 |
attachProductInputListeners();
|
|
@@ -11,92 +11,28 @@ export function attachAllListeners() {
|
|
| 11 |
attachModalListeners();
|
| 12 |
}
|
| 13 |
|
| 14 |
-
|
| 15 |
-
document.querySelectorAll('.product-card .update-btn').forEach(btn => {
|
| 16 |
-
if (btn.dataset.listenerAttached) return;
|
| 17 |
-
btn.dataset.listenerAttached = true;
|
| 18 |
-
btn.addEventListener('click', (e) => {
|
| 19 |
-
const card = e.target.closest('.product-card');
|
| 20 |
-
const productName = card.dataset.productName;
|
| 21 |
-
const quantity = parseInt(card.querySelector('input').value, 10);
|
| 22 |
-
handleUpdateStock(productName, quantity);
|
| 23 |
-
});
|
| 24 |
-
});
|
| 25 |
-
}
|
| 26 |
-
|
| 27 |
-
function attachMaxStockEditListeners() {
|
| 28 |
-
document.querySelectorAll('.edit-max-stock').forEach(icon => {
|
| 29 |
-
if (icon.dataset.listenerAttached) return;
|
| 30 |
-
icon.dataset.listenerAttached = true;
|
| 31 |
-
icon.addEventListener('click', (e) => {
|
| 32 |
-
const valueSpan = e.target.previousElementSibling;
|
| 33 |
-
const materialName = e.target.closest('.material-card').dataset.materialName;
|
| 34 |
-
const material = appState.materials.find(m => m.name === materialName);
|
| 35 |
-
const input = document.createElement('input');
|
| 36 |
-
input.type = 'number';
|
| 37 |
-
input.value = material.maxStock;
|
| 38 |
-
input.className = 'w-20 text-right font-semibold border rounded px-1';
|
| 39 |
-
valueSpan.replaceWith(input);
|
| 40 |
-
input.focus();
|
| 41 |
-
input.select();
|
| 42 |
-
const saveChange = () => {
|
| 43 |
-
const newValue = parseInt(input.value, 10);
|
| 44 |
-
if (!isNaN(newValue) && newValue >= material.currentStock) {
|
| 45 |
-
material.maxStock = newValue;
|
| 46 |
-
saveState();
|
| 47 |
-
refreshUI();
|
| 48 |
-
} else {
|
| 49 |
-
showToast('Max stock must be a number >= current stock.', 'error');
|
| 50 |
-
refreshUI();
|
| 51 |
-
}
|
| 52 |
-
};
|
| 53 |
-
input.addEventListener('blur', saveChange);
|
| 54 |
-
input.addEventListener('keydown', (event) => { if (event.key === 'Enter') input.blur(); });
|
| 55 |
-
});
|
| 56 |
-
});
|
| 57 |
-
}
|
| 58 |
-
|
| 59 |
-
function attachRestockListeners() {
|
| 60 |
-
const showRestockForm = (e) => {
|
| 61 |
-
const parentEl = e.target.closest('[data-material-name]');
|
| 62 |
-
const materialName = parentEl.dataset.materialName;
|
| 63 |
-
const formContainer = parentEl.querySelector('.restock-form');
|
| 64 |
-
|
| 65 |
-
if (formContainer.classList.contains('hidden')) {
|
| 66 |
-
document.querySelectorAll('.restock-form').forEach(f => { f.classList.add('hidden'); f.innerHTML = ''; });
|
| 67 |
-
formContainer.classList.remove('hidden');
|
| 68 |
-
formContainer.innerHTML = `<div class="flex items-center gap-2"><input type="number" placeholder="Qty" class="input-number w-20 px-2 py-1 border border-gray-300 rounded"><button class="confirm-restock-btn px-3 py-1 bg-green-500 text-white text-xs rounded hover:bg-green-600">Add</button></div>`;
|
| 69 |
-
const input = formContainer.querySelector('input');
|
| 70 |
-
input.focus();
|
| 71 |
-
formContainer.querySelector('.confirm-restock-btn').addEventListener('click', () => { handleRestock(materialName, parseInt(input.value, 10)); });
|
| 72 |
-
input.addEventListener('keydown', (event) => { if (event.key === 'Enter') handleRestock(materialName, parseInt(input.value, 10)); if (event.key === 'Escape') formContainer.classList.add('hidden'); });
|
| 73 |
-
} else {
|
| 74 |
-
formContainer.classList.add('hidden');
|
| 75 |
-
formContainer.innerHTML = '';
|
| 76 |
-
}
|
| 77 |
-
};
|
| 78 |
-
document.querySelectorAll('.restock-icon, .restock-btn-reorder').forEach(btn => {
|
| 79 |
-
if (btn.dataset.listenerAttached) return;
|
| 80 |
-
btn.dataset.listenerAttached = true;
|
| 81 |
-
btn.addEventListener('click', showRestockForm);
|
| 82 |
-
});
|
| 83 |
-
}
|
| 84 |
|
| 85 |
function attachModalListeners() {
|
| 86 |
const resetModal = document.getElementById('reset-modal');
|
| 87 |
-
const
|
| 88 |
-
if (showResetModalBtn.dataset.listenerAttached) return;
|
| 89 |
-
|
| 90 |
-
const cancelResetBtn = document.getElementById('cancel-reset-btn');
|
| 91 |
-
const confirmResetBtn = document.getElementById('confirm-reset-btn');
|
| 92 |
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
window.location.reload();
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 102 |
}
|
|
|
|
| 2 |
|
| 3 |
import { appState, saveState } from './state.js';
|
| 4 |
import { handleUpdateStock, handleRestock } from './services.js';
|
| 5 |
+
import { refreshUI, showToast, renderReport } from './ui.js';
|
| 6 |
|
| 7 |
export function attachAllListeners() {
|
| 8 |
attachProductInputListeners();
|
|
|
|
| 11 |
attachModalListeners();
|
| 12 |
}
|
| 13 |
|
| 14 |
+
// ... attachProductInputListeners, attachMaxStockEditListeners, attachRestockListeners functions are the same ...
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
|
| 16 |
function attachModalListeners() {
|
| 17 |
const resetModal = document.getElementById('reset-modal');
|
| 18 |
+
const reportsModal = document.getElementById('reports-modal');
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
|
| 20 |
+
// Reset Modal
|
| 21 |
+
const showResetModalBtn = document.getElementById('show-reset-modal-btn');
|
| 22 |
+
if (!showResetModalBtn.dataset.listenerAttached) {
|
| 23 |
+
showResetModalBtn.addEventListener('click', () => resetModal.classList.remove('hidden'));
|
| 24 |
+
document.getElementById('cancel-reset-btn').addEventListener('click', () => resetModal.classList.add('hidden'));
|
| 25 |
+
document.getElementById('confirm-reset-btn').addEventListener('click', () => { window.location.reload(); });
|
| 26 |
+
showResetModalBtn.dataset.listenerAttached = true;
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
// Reports Modal
|
| 30 |
+
const showReportsModalBtn = document.getElementById('show-reports-modal-btn');
|
| 31 |
+
if (!showReportsModalBtn.dataset.listenerAttached) {
|
| 32 |
+
showReportsModalBtn.addEventListener('click', () => reportsModal.classList.remove('hidden'));
|
| 33 |
+
document.getElementById('close-reports-modal-btn').addEventListener('click', () => reportsModal.classList.add('hidden'));
|
| 34 |
+
document.getElementById('report-prod-summary').addEventListener('click', () => renderReport('production'));
|
| 35 |
+
document.getElementById('report-mat-usage').addEventListener('click', () => renderReport('material'));
|
| 36 |
+
showReportsModalBtn.dataset.listenerAttached = true;
|
| 37 |
+
}
|
| 38 |
}
|