var subtotal = 0; var editingSpecialId = null; var activeCatalogueTags = []; var activeCakeTags = []; function openSpecialCakeOverlay() { editingSpecialId = null; document.getElementById('sc-overlay-title').textContent = 'Dodaj tort specjalny'; document.getElementById('sc-name').value = ''; document.getElementById('sc-price').value = ''; document.getElementById('sc-size').value = ''; document.getElementById('sc-shape').value = ''; document.getElementById('sc-flavour').value = ''; document.getElementById('sc-notes').value = ''; document.getElementById('sc-new-tag').value = ''; var cbs = document.querySelectorAll('.sc-tag-cb'); for (var i = 0; i < cbs.length; i++) cbs[i].checked = false; document.getElementById('sc-overlay').classList.add('open'); document.getElementById('sc-name').focus(); } function closeSpecialCakeOverlay() { document.getElementById('sc-overlay').classList.remove('open'); editingSpecialId = null; } function getOverlayFormData() { return { name: document.getElementById('sc-name').value.trim(), price: document.getElementById('sc-price').value, size: document.getElementById('sc-size').value.trim(), shape: document.getElementById('sc-shape').value, flavour: document.getElementById('sc-flavour').value.trim(), notes: document.getElementById('sc-notes').value.trim(), tagIds: (function() { var ids = []; var cbs = document.querySelectorAll('.sc-tag-cb:checked'); for (var i = 0; i < cbs.length; i++) ids.push(cbs[i].value); return ids; })(), tagNames: (function() { var names = []; var cbs = document.querySelectorAll('.sc-tag-cb:checked'); for (var i = 0; i < cbs.length; i++) names.push(cbs[i].closest('.tag-chip').textContent.trim()); return names; })(), newTag: document.getElementById('sc-new-tag').value.trim() }; } function buildSpecialCakeHTML(d) { var parts = []; if (d.size) parts.push(d.size); if (d.flavour) parts.push(d.flavour); if (d.shape === 'round') parts.push('okragly'); else if (d.shape === 'square') parts.push('kwadrat'); if (d.notes) parts.push('notatka: ' + d.notes); var detail = parts.length ? parts.join(', ') : ''; var tagHtml = d.tagNames.length > 0 || d.newTag ? '
' : ''; for (var i = 0; i < d.tagNames.length; i++) tagHtml += '' + d.tagNames[i] + ''; if (d.newTag) tagHtml += '' + d.newTag + ''; if (d.tagNames.length > 0 || d.newTag) tagHtml += '
'; var priceVal = Number(d.price).toFixed(2); var tagIdsStr = d.tagIds.join(','); var html = '
' + '
' + d.name + '
' + '
' + detail + '
' + tagHtml + '
' + '
' + priceVal + ' PLN
' + '
' + '' + '' + '
' + '' + '' + '' + '' + '' + '' + ''; if (d.newTag) html += ''; return html; } function saveSpecialCake() { var d = getOverlayFormData(); if (!d.name) return; if (editingSpecialId) { var item = document.querySelector('#basket-items li[data-special-id="' + editingSpecialId + '"]'); if (item) { item.innerHTML = buildSpecialCakeHTML(d); } } else { d.id = Date.now(); var item = document.createElement('li'); item.setAttribute('data-special-id', d.id); item.innerHTML = buildSpecialCakeHTML(d); document.getElementById('basket-items').appendChild(item); } closeSpecialCakeOverlay(); updateTotals(); } function editSpecialCake(btn) { var item = btn.closest('li'); var id = item.getAttribute('data-special-id'); editingSpecialId = id; document.getElementById('sc-overlay-title').textContent = 'Edytuj tort specjalny'; var hidden = item.querySelectorAll('input[type="hidden"]'); var vals = {}; for (var i = 0; i < hidden.length; i++) { var name = hidden[i].getAttribute('name'); vals[name] = hidden[i].value; } document.getElementById('sc-name').value = vals['special_name[]'] || ''; document.getElementById('sc-price').value = vals['special_price[]'] || ''; document.getElementById('sc-size').value = vals['special_size[]'] || ''; document.getElementById('sc-shape').value = vals['special_shape[]'] || ''; document.getElementById('sc-flavour').value = vals['special_flavour[]'] || ''; document.getElementById('sc-notes').value = vals['special_notes[]'] || ''; var currentTagIds = (vals['special_tags[]'] || '').split(',').filter(function(x) { return x; }); document.getElementById('sc-new-tag').value = ''; var cbs = document.querySelectorAll('.sc-tag-cb'); for (var i = 0; i < cbs.length; i++) { cbs[i].checked = currentTagIds.indexOf(cbs[i].value) >= 0; } document.getElementById('sc-overlay').classList.add('open'); document.getElementById('sc-name').focus(); } function removeSpecialCake(btn) { btn.closest('li').remove(); updateTotals(); } function changeCake(id, name, price, delta) { var input = document.querySelector('[name="cake[' + id + ']"]'); if (input != null) { var qty = Number(input.value) + delta; if (qty <= 0) { input.closest('li').remove(); updateTotals(); updateCatalogueQty(id, 0); return; } input.value = qty; var item = input.closest('li'); item.querySelector('.qty').innerText = qty; item.querySelector('.price').innerText = price * qty + ' PLN'; updateTotals(); updateCatalogueQty(id, qty); return; } if (delta <= 0) return; var item = document.createElement('li'); item.setAttribute('data-cake-id', id); item.innerHTML = '
' + '
' + name + '
' + '
' + price + ' PLN × 1
' + '
' + '
' + price + ' PLN
' + '' + ''; document.getElementById('basket-items').appendChild(item); updateTotals(); updateCatalogueQty(id, 1); } function removeCake(btn) { var item = btn.closest('li'); var id = item.getAttribute('data-cake-id'); item.remove(); updateTotals(); updateCatalogueQty(id, 0); } function updatePrepaid() { var paid = Number(document.querySelector('[name="paid"]')?.value || 0); document.getElementById('paid-amount').innerText = paid.toFixed(2) + ' PLN'; document.getElementById('total-price').innerText = (subtotal - paid).toFixed(2) + ' PLN'; } function updateTotals() { subtotal = 0; var items = document.querySelectorAll('#basket-items li'); items.forEach(function (item) { var priceText = item.querySelector('.price').innerText; var price = Number(priceText.split(' ')[0]); if (item.hasAttribute('data-special-id')) { subtotal += price; } else { var qty = Number(item.querySelector('.qty').innerText); subtotal += price * qty; } }); document.getElementById('subtotal-price').innerText = subtotal.toFixed(2) + ' PLN'; updatePrepaid(); } function updateCatalogueQty(id, qty) { var el = document.getElementById('qty-' + id); if (el) el.innerText = qty; } function toggleCatalogueTagFilter(btn) { var tag = btn.getAttribute('data-tag'); var idx = activeCatalogueTags.indexOf(tag); if (idx >= 0) { activeCatalogueTags.splice(idx, 1); btn.classList.remove('active'); } else { activeCatalogueTags.push(tag); btn.classList.add('active'); } applyCatalogueFilters(); } function getCatalogueTextQuery() { var input = document.querySelector('#catalogue-grid').closest('.card').querySelector('input[type="text"]'); return input ? input.value.toLowerCase() : ''; } function applyCatalogueFilters() { var query = getCatalogueTextQuery(); var items = document.querySelectorAll('#catalogue-grid > li'); items.forEach(function (item) { var name = item.getAttribute('data-name').toLowerCase(); var matchesText = name.includes(query); var matchesTags = true; if (activeCatalogueTags.length > 0) { var itemTags = (item.getAttribute('data-tags') || '').split(','); for (var i = 0; i < activeCatalogueTags.length; i++) { if (itemTags.indexOf(activeCatalogueTags[i]) < 0) { matchesTags = false; break; } } } item.classList.toggle('hide', !(matchesText && matchesTags)); }); } function filterCatalogue(input) { applyCatalogueFilters(); } function toggleCakeTagFilter(btn) { var tag = btn.getAttribute('data-tag'); var idx = activeCakeTags.indexOf(tag); if (idx >= 0) { activeCakeTags.splice(idx, 1); btn.classList.remove('active'); } else { activeCakeTags.push(tag); btn.classList.add('active'); } var rows = document.querySelectorAll('#cakes-card tbody tr'); for (var i = 0; i < rows.length; i++) { if (activeCakeTags.length === 0) { rows[i].classList.remove('hide'); continue; } var rowTags = (rows[i].getAttribute('data-tags') || '').split(','); var match = false; for (var j = 0; j < activeCakeTags.length; j++) { if (rowTags.indexOf(activeCakeTags[j]) >= 0) { match = true; break; } } rows[i].classList.toggle('hide', !match); } } function filterOrders(input) { var q = input.value.toLowerCase(); var table = input.closest('.card').querySelector('.data-table'); if (!table) return; var rows = table.querySelectorAll('tbody tr'); for (var i = 0; i < rows.length; i++) { var id = rows[i].children[0].textContent.toLowerCase(); var customer = rows[i].children[1].textContent.toLowerCase(); rows[i].classList.toggle('hide', !(id.includes(q) || customer.includes(q))); } } function setLocation(btn, value) { var group = btn.closest('.toggle-group'); group.querySelectorAll('.toggle-btn').forEach(function(b) { b.classList.remove('active'); }); btn.classList.add('active'); group.querySelector('input[type="hidden"]').value = value; } function confirmBlockedDate(form) { var date = form.querySelector('[name="date"]').value; var blocked = JSON.parse(form.getAttribute('data-blocked-dates') || '[]'); var hasSpecial = form.querySelector('[name="special_name[]"]'); if (hasSpecial && blocked.indexOf(date) >= 0) { return confirm('Data ' + date + ' jest zablokowana dla zamówień z tortami specjalnymi. Czy na pewno chcesz kontynuować?'); } return true; } function initOrderPage() { var form = document.querySelector('.order-form'); if (!form) return; var state = form.getAttribute('data-state'); if (state) { try { var data = JSON.parse(state); for (var id in data) { updateCatalogueQty(Number(id), data[id]); } } catch(e) {} } updateTotals(); } function setActiveLink() { var path = window.location.pathname; var links = document.querySelectorAll('nav > a'); for (var i = 0; i < links.length; i++) { links[i].classList.toggle('active', links[i].getAttribute('href') === path); } } document.addEventListener('DOMContentLoaded', function() { setActiveLink(); initOrderPage(); }); document.addEventListener('htmx:afterSettle', function() { setActiveLink(); initOrderPage(); });