diff --git a/src/modules/admin/config/library/lessons/columns.config.jsx b/src/modules/admin/config/library/lessons/columns.config.jsx index 768f024..9194c50 100644 --- a/src/modules/admin/config/library/lessons/columns.config.jsx +++ b/src/modules/admin/config/library/lessons/columns.config.jsx @@ -2,7 +2,7 @@ // Column definitions and pinning for the standalone Lesson Library table. import { Badge } from "@/components/ui/badge"; -import { Clock } from "lucide-react"; +import { Clock, Layers } from "lucide-react"; import { buildColumns } from "@/utils/table.util"; import { buildSelectionColumn } from "@/components/generic/Table/buildSelectionColumn"; import { buildRowActionsColumn } from "@/components/generic/Table/buildRowActionsColumn"; @@ -13,13 +13,23 @@ export const columnPinning = { left: [], }; -const COURSE_STATUS_BADGE = { - published: "default", - draft: "secondary", - standalone: "outline", -}; - const cellOverrides = { + 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 ( @@ -39,11 +49,6 @@ const cellOverrides = { ); }, - course_status: (info) => ( - - {info.getValue()} - - ), }; export function buildDataColumns(attributes, rowActions) { diff --git a/src/modules/admin/config/library/units/columns.config.jsx b/src/modules/admin/config/library/units/columns.config.jsx index b1e09be..09cd097 100644 --- a/src/modules/admin/config/library/units/columns.config.jsx +++ b/src/modules/admin/config/library/units/columns.config.jsx @@ -2,7 +2,7 @@ // Column definitions and pinning for the standalone Unit Library table. import { Badge } from "@/components/ui/badge"; -import { Clock } from "lucide-react"; +import { Clock, GraduationCap } from "lucide-react"; import { buildColumns } from "@/utils/table.util"; import { buildSelectionColumn } from "@/components/generic/Table/buildSelectionColumn"; import { buildRowActionsColumn } from "@/components/generic/Table/buildRowActionsColumn"; @@ -13,13 +13,23 @@ export const columnPinning = { left: [], }; -const COURSE_STATUS_BADGE = { - published: "default", - draft: "secondary", - standalone: "outline", -}; - const cellOverrides = { + title: (info) => { + const inCourse = parseInt(info.row.original.course_count ?? 0, 10) > 0; + return ( +
+ {inCourse && ( + + + Course + + )} + + {info.getValue()} + +
+ ); + }, duration_seconds: (info) => { const seconds = parseInt(info.getValue() ?? 0, 10); return ( @@ -36,19 +46,6 @@ const cellOverrides = { {info.getValue() ?? 0} lesson{(info.getValue() ?? 0) === 1 ? "" : "s"} ), - course_count: (info) => { - const n = parseInt(info.getValue() ?? 0, 10); - return ( - - {n} course{n === 1 ? "" : "s"} - - ); - }, - course_status: (info) => ( - - {info.getValue()} - - ), }; export function buildDataColumns(attributes, rowActions) { diff --git a/src/modules/admin/config/library/units/rowActions.config.jsx b/src/modules/admin/config/library/units/rowActions.config.jsx index 0e3ead1..a1e2c3d 100644 --- a/src/modules/admin/config/library/units/rowActions.config.jsx +++ b/src/modules/admin/config/library/units/rowActions.config.jsx @@ -14,12 +14,6 @@ export function buildRowActions({ onView, onEdit, onManageLessons, onArchive, on icon: , onClick: (row) => onView(row), }, - { - key: "edit", - label: "Edit Unit", - icon: , - onClick: (row) => onEdit(row), - }, { key: "manage_lessons", label: "Manage Lessons", diff --git a/src/modules/admin/pages/assets/AddAsset.jsx b/src/modules/admin/pages/assets/AddAsset.jsx index 4a26bec..2e40530 100644 --- a/src/modules/admin/pages/assets/AddAsset.jsx +++ b/src/modules/admin/pages/assets/AddAsset.jsx @@ -185,12 +185,6 @@ export default function AddAsset() { hasFileError = true; } - // Thumbnail is required for video, optional for audio - if (isVideo && !thumbnailRef.current) { - setError("_thumbnail", { message: "A thumbnail is required for video uploads." }); - hasFileError = true; - } - if (hasFileError) return; setProgress({ phase: "uploading", pct: 0 }); @@ -259,15 +253,14 @@ export default function AddAsset() { - {/* ── Thumbnail (video required / audio optional) ── */} + {/* ── Thumbnail (optional for both video and audio) ── */} {(isVideo || isAudio) && (
- {/* Storage Provider */} + {/* Storage Provider — TEMPORARY: locked to S3 (see zrok tunnel note above; revert after VPS migration) */}
- ( - - )} - /> +
diff --git a/src/modules/admin/pages/assets/AddAssetsBulk.jsx b/src/modules/admin/pages/assets/AddAssetsBulk.jsx index f36ff1b..ab0f567 100644 --- a/src/modules/admin/pages/assets/AddAssetsBulk.jsx +++ b/src/modules/admin/pages/assets/AddAssetsBulk.jsx @@ -131,7 +131,8 @@ export default function AddAssetsBulk() { const { user } = useAuth(); const [isPublic, setIsPublic] = useState("false"); - const [storageProvider, setStorageProvider] = useState("s3"); + // TEMPORARY: locked to S3 (see zrok tunnel note; revert after VPS migration) + const storageProvider = "s3"; const total = jobs.length; const done = jobs.filter((j) => j.status === "uploaded").length; @@ -177,11 +178,10 @@ export default function AddAssetsBulk() {
- + - Chibisafe - Local S3 diff --git a/src/modules/admin/pages/user_groups/ViewGroup.jsx b/src/modules/admin/pages/user_groups/ViewGroup.jsx index 20d0480..65e2679 100644 --- a/src/modules/admin/pages/user_groups/ViewGroup.jsx +++ b/src/modules/admin/pages/user_groups/ViewGroup.jsx @@ -113,7 +113,7 @@ function InviteLinkDialog({ open, onOpenChange, group }) { {/* Invite link */}
-

+

{inviteUrl}

diff --git a/src/modules/client/layout/ClientLayout.jsx b/src/modules/client/layout/ClientLayout.jsx index dfd041e..ed3fe40 100644 --- a/src/modules/client/layout/ClientLayout.jsx +++ b/src/modules/client/layout/ClientLayout.jsx @@ -62,9 +62,9 @@ function ReferDialog({ open, onOpenChange }) { const handleDownload = () => { const canvas = document.querySelector("[data-qr='refer-invite']") if (!canvas) return - const url = canvas.toDataURL("image/png") + const url = canvas.toDataURL("image/png") const link = document.createElement("a") - link.href = url + link.href = url link.download = `QR_${group.group_code}.png` link.click() } @@ -112,7 +112,7 @@ function ReferDialog({ open, onOpenChange }) { {/* Invite link */}
-

+

{inviteUrl}

@@ -175,10 +175,10 @@ function ClientNav() { // Derive primitive deps — effect only fires when the actual asset changes, // not on every tierMap/tierSlug reference churn. - const badgeAsset = tierMap[tierSlug]?.badgeAsset ?? null - const badgeAssetId = badgeAsset?.asset_id ?? null + const badgeAsset = tierMap[tierSlug]?.badgeAsset ?? null + const badgeAssetId = badgeAsset?.asset_id ?? null const badgeProvider = badgeAsset?.storage_provider ?? null - const badgeFileUrl = badgeAsset?.file_url ?? null + const badgeFileUrl = badgeAsset?.file_url ?? null useEffect(() => { if (!badgeAssetId) { setBadgeImgUrl(null); return } @@ -220,83 +220,83 @@ function ClientNav() { return ( <> - - + ) } diff --git a/src/utils/table.util.jsx b/src/utils/table.util.jsx index 894a857..4707fd1 100644 --- a/src/utils/table.util.jsx +++ b/src/utils/table.util.jsx @@ -129,7 +129,7 @@ function renderCell(attr, value) { } case "date": return {formatDate(value)}; case "number": return {value}; - default: return {value}; + default: return {value}; } }