110 lines
4.3 KiB
JavaScript
110 lines
4.3 KiB
JavaScript
document.addEventListener('DOMContentLoaded', () => {
|
||
fetch('data.json')
|
||
.then(r => r.json())
|
||
.then(data => {
|
||
renderMenu(data.menu);
|
||
renderShopping(data.shopping);
|
||
})
|
||
.catch(err => console.error('Ошибка загрузки данных:', err));
|
||
});
|
||
|
||
// ---- Меню -------------------------------------------------
|
||
function renderMenu(menu) {
|
||
const tbody = document.querySelector('#menu-table tbody');
|
||
menu.forEach(item => {
|
||
const tr = document.createElement('tr');
|
||
const tdDay = document.createElement('td');
|
||
tdDay.textContent = item.day;
|
||
const tdBreak = document.createElement('td');
|
||
tdBreak.textContent = `${item.breakfast} (${item.breakfast_kcal} ккал)`;
|
||
const tdLunch = document.createElement('td');
|
||
tdLunch.textContent = `${item.lunch} (${item.lunch_kcal} ккал)`;
|
||
const tdDinner = document.createElement('td');
|
||
tdDinner.textContent = `${item.dinner} (${item.dinner_kcal} ккал)`;
|
||
const tdSnack = document.createElement('td');
|
||
tdSnack.textContent = `${item.snack || ''} (${item.snack_kcal || 0} ккал)`;
|
||
const tdCoffee = document.createElement('td');
|
||
tdCoffee.textContent = `${item.coffee || ''} (${item.coffee_kcal || 0} ккал)`;
|
||
const tdTea = document.createElement('td');
|
||
tdTea.textContent = `${item.tea || ''} (${item.tea_kcal || 0} ккал)`;
|
||
const tdTotal = document.createElement('td');
|
||
const totalKcal = (item.breakfast_kcal || 0) + (item.lunch_kcal || 0) + (item.dinner_kcal || 0) + (item.snack_kcal || 0) + (item.coffee_kcal || 0) + (item.tea_kcal || 0);
|
||
tdTotal.textContent = `${totalKcal} ккал`;
|
||
const tdGrams = document.createElement('td');
|
||
tdGrams.textContent = `${item.grams || ''} г`;
|
||
tr.append(tdDay, tdBreak, tdLunch, tdDinner, tdSnack, tdCoffee, tdTea, tdTotal, tdGrams);
|
||
tbody.appendChild(tr);
|
||
});
|
||
}
|
||
|
||
// ---- План покупок ------------------------------------------
|
||
function renderShopping(weeks) {
|
||
// сохраняем данные для экспорта
|
||
window._shoppingData = weeks;
|
||
const container = document.getElementById('weeks');
|
||
weeks.forEach(week => {
|
||
const weekDiv = document.createElement('div');
|
||
weekDiv.className = 'week';
|
||
const header = document.createElement('div');
|
||
header.className = 'week-header';
|
||
header.textContent = `Неделя ${week.week}`;
|
||
const itemsDiv = document.createElement('div');
|
||
itemsDiv.className = 'week-items';
|
||
itemsDiv.style.display = 'none';
|
||
header.addEventListener('click', () => {
|
||
itemsDiv.style.display = itemsDiv.style.display === 'none' ? 'block' : 'none';
|
||
});
|
||
// таблица категорий
|
||
const table = document.createElement('table');
|
||
const tbody = document.createElement('tbody');
|
||
week.items.forEach(cat => {
|
||
const trCat = document.createElement('tr');
|
||
const tdCat = document.createElement('td');
|
||
tdCat.colSpan = 2;
|
||
tdCat.style.fontWeight = 'bold';
|
||
tdCat.textContent = cat.category;
|
||
trCat.appendChild(tdCat);
|
||
tbody.appendChild(trCat);
|
||
cat.items.forEach(it => {
|
||
const tr = document.createElement('tr');
|
||
const tdName = document.createElement('td');
|
||
const tdQty = document.createElement('td');
|
||
tdName.textContent = it.name;
|
||
tdQty.textContent = it.qty;
|
||
tr.append(tdName, tdQty);
|
||
tbody.appendChild(tr);
|
||
});
|
||
});
|
||
table.appendChild(tbody);
|
||
itemsDiv.appendChild(table);
|
||
weekDiv.appendChild(header);
|
||
weekDiv.appendChild(itemsDiv);
|
||
container.appendChild(weekDiv);
|
||
});
|
||
}
|
||
|
||
// ---- Экспорт в CSV (Excel) --------------------------------
|
||
function exportToCsv() {
|
||
if (!window._shoppingData) return;
|
||
let csv = '\uFEFFWeek,Category,Item,Qty\n';
|
||
window._shoppingData.forEach(week => {
|
||
week.items.forEach(cat => {
|
||
cat.items.forEach(it => {
|
||
csv += `${week.week},${cat.category},${it.name},${it.qty}\n`;
|
||
});
|
||
});
|
||
});
|
||
const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
|
||
const url = URL.createObjectURL(blob);
|
||
const a = document.createElement('a');
|
||
a.href = url;
|
||
a.download = 'shopping_plan.csv';
|
||
a.style.display = 'none';
|
||
document.body.appendChild(a);
|
||
a.click();
|
||
document.body.removeChild(a);
|
||
URL.revokeObjectURL(url);
|
||
}
|
||
|
||
document.getElementById('exportBtn').addEventListener('click', exportToCsv);
|