(".fristen-card-calc-result");
+ if (!result) return;
+ if (calc.isCourtSet) {
+ result.innerHTML = `${escHtml(t("deadlines.card.calc.result.court_set"))}
`;
+ return;
+ }
+ const lang = getLang();
+ const ruleName = lang === "en" ? calc.rule.nameEN : calc.rule.nameDE;
+ const durLabel = `${calc.rule.durationValue} ${formatDurationUnit(calc.rule.durationUnit, lang)}`;
+ const dueLabel = formatDate(calc.dueDate);
+ const fromLabel = formatDate(calc.triggerDate);
+ const adjustmentChip = calc.wasAdjusted
+ ? renderAdjustmentChip(calc, lang)
+ : "";
+ result.innerHTML = `
+
+ ►
+ ${escHtml(dueLabel)}
+ (${escHtml(durLabel)} ${escHtml(t("deadlines.card.calc.result.from_trigger"))} ${escHtml(fromLabel)})
+
+ ${adjustmentChip}
+ ${escHtml(ruleName)}
+ `;
+}
+
+function renderAdjustmentChip(calc: RuleCalcResponse, _lang: "de" | "en"): string {
+ const reason = calc.adjustmentReason;
+ let why = "";
+ if (reason && reason.upcVacation) {
+ why = "UPC-Sommerferien (27.7.–28.8.)";
+ } else if (reason && reason.holidays && reason.holidays.length > 0) {
+ why = reason.holidays.map((h) => h.name).join(", ");
+ } else {
+ why = "Wochenende / Feiertag";
+ }
+ return `
+ ⚠ ${escHtml(t("deadlines.card.calc.result.shifted_from"))} ${escHtml(formatDate(calc.originalDate))}
+ ${escHtml(t("deadlines.card.calc.result.shifted_because"))} ${escHtml(why)}.
+
`;
+}
+
+function formatDurationUnit(unit: string, lang: "de" | "en"): string {
+ const map: Record = {
+ days: { de: "Tage", en: "days" },
+ working_days: { de: "Arbeitstage", en: "working days" },
+ weeks: { de: "Wochen", en: "weeks" },
+ months: { de: "Monate", en: "months" },
+ years: { de: "Jahre", en: "years" },
+ };
+ return map[unit] ? map[unit][lang] : unit;
+}
+
+async function addCalcToProject(card: HTMLElement, calc: RuleCalcResponse) {
+ const panel = card.querySelector(".fristen-card-calc");
+ if (!panel) return;
+ const msgEl = panel.querySelector(".fristen-card-calc-msg")!;
+ const addBtn = panel.querySelector(".fristen-card-calc-add")!;
+ msgEl.textContent = "";
+ addBtn.disabled = true;
+
+ const projects = await fetchProjects();
+ if (projects.length === 0) {
+ addBtn.disabled = false;
+ msgEl.innerHTML = `${escHtml(t("deadlines.save.modal.no_akten"))} ${escHtml(t("deadlines.save.modal.no_akten.link"))}`;
+ return;
+ }
+
+ // Inline picker — render a compact