// config/library/lessons/columns.config.jsx
// Column definitions and pinning for the standalone Lesson Library table.
import { Badge } from "@/components/ui/badge";
import { Clock, Layers, Tag } from "lucide-react";
import * as LucideIcons from "lucide-react";
import { buildColumns } from "@/utils/table.util";
import { buildSelectionColumn } from "@/components/generic/Table/buildSelectionColumn";
import { buildRowActionsColumn } from "@/components/generic/Table/buildRowActionsColumn";
import { formatDuration } from "@/utils/timestamp.util";
import { resolveTierBadge } from "@/utils/tierBadge.util";
export const columnPinning = {
right: ["actions"],
left: [],
};
function buildCellOverrides(tierMap) {
return {
title: (info) => {
const inUnit = parseInt(info.row.original.unit_count ?? 0, 10) > 0;
return (
{inUnit && (
Unit
)}
{info.getValue()}
);
},
duration_seconds: (info) => {
const seconds = parseInt(info.getValue() ?? 0, 10);
return (
{formatDuration(seconds)}
);
},
course_count: (info) => {
const n = parseInt(info.getValue() ?? 0, 10);
return (
{n} course{n === 1 ? "" : "s"}
);
},
subscription: (info) => {
const own = info.getValue();
// Not gated directly — fall back to the tier(s) inherited from any
// affiliated course(s) instead of showing a bare "-".
const slug = own || info.row.original.course_subscription;
if (!slug) return -;
const { label, cls } = resolveTierBadge(slug, tierMap);
const Icon = LucideIcons[tierMap[slug]?.badge_icon] ?? Tag;
return (
{label}
);
},
};
}
export function buildDataColumns(attributes, rowActions, tierMap = {}) {
const visibleAttributes = attributes.filter((a) => !a.hidden);
const cellOverrides = buildCellOverrides(tierMap);
return [
buildSelectionColumn(),
...buildColumns(visibleAttributes, { cellOverrides }),
buildRowActionsColumn(rowActions, { dropdownLabel: "Lesson Actions" }),
];
}