in public/apps/configuration/panels/tenant-list/tenant-list.tsx [64:207]
export function TenantList(props: AppDependencies) {
const [tenantData, setTenantData] = React.useState<Tenant[]>([]);
const [errorFlag, setErrorFlag] = React.useState(false);
const [selection, setSelection] = React.useState<Tenant[]>([]);
const [currentTenant, setCurrentTenant] = useState('');
const [currentUsername, setCurrentUsername] = useState('');
// Modal state
const [editModal, setEditModal] = useState<ReactNode>(null);
const [toasts, addToast, removeToast] = useToastState();
const [loading, setLoading] = useState(false);
const [query, setQuery] = useState<Query | null>(null);
// Configuration
const isPrivateEnabled = props.config.multitenancy.tenants.enable_private;
const fetchData = useCallback(async () => {
try {
setLoading(true);
const rawTenantData = await fetchTenants(props.coreStart.http);
const processedTenantData = transformTenantData(rawTenantData, isPrivateEnabled);
const activeTenant = await fetchCurrentTenant(props.coreStart.http);
const currentUser = await getCurrentUser(props.coreStart.http);
setCurrentUsername(currentUser);
setCurrentTenant(resolveTenantName(activeTenant, currentUser));
setTenantData(processedTenantData);
} catch (e) {
console.log(e);
setErrorFlag(true);
} finally {
setLoading(false);
}
}, [isPrivateEnabled, props.coreStart.http]);
React.useEffect(() => {
fetchData();
}, [props.coreStart.http, fetchData]);
const handleDelete = async () => {
const tenantsToDelete: string[] = selection.map((r) => r.tenant);
try {
await requestDeleteTenant(props.coreStart.http, tenantsToDelete);
setTenantData(difference(tenantData, selection));
setSelection([]);
} catch (e) {
console.log(e);
} finally {
closeActionsMenu();
}
};
const [showDeleteConfirmModal, deleteConfirmModal] = useDeleteConfirmState(
handleDelete,
'tenant(s)'
);
const changeTenant = async (tenantValue: string) => {
const selectedTenant = await selectTenant(props.coreStart.http, {
tenant: tenantValue,
username: currentUsername,
});
setCurrentTenant(resolveTenantName(selectedTenant, currentUsername));
};
const getTenantName = (tenantValue: string) => {
return tenantData.find((tenant: Tenant) => tenant.tenantValue === tenantValue)?.tenant;
};
const switchToSelectedTenant = async (tenantValue: string, tenantName: string) => {
try {
await changeTenant(tenantValue);
// refresh the page to let the page to reload app configs, like dark mode etc.
// also refresh the tenant to ensure tenant is set correctly when sharing urls.
window.location.reload();
} catch (e) {
console.log(e);
addToast(createUnknownErrorToast('selectFailed', `select ${tenantName} tenant`));
} finally {
closeActionsMenu();
}
};
const viewOrCreateDashboard = async (tenantValue: string, action: string) => {
try {
await changeTenant(tenantValue);
window.location.href = getNavLinkById(props.coreStart, PageId.dashboardId);
} catch (e) {
console.log(e);
addToast(
createUnknownErrorToast(
`${action}Dashboard`,
`${action} dashboard for ${getTenantName(tenantValue)} tenant`
)
);
}
};
const viewOrCreateVisualization = async (tenantValue: string, action: string) => {
try {
await changeTenant(tenantValue);
window.location.href = getNavLinkById(props.coreStart, PageId.visualizationId);
} catch (e) {
console.log(e);
addToast(
createUnknownErrorToast(
`${action}Visualization`,
`${action} visualization for ${getTenantName(tenantValue)} tenant`
)
);
}
};
const columns = [
{
field: 'tenant',
name: 'Name',
render: (tenantName: string) => (
<>
{tenantName}
{tenantName === currentTenant && (
<>
<EuiBadge>Current</EuiBadge>
</>
)}
</>
),
sortable: true,
},
{
field: 'description',
name: 'Description',
truncateText: true,
},
{
field: 'tenantValue',
name: 'Dashboard',
render: (tenant: string) => (
<>
<EuiLink onClick={() => viewOrCreateDashboard(tenant, Action.view)}>
View dashboard
</EuiLink>
</>
),
},