Files
recipe-mockup/js/app.js
ulfrxdev f80b115cae
All checks were successful
Build and Deploy / build-and-push (push) Successful in 23s
Reorganise the views and prepare summary
2026-03-26 22:29:06 +01:00

105 lines
4.8 KiB
JavaScript

import { getRecipeListHTML, setupRecipeList } from './views/RecipeList.js';
import { getFilterHTML, setupFilter } from './views/Filter.js';
import { getRecipeDetailHTML, setupRecipeDetail } from './views/RecipeDetail.js';
import { getMealPlannerHTML, setupMealPlanner } from './views/MealPlanner.js';
import { getPantryHTML, refreshPantry, setupPantry } from './views/Pantry.js';
import { getShoppingHTML, refreshShopping, setupShopping } from './views/Shopping.js';
function getAppToastHTML() {
return `
<div id="app-toast" class="pointer-events-none absolute left-4 right-4 bottom-28 z-[60] opacity-0 translate-y-2 transition-all duration-300" role="status">
<div class="rounded-xl bg-gray-900 text-white text-sm font-medium px-4 py-3 shadow-lg text-center" id="app-toast-text"></div>
</div>
`;
}
function getBottomNavHTML() {
return `
<nav id="app-bottom-nav" class="absolute bottom-0 left-0 right-0 w-full bg-white border-t border-gray-200 flex justify-between px-1 py-2.5 pb-6 z-20 gap-0" aria-label="Główna nawigacja">
<button type="button" data-tab="recipes" id="nav-recipes" class="nav-tab flex flex-col items-center gap-0.5 text-black flex-1 min-w-0 max-w-[5.5rem]">
<i class="fas fa-book text-base" aria-hidden="true"></i>
<span class="text-[9px] font-medium leading-tight text-center">Przepisy</span>
</button>
<button type="button" data-tab="planner" id="nav-planner" class="nav-tab flex flex-col items-center gap-0.5 text-gray-500 hover:text-gray-700 flex-1 min-w-0 max-w-[5.5rem]">
<i class="far fa-calendar-alt text-base" aria-hidden="true"></i>
<span class="text-[9px] font-medium leading-tight text-center">Planer</span>
</button>
<button type="button" data-tab="pantry" id="nav-pantry" class="nav-tab flex flex-col items-center gap-0.5 text-gray-500 hover:text-gray-700 flex-1 min-w-0 max-w-[5.5rem]">
<i class="fas fa-warehouse text-base" aria-hidden="true"></i>
<span class="text-[9px] font-medium leading-tight text-center">Spiżarnia</span>
</button>
<button type="button" data-tab="shopping" id="nav-shopping" class="nav-tab flex flex-col items-center gap-0.5 text-gray-500 hover:text-gray-700 flex-1 min-w-0 max-w-[5.5rem]">
<i class="fas fa-cart-shopping text-base" aria-hidden="true"></i>
<span class="text-[9px] font-medium leading-tight text-center">Zakupy</span>
</button>
</nav>
`;
}
function setupTabs() {
const main = document.getElementById('main-view');
const planner = document.getElementById('planner-view');
const pantry = document.getElementById('pantry-view');
const shopping = document.getElementById('shopping-view');
const nav = document.getElementById('app-bottom-nav');
if (!main || !planner || !pantry || !shopping || !nav) return;
const activeTab = 'nav-tab flex flex-col items-center gap-0.5 text-black flex-1 min-w-0 max-w-[5.5rem]';
const idleTab = 'nav-tab flex flex-col items-center gap-0.5 text-gray-500 hover:text-gray-700 flex-1 min-w-0 max-w-[5.5rem]';
const apply = (tab) => {
main.classList.toggle('hidden', tab !== 'recipes');
planner.classList.toggle('hidden', tab !== 'planner');
pantry.classList.toggle('hidden', tab !== 'pantry');
shopping.classList.toggle('hidden', tab !== 'shopping');
if (tab === 'pantry') refreshPantry();
if (tab === 'shopping') refreshShopping();
nav.querySelectorAll('.nav-tab[data-tab]').forEach((btn) => {
const id = btn.getAttribute('data-tab');
if (btn.hasAttribute('disabled')) return;
if (id === 'recipes' || id === 'planner' || id === 'pantry' || id === 'shopping') {
btn.className = id === tab ? activeTab : idleTab;
}
});
};
nav.addEventListener('click', (e) => {
const btn = e.target.closest('.nav-tab[data-tab]');
if (!btn || btn.hasAttribute('disabled')) return;
const tab = btn.getAttribute('data-tab');
if (tab === 'recipes' || tab === 'planner' || tab === 'pantry' || tab === 'shopping') apply(tab);
});
apply('recipes');
window.refreshStockViews = () => {
refreshPantry();
refreshShopping();
};
}
document.addEventListener('DOMContentLoaded', () => {
const appContainer = document.getElementById('app-container');
appContainer.innerHTML = `
${getRecipeListHTML()}
${getMealPlannerHTML()}
${getPantryHTML()}
${getShoppingHTML()}
${getBottomNavHTML()}
${getRecipeDetailHTML()}
${getFilterHTML()}
${getAppToastHTML()}
`;
setupTabs();
setupRecipeList();
setupMealPlanner();
setupPantry();
setupShopping();
setupFilter();
setupRecipeDetail();
});