Files
CT/src/View/Components/monthGrid.tsx
T

68 lines
1.9 KiB
TypeScript
Raw Normal View History

2024-07-26 03:14:55 +02:00
import "./monthGrid.css";
import * as React from "bloatless-react";
import { MonthGrid } from "../../Model/Files/calendarModel";
import TaskViewModel from "../../ViewModel/Pages/taskViewModel";
2024-07-26 03:29:07 +02:00
import { translations } from "../translations";
2024-07-26 03:14:55 +02:00
2024-07-26 03:38:46 +02:00
export function MonthGrid<T>(
monthGrid: MonthGrid<React.MapState<T>>,
selectedDate: React.State<number>
) {
2024-07-26 03:29:07 +02:00
const dayLabels: HTMLElement[] = [];
let currentWeekday = monthGrid.firstDayOfWeek;
while (dayLabels.length < 7) {
dayLabels.push(
<span class="secondary">
{translations.regional.weekdays.abbreviated[currentWeekday]}
</span>
);
currentWeekday++;
if (currentWeekday == 7) currentWeekday = 0;
}
2024-07-26 03:14:55 +02:00
const offsetElements: HTMLElement[] = [];
for (let i = 0; i < monthGrid.offset; i++) {
offsetElements.push(<div></div>);
}
const converter: React.StateItemConverter<TaskViewModel> = (
taskViewModel
) => {
return <span class="ellipsis secondary">{taskViewModel.task.name}</span>;
};
return (
<div class="month-grid-wrapper">
2024-07-26 03:29:07 +02:00
<div class="day-labels">{...dayLabels}</div>
<div class="month-grid">
{...offsetElements}
{...Object.entries(monthGrid.days).map((entry) => {
const [date, mapState] = entry;
2024-07-26 03:14:55 +02:00
2024-07-26 03:38:46 +02:00
const isSelected = React.createProxyState(
[selectedDate],
() => selectedDate.value == parseInt(date)
);
function select() {
selectedDate.value = parseInt(date);
}
2024-07-26 03:29:07 +02:00
return (
2024-07-26 03:38:46 +02:00
<button class="tile" on:click={select} toggle:selected={isSelected}>
2024-07-26 03:29:07 +02:00
<div>
<b>{date}</b>
<div
class="flex-column gap clip"
children:append={[mapState, converter]}
></div>
</div>
</button>
);
})}
</div>
2024-07-26 03:14:55 +02:00
</div>
);
}