import Avatar from "@mui/material/Avatar"; import Box from "@mui/material/Box"; import Button from "@mui/material/Button"; import Stack from "@mui/material/Stack"; import TextField from "@mui/material/TextField"; import Typography from "@mui/material/Typography"; import Alert from "@mui/material/Alert"; import { useCallback, useMemo, useState } from "react"; import { useParams } from "react-router-dom"; import { listOrganizations } from "../api/business.js"; import { useExternalAuth } from "../auth/ExternalAuthProvider.jsx"; import { hasExternalCapability } from "../config/capabilities.js"; import { useExternalI18n } from "../i18n/ExternalI18nProvider.jsx"; import { ExternalPage, ExternalPageState, PagePagination, ResponsiveDataList, StatusChip } from "../shared/PageComponents.jsx"; import { usePagedResource } from "../shared/usePagedResource.js"; const organizationKinds = { agencies: { capability: "agency:list", titleKey: "organization.agencies" }, bds: { capability: "bd:list", titleKey: "organization.bds" }, "bd-leaders": { capability: "bd-manager:list", titleKey: "organization.bdManagers" }, hosts: { capability: "host:list", titleKey: "organization.hosts" }, managers: { capability: "bd-manager:list", titleKey: "organization.managers" }, "super-admins": { capability: "super-admin:list", titleKey: "organization.superAdmins" }, team: { capability: "team:view", titleKey: "organization.team" } }; export default function OrganizationPage() { const { kind = "hosts" } = useParams(); const config = organizationKinds[kind]; const { session } = useExternalAuth(); const { t } = useExternalI18n(); const [keyword, setKeyword] = useState(""); const [query, setQuery] = useState({ keyword: "", page: 1 }); const allowed = Boolean(config && hasExternalCapability(session, config.capability)); const load = useCallback(() => allowed ? listOrganizations(kind, { keyword: query.keyword, page: query.page, page_size: 20 }) : Promise.resolve({ items: [], page: 1, pageSize: 20, total: 0 }), [allowed, kind, query]); const { data, error, loading, reload } = usePagedResource(load); const columns = useMemo(() => kind === "team" ? [ { key: "agency", label: t("organization.agency"), render: (item) => {t("organization.agencyReference", { id: item.id || "-" })}{t("organization.owner")} {item.userId || "-"} }, { key: "parent", label: t("organization.parentBd"), render: (item) => item.parentBdUserId || "-" }, { key: "status", label: t("common.status"), render: (item) => } ] : [ { key: "identity", label: t("organization.member"), render: (item) => {(item.name || item.username || "-").slice(0, 1)}{item.name || item.username || "-"}ID {item.id || "-"}{item.userId && item.userId !== item.id ? ` / ${t("organization.userReference", { id: item.userId })}` : ""} }, { key: "prettyId", label: t("users.prettyId"), render: (item) => item.prettyId || "-" }, { key: "country", label: t("organization.country"), render: (item) => item.country || "-" }, { key: "status", label: t("common.status"), render: (item) => } ], [kind, t]); if (!config || !allowed) { return {t("organization.noPermission")}; } return ( { event.preventDefault(); setQuery({ keyword, page: 1 }); }}> setKeyword(event.target.value)} /> {kind === "team" && !loading && !error ? ( {t("organization.bdLeaderCount", { count: data.totalBdLeaders || 0 })} {t("organization.bdCount", { count: data.totalBds || 0 })} {t("organization.agencyCount", { count: data.total || data.items.length })} {data.truncated ? {t("organization.truncated")} : null} ) : null} {!loading && !error ? <> item.id || index} /> setQuery({ ...query, page })} /> : null} ); }