wip: course layout and func to context

Signed-off-by: Kenneth Obsequio <k80308392@gmail.com>
This commit is contained in:
2026-05-16 11:05:04 +08:00
parent dcf5f43fd5
commit 2b1955608d
38 changed files with 3086 additions and 9 deletions
@@ -0,0 +1,52 @@
import { Badge } from "@/components/ui/badge";
export const columnPinning = {
left: ["select", "title"],
right: ["actions"],
};
export function buildDataColumns(attributes, rowActions) {
const base = [
{
accessorKey: "title",
header: "Title",
cell: ({ row }) => (
<span className="font-medium">{row.original.title}</span>
),
},
{
accessorKey: "description",
header: "Description",
cell: ({ row }) => (
<span className="text-muted-foreground text-sm truncate max-w-xs block">
{row.original.description ?? "—"}
</span>
),
},
{
accessorKey: "order",
header: "Order",
cell: ({ row }) => (
<Badge variant="outline" className="text-xs">
{row.original.order}
</Badge>
),
},
{
accessorKey: "page",
header: "Content",
cell: ({ row }) => {
const blocks = row.original.page?.blocks ?? [];
return blocks.length ? (
<Badge variant="secondary" className="text-xs">
{blocks.length} block{blocks.length !== 1 ? "s" : ""}
</Badge>
) : (
<span className="text-xs text-muted-foreground">No content</span>
);
},
},
];
return rowActions ? [...base, rowActions] : base;
}
@@ -0,0 +1,35 @@
// config/courses/lessons/rowActions.config.jsx
import { Eye, Pencil, Trash2 } from "lucide-react";
export function buildRowActions({ onView, onEdit, onArchive }) {
return {
id: "actions",
header: "",
cell: ({ row }) => (
<div className="flex items-center justify-end gap-1">
<button
type="button"
onClick={() => onView(row.original)}
className="p-1.5 rounded hover:bg-muted transition-colors text-muted-foreground hover:text-foreground"
>
<Eye className="h-4 w-4" />
</button>
<button
type="button"
onClick={() => onEdit(row.original)}
className="p-1.5 rounded hover:bg-muted transition-colors text-muted-foreground hover:text-foreground"
>
<Pencil className="h-4 w-4" />
</button>
<button
type="button"
onClick={() => onArchive(row.original)}
className="p-1.5 rounded hover:bg-muted transition-colors text-muted-foreground hover:text-destructive"
>
<Trash2 className="h-4 w-4" />
</button>
</div>
),
};
}
@@ -0,0 +1,53 @@
// config/courses/lessons/toolbar.config.jsx
import { Plus, RefreshCw, Download } from "lucide-react";
import { exportTableToExcel } from "@/utils/excel.util";
export function buildToolbarActions({
fetchLessons,
pagination,
exportConfig,
navigate,
courseId,
unitId,
getFilters,
getSort,
getTableInstance,
}) {
return [
{
key: "refresh",
type: "button",
label: "Refresh",
icon: <RefreshCw className="h-3.5 w-3.5" />,
variant: "outline",
onClick: () => fetchLessons({
page: 1,
limit: pagination?.limit ?? 10,
filters: getFilters(),
sort: getSort(),
}),
},
{
key: "export",
type: "button",
label: "Export",
icon: <Download className="h-3.5 w-3.5" />,
variant: "outline",
onClick: () => exportTableToExcel({
...exportConfig,
tableInstance: getTableInstance(),
}),
},
{
key: "create",
type: "button",
label: "New Lesson",
icon: <Plus className="h-3.5 w-3.5" />,
variant: "default",
onClick: () => navigate(
`/admin/courses/${courseId}/units/${unitId}/lessons/create`
),
},
];
}