"use client"; import React, { useState } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { PlusIcon, SettingsIcon, UsersIcon, WorkflowIcon, } from "@/components/icons"; import { ChevronDownIcon, ChevronUpIcon } from "@/components/icons"; import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "@/components/ui/collapsible"; import { ApprovalWorkflowForm } from "@/components/form/ApprovalWorkflowForm"; import { UserLevelsForm } from "@/components/form/UserLevelsForm"; import { useWorkflowModal } from "@/components/modals/WorkflowModalProvider"; import { useWorkflowStatusCheck } from "@/hooks/useWorkflowStatusCheck"; import { useLocalStorage } from "@/hooks/use-local-storage"; import { CreateApprovalWorkflowWithClientSettingsRequest, UserLevelsCreateRequest, UserLevel, getUserLevels, getApprovalWorkflowComprehensiveDetails, ComprehensiveWorkflowResponse, createUserLevel, } from "@/service/approval-workflows"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, PaginationState, useReactTable, } from "@tanstack/react-table"; import TablePagination from "@/components/table/table-pagination"; import useTableColumns from "./columns"; import { errorAutoClose, successAutoClose } from "@/lib/swal"; import { close, loading } from "@/config/swal"; import DetailTenant from "@/components/form/tenant/tenant-detail-update-form"; function TenantSettingsContentTable() { const [activeTab, setActiveTab] = useLocalStorage( "tenant-settings-active-tab", "profile", ); const [isUserLevelDialogOpen, setIsUserLevelDialogOpen] = useState(false); const [workflow, setWorkflow] = useState(null); const [userLevels, setUserLevels] = useState([]); const [isLoading, setIsLoading] = useState(false); const [isEditingWorkflow, setIsEditingWorkflow] = useState(false); const { checkWorkflowStatus } = useWorkflowStatusCheck(); const { showWorkflowModal } = useWorkflowModal(); const [isEditDialogOpen, setIsEditDialogOpen] = React.useState(false); const [editingUserLevel, setEditingUserLevel] = React.useState(null); const [isHierarchyExpanded, setIsHierarchyExpanded] = useState(false); const handleEditUserLevel = (userLevel: UserLevel) => { setEditingUserLevel(userLevel); setIsEditDialogOpen(true); }; React.useEffect(() => { loadData(); }, []); const loadData = async () => { setIsLoading(true); try { const [comprehensiveWorkflowRes, userLevelsRes] = await Promise.all([ getApprovalWorkflowComprehensiveDetails(), getUserLevels(), ]); if (!comprehensiveWorkflowRes?.error) { setWorkflow(comprehensiveWorkflowRes?.data?.data || null); } else { setWorkflow(null); } if (!userLevelsRes?.error) { const data = userLevelsRes?.data?.data ?? []; data.forEach((item: any, index: number) => { item.no = (page - 1) * Number(showData) + index + 1; item.parentLevelName = data.length > 0 ? data.find((ul: any) => ul.id === item.parentLevelId)?.name || `Level ${item.parentLevelId}` : `Level ${item.parentLevelId}`; }); setUserLevels(data); console.log("LLL", data); setTotalData(data.length); setTotalPage(Math.ceil(data.length / Number(showData))); } } catch (error) { console.error("Error loading data:", error); } finally { setIsLoading(false); } }; const handleWorkflowSave = async ( data: CreateApprovalWorkflowWithClientSettingsRequest, ) => { setIsEditingWorkflow(false); await loadData(); }; const handleUserLevelSave = async (data: UserLevelsCreateRequest) => { try { loading(); const response = await createUserLevel(data); close(); if (response?.error) { errorAutoClose(response.message || "Gagal membuat user level."); return; } successAutoClose("User level berhasil dibuat."); setIsUserLevelDialogOpen(false); setTimeout(async () => { await loadData(); }, 3000); } catch (error) { close(); errorAutoClose("Terjadi kesalahan saat membuat user level."); console.error("Error creating user level:", error); } }; const handleBulkUserLevelSave = async (data: UserLevelsCreateRequest[]) => { setIsUserLevelDialogOpen(false); await loadData(); }; const columns = React.useMemo( () => useTableColumns((data) => handleEditUserLevel(data)), [], ); const [showData, setShowData] = React.useState("10"); const [page, setPage] = React.useState(1); const [totalPage, setTotalPage] = React.useState(1); const [totalData, setTotalData] = React.useState(1); const [pagination, setPagination] = React.useState({ pageIndex: 0, pageSize: Number(showData), }); const table = useReactTable({ data: userLevels, columns, // onSortingChange: setSorting, // onColumnFiltersChange: setColumnFilters, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), getSortedRowModel: getSortedRowModel(), getFilteredRowModel: getFilteredRowModel(), // onColumnVisibilityChange: setColumnVisibility, // onRowSelectionChange: setRowSelection, onPaginationChange: setPagination, state: { // sorting, // columnFilters, // columnVisibility, // rowSelection, pagination, }, }); return (

Tenant Settings

Manage approval workflows and user levels for your tenant

{/*
*/}
Detail Tenant Approval Workflows User Levels {/* Approval Workflows Tab */}

Approval Workflow Setup

{workflow && !isEditingWorkflow && ( )}
{/* {isEditingWorkflow && workflow && workflow.workflow?.id ? ( */} {isEditingWorkflow ? ( Setup Approval Workflow ({ stepOrder: step.stepOrder, stepName: step.stepName, requiredUserLevelId: step.requiredUserLevelId, canSkip: step.canSkip, autoApproveAfterHours: step.autoApproveAfterHours, isActive: step.isActive, conditionType: step.conditionType, conditionValue: step.conditionValue, })) || [], clientApprovalSettings: { approvalExemptCategories: workflow.clientSettings.exemptCategoriesDetails || [], approvalExemptRoles: workflow.clientSettings.exemptRolesDetails || [], approvalExemptUsers: workflow.clientSettings.exemptUsersDetails || [], autoPublishArticles: workflow.clientSettings.autoPublishArticles, isActive: workflow.clientSettings.isActive, requireApprovalFor: workflow.clientSettings.requireApprovalFor || [], requiresApproval: workflow.clientSettings.requiresApproval, skipApprovalFor: workflow.clientSettings.skipApprovalFor || [], }, } : undefined } onSave={handleWorkflowSave} onCancel={() => setIsEditingWorkflow(false)} /> ) : workflow ? ( {workflow.workflow.name}
{workflow.workflow.isDefault && ( Default )} {workflow.workflow.isActive ? ( Active ) : ( Inactive )}

{workflow.workflow.description}

{workflow.workflow.totalSteps}
Total Steps
{workflow.workflow.activeSteps}
Active Steps
{ // workflow.workflow.requiresApproval workflow.clientSettings.requiresApproval ? "Yes" : "No" }
Requires Approval
{ // workflow.workflow.autoPublish workflow.clientSettings.autoPublishArticles ? "Yes" : "No" }
Auto Publish
{/* Workflow Steps Overview */} {workflow.steps && workflow.steps.length > 0 && (

Workflow Steps

{workflow.steps.map((step: any, index: number) => (
{step.stepOrder}
{step.stepName}
{step.conditionType && `Condition: ${step.conditionType}`} {step.autoApproveAfterHours && ` • Auto-approve after ${step.autoApproveAfterHours}h`} {step.requiredUserLevelName && ` • Required Level: ${step.requiredUserLevelName}`}
{step.canSkip && ( Can Skip )} {step.isParallel && ( Parallel )} {step.isActive && ( Active )} {step.isFirstStep && ( First Step )} {step.isLastStep && ( Last Step )}
))}
)} {/* Client Settings */}

Client Settings

Default Workflow
{workflow.clientSettings.defaultWorkflowName}
Auto Publish Articles
{workflow.clientSettings.autoPublishArticles ? "Yes" : "No"}
Requires Approval
{workflow.clientSettings.requiresApproval ? "Yes" : "No"}
Settings Active
{workflow.clientSettings.isActive ? "Yes" : "No"}
{/* Statistics */}

Workflow Statistics

Total Articles Processed
{workflow.statistics.totalArticlesProcessed}
Pending Articles
{workflow.statistics.pendingArticles}
Approved Articles
{workflow.statistics.approvedArticles}
Rejected Articles
{workflow.statistics.rejectedArticles}
Average Processing Time
{workflow.statistics.averageProcessingTime}h
Most Active Step
{workflow.statistics.mostActiveStep || "N/A"}
{/* Workflow Metadata */}

Workflow Information

Client ID
{workflow.workflow.clientId}
Created At
{new Date(workflow.workflow.createdAt).toLocaleString()}
Updated At
{new Date(workflow.workflow.updatedAt).toLocaleString()}
Workflow ID
{workflow.workflow.id}
Has Branches
{workflow.workflow.hasBranches ? "Yes" : "No"}
Max Step Order
{workflow.workflow.maxStepOrder}
) : (

No Workflow Configured

Set up your approval workflow to manage content approval process

)}
{/* User Levels Tab */}

User Levels

Create New User Level setIsUserLevelDialogOpen(false)} />
{/* User Levels Summary */} {userLevels.length > 0 && (
{userLevels.length}
Total User Levels
{userLevels.filter((ul) => ul.isActive).length}
Active Levels
{userLevels.filter((ul) => ul.isApprovalActive).length}
Approval Active
{userLevels.filter((ul) => ul.parentLevelId).length}
Child Levels
)} {/* User Levels Hierarchy */} {userLevels.length > 0 && (
User Levels Hierarchy
{isHierarchyExpanded ? ( ) : ( )}
{userLevels .filter((ul) => !ul.parentLevelId) .sort((a, b) => a.levelNumber - b.levelNumber) .map((rootLevel) => (
{/* Root Level */}
{rootLevel.levelNumber}
{rootLevel.name}
{rootLevel.aliasName} •{" "} {rootLevel.group || "No group"}
{rootLevel.isActive && ( Active )} {rootLevel.isApprovalActive && ( Approval Active )}
{/* Child Levels */} {userLevels .filter((ul) => ul.parentLevelId === rootLevel.id) .sort((a, b) => a.levelNumber - b.levelNumber) .map((childLevel) => (
{childLevel.levelNumber}
{childLevel.name}
{childLevel.aliasName} •{" "} {childLevel.group || "No group"}
{childLevel.isActive && ( Active )} {childLevel.isApprovalActive && ( Approval )}
))}
))}
)} {table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( {header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext(), )} ))} ))} {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender( cell.column.columnDef.cell, cell.getContext(), )} ))} )) ) : ( No results. )}
{editingUserLevel ? `Edit User Level: ${editingUserLevel.name}` : "Edit User Level"} {editingUserLevel ? ( { // The form handles the update internally setIsEditDialogOpen(false); setEditingUserLevel(null); await loadData(); }} onCancel={() => { setIsEditDialogOpen(false); setEditingUserLevel(null); }} /> ) : (

Loading...

)}
{/*
{userLevels.length > 0 ? userLevels.map((userLevel) => ( {userLevel.name}
Level {userLevel.levelNumber} {userLevel.isActive ? ( Active ) : ( Inactive )}
Alias: {userLevel.aliasName}
{userLevel.group && (
Group: {userLevel.group}
)}
Approval Active: {userLevel.isApprovalActive ? 'Yes' : 'No'}
{userLevel.parentLevelId && (
Parent Level: { userLevels.length > 0 ? userLevels.find(ul => ul.id === userLevel.parentLevelId)?.name || `Level ${userLevel.parentLevelId}` : `Level ${userLevel.parentLevelId}`}
)} {userLevel.provinceId && (
Province: Province {userLevel.provinceId}
)}
Created: {userLevel.createdAt ? new Date(userLevel.createdAt).toLocaleDateString() : 'N/A'}
)) : ''}
*/} {userLevels.length === 0 && !isLoading && (

No User Levels Found

Create your first user level to define approval hierarchy

)}
); } export default function TenantSettingsPageTable() { return ; }