mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-29 16:28:12 +00:00
211 lines
6.5 KiB
TypeScript
211 lines
6.5 KiB
TypeScript
import { useMemo, useState } from "react";
|
|
import { useTranslation } from "react-i18next";
|
|
import { ArchiveRestore, Building2, Landmark } from "lucide-react";
|
|
|
|
import {
|
|
Card,
|
|
CardContent,
|
|
CardHeader,
|
|
CardTitle,
|
|
} from "@/shared/common/ui/card";
|
|
import { Button } from "@/shared/common/ui/button";
|
|
import {
|
|
Select,
|
|
SelectContent,
|
|
SelectItem,
|
|
SelectTrigger,
|
|
SelectValue,
|
|
} from "@/shared/common/ui/select";
|
|
import { AdvancedTable } from "@/shared/common/ui/table/AdvancedTable";
|
|
import { useLocalizedName } from "@/shared/common/localizedName";
|
|
import { useOrganizations } from "@/super-admin/hooks/useOrganizations";
|
|
import {
|
|
useArchivedOrganizations,
|
|
useArchivedUnits,
|
|
useArchiveActions,
|
|
} from "@/user-management/hooks/useArchived";
|
|
|
|
type Tab = "organizations" | "units";
|
|
|
|
const SuperAdminArchivedPage = () => {
|
|
const { t } = useTranslation();
|
|
const localizedName = useLocalizedName();
|
|
|
|
const [activeTab, setActiveTab] = useState<Tab>("organizations");
|
|
|
|
const { organizationsResponse } = useOrganizations("Org", {
|
|
take: 300,
|
|
skip: 0,
|
|
});
|
|
const organizations: any[] = organizationsResponse?.items ?? [];
|
|
|
|
const [selectedOrgId, setSelectedOrgId] = useState<string>("");
|
|
if (!selectedOrgId && organizations.length > 0) {
|
|
setSelectedOrgId(organizations[0].id);
|
|
}
|
|
|
|
const {
|
|
data: archivedOrgsData,
|
|
refetch: refetchArchivedOrgs,
|
|
} = useArchivedOrganizations();
|
|
const { data: archivedUnitsData, refetch: refetchArchivedUnits } =
|
|
useArchivedUnits(activeTab === "units" ? selectedOrgId || undefined : undefined);
|
|
|
|
const archivedOrgs: any[] = useMemo(
|
|
() => archivedOrgsData?.items ?? archivedOrgsData ?? [],
|
|
[archivedOrgsData],
|
|
);
|
|
const archivedUnits: any[] = useMemo(
|
|
() => archivedUnitsData?.items ?? archivedUnitsData ?? [],
|
|
[archivedUnitsData],
|
|
);
|
|
|
|
const {
|
|
restoreUnit,
|
|
isRestoringUnit,
|
|
restoreOrganization,
|
|
isRestoringOrganization,
|
|
} = useArchiveActions();
|
|
|
|
const orgColumns = [
|
|
{
|
|
id: "name",
|
|
header: t("organization.name", "Name"),
|
|
cell: ({ row }: any) => localizedName(row.original?.name) || "—",
|
|
},
|
|
{
|
|
id: "key",
|
|
header: t("organization.key", "Key"),
|
|
accessorKey: "key",
|
|
},
|
|
{
|
|
id: "actions",
|
|
header: t("userIncomingretun.Actions", "Actions"),
|
|
cell: ({ row }: any) => (
|
|
<Button
|
|
size="sm"
|
|
variant="outline"
|
|
disabled={isRestoringOrganization}
|
|
onClick={() => restoreOrganization(row.original.id)}
|
|
className="flex items-center gap-2 text-primary-700 hover:bg-primary-50">
|
|
<ArchiveRestore className="h-4 w-4" />
|
|
{t("archive.restore", "Restore")}
|
|
</Button>
|
|
),
|
|
},
|
|
];
|
|
|
|
const unitColumns = [
|
|
{
|
|
id: "name",
|
|
header: t("organization.name", "Name"),
|
|
cell: ({ row }: any) => localizedName(row.original?.name) || "—",
|
|
},
|
|
{
|
|
id: "key",
|
|
header: t("organization.key", "Key"),
|
|
accessorKey: "key",
|
|
},
|
|
{
|
|
id: "actions",
|
|
header: t("userIncomingretun.Actions", "Actions"),
|
|
cell: ({ row }: any) => (
|
|
<Button
|
|
size="sm"
|
|
variant="outline"
|
|
disabled={isRestoringUnit}
|
|
onClick={() => restoreUnit(row.original.id)}
|
|
className="flex items-center gap-2 text-primary-700 hover:bg-primary-50">
|
|
<ArchiveRestore className="h-4 w-4" />
|
|
{t("archive.restore", "Restore")}
|
|
</Button>
|
|
),
|
|
},
|
|
];
|
|
|
|
return (
|
|
<div className="p-6 space-y-6">
|
|
<Card className="shadow-none border-none bg-transparent px-0">
|
|
<CardHeader className="flex flex-row justify-between items-center px-0">
|
|
<CardTitle className="text-xl font-semibold">
|
|
{t("archive.archivedItems", "Archived Items")}
|
|
</CardTitle>
|
|
</CardHeader>
|
|
|
|
<div className="flex gap-2 mb-4">
|
|
<Button
|
|
variant={activeTab === "organizations" ? "default" : "outline"}
|
|
onClick={() => setActiveTab("organizations")}
|
|
className="flex items-center gap-2">
|
|
<Landmark className="h-4 w-4" />
|
|
{t("archive.archivedOrganizations", "Archived Organizations")}
|
|
</Button>
|
|
<Button
|
|
variant={activeTab === "units" ? "default" : "outline"}
|
|
onClick={() => setActiveTab("units")}
|
|
className="flex items-center gap-2">
|
|
<Building2 className="h-4 w-4" />
|
|
{t("archive.archivedUnits", "Archived Units")}
|
|
</Button>
|
|
</div>
|
|
|
|
{activeTab === "units" && organizations.length > 0 && (
|
|
<div className="mb-4 w-full sm:w-1/2">
|
|
<label className="block text-sm font-medium text-gray-700 dark:text-gray-200">
|
|
{t("organization.selectOrganization", "Select Organization")}
|
|
</label>
|
|
<Select
|
|
value={selectedOrgId}
|
|
onValueChange={(value) => setSelectedOrgId(value)}>
|
|
<SelectTrigger className="mt-1 block w-full">
|
|
<SelectValue
|
|
placeholder={t("organization.selectOrganization")}
|
|
/>
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
{organizations.map((org: any) => (
|
|
<SelectItem key={org.id} value={org.id}>
|
|
{localizedName(org.name)}
|
|
</SelectItem>
|
|
))}
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
)}
|
|
|
|
<CardContent className="px-0">
|
|
{activeTab === "organizations" ? (
|
|
<AdvancedTable
|
|
columns={orgColumns as any}
|
|
data={archivedOrgs}
|
|
tableName="ArchivedOrganizations"
|
|
toolBarPosition="right"
|
|
itemCount={archivedOrgs.length}
|
|
pageIndex={0}
|
|
onPageChange={() => {}}
|
|
nextFunction={() => {}}
|
|
prevFunction={() => {}}
|
|
refresh={refetchArchivedOrgs}
|
|
/>
|
|
) : (
|
|
<AdvancedTable
|
|
columns={unitColumns as any}
|
|
data={archivedUnits}
|
|
tableName="ArchivedUnits"
|
|
toolBarPosition="right"
|
|
itemCount={archivedUnits.length}
|
|
pageIndex={0}
|
|
onPageChange={() => {}}
|
|
nextFunction={() => {}}
|
|
prevFunction={() => {}}
|
|
refresh={refetchArchivedUnits}
|
|
/>
|
|
)}
|
|
</CardContent>
|
|
</Card>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default SuperAdminArchivedPage;
|