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:
@@ -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) => (
|
||||
|
||||
@@ -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>
|
||||
</>
|
||||
|
||||
@@ -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) => (
|
||||
|
||||
Reference in New Issue
Block a user