revert(frontend): Frontend auf letzten funktionierenden Stand 5680179 zurückgesetzt — i18n-Massen-Batch brach Dashboard-Shell in Produktion; Render-Loop-Fix und DSGVO-Antrags-UI liegen sicher in Historie für kontrollierten Wiedereinspiel

This commit is contained in:
Agent Zero
2026-08-27 09:14:21 +02:00
parent bea479bfad
commit 66c11d3d64
119 changed files with 925 additions and 1477 deletions
@@ -1,7 +1,6 @@
import React from 'react';
import { Card } from '@/components/ui/Card';
import { Avatar } from '@/components/ui/Avatar';
import { useTranslation } from 'react-i18next';
export interface ActivityItem {
id: string;
@@ -18,12 +17,11 @@ export interface ActivityFeedProps {
}
export function ActivityFeed({ activities, title = 'Letzte Aktivitäten', maxItems = 10 }: ActivityFeedProps) {
const { t } = useTranslation();
const visible = activities.slice(0, maxItems);
return (
<Card title={title} data-testid="activity-feed">
{visible.length === 0 ? (
<p className="text-sm text-secondary-500 py-4 text-center">{t('activityFeed.keineaktivitätenvorhanden')}</p>
<p className="text-sm text-secondary-500 py-4 text-center">Keine Aktivitäten vorhanden.</p>
) : (
<ul className="space-y-3" role="list">
{visible.map((activity) => (
+1 -1
View File
@@ -112,7 +112,7 @@ export function DataGrid<T extends Record<string, any>>({
ref={scrollRef}
className="overflow-x-auto"
role="region"
aria-label={t('dataGrid.datagrid')}
aria-label="Data grid"
style={shouldVirtualize ? { maxHeight: '70vh', overflowY: 'auto' } : undefined}
>
<table className="min-w-full divide-y divide-secondary-200">
@@ -143,7 +143,7 @@ export function SearchDropdown({ placeholder }: SearchDropdownProps) {
onClick={handleSeeAll}
className="text-sm text-primary-600 hover:text-primary-700 font-medium min-h-touch"
>
{t('searchDropdown.alleergebnisseanzeigen')}
Alle Ergebnisse anzeigen
</button>
</div>
</>
+4 -6
View File
@@ -10,14 +10,12 @@ import React from 'react';
import { Users } from 'lucide-react';
import { useUsers, useGroups } from '@/api/hooks';
import { Avatar } from '@/components/ui/Avatar';
import { useTranslation } from 'react-i18next';
interface SharedTeamPanelProps {
onStartDirectChat?: (userId: string, userName: string) => void;
}
export function SharedTeamPanel({ onStartDirectChat }: SharedTeamPanelProps) {
const { t } = useTranslation();
const { data: usersData, isLoading: usersLoading } = useUsers();
const { data: groupsData, isLoading: groupsLoading } = useGroups();
const users: any[] = usersData?.items || [];
@@ -30,7 +28,7 @@ export function SharedTeamPanel({ onStartDirectChat }: SharedTeamPanelProps) {
{usersLoading ? (
<p className="text-sm text-secondary-400">Laden...</p>
) : users.length === 0 ? (
<p className="text-sm text-secondary-400">{t('teamPanel.keinemitarbeiter')}</p>
<p className="text-sm text-secondary-400">Keine Mitarbeiter</p>
) : (
<div className="space-y-1">
{users.map((u) =>
@@ -42,7 +40,7 @@ export function SharedTeamPanel({ onStartDirectChat }: SharedTeamPanelProps) {
>
<div className="relative flex-shrink-0">
<Avatar name={u.name} size="sm" />
<span className="absolute bottom-0 right-0 w-2.5 h-2.5 rounded-full border-2 border-white bg-secondary-300" aria-label={t('teamPanel.offline')} />
<span className="absolute bottom-0 right-0 w-2.5 h-2.5 rounded-full border-2 border-white bg-secondary-300" aria-label="offline" />
</div>
<div className="flex-1 min-w-0">
<p className="text-sm font-medium text-secondary-700 truncate">{u.name}</p>
@@ -54,7 +52,7 @@ export function SharedTeamPanel({ onStartDirectChat }: SharedTeamPanelProps) {
<div key={u.id} className="flex items-center gap-2 px-2 py-1.5 rounded-lg hover:bg-secondary-50 transition-colors">
<div className="relative flex-shrink-0">
<Avatar name={u.name} size="sm" />
<span className="absolute bottom-0 right-0 w-2.5 h-2.5 rounded-full border-2 border-white bg-secondary-300" aria-label={t('teamPanel.offline')} />
<span className="absolute bottom-0 right-0 w-2.5 h-2.5 rounded-full border-2 border-white bg-secondary-300" aria-label="offline" />
</div>
<div className="flex-1 min-w-0">
<p className="text-sm font-medium text-secondary-700 truncate">{u.name}</p>
@@ -72,7 +70,7 @@ export function SharedTeamPanel({ onStartDirectChat }: SharedTeamPanelProps) {
{groupsLoading ? (
<p className="text-sm text-secondary-400">Laden...</p>
) : groups.length === 0 ? (
<p className="text-sm text-secondary-400">{t('teamPanel.keinegruppen')}</p>
<p className="text-sm text-secondary-400">Keine Gruppen</p>
) : (
<div className="space-y-1">
{groups.map((g) => (