@@ -26,6 +26,7 @@ interface Team {
2626 logo : React . ElementType
2727 plan : string
2828 role : UserRole
29+ isPreview ?: boolean
2930}
3031
3132export function TeamSwitcher ( {
@@ -34,12 +35,63 @@ export function TeamSwitcher({
3435 teams : Team [ ]
3536} ) {
3637 const { isMobile } = useSidebar ( )
37- const { currentRole, setRole } = useUserRole ( )
38+ const { currentRole, setRole, isPreviewMode , actualUserRole } = useUserRole ( )
3839 const { permissions, getAvailableRoles, isLoading } = usePermissions ( )
3940
40- // Filter teams based on user permissions
41+ // Filter teams based on user permissions and admin preview logic
4142 const availableRoles = getAvailableRoles ( )
42- const allowedTeams = teams . filter ( team => availableRoles . includes ( team . role ) )
43+
44+ // Check if user is an admin (any type)
45+ const isAnyAdmin = permissions ?. permissions ?. is_admin ||
46+ permissions ?. permissions ?. is_system_admin ||
47+ permissions ?. permissions ?. is_teacher_admin ||
48+ permissions ?. permissions ?. is_developer_admin ||
49+ permissions ?. role_info ?. admin_type === 'system_admin' ||
50+ permissions ?. role_info ?. admin_type === 'teacher' ||
51+ permissions ?. role_info ?. admin_type === 'dev' ||
52+ permissions ?. role_info ?. admin_type === 'developer' ||
53+ permissions ?. role_info ?. primary_role === 'developer_admin'
54+
55+ // Check if user is both admin and "ofő" (class teacher)
56+ const isAdminAndClassTeacher = isAnyAdmin && (
57+ permissions ?. permissions ?. is_osztaly_fonok ||
58+ permissions ?. role_info ?. special_role === 'class_teacher'
59+ )
60+
61+ let allowedTeams = teams . filter ( team => {
62+ if ( ! isAnyAdmin ) {
63+ // Non-admins only see their available roles
64+ return availableRoles . includes ( team . role )
65+ }
66+
67+ // Admins can always see admin role
68+ if ( team . role === 'admin' ) {
69+ return true
70+ }
71+
72+ // Admins can always preview student role
73+ if ( team . role === 'student' ) {
74+ return true
75+ }
76+
77+ // For class-teacher role:
78+ // - If admin is also a class teacher (ofő+admin), show it as actual role
79+ // - If admin is not a class teacher, show it as preview
80+ if ( team . role === 'class-teacher' ) {
81+ return true // Always show for admins (either as actual or preview)
82+ }
83+
84+ return availableRoles . includes ( team . role )
85+ } )
86+
87+ // Mark preview status for admin users
88+ allowedTeams = allowedTeams . map ( team => ( {
89+ ...team ,
90+ isPreview : isAnyAdmin && team . role !== 'admin' && (
91+ team . role === 'student' ||
92+ ( team . role === 'class-teacher' && ! isAdminAndClassTeacher )
93+ )
94+ } ) )
4395
4496 const activeTeam = allowedTeams . find ( team => team . role === currentRole ) || allowedTeams [ 0 ]
4597
@@ -76,11 +128,18 @@ export function TeamSwitcher({
76128 < div className = "grid flex-1 text-left text-sm leading-tight" >
77129 < div className = "flex items-center gap-2" >
78130 < span className = "truncate font-medium" > { activeTeam . name } </ span >
131+ { activeTeam . isPreview && (
132+ < span className = "px-1 py-0.5 text-[9px] font-semibold bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200 rounded border border-blue-200 dark:border-blue-700" >
133+ ELŐNÉZET
134+ </ span >
135+ ) }
79136 < span className = "px-1 py-0.5 text-[9px] font-semibold bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-200 rounded border border-orange-200 dark:border-orange-700" >
80137 BETA
81138 </ span >
82139 </ div >
83- < span className = "truncate text-xs" > { activeTeam . plan } </ span >
140+ < span className = "truncate text-xs" >
141+ { activeTeam . isPreview ? `${ activeTeam . plan } (Előnézet)` : activeTeam . plan }
142+ </ span >
84143 </ div >
85144 </ SidebarMenuButton >
86145 </ SidebarMenuItem >
@@ -107,11 +166,18 @@ export function TeamSwitcher({
107166 < div className = "grid flex-1 text-left text-sm leading-tight" >
108167 < div className = "flex items-center gap-2" >
109168 < span className = "truncate font-medium" > { activeTeam . name } </ span >
169+ { activeTeam . isPreview && (
170+ < span className = "px-1 py-0.5 text-[9px] font-semibold bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200 rounded border border-blue-200 dark:border-blue-700" >
171+ ELŐNÉZET
172+ </ span >
173+ ) }
110174 < span className = "px-1 py-0.5 text-[9px] font-semibold bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-200 rounded border border-orange-200 dark:border-orange-700" >
111175 BETA
112176 </ span >
113177 </ div >
114- < span className = "truncate text-xs" > { activeTeam . plan } </ span >
178+ < span className = "truncate text-xs" >
179+ { activeTeam . isPreview ? `${ activeTeam . plan } (Előnézet)` : activeTeam . plan }
180+ </ span >
115181 </ div >
116182 < ChevronsUpDown className = "ml-auto" />
117183 </ SidebarMenuButton >
@@ -134,7 +200,14 @@ export function TeamSwitcher({
134200 < div className = "flex size-6 items-center justify-center rounded-md border" >
135201 < team . logo className = "size-3.5 shrink-0" />
136202 </ div >
137- { team . name }
203+ < div className = "flex-1 flex items-center gap-2" >
204+ < span > { team . name } </ span >
205+ { team . isPreview && (
206+ < span className = "px-1 py-0.5 text-[8px] font-semibold bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200 rounded border border-blue-200 dark:border-blue-700" >
207+ ELŐNÉZET
208+ </ span >
209+ ) }
210+ </ div >
138211 < DropdownMenuShortcut > ⌘{ index + 1 } </ DropdownMenuShortcut >
139212 </ DropdownMenuItem >
140213 ) ) }
0 commit comments