// * Packages import { route } from "ziggy-js"; import { ArchiveIcon, ArrowLeftIcon, CogIcon, HouseIcon, LockIcon, PlusIcon, StickyNoteIcon, TriangleAlertIcon, } from "lucide-react"; import { usePage } from "@inertiajs/react"; import { Row } from "@tanstack/react-table"; // * Components shadcn import { Badge } from "@/components/ui/badge"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; // * Other import AuthenticatedLayout from "@/back/Layouts/AuthenticatedLayout"; import DataTable from "@/back/Components/Table/DataTable"; import DataTableSearch from "@/back/Components/Table/DataTableSearch"; import DataTableFilterButton from "@/back/Components/Table/DataTableFilterButton"; import SoftdeleteWarning from "@/back/Components/SoftdeleteWarning"; import BtnOptionnalLinkWithTooltip from "@/back/Components/BtnOptionnalLinkWithTooltip"; import DynamicStatusBadge from "@/back/Components/DynamicPages/DynamicStatusBadge"; import RenderTranslationCell from "@/back/Components/Table/RenderTranslationCell"; import { GetFormatedDate, GetTranslation, Views } from "@/lib/utils"; import { AppEnv, AuthProp, Resource } from "@/back/types/global"; import { DynamicPageModel, PageConfigModel } from "@/back/types/dynamic-pages"; import str from "@/hooks/use-string"; import useTrans from "@/hooks/use-translations"; const getColumns = ( appEnv: AppEnv, modelName: string, viewAny: boolean, viewAnyPageConfigs: boolean, ) => { return [ { accessorKey: "title", header: ({ column }: { column: { id: string } }) => ( ), cell: ({ row }: { row: Row }) => (
{row.original.isRoot && ( {GetTranslation("back.page_root")} )}
), }, { accessorKey: "parent_page", header: ({ column }: { column: { id: string } }) => ( ), cell: ({ row }: { row: Row }) => { if (row.getValue("parent_page")) { const dynamicPageModel = row.getValue( "parent_page", ) as DynamicPageModel; const cellValue = dynamicPageModel.title[appEnv.locale]; let value = {cellValue}; if (viewAny) { value = ( {value} } tooltipContent={

{GetTranslation("back.access_model", { params: { model: GetTranslation( "models.classes.dynamic-page", { choice: 1 }, ), }, })}

} type="button" size="default" variant="secondary" /> ); } if (dynamicPageModel.deleted_at !== null) { value = (
{value} {GetTranslation("back.group_archived")}
); } return value; } return (

{GetTranslation("back.table_not_known")}

); }, }, { accessorKey: "config", header: ({ column }: { column: { id: string } }) => ( ), cell: ({ row }: { row: Row }) => { if (row.getValue("config")) { const pageConfigModel = row.getValue( "config", ) as PageConfigModel; const cellValue = pageConfigModel.label[appEnv.locale]; let value = {cellValue}; if (viewAnyPageConfigs) { value = ( {value} } tooltipContent={

{GetTranslation("back.access_model", { params: { model: GetTranslation( "models.classes.page-config", { choice: 1 }, ), }, })}

} type="button" size="default" variant="secondary" /> ); } if (pageConfigModel.deleted_at !== null) { value = (
{value} {GetTranslation("back.config_archived")}
); } return value; } return (

{GetTranslation("back.table_not_known")}

); }, }, { accessorKey: "status", header: ({ column }: { column: { id: string } }) => ( ), cell: ({ row }: { row: Row }) => (
{row.original.isLocked && ( {GetTranslation("back.page_locked")} )}
), }, { accessorKey: "updated_at", header: ({ column }: { column: { id: string } }) => ( ), cell: ({ row }: { row: Row }) => ( {GetFormatedDate(row.getValue("updated_at"))} ), }, ]; }; export default function Index({ dynamicPageModels, searchFields, modelName, }: { dynamicPageModels: Resource; searchFields: string; modelName: string; }) { const { auth, appEnv } = usePage().props as unknown as { auth: AuthProp; appEnv: AppEnv; }; const { viewAny, viewTrash, create } = auth.policies.dynamicPages; const { viewAny: viewAnyPageConfigs } = auth.policies.pageConfigs; const isArchiveRoute = route().current(`back.${modelName}.trash`); const actionModels = isArchiveRoute ? [Views.RESTORATION, Views.FORCEDELETION] : [ Views.VISUALIZATION, Views.EDITION, Views.DUPLICATION, Views.ARCHIVATION, ]; const columns = getColumns(appEnv, modelName, viewAny, viewAnyPageConfigs); const transModel = useTrans( `models.classes.${str(modelName).singular().value()}`, { choice: 2 }, ); const transArchiveTitle = useTrans("crud.helpers.archives_model", { params: { model: transModel }, }); const transTitle = str(isArchiveRoute ? transArchiveTitle : transModel) .ucFirst() .value(); const transBackToList = useTrans("back.crud_back_to_list"); const beforeNode = () => { return ( isArchiveRoute && viewAny && (
} tooltipContent={

{transBackToList}

} />
) ); }; const transAccessToArchived = useTrans("back.crud_access_to", { params: { target: useTrans("back.archived_entries"), }, }); const transAddEntry = useTrans("back.crud_add_entry"); const afterNode = () => { return ( !isArchiveRoute && (
{viewTrash && ( } tooltipContent={

{transAccessToArchived}

} variant="outline" /> )} {create && ( } tooltipContent={

{transAddEntry}

} /> )}
) ); }; return ( {isArchiveRoute && } ); }