From 0cebd23e3bd3e8895bb3dd8798029c28f1cb5ffb Mon Sep 17 00:00:00 2001 From: Agent Zero Date: Wed, 29 Jul 2026 10:33:31 +0200 Subject: [PATCH] fix: remove TopBar quick-create button + canAccess fallback in ContactDetail + ContactDetailPage + ContactsList + duplicate import fix --- frontend/src/components/contacts/ContactDetail.tsx | 11 +++++++++-- frontend/src/components/layout/TopBar.tsx | 14 +------------- frontend/src/pages/ContactDetailPage.tsx | 12 ++++++++++-- frontend/src/pages/ContactsList.tsx | 12 ++++++++++-- 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/frontend/src/components/contacts/ContactDetail.tsx b/frontend/src/components/contacts/ContactDetail.tsx index 7148a42..0156ae2 100644 --- a/frontend/src/components/contacts/ContactDetail.tsx +++ b/frontend/src/components/contacts/ContactDetail.tsx @@ -161,6 +161,13 @@ export function ContactDetail({ contact, loading, onEdit, onDeleted }: ContactDe const toast = useToast(); const deleteMutation = useDeleteUnifiedContact(); const { hasPermission, hasFieldAccess } = usePermission(); + const authUser = useAuthStore((state) => state.user); + const canAccess = (perm: string): boolean => { + if (authUser?.is_system_admin) return true; + const perms = authUser?.permissions || []; + if (perms.length === 0) return true; + return hasPermission(perm); + }; const createPersonMutation = useCreateContactPerson(); const updatePersonMutation = useUpdateContactPerson(); const deletePersonMutation = useDeleteContactPerson(); @@ -294,10 +301,10 @@ export function ContactDetail({ contact, loading, onEdit, onDeleted }: ContactDe
- {hasPermission('contacts:write') && onEdit && ( + {canAccess('contacts:write') && onEdit && ( )} - {hasPermission('contacts:delete') && ( + {canAccess('contacts:delete') && ( )}
diff --git a/frontend/src/components/layout/TopBar.tsx b/frontend/src/components/layout/TopBar.tsx index e075102..b270448 100644 --- a/frontend/src/components/layout/TopBar.tsx +++ b/frontend/src/components/layout/TopBar.tsx @@ -8,7 +8,7 @@ import { useLogout } from '@/api/hooks'; import { Avatar } from '@/components/ui/Avatar'; import { SearchDropdown } from '@/components/shared/SearchDropdown'; import { SuggestionBadge } from '@/components/ai/SuggestionBadge'; -import { Building, ChevronDown, Menu, Zap, Bot, Layers, Code, Plus } from 'lucide-react'; +import { Building, ChevronDown, Menu, Zap, Bot, Layers, Code } from 'lucide-react'; import { NotificationBell } from '@/components/layout/NotificationBell'; import { useWindowStore } from '@/store/windowStore'; import { usePermission } from '@/hooks/usePermission'; @@ -90,18 +90,6 @@ export function TopBar() {
- {/* Quick Create */} - {canAccess('contacts:write') && ( - - )} {/* Minimized windows */} {minimizedWindows.length > 0 && (
diff --git a/frontend/src/pages/ContactDetailPage.tsx b/frontend/src/pages/ContactDetailPage.tsx index de1428b..9df918a 100644 --- a/frontend/src/pages/ContactDetailPage.tsx +++ b/frontend/src/pages/ContactDetailPage.tsx @@ -13,6 +13,7 @@ import { Button } from '@/components/ui/Button'; import { ChevronLeft } from 'lucide-react'; import { PrintButton } from '@/components/common/PrintButton'; import { usePermission } from '@/hooks/usePermission'; +import { useAuthStore } from '@/store/authStore'; export function ContactDetailPage() { const { t } = useTranslation(); @@ -21,6 +22,13 @@ export function ContactDetailPage() { const { data: contact, isLoading } = useUnifiedContact(id); const openWindow = useWindowStore((s) => s.openWindow); const { hasPermission } = usePermission(); + const authUser = useAuthStore((state) => state.user); + const canAccess = (perm: string): boolean => { + if (authUser?.is_system_admin) return true; + const perms = authUser?.permissions || []; + if (perms.length === 0) return true; + return hasPermission(perm); + }; const handleEdit = () => { if (contact) { @@ -53,13 +61,13 @@ export function ContactDetailPage() { {t('contacts.title')}
- {hasPermission('contacts:read') && } + {canAccess('contacts:read') && }
diff --git a/frontend/src/pages/ContactsList.tsx b/frontend/src/pages/ContactsList.tsx index f5ddb68..d2130bd 100644 --- a/frontend/src/pages/ContactsList.tsx +++ b/frontend/src/pages/ContactsList.tsx @@ -36,12 +36,20 @@ import { import { useContactFolders } from '@/api/contacts'; import { useCustomFieldDefinitions } from '@/api/customFieldDefinitions'; import { usePermission } from '@/hooks/usePermission'; +import { useAuthStore } from '@/store/authStore'; const PAGE_SIZE = 25; export function ContactsListPage() { const { t } = useTranslation(); const { hasPermission } = usePermission(); + const authUser = useAuthStore((state) => state.user); + const canAccess = (perm: string): boolean => { + if (authUser?.is_system_admin) return true; + const perms = authUser?.permissions || []; + if (perms.length === 0) return true; + return hasPermission(perm); + }; const [selectedFilter, setSelectedFilter] = useState('all'); const [search, setSearch] = useState(''); @@ -358,7 +366,7 @@ export function ContactsListPage() { useEffect(() => { const items = [ // New contact — ganz links - ...(hasPermission('contacts:write') ? [{ + ...(canAccess('contacts:write') ? [{ id: 'new', plugin: 'contacts', label: t('contacts.create'), @@ -457,7 +465,7 @@ export function ContactsListPage() { onClick: () => setSavedFiltersOpen(true), }, // Print — icon only, right side - ...(hasPermission('contacts:read') ? [{ + ...(canAccess('contacts:read') ? [{ id: 'print', plugin: 'contacts', label: t('common.print', 'Drucken'),