From dab5ad8aa5a60330b56250b273bfe85308f715e9 Mon Sep 17 00:00:00 2001
From: BOHA
Date: Sat, 6 Jun 2026 00:52:07 +0200
Subject: [PATCH] feat(plan): drive category select and view label from DB
categories
Co-Authored-By: Claude Opus 4.8 (1M context)
---
src/admin/components/PlanCellModal.tsx | 16 +++++++++++-----
src/admin/lib/queries/plan.ts | 13 -------------
src/admin/pages/PlanWork.tsx | 1 +
3 files changed, 12 insertions(+), 18 deletions(-)
diff --git a/src/admin/components/PlanCellModal.tsx b/src/admin/components/PlanCellModal.tsx
index 9af8a48..e910f59 100644
--- a/src/admin/components/PlanCellModal.tsx
+++ b/src/admin/components/PlanCellModal.tsx
@@ -7,7 +7,7 @@ import ConfirmModal from "./ConfirmModal";
import useReducedMotion from "../hooks/useReducedMotion";
import {
ResolvedCell,
- PLAN_CATEGORIES,
+ PlanCategory,
planCategoryLabel,
cellProjectLabel,
} from "../lib/queries/plan";
@@ -61,6 +61,7 @@ interface Props {
open: boolean;
mode: PlanCellModalMode;
projects: Project[];
+ categories: PlanCategory[];
onClose: () => void;
onSaveEntry: (body: any) => Promise;
onUpdateEntry: (id: number, body: any) => Promise;
@@ -112,6 +113,7 @@ function EditForm(props: Props) {
}
const isOverride = mode.kind === "edit-override";
+ const activeCategories = props.categories.filter((c) => c.is_active);
const initial = (() => {
if (mode.kind === "create") {
@@ -292,8 +294,8 @@ function EditForm(props: Props) {
value={category}
onChange={(e) => setCategory(e.target.value)}
>
- {PLAN_CATEGORIES.map((c) => (
-
))}
@@ -419,7 +421,7 @@ function DayInRangeModal(
}
function ViewModal(props: Props) {
- const { mode, onClose, projects } = props;
+ const { mode, onClose, projects, categories } = props;
if (mode.kind !== "view") return null;
const c = mode.cell;
// Prefer the server-embedded project label; fall back to the projects-list
@@ -440,7 +442,11 @@ function ViewModal(props: Props) {
Datum: {formatDate(c.shift_date)}
- Kategorie: {planCategoryLabel(c.category)}
+ Kategorie:{" "}
+ {planCategoryLabel(
+ c.category,
+ Object.fromEntries(categories.map((x) => [x.key, x])),
+ )}
Projekt: {projectLabel || "—"}
diff --git a/src/admin/lib/queries/plan.ts b/src/admin/lib/queries/plan.ts
index 068f419..e4f8008 100644
--- a/src/admin/lib/queries/plan.ts
+++ b/src/admin/lib/queries/plan.ts
@@ -53,19 +53,6 @@ export function categoryMap(
return map;
}
-/** Czech labels for the plan_category enum — single source of truth shared
- * by the grid chips, the detail view, and aria-labels. */
-export const PLAN_CATEGORIES: ReadonlyArray<{ value: string; label: string }> =
- [
- { value: "work", label: "Práce" },
- { value: "preparation", label: "Příprava" },
- { value: "travel", label: "Cesta / Montáž" },
- { value: "leave", label: "Dovolená" },
- { value: "sick", label: "Nemoc" },
- { value: "training", label: "Školení" },
- { value: "other", label: "Jiné" },
- ];
-
/** Czech label for a plan category key, resolved from the loaded categories
* map, falling back to the raw key. The `map` arg is optional so callers not
* yet threading categories still compile (they show the raw key until wired). */
diff --git a/src/admin/pages/PlanWork.tsx b/src/admin/pages/PlanWork.tsx
index 23f2d51..de344fb 100644
--- a/src/admin/pages/PlanWork.tsx
+++ b/src/admin/pages/PlanWork.tsx
@@ -684,6 +684,7 @@ export default function PlanWork() {
open={hookModal.kind !== "closed"}
mode={modalMode}
projects={projects}
+ categories={categories}
onClose={closeModal}
onSaveEntry={saveEntry}
onUpdateEntry={updateEntryFn}