feat: split jídel

feat: graf příjmů
This commit is contained in:
Ondřej Anděl committed 2026-10-09 15:15:04 +02:00
1 parent bc85a37fc0
commit b880b36edd
32 files changed
+2048 -262

No files matched your search

+49 -30
View File
@@ -1,9 +1,11 @@
import { useState } from "react";
import { Button } from "react-bootstrap";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faPenToSquare } from "@fortawesome/free-solid-svg-icons";
import { faCalendarDays, faPenToSquare } from "@fortawesome/free-solid-svg-icons";
import { MealGroup } from "../../../types";
import { formatDateString } from "../Utils";
import MealGroupForm from "./MealGroupForm";
import MealGroupDays from "./MealGroupDays";
type Props = {
group: MealGroup,
@@ -18,39 +20,56 @@ const describeMissing = (missing: number, count: number): string =>
/**
* Řádek skupiny jídel (stejný název a zdroj) s přehledem chybějících údajů.
* Po rozbalení nabídne formulář, kterým se údaje doplní všem jídlům skupiny.
* Po rozbalení nabídne formulář, kterým se údaje doplní všem jídlům skupiny,
* a dny, kdy se jídlo jedlo, jako odkazy na přehled dne.
*/
const MealGroupRow = ({ group, expanded, onToggle, onFilled }: Readonly<Props>) => (
<div className="card-panel meal-group">
<div className="meal-group-head">
<div className="meal-group-info">
<div className="meal-group-name">{group.name}</div>
<div className="meal-meta">
{group.source && <span className="tag">{group.source}</span>}
<span className="tag">{group.count}× · naposledy {formatDateString(group.lastDate)}</span>
{group.missingCaloriesCount > 0 && (
<span className="tag tag-missing">
bez kalorií {describeMissing(group.missingCaloriesCount, group.count)}
</span>
)}
{group.missingWeightCount > 0 && (
<span className="tag tag-missing">
bez gramáže {describeMissing(group.missingWeightCount, group.count)}
</span>
)}
{group.missingNutrientsCount > 0 && (
<span className="tag tag-missing">
bez živin {describeMissing(group.missingNutrientsCount, group.count)}
</span>
const MealGroupRow = ({ group, expanded, onToggle, onFilled }: Readonly<Props>) => {
const [daysOpen, setDaysOpen] = useState(false);
return (
<div className="card-panel meal-group">
<div className="meal-group-head">
<div className="meal-group-info">
<div className="meal-group-name">{group.name}</div>
<div className="meal-meta">
{group.source && <span className="tag">{group.source}</span>}
<span className="tag">{group.count}× · naposledy {formatDateString(group.lastDate)}</span>
{group.missingCaloriesCount > 0 && (
<span className="tag tag-missing">
bez kalorií {describeMissing(group.missingCaloriesCount, group.count)}
</span>
)}
{group.missingWeightCount > 0 && (
<span className="tag tag-missing">
bez gramáže {describeMissing(group.missingWeightCount, group.count)}
</span>
)}
{group.missingNutrientsCount > 0 && (
<span className="tag tag-missing">
bez živin {describeMissing(group.missingNutrientsCount, group.count)}
</span>
)}
</div>
</div>
<div className="meal-group-actions">
{!expanded && (
<Button
variant="outline-secondary"
size="sm"
active={daysOpen}
onClick={() => setDaysOpen(open => !open)}
>
<FontAwesomeIcon icon={faCalendarDays} /> Dny
</Button>
)}
<Button variant={expanded ? 'outline-secondary' : 'primary'} size="sm" onClick={() => onToggle()}>
<FontAwesomeIcon icon={faPenToSquare} /> {expanded ? 'Zavřít' : 'Doplnit'}
</Button>
</div>
</div>
<Button variant={expanded ? 'outline-secondary' : 'primary'} size="sm" onClick={() => onToggle()}>
<FontAwesomeIcon icon={faPenToSquare} /> {expanded ? 'Zavřít' : 'Doplnit'}
</Button>
{(expanded || daysOpen) && <MealGroupDays days={group.days} />}
{expanded && <MealGroupForm group={group} onFilled={onFilled} onCancel={() => onToggle()} />}
</div>
{expanded && <MealGroupForm group={group} onFilled={onFilled} onCancel={() => onToggle()} />}
</div>
);
);
};
export default MealGroupRow;