"use client"; import React, { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { PlusIcon, EditIcon, DeleteIcon } from "@/components/icons"; import { Tenant, TenantCreateRequest, getTenantList, createTenant, deleteTenant, } from "@/service/tenant"; import SiteBreadcrumb from "@/components/site-breadcrumb"; import Swal from "sweetalert2"; import { FormField } from "@/components/form/common/FormField"; import { getCookiesDecrypt } from "@/lib/utils"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; export default function TenantsManagementPage() { const router = useRouter(); const [tenants, setTenants] = useState([]); const [parentTenants, setParentTenants] = useState([]); const [isLoading, setIsLoading] = useState(false); const [isDialogOpen, setIsDialogOpen] = useState(false); const [formData, setFormData] = useState({ name: "", description: "", clientType: "standalone", parentClientId: undefined, maxUsers: undefined, maxStorage: undefined, address: "", phoneNumber: "", website: "", }); useEffect(() => { // Check if user has roleId = 1 const roleId = getCookiesDecrypt("urie"); if (Number(roleId) !== 1) { Swal.fire({ title: "Access Denied", text: "You don't have permission to access this page", icon: "error", confirmButtonText: "OK", customClass: { popup: 'swal-z-index-9999' } }).then(() => { router.push("/admin/dashboard"); }); return; } loadData(); }, [router]); const loadData = async () => { setIsLoading(true); try { const [tenantsRes, parentRes] = await Promise.all([ getTenantList({ limit: 100 }), getTenantList({ clientType: "parent_client", limit: 100 }), ]); if (!tenantsRes?.error) { setTenants(tenantsRes?.data?.data || []); } if (!parentRes?.error) { setParentTenants(parentRes?.data?.data || []); } } catch (error) { console.error("Error loading tenants:", error); } finally { setIsLoading(false); } }; const handleOpenDialog = () => { setFormData({ name: "", description: "", clientType: "standalone", parentClientId: undefined, maxUsers: undefined, maxStorage: undefined, address: "", phoneNumber: "", website: "", }); setIsDialogOpen(true); }; const handleSave = async () => { try { const createData: TenantCreateRequest = { name: formData.name, description: formData.description || undefined, clientType: formData.clientType, parentClientId: formData.parentClientId || undefined, maxUsers: formData.maxUsers, maxStorage: formData.maxStorage, address: formData.address || undefined, phoneNumber: formData.phoneNumber || undefined, website: formData.website || undefined, }; const res = await createTenant(createData); if (res?.error) { Swal.fire({ title: "Error", text: res?.message || "Failed to create tenant", icon: "error", confirmButtonText: "OK", customClass: { popup: 'swal-z-index-9999' } }); } else { Swal.fire({ title: "Success", text: "Tenant created successfully", icon: "success", confirmButtonText: "OK", customClass: { popup: 'swal-z-index-9999' } }); await loadData(); setIsDialogOpen(false); } } catch (error) { console.error("Error saving tenant:", error); Swal.fire({ title: "Error", text: "An unexpected error occurred", icon: "error", confirmButtonText: "OK", customClass: { popup: 'swal-z-index-9999' } }); } }; const handleDelete = async (tenant: Tenant) => { const result = await Swal.fire({ title: "Delete Tenant?", text: `Are you sure you want to delete "${tenant.name}"? This action cannot be undone.`, icon: "warning", showCancelButton: true, confirmButtonText: "Yes, delete it", cancelButtonText: "Cancel", customClass: { popup: 'swal-z-index-9999' } }); if (result.isConfirmed) { try { const res = await deleteTenant(tenant.id); if (res?.error) { Swal.fire({ title: "Error", text: res?.message || "Failed to delete tenant", icon: "error", confirmButtonText: "OK", customClass: { popup: 'swal-z-index-9999' } }); } else { Swal.fire({ title: "Deleted!", text: "Tenant has been deleted.", icon: "success", confirmButtonText: "OK", customClass: { popup: 'swal-z-index-9999' } }); await loadData(); } } catch (error) { console.error("Error deleting tenant:", error); Swal.fire({ title: "Error", text: "An unexpected error occurred", icon: "error", confirmButtonText: "OK", customClass: { popup: 'swal-z-index-9999' } }); } } }; const roleId = getCookiesDecrypt("urie"); if (Number(roleId) !== 1) { return null; // Will redirect in useEffect } return ( <>

Tenant Management

Manage system tenants and their configurations

{/* @ts-ignore - DialogContent accepts children */} Create New Tenant
setFormData({ ...formData, name: value })} required /> setFormData({ ...formData, description: value })} /> setFormData({ ...formData, clientType: value as any })} options={[ { value: "standalone", label: "Standalone" }, { value: "parent_client", label: "Parent Client" }, { value: "sub_client", label: "Sub Client" }, ]} required /> {formData.clientType === "sub_client" && ( setFormData({ ...formData, parentClientId: value === "none" ? undefined : value })} options={[ { value: "none", label: "Select a parent tenant" }, ...parentTenants.map((tenant) => ({ value: tenant.id, label: tenant.name, })), ]} required /> )}
setFormData({ ...formData, maxUsers: value ? Number(value) : undefined })} helpText="Maximum number of users allowed" /> setFormData({ ...formData, maxStorage: value ? Number(value) : undefined })} helpText="Maximum storage in MB" />
setFormData({ ...formData, address: value })} />
setFormData({ ...formData, phoneNumber: value })} /> setFormData({ ...formData, website: value })} />
{isLoading ? (

Loading tenants...

) : tenants.length > 0 ? ( Name Type Parent Address Phone Status Actions {tenants.map((tenant) => { const parentTenant = tenants.find((t) => t.id === tenant.parentClientId); return ( {tenant.name} {tenant.clientType.replace("_", " ")} {parentTenant?.name || "-"} {tenant.address || "-"} {tenant.phoneNumber || "-"} {tenant.isActive ? ( Active ) : ( Inactive )}
); })}
) : (

No Tenants Found

Create your first tenant to get started

)}
); }