Phase 3: Saved Filters UI, Entity History UI, Activity Timeline, API Docs Link
- Saved Filters: SavedFilterBar (dropdown, apply, delete), SaveFilterDialog (name + save) - Entity History: EntityHistoryPanel (timeline, restore, undo), HistoryDiff (field changes visual) - Activity Timeline: ActivityTimelinePage (grouped by day, pagination), ActivityFilter (user/entity/action/date) - API Docs Link: TopBar user menu entry, SettingsSystem Entwickler section (Swagger, ReDoc, OpenAPI) - Routes: /activity registered - Menu items: Aktivitäten added to automation plugin manifest
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import React, { useState } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { Code, BookOpen, FileJson } from 'lucide-react';
|
||||
import { SettingsMenuOrderPage } from './SettingsMenuOrder';
|
||||
import { SettingsThemePage } from './SettingsTheme';
|
||||
import { SettingsPluginsPage } from './SettingsPlugins';
|
||||
@@ -12,6 +13,7 @@ export function SettingsSystemPage() {
|
||||
{ key: 'menu', label: t('settings.menuOrder', 'Menü') },
|
||||
{ key: 'theme', label: t('settings.theme', 'Theme') },
|
||||
{ key: 'plugins', label: t('settings.plugins', 'Plugins') },
|
||||
{ key: 'entwickler', label: t('settings.developer', 'Entwickler') },
|
||||
];
|
||||
|
||||
return (
|
||||
@@ -42,6 +44,60 @@ export function SettingsSystemPage() {
|
||||
{activeTab === 'menu' && <SettingsMenuOrderPage />}
|
||||
{activeTab === 'theme' && <SettingsThemePage />}
|
||||
{activeTab === 'plugins' && <SettingsPluginsPage />}
|
||||
{activeTab === 'entwickler' && (
|
||||
<div className="space-y-4" data-testid="settings-developer-section">
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
|
||||
<a
|
||||
href="/docs"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="flex items-start gap-3 p-4 rounded-lg border border-secondary-200 bg-white hover:border-primary-300 hover:shadow-sm transition-all min-h-touch"
|
||||
>
|
||||
<div className="flex-shrink-0 w-10 h-10 rounded-lg bg-primary-50 text-primary-600 flex items-center justify-center">
|
||||
<Code className="w-5 h-5" aria-hidden="true" strokeWidth={2} />
|
||||
</div>
|
||||
<div className="min-w-0">
|
||||
<p className="text-sm font-semibold text-secondary-900">
|
||||
{t('settings.apiDocsSwagger', 'API Dokumentation (Swagger)')}
|
||||
</p>
|
||||
<p className="text-xs text-secondary-500 mt-0.5">/docs</p>
|
||||
</div>
|
||||
</a>
|
||||
<a
|
||||
href="/redoc"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="flex items-start gap-3 p-4 rounded-lg border border-secondary-200 bg-white hover:border-primary-300 hover:shadow-sm transition-all min-h-touch"
|
||||
>
|
||||
<div className="flex-shrink-0 w-10 h-10 rounded-lg bg-primary-50 text-primary-600 flex items-center justify-center">
|
||||
<BookOpen className="w-5 h-5" aria-hidden="true" strokeWidth={2} />
|
||||
</div>
|
||||
<div className="min-w-0">
|
||||
<p className="text-sm font-semibold text-secondary-900">
|
||||
{t('settings.apiDocsRedoc', 'API Dokumentation (ReDoc)')}
|
||||
</p>
|
||||
<p className="text-xs text-secondary-500 mt-0.5">/redoc</p>
|
||||
</div>
|
||||
</a>
|
||||
<a
|
||||
href="/openapi.json"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="flex items-start gap-3 p-4 rounded-lg border border-secondary-200 bg-white hover:border-primary-300 hover:shadow-sm transition-all min-h-touch"
|
||||
>
|
||||
<div className="flex-shrink-0 w-10 h-10 rounded-lg bg-primary-50 text-primary-600 flex items-center justify-center">
|
||||
<FileJson className="w-5 h-5" aria-hidden="true" strokeWidth={2} />
|
||||
</div>
|
||||
<div className="min-w-0">
|
||||
<p className="text-sm font-semibold text-secondary-900">
|
||||
{t('settings.openApiSchema', 'OpenAPI Schema')}
|
||||
</p>
|
||||
<p className="text-xs text-secondary-500 mt-0.5">/openapi.json</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user