diff --git a/public/app.js b/public/app.js index 42ea0bc..da4f64c 100644 --- a/public/app.js +++ b/public/app.js @@ -306,47 +306,71 @@ function addQuoteItem(item = null) { const itemsDiv = document.getElementById('quote-items'); const itemDiv = document.createElement('div'); - itemDiv.className = 'grid grid-cols-12 gap-3 items-start'; + itemDiv.className = 'border border-gray-300 rounded-lg mb-3'; itemDiv.id = `item-${itemId}`; + // Create summary text + const summaryQty = item ? item.quantity : ''; + const summaryDesc = item ? (item.description.replace(/<[^>]*>/g, '').substring(0, 50) + '...') : 'New item'; + const summaryAmount = item ? item.amount : ''; + itemDiv.innerHTML = ` -
- - -
-
- -
+ +
+
+ Qty: ${summaryQty} + ${summaryDesc} + $${summaryAmount} +
+
+ + +
-
-
- - -
-
- - -
-
- - -
-
- + + + `; @@ -375,6 +399,7 @@ function addQuoteItem(item = null) { // Save HTML content on change quill.on('text-change', () => { hiddenInput.value = quill.root.innerHTML; + updateItemSummary(itemId); updateTotals(); }); @@ -396,12 +421,17 @@ function addQuoteItem(item = null) { const amount = qty * rateValue; amountInput.value = amount.toFixed(2); } + updateItemSummary(itemId); updateTotals(); }; - // Add event listeners for auto-calculation + // Add event listeners for auto-calculation and summary update qtyInput.addEventListener('input', calculateAmount); rateInput.addEventListener('input', calculateAmount); + amountInput.addEventListener('input', () => { + updateItemSummary(itemId); + updateTotals(); + }); // Add event listeners for totals update itemDiv.querySelectorAll('.item-input, .item-amount').forEach(input => { @@ -438,6 +468,41 @@ function removeQuoteItem(itemId) { updateTotals(); } +function toggleItem(itemId) { + const itemDiv = document.getElementById(`item-${itemId}`); + const content = itemDiv.querySelector('.item-content'); + const chevron = itemDiv.querySelector('.item-chevron'); + + if (content.classList.contains('hidden')) { + content.classList.remove('hidden'); + chevron.style.transform = 'rotate(180deg)'; + } else { + content.classList.add('hidden'); + chevron.style.transform = 'rotate(0deg)'; + } +} + +function updateItemSummary(itemId) { + const itemDiv = document.getElementById(`item-${itemId}`); + const qtyInput = itemDiv.querySelector('[data-field="quantity"]'); + const amountInput = itemDiv.querySelector('[data-field="amount"]'); + const descEditor = itemDiv.querySelector('.item-description-editor'); + + // Update summary displays + const summaryQty = itemDiv.querySelector('.item-summary-qty'); + const summaryDesc = itemDiv.querySelector('.item-summary-desc'); + const summaryAmount = itemDiv.querySelector('.item-summary-amount'); + + if (summaryQty) summaryQty.textContent = qtyInput.value || '0'; + if (summaryAmount) summaryAmount.textContent = amountInput.value || '0.00'; + + if (summaryDesc && descEditor.quillInstance) { + const plainText = descEditor.quillInstance.getText().trim(); + const preview = plainText.substring(0, 60) + (plainText.length > 60 ? '...' : ''); + summaryDesc.textContent = preview || 'New item'; + } +} + function updateTotals() { const items = getQuoteItems(); const taxExempt = document.getElementById('quote-tax-exempt').checked; @@ -474,17 +539,18 @@ function getQuoteItems() { const itemDivs = document.querySelectorAll('#quote-items > div'); itemDivs.forEach(div => { - const descEditor = div.querySelector('.item-description-editor'); + const content = div.querySelector('.item-content'); + const descEditor = content.querySelector('.item-description-editor'); const descriptionHTML = descEditor && descEditor.quillInstance ? descEditor.quillInstance.root.innerHTML : ''; const item = { - quantity: div.querySelector('[data-field="quantity"]').value, + quantity: content.querySelector('[data-field="quantity"]').value, description: descriptionHTML, - rate: div.querySelector('[data-field="rate"]').value, - amount: div.querySelector('[data-field="amount"]').value, - is_tbd: div.querySelector('[data-field="is_tbd"]').checked + rate: content.querySelector('[data-field="rate"]').value, + amount: content.querySelector('[data-field="amount"]').value, + is_tbd: content.querySelector('[data-field="is_tbd"]').checked }; items.push(item); });