"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, DotsIcon, DeleteIcon, } from "@/components/icons"; import { ApprovalWorkflowForm } from "@/components/form/ApprovalWorkflowForm"; import { UserLevelsForm } from "@/components/form/UserLevelsForm"; import { useWorkflowModal } from "@/components/modals/WorkflowModalProvider"; import { useWorkflowStatusCheck } from "@/hooks/useWorkflowStatusCheck"; 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 useTableColumns from "./component/columns"; import TablePagination from "@/components/table/table-pagination"; import TenantSettingsPageTable from "./component/tenant-settings-content-table"; function TenantSettingsContent() { const [activeTab, setActiveTab] = useState("workflows"); 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 [editingUserLevel, setEditingUserLevel] = useState( null, ); const { checkWorkflowStatus } = useWorkflowStatusCheck(); const { showWorkflowModal } = useWorkflowModal(); // Load data on component mount 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) { setUserLevels(userLevelsRes?.data?.data || []); } } catch (error) { console.error("Error loading data:", error); } finally { setIsLoading(false); } }; const handleWorkflowSave = async ( data: CreateApprovalWorkflowWithClientSettingsRequest, ) => { setIsEditingWorkflow(false); await loadData(); // Reload data after saving }; const handleUserLevelSave = async (data: UserLevelsCreateRequest) => { try { const response = await createUserLevel(data); if (response?.error) { console.error("Error creating user level:", response?.message); // You can add error handling here (e.g., show error message) } else { console.log("User level created successfully:", response); // You can add success handling here (e.g., show success message) } } catch (error) { console.error("Error creating user level:", error); } setIsUserLevelDialogOpen(false); setEditingUserLevel(null); await loadData(); // Reload data after saving }; const handleEditUserLevel = (userLevel: UserLevel) => { setEditingUserLevel(userLevel); setIsUserLevelDialogOpen(true); }; const handleDeleteUserLevel = async (userLevel: UserLevel) => { if ( window.confirm( `Are you sure you want to delete "${userLevel.name}"? This action cannot be undone.`, ) ) { try { // TODO: Implement delete API call console.log("Delete user level:", userLevel.id); await loadData(); // Reload data after deletion } catch (error) { console.error("Error deleting user level:", error); } } }; const handleBulkUserLevelSave = async (data: UserLevelsCreateRequest[]) => { setIsUserLevelDialogOpen(false); await loadData(); // Reload data after saving }; return (

Tenant Settings

Manage approval workflows and user levels for your tenant

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

Approval Workflow Setup

{workflow && !isEditingWorkflow && ( )}
{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 } workflowId={workflow?.workflow.id} 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 ? "Yes" : "No"}
Requires Approval
{workflow.workflow.autoPublish ? "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

{editingUserLevel ? `Edit User Level: ${editingUserLevel.name}` : "Create New User Level"} { setIsUserLevelDialogOpen(false); setEditingUserLevel(null); }} />
{/* 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
{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 )}
))}
))}
)} {/*
{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 TenantSettingsPage() { return ; }