// Spreadsheet function ModuleSheets() { const [tab, setTab] = React.useState('Home'); const [selected, setSelected] = React.useState({r: 3, c: 5}); const tabs = ['File', 'Home', 'Insert', 'Data', 'Formulas', 'Review', 'View', 'AI Assist']; const B = KS_DATA.budget; // 26 cols A-Z, 40 rows const cols = Array.from({length: 8}, (_, i) => String.fromCharCode(65 + i)); const rows = 24; // Data lookup const cellData = (r, c) => { if (r === 0) { const heads = ['Department / Programme', 'Allocated (₹ Cr)', 'Utilised (₹ Cr)', 'Remaining (₹ Cr)', '% Utilised', 'Trend', 'Status', 'AI Insight']; return { v: heads[c] || '', header: true }; } const row = B.rows[r - 1]; if (!row) return { v: '' }; if (c === 0) return { v: row[0], bold: true }; if (c === 1) return { v: row[1].toLocaleString('en-IN'), num: true }; if (c === 2) return { v: row[2].toLocaleString('en-IN'), num: true }; if (c === 3) return { v: row[3].toLocaleString('en-IN'), num: true }; if (c === 4) return { v: row[4].toFixed(1) + '%', num: true, heat: row[4] }; if (c === 5) return { v: null, spark: true, val: row[4] }; if (c === 6) return { v: row[4] > 70 ? 'On track' : row[4] > 55 ? 'Watch' : 'At risk', pill: row[4] > 70 ? 'ok' : row[4] > 55 ? 'warn' : 'err' }; if (c === 7) return { v: null, ai: true, i: r - 1 }; return { v: '' }; }; const aiInsight = (i) => ({ 0: 'Below 62% at mid-year — flag', 1: 'Steady, aligns with S-curve', 2: 'Cyber budget skewing to Q4', 3: 'R&D under-utilised, reallocate?', 4: 'On plan', 5: 'Ahead of curve', 6: 'Trending high, expect closeout', 7: 'Watch — SLA-linked spend', 8: 'Slow start, staffing gap', 9: 'Nominal', }[i] || ''); const selectedCell = cellData(selected.r, selected.c); const selectedAddr = cols[selected.c] + (selected.r + 1); return (
| {cols.map((c, ci) => ( | {c} | ))}
|---|---|
| {r + 1} | {cols.map((_, c) => { const cd = cellData(r, c); const isSel = r === selected.r && c === selected.c; const bg = cd.header ? '#F5F7FA' : (cd.heat !== undefined ? ( cd.heat > 70 ? '#E7F3EC' : cd.heat > 55 ? '#FBF1E1' : cd.heat > 0 ? '#FBEAEA' : undefined ) : undefined); return ( setSelected({r, c})}
style={{
border: isSel ? '2px solid var(--mod-sheets)' : '1px solid var(--ink-200)',
padding: cd.spark ? 0 : '4px 8px',
background: bg,
fontWeight: cd.header ? 600 : (cd.bold ? 550 : 400),
fontFamily: cd.num ? 'var(--f-mono)' : 'inherit',
textAlign: cd.num ? 'right' : 'left',
color: cd.header ? 'var(--ink-700)' : (cd.ai ? 'var(--mod-ai)' : 'var(--ink-800)'),
fontSize: cd.header ? 11 : 12.5,
textTransform: cd.header ? 'uppercase' : 'none',
letterSpacing: cd.header ? '0.04em' : 'normal',
cursor: 'cell',
height: 26,
verticalAlign: 'middle',
}}>
{cd.spark && cd.val !== undefined ? (
70 ? 'var(--ok)' : cd.val > 55 ? 'var(--warn)' : 'var(--err)',
}}/>
|
);
})}