/***********************************************************************************************************************************************************************
* File Name : table.util.jsx
* Type : Utility
* Description : Shared helpers for the generic admin DataTable system.
* Provides:
* - pageSizes constant for the page-size selector
* - BADGE_STYLES + EnumBadge for enum-type column rendering
* - formatDate (date-only, "MMM d, yyyy") used as the default
* renderer for "date"-type attributes app-wide
* - renderCell, the default per-type cell renderer dispatched
* by buildColumns when no cellOverride is supplied
* - ColumnFilter, the per-column filter UI (enum/date/text)
* - SortIcon, the header sort indicator
* - longTextCell, a reusable cellOverride factory for long
* values (UUIDs, free text notes, etc.) — truncates the
* value and shows an "Eye · View" trigger that opens a
* shadcn Dialog with the full value
* - buildColumns, which turns server-provided attribute
* metadata into TanStack column definitions
*
* Author: rgrgogu
* Modified by: Kenneth Obsequio (@lash0000)
* Date Created: May 6, 2026
* Date Modified: Jun 17, 2026
***********************************************************************************************************************************************************************/
import { useState, useEffect } from "react";
import { createColumnHelper } from "@tanstack/react-table";
import { format } from "date-fns";
import { Badge } from "@/components/ui/badge";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select";
import {
Dialog, DialogContent, DialogHeader, DialogTitle,
} from "@/components/ui/dialog";
import { Search, ArrowUp, ArrowDown, ArrowUpDown, Eye } from "lucide-react";
export const pageSizes = [10, 25, 50, 75, 100, 250, 500, 750, 1000]
// ── Badge style map for enum values ───────────────────────────────────────────
export const BADGE_STYLES = {
// ── User status ───────────────────────────────
"Active": "bg-emerald-100 text-emerald-800 border-emerald-200",
"Not Active": "bg-rose-100 text-rose-700 border-rose-200",
"Verified": "bg-blue-100 text-blue-800 border-blue-200",
"Not Verified": "bg-amber-100 text-amber-700 border-amber-200",
"Banned": "bg-red-100 text-red-700 border-red-200",
// ── Registration / account type ───────────────
"system": "bg-violet-50 text-violet-700 border-violet-200",
"google": "bg-orange-50 text-orange-700 border-orange-200",
"admin": "bg-red-100 text-red-700 border-red-200",
"user": "bg-blue-100 text-blue-700 border-blue-200",
"staff": "bg-green-100 text-green-700 border-green-200",
// ── Asset — file_type ─────────────────────────
"image": "bg-sky-100 text-sky-700 border-sky-200",
"video": "bg-purple-100 text-purple-700 border-purple-200",
"document": "bg-amber-100 text-amber-700 border-amber-200",
"other": "bg-zinc-100 text-zinc-600 border-zinc-200",
// ── Asset — storage_provider ──────────────────
"chibisafe": "bg-pink-100 text-pink-700 border-pink-200",
"local": "bg-zinc-100 text-zinc-600 border-zinc-200",
"s3": "bg-orange-100 text-orange-700 border-orange-200",
"gcs": "bg-blue-50 text-blue-600 border-blue-200",
"cloudinary": "bg-indigo-100 text-indigo-700 border-indigo-200",
// ── Asset — access_level ──────────────────────
"public": "bg-emerald-100 text-emerald-700 border-emerald-200",
"private": "bg-rose-100 text-rose-700 border-rose-200",
"restricted": "bg-amber-100 text-amber-700 border-amber-200",
// ── Asset — is_public ─────────────────────────
"true": "bg-emerald-100 text-emerald-700 border-emerald-200",
"false": "bg-zinc-100 text-zinc-600 border-zinc-200",
// ── Generic boolean labels (BOOLEAN_FIELD_LABELS) ─────────
"Yes": "bg-emerald-100 text-emerald-700 border-emerald-200",
"No": "bg-zinc-100 text-zinc-600 border-zinc-200",
};
function EnumBadge({ value }) {
return (