removed tenant user page
This commit is contained in:
parent
78ccea8bac
commit
f88d1c7719
8 changed files with 6 additions and 120 deletions
|
|
@ -39,7 +39,7 @@ import { GDPRPage } from './pages/GDPR';
|
||||||
import StorePage from './pages/Store';
|
import StorePage from './pages/Store';
|
||||||
import { IntegrationsOverviewPage } from './pages/IntegrationsOverviewPage';
|
import { IntegrationsOverviewPage } from './pages/IntegrationsOverviewPage';
|
||||||
import { FeatureViewPage } from './pages/FeatureView';
|
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 { AdminMandateWizardPage, AdminInvitationWizardPage } from './pages/admin/wizards';
|
||||||
import { PromptsPage, FilesPage, ConnectionsPage } from './pages/basedata';
|
import { PromptsPage, FilesPage, ConnectionsPage } from './pages/basedata';
|
||||||
import { BillingDataView, BillingAdmin, BillingMandateView, AdminSubscriptionsPage } from './pages/billing';
|
import { BillingDataView, BillingAdmin, BillingMandateView, AdminSubscriptionsPage } from './pages/billing';
|
||||||
|
|
@ -206,7 +206,7 @@ function App() {
|
||||||
<Route index element={<Navigate to="/admin/access" replace />} />
|
<Route index element={<Navigate to="/admin/access" replace />} />
|
||||||
<Route path="mandates" element={<AdminMandatesPage />} />
|
<Route path="mandates" element={<AdminMandatesPage />} />
|
||||||
<Route path="users" element={<AdminUsersPage />} />
|
<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="access" element={<AccessManagementHub />} />
|
||||||
<Route path="feature-instances" element={<AdminFeatureAccessPage />} />
|
<Route path="feature-instances" element={<AdminFeatureAccessPage />} />
|
||||||
<Route path="feature-roles" element={<AdminFeatureRolesPage />} />
|
<Route path="feature-roles" element={<AdminFeatureRolesPage />} />
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* MandateUsersPanel — manage users within a single mandate (members, roles, add/remove).
|
* 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';
|
import React, { useState, useEffect, useMemo, useCallback, useRef } from 'react';
|
||||||
|
|
|
||||||
|
|
@ -66,8 +66,6 @@ export const PAGE_ICONS: Record<string, React.ReactNode> = {
|
||||||
'page.admin.mandates': <FaBuilding />,
|
'page.admin.mandates': <FaBuilding />,
|
||||||
'page.admin.userRoleTemplates': <FaUserTag />,
|
'page.admin.userRoleTemplates': <FaUserTag />,
|
||||||
'page.admin.role-permissions': <FaShieldAlt />,
|
'page.admin.role-permissions': <FaShieldAlt />,
|
||||||
'page.admin.user-mandates': <FaUserTag />,
|
|
||||||
'page.admin.userMandates': <FaUserTag />,
|
|
||||||
'page.admin.feature-roles': <FaCube />,
|
'page.admin.feature-roles': <FaCube />,
|
||||||
'page.admin.featureRoles': <FaCube />,
|
'page.admin.featureRoles': <FaCube />,
|
||||||
'page.admin.feature-instances': <FaCubes />,
|
'page.admin.feature-instances': <FaCubes />,
|
||||||
|
|
|
||||||
|
|
@ -413,9 +413,6 @@ export const AccessManagementHub: React.FC = () => {
|
||||||
<Link to="/admin/mandates" className={hubStyles.mandatesLink}>
|
<Link to="/admin/mandates" className={hubStyles.mandatesLink}>
|
||||||
<FaBuilding /> {t('Mandanten verwalten')}
|
<FaBuilding /> {t('Mandanten verwalten')}
|
||||||
</Link>
|
</Link>
|
||||||
<Link to="/admin/user-mandates" className={hubStyles.mandatesLink}>
|
|
||||||
<FaUsers /> {t('Mandant-Benutzer')}
|
|
||||||
</Link>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{viewMode === 'hierarchy' ? (
|
{viewMode === 'hierarchy' ? (
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ export const AdminInvitationsPage: React.FC = () => {
|
||||||
.catch(() => setBackendAttributes([]));
|
.catch(() => setBackendAttributes([]));
|
||||||
}, [fetchMandates, request]);
|
}, [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(() => {
|
useEffect(() => {
|
||||||
if (selectedMandateId) {
|
if (selectedMandateId) {
|
||||||
fetchInvitations(selectedMandateId, { includeExpired: showExpired, includeUsed: showUsed });
|
fetchInvitations(selectedMandateId, { includeExpired: showExpired, includeUsed: showUsed });
|
||||||
|
|
@ -122,7 +122,7 @@ export const AdminInvitationsPage: React.FC = () => {
|
||||||
[_rawColumns, backendAttributes],
|
[_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 createFields: AttributeDefinition[] = useMemo(() => {
|
||||||
const excludedFields = ['id', 'mandateId', 'token', 'sysCreatedBy', 'sysCreatedAt', 'sysUpdatedAt', 'sysUpdatedBy', 'expiresAt', 'currentUses', 'inviteUrl', 'featureInstanceId'];
|
const excludedFields = ['id', 'mandateId', 'token', 'sysCreatedBy', 'sysCreatedAt', 'sysUpdatedAt', 'sysUpdatedBy', 'expiresAt', 'currentUses', 'inviteUrl', 'featureInstanceId'];
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, { useState, useCallback } from 'react';
|
import React, { useState, useCallback } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
|
||||||
import { useAdminMandates, useMandateFormAttributes, type Mandate } from '../../hooks/useMandates';
|
import { useAdminMandates, useMandateFormAttributes, type Mandate } from '../../hooks/useMandates';
|
||||||
import { useApiRequest } from '../../hooks/useApi';
|
import { useApiRequest } from '../../hooks/useApi';
|
||||||
import { updateSettingsAdmin } from '../../api/billingApi';
|
import { updateSettingsAdmin } from '../../api/billingApi';
|
||||||
|
|
@ -15,7 +14,7 @@ import { usePrompt } from '../../hooks/usePrompt';
|
||||||
import { FormGeneratorTable } from '../../components/FormGenerator/FormGeneratorTable';
|
import { FormGeneratorTable } from '../../components/FormGenerator/FormGeneratorTable';
|
||||||
import { FormGeneratorForm } from '../../components/FormGenerator/FormGeneratorForm';
|
import { FormGeneratorForm } from '../../components/FormGenerator/FormGeneratorForm';
|
||||||
import { MandateExpandDashboard } from '../../components/admin/MandateExpandDashboard';
|
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 styles from './Admin.module.css';
|
||||||
|
|
||||||
import { useLanguage } from '../../providers/language/LanguageContext';
|
import { useLanguage } from '../../providers/language/LanguageContext';
|
||||||
|
|
@ -23,7 +22,6 @@ import { useLanguage } from '../../providers/language/LanguageContext';
|
||||||
export const AdminMandatesPage: React.FC = () => {
|
export const AdminMandatesPage: React.FC = () => {
|
||||||
const { t } = useLanguage();
|
const { t } = useLanguage();
|
||||||
|
|
||||||
const navigate = useNavigate();
|
|
||||||
const { request } = useApiRequest();
|
const { request } = useApiRequest();
|
||||||
const { showWarning, showSuccess } = useToast();
|
const { showWarning, showSuccess } = useToast();
|
||||||
const { prompt, PromptDialog } = usePrompt();
|
const { prompt, PromptDialog } = usePrompt();
|
||||||
|
|
@ -174,13 +172,6 @@ export const AdminMandatesPage: React.FC = () => {
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.headerActions}>
|
<div className={styles.headerActions}>
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
className={styles.secondaryButton}
|
|
||||||
onClick={() => navigate('/admin/user-mandates')}
|
|
||||||
>
|
|
||||||
<FaUsers /> {t('Benutzer-Zuweisungen')}
|
|
||||||
</button>
|
|
||||||
<button
|
<button
|
||||||
className={styles.secondaryButton}
|
className={styles.secondaryButton}
|
||||||
onClick={() => refetch()}
|
onClick={() => refetch()}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
|
|
@ -7,7 +7,6 @@
|
||||||
export { AccessManagementHub } from './AccessManagementHub';
|
export { AccessManagementHub } from './AccessManagementHub';
|
||||||
export { AdminMandatesPage } from './AdminMandatesPage';
|
export { AdminMandatesPage } from './AdminMandatesPage';
|
||||||
export { AdminUsersPage } from './AdminUsersPage';
|
export { AdminUsersPage } from './AdminUsersPage';
|
||||||
export { AdminUserMandatesPage } from './AdminUserMandatesPage';
|
|
||||||
export { AdminFeatureAccessPage } from './AdminFeatureAccessPage';
|
export { AdminFeatureAccessPage } from './AdminFeatureAccessPage';
|
||||||
export { AdminInvitationsPage } from './AdminInvitationsPage';
|
export { AdminInvitationsPage } from './AdminInvitationsPage';
|
||||||
export { AdminUserRoleTemplatesPage } from './AdminUserRoleTemplatesPage';
|
export { AdminUserRoleTemplatesPage } from './AdminUserRoleTemplatesPage';
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue