Special cakes UI: overlay drawer, basket integration, catalogue tag filter, form parsing, JS save/edit/remove. HTMX navigation: MainContent component, nav links with hx-get, handlers return partial on HX-Request. Dashboard: metrics grid, CakeBreakdown, OrderRow with status select, CakeCounts/OrderCounts, torty filter, tort badge, results-pane. Collapsible sidebar: toggle button, localStorage, CSS transitions. Location field: dropdown replaced with pill toggle. Inline style cleanup: moved to CSS classes (tag-grid, grow, icon.sm, header-actions, toggle-group, success-icon, etc.). Dead CSS removal: pagination, status-chip, badge-pill, login-page. Helpers: exported CakeTitle/OrderTitle, added tagNames, tagIDsComma, orderItemsDesc, specialCakeDetail, removed unused helpers.
82 lines
2.3 KiB
Text
82 lines
2.3 KiB
Text
package templates
|
|
|
|
templ Layout(title string, header, main templ.Component) {
|
|
<!DOCTYPE html>
|
|
<html lang="pl">
|
|
<head>
|
|
<meta charset="UTF-8"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
|
<title>{ title } — Zamówienia ciast</title>
|
|
<link rel="stylesheet" href="/static/fonts/inter.css"/>
|
|
<link rel="stylesheet" href="/static/fonts/material.css"/>
|
|
<link rel="stylesheet" href="/static/style.css"/>
|
|
<script src="/static/htmx2.04.js" defer></script>
|
|
<script src="/static/order.js"></script>
|
|
</head>
|
|
<body>
|
|
<aside class="sidebar">
|
|
@Nav()
|
|
</aside>
|
|
<main id="main">
|
|
<header class="topnav">
|
|
<h1>{ title }</h1>
|
|
@header
|
|
</header>
|
|
<div class="main-content">
|
|
@main
|
|
</div>
|
|
</main>
|
|
<script>
|
|
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].style.display = id.includes(q) || customer.includes(q) ? '' : 'none';
|
|
}
|
|
}
|
|
|
|
(function() {
|
|
function setActiveLink() {
|
|
var path = window.location.pathname;
|
|
var links = document.querySelectorAll('.link');
|
|
for (var i = 0; i < links.length; i++) {
|
|
links[i].classList.toggle('active', links[i].getAttribute('href') === path);
|
|
}
|
|
}
|
|
|
|
function setSidebarState() {
|
|
var collapsed = localStorage.getItem('sidebarCollapsed') === 'true';
|
|
document.body.classList.toggle('sidebar-collapsed', collapsed);
|
|
}
|
|
|
|
setActiveLink();
|
|
setSidebarState();
|
|
|
|
document.addEventListener('htmx:afterSettle', setActiveLink);
|
|
})();
|
|
|
|
function toggleSidebar() {
|
|
var collapsed = document.body.classList.toggle('sidebar-collapsed');
|
|
localStorage.setItem('sidebarCollapsed', collapsed);
|
|
}
|
|
</script>
|
|
</body>
|
|
</html>
|
|
}
|
|
|
|
templ MainContent(title string, header, main templ.Component) {
|
|
<main id="main">
|
|
<title hx-swap-oob="true">{ title } — Zamówienia ciast</title>
|
|
<header class="topnav">
|
|
<h1>{ title }</h1>
|
|
@header
|
|
</header>
|
|
<div class="main-content">
|
|
@main
|
|
</div>
|
|
</main>
|
|
}
|