Highlight task planner items near reset
All checks were successful
Deploy Sokko G / deploy (push) Successful in 14s

This commit is contained in:
Shinuwa 2026-08-20 16:42:41 +02:00
parent 49ba0c4cb2
commit e4cbe3e087
5 changed files with 80 additions and 2 deletions

View file

@ -15,6 +15,7 @@ import {
getTaskTitle,
getTaskTypeLabel,
getTasksForParent,
isTaskResetSoon,
isTaskTreeComplete
} from "./taskPlannerUtils.js";
@ -23,6 +24,7 @@ export function TaskPlannerBranch({
parentMap,
tasks,
data,
nowMs,
reorder,
textContent,
openDescriptions,
@ -60,6 +62,7 @@ export function TaskPlannerBranch({
parentMap={parentMap}
tasks={tasks}
data={data}
nowMs={nowMs}
reorder={reorder}
textContent={textContent}
openDescriptions={openDescriptions}
@ -106,6 +109,7 @@ export function TaskPlannerBranch({
task={task}
tasks={tasks}
data={data}
nowMs={nowMs}
parentMap={parentMap}
parentId={parentId}
reorder={reorder}
@ -208,6 +212,7 @@ function TaskPlannerItem({
task,
tasks,
data,
nowMs,
parentMap,
parentId,
reorder,
@ -237,6 +242,7 @@ function TaskPlannerItem({
const className = [
"task-planner-item",
task.checked ? "is-complete" : "",
isTaskResetSoon(task, data, nowMs) ? "is-reset-soon" : "",
missingPrerequisites.length ? "has-missing-prerequisite" : "",
reorder.isItemDragging(task.id) ? "is-dragging" : "",
reorder.isItemDropTarget(task.id) ? "is-drop-target" : "",
@ -519,4 +525,3 @@ function LinksEditor({ label, relations, task, tasks, parentMap, relationTargets
</div>
);
}

View file

@ -354,6 +354,7 @@ export function TaskPlannerModule({ toolboxId, moduleId, context, editing }) {
parentMap={parentMap}
tasks={data.tasks}
data={data}
nowMs={nowMs}
reorder={reorder}
textContent={textContent}
openDescriptions={openDescriptions}

View file

@ -1,5 +1,8 @@
// Rôle : regroupe les constantes et helpers purs de l'outil task planner.
export const TASK_TYPES = ["daily", "weekly", "unique"];
const DAILY_RESET_SOON_MS = 6 * 60 * 60 * 1000;
const WEEKLY_RESET_SOON_MS = 48 * 60 * 60 * 1000;
export const WEEK_DAYS = [
{ value: 1, label: "Lundi" },
{ value: 2, label: "Mardi" },
@ -42,6 +45,39 @@ export function getLatestWeeklyReset(now, resetTime, weekDay) {
return reset.getTime();
}
export function getNextDailyReset(now, resetTime) {
const { hours, minutes } = parseResetTime(resetTime);
const reset = new Date(now);
reset.setHours(hours, minutes, 0, 0);
if (reset.getTime() <= now) reset.setDate(reset.getDate() + 1);
return reset.getTime();
}
export function getNextWeeklyReset(now, resetTime, weekDay) {
const { hours, minutes } = parseResetTime(resetTime);
const reset = new Date(now);
reset.setHours(hours, minutes, 0, 0);
const dayDiff = (weekDay - reset.getDay() + 7) % 7;
reset.setDate(reset.getDate() + dayDiff);
if (reset.getTime() <= now) reset.setDate(reset.getDate() + 7);
return reset.getTime();
}
export function getTaskResetTimeRemainingMs(task, data, now = Date.now()) {
if (task.checked || task.type === "unique") return null;
const nextResetAt = task.type === "daily"
? getNextDailyReset(now, task.dailyResetTime || data.resetTime)
: getNextWeeklyReset(now, data.resetTime, task.weeklyResetDay ?? data.weeklyResetDay);
return Math.max(0, nextResetAt - now);
}
export function isTaskResetSoon(task, data, now = Date.now()) {
const remainingMs = getTaskResetTimeRemainingMs(task, data, now);
if (remainingMs == null) return false;
const threshold = task.type === "daily" ? DAILY_RESET_SOON_MS : WEEKLY_RESET_SOON_MS;
return remainingMs <= threshold;
}
export function applyDueResets(data, now = Date.now()) {
let latestResetAt = data.lastResetAt;
let changed = false;