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
@@ -9,7 +9,6 @@ import { Select } from '@/components/ui/Select';
import { Badge } from '@/components/ui/Badge';
import { X } from 'lucide-react';
import type { CustomFieldDefinition } from '@/api/customFieldDefinitions';
import { useTranslation } from 'react-i18next';
export interface CustomFieldRendererProps {
definition: CustomFieldDefinition;
@@ -18,7 +17,6 @@ export interface CustomFieldRendererProps {
}
export function CustomFieldRenderer({ definition, value, onChange }: CustomFieldRendererProps) {
const { t } = useTranslation();
const generatedId = useId();
const fieldId = `cf-${definition.id || generatedId}`;
const { field_type, options, required } = definition;
@@ -41,7 +39,7 @@ export function CustomFieldRenderer({ definition, value, onChange }: CustomField
/>
<span>
{definition.label}
{required && <span className="text-danger-500 ml-1" aria-label={t('customFieldRenderer.required')}>*</span>}
{required && <span className="text-danger-500 ml-1" aria-label="required">*</span>}
</span>
</label>
</div>
@@ -75,7 +73,7 @@ export function CustomFieldRenderer({ definition, value, onChange }: CustomField
<div className="w-full">
<label className="block text-sm font-medium text-secondary-700 mb-1">
{definition.label}
{required && <span className="text-danger-500 ml-1" aria-label={t('customFieldRenderer.required')}>*</span>}
{required && <span className="text-danger-500 ml-1" aria-label="required">*</span>}
</label>
{selectedValues.length > 0 && (
<div className="flex flex-wrap gap-1.5 mb-2">
@@ -108,9 +106,9 @@ export function CustomFieldRenderer({ definition, value, onChange }: CustomField
))}
</div>
) : availableOptions.length === 0 ? (
<p className="text-sm text-secondary-400">{t('customFieldRenderer.keineoptionenverfügbar')}</p>
<p className="text-sm text-secondary-400">Keine Optionen verfügbar</p>
) : (
<p className="text-sm text-secondary-400">{t('customFieldRenderer.alleoptionenausgewählt')}</p>
<p className="text-sm text-secondary-400">Alle Optionen ausgewählt</p>
)}
</div>
);
@@ -125,7 +123,7 @@ export function CustomFieldRenderer({ definition, value, onChange }: CustomField
label={definition.label}
required={required}
options={selectOptions}
placeholder={t('customFieldRenderer.bittewählen')}
placeholder="— Bitte wählen —"
value={value ?? ''}
onChange={(e) => onChange(e.target.value)}
/>