removed tenant user page

This commit is contained in:
Ida 2026-06-04 14:46:21 +02:00
parent 78ccea8bac
commit f88d1c7719
8 changed files with 6 additions and 120 deletions

View file

@ -39,7 +39,7 @@ import { GDPRPage } from './pages/GDPR';
import StorePage from './pages/Store';
import { IntegrationsOverviewPage } from './pages/IntegrationsOverviewPage';
import { FeatureViewPage } from './pages/FeatureView';
import { AccessManagementHub, AdminMandatesPage, AdminUsersPage, AdminUserMandatesPage, AdminFeatureAccessPage, AdminInvitationsPage, AdminUserRoleTemplatesPage, AdminFeatureRolesPage, AdminFeatureInstanceUsersPage, AdminUserAccessOverviewPage, AdminLogsPage, AdminDemoConfigPage } from './pages/admin';
import { AccessManagementHub, AdminMandatesPage, AdminUsersPage, AdminFeatureAccessPage, AdminInvitationsPage, AdminUserRoleTemplatesPage, AdminFeatureRolesPage, AdminFeatureInstanceUsersPage, AdminUserAccessOverviewPage, AdminLogsPage, AdminDemoConfigPage } from './pages/admin';
import { AdminMandateWizardPage, AdminInvitationWizardPage } from './pages/admin/wizards';
import { PromptsPage, FilesPage, ConnectionsPage } from './pages/basedata';
import { BillingDataView, BillingAdmin, BillingMandateView, AdminSubscriptionsPage } from './pages/billing';
@ -206,7 +206,7 @@ function App() {
<Route index element={<Navigate to="/admin/access" replace />} />
<Route path="mandates" element={<AdminMandatesPage />} />
<Route path="users" element={<AdminUsersPage />} />
<Route path="user-mandates" element={<AdminUserMandatesPage />} />
<Route path="user-mandates" element={<Navigate to="/admin/mandates" replace />} />
<Route path="access" element={<AccessManagementHub />} />
<Route path="feature-instances" element={<AdminFeatureAccessPage />} />
<Route path="feature-roles" element={<AdminFeatureRolesPage />} />

View file

@ -1,6 +1,6 @@
/**
* MandateUsersPanel manage users within a single mandate (members, roles, add/remove).
* Shared by AdminMandatesPage (expanded row) and AdminUserMandatesPage.
* Used in AdminMandatesPage expanded row (MandateExpandDashboard).
*/
import React, { useState, useEffect, useMemo, useCallback, useRef } from 'react';

View file

@ -66,8 +66,6 @@ export const PAGE_ICONS: Record<string, React.ReactNode> = {
'page.admin.mandates': <FaBuilding />,
'page.admin.userRoleTemplates': <FaUserTag />,
'page.admin.role-permissions': <FaShieldAlt />,
'page.admin.user-mandates': <FaUserTag />,
'page.admin.userMandates': <FaUserTag />,
'page.admin.feature-roles': <FaCube />,
'page.admin.featureRoles': <FaCube />,
'page.admin.feature-instances': <FaCubes />,

View file

@ -413,9 +413,6 @@ export const AccessManagementHub: React.FC = () => {
<Link to="/admin/mandates" className={hubStyles.mandatesLink}>
<FaBuilding /> {t('Mandanten verwalten')}
</Link>
<Link to="/admin/user-mandates" className={hubStyles.mandatesLink}>
<FaUsers /> {t('Mandant-Benutzer')}
</Link>
</div>
{viewMode === 'hierarchy' ? (

View file

@ -65,7 +65,7 @@ export const AdminInvitationsPage: React.FC = () => {
.catch(() => setBackendAttributes([]));
}, [fetchMandates, request]);
// Load invitations and roles when mandate changes (same roles as AdminUserMandatesPage: user, viewer, admin)
// Load invitations and roles when mandate changes (same roles as MandateUsersPanel: user, viewer, admin)
useEffect(() => {
if (selectedMandateId) {
fetchInvitations(selectedMandateId, { includeExpired: showExpired, includeUsed: showUsed });
@ -122,7 +122,7 @@ export const AdminInvitationsPage: React.FC = () => {
[_rawColumns, backendAttributes],
);
// Form attributes - same role options as AdminUserMandatesPage (user, viewer, admin)
// Form attributes - same role options as MandateUsersPanel (user, viewer, admin)
const createFields: AttributeDefinition[] = useMemo(() => {
const excludedFields = ['id', 'mandateId', 'token', 'sysCreatedBy', 'sysCreatedAt', 'sysUpdatedAt', 'sysUpdatedBy', 'expiresAt', 'currentUses', 'inviteUrl', 'featureInstanceId'];

View file

@ -5,7 +5,6 @@
*/
import React, { useState, useCallback } from 'react';
import { useNavigate } from 'react-router-dom';
import { useAdminMandates, useMandateFormAttributes, type Mandate } from '../../hooks/useMandates';
import { useApiRequest } from '../../hooks/useApi';
import { updateSettingsAdmin } from '../../api/billingApi';
@ -15,7 +14,7 @@ import { usePrompt } from '../../hooks/usePrompt';
import { FormGeneratorTable } from '../../components/FormGenerator/FormGeneratorTable';
import { FormGeneratorForm } from '../../components/FormGenerator/FormGeneratorForm';
import { MandateExpandDashboard } from '../../components/admin/MandateExpandDashboard';
import { FaPlus, FaSync, FaUsers, FaSkullCrossbones } from 'react-icons/fa';
import { FaPlus, FaSync, FaSkullCrossbones } from 'react-icons/fa';
import styles from './Admin.module.css';
import { useLanguage } from '../../providers/language/LanguageContext';
@ -23,7 +22,6 @@ import { useLanguage } from '../../providers/language/LanguageContext';
export const AdminMandatesPage: React.FC = () => {
const { t } = useLanguage();
const navigate = useNavigate();
const { request } = useApiRequest();
const { showWarning, showSuccess } = useToast();
const { prompt, PromptDialog } = usePrompt();
@ -174,13 +172,6 @@ export const AdminMandatesPage: React.FC = () => {
</p>
</div>
<div className={styles.headerActions}>
<button
type="button"
className={styles.secondaryButton}
onClick={() => navigate('/admin/user-mandates')}
>
<FaUsers /> {t('Benutzer-Zuweisungen')}
</button>
<button
className={styles.secondaryButton}
onClick={() => refetch()}

View file

@ -1,99 +0,0 @@
/**
* AdminUserMandatesPage
*
* Admin page for managing user-mandate memberships.
* Allows assigning users to mandates and managing their roles within mandates.
*/
import React, { useState, useEffect } from 'react';
import { useUserMandates, type Mandate } from '../../hooks/useUserMandates';
import { FaSync, FaBuilding } from 'react-icons/fa';
import { MandateUsersPanel } from '../../components/admin/MandateUsersPanel';
import styles from './Admin.module.css';
import { useLanguage } from '../../providers/language/LanguageContext';
import { mandateDisplayLabel } from '../../utils/mandateDisplayUtils';
export const AdminUserMandatesPage: React.FC = () => {
const { t } = useLanguage();
const { error, fetchMandates } = useUserMandates();
const [mandates, setMandates] = useState<Mandate[]>([]);
const [selectedMandateId, setSelectedMandateId] = useState<string>('');
useEffect(() => {
const loadMandates = async () => {
const data = await fetchMandates();
setMandates(data);
if (data.length > 0) {
setSelectedMandateId((prev) => prev || data[0].id);
}
};
loadMandates();
}, [fetchMandates]);
if (error && !selectedMandateId) {
return (
<div className={`${styles.adminPage} ${styles.adminPageFill}`}>
<div className={styles.errorContainer}>
<span className={styles.errorIcon}></span>
<p className={styles.errorMessage}>
{t('Fehler')}: {error}
</p>
<button type="button" className={styles.secondaryButton} onClick={() => fetchMandates()}>
<FaSync /> {t('Erneut versuchen')}
</button>
</div>
</div>
);
}
return (
<div className={`${styles.adminPage} ${styles.adminPageFill}`}>
<div className={styles.pageHeader}>
<div>
<h1 className={styles.pageTitle}>{t('Mandanten-Mitglieder')}</h1>
<p className={styles.pageSubtitle}>{t('Verwalten Sie, welche Benutzer Zugriff')}</p>
</div>
</div>
<div className={styles.filterSection}>
<div className={styles.filterGroup}>
<label className={styles.filterLabel}>
<FaBuilding style={{ marginRight: 8 }} />
{t('Mandant auswählen')}:
</label>
<select
className={styles.filterSelect}
value={selectedMandateId}
onChange={(e) => setSelectedMandateId(e.target.value)}
>
<option value="">{t('Mandant wählen')}</option>
{mandates.map((m) => (
<option key={m.id} value={m.id}>
{mandateDisplayLabel(m)}
</option>
))}
</select>
</div>
</div>
{!selectedMandateId ? (
<div className={styles.emptyState}>
<FaBuilding className={styles.emptyIcon} />
<h3 className={styles.emptyTitle}>{t('Kein Mandant ausgewählt')}</h3>
<p className={styles.emptyDescription}>
{t('Wählen Sie einen Mandanten aus, um dessen Mitglieder zu verwalten.')}
</p>
</div>
) : (
<div className={styles.tableContainer}>
<MandateUsersPanel mandateId={selectedMandateId} />
</div>
)}
</div>
);
};
export default AdminUserMandatesPage;

View file

@ -7,7 +7,6 @@
export { AccessManagementHub } from './AccessManagementHub';
export { AdminMandatesPage } from './AdminMandatesPage';
export { AdminUsersPage } from './AdminUsersPage';
export { AdminUserMandatesPage } from './AdminUserMandatesPage';
export { AdminFeatureAccessPage } from './AdminFeatureAccessPage';
export { AdminInvitationsPage } from './AdminInvitationsPage';
export { AdminUserRoleTemplatesPage } from './AdminUserRoleTemplatesPage';