"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 { ApprovalWorkflowForm } from "@/components/form/ApprovalWorkflowForm"; import { UserLevelsForm } from "@/components/form/UserLevelsForm"; import { WorkflowModalProvider } from "@/components/modals/WorkflowModalProvider"; import { useWorkflowStatusCheck } from "@/hooks/useWorkflowStatusCheck"; import { CreateApprovalWorkflowWithClientSettingsRequest, UserLevelsCreateRequest, UserLevel, getUserLevels, getApprovalWorkflows, } from "@/service/approval-workflows"; 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 { checkWorkflowStatus } = useWorkflowStatusCheck(); // Load data on component mount React.useEffect(() => { loadData(); }, []); const loadData = async () => { setIsLoading(true); try { const [workflowsRes, userLevelsRes] = await Promise.all([ getApprovalWorkflows(), getUserLevels(), ]); if (!workflowsRes?.error) { const workflows = workflowsRes?.data || []; // Set the first workflow as the single workflow for this tenant setWorkflow(workflows.length > 0 ? workflows[0] : 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) => { setIsUserLevelDialogOpen(false); await loadData(); // Reload data after saving }; 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 setIsEditingWorkflow(false)} /> ) : workflow ? ( {workflow.name}
{workflow.isDefault && ( Default )} {workflow.isActive ? ( Active ) : ( Inactive )}

{workflow.description}

{workflow.steps?.length || 0}
Workflow Steps
{workflow.requiresApproval ? 'Yes' : 'No'}
Requires Approval
{workflow.autoPublish ? 'Yes' : 'No'}
Auto Publish
{workflow.clientApprovalSettings?.approvalExemptUsers?.length || 0}
Exempt Users
{/* 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.canSkip && ( Can Skip )} {step.isParallel && ( Parallel )}
))}
)} {/* Client Settings Overview */} {workflow.clientApprovalSettings && (

Client Approval Settings

Exempt Users
{workflow.clientApprovalSettings.approvalExemptUsers?.length || 0} users
Exempt Roles
{workflow.clientApprovalSettings.approvalExemptRoles?.length || 0} roles
Exempt Categories
{workflow.clientApprovalSettings.approvalExemptCategories?.length || 0} categories
Content Types
{workflow.clientApprovalSettings.requireApprovalFor?.length || 0} requiring approval
)}
) : (

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
{userLevels .filter(ul => !ul.parentLevelId) // Root levels .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.find(ul => ul.id === userLevel.parentLevelId)?.name || `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 ( ); }