T08a: Frontend DMS + Tags + Permissions UI — 33 tests, tsc clean, vite build pass

- DMS file browser: folder tree + file grid + upload dropzone + search + preview modal
- DMS share dialog: user/group share + public share links with password+expiry
- DMS bulk actions: bulk move + bulk delete with confirm dialogs
- DMS trash view: deleted files list with restore button
- Tags: TagPicker on company/contact detail pages (new tabs tab)
- Tags: TagCloud + BulkTagDialog for bulk tag assignment
- Permissions: share link creation, permission display, copy-link button
- API clients: dms.ts, tags.ts, permissions.ts
- Routes: /dms, /dms/trash added to router
- Sidebar: DMS nav link updated
- i18n: de.json + en.json translations for DMS/Tags/Permissions
- 33 new tests (5 test files), full regression 276/276 pass
- tsc --noEmit: 0 errors, vite build: 252 modules
This commit is contained in:
leocrm-bot
2026-07-01 16:54:32 +02:00
parent f646c597dc
commit 0962f3a961
31 changed files with 3368 additions and 41 deletions
+10 -1
View File
@@ -9,6 +9,7 @@ import { Badge } from '@/components/ui/Badge';
import { EmptyState } from '@/components/ui/EmptyState';
import { Skeleton } from '@/components/ui/Skeleton';
import { Avatar } from '@/components/ui/Avatar';
import { TagPicker } from '@/components/tags/TagPicker';
export function CompanyDetailPage() {
const { id } = useParams<{ id: string }>();
@@ -103,6 +104,14 @@ export function CompanyDetailPage() {
),
};
const tagsTab: TabItem = {
key: 'tags',
label: t('tags.title'),
content: (
<TagPicker entityType="company" entityId={company.id} />
),
};
const filesTab: TabItem = {
key: 'files',
label: t('companies.files'),
@@ -128,7 +137,7 @@ export function CompanyDetailPage() {
{t('common.edit')}
</Button>
</div>
<Tabs tabs={[overviewTab, contactsTab, filesTab, activityTab]} defaultKey="overview" />
<Tabs tabs={[overviewTab, contactsTab, tagsTab, filesTab, activityTab]} defaultKey="overview" />
</div>
);
}