diff --git a/src/admin/pages/WarehouseCategories.tsx b/src/admin/pages/WarehouseCategories.tsx
index f1baf7e..2006bcc 100644
--- a/src/admin/pages/WarehouseCategories.tsx
+++ b/src/admin/pages/WarehouseCategories.tsx
@@ -1,18 +1,28 @@
import { useState } from "react";
import { useQuery } from "@tanstack/react-query";
+import Box from "@mui/material/Box";
+import IconButton from "@mui/material/IconButton";
import { useAlert } from "../context/AlertContext";
import { useAuth } from "../context/AuthContext";
import Forbidden from "../components/Forbidden";
-import { motion } from "framer-motion";
-import ConfirmModal from "../components/ConfirmModal";
-import FormModal from "../components/FormModal";
-
-import FormField from "../components/FormField";
import {
warehouseCategoryListOptions,
type WarehouseCategory,
} from "../lib/queries/warehouse";
import { useApiMutation } from "../lib/queries/mutations";
+import {
+ Button,
+ Card,
+ DataTable,
+ Modal,
+ ConfirmDialog,
+ Field,
+ TextField,
+ PageHeader,
+ EmptyState,
+ LoadingState,
+ type DataColumn,
+} from "../ui";
const API_BASE = "/api/admin/warehouse/categories";
@@ -22,6 +32,50 @@ interface CategoryForm {
sort_order: number;
}
+const PlusIcon = (
+
+);
+const EditIcon = (
+
+);
+const DeleteIcon = (
+
+);
+
export default function WarehouseCategories() {
const alert = useAlert();
const { hasPermission } = useAuth();
@@ -121,207 +175,145 @@ export default function WarehouseCategories() {
};
if (isPending) {
- return (
-
- );
+ return ;
}
- return (
-
-
-
-
Kategorie skladu
-
-
-
-
-
+ const total = categories.length;
+ const subtitle = `${total} ${
+ total === 1
+ ? "kategorie"
+ : total >= 2 && total <= 4
+ ? "kategorie"
+ : "kategorií"
+ }`;
-
-
- {categories.length === 0 && (
-
-
-
Zatím nejsou žádné kategorie.
-
-
- )}
- {categories.length > 0 && (
-
-
-
-
- | Název |
- Popis |
- Pořadí |
- Akce |
-
-
-
- {categories.map((category) => (
-
- | {category.name} |
- {category.description || "—"} |
- {category.sort_order} |
-
-
-
-
-
- |
-
- ))}
-
-
-
- )}
-
-
+ const columns: DataColumn
[] = [
+ {
+ key: "name",
+ header: "Název",
+ width: "35%",
+ bold: true,
+ render: (c) => c.name,
+ },
+ {
+ key: "description",
+ header: "Popis",
+ width: "40%",
+ render: (c) => c.description || "—",
+ },
+ {
+ key: "sort_order",
+ header: "Pořadí",
+ width: "15%",
+ mono: true,
+ render: (c) => String(c.sort_order),
+ },
+ {
+ key: "actions",
+ header: "Akce",
+ width: "10%",
+ align: "right",
+ render: (c) => (
+
+ openEditModal(c)}
+ aria-label="Upravit"
+ title="Upravit"
+ >
+ {EditIcon}
+
+ setDeleteConfirm({ show: true, category: c })}
+ aria-label="Smazat"
+ title="Smazat"
+ >
+ {DeleteIcon}
+
+
+ ),
+ },
+ ];
+
+ return (
+
+
+ Přidat kategorii
+
+ }
+ />
+
+
+
+ columns={columns}
+ rows={categories}
+ rowKey={(c) => c.id}
+ empty={
+
+ Přidat první kategorii
+
+ }
+ />
+ }
+ />
+
{/* Add/Edit Modal */}
- setShowModal(false)}
onSubmit={handleSubmit}
title={editingCategory ? "Upravit kategorii" : "Přidat kategorii"}
loading={saving}
>
-
-
- {
- setForm({ ...form, name: e.target.value });
- setErrors((prev) => ({ ...prev, name: "" }));
- }}
- className="admin-form-input"
- placeholder="Název kategorie"
- aria-invalid={!!errors.name}
- />
-
+
+ {
+ setForm({ ...form, name: e.target.value });
+ setErrors((prev) => ({ ...prev, name: "" }));
+ }}
+ placeholder="Název kategorie"
+ />
+
-
-
+
+ setForm({ ...form, description: e.target.value })}
+ placeholder="Volitelný popis kategorie"
+ />
+
-
-
- setForm({
- ...form,
- sort_order: parseInt(e.target.value) || 0,
- })
- }
- className="admin-form-input"
- min="0"
- />
-
- Nižší hodnota = výše v seznamu
-
-
-
-
+
+
+ setForm({
+ ...form,
+ sort_order: parseInt(e.target.value) || 0,
+ })
+ }
+ inputProps={{ min: 0 }}
+ />
+
+
{/* Delete Confirmation */}
- setDeleteConfirm({ show: false, category: null })}
onConfirm={handleDelete}
@@ -333,7 +325,8 @@ export default function WarehouseCategories() {
}
confirmText="Smazat"
confirmVariant="danger"
+ loading={deleteMutation.isPending}
/>
-
+
);
}