link fix and formatting chagnes in js

This commit is contained in:
bronku 2026-06-16 14:20:48 +02:00
parent 4cfa559718
commit 922478bdeb
3 changed files with 231 additions and 169 deletions

View file

@ -31,13 +31,13 @@ func New(store *store.Store) *Server {
mux := http.NewServeMux() mux := http.NewServeMux()
mux.HandleFunc("GET /", redirect("/orders", http.StatusSeeOther)) mux.HandleFunc("GET /", redirect("/orders", http.StatusSeeOther))
mux.HandleFunc("GET /order/", server.render(server.order)) mux.HandleFunc("GET /order", server.render(server.order))
mux.HandleFunc("GET /orders", server.render(server.orders)) mux.HandleFunc("GET /orders", server.render(server.orders))
mux.HandleFunc("GET /cake/", server.render(server.cake)) mux.HandleFunc("GET /cake", server.render(server.cake))
mux.HandleFunc("GET /cakes", server.render(server.cakes)) mux.HandleFunc("GET /cakes", server.render(server.cakes))
mux.HandleFunc("POST /order/", server.render(server.postOrder)) mux.HandleFunc("POST /order", server.render(server.postOrder))
mux.HandleFunc("POST /order/{id}/status", server.render(server.updateStatus)) mux.HandleFunc("POST /order/{id}/status", server.render(server.updateStatus))
mux.HandleFunc("POST /cake/", server.render(server.postCake)) mux.HandleFunc("POST /cake", server.render(server.postCake))
mux.HandleFunc("GET /blocked", server.render(server.blocked)) mux.HandleFunc("GET /blocked", server.render(server.blocked))
mux.HandleFunc("POST /blocked", server.render(server.postBlocked)) mux.HandleFunc("POST /blocked", server.render(server.postBlocked))
mux.HandleFunc("POST /blocked/{id}/delete", server.render(server.deleteBlocked)) mux.HandleFunc("POST /blocked/{id}/delete", server.render(server.deleteBlocked))

View file

@ -5,47 +5,48 @@ var activeCakeTags = [];
function openSpecialCakeOverlay() { function openSpecialCakeOverlay() {
editingSpecialId = null; editingSpecialId = null;
document.getElementById('sc-overlay-title').textContent = 'Dodaj tort specjalny'; document.getElementById("sc-overlay-title").textContent =
document.getElementById('sc-name').value = ''; "Dodaj tort specjalny";
document.getElementById('sc-price').value = ''; document.getElementById("sc-name").value = "";
document.getElementById('sc-size').value = ''; document.getElementById("sc-price").value = "";
document.getElementById('sc-shape').value = ''; document.getElementById("sc-size").value = "";
document.getElementById('sc-flavour').value = ''; document.getElementById("sc-shape").value = "";
document.getElementById('sc-notes').value = ''; document.getElementById("sc-flavour").value = "";
document.getElementById('sc-new-tag').value = ''; document.getElementById("sc-notes").value = "";
var cbs = document.querySelectorAll('.sc-tag-cb'); 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; for (var i = 0; i < cbs.length; i++) cbs[i].checked = false;
document.getElementById('sc-overlay').classList.add('open'); document.getElementById("sc-overlay").classList.add("open");
document.getElementById('sc-name').focus(); document.getElementById("sc-name").focus();
} }
function closeSpecialCakeOverlay() { function closeSpecialCakeOverlay() {
document.getElementById('sc-overlay').classList.remove('open'); document.getElementById("sc-overlay").classList.remove("open");
editingSpecialId = null; editingSpecialId = null;
} }
function getOverlayFormData() { function getOverlayFormData() {
return { return {
name: document.getElementById('sc-name').value.trim(), name: document.getElementById("sc-name").value.trim(),
price: document.getElementById('sc-price').value, price: document.getElementById("sc-price").value,
size: document.getElementById('sc-size').value.trim(), size: document.getElementById("sc-size").value.trim(),
shape: document.getElementById('sc-shape').value, shape: document.getElementById("sc-shape").value,
flavour: document.getElementById('sc-flavour').value.trim(), flavour: document.getElementById("sc-flavour").value.trim(),
notes: document.getElementById('sc-notes').value.trim(), notes: document.getElementById("sc-notes").value.trim(),
tagIds: (function() { tagIds: (function () {
var ids = []; var ids = [];
var cbs = document.querySelectorAll('.sc-tag-cb:checked'); var cbs = document.querySelectorAll(".sc-tag-cb:checked");
for (var i = 0; i < cbs.length; i++) ids.push(cbs[i].value); for (var i = 0; i < cbs.length; i++) ids.push(cbs[i].value);
return ids; return ids;
})(), })(),
tagNames: (function() { tagNames: (function () {
var names = []; var names = [];
var cbs = document.querySelectorAll('.sc-tag-cb:checked'); var cbs = document.querySelectorAll(".sc-tag-cb:checked");
for (var i = 0; i < cbs.length; i++) for (var i = 0; i < cbs.length; i++)
names.push(cbs[i].closest('.tag-chip').textContent.trim()); names.push(cbs[i].closest(".tag-chip").textContent.trim());
return names; return names;
})(), })(),
newTag: document.getElementById('sc-new-tag').value.trim() newTag: document.getElementById("sc-new-tag").value.trim(),
}; };
} }
@ -53,40 +54,61 @@ function buildSpecialCakeHTML(d) {
var parts = []; var parts = [];
if (d.size) parts.push(d.size); if (d.size) parts.push(d.size);
if (d.flavour) parts.push(d.flavour); if (d.flavour) parts.push(d.flavour);
if (d.shape === 'round') parts.push('okragly'); if (d.shape === "round") parts.push("okragly");
else if (d.shape === 'square') parts.push('kwadrat'); else if (d.shape === "square") parts.push("kwadrat");
if (d.notes) parts.push('notatka: ' + d.notes); if (d.notes) parts.push("notatka: " + d.notes);
var detail = parts.length ? parts.join(', ') : ''; var detail = parts.length ? parts.join(", ") : "";
var tagHtml = d.tagNames.length > 0 || d.newTag ? '<div class="basket-item-tags">' : ''; var tagHtml =
d.tagNames.length > 0 || d.newTag ? '<div class="basket-item-tags">' : "";
for (var i = 0; i < d.tagNames.length; i++) for (var i = 0; i < d.tagNames.length; i++)
tagHtml += '<span class="tag-chip sm">' + d.tagNames[i] + '</span>'; tagHtml += '<span class="tag-chip sm">' + d.tagNames[i] + "</span>";
if (d.newTag) if (d.newTag) tagHtml += '<span class="tag-chip sm">' + d.newTag + "</span>";
tagHtml += '<span class="tag-chip sm">' + d.newTag + '</span>'; if (d.tagNames.length > 0 || d.newTag) tagHtml += "</div>";
if (d.tagNames.length > 0 || d.newTag) tagHtml += '</div>';
var priceVal = Number(d.price).toFixed(2); var priceVal = Number(d.price).toFixed(2);
var tagIdsStr = d.tagIds.join(','); var tagIdsStr = d.tagIds.join(",");
var html = var html =
'<div class="basket-item-body">' + '<div class="basket-item-body">' +
'<div class="name">' + d.name + '</div>' + '<div class="name">' +
'<div class="detail">' + detail + '</div>' + d.name +
"</div>" +
'<div class="detail">' +
detail +
"</div>" +
tagHtml + tagHtml +
'</div>' + "</div>" +
'<div class="price">' + priceVal + ' PLN</div>' + '<div class="price">' +
priceVal +
" PLN</div>" +
'<div class="basket-item-actions">' + '<div class="basket-item-actions">' +
'<button type="button" class="btn-icon" onclick="editSpecialCake(this)" title="Edytuj">' + '<button type="button" class="btn-icon" onclick="editSpecialCake(this)" title="Edytuj">' +
'<span class="material-symbols-outlined">edit</span></button>' + '<span class="material-symbols-outlined">edit</span></button>' +
'<button type="button" class="remove" onclick="removeSpecialCake(this)" title="Usuń">' + '<button type="button" class="remove" onclick="removeSpecialCake(this)" title="Usuń">' +
'<span class="material-symbols-outlined">close</span></button>' + '<span class="material-symbols-outlined">close</span></button>' +
'</div>' + "</div>" +
'<input type="hidden" name="special_name[]" value="' + d.name + '">' + '<input type="hidden" name="special_name[]" value="' +
'<input type="hidden" name="special_price[]" value="' + d.price + '">' + d.name +
'<input type="hidden" name="special_size[]" value="' + d.size + '">' + '">' +
'<input type="hidden" name="special_shape[]" value="' + d.shape + '">' + '<input type="hidden" name="special_price[]" value="' +
'<input type="hidden" name="special_flavour[]" value="' + d.flavour + '">' + d.price +
'<input type="hidden" name="special_notes[]" value="' + d.notes + '">' + '">' +
'<input type="hidden" name="special_tags[]" value="' + tagIdsStr + '">'; '<input type="hidden" name="special_size[]" value="' +
d.size +
'">' +
'<input type="hidden" name="special_shape[]" value="' +
d.shape +
'">' +
'<input type="hidden" name="special_flavour[]" value="' +
d.flavour +
'">' +
'<input type="hidden" name="special_notes[]" value="' +
d.notes +
'">' +
'<input type="hidden" name="special_tags[]" value="' +
tagIdsStr +
'">';
if (d.newTag) if (d.newTag)
html += '<input type="hidden" name="special_new_tag[]" value="' + d.newTag + '">'; html +=
'<input type="hidden" name="special_new_tag[]" value="' + d.newTag + '">';
return html; return html;
} }
@ -94,50 +116,57 @@ function saveSpecialCake() {
var d = getOverlayFormData(); var d = getOverlayFormData();
if (!d.name) return; if (!d.name) return;
if (editingSpecialId) { if (editingSpecialId) {
var item = document.querySelector('#basket-items li[data-special-id="' + editingSpecialId + '"]'); var item = document.querySelector(
'#basket-items li[data-special-id="' + editingSpecialId + '"]',
);
if (item) { if (item) {
item.innerHTML = buildSpecialCakeHTML(d); item.innerHTML = buildSpecialCakeHTML(d);
} }
} else { } else {
d.id = Date.now(); d.id = Date.now();
var item = document.createElement('li'); var item = document.createElement("li");
item.setAttribute('data-special-id', d.id); item.setAttribute("data-special-id", d.id);
item.innerHTML = buildSpecialCakeHTML(d); item.innerHTML = buildSpecialCakeHTML(d);
document.getElementById('basket-items').appendChild(item); document.getElementById("basket-items").appendChild(item);
} }
closeSpecialCakeOverlay(); closeSpecialCakeOverlay();
updateTotals(); updateTotals();
} }
function editSpecialCake(btn) { function editSpecialCake(btn) {
var item = btn.closest('li'); var item = btn.closest("li");
var id = item.getAttribute('data-special-id'); var id = item.getAttribute("data-special-id");
editingSpecialId = id; editingSpecialId = id;
document.getElementById('sc-overlay-title').textContent = 'Edytuj tort specjalny'; document.getElementById("sc-overlay-title").textContent =
"Edytuj tort specjalny";
var hidden = item.querySelectorAll('input[type="hidden"]'); var hidden = item.querySelectorAll('input[type="hidden"]');
var vals = {}; var vals = {};
for (var i = 0; i < hidden.length; i++) { for (var i = 0; i < hidden.length; i++) {
var name = hidden[i].getAttribute('name'); var name = hidden[i].getAttribute("name");
vals[name] = hidden[i].value; vals[name] = hidden[i].value;
} }
document.getElementById('sc-name').value = vals['special_name[]'] || ''; document.getElementById("sc-name").value = vals["special_name[]"] || "";
document.getElementById('sc-price').value = vals['special_price[]'] || ''; document.getElementById("sc-price").value = vals["special_price[]"] || "";
document.getElementById('sc-size').value = vals['special_size[]'] || ''; document.getElementById("sc-size").value = vals["special_size[]"] || "";
document.getElementById('sc-shape').value = vals['special_shape[]'] || ''; document.getElementById("sc-shape").value = vals["special_shape[]"] || "";
document.getElementById('sc-flavour').value = vals['special_flavour[]'] || ''; document.getElementById("sc-flavour").value = vals["special_flavour[]"] || "";
document.getElementById('sc-notes').value = vals['special_notes[]'] || ''; document.getElementById("sc-notes").value = vals["special_notes[]"] || "";
var currentTagIds = (vals['special_tags[]'] || '').split(',').filter(function(x) { return x; }); var currentTagIds = (vals["special_tags[]"] || "")
document.getElementById('sc-new-tag').value = ''; .split(",")
var cbs = document.querySelectorAll('.sc-tag-cb'); .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++) { for (var i = 0; i < cbs.length; i++) {
cbs[i].checked = currentTagIds.indexOf(cbs[i].value) >= 0; cbs[i].checked = currentTagIds.indexOf(cbs[i].value) >= 0;
} }
document.getElementById('sc-overlay').classList.add('open'); document.getElementById("sc-overlay").classList.add("open");
document.getElementById('sc-name').focus(); document.getElementById("sc-name").focus();
} }
function removeSpecialCake(btn) { function removeSpecialCake(btn) {
btn.closest('li').remove(); btn.closest("li").remove();
updateTotals(); updateTotals();
} }
@ -146,40 +175,48 @@ function changeCake(id, name, price, delta) {
if (input != null) { if (input != null) {
var qty = Number(input.value) + delta; var qty = Number(input.value) + delta;
if (qty <= 0) { if (qty <= 0) {
input.closest('li').remove(); input.closest("li").remove();
updateTotals(); updateTotals();
updateCatalogueQty(id, 0); updateCatalogueQty(id, 0);
return; return;
} }
input.value = qty; input.value = qty;
var item = input.closest('li'); var item = input.closest("li");
item.querySelector('.qty').innerText = qty; item.querySelector(".qty").innerText = qty;
item.querySelector('.price').innerText = price * qty + ' PLN'; item.querySelector(".price").innerText = price * qty + " PLN";
updateTotals(); updateTotals();
updateCatalogueQty(id, qty); updateCatalogueQty(id, qty);
return; return;
} }
if (delta <= 0) return; if (delta <= 0) return;
var item = document.createElement('li'); var item = document.createElement("li");
item.setAttribute('data-cake-id', id); item.setAttribute("data-cake-id", id);
item.innerHTML = item.innerHTML =
'<div class="basket-item-body">' + '<div class="basket-item-body">' +
'<div class="name">' + name + '</div>' + '<div class="name">' +
'<div class="detail">' + price + ' PLN × <span class="qty">1</span></div>' + name +
'</div>' + "</div>" +
'<div class="price">' + price + ' PLN</div>' + '<div class="detail">' +
price +
' PLN × <span class="qty">1</span></div>' +
"</div>" +
'<div class="price">' +
price +
" PLN</div>" +
'<button type="button" class="remove" onclick="removeCake(this)">' + '<button type="button" class="remove" onclick="removeCake(this)">' +
'<span class="material-symbols-outlined">close</span>' + '<span class="material-symbols-outlined">close</span>' +
'</button>' + "</button>" +
'<input type="hidden" name="cake[' + id + ']" value="1">'; '<input type="hidden" name="cake[' +
document.getElementById('basket-items').appendChild(item); id +
']" value="1">';
document.getElementById("basket-items").appendChild(item);
updateTotals(); updateTotals();
updateCatalogueQty(id, 1); updateCatalogueQty(id, 1);
} }
function removeCake(btn) { function removeCake(btn) {
var item = btn.closest('li'); var item = btn.closest("li");
var id = item.getAttribute('data-cake-id'); var id = item.getAttribute("data-cake-id");
item.remove(); item.remove();
updateTotals(); updateTotals();
updateCatalogueQty(id, 0); updateCatalogueQty(id, 0);
@ -187,59 +224,64 @@ function removeCake(btn) {
function updatePrepaid() { function updatePrepaid() {
var paid = Number(document.querySelector('[name="paid"]')?.value || 0); var paid = Number(document.querySelector('[name="paid"]')?.value || 0);
document.getElementById('paid-amount').innerText = paid.toFixed(2) + ' PLN'; document.getElementById("paid-amount").innerText = paid.toFixed(2) + " PLN";
document.getElementById('total-price').innerText = (subtotal - paid).toFixed(2) + ' PLN'; document.getElementById("total-price").innerText =
(subtotal - paid).toFixed(2) + " PLN";
} }
function updateTotals() { function updateTotals() {
subtotal = 0; subtotal = 0;
var items = document.querySelectorAll('#basket-items li'); var items = document.querySelectorAll("#basket-items li");
items.forEach(function (item) { items.forEach(function (item) {
var priceText = item.querySelector('.price').innerText; var priceText = item.querySelector(".price").innerText;
var price = Number(priceText.split(' ')[0]); var price = Number(priceText.split(" ")[0]);
if (item.hasAttribute('data-special-id')) { if (item.hasAttribute("data-special-id")) {
subtotal += price; subtotal += price;
} else { } else {
var qty = Number(item.querySelector('.qty').innerText); var qty = Number(item.querySelector(".qty").innerText);
subtotal += price * qty; subtotal += price * qty;
} }
}); });
document.getElementById('subtotal-price').innerText = subtotal.toFixed(2) + ' PLN'; document.getElementById("subtotal-price").innerText =
subtotal.toFixed(2) + " PLN";
updatePrepaid(); updatePrepaid();
} }
function updateCatalogueQty(id, qty) { function updateCatalogueQty(id, qty) {
var el = document.getElementById('qty-' + id); var el = document.getElementById("qty-" + id);
if (el) el.innerText = qty; if (el) el.innerText = qty;
} }
function toggleCatalogueTagFilter(btn) { function toggleCatalogueTagFilter(btn) {
var tag = btn.getAttribute('data-tag'); var tag = btn.getAttribute("data-tag");
var idx = activeCatalogueTags.indexOf(tag); var idx = activeCatalogueTags.indexOf(tag);
if (idx >= 0) { if (idx >= 0) {
activeCatalogueTags.splice(idx, 1); activeCatalogueTags.splice(idx, 1);
btn.classList.remove('active'); btn.classList.remove("active");
} else { } else {
activeCatalogueTags.push(tag); activeCatalogueTags.push(tag);
btn.classList.add('active'); btn.classList.add("active");
} }
applyCatalogueFilters(); applyCatalogueFilters();
} }
function getCatalogueTextQuery() { function getCatalogueTextQuery() {
var input = document.querySelector('#catalogue-grid').closest('.card').querySelector('input[type="text"]'); var input = document
return input ? input.value.toLowerCase() : ''; .querySelector("#catalogue-grid")
.closest(".card")
.querySelector('input[type="text"]');
return input ? input.value.toLowerCase() : "";
} }
function applyCatalogueFilters() { function applyCatalogueFilters() {
var query = getCatalogueTextQuery(); var query = getCatalogueTextQuery();
var items = document.querySelectorAll('#catalogue-grid > li'); var items = document.querySelectorAll("#catalogue-grid > li");
items.forEach(function (item) { items.forEach(function (item) {
var name = item.getAttribute('data-name').toLowerCase(); var name = item.getAttribute("data-name").toLowerCase();
var matchesText = name.includes(query); var matchesText = name.includes(query);
var matchesTags = true; var matchesTags = true;
if (activeCatalogueTags.length > 0) { if (activeCatalogueTags.length > 0) {
var itemTags = (item.getAttribute('data-tags') || '').split(','); var itemTags = (item.getAttribute("data-tags") || "").split(",");
for (var i = 0; i < activeCatalogueTags.length; i++) { for (var i = 0; i < activeCatalogueTags.length; i++) {
if (itemTags.indexOf(activeCatalogueTags[i]) < 0) { if (itemTags.indexOf(activeCatalogueTags[i]) < 0) {
matchesTags = false; matchesTags = false;
@ -247,7 +289,7 @@ function applyCatalogueFilters() {
} }
} }
} }
item.classList.toggle('hide', !(matchesText && matchesTags)); item.classList.toggle("hide", !(matchesText && matchesTags));
}); });
} }
@ -256,126 +298,151 @@ function filterCatalogue(input) {
} }
function toggleCakeTagFilter(btn) { function toggleCakeTagFilter(btn) {
var tag = btn.getAttribute('data-tag'); var tag = btn.getAttribute("data-tag");
var idx = activeCakeTags.indexOf(tag); var idx = activeCakeTags.indexOf(tag);
if (idx >= 0) { if (idx >= 0) {
activeCakeTags.splice(idx, 1); activeCakeTags.splice(idx, 1);
btn.classList.remove('active'); btn.classList.remove("active");
} else { } else {
activeCakeTags.push(tag); activeCakeTags.push(tag);
btn.classList.add('active'); btn.classList.add("active");
} }
var rows = document.querySelectorAll('#cakes-card tbody tr'); var rows = document.querySelectorAll("#cakes-card tbody tr");
for (var i = 0; i < rows.length; i++) { for (var i = 0; i < rows.length; i++) {
if (activeCakeTags.length === 0) { rows[i].classList.remove('hide'); continue; } if (activeCakeTags.length === 0) {
var rowTags = (rows[i].getAttribute('data-tags') || '').split(','); rows[i].classList.remove("hide");
continue;
}
var rowTags = (rows[i].getAttribute("data-tags") || "").split(",");
var match = false; var match = false;
for (var j = 0; j < activeCakeTags.length; j++) { for (var j = 0; j < activeCakeTags.length; j++) {
if (rowTags.indexOf(activeCakeTags[j]) >= 0) { match = true; break; } if (rowTags.indexOf(activeCakeTags[j]) >= 0) {
match = true;
break;
}
} }
rows[i].classList.toggle('hide', !match); rows[i].classList.toggle("hide", !match);
} }
} }
function filterOrders(input) { function filterOrders(input) {
var q = input.value.toLowerCase(); var q = input.value.toLowerCase();
var table = input.closest('.card').querySelector('.data-table'); var table = input.closest(".card").querySelector(".data-table");
if (!table) return; if (!table) return;
var rows = table.querySelectorAll('tbody tr'); var rows = table.querySelectorAll("tbody tr");
for (var i = 0; i < rows.length; i++) { for (var i = 0; i < rows.length; i++) {
var id = rows[i].children[0].textContent.toLowerCase(); var id = rows[i].children[0].textContent.toLowerCase();
var customer = rows[i].children[1].textContent.toLowerCase(); var customer = rows[i].children[1].textContent.toLowerCase();
rows[i].classList.toggle('hide', !(id.includes(q) || customer.includes(q))); rows[i].classList.toggle("hide", !(id.includes(q) || customer.includes(q)));
} }
} }
function setLocation(btn, value) { function setLocation(btn, value) {
var group = btn.closest('.toggle-group'); var group = btn.closest(".toggle-group");
group.querySelectorAll('.toggle-btn').forEach(function(b) { b.classList.remove('active'); }); group.querySelectorAll(".toggle-btn").forEach(function (b) {
btn.classList.add('active'); b.classList.remove("active");
});
btn.classList.add("active");
group.querySelector('input[type="hidden"]').value = value; group.querySelector('input[type="hidden"]').value = value;
} }
function confirmBlockedDate(form) { function confirmBlockedDate(form) {
var date = form.querySelector('[name="date"]').value; var date = form.querySelector('[name="date"]').value;
var blocked = JSON.parse(form.getAttribute('data-blocked-dates') || '[]'); var blocked = JSON.parse(form.getAttribute("data-blocked-dates") || "[]");
var hasSpecial = form.querySelector('[name="special_name[]"]'); var hasSpecial = form.querySelector('[name="special_name[]"]');
if (hasSpecial && blocked.indexOf(date) >= 0) { if (hasSpecial && blocked.indexOf(date) >= 0) {
return confirm('Data ' + date + ' jest zablokowana dla zamówień z tortami specjalnymi. Czy na pewno chcesz kontynuować?'); return confirm(
"Data " +
date +
" jest zablokowana dla zamówień z tortami specjalnymi. Czy na pewno chcesz kontynuować?",
);
} }
return true; return true;
} }
function initOrderPage() { function initOrderPage() {
var form = document.querySelector('.order-form'); var form = document.querySelector(".order-form");
if (!form) return; if (!form) return;
var state = form.getAttribute('data-state'); var state = form.getAttribute("data-state");
if (state) { if (state) {
try { try {
var data = JSON.parse(state); var data = JSON.parse(state);
for (var id in data) { for (var id in data) {
updateCatalogueQty(Number(id), data[id]); updateCatalogueQty(Number(id), data[id]);
} }
} catch(e) {} } catch (e) {}
} }
updateTotals(); updateTotals();
} }
function setActiveLink() { function setActiveLink() {
var path = window.location.pathname; var path = window.location.pathname;
var links = document.querySelectorAll('nav > a'); if (path === "/cake") {
path = "/cakes";
}
console.log(path);
var links = document.querySelectorAll("nav > a");
for (var i = 0; i < links.length; i++) { for (var i = 0; i < links.length; i++) {
links[i].classList.toggle('active', links[i].getAttribute('href') === path); links[i].classList.toggle("active", links[i].getAttribute("href") === path);
} }
} }
function viewSpecialCake(btn) { function viewSpecialCake(btn) {
var tr = btn.closest('tr'); var tr = btn.closest("tr");
document.getElementById('sc-view-title').textContent = tr.getAttribute('data-sc-name'); document.getElementById("sc-view-title").textContent =
document.getElementById('sc-view-name').textContent = tr.getAttribute('data-sc-name'); tr.getAttribute("data-sc-name");
document.getElementById('sc-view-price').textContent = tr.getAttribute('data-sc-price') + ' PLN'; document.getElementById("sc-view-name").textContent =
document.getElementById('sc-view-size').textContent = tr.getAttribute('data-sc-size') || '—'; tr.getAttribute("data-sc-name");
var shapeVal = tr.getAttribute('data-sc-shape'); document.getElementById("sc-view-price").textContent =
var shapeText = ''; tr.getAttribute("data-sc-price") + " PLN";
if (shapeVal === 'round') shapeText = 'Okrągły'; document.getElementById("sc-view-size").textContent =
else if (shapeVal === 'square') shapeText = 'Kwadrat'; tr.getAttribute("data-sc-size") || "—";
else shapeText = shapeVal || '—'; var shapeVal = tr.getAttribute("data-sc-shape");
document.getElementById('sc-view-shape').textContent = shapeText; var shapeText = "";
document.getElementById('sc-view-flavour').textContent = tr.getAttribute('data-sc-flavour') || '—'; if (shapeVal === "round") shapeText = "Okrągły";
document.getElementById('sc-view-notes').textContent = tr.getAttribute('data-sc-notes') || '—'; else if (shapeVal === "square") shapeText = "Kwadrat";
document.getElementById('sc-view-client').textContent = tr.getAttribute('data-sc-client'); else shapeText = shapeVal || "—";
document.getElementById('sc-view-date').textContent = tr.getAttribute('data-sc-date'); document.getElementById("sc-view-shape").textContent = shapeText;
var tagsStr = tr.getAttribute('data-sc-tags'); document.getElementById("sc-view-flavour").textContent =
var tagsContainer = document.getElementById('sc-view-tags'); tr.getAttribute("data-sc-flavour") || "—";
tagsContainer.innerHTML = ''; document.getElementById("sc-view-notes").textContent =
tr.getAttribute("data-sc-notes") || "—";
document.getElementById("sc-view-client").textContent =
tr.getAttribute("data-sc-client");
document.getElementById("sc-view-date").textContent =
tr.getAttribute("data-sc-date");
var tagsStr = tr.getAttribute("data-sc-tags");
var tagsContainer = document.getElementById("sc-view-tags");
tagsContainer.innerHTML = "";
if (tagsStr) { if (tagsStr) {
var tagNames = tagsStr.split(','); var tagNames = tagsStr.split(",");
for (var i = 0; i < tagNames.length; i++) { for (var i = 0; i < tagNames.length; i++) {
if (tagNames[i].trim()) { if (tagNames[i].trim()) {
var tag = document.createElement('span'); var tag = document.createElement("span");
tag.className = 'tag-chip sm'; tag.className = "tag-chip sm";
tag.textContent = tagNames[i].trim(); tag.textContent = tagNames[i].trim();
tagsContainer.appendChild(tag); tagsContainer.appendChild(tag);
} }
} }
document.getElementById('sc-view-tags-field').classList.remove('hide'); document.getElementById("sc-view-tags-field").classList.remove("hide");
} else { } else {
document.getElementById('sc-view-tags-field').classList.add('hide'); document.getElementById("sc-view-tags-field").classList.add("hide");
} }
document.getElementById('sc-view-order-link').href = '/order/' + tr.getAttribute('data-sc-order-id'); document.getElementById("sc-view-order-link").href =
document.getElementById('sc-view-overlay').classList.add('open'); "/order/" + tr.getAttribute("data-sc-order-id");
document.getElementById("sc-view-overlay").classList.add("open");
} }
function closeViewSpecialCake() { function closeViewSpecialCake() {
document.getElementById('sc-view-overlay').classList.remove('open'); document.getElementById("sc-view-overlay").classList.remove("open");
} }
document.addEventListener('DOMContentLoaded', function() { document.addEventListener("DOMContentLoaded", function () {
setActiveLink(); setActiveLink();
initOrderPage(); initOrderPage();
}); });
document.addEventListener('htmx:afterSettle', function() { document.addEventListener("htmx:afterSettle", function () {
setActiveLink(); setActiveLink();
initOrderPage(); initOrderPage();
}); });

View file

@ -1,5 +1,12 @@
package templates package templates
templ link(href string, icon string, name string) {
<a href={ href } hx-boost="true" hx-target="main" hx-select="main" hx-select-oob="title" hx-swap="outerHTML">
<span class="material-symbols-outlined">{ icon }</span>
<span>{ name }</span>
</a>
}
templ Layout(title string, main templ.Component) { templ Layout(title string, main templ.Component) {
<!DOCTYPE html> <!DOCTYPE html>
<html lang="pl"> <html lang="pl">
@ -16,23 +23,11 @@ templ Layout(title string, main templ.Component) {
<body> <body>
<header> <header>
<nav> <nav>
<a href="/orders" hx-boost="true" hx-target="main" hx-select="main" hx-select-oob="title" hx-swap="outerHTML"> @link("/orders", "dashboard", "Panel główny")
<span class="material-symbols-outlined">dashboard</span> @link("/cakes", "inventory_2", "Katalog")
<span>Panel główny</span> @link("/blocked", "event_busy", "Terminy zablokowane")
</a> @link("/order", "add", "Nowe zamówienie")
<a href="/cakes" hx-boost="true" hx-target="main" hx-select="main" hx-select-oob="title" hx-swap="outerHTML">
<span class="material-symbols-outlined">inventory_2</span>
<span>Katalog</span>
</a>
<a href="/blocked" hx-boost="true" hx-target="main" hx-select="main" hx-select-oob="title" hx-swap="outerHTML">
<span class="material-symbols-outlined">event_busy</span>
<span>Terminy zablokowane</span>
</a>
</nav> </nav>
<a href="/order" class="cta" hx-boost="true" hx-target="main" hx-select="main" hx-select-oob="title" hx-swap="outerHTML">
<span class="material-symbols-outlined">add</span>
<span>Nowe zamówienie</span>
</a>
</header> </header>
<main> <main>
@main @main