const fmt = n => n.toLocaleString('ru-RU') + ' ₽'; fetch('data.json').then(r => r.json()).then(d => { document.getElementById('total').textContent = fmt(d.total); new Chart(document.getElementById('chNodes'), { type: 'pie', data: { labels: Object.keys(d.per_node), datasets: [{ data: Object.values(d.per_node) }] }, options: { plugins: { title: { display: true, text: 'Бюджет по узлам' } } } }); new Chart(document.getElementById('chCats'), { type: 'doughnut', data: { labels: Object.keys(d.per_cat), datasets: [{ data: Object.values(d.per_cat) }] }, options: { plugins: { title: { display: true, text: 'Бюджет по категориям' } } } }); const tb = document.querySelector('#tbl tbody'); d.rows.forEach(r => { const links = r.links.map(l => `${l.title}`).join(' · '); tb.insertAdjacentHTML('beforeend', `${r.node}${r.cat}${r.name}${r.qty} ${r.price.toLocaleString('ru-RU')} ${r.sub.toLocaleString('ru-RU')}${links}`); }); });