@noatgnu/cupcake-core 1.2.11 → 1.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noatgnu-cupcake-core.mjs","sources":["../../../projects/cupcake-core/src/lib/models/enums.ts","../../../projects/cupcake-core/src/lib/models/annotation.ts","../../../projects/cupcake-core/src/lib/models/index.ts","../../../projects/cupcake-core/src/lib/interceptors/auth-interceptor.ts","../../../projects/cupcake-core/src/lib/services/auth.ts","../../../projects/cupcake-core/src/lib/services/resource.ts","../../../projects/cupcake-core/src/lib/services/api.ts","../../../projects/cupcake-core/src/lib/services/base-api.ts","../../../projects/cupcake-core/src/lib/services/toast.ts","../../../projects/cupcake-core/src/lib/services/notification.ts","../../../projects/cupcake-core/src/lib/services/site-config.ts","../../../projects/cupcake-core/src/lib/services/theme.ts","../../../projects/cupcake-core/src/lib/services/user-management.ts","../../../projects/cupcake-core/src/lib/services/websocket.ts","../../../projects/cupcake-core/src/lib/services/websocket-config.ts","../../../projects/cupcake-core/src/lib/services/lab-group.ts","../../../projects/cupcake-core/src/lib/guards/auth-guard.ts","../../../projects/cupcake-core/src/lib/guards/admin-guard.ts","../../../projects/cupcake-core/src/lib/components/auth/login/login.ts","../../../projects/cupcake-core/src/lib/components/auth/login/login.html","../../../projects/cupcake-core/src/lib/components/auth/register/register.ts","../../../projects/cupcake-core/src/lib/components/auth/register/register.html","../../../projects/cupcake-core/src/lib/components/user-management/admin-user-management/user-management.ts","../../../projects/cupcake-core/src/lib/components/user-management/admin-user-management/user-management.html","../../../projects/cupcake-core/src/lib/components/user-management/lab-groups/lab-groups.ts","../../../projects/cupcake-core/src/lib/components/user-management/lab-groups/lab-groups.html","../../../projects/cupcake-core/src/lib/components/user-management/user-profile/user-profile.ts","../../../projects/cupcake-core/src/lib/components/user-management/user-profile/user-profile.html","../../../projects/cupcake-core/src/lib/components/site-config/site-config.ts","../../../projects/cupcake-core/src/lib/components/site-config/site-config.html","../../../projects/cupcake-core/src/lib/components/toast-container/toast-container.ts","../../../projects/cupcake-core/src/lib/components/toast-container/toast-container.html","../../../projects/cupcake-core/src/lib/components/powered-by-footer/powered-by-footer.ts","../../../projects/cupcake-core/src/lib/components/powered-by-footer/powered-by-footer.html","../../../projects/cupcake-core/src/lib/components/index.ts","../../../projects/cupcake-core/src/lib/cupcake-core.module.ts","../../../projects/cupcake-core/src/public-api.ts","../../../projects/cupcake-core/src/noatgnu-cupcake-core.ts"],"sourcesContent":["export enum ResourceType {\r\n METADATA_TABLE = 'metadata_table',\r\n METADATA_TABLE_TEMPLATE = 'metadata_table_template', \r\n METADATA_COLUMN_TEMPLATE = 'metadata_column_template',\r\n FILE = 'file',\r\n DATASET = 'dataset',\r\n SCHEMA = 'schema'\r\n}\r\nexport const ResourceTypeLabels: Record<ResourceType, string> = {\r\n [ResourceType.METADATA_TABLE]: 'Metadata Table',\r\n [ResourceType.METADATA_TABLE_TEMPLATE]: 'Metadata Table Template',\r\n [ResourceType.METADATA_COLUMN_TEMPLATE]: 'Metadata Column Template',\r\n [ResourceType.FILE]: 'File',\r\n [ResourceType.DATASET]: 'Dataset',\r\n [ResourceType.SCHEMA]: 'Schema'\r\n};\r\n\r\nexport enum ResourceVisibility {\r\n PRIVATE = 'private',\r\n GROUP = 'group',\r\n PUBLIC = 'public'\r\n}\r\n\r\nexport const ResourceVisibilityLabels: Record<ResourceVisibility, string> = {\r\n [ResourceVisibility.PRIVATE]: 'Private',\r\n [ResourceVisibility.GROUP]: 'Lab Group',\r\n [ResourceVisibility.PUBLIC]: 'Public'\r\n};\r\n\r\nexport enum ResourceRole {\r\n OWNER = 'owner',\r\n ADMIN = 'admin',\r\n EDITOR = 'editor',\r\n VIEWER = 'viewer'\r\n}\r\n\r\nexport const ResourceRoleLabels: Record<ResourceRole, string> = {\r\n [ResourceRole.OWNER]: 'Owner',\r\n [ResourceRole.ADMIN]: 'Administrator', \r\n [ResourceRole.EDITOR]: 'Editor',\r\n [ResourceRole.VIEWER]: 'Viewer'\r\n};\r\n\r\nexport enum InvitationStatus {\r\n PENDING = 'pending',\r\n ACCEPTED = 'accepted',\r\n REJECTED = 'rejected',\r\n EXPIRED = 'expired',\r\n CANCELLED = 'cancelled'\r\n}\r\n\r\nexport const InvitationStatusLabels: Record<InvitationStatus, string> = {\r\n [InvitationStatus.PENDING]: 'Pending',\r\n [InvitationStatus.ACCEPTED]: 'Accepted',\r\n [InvitationStatus.REJECTED]: 'Rejected',\r\n [InvitationStatus.EXPIRED]: 'Expired',\r\n [InvitationStatus.CANCELLED]: 'Cancelled'\r\n};","import { BaseResource } from './base';\r\n\r\nexport enum AnnotationType {\r\n Text = 'text',\r\n File = 'file',\r\n Image = 'image',\r\n Video = 'video',\r\n Audio = 'audio',\r\n Sketch = 'sketch',\r\n Other = 'other',\r\n Checklist = 'checklist',\r\n Counter = 'counter',\r\n Table = 'table',\r\n Alignment = 'alignment',\r\n Calculator = 'calculator',\r\n MolarityCalculator = 'mcalculator',\r\n Randomization = 'randomization',\r\n Instrument = 'instrument',\r\n Metadata = 'metadata',\r\n Booking = 'booking'\r\n}\r\n\r\nexport interface AnnotationFolder extends BaseResource {\r\n folderName: string;\r\n parentFolder?: number;\r\n isSharedDocumentFolder: boolean;\r\n ownerName?: string;\r\n fullPath?: string;\r\n childFoldersCount: number;\r\n annotationsCount: number;\r\n}\r\n\r\nexport interface Annotation extends BaseResource {\r\n annotation: string;\r\n annotationType: string;\r\n file?: string;\r\n fileUrl?: string;\r\n fileSize?: number;\r\n folder?: number;\r\n folderPath?: string;\r\n transcribed: boolean;\r\n transcription?: string;\r\n language?: string;\r\n translation?: string;\r\n scratched: boolean;\r\n ownerName?: string;\r\n canEdit?: boolean;\r\n canView?: boolean;\r\n canDelete?: boolean;\r\n}\r\n\r\nexport interface AnnotationFolderCreateRequest {\r\n folderName: string;\r\n parentFolder?: number;\r\n isSharedDocumentFolder?: boolean;\r\n labGroup?: number;\r\n visibility?: string;\r\n}\r\n\r\nexport interface AnnotationFolderUpdateRequest {\r\n folderName?: string;\r\n parentFolder?: number;\r\n isSharedDocumentFolder?: boolean;\r\n isActive?: boolean;\r\n}\r\n\r\nexport interface AnnotationCreateRequest {\r\n annotation: string;\r\n annotationType?: string;\r\n file?: File;\r\n folder?: number;\r\n transcribed?: boolean;\r\n transcription?: string;\r\n language?: string;\r\n translation?: string;\r\n labGroup?: number;\r\n visibility?: string;\r\n autoTranscribe?: boolean;\r\n}\r\n\r\nexport interface AnnotationUpdateRequest {\r\n annotation?: string;\r\n annotationType?: string;\r\n folder?: number;\r\n transcribed?: boolean;\r\n transcription?: string;\r\n language?: string;\r\n translation?: string;\r\n scratched?: boolean;\r\n}","/**\r\n * CUPCAKE Core (CCC) - Models barrel export\r\n * User management, lab groups, and core functionality interfaces\r\n */\r\n\r\n// Base types and enums\r\nexport * from './base';\r\nexport * from './enums';\r\n\r\n// Core models\r\nexport * from './site-config';\r\nexport * from './user';\r\nexport * from './lab-group';\r\nexport * from './annotation';\r\nexport * from './resource-permission';\r\nexport * from './remote-host';\r\nexport * from './notification';","import { inject } from '@angular/core';\nimport { HttpInterceptorFn, HttpErrorResponse, HttpClient, HttpRequest, HttpEvent, HttpHandlerFn } from '@angular/common/http';\nimport { Router } from '@angular/router';\nimport { catchError, throwError, switchMap, BehaviorSubject, filter, take, Observable } from 'rxjs';\nimport { CUPCAKE_CORE_CONFIG } from '../services/auth';\n\nlet isRefreshing = false;\nlet refreshFailedCount = 0;\nlet lastRefreshFailTime = 0;\nconst MAX_REFRESH_RETRIES = 3;\nconst REFRESH_RETRY_WINDOW_MS = 60000;\nconst refreshTokenSubject: BehaviorSubject<string | null> = new BehaviorSubject<string | null>(null);\n\nexport function resetRefreshState(): void {\n refreshFailedCount = 0;\n lastRefreshFailTime = 0;\n isRefreshing = false;\n}\n\nexport const authInterceptor: HttpInterceptorFn = (req, next) => {\n const router = inject(Router);\n const http = inject(HttpClient);\n const config = inject(CUPCAKE_CORE_CONFIG);\n\n if (req.url.includes('/auth/login/') || \n req.url.includes('/auth/token/') || \n req.url.includes('/auth/orcid/') || \n req.url.includes('/auth/register/') ||\n req.url.includes('/site-config/public/')) {\n return next(req);\n }\n\n const token = localStorage.getItem('ccvAccessToken');\n\n let authReq = req;\n if (token) {\n authReq = addTokenToRequest(req, token);\n }\n\n return next(authReq).pipe(\n catchError((error: HttpErrorResponse) => {\n if (error.status === 401) {\n return handle401Error(authReq, next, http, router, config);\n }\n \n return throwError(() => error);\n })\n );\n};\n\nfunction addTokenToRequest(request: HttpRequest<any>, token: string): HttpRequest<any> {\n return request.clone({\n setHeaders: {\n Authorization: `Bearer ${token}`\n }\n });\n}\n\nfunction handle401Error(request: HttpRequest<any>, next: HttpHandlerFn, http: HttpClient, router: Router, config: any): Observable<HttpEvent<unknown>> {\n const now = Date.now();\n\n if (now - lastRefreshFailTime > REFRESH_RETRY_WINDOW_MS) {\n refreshFailedCount = 0;\n }\n\n if (refreshFailedCount >= MAX_REFRESH_RETRIES) {\n return throwError(() => new Error('Maximum token refresh attempts exceeded. Please log in again.')) as Observable<HttpEvent<unknown>>;\n }\n\n if (!isRefreshing) {\n isRefreshing = true;\n refreshTokenSubject.next(null);\n\n const refreshToken = localStorage.getItem('ccvRefreshToken');\n\n if (refreshToken) {\n return http.post<{access: string}>(`${config.apiUrl}/auth/token/refresh/`, {\n refresh: refreshToken\n }).pipe(\n switchMap((tokenResponse: {access: string}): Observable<HttpEvent<unknown>> => {\n isRefreshing = false;\n refreshFailedCount = 0;\n lastRefreshFailTime = 0;\n\n localStorage.setItem('ccvAccessToken', tokenResponse.access);\n refreshTokenSubject.next(tokenResponse.access);\n\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('tokenRefreshed'));\n }\n\n return next(addTokenToRequest(request, tokenResponse.access));\n }),\n catchError((refreshError) => {\n isRefreshing = false;\n refreshFailedCount++;\n lastRefreshFailTime = Date.now();\n localStorage.removeItem('ccvAccessToken');\n localStorage.removeItem('ccvRefreshToken');\n refreshTokenSubject.next(null);\n\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('authCleared'));\n }\n\n if (refreshFailedCount >= MAX_REFRESH_RETRIES) {\n router.navigate(['/login'], {\n queryParams: { returnUrl: router.url }\n });\n }\n\n return throwError(() => refreshError) as Observable<HttpEvent<unknown>>;\n })\n );\n } else {\n isRefreshing = false;\n refreshFailedCount++;\n lastRefreshFailTime = Date.now();\n localStorage.removeItem('ccvAccessToken');\n localStorage.removeItem('ccvRefreshToken');\n\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('authCleared'));\n }\n\n if (refreshFailedCount >= MAX_REFRESH_RETRIES) {\n router.navigate(['/login'], {\n queryParams: { returnUrl: router.url }\n });\n }\n\n return throwError(() => new Error('No refresh token available')) as Observable<HttpEvent<unknown>>;\n }\n } else {\n return refreshTokenSubject.pipe(\n filter((token): token is string => token !== null),\n take(1),\n switchMap((token: string): Observable<HttpEvent<unknown>> => {\n return next(addTokenToRequest(request, token));\n })\n );\n }\n}\n","import { Injectable, inject, Inject, InjectionToken } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable, BehaviorSubject, tap, throwError, catchError, map } from 'rxjs';\nimport { User } from '../models';\nimport { resetRefreshState } from '../interceptors';\n\nexport interface CupcakeCoreConfig {\n apiUrl: string;\n}\n\nexport const CUPCAKE_CORE_CONFIG = new InjectionToken<CupcakeCoreConfig>('CUPCAKE_CORE_CONFIG');\n\nexport interface AuthResponse {\n accessToken: string;\n refreshToken: string;\n user: User;\n}\n\nexport interface AuthStatus {\n authenticated: boolean;\n user?: User;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthService {\n private http = inject(HttpClient);\n private config = inject(CUPCAKE_CORE_CONFIG);\n private apiUrl = this.config.apiUrl;\n\n private currentUserSubject = new BehaviorSubject<User | null>(null);\n public currentUser$ = this.currentUserSubject.asObservable();\n private isAuthenticatedSubject = new BehaviorSubject<boolean>(this.hasValidTokenOnInit());\n public isAuthenticated$ = this.isAuthenticatedSubject.asObservable();\n\n constructor() {\n this.initializeAuthState();\n\n if (typeof window !== 'undefined') {\n window.addEventListener('tokenRefreshed', () => {\n this.updateAuthStateAfterRefresh();\n });\n \n window.addEventListener('authCleared', () => {\n this.clearAuthData();\n });\n }\n }\n\n private hasValidTokenOnInit(): boolean {\n if (typeof window === 'undefined') return false;\n \n const token = localStorage.getItem('ccvAccessToken');\n if (!token) return false;\n \n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n const now = Math.floor(Date.now() / 1000);\n return payload.exp > now;\n } catch {\n return false;\n }\n }\n\n private initializeAuthState(): void {\n const token = this.getAccessToken();\n const refreshToken = this.getRefreshToken();\n \n if (token && !this.isTokenExpired(token)) {\n this.isAuthenticatedSubject.next(true);\n \n const user = this.getUserFromToken();\n if (user) {\n this.currentUserSubject.next(user);\n }\n\n this.fetchUserProfile().subscribe({\n next: (fullUser) => {\n },\n error: (error) => {\n }\n });\n } else if (refreshToken && token && this.isTokenExpired(token)) {\n this.isAuthenticatedSubject.next(false);\n this.currentUserSubject.next(null);\n } else if (refreshToken && !token) {\n this.isAuthenticatedSubject.next(false);\n this.currentUserSubject.next(null);\n } else {\n this.isAuthenticatedSubject.next(false);\n this.currentUserSubject.next(null);\n }\n }\n\n private isTokenExpired(token: string): boolean {\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n const now = Math.floor(Date.now() / 1000);\n return payload.exp < now;\n } catch {\n return true;\n }\n }\n\n private convertUserFromSnakeToCamel(user: any): User {\n return {\n id: user.id || user.user_id,\n username: user.username || '',\n email: user.email || '',\n firstName: user.firstName || user.first_name || '',\n lastName: user.lastName || user.last_name || '',\n isStaff: user.isStaff !== undefined ? user.isStaff : (user.is_staff || false),\n isSuperuser: user.isSuperuser !== undefined ? user.isSuperuser : (user.is_superuser || false),\n isActive: user.isActive !== undefined ? user.isActive : (user.is_active !== undefined ? user.is_active : true),\n dateJoined: user.dateJoined || user.date_joined || '',\n lastLogin: user.lastLogin || user.last_login || null,\n hasOrcid: user.hasOrcid !== undefined ? user.hasOrcid : (user.orcid_id ? true : false),\n orcidId: user.orcidId || user.orcid_id\n };\n }\n\n getUserFromToken(): User | null {\n const token = this.getAccessToken();\n if (!token) return null;\n\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n return this.convertUserFromSnakeToCamel({\n id: payload.user_id,\n username: payload.username,\n email: payload.email,\n first_name: payload.first_name,\n last_name: payload.last_name,\n is_staff: payload.is_staff,\n is_superuser: payload.is_superuser,\n is_active: payload.is_active,\n date_joined: payload.date_joined,\n last_login: payload.last_login,\n orcid_id: payload.orcid_id\n });\n } catch {\n return null;\n }\n }\n\n initiateORCIDLogin(): Observable<{authorizationUrl: string, state: string}> {\n return this.http.get<{authorization_url: string, state: string}>(`${this.apiUrl}/auth/orcid/login/`)\n .pipe(\n map(response => ({\n authorizationUrl: response.authorization_url,\n state: response.state\n }))\n );\n }\n\n handleORCIDCallback(code: string, state: string): Observable<AuthResponse> {\n const params = new URLSearchParams({ code, state });\n return this.http.get<AuthResponse>(`${this.apiUrl}/auth/orcid/callback/?${params}`)\n .pipe(\n tap(response => this.setAuthData(response))\n );\n }\n\n exchangeORCIDToken(accessToken: string, orcidId: string): Observable<AuthResponse> {\n return this.http.post<AuthResponse>(`${this.apiUrl}/auth/orcid/token/`, {\n access_token: accessToken,\n orcid_id: orcidId\n }).pipe(\n tap(response => this.setAuthData(response))\n );\n }\n\n login(username: string, password: string): Observable<AuthResponse> {\n return this.http.post<AuthResponse>(`${this.apiUrl}/auth/login/`, {\n username,\n password\n }).pipe(\n tap(response => this.setAuthData(response))\n );\n }\n\n logout(): Observable<any> {\n const refreshToken = this.getRefreshToken();\n const payload = refreshToken ? { refresh: refreshToken } : {};\n \n return this.http.post(`${this.apiUrl}/auth/logout/`, payload)\n .pipe(\n tap(() => this.clearAuthData())\n );\n }\n\n checkAuthStatus(): Observable<AuthStatus> {\n return this.http.get<AuthStatus>(`${this.apiUrl}/auth/status/`)\n .pipe(\n tap(status => {\n if (status.authenticated && status.user) {\n this.currentUserSubject.next(status.user);\n this.isAuthenticatedSubject.next(true);\n } else {\n this.clearAuthData();\n }\n })\n );\n }\n\n fetchUserProfile(): Observable<User> {\n return this.http.get<{user: any}>(`${this.apiUrl}/auth/profile/`)\n .pipe(\n map(response => this.convertUserFromSnakeToCamel(response.user)),\n tap(user => {\n this.currentUserSubject.next(user);\n this.isAuthenticatedSubject.next(true);\n })\n );\n }\n\n getCurrentUser(): User | null {\n return this.currentUserSubject.value;\n }\n\n isAuthenticated(): boolean {\n return this.isAuthenticatedSubject.value;\n }\n\n getAccessToken(): string | null {\n return localStorage.getItem('ccvAccessToken');\n }\n\n getRefreshToken(): string | null {\n return localStorage.getItem('ccvRefreshToken');\n }\n\n private setAuthData(response: AuthResponse): void {\n const accessToken = response.accessToken || (response as any).access_token || (response as any).access;\n const refreshToken = response.refreshToken || (response as any).refresh_token || (response as any).refresh;\n\n localStorage.setItem('ccvAccessToken', accessToken);\n localStorage.setItem('ccvRefreshToken', refreshToken);\n const convertedUser = this.convertUserFromSnakeToCamel(response.user);\n this.currentUserSubject.next(convertedUser);\n this.isAuthenticatedSubject.next(true);\n resetRefreshState();\n }\n\n tryRefreshToken(): Observable<{access: string}> {\n const refreshToken = this.getRefreshToken();\n \n if (!refreshToken) {\n this.clearAuthData();\n return throwError(() => new Error('No refresh token available'));\n }\n\n return this.http.post<{access: string}>(`${this.apiUrl}/auth/token/refresh/`, {\n refresh: refreshToken\n }).pipe(\n tap((response) => {\n localStorage.setItem('ccvAccessToken', response.access);\n this.isAuthenticatedSubject.next(true);\n\n const user = this.getUserFromToken();\n if (user) {\n this.currentUserSubject.next(user);\n }\n\n this.fetchUserProfile().subscribe({\n next: (fullUser) => {\n },\n error: (error) => {\n }\n });\n }),\n catchError((error) => {\n this.clearAuthData();\n return throwError(() => error);\n })\n );\n }\n\n refreshToken(): Observable<{access: string}> {\n const refreshToken = this.getRefreshToken();\n if (!refreshToken) {\n throw new Error('No refresh token available');\n }\n\n return this.http.post<{access: string}>(`${this.apiUrl}/auth/token/refresh/`, {\n refresh: refreshToken\n }).pipe(\n tap(response => {\n localStorage.setItem('ccvAccessToken', response.access);\n this.isAuthenticatedSubject.next(true);\n\n this.fetchUserProfile().subscribe({\n next: (fullUser) => {\n },\n error: (error) => {\n }\n });\n })\n );\n }\n\n updateAuthStateAfterRefresh(): void {\n const token = this.getAccessToken();\n if (token && !this.isTokenExpired(token)) {\n this.isAuthenticatedSubject.next(true);\n\n const user = this.getUserFromToken();\n if (user) {\n this.currentUserSubject.next(user);\n }\n\n this.fetchUserProfile().subscribe({\n next: (fullUser) => {\n },\n error: (error) => {\n }\n });\n }\n }\n\n private clearAuthData(): void {\n localStorage.removeItem('ccvAccessToken');\n localStorage.removeItem('ccvRefreshToken');\n this.currentUserSubject.next(null);\n this.isAuthenticatedSubject.next(false);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BaseResource, ResourceVisibility, ResourceRole } from '../models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ResourceService {\n\n convertLegacyVisibility(isPublic: boolean | undefined, isDefault: boolean = false): ResourceVisibility {\n if (isDefault || isPublic) {\n return ResourceVisibility.PUBLIC;\n }\n return ResourceVisibility.PRIVATE;\n }\n\n convertToLegacyVisibility(visibility: ResourceVisibility): boolean {\n return visibility === ResourceVisibility.PUBLIC;\n }\n\n getVisibilityLabel(visibility: ResourceVisibility): string {\n switch (visibility) {\n case ResourceVisibility.PRIVATE:\n return 'Private';\n case ResourceVisibility.GROUP:\n return 'Lab Group';\n case ResourceVisibility.PUBLIC:\n return 'Public';\n default:\n return 'Unknown';\n }\n }\n\n getRoleLabel(role: ResourceRole): string {\n switch (role) {\n case ResourceRole.OWNER:\n return 'Owner';\n case ResourceRole.ADMIN:\n return 'Administrator';\n case ResourceRole.EDITOR:\n return 'Editor';\n case ResourceRole.VIEWER:\n return 'Viewer';\n default:\n return 'Unknown';\n }\n }\n\n canPerformAction(resource: BaseResource, action: 'view' | 'edit' | 'delete' | 'share'): boolean {\n switch (action) {\n case 'view':\n return resource.canView ?? true;\n case 'edit':\n return resource.canEdit ?? false;\n case 'delete':\n return resource.canDelete ?? false;\n case 'share':\n // Share permission is based on ownership or admin role\n // This would typically require checking permissions via API\n return resource.canEdit ?? false;\n default:\n return false;\n }\n }\n\n getVisibilityOptions(): Array<{value: ResourceVisibility, label: string, description: string}> {\n return [\n {\n value: ResourceVisibility.PRIVATE,\n label: 'Private',\n description: 'Only you can access this resource'\n },\n {\n value: ResourceVisibility.GROUP,\n label: 'Lab Group',\n description: 'Members of your lab group can access this resource'\n },\n {\n value: ResourceVisibility.PUBLIC,\n label: 'Public',\n description: 'All users can access this resource'\n }\n ];\n }\n\n getRoleOptions(): Array<{value: ResourceRole, label: string, description: string}> {\n return [\n {\n value: ResourceRole.VIEWER,\n label: 'Viewer',\n description: 'Can view the resource'\n },\n {\n value: ResourceRole.EDITOR,\n label: 'Editor',\n description: 'Can view and edit the resource'\n },\n {\n value: ResourceRole.ADMIN,\n label: 'Administrator',\n description: 'Can view, edit, and manage permissions'\n },\n {\n value: ResourceRole.OWNER,\n label: 'Owner',\n description: 'Full control over the resource'\n }\n ];\n }\n\n transformLegacyResource<T extends Partial<BaseResource>>(legacyData: any): T {\n const transformed = { ...legacyData };\n\n if (legacyData.creator !== undefined) {\n transformed.owner = legacyData.creator;\n delete transformed.creator;\n }\n if (legacyData.creator_username !== undefined) {\n transformed.ownerUsername = legacyData.creator_username;\n delete transformed.creator_username;\n }\n\n if (legacyData.isPublic !== undefined) {\n transformed.visibility = this.convertLegacyVisibility(legacyData.isPublic, legacyData.isDefault);\n delete transformed.isPublic;\n }\n\n if (transformed.visibility === undefined) {\n transformed.visibility = ResourceVisibility.PRIVATE;\n }\n if (transformed.isActive === undefined) {\n transformed.isActive = true;\n }\n if (transformed.isLocked === undefined) {\n transformed.isLocked = false;\n }\n\n return transformed as T;\n }\n\n prepareForAPI<T extends Record<string, any>>(resourceData: T): any {\n const prepared: any = { ...resourceData };\n\n if (prepared.owner !== undefined) {\n prepared.creator = prepared.owner;\n delete prepared.owner;\n }\n if (prepared.ownerUsername !== undefined) {\n prepared.creator_username = prepared.ownerUsername;\n delete prepared.ownerUsername;\n }\n\n if (prepared.visibility !== undefined) {\n prepared.isPublic = this.convertToLegacyVisibility(prepared.visibility);\n delete prepared.visibility;\n }\n\n return prepared;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { ResourceService } from './resource';\nimport {\n SiteConfig,\n AuthConfig,\n RegistrationStatus,\n User,\n UserCreateRequest,\n UserRegistrationRequest,\n UserResponse,\n UserListResponse,\n PasswordChangeRequest,\n PasswordChangeResponse,\n AdminPasswordResetRequest,\n PasswordResetRequest,\n PasswordResetConfirmRequest,\n UserProfileUpdateRequest,\n EmailChangeRequest,\n EmailChangeConfirmRequest,\n Annotation,\n AnnotationFolder,\n AnnotationCreateRequest,\n AnnotationUpdateRequest,\n AnnotationFolderCreateRequest,\n AnnotationFolderUpdateRequest,\n ResourcePermission,\n ResourcePermissionCreateRequest,\n ResourcePermissionUpdateRequest,\n BulkPermissionRequest,\n RemoteHost,\n RemoteHostCreateRequest,\n RemoteHostUpdateRequest\n} from '../models';\nimport { CUPCAKE_CORE_CONFIG } from './auth';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ApiService {\n private config = inject(CUPCAKE_CORE_CONFIG);\n private apiUrl = this.config.apiUrl;\n private resourceService = inject(ResourceService);\n\n constructor(private http: HttpClient) {}\n\n // ===== SYSTEMATIC CASE TRANSFORMATION METHODS =====\n\n /**\n * Transform camelCase object to snake_case for API requests\n */\n private transformToSnakeCase(obj: any): any {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => this.transformToSnakeCase(item));\n }\n\n const transformed: any = {};\n Object.entries(obj).forEach(([key, value]) => {\n // Convert camelCase to snake_case\n const snakeKey = key.replace(/([A-Z])/g, '_$1').toLowerCase();\n transformed[snakeKey] = this.transformToSnakeCase(value);\n });\n\n return transformed;\n }\n\n /**\n * Transform snake_case object to camelCase for TypeScript interfaces\n */\n private transformToCamelCase(obj: any): any {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => this.transformToCamelCase(item));\n }\n\n const transformed: any = {};\n Object.entries(obj).forEach(([key, value]) => {\n // Convert snake_case to camelCase\n const camelKey = key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n transformed[camelKey] = this.transformToCamelCase(value);\n });\n\n return transformed;\n }\n\n /**\n * Make HTTP GET request with automatic snake_case to camelCase transformation\n */\n public get<T>(url: string, options?: any): Observable<T> {\n return this.http.get(url, options).pipe(\n map(response => this.transformToCamelCase(response) as T)\n );\n }\n\n /**\n * Make HTTP POST request with automatic camelCase to snake_case transformation\n */\n public post<T>(url: string, body: any, options?: any): Observable<T> {\n const transformedBody = this.transformToSnakeCase(body);\n return this.http.post(url, transformedBody, options).pipe(\n map(response => this.transformToCamelCase(response) as T)\n );\n }\n\n /**\n * Make HTTP PUT request with automatic camelCase to snake_case transformation\n */\n public put<T>(url: string, body: any, options?: any): Observable<T> {\n const transformedBody = this.transformToSnakeCase(body);\n return this.http.put(url, transformedBody, options).pipe(\n map(response => this.transformToCamelCase(response) as T)\n );\n }\n\n /**\n * Make HTTP PATCH request with automatic camelCase to snake_case transformation\n */\n public patch<T>(url: string, body: any, options?: any): Observable<T> {\n const transformedBody = this.transformToSnakeCase(body);\n return this.http.patch(url, transformedBody, options).pipe(\n map(response => this.transformToCamelCase(response) as T)\n );\n }\n\n /**\n * Make HTTP DELETE request with automatic snake_case to camelCase transformation\n */\n public delete<T>(url: string, options?: any): Observable<T> {\n return this.http.delete(url, options).pipe(\n map(response => this.transformToCamelCase(response) as T)\n );\n }\n\n // USER PROFILE\n getUserProfile(): Observable<{user: any}> {\n return this.http.get<{user: any}>(`${this.apiUrl}/auth/profile/`);\n }\n\n\n // ===================================================================\n // SITE CONFIGURATION METHODS\n // ===================================================================\n\n getSiteConfig(): Observable<SiteConfig[]> {\n return this.http.get<SiteConfig[]>(`${this.apiUrl}/site_config/`);\n }\n\n updateSiteConfig(id: number, config: Partial<SiteConfig>): Observable<SiteConfig> {\n return this.http.patch<SiteConfig>(`${this.apiUrl}/site_config/${id}/`, config);\n }\n\n // ===================================================================\n // USER MANAGEMENT METHODS\n // ===================================================================\n\n // Admin-only user management\n getUsers(params?: {\n isStaff?: boolean;\n isActive?: boolean;\n search?: string;\n limit?: number;\n offset?: number;\n }): Observable<UserListResponse> {\n let httpParams = new HttpParams();\n if (params?.isStaff !== undefined) httpParams = httpParams.set('is_staff', params.isStaff.toString());\n if (params?.isActive !== undefined) httpParams = httpParams.set('is_active', params.isActive.toString());\n if (params?.search) httpParams = httpParams.set('search', params.search);\n if (params?.limit) httpParams = httpParams.set('limit', params.limit.toString());\n if (params?.offset !== undefined) httpParams = httpParams.set('offset', params.offset.toString());\n\n return this.http.get<UserListResponse>(`${this.apiUrl}/users/`, { params: httpParams });\n }\n\n getUser(id: number): Observable<User> {\n return this.http.get<User>(`${this.apiUrl}/users/${id}/`);\n }\n\n createUser(userData: UserCreateRequest): Observable<UserResponse> {\n return this.post<UserResponse>(`${this.apiUrl}/users/admin_create/`, userData);\n }\n\n updateUser(id: number, userData: Partial<User>): Observable<User> {\n return this.http.patch<User>(`${this.apiUrl}/users/${id}/`, userData);\n }\n\n deleteUser(id: number): Observable<void> {\n return this.http.delete<void>(`${this.apiUrl}/users/${id}/`);\n }\n\n // Public user registration\n registerUser(userData: UserRegistrationRequest): Observable<UserResponse> {\n return this.http.post<UserResponse>(`${this.apiUrl}/users/register/`, userData);\n }\n\n // Authentication configuration\n getAuthConfig(): Observable<AuthConfig> {\n return this.http.get<AuthConfig>(`${this.apiUrl}/users/auth_config/`);\n }\n\n getRegistrationStatus(): Observable<RegistrationStatus> {\n return this.http.get<RegistrationStatus>(`${this.apiUrl}/users/registration_status/`);\n }\n\n // ===================================================================\n // PASSWORD MANAGEMENT METHODS\n // ===================================================================\n\n // User password change (authenticated user)\n changePassword(passwordData: PasswordChangeRequest): Observable<PasswordChangeResponse> {\n return this.http.post<PasswordChangeResponse>(`${this.apiUrl}/users/change_password/`, passwordData);\n }\n\n // User profile update\n updateProfile(profileData: UserProfileUpdateRequest): Observable<UserResponse> {\n return this.http.post<UserResponse>(`${this.apiUrl}/users/update_profile/`, profileData);\n }\n\n // Email change with verification\n requestEmailChange(emailData: EmailChangeRequest): Observable<{message: string, new_email: string}> {\n return this.http.post<{message: string, new_email: string}>(`${this.apiUrl}/users/request_email_change/`, emailData);\n }\n\n confirmEmailChange(confirmData: EmailChangeConfirmRequest): Observable<{message: string}> {\n return this.http.post<{message: string}>(`${this.apiUrl}/users/confirm_email_change/`, confirmData);\n }\n\n // Admin password reset\n resetUserPassword(userId: number, passwordData: AdminPasswordResetRequest): Observable<PasswordChangeResponse> {\n const apiData = {\n user_id: passwordData.userId,\n new_password: passwordData.newPassword,\n confirm_password: passwordData.confirmPassword,\n force_password_change: passwordData.forcePasswordChange,\n reason: passwordData.reason\n };\n return this.http.post<PasswordChangeResponse>(`${this.apiUrl}/users/${userId}/reset_password/`, apiData);\n }\n\n // Password reset request (forgot password)\n requestPasswordReset(resetData: PasswordResetRequest): Observable<PasswordChangeResponse> {\n return this.http.post<PasswordChangeResponse>(`${this.apiUrl}/users/request_password_reset/`, resetData);\n }\n\n // Confirm password reset with token\n confirmPasswordReset(confirmData: PasswordResetConfirmRequest): Observable<PasswordChangeResponse> {\n return this.http.post<PasswordChangeResponse>(`${this.apiUrl}/users/confirm_password_reset/`, confirmData);\n }\n\n // ===================================================================\n // ACCOUNT LINKING METHODS\n // ===================================================================\n\n // Link ORCID to current user account\n linkOrcid(orcidData: { orcidId: string; verificationCode?: string }): Observable<any> {\n return this.http.post<any>(`${this.apiUrl}/users/link_orcid/`, orcidData);\n }\n\n // Unlink ORCID from current user account\n unlinkOrcid(): Observable<PasswordChangeResponse> {\n return this.http.delete<PasswordChangeResponse>(`${this.apiUrl}/users/unlink_orcid/`);\n }\n\n // Detect duplicate accounts\n detectDuplicateAccounts(searchData: {\n email?: string;\n orcidId?: string;\n firstName?: string;\n lastName?: string;\n }): Observable<any> {\n return this.http.post<any>(`${this.apiUrl}/users/detect_duplicates/`, searchData);\n }\n\n // Request account merge\n requestAccountMerge(mergeData: {\n duplicateUserId: number;\n reason: string;\n }): Observable<any> {\n return this.http.post<any>(`${this.apiUrl}/users/request_merge/`, mergeData);\n }\n\n // ANNOTATION MANAGEMENT\n\n getAnnotationFolders(params?: {\n search?: string;\n parentFolder?: number;\n isSharedDocumentFolder?: boolean;\n labGroup?: number;\n limit?: number;\n offset?: number;\n }): Observable<{count: number, results: AnnotationFolder[]}> {\n let httpParams = new HttpParams();\n if (params) {\n Object.keys(params).forEach(key => {\n const value = params[key as keyof typeof params];\n if (value !== undefined && value !== null) {\n httpParams = httpParams.set(key, value.toString());\n }\n });\n }\n return this.http.get<any>(`${this.apiUrl}/annotation-folders/`, { params: httpParams }).pipe(\n map(response => ({\n ...response,\n results: response.results.map((folder: any) => this.resourceService.transformLegacyResource(folder))\n }))\n );\n }\n\n getAnnotationFolder(id: number): Observable<AnnotationFolder> {\n return this.http.get<any>(`${this.apiUrl}/annotation-folders/${id}/`).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n createAnnotationFolder(folderData: AnnotationFolderCreateRequest): Observable<AnnotationFolder> {\n const preparedData = this.resourceService.prepareForAPI(folderData);\n return this.http.post<any>(`${this.apiUrl}/annotation-folders/`, preparedData).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n updateAnnotationFolder(id: number, folderData: AnnotationFolderUpdateRequest): Observable<AnnotationFolder> {\n const preparedData = this.resourceService.prepareForAPI(folderData);\n return this.http.patch<any>(`${this.apiUrl}/annotation-folders/${id}/`, preparedData).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n deleteAnnotationFolder(id: number): Observable<void> {\n return this.http.delete<void>(`${this.apiUrl}/annotation-folders/${id}/`);\n }\n\n /**\n * WARNING: This method accesses the base annotation endpoint and should only be used\n * for standalone annotations that are NOT attached to parent resources.\n *\n * For annotations attached to parent resources, use the specialized services instead:\n * - Instrument annotations: Use InstrumentService from @noatgnu/cupcake-macaron\n * - StoredReagent annotations: Use ReagentService from @noatgnu/cupcake-macaron\n * - Session annotations: Use SessionService from @noatgnu/cupcake-red-velvet\n *\n * These specialized services ensure proper permission checking through parent resources.\n */\n getAnnotations(params?: {\n search?: string;\n annotationType?: string;\n folder?: number;\n transcribed?: boolean;\n scratched?: boolean;\n labGroup?: number;\n limit?: number;\n offset?: number;\n }): Observable<{count: number, results: Annotation[]}> {\n let httpParams = new HttpParams();\n if (params) {\n Object.keys(params).forEach(key => {\n const value = params[key as keyof typeof params];\n if (value !== undefined && value !== null) {\n httpParams = httpParams.set(key, value.toString());\n }\n });\n }\n return this.http.get<any>(`${this.apiUrl}/annotations/`, { params: httpParams }).pipe(\n map(response => ({\n ...response,\n results: response.results.map((annotation: any) => this.resourceService.transformLegacyResource(annotation))\n }))\n );\n }\n\n /**\n * WARNING: This method accesses the base annotation endpoint and should only be used\n * for standalone annotations that are NOT attached to parent resources.\n *\n * For annotations attached to parent resources, use the specialized services instead:\n * - Instrument annotations: Use InstrumentService.getInstrumentAnnotation()\n * - StoredReagent annotations: Use ReagentService.getStoredReagentAnnotation()\n * - Session annotations: Use SessionService (session folder annotations)\n *\n * The backend enforces parent resource permissions, but using specialized services\n * provides cleaner access control and better context.\n */\n getAnnotation(id: number): Observable<Annotation> {\n return this.http.get<any>(`${this.apiUrl}/annotations/${id}/`).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n /**\n * WARNING: This method accesses the base annotation endpoint and should only be used\n * for standalone annotations that are NOT attached to parent resources.\n *\n * For creating annotations attached to parent resources, use specialized upload methods:\n * - Instrument annotations: Use InstrumentService.uploadAnnotation()\n * - StoredReagent annotations: Use ReagentService.uploadAnnotation()\n * - Session/Step annotations: Use the appropriate chunked upload service\n *\n * These specialized methods provide chunked upload support, progress tracking,\n * and automatic binding to parent resources with proper permission enforcement.\n */\n createAnnotation(annotationData: AnnotationCreateRequest): Observable<Annotation> {\n const formData = new FormData();\n Object.keys(annotationData).forEach(key => {\n const value = (annotationData as any)[key];\n if (value !== undefined && value !== null) {\n if (key === 'file' && value instanceof File) {\n formData.append(key, value);\n } else {\n formData.append(key, value.toString());\n }\n }\n });\n return this.http.post<any>(`${this.apiUrl}/annotations/`, formData).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n /**\n * WARNING: This method accesses the base annotation endpoint and should only be used\n * for standalone annotations that are NOT attached to parent resources.\n *\n * For annotations attached to parent resources, the backend enforces parent resource\n * permissions. However, using specialized services provides better context and access control.\n */\n updateAnnotation(id: number, annotationData: AnnotationUpdateRequest): Observable<Annotation> {\n const preparedData = this.resourceService.prepareForAPI(annotationData);\n return this.http.patch<any>(`${this.apiUrl}/annotations/${id}/`, preparedData).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n /**\n * WARNING: This method accesses the base annotation endpoint and should only be used\n * for standalone annotations that are NOT attached to parent resources.\n *\n * For deleting annotations attached to parent resources, use specialized services:\n * - Instrument annotations: Use InstrumentService.deleteInstrumentAnnotation()\n * - StoredReagent annotations: Use ReagentService.deleteStoredReagentAnnotation()\n * - Session annotations: Use appropriate session/step annotation delete methods\n *\n * The backend enforces parent resource permissions, but using specialized services\n * provides clearer intent and better access control context.\n */\n deleteAnnotation(id: number): Observable<void> {\n return this.http.delete<void>(`${this.apiUrl}/annotations/${id}/`);\n }\n\n // RESOURCE PERMISSIONS\n\n getResourcePermissions(params?: {\n user?: number;\n resourceContentType?: number;\n resourceObjectId?: number;\n role?: string;\n limit?: number;\n offset?: number;\n }): Observable<{count: number, results: ResourcePermission[]}> {\n let httpParams = new HttpParams();\n if (params) {\n Object.keys(params).forEach(key => {\n const value = params[key as keyof typeof params];\n if (value !== undefined && value !== null) {\n httpParams = httpParams.set(key, value.toString());\n }\n });\n }\n return this.http.get<any>(`${this.apiUrl}/resource-permissions/`, { params: httpParams }).pipe(\n map(response => ({\n ...response,\n results: response.results.map((permission: any) => this.resourceService.transformLegacyResource(permission))\n }))\n );\n }\n\n getResourcePermission(id: number): Observable<ResourcePermission> {\n return this.http.get<any>(`${this.apiUrl}/resource-permissions/${id}/`).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n createResourcePermission(permissionData: ResourcePermissionCreateRequest): Observable<ResourcePermission> {\n const preparedData = this.resourceService.prepareForAPI(permissionData);\n return this.http.post<any>(`${this.apiUrl}/resource-permissions/`, preparedData).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n updateResourcePermission(id: number, permissionData: ResourcePermissionUpdateRequest): Observable<ResourcePermission> {\n const preparedData = this.resourceService.prepareForAPI(permissionData);\n return this.http.patch<any>(`${this.apiUrl}/resource-permissions/${id}/`, preparedData).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n deleteResourcePermission(id: number): Observable<void> {\n return this.http.delete<void>(`${this.apiUrl}/resource-permissions/${id}/`);\n }\n\n createBulkPermissions(bulkData: BulkPermissionRequest): Observable<{created: ResourcePermission[], errors: any[]}> {\n const preparedData = this.resourceService.prepareForAPI(bulkData);\n return this.http.post<any>(`${this.apiUrl}/resource-permissions/bulk_create/`, preparedData).pipe(\n map(response => ({\n ...response,\n created: response.created.map((permission: any) => this.resourceService.transformLegacyResource(permission))\n }))\n );\n }\n\n getResourcePermissionsByResource(resourceContentType: number, resourceObjectId: number): Observable<ResourcePermission[]> {\n const httpParams = new HttpParams()\n .set('resourceContentType', resourceContentType.toString())\n .set('resourceObjectId', resourceObjectId.toString());\n return this.http.get<any[]>(`${this.apiUrl}/resource-permissions/by_resource/`, { params: httpParams }).pipe(\n map(permissions => permissions.map(permission => this.resourceService.transformLegacyResource(permission)))\n );\n }\n\n // REMOTE HOST MANAGEMENT\n\n getRemoteHosts(params?: {\n search?: string;\n hostName?: string;\n hostProtocol?: string;\n limit?: number;\n offset?: number;\n }): Observable<{count: number, results: RemoteHost[]}> {\n let httpParams = new HttpParams();\n if (params) {\n Object.keys(params).forEach(key => {\n const value = params[key as keyof typeof params];\n if (value !== undefined && value !== null) {\n httpParams = httpParams.set(key, value.toString());\n }\n });\n }\n return this.http.get<any>(`${this.apiUrl}/remote-hosts/`, { params: httpParams }).pipe(\n map(response => ({\n ...response,\n results: response.results.map((host: any) => this.resourceService.transformLegacyResource(host))\n }))\n );\n }\n\n getRemoteHost(id: number): Observable<RemoteHost> {\n return this.http.get<any>(`${this.apiUrl}/remote-hosts/${id}/`).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n createRemoteHost(hostData: RemoteHostCreateRequest): Observable<RemoteHost> {\n const preparedData = this.resourceService.prepareForAPI(hostData);\n return this.http.post<any>(`${this.apiUrl}/remote-hosts/`, preparedData).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n updateRemoteHost(id: number, hostData: RemoteHostUpdateRequest): Observable<RemoteHost> {\n const preparedData = this.resourceService.prepareForAPI(hostData);\n return this.http.patch<any>(`${this.apiUrl}/remote-hosts/${id}/`, preparedData).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n deleteRemoteHost(id: number): Observable<void> {\n return this.http.delete<void>(`${this.apiUrl}/remote-hosts/${id}/`);\n }\n\n testRemoteHostConnection(id: number): Observable<{success: boolean, message: string}> {\n return this.http.post<{success: boolean, message: string}>(`${this.apiUrl}/remote-hosts/${id}/test_connection/`, {});\n }\n}\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { CUPCAKE_CORE_CONFIG } from './auth';\r\n\r\n/**\r\n * Base API service with systematic case transformation\r\n * All other API services should extend this to get automatic snake_case <-> camelCase conversion\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class BaseApiService {\r\n protected http = inject(HttpClient);\r\n private config = inject(CUPCAKE_CORE_CONFIG);\r\n protected apiUrl = this.config.apiUrl;\r\n\r\n // ===== SYSTEMATIC CASE TRANSFORMATION METHODS =====\r\n\r\n /**\r\n * Transform camelCase object to snake_case for API requests\r\n */\r\n protected transformToSnakeCase(obj: any): any {\r\n if (obj === null || typeof obj !== 'object') {\r\n return obj;\r\n }\r\n\r\n // Skip FormData objects - they should not be transformed\r\n if (obj instanceof FormData) {\r\n return obj;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(item => this.transformToSnakeCase(item));\r\n }\r\n\r\n const transformed: any = {};\r\n Object.entries(obj).forEach(([key, value]) => {\r\n const snakeKey = key.replace(/([A-Z])/g, '_$1').toLowerCase();\r\n transformed[snakeKey] = this.transformToSnakeCase(value);\r\n });\r\n\r\n return transformed;\r\n }\r\n\r\n /**\r\n * Transform snake_case object to camelCase for TypeScript interfaces\r\n */\r\n protected transformToCamelCase(obj: any): any {\r\n if (obj === null || typeof obj !== 'object') {\r\n return obj;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(item => this.transformToCamelCase(item));\r\n }\r\n\r\n const transformed: any = {};\r\n Object.entries(obj).forEach(([key, value]) => {\r\n const camelKey = key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\r\n transformed[camelKey] = this.transformToCamelCase(value);\r\n });\r\n\r\n return transformed;\r\n }\r\n\r\n // ===== HTTP METHODS WITH AUTOMATIC TRANSFORMATION =====\r\n\r\n /**\r\n * Make HTTP GET request with automatic snake_case to camelCase transformation\r\n */\r\n protected get<T>(url: string, options?: any): Observable<T> {\r\n return this.http.get(url, options).pipe(\r\n map(response => this.transformToCamelCase(response) as T)\r\n );\r\n }\r\n\r\n /**\r\n * Make HTTP POST request with automatic camelCase to snake_case transformation\r\n */\r\n protected post<T>(url: string, body: any, options?: any): Observable<T> {\r\n const transformedBody = this.transformToSnakeCase(body);\r\n return this.http.post(url, transformedBody, options).pipe(\r\n map(response => this.transformToCamelCase(response) as T)\r\n );\r\n }\r\n\r\n /**\r\n * Make HTTP PUT request with automatic camelCase to snake_case transformation\r\n */\r\n protected put<T>(url: string, body: any, options?: any): Observable<T> {\r\n const transformedBody = this.transformToSnakeCase(body);\r\n return this.http.put(url, transformedBody, options).pipe(\r\n map(response => this.transformToCamelCase(response) as T)\r\n );\r\n }\r\n\r\n /**\r\n * Make HTTP PATCH request with automatic camelCase to snake_case transformation\r\n */\r\n protected patch<T>(url: string, body: any, options?: any): Observable<T> {\r\n const transformedBody = this.transformToSnakeCase(body);\r\n return this.http.patch(url, transformedBody, options).pipe(\r\n map(response => this.transformToCamelCase(response) as T)\r\n );\r\n }\r\n\r\n /**\r\n * Make HTTP DELETE request with automatic snake_case to camelCase transformation\r\n */\r\n protected delete<T>(url: string, options?: any): Observable<T> {\r\n return this.http.delete(url, options).pipe(\r\n map(response => this.transformToCamelCase(response) as T)\r\n );\r\n }\r\n\r\n /**\r\n * Build HttpParams from query parameters object with automatic case transformation\r\n */\r\n protected buildHttpParams(params: any): HttpParams {\r\n let httpParams = new HttpParams();\r\n \r\n if (params) {\r\n const transformedParams = this.transformToSnakeCase(params);\r\n Object.entries(transformedParams).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n httpParams = httpParams.set(key, value.toString());\r\n }\r\n });\r\n }\r\n \r\n return httpParams;\r\n }\r\n}","import { Injectable, signal } from '@angular/core';\n\nexport interface ToastMessage {\n id: string;\n message: string;\n type: 'success' | 'error' | 'warning' | 'info';\n duration?: number;\n dismissible?: boolean;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ToastService {\n private toastsSignal = signal<ToastMessage[]>([]);\n \n readonly toasts = this.toastsSignal.asReadonly();\n\n show(message: string, type: 'success' | 'error' | 'warning' | 'info' = 'info', duration = 5000) {\n const id = this.generateId();\n const toast: ToastMessage = {\n id,\n message,\n type,\n duration,\n dismissible: true\n };\n\n this.toastsSignal.update(toasts => [...toasts, toast]);\n\n if (duration > 0) {\n setTimeout(() => {\n this.remove(id);\n }, duration);\n }\n }\n\n success(message: string, duration = 5000) {\n this.show(message, 'success', duration);\n }\n\n error(message: string, duration = 8000) {\n this.show(message, 'error', duration);\n }\n\n warning(message: string, duration = 6000) {\n this.show(message, 'warning', duration);\n }\n\n info(message: string, duration = 5000) {\n this.show(message, 'info', duration);\n }\n\n remove(id: string) {\n this.toastsSignal.update(toasts => toasts.filter(toast => toast.id !== id));\n }\n\n clear() {\n this.toastsSignal.set([]);\n }\n\n private generateId(): string {\n return Math.random().toString(36).substring(2) + Date.now().toString(36);\n }\n}\n","import { Injectable, signal, computed } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { ToastService } from './toast';\r\n\r\nexport interface NotificationItem {\r\n id: string;\r\n type: string;\r\n title: string;\r\n message: string;\r\n timestamp: Date;\r\n read: boolean;\r\n level?: 'info' | 'success' | 'warning' | 'error';\r\n actions?: NotificationAction[];\r\n autoClose?: boolean;\r\n data?: any;\r\n}\r\n\r\nexport interface NotificationAction {\r\n label: string;\r\n action: string;\r\n style?: 'primary' | 'secondary' | 'success' | 'warning' | 'danger';\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NotificationService {\r\n private notifications = signal<NotificationItem[]>([]);\r\n private notificationSubject = new Subject<NotificationItem>();\r\n\r\n readonly allNotifications = computed(() => this.notifications());\r\n readonly unreadNotifications = computed(() =>\r\n this.notifications().filter(n => !n.read)\r\n );\r\n readonly unreadCount = computed(() => this.unreadNotifications().length);\r\n\r\n readonly notification$ = this.notificationSubject.asObservable();\r\n\r\n constructor(protected toastService: ToastService) {}\r\n\r\n protected addNotification(notification: NotificationItem): void {\r\n this.notifications.update(notifications => {\r\n const updated = [notification, ...notifications];\r\n return updated.slice(0, 100);\r\n });\r\n\r\n this.notificationSubject.next(notification);\r\n console.log('Notification added:', notification);\r\n }\r\n\r\n protected generateNotificationId(): string {\r\n return `notification_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n\r\n markAsRead(notificationId: string): void {\r\n this.notifications.update(notifications =>\r\n notifications.map(n =>\r\n n.id === notificationId ? { ...n, read: true } : n\r\n )\r\n );\r\n }\r\n\r\n markAllAsRead(): void {\r\n this.notifications.update(notifications =>\r\n notifications.map(n => ({ ...n, read: true }))\r\n );\r\n }\r\n\r\n removeNotification(notificationId: string): void {\r\n this.notifications.update(notifications =>\r\n notifications.filter(n => n.id !== notificationId)\r\n );\r\n }\r\n\r\n clearAll(): void {\r\n this.notifications.set([]);\r\n }\r\n\r\n clearRead(): void {\r\n this.notifications.update(notifications =>\r\n notifications.filter(n => !n.read)\r\n );\r\n }\r\n\r\n createLocalNotification(\r\n type: string,\r\n title: string,\r\n message: string,\r\n level: 'info' | 'success' | 'warning' | 'error' = 'info',\r\n autoClose = true\r\n ): void {\r\n const notification: NotificationItem = {\r\n id: this.generateNotificationId(),\r\n type,\r\n title,\r\n message,\r\n timestamp: new Date(),\r\n read: false,\r\n level,\r\n autoClose\r\n };\r\n\r\n this.addNotification(notification);\r\n\r\n switch (level) {\r\n case 'error':\r\n this.toastService.error(`${title}: ${message}`);\r\n break;\r\n case 'warning':\r\n this.toastService.warning(`${title}: ${message}`);\r\n break;\r\n case 'success':\r\n this.toastService.success(`${title}: ${message}`);\r\n break;\r\n default:\r\n this.toastService.info(`${title}: ${message}`);\r\n }\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { BaseApiService } from './base-api';\r\nimport { SiteConfig } from '../models/site-config';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SiteConfigService extends BaseApiService {\r\n\r\n private readonly defaultConfig: SiteConfig = {\r\n siteName: 'CUPCAKE Vanilla',\r\n showPoweredBy: true,\r\n primaryColor: '#1976d2',\r\n allowUserRegistration: false,\r\n enableOrcidLogin: false,\r\n installedApps: {},\r\n createdAt: new Date().toISOString(),\r\n updatedAt: new Date().toISOString()\r\n };\r\n\r\n private configSubject = new BehaviorSubject<SiteConfig>(this.defaultConfig);\r\n public config$ = this.configSubject.asObservable();\r\n\r\n constructor() {\r\n super();\r\n this.loadConfig();\r\n }\r\n\r\n private loadConfig(): void {\r\n const savedConfig = localStorage.getItem('site_config');\r\n if (savedConfig) {\r\n try {\r\n const config = JSON.parse(savedConfig);\r\n this.configSubject.next({ ...this.defaultConfig, ...config });\r\n } catch (error) {\r\n // Invalid config, use defaults\r\n }\r\n }\r\n\r\n this.fetchConfigFromBackend().subscribe({\r\n next: (config) => {\r\n this.configSubject.next({ ...this.defaultConfig, ...config });\r\n localStorage.setItem('site_config', JSON.stringify(config));\r\n },\r\n error: () => {\r\n // Continue with current config\r\n }\r\n });\r\n }\r\n\r\n private fetchConfigFromBackend(): Observable<Partial<SiteConfig>> {\r\n return this.get<Partial<SiteConfig>>(`${this.apiUrl}/site-config/public/`);\r\n }\r\n\r\n getCurrentConfig(): Observable<SiteConfig> {\r\n return this.get<SiteConfig>(`${this.apiUrl}/site-config/current/`);\r\n }\r\n\r\n updateConfig(config: Partial<SiteConfig>): Observable<SiteConfig> {\r\n return this.put<SiteConfig>(`${this.apiUrl}/site-config/update_config/`, config);\r\n }\r\n\r\n getSiteName(): string {\r\n return this.configSubject.value.siteName;\r\n }\r\n\r\n shouldShowPoweredBy(): boolean {\r\n return this.configSubject.value.showPoweredBy !== false;\r\n }\r\n\r\n getLogoUrl(): string | null {\r\n const config = this.configSubject.value;\r\n return config.logoImage || config.logoUrl || null;\r\n }\r\n\r\n getPrimaryColor(): string {\r\n return this.configSubject.value.primaryColor || '#1976d2';\r\n }\r\n\r\n isRegistrationEnabled(): boolean {\r\n return this.configSubject.value.allowUserRegistration === true;\r\n }\r\n\r\n isOrcidLoginEnabled(): boolean {\r\n return this.configSubject.value.enableOrcidLogin === true;\r\n }\r\n}\r\n","import { Injectable, signal, computed } from '@angular/core';\r\n\r\nexport type Theme = 'light' | 'dark' | 'auto';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ThemeService {\r\n private readonly THEME_KEY = 'cupcake-theme';\r\n private readonly mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\r\n\r\n private _theme = signal<Theme>(this.loadStoredTheme());\r\n\r\n readonly theme = this._theme.asReadonly();\r\n readonly isDark = computed(() => {\r\n const theme = this._theme();\r\n if (theme === 'auto') {\r\n return this.mediaQuery.matches;\r\n }\r\n return theme === 'dark';\r\n });\r\n\r\n constructor() {\r\n this.mediaQuery.addEventListener('change', () => {\r\n if (this._theme() === 'auto') {\r\n this.updateDocumentTheme();\r\n }\r\n });\r\n\r\n this.updateDocumentTheme();\r\n }\r\n\r\n setTheme(theme: Theme): void {\r\n this._theme.set(theme);\r\n localStorage.setItem(this.THEME_KEY, theme);\r\n this.updateDocumentTheme();\r\n }\r\n\r\n toggleTheme(): void {\r\n const current = this._theme();\r\n if (current === 'light') {\r\n this.setTheme('dark');\r\n } else if (current === 'dark') {\r\n this.setTheme('auto');\r\n } else {\r\n this.setTheme('light');\r\n }\r\n }\r\n\r\n private loadStoredTheme(): Theme {\r\n const stored = localStorage.getItem(this.THEME_KEY) as Theme;\r\n return stored && ['light', 'dark', 'auto'].includes(stored) ? stored : 'auto';\r\n }\r\n\r\n private updateDocumentTheme(): void {\r\n const isDark = this.isDark();\r\n document.documentElement.setAttribute('data-bs-theme', isDark ? 'dark' : 'light');\r\n document.documentElement.classList.toggle('dark-mode', isDark);\r\n }\r\n\r\n getThemeIcon(): string {\r\n const theme = this._theme();\r\n switch (theme) {\r\n case 'light': return 'bi-sun-fill';\r\n case 'dark': return 'bi-moon-fill';\r\n case 'auto': return 'bi-circle-half';\r\n default: return 'bi-circle-half';\r\n }\r\n }\r\n\r\n getThemeLabel(): string {\r\n const theme = this._theme();\r\n switch (theme) {\r\n case 'light': return 'Light Mode';\r\n case 'dark': return 'Dark Mode';\r\n case 'auto': return 'Auto Mode';\r\n default: return 'Auto Mode';\r\n }\r\n }\r\n}","import { Injectable, inject } from '@angular/core';\nimport { Observable, BehaviorSubject } from 'rxjs';\nimport { ApiService } from './api';\nimport { AuthService } from './auth';\nimport { \n User, \n UserCreateRequest, \n UserProfileUpdateRequest,\n PasswordChangeRequest,\n EmailChangeRequest,\n PaginatedResponse,\n UserResponse,\n AdminPasswordResetRequest,\n PasswordChangeResponse\n} from '../models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class UserManagementService {\n private apiService = inject(ApiService);\n private authService = inject(AuthService);\n\n private usersSubject = new BehaviorSubject<User[]>([]);\n public users$ = this.usersSubject.asObservable();\n\n private totalUsersSubject = new BehaviorSubject<number>(0);\n public totalUsers$ = this.totalUsersSubject.asObservable();\n\n constructor() { }\n\n getUserProfile(): Observable<{user: User}> {\n return this.apiService.getUserProfile();\n }\n\n updateProfile(profileData: UserProfileUpdateRequest): Observable<UserResponse> {\n return this.apiService.updateProfile(profileData);\n }\n\n changePassword(passwordData: PasswordChangeRequest): Observable<{message: string}> {\n return this.apiService.changePassword(passwordData);\n }\n\n requestEmailChange(emailData: EmailChangeRequest): Observable<{message: string; new_email: string}> {\n return this.apiService.requestEmailChange(emailData);\n }\n\n getUsers(params?: {\n isStaff?: boolean;\n isActive?: boolean;\n search?: string;\n limit?: number;\n offset?: number;\n }): Observable<PaginatedResponse<User>> {\n return this.apiService.getUsers(params);\n }\n\n getUser(id: number): Observable<User> {\n return this.apiService.getUser(id);\n }\n\n createUser(userData: UserCreateRequest): Observable<UserResponse> {\n return this.apiService.createUser(userData);\n }\n\n updateUser(id: number, userData: Partial<User>): Observable<User> {\n return this.apiService.updateUser(id, userData);\n }\n\n deleteUser(id: number): Observable<void> {\n return this.apiService.deleteUser(id);\n }\n\n resetUserPassword(userId: number, passwordData: AdminPasswordResetRequest): Observable<PasswordChangeResponse> {\n return this.apiService.resetUserPassword(userId, passwordData);\n }\n\n getUserDisplayName(user: User | null): string {\n if (!user) return '';\n \n if (user.firstName || user.lastName) {\n return `${user.firstName} ${user.lastName}`.trim();\n }\n \n return user.username || user.email || 'User';\n }\n\n formatDate(dateString?: string): string {\n return dateString ? new Date(dateString).toLocaleDateString() : 'Never';\n }\n\n isCurrentUserAdmin(): boolean {\n const user = this.authService.getCurrentUser();\n return user?.isStaff || false;\n }\n\n isCurrentUserSuperuser(): boolean {\n const user = this.authService.getCurrentUser();\n return user?.isSuperuser || false;\n }\n\n updateUsersState(users: User[], total: number): void {\n this.usersSubject.next(users);\n this.totalUsersSubject.next(total);\n }\n\n getCurrentUsers(): User[] {\n return this.usersSubject.getValue();\n }\n\n getCurrentTotalUsers(): number {\n return this.totalUsersSubject.getValue();\n }\n}","import { Injectable, signal, computed, inject, InjectionToken, Optional } from '@angular/core';\r\nimport { BehaviorSubject, Subject, Observable, timer, EMPTY } from 'rxjs';\r\nimport { takeUntil, switchMap, retry, tap } from 'rxjs/operators';\r\nimport { AuthService, CUPCAKE_CORE_CONFIG } from './auth';\r\n\r\nexport const WEBSOCKET_ENDPOINT = new InjectionToken<string>('WEBSOCKET_ENDPOINT', {\r\n providedIn: 'root',\r\n factory: () => 'notifications'\r\n});\r\n\r\nexport interface WebSocketMessage {\r\n type: string;\r\n message?: string;\r\n timestamp?: string;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface WebSocketConfig {\r\n url: string;\r\n endpoint?: string;\r\n protocols?: string[];\r\n reconnectInterval?: number;\r\n maxReconnectAttempts?: number;\r\n pingInterval?: number;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WebSocketService {\r\n protected ws: WebSocket | null = null;\r\n protected config: WebSocketConfig;\r\n protected destroy$ = new Subject<void>();\r\n protected reconnectAttempts = 0;\r\n protected isConnecting = false;\r\n\r\n protected connectionState = signal<'disconnected' | 'connecting' | 'connected' | 'error'>('disconnected');\r\n protected lastError = signal<string | null>(null);\r\n\r\n protected messageSubject = new Subject<WebSocketMessage>();\r\n protected connectionSubject = new BehaviorSubject<boolean>(false);\r\n\r\n readonly messages$ = this.messageSubject.asObservable();\r\n readonly isConnected$ = this.connectionSubject.asObservable();\r\n readonly connectionState$ = computed(() => this.connectionState());\r\n readonly lastError$ = computed(() => this.lastError());\r\n\r\n protected config_token = inject(CUPCAKE_CORE_CONFIG);\r\n protected endpoint = inject(WEBSOCKET_ENDPOINT, { optional: true }) || 'notifications';\r\n\r\n constructor(protected authService: AuthService) {\r\n this.config = {\r\n url: this.getWebSocketUrl(),\r\n endpoint: this.endpoint,\r\n reconnectInterval: this.getAdaptiveReconnectInterval(),\r\n maxReconnectAttempts: 3\r\n };\r\n\r\n this.authService.isAuthenticated$.subscribe(isAuthenticated => {\r\n if (!isAuthenticated && this.ws) {\r\n console.log('User logged out - disconnecting WebSocket');\r\n this.disconnect();\r\n }\r\n });\r\n\r\n this.setupBrowserResourceHandling();\r\n }\r\n\r\n protected getWebSocketUrl(): string {\r\n const apiUrl = this.config_token.apiUrl;\r\n\r\n try {\r\n const url = new URL(apiUrl);\r\n const protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\r\n const host = url.host;\r\n const endpoint = this.config?.endpoint || 'notifications';\r\n\r\n return `${protocol}//${host}/ws/${endpoint}/`;\r\n } catch (error) {\r\n console.error('Invalid API URL in cupcake config:', apiUrl);\r\n\r\n const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\r\n const host = window.location.host;\r\n const endpoint = this.config?.endpoint || 'notifications';\r\n return `${protocol}//${host}/ws/${endpoint}/`;\r\n }\r\n }\r\n\r\n connect(): void {\r\n console.log('🔌 WebSocket connect() called');\r\n console.log('🔌 Current connection state:', this.connectionState());\r\n console.log('🔌 WebSocket URL:', this.config.url);\r\n\r\n if (this.isConnecting) {\r\n console.log('WebSocket connection already in progress');\r\n return;\r\n }\r\n\r\n if (this.ws?.readyState === WebSocket.OPEN) {\r\n console.log('WebSocket already connected');\r\n return;\r\n }\r\n\r\n if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {\r\n console.log('Closing existing WebSocket connection');\r\n this.ws.close();\r\n this.ws = null;\r\n }\r\n\r\n const token = this.authService.getAccessToken();\r\n if (!token) {\r\n console.error('❌ Cannot connect WebSocket - no authentication token');\r\n this.lastError.set('Authentication required');\r\n this.connectionState.set('error');\r\n return;\r\n }\r\n\r\n this.isConnecting = true;\r\n this.connectionState.set('connecting');\r\n this.lastError.set(null);\r\n\r\n try {\r\n const wsUrl = `${this.config.url}?token=${encodeURIComponent(token)}`;\r\n console.log('Connecting to WebSocket:', wsUrl.replace(token, '[TOKEN_HIDDEN]'));\r\n\r\n this.ws = new WebSocket(wsUrl);\r\n\r\n this.ws.onopen = this.onOpen.bind(this);\r\n this.ws.onmessage = this.onMessage.bind(this);\r\n this.ws.onerror = this.onError.bind(this);\r\n this.ws.onclose = this.onClose.bind(this);\r\n\r\n const connectionTimeout = setTimeout(() => {\r\n if (this.ws?.readyState === WebSocket.CONNECTING) {\r\n console.warn('WebSocket connection timeout - closing');\r\n this.ws.close();\r\n this.lastError.set('Connection timeout');\r\n this.connectionState.set('error');\r\n this.isConnecting = false;\r\n }\r\n }, 10000);\r\n\r\n this.ws.onopen = (event) => {\r\n clearTimeout(connectionTimeout);\r\n this.onOpen(event);\r\n };\r\n\r\n } catch (error) {\r\n console.error('WebSocket connection error:', error);\r\n this.connectionState.set('error');\r\n this.lastError.set('Connection failed');\r\n this.isConnecting = false;\r\n }\r\n }\r\n\r\n disconnect(): void {\r\n this.destroy$.next();\r\n this.isConnecting = false;\r\n\r\n if (this.ws) {\r\n this.ws.close(1000, 'User disconnected');\r\n this.ws = null;\r\n }\r\n\r\n this.connectionState.set('disconnected');\r\n this.connectionSubject.next(false);\r\n this.reconnectAttempts = 0;\r\n }\r\n\r\n send(message: any): void {\r\n if (this.ws?.readyState === WebSocket.OPEN) {\r\n this.ws.send(JSON.stringify(message));\r\n } else {\r\n console.warn('WebSocket not connected, cannot send message:', message);\r\n }\r\n }\r\n\r\n subscribe(subscriptionType: string, options: any = {}): void {\r\n this.send({\r\n type: 'subscribe',\r\n subscription_type: subscriptionType,\r\n ...options\r\n });\r\n }\r\n\r\n protected onOpen(event: Event): void {\r\n console.log('WebSocket connected');\r\n this.isConnecting = false;\r\n this.connectionState.set('connected');\r\n this.connectionSubject.next(true);\r\n this.reconnectAttempts = 0;\r\n this.lastError.set(null);\r\n }\r\n\r\n protected onMessage(event: MessageEvent): void {\r\n try {\r\n const data: WebSocketMessage = JSON.parse(event.data);\r\n console.log('WebSocket message received:', data);\r\n this.messageSubject.next(data);\r\n } catch (error) {\r\n console.error('Error parsing WebSocket message:', error);\r\n }\r\n }\r\n\r\n protected onError(event: Event): void {\r\n console.error('WebSocket error:', event);\r\n this.isConnecting = false;\r\n this.connectionState.set('error');\r\n this.lastError.set('Connection error occurred');\r\n }\r\n\r\n protected onClose(event: CloseEvent): void {\r\n console.log(`WebSocket closed: ${event.code} ${event.reason}`);\r\n this.isConnecting = false;\r\n this.connectionState.set('disconnected');\r\n this.connectionSubject.next(false);\r\n\r\n if (event.code === 4001) {\r\n this.lastError.set('Authentication failed');\r\n console.error('WebSocket authentication failed');\r\n return;\r\n } else if (event.code === 4003) {\r\n this.lastError.set('Insufficient permissions');\r\n console.error('WebSocket permission denied');\r\n return;\r\n }\r\n\r\n if (event.code !== 1000 && this.reconnectAttempts < (this.config.maxReconnectAttempts || 5)) {\r\n this.attemptReconnection();\r\n }\r\n }\r\n\r\n protected attemptReconnection(): void {\r\n this.reconnectAttempts++;\r\n const delay = this.config.reconnectInterval || 5000;\r\n\r\n console.log(`WebSocket reconnection attempt ${this.reconnectAttempts} in ${delay}ms`);\r\n\r\n timer(delay).pipe(\r\n takeUntil(this.destroy$),\r\n tap(() => {\r\n if (this.reconnectAttempts <= (this.config.maxReconnectAttempts || 5)) {\r\n this.connect();\r\n } else {\r\n console.error('Max WebSocket reconnection attempts reached');\r\n this.lastError.set('Connection failed - max attempts reached');\r\n }\r\n })\r\n ).subscribe();\r\n }\r\n\r\n filterMessages<T extends WebSocketMessage>(type: string): Observable<T> {\r\n return this.messages$.pipe(\r\n tap(msg => console.log('Filtering message:', msg.type, 'looking for:', type)),\r\n switchMap(message => message.type === type ? [message as T] : EMPTY)\r\n );\r\n }\r\n\r\n getNotifications(): Observable<WebSocketMessage> {\r\n return this.filterMessages('notification');\r\n }\r\n\r\n getSystemNotifications(): Observable<WebSocketMessage> {\r\n return this.filterMessages('system.notification');\r\n }\r\n\r\n reconnectWithNewToken(): void {\r\n if (this.ws?.readyState === WebSocket.OPEN) {\r\n console.log('Reconnecting WebSocket with new token');\r\n this.disconnect();\r\n setTimeout(() => this.connect(), 100);\r\n }\r\n }\r\n\r\n shouldConnect(): boolean {\r\n return this.authService.isAuthenticated() && !!this.authService.getAccessToken();\r\n }\r\n\r\n updateConfig(): void {\r\n this.config.url = this.getWebSocketUrl();\r\n console.log('WebSocket URL updated to:', this.config.url);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.disconnect();\r\n }\r\n\r\n protected getAdaptiveReconnectInterval(): number {\r\n const baseInterval = 5000;\r\n const tabCount = this.estimateTabCount();\r\n\r\n if (tabCount > 20) {\r\n return baseInterval * 3;\r\n } else if (tabCount > 10) {\r\n return baseInterval * 2;\r\n }\r\n\r\n return baseInterval;\r\n }\r\n\r\n protected estimateTabCount(): number {\r\n try {\r\n if ('memory' in performance) {\r\n const memory = (performance as any).memory;\r\n const usedMB = memory.usedJSHeapSize / (1024 * 1024);\r\n\r\n if (usedMB > 500) return 25;\r\n if (usedMB > 300) return 15;\r\n if (usedMB > 150) return 10;\r\n return 5;\r\n }\r\n\r\n return 10;\r\n } catch (error) {\r\n return 10;\r\n }\r\n }\r\n\r\n protected canConnectSafely(): boolean {\r\n try {\r\n if ('memory' in performance) {\r\n const memory = (performance as any).memory;\r\n const usedMB = memory.usedJSHeapSize / (1024 * 1024);\r\n const totalMB = memory.totalJSHeapSize / (1024 * 1024);\r\n\r\n const memoryUsageRatio = usedMB / totalMB;\r\n if (memoryUsageRatio > 0.9) {\r\n console.warn('High memory usage detected, delaying WebSocket connection');\r\n return false;\r\n }\r\n }\r\n\r\n const tabCount = this.estimateTabCount();\r\n if (tabCount > 30) {\r\n console.warn('Too many tabs detected, may affect WebSocket reliability');\r\n return false;\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n return true;\r\n }\r\n }\r\n\r\n protected setupBrowserResourceHandling(): void {\r\n document.addEventListener('visibilitychange', () => {\r\n if (document.visibilityState === 'visible') {\r\n if (this.shouldConnect() && this.connectionState() === 'disconnected') {\r\n console.log('Tab became active - attempting WebSocket reconnection');\r\n setTimeout(() => this.connect(), 1000);\r\n }\r\n } else {\r\n const tabCount = this.estimateTabCount();\r\n if (tabCount > 15 && this.ws?.readyState === WebSocket.OPEN) {\r\n console.log('Tab inactive with high tab count - maintaining connection with reduced activity');\r\n }\r\n }\r\n });\r\n\r\n window.addEventListener('beforeunload', () => {\r\n if (this.ws) {\r\n this.ws.close(1000, 'Page unloading');\r\n }\r\n });\r\n }\r\n}","import { Injectable, InjectionToken } from '@angular/core';\r\n\r\nexport interface WebSocketEndpointConfig {\r\n app: string;\r\n endpoint: string;\r\n description?: string;\r\n}\r\n\r\nexport const WEBSOCKET_ENDPOINTS = new InjectionToken<WebSocketEndpointConfig[]>('WEBSOCKET_ENDPOINTS');\r\n\r\nexport class WebSocketEndpoints {\r\n static readonly CORE_NOTIFICATIONS = 'notifications';\r\n static readonly CORE_ADMIN = 'admin';\r\n static readonly CCV_NOTIFICATIONS = 'ccv/notifications';\r\n static readonly CCV_ADMIN = 'ccv/admin';\r\n static readonly CCM_NOTIFICATIONS = 'ccm/notifications';\r\n static readonly CCRV_NOTIFICATIONS = 'ccrv/notifications';\r\n static readonly CCSC_NOTIFICATIONS = 'ccsc/notifications';\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WebSocketConfigService {\r\n private readonly endpoints: Map<string, WebSocketEndpointConfig> = new Map();\r\n\r\n constructor() {\r\n this.registerDefaultEndpoints();\r\n }\r\n\r\n private registerDefaultEndpoints(): void {\r\n this.registerEndpoint({\r\n app: 'core',\r\n endpoint: WebSocketEndpoints.CORE_NOTIFICATIONS,\r\n description: 'Core notification endpoint'\r\n });\r\n\r\n this.registerEndpoint({\r\n app: 'core',\r\n endpoint: WebSocketEndpoints.CORE_ADMIN,\r\n description: 'Core admin notification endpoint'\r\n });\r\n\r\n this.registerEndpoint({\r\n app: 'ccv',\r\n endpoint: WebSocketEndpoints.CCV_NOTIFICATIONS,\r\n description: 'CCV notification endpoint'\r\n });\r\n\r\n this.registerEndpoint({\r\n app: 'ccv',\r\n endpoint: WebSocketEndpoints.CCV_ADMIN,\r\n description: 'CCV admin notification endpoint'\r\n });\r\n\r\n this.registerEndpoint({\r\n app: 'ccm',\r\n endpoint: WebSocketEndpoints.CCM_NOTIFICATIONS,\r\n description: 'CCM notification endpoint'\r\n });\r\n\r\n this.registerEndpoint({\r\n app: 'ccrv',\r\n endpoint: WebSocketEndpoints.CCRV_NOTIFICATIONS,\r\n description: 'CCRV notification endpoint'\r\n });\r\n\r\n this.registerEndpoint({\r\n app: 'ccsc',\r\n endpoint: WebSocketEndpoints.CCSC_NOTIFICATIONS,\r\n description: 'CCSC notification endpoint'\r\n });\r\n }\r\n\r\n registerEndpoint(config: WebSocketEndpointConfig): void {\r\n this.endpoints.set(config.endpoint, config);\r\n }\r\n\r\n getEndpoint(endpoint: string): WebSocketEndpointConfig | undefined {\r\n return this.endpoints.get(endpoint);\r\n }\r\n\r\n getEndpointsForApp(app: string): WebSocketEndpointConfig[] {\r\n return Array.from(this.endpoints.values()).filter(config => config.app === app);\r\n }\r\n\r\n getAllEndpoints(): WebSocketEndpointConfig[] {\r\n return Array.from(this.endpoints.values());\r\n }\r\n\r\n validateEndpoint(endpoint: string): boolean {\r\n return this.endpoints.has(endpoint);\r\n }\r\n\r\n getDefaultEndpointForApp(app: string): string {\r\n const endpoints = this.getEndpointsForApp(app);\r\n if (endpoints.length === 0) {\r\n return WebSocketEndpoints.CORE_NOTIFICATIONS;\r\n }\r\n\r\n const notificationEndpoint = endpoints.find(e => e.endpoint.includes('notifications'));\r\n return notificationEndpoint?.endpoint || endpoints[0].endpoint;\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { HttpParams } from '@angular/common/http';\r\nimport { BaseApiService } from './base-api';\r\n\r\nimport {\r\n LabGroup,\r\n LabGroupCreateRequest,\r\n LabGroupQueryResponse,\r\n LabGroupInvitation,\r\n LabGroupInvitationQueryResponse,\r\n LabGroupInvitationCreateRequest,\r\n LabGroupMember,\r\n LabGroupPermission,\r\n LabGroupPermissionCreateRequest,\r\n LabGroupPermissionUpdateRequest,\r\n LabGroupPermissionQueryResponse\r\n} from '../models';\r\n\r\nexport interface LabGroupQueryParams {\r\n search?: string;\r\n parentGroup?: number;\r\n parentGroup__isnull?: string;\r\n limit?: number;\r\n offset?: number;\r\n}\r\n\r\nexport interface LabGroupInvitationQueryParams {\r\n labGroup?: number;\r\n status?: string;\r\n limit?: number;\r\n offset?: number;\r\n}\r\n\r\nexport interface LabGroupPermissionQueryParams {\r\n labGroup?: number;\r\n user?: number;\r\n canView?: boolean;\r\n canInvite?: boolean;\r\n canManage?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LabGroupService extends BaseApiService {\r\n\r\n // LAB GROUPS\r\n getLabGroups(params?: LabGroupQueryParams): Observable<LabGroupQueryResponse> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<LabGroupQueryResponse>(`${this.apiUrl}/lab-groups/`, { params: httpParams });\r\n }\r\n\r\n getMyLabGroups(params?: LabGroupQueryParams): Observable<LabGroupQueryResponse> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<LabGroupQueryResponse>(`${this.apiUrl}/lab-groups/my_groups/`, { params: httpParams });\r\n }\r\n\r\n createLabGroup(labGroup: LabGroupCreateRequest): Observable<LabGroup> {\r\n return this.post<LabGroup>(`${this.apiUrl}/lab-groups/`, labGroup);\r\n }\r\n\r\n updateLabGroup(id: number, labGroup: Partial<LabGroup>): Observable<LabGroup> {\r\n return this.patch<LabGroup>(`${this.apiUrl}/lab-groups/${id}/`, labGroup);\r\n }\r\n\r\n deleteLabGroup(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/lab-groups/${id}/`);\r\n }\r\n\r\n getLabGroupMembers(id: number, params?: { directOnly?: boolean; pageSize?: number; limit?: number; offset?: number }): Observable<{count: number; next: string | null; previous: string | null; results: LabGroupMember[]}> {\r\n const httpParams = this.buildHttpParams({\r\n direct_only: params?.directOnly?.toString(),\r\n page_size: params?.pageSize?.toString(),\r\n limit: params?.limit?.toString(),\r\n offset: params?.offset?.toString()\r\n });\r\n return this.get<{count: number; next: string | null; previous: string | null; results: LabGroupMember[]}>(`${this.apiUrl}/lab-groups/${id}/members/`, { params: httpParams });\r\n }\r\n\r\n inviteUserToLabGroup(id: number, invitation: LabGroupInvitationCreateRequest): Observable<LabGroupInvitation> {\r\n return this.post<LabGroupInvitation>(`${this.apiUrl}/lab-groups/${id}/invite_user/`, invitation);\r\n }\r\n\r\n leaveLabGroup(id: number): Observable<{message: string}> {\r\n return this.post<{message: string}>(`${this.apiUrl}/lab-groups/${id}/leave/`, {});\r\n }\r\n\r\n removeMemberFromLabGroup(id: number, userId: number): Observable<{message: string}> {\r\n return this.post<{message: string}>(`${this.apiUrl}/lab-groups/${id}/remove_member/`, { userId });\r\n }\r\n\r\n getRootLabGroups(params?: Omit<LabGroupQueryParams, 'parentGroup'>): Observable<LabGroupQueryResponse> {\r\n const httpParams = this.buildHttpParams({ ...params, parentGroup__isnull: 'true' });\r\n return this.get<LabGroupQueryResponse>(`${this.apiUrl}/lab-groups/`, { params: httpParams });\r\n }\r\n\r\n getSubGroups(parentGroupId: number, params?: Omit<LabGroupQueryParams, 'parentGroup'>): Observable<LabGroupQueryResponse> {\r\n return this.getLabGroups({ ...params, parentGroup: parentGroupId });\r\n }\r\n\r\n // LAB GROUP INVITATIONS\r\n getLabGroupInvitations(params?: LabGroupInvitationQueryParams): Observable<LabGroupInvitationQueryResponse> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<LabGroupInvitationQueryResponse>(`${this.apiUrl}/lab-group-invitations/`, { params: httpParams });\r\n }\r\n\r\n getMyPendingInvitations(): Observable<LabGroupInvitation[]> {\r\n return this.get<LabGroupInvitation[]>(`${this.apiUrl}/lab-group-invitations/my_pending_invitations/`);\r\n }\r\n\r\n acceptLabGroupInvitation(id: number): Observable<{message: string, invitation: LabGroupInvitation}> {\r\n return this.post<{message: string, invitation: LabGroupInvitation}>(`${this.apiUrl}/lab-group-invitations/${id}/accept_invitation/`, {});\r\n }\r\n\r\n rejectLabGroupInvitation(id: number): Observable<{message: string, invitation: LabGroupInvitation}> {\r\n return this.post<{message: string, invitation: LabGroupInvitation}>(`${this.apiUrl}/lab-group-invitations/${id}/reject_invitation/`, {});\r\n }\r\n\r\n cancelLabGroupInvitation(id: number): Observable<{message: string}> {\r\n return this.post<{message: string}>(`${this.apiUrl}/lab-group-invitations/${id}/cancel_invitation/`, {});\r\n }\r\n\r\n // LAB GROUP PERMISSIONS\r\n getLabGroupPermissions(params?: LabGroupPermissionQueryParams): Observable<LabGroupPermissionQueryResponse> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<LabGroupPermissionQueryResponse>(`${this.apiUrl}/lab-group-permissions/`, { params: httpParams });\r\n }\r\n\r\n getLabGroupPermission(id: number): Observable<LabGroupPermission> {\r\n return this.get<LabGroupPermission>(`${this.apiUrl}/lab-group-permissions/${id}/`);\r\n }\r\n\r\n createLabGroupPermission(permission: LabGroupPermissionCreateRequest): Observable<LabGroupPermission> {\r\n return this.post<LabGroupPermission>(`${this.apiUrl}/lab-group-permissions/`, permission);\r\n }\r\n\r\n updateLabGroupPermission(id: number, permission: LabGroupPermissionUpdateRequest): Observable<LabGroupPermission> {\r\n return this.patch<LabGroupPermission>(`${this.apiUrl}/lab-group-permissions/${id}/`, permission);\r\n }\r\n\r\n deleteLabGroupPermission(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/lab-group-permissions/${id}/`);\r\n }\r\n\r\n getLabGroupPermissionsForLabGroup(labGroupId: number): Observable<LabGroupPermissionQueryResponse> {\r\n return this.getLabGroupPermissions({ labGroup: labGroupId });\r\n }\r\n\r\n getLabGroupPermissionsForUser(userId: number): Observable<LabGroupPermissionQueryResponse> {\r\n return this.getLabGroupPermissions({ user: userId });\r\n }\r\n}","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { AuthService } from '../services/auth';\nimport { map, take } from 'rxjs';\n\n/**\n * Extract original return URL to prevent accumulating login URLs\n */\nfunction getCleanReturnUrl(currentUrl: string): string {\n try {\n const url = new URL(currentUrl, window.location.origin);\n\n if (url.pathname === '/login') {\n const innerReturnUrl = url.searchParams.get('returnUrl');\n if (innerReturnUrl) {\n return getCleanReturnUrl(innerReturnUrl);\n }\n return '/';\n }\n\n return url.pathname + url.search;\n } catch (error) {\n if (currentUrl.startsWith('/login')) {\n const urlParams = new URLSearchParams(currentUrl.split('?')[1]);\n const innerReturnUrl = urlParams.get('returnUrl');\n if (innerReturnUrl) {\n return getCleanReturnUrl(innerReturnUrl);\n }\n return '/';\n }\n return currentUrl;\n }\n}\n\nexport const authGuard: CanActivateFn = (route, state) => {\n const authService = inject(AuthService);\n const router = inject(Router);\n\n return authService.isAuthenticated$.pipe(\n take(1),\n map(isAuthenticated => {\n if (isAuthenticated) {\n return true;\n }\n\n const cleanReturnUrl = getCleanReturnUrl(state.url);\n\n router.navigate(['/login'], {\n queryParams: { returnUrl: cleanReturnUrl }\n });\n\n return false;\n })\n );\n};\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { AuthService } from '../services/auth';\n\n/**\n * Extract original return URL to prevent accumulating login URLs\n */\nfunction getCleanReturnUrl(currentUrl: string): string {\n try {\n const url = new URL(currentUrl, window.location.origin);\n\n // If current URL is already a login page, extract its returnUrl\n if (url.pathname === '/login') {\n const innerReturnUrl = url.searchParams.get('returnUrl');\n if (innerReturnUrl) {\n // Recursively clean in case of nested login URLs\n return getCleanReturnUrl(innerReturnUrl);\n }\n // If no returnUrl in login URL, use home page\n return '/';\n }\n\n // Return clean URL without origin\n return url.pathname + url.search;\n } catch (error) {\n // Fallback for relative URLs\n if (currentUrl.startsWith('/login')) {\n const urlParams = new URLSearchParams(currentUrl.split('?')[1]);\n const innerReturnUrl = urlParams.get('returnUrl');\n if (innerReturnUrl) {\n return getCleanReturnUrl(innerReturnUrl);\n }\n return '/';\n }\n return currentUrl;\n }\n}\n\nexport const adminGuard: CanActivateFn = (route, state) => {\n const authService = inject(AuthService);\n const router = inject(Router);\n\n const user = authService.getCurrentUser();\n\n if (!user) {\n // Clean the return URL to prevent login URL accumulation\n const cleanReturnUrl = getCleanReturnUrl(state.url);\n\n router.navigate(['/login'], {\n queryParams: { returnUrl: cleanReturnUrl }\n });\n return false;\n }\n\n if (!user.isStaff) {\n router.navigate(['/metadata']);\n return false;\n }\n\n return true;\n};\n","import { Component, inject, OnInit, signal, computed } from '@angular/core';\nimport { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { Router, ActivatedRoute } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { NgbAlert } from '@ng-bootstrap/ng-bootstrap';\nimport { AuthService } from '../../../services/auth';\nimport { SiteConfigService } from '../../../services/site-config';\nimport { ApiService } from '../../../services/api';\nimport { AuthConfig, RegistrationStatus } from '../../../models';\n\n@Component({\n selector: 'ccc-login',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbAlert],\n templateUrl: './login.html',\n styleUrl: './login.scss'\n})\nexport class LoginComponent implements OnInit {\n private authService = inject(AuthService);\n private fb = inject(FormBuilder);\n private router = inject(Router);\n private route = inject(ActivatedRoute);\n private siteConfigService = inject(SiteConfigService);\n private apiService = inject(ApiService);\n\n loginForm: FormGroup;\n loading = signal(false);\n error = signal<string | null>(null);\n success = signal<string | null>(null);\n\n siteConfig$ = this.siteConfigService.config$;\n\n authConfig = signal<AuthConfig | null>(null);\n registrationStatus = signal<RegistrationStatus | null>(null);\n\n constructor() {\n this.loginForm = this.fb.group({\n username: ['', [Validators.required]],\n password: ['', [Validators.required]]\n });\n }\n\n private returnUrl: string = '/';\n\n ngOnInit() {\n this.loadAuthConfig();\n\n this.route.queryParams.subscribe(params => {\n this.returnUrl = this.cleanReturnUrl(params['returnUrl']) || '/';\n\n if (params['code'] && params['state']) {\n this.handleORCIDCallback(params['code'], params['state']);\n } else if (params['error']) {\n this.error.set(`ORCID authentication failed: ${params['error']}`);\n }\n\n if (params['registered'] === 'true') {\n this.success.set('Registration successful! You can now log in with your credentials.');\n if (params['username']) {\n this.loginForm.patchValue({ username: params['username'] });\n }\n }\n });\n\n this.authService.isAuthenticated$.subscribe(isAuthenticated => {\n if (isAuthenticated) {\n this.router.navigate([this.returnUrl]);\n }\n });\n }\n\n /**\n * Clean return URL to prevent accumulating login URLs\n */\n private cleanReturnUrl(returnUrl: string | null): string | null {\n if (!returnUrl) return null;\n\n try {\n const url = new URL(returnUrl, window.location.origin);\n\n if (url.pathname === '/login') {\n const innerReturnUrl = url.searchParams.get('returnUrl');\n if (innerReturnUrl) {\n return this.cleanReturnUrl(innerReturnUrl);\n }\n return '/';\n }\n\n return url.pathname + url.search;\n } catch (error) {\n if (returnUrl.startsWith('/login')) {\n const urlParams = new URLSearchParams(returnUrl.split('?')[1]);\n const innerReturnUrl = urlParams.get('returnUrl');\n if (innerReturnUrl) {\n return this.cleanReturnUrl(innerReturnUrl);\n }\n return '/';\n }\n return returnUrl;\n }\n }\n\n /**\n * Load authentication configuration to determine available login options\n */\n private loadAuthConfig(): void {\n this.apiService.getAuthConfig().subscribe({\n next: (config) => {\n this.authConfig.set(config);\n },\n error: (error) => {\n console.warn('Could not load auth config:', error);\n this.authConfig.set({\n registrationEnabled: false,\n orcidLoginEnabled: false,\n regularLoginEnabled: true\n });\n }\n });\n\n this.apiService.getRegistrationStatus().subscribe({\n next: (status) => {\n this.registrationStatus.set(status);\n },\n error: (error) => {\n console.warn('Could not load registration status:', error);\n }\n });\n }\n\n /**\n * Handle traditional username/password login\n */\n onSubmit() {\n if (this.loginForm.valid) {\n this.loading.set(true);\n this.error.set(null);\n\n const { username, password } = this.loginForm.value;\n\n this.authService.login(username, password).subscribe({\n next: (response) => {\n this.success.set('Login successful!');\n setTimeout(() => {\n this.router.navigate([this.returnUrl]);\n }, 1000);\n },\n error: (error) => {\n this.loading.set(false);\n this.error.set(error.error?.detail || 'Login failed. Please check your credentials.');\n }\n });\n }\n }\n\n /**\n * Initiate ORCID OAuth login\n */\n loginWithORCID() {\n this.loading.set(true);\n this.error.set(null);\n\n this.authService.initiateORCIDLogin().subscribe({\n next: (response) => {\n sessionStorage.setItem('orcid_state', response.state);\n window.location.href = response.authorizationUrl;\n },\n error: (error) => {\n this.loading.set(false);\n this.error.set(error.error?.error || 'Failed to initiate ORCID login.');\n }\n });\n }\n\n /**\n * Handle ORCID OAuth callback\n */\n private handleORCIDCallback(code: string, state: string) {\n this.loading.set(true);\n this.error.set(null);\n\n const storedState = sessionStorage.getItem('orcid_state');\n if (storedState !== state) {\n this.error.set('Invalid state parameter. Possible security issue.');\n this.loading.set(false);\n return;\n }\n\n sessionStorage.removeItem('orcid_state');\n\n this.authService.handleORCIDCallback(code, state).subscribe({\n next: (response) => {\n this.success.set(`Welcome, ${response.user.firstName || response.user.username}!`);\n setTimeout(() => {\n this.router.navigate([this.returnUrl]);\n }, 1000);\n },\n error: (error) => {\n this.loading.set(false);\n this.error.set(error.error?.error || 'ORCID authentication failed.');\n }\n });\n }\n\n /**\n * Clear error message\n */\n clearError() {\n this.error.set(null);\n }\n\n /**\n * Clear success message\n */\n clearSuccess() {\n this.success.set(null);\n }\n\n /**\n * Computed signals for UI display logic\n */\n shouldShowOrcidLogin = computed(() => this.authConfig()?.orcidLoginEnabled === true);\n shouldShowRegistration = computed(() => this.registrationStatus()?.registrationEnabled === true);\n shouldShowRegularLogin = computed(() => this.authConfig()?.regularLoginEnabled !== false);\n registrationMessage = computed(() => this.registrationStatus()?.message || 'Registration is currently enabled');\n\n /**\n * Navigate to registration page\n */\n goToRegister() {\n this.router.navigate(['/register'], {\n queryParams: { returnUrl: this.returnUrl }\n });\n }\n}\n","<div class=\"container\">\r\n <div class=\"login-wrapper\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n @if (siteConfig$ | async; as config) {\r\n <h3 class=\"card-title text-center mb-4\">\r\n <i class=\"bi bi-flask me-2\"></i>{{ config.siteName }}\r\n </h3>\r\n }\r\n\r\n <!-- Success Alert -->\r\n @if (success()) {\r\n <ngb-alert type=\"success\" (closed)=\"clearSuccess()\" [dismissible]=\"true\">\r\n {{ success() }}\r\n </ngb-alert>\r\n }\r\n\r\n <!-- Error Alert -->\r\n @if (error()) {\r\n <ngb-alert type=\"danger\" (closed)=\"clearError()\" [dismissible]=\"true\">\r\n {{ error() }}\r\n </ngb-alert>\r\n }\r\n\r\n <!-- ORCID Login Section -->\r\n @if (shouldShowOrcidLogin()) {\r\n <div class=\"mb-4\">\r\n <button \r\n type=\"button\" \r\n class=\"btn btn-primary w-100 mb-3\"\r\n [disabled]=\"loading()\"\r\n (click)=\"loginWithORCID()\">\r\n @if (loading()) {\r\n <span class=\"spinner-border spinner-border-sm me-2\" aria-hidden=\"true\"></span>\r\n }\r\n <i class=\"bi bi-person-badge me-2\"></i>\r\n Login with ORCID\r\n </button>\r\n <p class=\"text-muted text-center small\">\r\n Sign in with your ORCID account for seamless access\r\n </p>\r\n </div>\r\n }\r\n\r\n <!-- Divider -->\r\n @if (shouldShowOrcidLogin() && shouldShowRegularLogin()) {\r\n <div class=\"text-center mb-4\">\r\n <span class=\"text-muted\">or</span>\r\n </div>\r\n }\r\n\r\n <!-- Traditional Login Form -->\r\n @if (shouldShowRegularLogin()) {\r\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onSubmit()\">\r\n <div class=\"mb-3\">\r\n <label for=\"username\" class=\"form-label\">Username</label>\r\n <div class=\"input-group\">\r\n <span class=\"input-group-text\">\r\n <i class=\"bi bi-person\"></i>\r\n </span>\r\n <input \r\n type=\"text\" \r\n class=\"form-control\" \r\n id=\"username\"\r\n formControlName=\"username\"\r\n [class.is-invalid]=\"loginForm.get('username')?.invalid && loginForm.get('username')?.touched\"\r\n placeholder=\"Enter your username\">\r\n </div>\r\n @if (loginForm.get('username')?.invalid && loginForm.get('username')?.touched) {\r\n <div class=\"invalid-feedback d-block\">\r\n Username is required\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label for=\"password\" class=\"form-label\">Password</label>\r\n <div class=\"input-group\">\r\n <span class=\"input-group-text\">\r\n <i class=\"bi bi-lock\"></i>\r\n </span>\r\n <input \r\n type=\"password\" \r\n class=\"form-control\" \r\n id=\"password\"\r\n formControlName=\"password\"\r\n [class.is-invalid]=\"loginForm.get('password')?.invalid && loginForm.get('password')?.touched\"\r\n placeholder=\"Enter your password\">\r\n </div>\r\n @if (loginForm.get('password')?.invalid && loginForm.get('password')?.touched) {\r\n <div class=\"invalid-feedback d-block\">\r\n Password is required\r\n </div>\r\n }\r\n </div>\r\n\r\n <button \r\n type=\"submit\" \r\n class=\"btn btn-outline-primary w-100\"\r\n [disabled]=\"loginForm.invalid || loading()\">\r\n @if (loading()) {\r\n <span class=\"spinner-border spinner-border-sm me-2\" aria-hidden=\"true\"></span>\r\n }\r\n <i class=\"bi bi-box-arrow-in-right me-2\"></i>\r\n Sign In\r\n </button>\r\n </form>\r\n }\r\n\r\n <!-- Registration Information -->\r\n @if (shouldShowRegistration()) {\r\n <div class=\"mt-4 text-center\">\r\n <div class=\"alert alert-info py-2\" role=\"alert\">\r\n <i class=\"bi bi-person-plus me-1\"></i>\r\n <strong>New Users:</strong> {{ registrationMessage() }}\r\n <div class=\"mt-2\">\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm\" (click)=\"goToRegister()\">\r\n <i class=\"bi bi-person-plus me-1\"></i>Create Account\r\n </button>\r\n </div>\r\n <div class=\"mt-1\">\r\n <small class=\"text-muted\">\r\n @if (shouldShowOrcidLogin()) {\r\n <span>You can also sign in with ORCID to create an account</span>\r\n }\r\n </small>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Additional Information -->\r\n @if (siteConfig$ | async; as config) {\r\n <div class=\"mt-4 text-center\">\r\n <p class=\"text-muted small\">\r\n {{ config.siteName }} - Scientific Metadata Management\r\n </p>\r\n @if (shouldShowOrcidLogin() && !shouldShowRegistration()) {\r\n <p class=\"text-muted small\">\r\n <i class=\"bi bi-info-circle me-1\"></i>\r\n New users can sign in directly with ORCID\r\n </p>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, inject, OnInit, signal, computed } from '@angular/core';\nimport { FormBuilder, FormGroup, ReactiveFormsModule, Validators, AbstractControl } from '@angular/forms';\nimport { Router, ActivatedRoute } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { NgbAlert } from '@ng-bootstrap/ng-bootstrap';\nimport { ApiService } from '../../../services/api';\nimport { SiteConfigService } from '../../../services/site-config';\nimport { UserRegistrationRequest, UserResponse, RegistrationStatus } from '../../../models';\n\n@Component({\n selector: 'ccc-register',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbAlert],\n templateUrl: './register.html',\n styleUrl: './register.scss'\n})\nexport class RegisterComponent implements OnInit {\n private apiService = inject(ApiService);\n private fb = inject(FormBuilder);\n private router = inject(Router);\n private route = inject(ActivatedRoute);\n private siteConfigService = inject(SiteConfigService);\n\n registrationForm: FormGroup;\n loading = signal(false);\n error = signal<string | null>(null);\n success = signal<string | null>(null);\n \n siteConfig$ = this.siteConfigService.config$;\n\n registrationStatus = signal<RegistrationStatus | null>(null);\n registrationEnabled = signal(false);\n\n private returnUrl: string = '/login';\n\n constructor() {\n this.registrationForm = this.fb.group({\n username: ['', [Validators.required, Validators.minLength(3), Validators.maxLength(150)]],\n email: ['', [Validators.required, Validators.email, Validators.maxLength(254)]],\n firstName: ['', [Validators.required, Validators.maxLength(30)]],\n lastName: ['', [Validators.required, Validators.maxLength(30)]],\n password: ['', [Validators.required, Validators.minLength(8)]],\n confirmPassword: ['', [Validators.required]]\n }, { validators: this.passwordMatchValidator });\n }\n\n ngOnInit() {\n this.checkRegistrationStatus();\n\n this.route.queryParams.subscribe(params => {\n this.returnUrl = params['returnUrl'] || '/login';\n });\n }\n\n /**\n * Check if registration is enabled\n */\n private checkRegistrationStatus(): void {\n this.apiService.getRegistrationStatus().subscribe({\n next: (status) => {\n this.registrationStatus.set(status);\n this.registrationEnabled.set(status.registrationEnabled);\n \n if (!this.registrationEnabled()) {\n this.error.set(status.message || 'Registration is currently disabled');\n }\n },\n error: (error) => {\n this.error.set('Unable to check registration status. Please try again later.');\n }\n });\n }\n\n /**\n * Custom validator to check if passwords match\n */\n private passwordMatchValidator(form: AbstractControl): {[key: string]: any} | null {\n const password = form.get('password');\n const confirmPassword = form.get('confirmPassword');\n \n if (password && confirmPassword && password.value !== confirmPassword.value) {\n return { passwordMismatch: true };\n }\n return null;\n }\n\n /**\n * Handle form submission\n */\n onSubmit() {\n if (this.registrationForm.valid && this.registrationEnabled()) {\n this.loading.set(true);\n this.error.set(null);\n\n const registrationData: UserRegistrationRequest = {\n username: this.registrationForm.get('username')?.value,\n email: this.registrationForm.get('email')?.value,\n firstName: this.registrationForm.get('firstName')?.value,\n lastName: this.registrationForm.get('lastName')?.value,\n password: this.registrationForm.get('password')?.value,\n passwordConfirm: this.registrationForm.get('confirmPassword')?.value\n };\n\n this.apiService.registerUser(registrationData).subscribe({\n next: (response: UserResponse) => {\n this.loading.set(false);\n this.success.set(response.message || 'Registration successful! You can now log in with your credentials.');\n \n setTimeout(() => {\n this.router.navigate(['/login'], {\n queryParams: { \n returnUrl: this.returnUrl,\n registered: 'true',\n username: registrationData.username\n }\n });\n }, 2000);\n },\n error: (error) => {\n this.loading.set(false);\n \n if (error.error && typeof error.error === 'object') {\n const errors = [];\n for (const [field, messages] of Object.entries(error.error)) {\n if (Array.isArray(messages)) {\n errors.push(`${field}: ${messages.join(', ')}`);\n } else {\n errors.push(`${field}: ${messages}`);\n }\n }\n this.error.set(errors.join('\\n'));\n } else {\n this.error.set(error.error?.message || error.message || 'Registration failed. Please try again.');\n }\n }\n });\n }\n }\n\n /**\n * Navigate back to login\n */\n goToLogin() {\n this.router.navigate(['/login'], {\n queryParams: { returnUrl: this.returnUrl }\n });\n }\n\n /**\n * Clear error message\n */\n clearError() {\n this.error.set(null);\n }\n\n /**\n * Clear success message\n */\n clearSuccess() {\n this.success.set(null);\n }\n\n /**\n * Get field error message\n */\n getFieldErrorMessage(fieldName: string): string | null {\n const field = this.registrationForm.get(fieldName);\n if (field && field.invalid && field.touched) {\n if (field.errors?.['required']) {\n return `${this.getFieldDisplayName(fieldName)} is required`;\n }\n if (field.errors?.['email']) {\n return 'Please enter a valid email address';\n }\n if (field.errors?.['minlength']) {\n const requiredLength = field.errors?.['minlength'].requiredLength;\n return `${this.getFieldDisplayName(fieldName)} must be at least ${requiredLength} characters`;\n }\n if (field.errors?.['maxlength']) {\n const requiredLength = field.errors?.['maxlength'].requiredLength;\n return `${this.getFieldDisplayName(fieldName)} must be no more than ${requiredLength} characters`;\n }\n }\n \n if (fieldName === 'confirmPassword' && this.registrationForm.errors?.['passwordMismatch'] && field?.touched) {\n return 'Passwords do not match';\n }\n \n return null;\n }\n\n /**\n * Get user-friendly field display name\n */\n private getFieldDisplayName(fieldName: string): string {\n const displayNames: {[key: string]: string} = {\n username: 'Username',\n email: 'Email',\n firstName: 'First name',\n lastName: 'Last name',\n password: 'Password',\n confirmPassword: 'Confirm password'\n };\n return displayNames[fieldName] || fieldName;\n }\n\n /**\n * Check if a field has errors and should display error styling\n */\n hasFieldError(fieldName: string): boolean {\n const field = this.registrationForm.get(fieldName);\n if (fieldName === 'confirmPassword') {\n return (field?.invalid && field?.touched) || \n (this.registrationForm.errors?.['passwordMismatch'] && field?.touched) || false;\n }\n return field?.invalid && field?.touched || false;\n }\n\n /**\n * Computed signals for UI display logic\n */\n isRegistrationDisabled = computed(() => !this.registrationEnabled());\n canSubmitForm = computed(() => {\n return this.registrationForm.valid && this.registrationEnabled() && !this.loading();\n });\n}\n","<div class=\"container\">\n <div class=\"register-wrapper\">\n <div class=\"card\">\n <div class=\"card-body\">\n @if (siteConfig$ | async; as config) {\n <h3 class=\"card-title text-center mb-4\">\n <i class=\"bi bi-person-plus me-2\"></i>Create Account - {{ config.siteName }}\n </h3>\n }\n\n <!-- Success Alert -->\n @if (success()) {\n <ngb-alert type=\"success\" (closed)=\"clearSuccess()\" [dismissible]=\"true\">\n <i class=\"bi bi-check-circle me-2\"></i>{{ success() }}\n </ngb-alert>\n }\n\n <!-- Error Alert -->\n @if (error()) {\n <ngb-alert type=\"danger\" (closed)=\"clearError()\" [dismissible]=\"true\">\n <i class=\"bi bi-exclamation-triangle me-2\"></i>\n <span [innerHTML]=\"error()?.replace('\\n', '<br>') || ''\"></span>\n </ngb-alert>\n }\n\n <!-- Registration Disabled Message -->\n @if (!registrationEnabled() && !loading()) {\n <div class=\"alert alert-warning text-center\">\n <i class=\"bi bi-info-circle me-2\"></i>\n <strong>Registration Unavailable</strong>\n <div class=\"mt-2\">\n {{ registrationStatus()?.message || 'Registration is currently disabled' }}\n </div>\n <div class=\"mt-3\">\n <button type=\"button\" class=\"btn btn-outline-primary\" (click)=\"goToLogin()\">\n <i class=\"bi bi-arrow-left me-1\"></i>Back to Login\n </button>\n </div>\n </div>\n }\n\n <!-- Registration Form -->\n @if (registrationEnabled()) {\n <form [formGroup]=\"registrationForm\" (ngSubmit)=\"onSubmit()\">\n <!-- Username -->\n <div class=\"mb-3\">\n <label for=\"username\" class=\"form-label\">Username <span class=\"text-danger\">*</span></label>\n <div class=\"input-group\">\n <span class=\"input-group-text\">\n <i class=\"bi bi-person\"></i>\n </span>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"username\"\n formControlName=\"username\"\n [class.is-invalid]=\"hasFieldError('username')\"\n placeholder=\"Choose a username\">\n </div>\n @if (getFieldErrorMessage('username')) {\n <div class=\"invalid-feedback d-block\">\n {{ getFieldErrorMessage('username') }}\n </div>\n }\n <div class=\"form-text\">\n Username must be 3-150 characters. Only letters, numbers, and @/./+/-/_ allowed.\n </div>\n </div>\n\n <!-- Email -->\n <div class=\"mb-3\">\n <label for=\"email\" class=\"form-label\">Email Address <span class=\"text-danger\">*</span></label>\n <div class=\"input-group\">\n <span class=\"input-group-text\">\n <i class=\"bi bi-envelope\"></i>\n </span>\n <input \n type=\"email\" \n class=\"form-control\" \n id=\"email\"\n formControlName=\"email\"\n [class.is-invalid]=\"hasFieldError('email')\"\n placeholder=\"Enter your email address\">\n </div>\n @if (getFieldErrorMessage('email')) {\n <div class=\"invalid-feedback d-block\">\n {{ getFieldErrorMessage('email') }}\n </div>\n }\n </div>\n\n <!-- First Name and Last Name -->\n <div class=\"row\">\n <div class=\"col-md-6 mb-3\">\n <label for=\"first_name\" class=\"form-label\">First Name <span class=\"text-danger\">*</span></label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"first_name\"\n formControlName=\"firstName\"\n [class.is-invalid]=\"hasFieldError('firstName')\"\n placeholder=\"First name\">\n @if (getFieldErrorMessage('firstName')) {\n <div class=\"invalid-feedback d-block\">\n {{ getFieldErrorMessage('firstName') }}\n </div>\n }\n </div>\n <div class=\"col-md-6 mb-3\">\n <label for=\"last_name\" class=\"form-label\">Last Name <span class=\"text-danger\">*</span></label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"last_name\"\n formControlName=\"lastName\"\n [class.is-invalid]=\"hasFieldError('lastName')\"\n placeholder=\"Last name\">\n @if (getFieldErrorMessage('lastName')) {\n <div class=\"invalid-feedback d-block\">\n {{ getFieldErrorMessage('lastName') }}\n </div>\n }\n </div>\n </div>\n\n <!-- Password -->\n <div class=\"mb-3\">\n <label for=\"password\" class=\"form-label\">Password <span class=\"text-danger\">*</span></label>\n <div class=\"input-group\">\n <span class=\"input-group-text\">\n <i class=\"bi bi-lock\"></i>\n </span>\n <input \n type=\"password\" \n class=\"form-control\" \n id=\"password\"\n formControlName=\"password\"\n [class.is-invalid]=\"hasFieldError('password')\"\n placeholder=\"Create a password\">\n </div>\n @if (getFieldErrorMessage('password')) {\n <div class=\"invalid-feedback d-block\">\n {{ getFieldErrorMessage('password') }}\n </div>\n }\n <div class=\"form-text\">\n Password must be at least 8 characters long.\n </div>\n </div>\n\n <!-- Confirm Password -->\n <div class=\"mb-4\">\n <label for=\"confirm_password\" class=\"form-label\">Confirm Password <span class=\"text-danger\">*</span></label>\n <div class=\"input-group\">\n <span class=\"input-group-text\">\n <i class=\"bi bi-lock-fill\"></i>\n </span>\n <input \n type=\"password\" \n class=\"form-control\" \n id=\"confirm_password\"\n formControlName=\"confirmPassword\"\n [class.is-invalid]=\"hasFieldError('confirmPassword')\"\n placeholder=\"Confirm your password\">\n </div>\n @if (getFieldErrorMessage('confirmPassword')) {\n <div class=\"invalid-feedback d-block\">\n {{ getFieldErrorMessage('confirmPassword') }}\n </div>\n }\n </div>\n\n <!-- Submit Button -->\n <div class=\"d-grid gap-2 mb-3\">\n <button \n type=\"submit\" \n class=\"btn btn-primary\"\n [disabled]=\"registrationForm.invalid || loading() || !registrationEnabled()\">\n @if (loading()) {\n <span class=\"spinner-border spinner-border-sm me-2\" aria-hidden=\"true\"></span>\n }\n @if (!loading()) {\n <i class=\"bi bi-person-plus me-2\"></i>\n }\n Create Account\n </button>\n </div>\n\n <!-- Back to Login -->\n <div class=\"text-center\">\n <p class=\"text-muted small mb-2\">Already have an account?</p>\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"goToLogin()\">\n <i class=\"bi bi-arrow-left me-1\"></i>Back to Login\n </button>\n </div>\n </form>\n }\n\n <!-- Additional Information -->\n @if (siteConfig$ | async; as config) {\n <div class=\"mt-4 text-center\">\n <p class=\"text-muted small\">\n {{ config.siteName }} - Scientific Metadata Management\n </p>\n </div>\n }\n </div>\n </div>\n </div>\n</div>\n","import { Component, OnInit, signal, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbModule, NgbModal } from '@ng-bootstrap/ng-bootstrap';\nimport { debounceTime } from 'rxjs';\nimport { AuthService } from '../../../services/auth';\nimport { UserManagementService } from '../../../services/user-management';\nimport { \n User, \n UserCreateRequest, \n UserListResponse, \n AdminPasswordResetRequest \n} from '../../../models';\n\n@Component({\n selector: 'ccc-user-management',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, FormsModule, NgbModule],\n templateUrl: './user-management.html',\n styleUrl: './user-management.scss'\n})\nexport class UserManagementComponent implements OnInit {\n private fb = inject(FormBuilder);\n private userManagementService = inject(UserManagementService);\n private authService = inject(AuthService);\n private modalService = inject(NgbModal);\n\n // Data\n users = signal<User[]>([]);\n totalUsers = signal(0);\n isLoading = signal(false);\n \n // Search and filters\n searchForm: FormGroup;\n searchTerm = signal('');\n staffFilter = signal('');\n activeFilter = signal('');\n \n // Pagination\n currentPage = signal(1);\n pageSize = signal(10);\n \n // UI state\n selectedUser = signal<User | null>(null);\n isCreatingUser = signal(false);\n isUpdatingUser = signal(false);\n isDeletingUser = signal(false);\n isResettingPassword = signal(false);\n \n // Messages\n successMessage = signal<string>('');\n errorMessage = signal<string>('');\n\n // Make Math available in template\n Math = Math;\n\n // Computed signals\n totalPages = computed(() => Math.ceil(this.totalUsers() / this.pageSize()));\n \n pages = computed(() => {\n const total = this.totalPages();\n const current = this.currentPage();\n const pages: number[] = [];\n \n // Show up to 5 pages around current page\n const start = Math.max(1, current - 2);\n const end = Math.min(total, current + 2);\n \n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n \n return pages;\n });\n\n showingFrom = computed(() => ((this.currentPage() - 1) * this.pageSize()) + 1);\n \n showingTo = computed(() => Math.min(this.currentPage() * this.pageSize(), this.totalUsers()));\n\n hasResults = computed(() => this.users().length > 0);\n\n canGoToPreviousPage = computed(() => this.currentPage() > 1);\n \n canGoToNextPage = computed(() => this.currentPage() < this.totalPages());\n\n // Additional computed signals for UI state\n isAnyActionInProgress = computed(() => \n this.isCreatingUser() || \n this.isUpdatingUser() || \n this.isDeletingUser() || \n this.isResettingPassword()\n );\n\n selectedUserDisplayName = computed(() => {\n const user = this.selectedUser();\n return user ? this.getUserDisplayName(user) : '';\n });\n\n // Computed signal for modal states\n hasSelectedUser = computed(() => this.selectedUser() !== null);\n\n // Computed signals for form states\n canCreateUser = computed(() => !this.isCreatingUser());\n canUpdateUser = computed(() => !this.isUpdatingUser());\n canResetPassword = computed(() => !this.isResettingPassword());\n\n constructor() {\n this.searchForm = this.fb.group({\n search: [''],\n isStaff: [''],\n isActive: ['']\n });\n }\n\n ngOnInit() {\n this.loadUsers();\n \n // Subscribe to search form changes with debounce\n this.searchForm.valueChanges.pipe(\n debounceTime(300)\n ).subscribe((values) => {\n this.searchTerm.set(values.search || '');\n this.staffFilter.set(values.isStaff || '');\n this.activeFilter.set(values.isActive || '');\n this.currentPage.set(1);\n });\n }\n\n loadUsers(): void {\n this.isLoading.set(true);\n this.errorMessage.set('');\n\n const offset = (this.currentPage() - 1) * this.pageSize();\n const searchParams = {\n search: this.searchTerm() || undefined,\n isStaff: this.staffFilter() !== '' ? this.staffFilter() === 'true' : undefined,\n isActive: this.activeFilter() !== '' ? this.activeFilter() === 'true' : undefined,\n limit: this.pageSize(),\n offset: offset\n };\n\n this.userManagementService.getUsers(searchParams).subscribe({\n next: (response: UserListResponse) => {\n this.users.set(response.results);\n this.totalUsers.set(response.count);\n this.isLoading.set(false);\n },\n error: (error) => {\n this.errorMessage.set('Failed to load users');\n this.isLoading.set(false);\n }\n });\n }\n\n openCreateUserModal(content: any): void {\n this.selectedUser.set(null);\n this.modalService.open(content, { size: 'lg' });\n }\n\n openEditUserModal(content: any, user: User): void {\n this.selectedUser.set(user);\n this.modalService.open(content, { size: 'lg' });\n }\n\n openPasswordResetModal(content: any, user: User): void {\n this.selectedUser.set(user);\n this.modalService.open(content);\n }\n\n createUser(userData: UserCreateRequest): void {\n this.isCreatingUser.set(true);\n this.errorMessage.set('');\n\n this.userManagementService.createUser(userData).subscribe({\n next: (response) => {\n this.successMessage.set(`User ${userData.username} created successfully`);\n this.loadUsers();\n this.isCreatingUser.set(false);\n this.modalService.dismissAll();\n },\n error: (error) => {\n this.errorMessage.set(error.error?.message || 'Failed to create user');\n this.isCreatingUser.set(false);\n }\n });\n }\n\n updateUser(userId: number, userData: Partial<User>): void {\n this.isUpdatingUser.set(true);\n this.errorMessage.set('');\n\n this.userManagementService.updateUser(userId, userData).subscribe({\n next: (updatedUser) => {\n this.successMessage.set(`User ${updatedUser.username} updated successfully`);\n this.loadUsers();\n this.isUpdatingUser.set(false);\n this.modalService.dismissAll();\n },\n error: (error) => {\n this.errorMessage.set(error.error?.message || 'Failed to update user');\n this.isUpdatingUser.set(false);\n }\n });\n }\n\n deleteUser(user: User): void {\n if (!user.id) return;\n \n if (confirm(`Are you sure you want to delete user \"${user.username}\"? This action cannot be undone.`)) {\n this.isDeletingUser.set(true);\n this.errorMessage.set('');\n\n this.userManagementService.deleteUser(user.id).subscribe({\n next: () => {\n this.successMessage.set(`User ${user.username} deleted successfully`);\n this.loadUsers();\n this.isDeletingUser.set(false);\n },\n error: (error) => {\n this.errorMessage.set(error.error?.message || 'Failed to delete user');\n this.isDeletingUser.set(false);\n }\n });\n }\n }\n\n resetUserPassword(userId: number, passwordData: AdminPasswordResetRequest): void {\n this.isResettingPassword.set(true);\n this.errorMessage.set('');\n\n this.userManagementService.resetUserPassword(userId, passwordData).subscribe({\n next: (response) => {\n this.successMessage.set(response.message || 'Password reset successfully');\n this.isResettingPassword.set(false);\n this.modalService.dismissAll();\n },\n error: (error) => {\n this.errorMessage.set(error.error?.message || 'Failed to reset password');\n this.isResettingPassword.set(false);\n }\n });\n }\n\n toggleUserStatus(user: User): void {\n if (!user.id) return;\n \n const newStatus = !user.isActive;\n const action = newStatus ? 'activate' : 'deactivate';\n \n if (confirm(`Are you sure you want to ${action} user \"${user.username}\"?`)) {\n this.updateUser(user.id, { isActive: newStatus });\n }\n }\n\n toggleStaffStatus(user: User): void {\n if (!user.id) return;\n \n const newStatus = !user.isStaff;\n const action = newStatus ? 'grant staff privileges to' : 'revoke staff privileges from';\n \n if (confirm(`Are you sure you want to ${action} user \"${user.username}\"?`)) {\n this.updateUser(user.id, { isStaff: newStatus });\n }\n }\n\n onPageChange(page: number): void {\n this.currentPage.set(page);\n this.loadUsers();\n }\n\n clearMessages(): void {\n this.successMessage.set('');\n this.errorMessage.set('');\n }\n\n\n formatDate(dateString?: string): string {\n return this.userManagementService.formatDate(dateString);\n }\n\n getUserDisplayName(user: User): string {\n return this.userManagementService.getUserDisplayName(user);\n }\n}","<div class=\"user-management-container\">\n <!-- Header Section -->\n <nav class=\"navbar navbar-expand-lg bg-body-tertiary shadow-sm\">\n <div class=\"container-fluid\">\n <div class=\"d-flex align-items-center justify-content-between w-100\">\n <div class=\"d-flex align-items-center\">\n <h4 class=\"mb-0\">\n <i class=\"bi bi-people-fill me-2 text-primary\"></i>User Management\n </h4>\n <span class=\"badge bg-primary ms-3\">{{ totalUsers() }} users</span>\n </div>\n\n <div class=\"d-flex gap-2\">\n <button\n type=\"button\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"openCreateUserModal(createUserModal)\"\n [disabled]=\"isLoading()\">\n <i class=\"bi bi-person-plus me-1\"></i>Create User\n </button>\n </div>\n </div>\n </div>\n </nav>\n\n <div class=\"users-content p-4\">\n <!-- Search and Filters Section -->\n <div class=\"card mb-4\">\n <div class=\"card-header\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-search me-2\"></i>Search & Filters\n </h5>\n </div>\n <div class=\"card-body\">\n <form [formGroup]=\"searchForm\" class=\"row g-3\">\n <div class=\"col-md-4\">\n <label for=\"search\" class=\"form-label\">Search</label>\n <div class=\"input-group\">\n <span class=\"input-group-text\">\n <i class=\"bi bi-search\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"search\"\n formControlName=\"search\"\n placeholder=\"Search by username, email, or name\">\n </div>\n </div>\n\n <div class=\"col-md-4\">\n <label for=\"isStaff\" class=\"form-label\">Staff Status</label>\n <select class=\"form-select\" id=\"isStaff\" formControlName=\"isStaff\">\n <option value=\"\">All Users</option>\n <option value=\"true\">Staff Only</option>\n <option value=\"false\">Regular Users</option>\n </select>\n </div>\n\n <div class=\"col-md-4\">\n <label for=\"isActive\" class=\"form-label\">Account Status</label>\n <select class=\"form-select\" id=\"isActive\" formControlName=\"isActive\">\n <option value=\"\">All Accounts</option>\n <option value=\"true\">Active Only</option>\n <option value=\"false\">Inactive Only</option>\n </select>\n </div>\n </form>\n </div>\n </div>\n\n <!-- Success/Error Messages -->\n @if (successMessage()) {\n <div class=\"alert alert-success alert-dismissible\">\n <i class=\"bi bi-check-circle me-2\"></i>{{ successMessage() }}\n <button type=\"button\" class=\"btn-close\" (click)=\"clearMessages()\"></button>\n </div>\n }\n\n @if (errorMessage()) {\n <div class=\"alert alert-danger alert-dismissible\">\n <i class=\"bi bi-exclamation-triangle me-2\"></i>{{ errorMessage() }}\n <button type=\"button\" class=\"btn-close\" (click)=\"clearMessages()\"></button>\n </div>\n }\n\n <!-- Users Table -->\n <div class=\"card\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-table me-2\"></i>Users\n <span class=\"badge bg-primary ms-2\">{{ users().length }}</span>\n </h5>\n @if (isLoading()) {\n <div class=\"spinner-border spinner-border-sm text-primary\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n }\n </div>\n <div class=\"card-body p-0\">\n @if (hasResults()) {\n <div class=\"table-responsive\">\n <table class=\"table table-hover mb-0\">\n <thead class=\"table-light\">\n <tr>\n <th>User</th>\n <th>Contact</th>\n <th>Status</th>\n <th>Joined</th>\n <th>Last Login</th>\n <th class=\"text-end\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (user of users(); track user.id) {\n <tr>\n <td>\n <div class=\"d-flex align-items-center\">\n <div>\n <div class=\"fw-semibold\">{{ getUserDisplayName(user) }}</div>\n <small class=\"text-muted\">@{{ user.username }}</small>\n </div>\n </div>\n </td>\n <td>\n <div>{{ user.email }}</div>\n </td>\n <td>\n <div class=\"d-flex gap-1 flex-wrap\">\n @if (user.isActive) {\n <span class=\"badge bg-success\">Active</span>\n } @else {\n <span class=\"badge bg-danger\">Inactive</span>\n }\n @if (user.isStaff) {\n <span class=\"badge bg-warning\">Staff</span>\n }\n </div>\n </td>\n <td>{{ formatDate(user.dateJoined) }}</td>\n <td>{{ formatDate(user.lastLogin) }}</td>\n <td class=\"text-end\">\n <div class=\"btn-group btn-group-sm\" role=\"group\">\n <button\n type=\"button\"\n class=\"btn btn-outline-primary\"\n (click)=\"openEditUserModal(editUserModal, user)\"\n title=\"Edit user\">\n <i class=\"bi bi-pencil\"></i>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-outline-warning\"\n (click)=\"openPasswordResetModal(passwordResetModal, user)\"\n title=\"Reset password\">\n <i class=\"bi bi-shield-lock\"></i>\n </button>\n <button\n type=\"button\"\n class=\"btn\"\n [class]=\"user.isActive ? 'btn-outline-secondary' : 'btn-outline-success'\"\n (click)=\"toggleUserStatus(user)\"\n [title]=\"user.isActive ? 'Deactivate user' : 'Activate user'\">\n <i class=\"bi\" [class]=\"user.isActive ? 'bi-person-dash' : 'bi-person-check'\"></i>\n </button>\n <button\n type=\"button\"\n class=\"btn\"\n [class]=\"user.isStaff ? 'btn-outline-secondary' : 'btn-outline-info'\"\n (click)=\"toggleStaffStatus(user)\"\n [title]=\"user.isStaff ? 'Remove staff privileges' : 'Grant staff privileges'\">\n <i class=\"bi\" [class]=\"user.isStaff ? 'bi-person-x' : 'bi-person-badge'\"></i>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-outline-danger\"\n (click)=\"deleteUser(user)\"\n title=\"Delete user\">\n <i class=\"bi bi-trash\"></i>\n </button>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <!-- Pagination -->\n @if (totalPages() > 1) {\n <div class=\"d-flex justify-content-between align-items-center p-3 border-top\">\n <div class=\"text-muted\">\n Showing {{ showingFrom() }} to {{ showingTo() }} of {{ totalUsers() }} users\n </div>\n <nav>\n <ul class=\"pagination pagination-sm mb-0\">\n <li class=\"page-item\" [class.disabled]=\"!canGoToPreviousPage()\">\n <button class=\"page-link\" (click)=\"onPageChange(currentPage() - 1)\" [disabled]=\"!canGoToPreviousPage()\">\n <i class=\"bi bi-chevron-left\"></i>\n </button>\n </li>\n @for (page of pages(); track page) {\n <li class=\"page-item\" [class.active]=\"page === currentPage()\">\n <button class=\"page-link\" (click)=\"onPageChange(page)\">{{ page }}</button>\n </li>\n }\n <li class=\"page-item\" [class.disabled]=\"!canGoToNextPage()\">\n <button class=\"page-link\" (click)=\"onPageChange(currentPage() + 1)\" [disabled]=\"!canGoToNextPage()\">\n <i class=\"bi bi-chevron-right\"></i>\n </button>\n </li>\n </ul>\n </nav>\n </div>\n }\n } @else {\n <div class=\"text-center p-4\">\n <i class=\"bi bi-people display-4 text-muted\"></i>\n <p class=\"text-muted mt-2\">No users found</p>\n </div>\n }\n </div>\n </div>\n </div>\n</div>\n\n<!-- Create User Modal -->\n<ng-template #createUserModal let-modal>\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-person-plus me-2\"></i>Create User\n </h4>\n <button type=\"button\" class=\"btn-close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <form #createForm=\"ngForm\" (ngSubmit)=\"createUser(createForm.value)\">\n <div class=\"row g-3\">\n <div class=\"col-md-6\">\n <label for=\"createUsername\" class=\"form-label\">Username</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"createUsername\"\n name=\"username\"\n ngModel\n required\n #usernameField=\"ngModel\">\n @if (usernameField.invalid && usernameField.touched) {\n <div class=\"text-danger small\">Username is required</div>\n }\n </div>\n <div class=\"col-md-6\">\n <label for=\"createEmail\" class=\"form-label\">Email</label>\n <input\n type=\"email\"\n class=\"form-control\"\n id=\"createEmail\"\n name=\"email\"\n ngModel\n required\n email\n #emailField=\"ngModel\">\n @if (emailField.invalid && emailField.touched) {\n <div class=\"text-danger small\">Valid email is required</div>\n }\n </div>\n </div>\n <div class=\"row g-3 mt-1\">\n <div class=\"col-md-6\">\n <label for=\"createFirstName\" class=\"form-label\">First Name</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"createFirstName\"\n name=\"firstName\"\n ngModel\n required\n #firstNameField=\"ngModel\">\n @if (firstNameField.invalid && firstNameField.touched) {\n <div class=\"text-danger small\">First name is required</div>\n }\n </div>\n <div class=\"col-md-6\">\n <label for=\"createLastName\" class=\"form-label\">Last Name</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"createLastName\"\n name=\"lastName\"\n ngModel\n required\n #lastNameField=\"ngModel\">\n @if (lastNameField.invalid && lastNameField.touched) {\n <div class=\"text-danger small\">Last name is required</div>\n }\n </div>\n </div>\n <div class=\"row g-3 mt-1\">\n <div class=\"col-md-6\">\n <label for=\"createPassword\" class=\"form-label\">Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"createPassword\"\n name=\"password\"\n ngModel\n required\n minlength=\"8\"\n #passwordField=\"ngModel\">\n @if (passwordField.invalid && passwordField.touched) {\n <div class=\"text-danger small\">Password must be at least 8 characters</div>\n }\n </div>\n <div class=\"col-md-6\">\n <label for=\"createPasswordConfirm\" class=\"form-label\">Confirm Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"createPasswordConfirm\"\n name=\"password_confirm\"\n ngModel\n required\n #passwordConfirmField=\"ngModel\">\n @if (passwordConfirmField.invalid && passwordConfirmField.touched) {\n <div class=\"text-danger small\">Password confirmation is required</div>\n }\n </div>\n </div>\n <div class=\"row g-3 mt-1\">\n <div class=\"col-md-6\">\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"createIsStaff\"\n name=\"isStaff\"\n ngModel>\n <label class=\"form-check-label\" for=\"createIsStaff\">\n Staff privileges\n </label>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"createIsActive\"\n name=\"isActive\"\n ngModel\n checked>\n <label class=\"form-check-label\" for=\"createIsActive\">\n Active account\n </label>\n </div>\n </div>\n </div>\n </form>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"modal.dismiss()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"createUser(createForm.value)\"\n [disabled]=\"createForm.invalid || !canCreateUser()\">\n @if (isCreatingUser()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-person-plus me-1\"></i>Create User\n </button>\n </div>\n</ng-template>\n\n<!-- Edit User Modal -->\n<ng-template #editUserModal let-modal>\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-pencil me-2\"></i>Edit User\n </h4>\n <button type=\"button\" class=\"btn-close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n @if (hasSelectedUser()) {\n <form #editForm=\"ngForm\" id=\"editUserForm\" (ngSubmit)=\"updateUser(selectedUser()!.id!, editForm.value)\">\n <div class=\"row g-3\">\n <div class=\"col-md-6\">\n <label for=\"editUsername\" class=\"form-label\">Username</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"editUsername\"\n name=\"username\"\n [ngModel]=\"selectedUser()!.username\"\n required\n #editUsernameField=\"ngModel\">\n @if (editUsernameField.invalid && editUsernameField.touched) {\n <div class=\"text-danger small\">Username is required</div>\n }\n </div>\n <div class=\"col-md-6\">\n <label for=\"editEmail\" class=\"form-label\">Email</label>\n <input\n type=\"email\"\n class=\"form-control\"\n id=\"editEmail\"\n name=\"email\"\n [ngModel]=\"selectedUser()!.email\"\n required\n email\n #editEmailField=\"ngModel\">\n @if (editEmailField.invalid && editEmailField.touched) {\n <div class=\"text-danger small\">Valid email is required</div>\n }\n </div>\n </div>\n <div class=\"row g-3 mt-1\">\n <div class=\"col-md-6\">\n <label for=\"editFirstName\" class=\"form-label\">First Name</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"editFirstName\"\n name=\"firstName\"\n [ngModel]=\"selectedUser()!.firstName\"\n required\n #editFirstNameField=\"ngModel\">\n @if (editFirstNameField.invalid && editFirstNameField.touched) {\n <div class=\"text-danger small\">First name is required</div>\n }\n </div>\n <div class=\"col-md-6\">\n <label for=\"editLastName\" class=\"form-label\">Last Name</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"editLastName\"\n name=\"lastName\"\n [ngModel]=\"selectedUser()!.lastName\"\n required\n #editLastNameField=\"ngModel\">\n @if (editLastNameField.invalid && editLastNameField.touched) {\n <div class=\"text-danger small\">Last name is required</div>\n }\n </div>\n </div>\n <div class=\"row g-3 mt-1\">\n <div class=\"col-md-6\">\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"editIsStaff\"\n name=\"isStaff\"\n [ngModel]=\"selectedUser()!.isStaff\">\n <label class=\"form-check-label\" for=\"editIsStaff\">\n Staff privileges\n </label>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"editIsActive\"\n name=\"isActive\"\n [ngModel]=\"selectedUser()!.isActive\">\n <label class=\"form-check-label\" for=\"editIsActive\">\n Active account\n </label>\n </div>\n </div>\n </div>\n </form>\n }\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"modal.dismiss()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n @if (hasSelectedUser()) {\n <button\n type=\"submit\"\n class=\"btn btn-primary\"\n form=\"editUserForm\"\n [disabled]=\"!canUpdateUser()\">\n @if (isUpdatingUser()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-check-circle me-1\"></i>Update User\n </button>\n }\n </div>\n</ng-template>\n\n<!-- Password Reset Modal -->\n<ng-template #passwordResetModal let-modal>\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-shield-lock me-2\"></i>Reset Password\n </h4>\n <button type=\"button\" class=\"btn-close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n @if (hasSelectedUser()) {\n <div class=\"alert alert-warning\">\n <i class=\"bi bi-exclamation-triangle me-2\"></i>\n You are about to reset the password for user <strong>{{ selectedUserDisplayName() }}</strong>.\n </div>\n \n <form #resetForm=\"ngForm\" id=\"resetPasswordForm\" (ngSubmit)=\"resetUserPassword(selectedUser()!.id!, resetForm.value)\">\n <div class=\"mb-3\">\n <label for=\"resetNewPassword\" class=\"form-label\">New Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"resetNewPassword\"\n name=\"new_password\"\n ngModel\n required\n minlength=\"8\"\n #resetPasswordField=\"ngModel\">\n @if (resetPasswordField.invalid && resetPasswordField.touched) {\n <div class=\"text-danger small\">Password must be at least 8 characters</div>\n }\n </div>\n <div class=\"mb-3\">\n <label for=\"resetConfirmPassword\" class=\"form-label\">Confirm Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"resetConfirmPassword\"\n name=\"confirm_password\"\n ngModel\n required\n #resetConfirmField=\"ngModel\">\n @if (resetConfirmField.invalid && resetConfirmField.touched) {\n <div class=\"text-danger small\">Password confirmation is required</div>\n }\n </div>\n <div class=\"mb-3\">\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"forcePasswordChange\"\n name=\"force_password_change\"\n ngModel>\n <label class=\"form-check-label\" for=\"forcePasswordChange\">\n Force user to change password on next login\n </label>\n </div>\n </div>\n <div class=\"mb-3\">\n <label for=\"resetReason\" class=\"form-label\">Reason (optional)</label>\n <textarea\n class=\"form-control\"\n id=\"resetReason\"\n name=\"reason\"\n ngModel\n rows=\"2\"\n placeholder=\"Optional reason for password reset\"></textarea>\n </div>\n </form>\n }\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"modal.dismiss()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n @if (hasSelectedUser()) {\n <button\n type=\"submit\"\n class=\"btn btn-warning\"\n form=\"resetPasswordForm\"\n [disabled]=\"!canResetPassword()\">\n @if (isResettingPassword()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-shield-lock me-1\"></i>Reset Password\n </button>\n }\n </div>\n</ng-template>","import { Component, OnInit, signal, computed, effect, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, NonNullableFormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbModule, NgbModal } from '@ng-bootstrap/ng-bootstrap';\nimport { debounceTime, distinctUntilChanged } from 'rxjs';\nimport { \n LabGroup, \n LabGroupQueryResponse,\n LabGroupCreateRequest,\n LabGroupMember,\n LabGroupInvitation,\n LabGroupInvitationCreateRequest\n} from '../../../models';\nimport { LabGroupService } from '../../../services/lab-group';\nimport { ToastService } from '../../../services/toast';\n\n@Component({\n selector: 'ccc-lab-groups',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbModule],\n templateUrl: './lab-groups.html',\n styleUrls: ['./lab-groups.scss']\n})\nexport class LabGroupsComponent implements OnInit {\n // Inject services using modern inject() syntax\n private readonly fb = inject(NonNullableFormBuilder);\n private readonly labGroupService = inject(LabGroupService);\n private readonly modalService = inject(NgbModal);\n private readonly toastService = inject(ToastService);\n\n // Forms\n searchForm: FormGroup;\n createGroupForm: FormGroup;\n inviteForm: FormGroup;\n \n // Signals for reactive state management\n private searchParams = signal<{\n search: string;\n limit: number;\n offset: number;\n }>({\n search: '',\n limit: 10,\n offset: 0\n });\n\n // State signals\n isLoading = signal(false);\n isCreatingGroup = signal(false);\n isInviting = signal(false);\n currentPage = signal(1);\n pageSize = signal(10);\n totalItems = signal(0);\n \n // Data signals\n labGroupsData = signal<LabGroupQueryResponse>({ count: 0, results: [] });\n selectedGroup = signal<LabGroup | null>(null);\n groupMembers = signal<LabGroupMember[]>([]);\n pendingInvitations = signal<LabGroupInvitation[]>([]);\n\n // UI state\n showCreateForm = signal(false);\n showInviteForm = signal(false);\n selectedGroupForMembers = signal<LabGroup | null>(null);\n\n // Member pagination\n memberTotal = signal(0);\n memberPage = signal(1);\n memberPageSize = signal(10);\n directMembersOnly = signal(false);\n\n // Computed values\n hasLabGroups = computed(() => this.labGroupsData().results.length > 0);\n showPagination = computed(() => this.labGroupsData().count > this.pageSize());\n totalPages = computed(() => Math.ceil(this.labGroupsData().count / this.pageSize()));\n hasSearchValue = computed(() => (this.searchForm?.get('search')?.value || '').trim().length > 0);\n hasGroupMembers = computed(() => this.groupMembers().length > 0);\n hasPendingInvitations = computed(() => this.pendingInvitations().length > 0);\n canInviteToCurrentGroup = computed(() => this.selectedGroupForMembers()?.canInvite || false);\n canManageCurrentGroup = computed(() => this.selectedGroupForMembers()?.canManage || false);\n currentGroupName = computed(() => this.selectedGroupForMembers()?.name || '');\n groupMembersCount = computed(() => this.memberTotal());\n pendingInvitationsCount = computed(() => this.pendingInvitations().length);\n showMemberPagination = computed(() => this.memberTotal() > this.memberPageSize());\n memberTotalPages = computed(() => Math.ceil(this.memberTotal() / this.memberPageSize()));\n hasSubGroups = computed(() => (this.selectedGroupForMembers()?.subGroupsCount ?? 0) > 0);\n\n constructor() {\n this.searchForm = this.fb.group({\n search: ['']\n });\n\n this.createGroupForm = this.fb.group({\n name: ['', [Validators.required, Validators.minLength(2)]],\n description: [''],\n allowMemberInvites: [true]\n });\n\n this.inviteForm = this.fb.group({\n invitedEmail: ['', [Validators.required, Validators.email]],\n message: ['']\n });\n\n // Effect to automatically reload lab groups when search params change\n effect(() => {\n const params = this.searchParams();\n this.loadLabGroupsWithParams(params);\n }, { allowSignalWrites: true });\n }\n\n ngOnInit() {\n this.setupSearch();\n this.loadInitialData();\n }\n\n private loadInitialData(): void {\n this.searchParams.set({\n search: '',\n limit: this.pageSize(),\n offset: 0\n });\n }\n\n private setupSearch(): void {\n this.searchForm.valueChanges.pipe(\n debounceTime(300),\n distinctUntilChanged()\n ).subscribe(formValue => {\n this.currentPage.set(1);\n \n this.searchParams.set({\n search: formValue.search?.trim() || '',\n limit: this.pageSize(),\n offset: 0\n });\n });\n }\n\n private loadLabGroupsWithParams(params: { search: string; limit: number; offset: number }): void {\n this.isLoading.set(true);\n \n this.labGroupService.getLabGroups({\n search: params.search || undefined,\n limit: params.limit,\n offset: params.offset\n }).subscribe({\n next: (response: LabGroupQueryResponse) => {\n this.isLoading.set(false);\n this.totalItems.set(response.count);\n this.labGroupsData.set(response);\n },\n error: (error) => {\n this.isLoading.set(false);\n this.labGroupsData.set({ count: 0, results: [] });\n console.error('Error loading lab groups:', error);\n }\n });\n }\n\n onPageChange(page: number): void {\n this.currentPage.set(page);\n this.searchParams.update(params => ({\n ...params,\n offset: (page - 1) * this.pageSize()\n }));\n }\n\n toggleCreateForm(): void {\n this.showCreateForm.update(show => !show);\n if (!this.showCreateForm()) {\n this.createGroupForm.reset({\n name: '',\n description: '',\n allowMemberInvites: true\n });\n }\n }\n\n createLabGroup(): void {\n if (this.createGroupForm.valid) {\n this.isCreatingGroup.set(true);\n const formValue = this.createGroupForm.value as LabGroupCreateRequest;\n \n this.labGroupService.createLabGroup(formValue).subscribe({\n next: (newGroup: LabGroup) => {\n this.isCreatingGroup.set(false);\n this.toastService.success(`Lab group \"${newGroup.name}\" created successfully!`);\n this.toggleCreateForm();\n this.refreshLabGroups();\n },\n error: (error) => {\n this.isCreatingGroup.set(false);\n const errorMsg = error?.error?.detail || error?.message || 'Failed to create lab group. Please try again.';\n this.toastService.error(errorMsg);\n console.error('Error creating lab group:', error);\n }\n });\n }\n }\n\n viewGroupMembers(group: LabGroup): void {\n this.selectedGroupForMembers.set(group);\n this.memberPage.set(1);\n this.directMembersOnly.set(false);\n this.loadGroupMembers(group.id);\n this.loadPendingInvitations(group.id);\n }\n\n private loadGroupMembers(groupId: number): void {\n const offset = (this.memberPage() - 1) * this.memberPageSize();\n this.labGroupService.getLabGroupMembers(groupId, {\n directOnly: this.directMembersOnly(),\n limit: this.memberPageSize(),\n offset: offset\n }).subscribe({\n next: (response) => {\n this.groupMembers.set(response.results);\n this.memberTotal.set(response.count);\n },\n error: (error) => {\n this.groupMembers.set([]);\n this.memberTotal.set(0);\n console.error('Error loading group members:', error);\n }\n });\n }\n\n private loadPendingInvitations(groupId: number): void {\n this.labGroupService.getLabGroupInvitations({\n labGroup: groupId,\n status: 'pending'\n }).subscribe({\n next: (response) => {\n this.pendingInvitations.set(response.results);\n },\n error: (error) => {\n this.pendingInvitations.set([]);\n console.error('Error loading pending invitations:', error);\n }\n });\n }\n\n toggleInviteForm(): void {\n this.showInviteForm.update(show => !show);\n if (!this.showInviteForm()) {\n this.inviteForm.reset();\n }\n }\n\n inviteMember(): void {\n if (this.inviteForm.valid && this.selectedGroupForMembers()) {\n this.isInviting.set(true);\n const groupId = this.selectedGroupForMembers()!.id;\n \n const inviteData: LabGroupInvitationCreateRequest = {\n labGroup: groupId,\n invitedEmail: this.inviteForm.value.invitedEmail,\n message: this.inviteForm.value.message || undefined\n };\n \n this.labGroupService.inviteUserToLabGroup(groupId, inviteData).subscribe({\n next: (invitation: LabGroupInvitation) => {\n this.isInviting.set(false);\n this.toastService.success(`Invitation sent to ${invitation.invitedEmail}!`);\n this.toggleInviteForm();\n this.loadPendingInvitations(groupId);\n },\n error: (error) => {\n this.isInviting.set(false);\n const errorMsg = error?.error?.detail || error?.message || 'Failed to send invitation. Please try again.';\n this.toastService.error(errorMsg);\n console.error('Error sending invitation:', error);\n }\n });\n }\n }\n\n removeMember(userId: number): void {\n const group = this.selectedGroupForMembers();\n if (!group) return;\n\n const confirmMessage = `Are you sure you want to remove this member from \"${group.name}\"?`;\n \n if (confirm(confirmMessage)) {\n this.labGroupService.removeMemberFromLabGroup(group.id, userId).subscribe({\n next: (response: {message: string}) => {\n this.loadGroupMembers(group.id);\n this.toastService.success('Member removed successfully!');\n },\n error: (error) => {\n const errorMsg = error?.error?.detail || error?.message || 'Failed to remove member. Please try again.';\n this.toastService.error(errorMsg);\n console.error('Error removing member:', error);\n }\n });\n }\n }\n\n cancelInvitation(invitationId: number): void {\n const confirmMessage = 'Are you sure you want to cancel this invitation?';\n \n if (confirm(confirmMessage)) {\n this.labGroupService.cancelLabGroupInvitation(invitationId).subscribe({\n next: (response) => {\n const group = this.selectedGroupForMembers();\n if (group) {\n this.loadPendingInvitations(group.id);\n }\n this.toastService.success('Invitation cancelled successfully!');\n },\n error: (error) => {\n const errorMsg = error?.error?.detail || error?.message || 'Failed to cancel invitation. Please try again.';\n this.toastService.error(errorMsg);\n console.error('Error cancelling invitation:', error);\n }\n });\n }\n }\n\n leaveGroup(group: LabGroup): void {\n const confirmMessage = `Are you sure you want to leave \"${group.name}\"?`;\n \n if (confirm(confirmMessage)) {\n this.labGroupService.leaveLabGroup(group.id).subscribe({\n next: (response) => {\n this.refreshLabGroups();\n this.selectedGroupForMembers.set(null);\n this.toastService.success(`Successfully left \"${group.name}\"!`);\n },\n error: (error) => {\n const errorMsg = error?.error?.detail || error?.message || 'Failed to leave group. Please try again.';\n this.toastService.error(errorMsg);\n console.error('Error leaving group:', error);\n }\n });\n }\n }\n\n deleteGroup(group: LabGroup): void {\n const confirmMessage = `Are you sure you want to delete the lab group \"${group.name}\"?\\n\\nThis action cannot be undone.`;\n \n if (confirm(confirmMessage)) {\n this.labGroupService.deleteLabGroup(group.id).subscribe({\n next: () => {\n this.refreshLabGroups();\n this.selectedGroupForMembers.set(null);\n this.toastService.success(`Lab group \"${group.name}\" deleted successfully!`);\n },\n error: (error) => {\n const errorMsg = error?.error?.detail || error?.message || 'Failed to delete lab group. Please try again.';\n this.toastService.error(errorMsg);\n console.error('Error deleting group:', error);\n }\n });\n }\n }\n\n private refreshLabGroups(): void {\n this.searchParams.update(params => ({ ...params }));\n }\n\n closeGroupDetails(): void {\n this.selectedGroupForMembers.set(null);\n this.groupMembers.set([]);\n this.memberTotal.set(0);\n this.memberPage.set(1);\n this.pendingInvitations.set([]);\n this.showInviteForm.set(false);\n }\n\n toggleDirectMembersOnly(): void {\n this.directMembersOnly.update(v => !v);\n this.memberPage.set(1);\n const group = this.selectedGroupForMembers();\n if (group) {\n this.loadGroupMembers(group.id);\n }\n }\n\n onMemberPageChange(page: number): void {\n this.memberPage.set(page);\n const group = this.selectedGroupForMembers();\n if (group) {\n this.loadGroupMembers(group.id);\n }\n }\n}\n","<div class=\"lab-groups-container\">\n <!-- Header Section -->\n <nav class=\"navbar navbar-expand-lg bg-body-tertiary shadow-sm\">\n <div class=\"container-fluid\">\n <div class=\"d-flex align-items-center justify-content-between w-100\">\n <div class=\"d-flex align-items-center\">\n <h4 class=\"navbar-brand m-0 fw-bold\">\n <i class=\"bi bi-people me-2\"></i>Lab Groups\n </h4>\n </div>\n <div class=\"d-flex gap-2\">\n <button type=\"button\" class=\"btn btn-primary btn-sm\" (click)=\"toggleCreateForm()\">\n <i class=\"bi bi-plus me-1\"></i>New Lab Group\n </button>\n </div>\n </div>\n </div>\n </nav>\n\n <div class=\"groups-content p-4\">\n <!-- Create Group Form -->\n @if (showCreateForm()) {\n <div class=\"card mb-4\">\n <div class=\"card-header\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-plus-circle me-2\"></i>Create New Lab Group\n </h5>\n </div>\n <div class=\"card-body\">\n <form [formGroup]=\"createGroupForm\" (ngSubmit)=\"createLabGroup()\" class=\"row g-3\">\n <div class=\"col-md-6\">\n <div class=\"form-floating\">\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"groupName\" \n formControlName=\"name\"\n [class.is-invalid]=\"createGroupForm.get('name')?.invalid && createGroupForm.get('name')?.touched\"\n placeholder=\"Group name\">\n <label for=\"groupName\">Group Name *</label>\n </div>\n @if (createGroupForm.get('name')?.invalid && createGroupForm.get('name')?.touched) {\n <div class=\"invalid-feedback\">\n @if (createGroupForm.get('name')?.errors?.['required']) {\n Group name is required\n }\n @if (createGroupForm.get('name')?.errors?.['minlength']) {\n Group name must be at least 2 characters\n }\n </div>\n }\n </div>\n <div class=\"col-md-6\">\n <div class=\"form-check form-switch mt-3\">\n <input \n class=\"form-check-input\" \n type=\"checkbox\" \n id=\"allowInvites\" \n formControlName=\"allowMemberInvites\">\n <label class=\"form-check-label\" for=\"allowInvites\">\n <i class=\"bi bi-envelope me-1\"></i>Allow members to invite others\n </label>\n </div>\n </div>\n <div class=\"col-12\">\n <div class=\"form-floating\">\n <textarea \n class=\"form-control\" \n id=\"groupDescription\" \n formControlName=\"description\"\n style=\"height: 100px\"\n placeholder=\"Description\"></textarea>\n <label for=\"groupDescription\">Description (optional)</label>\n </div>\n </div>\n <div class=\"col-12\">\n <div class=\"d-flex gap-2\">\n <button \n type=\"submit\" \n class=\"btn btn-primary\"\n [disabled]=\"createGroupForm.invalid || isCreatingGroup()\">\n @if (isCreatingGroup()) {\n <span class=\"spinner-border spinner-border-sm me-2\" role=\"status\"></span>\n }\n Create Group\n </button>\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"toggleCreateForm()\">\n Cancel\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n }\n\n <!-- Search & Filters Section -->\n <div class=\"card mb-4\">\n <div class=\"card-header\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-search me-2\"></i>Search & Filters\n </h5>\n </div>\n <div class=\"card-body\">\n <form [formGroup]=\"searchForm\" class=\"row g-3\">\n <div class=\"col-md-12\">\n <div class=\"form-floating\">\n <input \n type=\"search\" \n class=\"form-control\" \n id=\"groupSearch\" \n formControlName=\"search\"\n placeholder=\"Search groups...\">\n <label for=\"groupSearch\">\n <i class=\"bi bi-search me-1\"></i>Search Groups\n </label>\n </div>\n </div>\n </form>\n </div>\n </div>\n\n <!-- Groups List -->\n <div class=\"card\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-people me-2\"></i>Lab Groups\n <span class=\"badge bg-primary ms-2\">{{ labGroupsData().count }}</span>\n </h5>\n @if (isLoading()) {\n <div class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n }\n </div>\n <div class=\"card-body p-0\">\n @if (hasLabGroups()) {\n <div class=\"table-responsive\">\n <table class=\"table table-hover mb-0\">\n <thead class=\"table-light\">\n <tr>\n <th scope=\"col\"><i class=\"bi bi-tag me-1\"></i>Group Name</th>\n <th scope=\"col\"><i class=\"bi bi-person me-1\"></i>Creator</th>\n <th scope=\"col\"><i class=\"bi bi-people me-1\"></i>Members</th>\n <th scope=\"col\"><i class=\"bi bi-check-circle me-1\"></i>Status</th>\n <th scope=\"col\"><i class=\"bi bi-calendar me-1\"></i>Created</th>\n <th scope=\"col\" style=\"width: 120px;\"><i class=\"bi bi-gear me-1\"></i>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (group of labGroupsData().results; track group.id) {\n <tr>\n <td>\n <strong>{{ group.name }}</strong>\n @if (group.description) {\n <br><small class=\"text-muted\">{{ group.description }}</small>\n }\n </td>\n <td>{{ group.creatorName || 'Unknown' }}</td>\n <td>\n <span class=\"badge bg-info\">{{ group.memberCount }}</span>\n </td>\n <td>\n @if (group.isActive) {\n <span class=\"badge bg-success\">Active</span>\n } @else {\n <span class=\"badge bg-secondary\">Inactive</span>\n }\n </td>\n <td>\n <small>{{ group.createdAt | date:'short' }}</small>\n </td>\n <td>\n <div class=\"btn-group btn-group-sm\" role=\"group\">\n <button \n type=\"button\"\n class=\"btn btn-outline-info\" \n (click)=\"viewGroupMembers(group)\"\n title=\"View members\">\n <i class=\"bi bi-people\"></i>\n </button>\n @if (group.isMember && !group.isCreator) {\n <button \n type=\"button\"\n class=\"btn btn-outline-warning\" \n (click)=\"leaveGroup(group)\"\n title=\"Leave group\">\n <i class=\"bi bi-box-arrow-right\"></i>\n </button>\n }\n @if (group.canManage) {\n <button \n type=\"button\"\n class=\"btn btn-outline-danger\" \n (click)=\"deleteGroup(group)\"\n title=\"Delete group\">\n <i class=\"bi bi-trash\"></i>\n </button>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <!-- Pagination -->\n @if (showPagination()) {\n <div class=\"d-flex justify-content-center mt-3 p-3\">\n <ngb-pagination\n [collectionSize]=\"labGroupsData().count\"\n [page]=\"currentPage()\"\n [pageSize]=\"pageSize()\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"true\"\n [rotate]=\"true\"\n (pageChange)=\"onPageChange($event)\"\n class=\"pagination-sm\">\n </ngb-pagination>\n </div>\n }\n } @else {\n <div class=\"text-center py-5\">\n <div class=\"text-muted\">\n <i class=\"bi bi-people display-1 mb-3\"></i>\n <h5>No Lab Groups Found</h5>\n <p>\n @if (hasSearchValue()) {\n Try adjusting your search criteria or create a new lab group.\n } @else {\n Get started by creating your first lab group.\n }\n </p>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"toggleCreateForm()\">\n <i class=\"bi bi-plus me-1\"></i>Create First Lab Group\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n</div>\n\n<!-- Group Members Modal -->\n@if (selectedGroupForMembers()) {\n <div class=\"modal-backdrop fade show\"></div>\n <div class=\"modal fade show d-block\" tabindex=\"-1\">\n <div class=\"modal-dialog modal-lg\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">\n <i class=\"bi bi-people me-2\"></i>{{ currentGroupName() }} - Members\n </h5>\n <button type=\"button\" class=\"btn-close\" (click)=\"closeGroupDetails()\"></button>\n </div>\n <div class=\"modal-body\">\n <!-- Invite Form -->\n @if (canInviteToCurrentGroup()) {\n <div class=\"card mb-4\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-envelope me-2\"></i>Invite Member\n </h6>\n <button \n type=\"button\"\n class=\"btn btn-sm btn-outline-primary\" \n (click)=\"toggleInviteForm()\">\n @if (showInviteForm()) {\n Cancel\n } @else {\n <i class=\"bi bi-plus me-1\"></i>Invite\n }\n </button>\n </div>\n @if (showInviteForm()) {\n <div class=\"card-body\">\n <form [formGroup]=\"inviteForm\" (ngSubmit)=\"inviteMember()\" class=\"row g-3\">\n <div class=\"col-md-8\">\n <div class=\"form-floating\">\n <input \n type=\"email\" \n class=\"form-control\" \n id=\"inviteEmail\" \n formControlName=\"invitedEmail\"\n [class.is-invalid]=\"inviteForm.get('invitedEmail')?.invalid && inviteForm.get('invitedEmail')?.touched\"\n placeholder=\"Email address\">\n <label for=\"inviteEmail\">Email Address *</label>\n </div>\n @if (inviteForm.get('invitedEmail')?.invalid && inviteForm.get('invitedEmail')?.touched) {\n <div class=\"invalid-feedback\">\n @if (inviteForm.get('invitedEmail')?.errors?.['required']) {\n Email is required\n }\n @if (inviteForm.get('invitedEmail')?.errors?.['email']) {\n Please enter a valid email address\n }\n </div>\n }\n </div>\n <div class=\"col-md-4\">\n <button \n type=\"submit\" \n class=\"btn btn-primary w-100 h-100\"\n [disabled]=\"inviteForm.invalid || isInviting()\">\n @if (isInviting()) {\n <span class=\"spinner-border spinner-border-sm me-2\" role=\"status\"></span>\n }\n Send Invite\n </button>\n </div>\n <div class=\"col-12\">\n <div class=\"form-floating\">\n <textarea \n class=\"form-control\" \n id=\"inviteMessage\" \n formControlName=\"message\"\n style=\"height: 80px\"\n placeholder=\"Message\"></textarea>\n <label for=\"inviteMessage\">Message (optional)</label>\n </div>\n </div>\n </form>\n </div>\n }\n </div>\n }\n\n <!-- Current Members -->\n <div class=\"card mb-3\">\n <div class=\"card-header\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-people me-2\"></i>Current Members ({{ groupMembersCount() }})\n </h6>\n @if (hasSubGroups()) {\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"directMembersOnly\"\n [checked]=\"directMembersOnly()\"\n (change)=\"toggleDirectMembersOnly()\">\n <label class=\"form-check-label small\" for=\"directMembersOnly\">\n Direct only\n </label>\n </div>\n }\n </div>\n </div>\n <div class=\"card-body p-0\">\n @if (hasGroupMembers()) {\n <div class=\"list-group list-group-flush\">\n @for (member of groupMembers(); track member.id) {\n <div class=\"list-group-item d-flex justify-content-between align-items-center\">\n <div>\n <strong>{{ member.firstName }} {{ member.lastName }}</strong>\n <br>\n <small class=\"text-muted\">{{ member.email }}</small>\n @if (selectedGroupForMembers() && member.id === selectedGroupForMembers()!.creator) {\n <span class=\"badge bg-warning ms-2\">Creator</span>\n }\n </div>\n @if (canManageCurrentGroup() && selectedGroupForMembers() && member.id !== selectedGroupForMembers()!.creator) {\n <button \n type=\"button\"\n class=\"btn btn-outline-danger btn-sm\" \n (click)=\"removeMember(member.id)\"\n title=\"Remove member\">\n <i class=\"bi bi-person-dash\"></i>\n </button>\n }\n </div>\n }\n </div>\n } @else {\n <div class=\"text-center py-3 text-muted\">\n <i class=\"bi bi-people fs-4 mb-2\"></i>\n <div>No members found</div>\n </div>\n }\n </div>\n @if (showMemberPagination()) {\n <div class=\"card-footer\">\n <div class=\"d-flex justify-content-center\">\n <ngb-pagination\n [collectionSize]=\"memberTotal()\"\n [page]=\"memberPage()\"\n [pageSize]=\"memberPageSize()\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"true\"\n [rotate]=\"true\"\n (pageChange)=\"onMemberPageChange($event)\"\n class=\"pagination-sm mb-0\">\n </ngb-pagination>\n </div>\n </div>\n }\n </div>\n\n <!-- Pending Invitations -->\n @if (hasPendingInvitations()) {\n <div class=\"card\">\n <div class=\"card-header\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-clock me-2\"></i>Pending Invitations ({{ pendingInvitationsCount() }})\n </h6>\n </div>\n <div class=\"card-body p-0\">\n <div class=\"list-group list-group-flush\">\n @for (invitation of pendingInvitations(); track invitation.id) {\n <div class=\"list-group-item d-flex justify-content-between align-items-center\">\n <div>\n <strong>{{ invitation.invitedEmail }}</strong>\n <br>\n <small class=\"text-muted\">\n Invited by {{ invitation.inviterName }} on {{ invitation.createdAt | date:'short' }}\n </small>\n @if (invitation.message) {\n <br>\n <small class=\"text-info\">{{ invitation.message }}</small>\n }\n </div>\n @if (canManageCurrentGroup()) {\n <button \n type=\"button\"\n class=\"btn btn-outline-danger btn-sm\" \n (click)=\"cancelInvitation(invitation.id)\"\n title=\"Cancel invitation\">\n <i class=\"bi bi-x-circle\"></i>\n </button>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"closeGroupDetails()\">\n Close\n </button>\n </div>\n </div>\n </div>\n </div>\n}","import { Component, OnInit, signal, inject, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbModule } from '@ng-bootstrap/ng-bootstrap';\nimport { ApiService } from '../../../services/api';\nimport { AuthService } from '../../../services/auth';\nimport { User, UserProfileUpdateRequest, PasswordChangeRequest, EmailChangeRequest } from '../../../models';\nimport { UserManagementService } from '../../../services/user-management';\n\n@Component({\n selector: 'ccc-user-profile',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbModule],\n templateUrl: './user-profile.html',\n styleUrl: './user-profile.scss'\n})\nexport class UserProfileComponent implements OnInit {\n private fb = inject(FormBuilder);\n private userManagementService = inject(UserManagementService);\n private authService = inject(AuthService);\n\n // User data\n currentUser = signal<User | null>(null);\n isLoading = signal(false);\n \n // Forms\n profileForm: FormGroup;\n passwordForm: FormGroup;\n emailChangeForm: FormGroup;\n \n // UI state\n activeTab = signal<'profile' | 'password' | 'email' | 'account'>('profile');\n isUpdatingProfile = signal(false);\n isChangingPassword = signal(false);\n isChangingEmail = signal(false);\n \n // Success/error messages\n profileMessage = signal<string>('');\n passwordMessage = signal<string>('');\n emailMessage = signal<string>('');\n errorMessage = signal<string>('');\n\n // Computed signals for derived values\n fullName = computed(() => {\n const user = this.currentUser();\n return user ? `${user.firstName} ${user.lastName}`.trim() : '';\n });\n\n isStaff = computed(() => this.currentUser()?.isStaff || false);\n\n joinDate = computed(() => {\n const user = this.currentUser();\n return user?.dateJoined ? new Date(user.dateJoined).toLocaleDateString() : '';\n });\n\n lastLogin = computed(() => {\n const user = this.currentUser();\n return user?.lastLogin ? new Date(user.lastLogin).toLocaleDateString() : 'Never';\n });\n\n constructor() {\n this.profileForm = this.fb.group({\n firstName: ['', [Validators.required, Validators.maxLength(30)]],\n lastName: ['', [Validators.required, Validators.maxLength(30)]],\n currentPassword: ['', [Validators.required]]\n });\n\n this.passwordForm = this.fb.group({\n currentPassword: ['', [Validators.required]],\n newPassword: ['', [Validators.required, Validators.minLength(8)]],\n confirmPassword: ['', [Validators.required]]\n }, { validators: this.passwordMatchValidator });\n\n this.emailChangeForm = this.fb.group({\n newEmail: ['', [Validators.required, Validators.email]],\n currentPassword: ['', [Validators.required]]\n });\n }\n\n ngOnInit() {\n this.loadUserProfile();\n }\n\n loadUserProfile(): void {\n this.isLoading.set(true);\n this.userManagementService.getUserProfile().subscribe({\n next: (response) => {\n this.currentUser.set(response.user);\n this.profileForm.patchValue({\n firstName: response.user.firstName,\n lastName: response.user.lastName\n });\n this.isLoading.set(false);\n },\n error: (error) => {\n this.errorMessage.set('Failed to load user profile');\n this.isLoading.set(false);\n }\n });\n }\n\n updateProfile(): void {\n if (this.profileForm.valid) {\n this.isUpdatingProfile.set(true);\n this.profileMessage.set('');\n this.errorMessage.set('');\n\n const profileData: UserProfileUpdateRequest = {\n firstName: this.profileForm.get('firstName')?.value,\n lastName: this.profileForm.get('lastName')?.value,\n currentPassword: this.profileForm.get('currentPassword')?.value\n };\n\n this.userManagementService.updateProfile(profileData).subscribe({\n next: (response) => {\n this.profileMessage.set('Profile updated successfully');\n this.currentUser.set(response.user);\n this.profileForm.get('currentPassword')?.setValue('');\n this.isUpdatingProfile.set(false);\n },\n error: (error) => {\n this.errorMessage.set(error.error?.message || 'Failed to update profile');\n this.isUpdatingProfile.set(false);\n }\n });\n }\n }\n\n changePassword(): void {\n if (this.passwordForm.valid) {\n this.isChangingPassword.set(true);\n this.passwordMessage.set('');\n this.errorMessage.set('');\n\n const passwordData: PasswordChangeRequest = {\n currentPassword: this.passwordForm.get('currentPassword')?.value,\n newPassword: this.passwordForm.get('newPassword')?.value,\n confirmPassword: this.passwordForm.get('confirmPassword')?.value\n };\n\n this.userManagementService.changePassword(passwordData).subscribe({\n next: (response) => {\n this.passwordMessage.set('Password changed successfully');\n this.passwordForm.reset();\n this.isChangingPassword.set(false);\n },\n error: (error) => {\n this.errorMessage.set(error.error?.message || 'Failed to change password');\n this.isChangingPassword.set(false);\n }\n });\n }\n }\n\n requestEmailChange(): void {\n if (this.emailChangeForm.valid) {\n this.isChangingEmail.set(true);\n this.emailMessage.set('');\n this.errorMessage.set('');\n\n const emailData: EmailChangeRequest = {\n newEmail: this.emailChangeForm.get('newEmail')?.value,\n currentPassword: this.emailChangeForm.get('currentPassword')?.value\n };\n\n this.userManagementService.requestEmailChange(emailData).subscribe({\n next: (response) => {\n this.emailMessage.set(`Verification email sent to ${response.new_email}. Please check your inbox and follow the instructions.`);\n this.emailChangeForm.reset();\n this.isChangingEmail.set(false);\n },\n error: (error) => {\n this.errorMessage.set(error.error?.message || 'Failed to request email change');\n this.isChangingEmail.set(false);\n }\n });\n }\n }\n\n setActiveTab(tab: 'profile' | 'password' | 'email' | 'account'): void {\n this.activeTab.set(tab);\n // Clear messages when switching tabs\n this.profileMessage.set('');\n this.passwordMessage.set('');\n this.emailMessage.set('');\n this.errorMessage.set('');\n }\n\n private passwordMatchValidator(form: FormGroup) {\n const newPassword = form.get('newPassword');\n const confirmPassword = form.get('confirmPassword');\n \n if (newPassword && confirmPassword && newPassword.value !== confirmPassword.value) {\n return { passwordMismatch: true };\n }\n return null;\n }\n\n}","<div class=\"user-profile-container\">\n <!-- Header Section -->\n <nav class=\"navbar navbar-expand-lg bg-body-tertiary shadow-sm\">\n <div class=\"container-fluid\">\n <div class=\"d-flex align-items-center justify-content-between w-100\">\n <div class=\"d-flex align-items-center\">\n <h4 class=\"mb-0\">\n <i class=\"bi bi-person-circle me-2 text-primary\"></i>User Profile\n </h4>\n @if (isStaff()) {\n <span class=\"badge bg-warning ms-3\">Staff</span>\n }\n </div>\n </div>\n </div>\n </nav>\n\n <div class=\"profile-content p-4\">\n @if (isLoading()) {\n <div class=\"text-center\">\n <div class=\"spinner-border text-primary me-2\"></div>\n <span>Loading profile...</span>\n </div>\n } @else {\n <!-- User Info Card -->\n <div class=\"card mb-4\">\n <div class=\"card-header\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-info-circle me-2\"></i>Account Information\n </h5>\n </div>\n <div class=\"card-body\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <small class=\"text-muted\">Full Name:</small>\n <div class=\"fw-semibold\">{{ fullName() }}</div>\n </div>\n <div class=\"col-md-6\">\n <small class=\"text-muted\">Username:</small>\n <div class=\"fw-semibold\">{{ currentUser()?.username }}</div>\n </div>\n </div>\n <div class=\"row mt-3\">\n <div class=\"col-md-6\">\n <small class=\"text-muted\">Email:</small>\n <div class=\"fw-semibold\">{{ currentUser()?.email }}</div>\n </div>\n <div class=\"col-md-6\">\n <small class=\"text-muted\">Account Status:</small>\n <div>\n @if (currentUser()?.isActive) {\n <span class=\"badge bg-success\">Active</span>\n } @else {\n <span class=\"badge bg-danger\">Inactive</span>\n }\n </div>\n </div>\n </div>\n <div class=\"row mt-3\">\n <div class=\"col-md-6\">\n <small class=\"text-muted\">Member Since:</small>\n <div class=\"fw-semibold\">{{ joinDate() }}</div>\n </div>\n <div class=\"col-md-6\">\n <small class=\"text-muted\">Last Login:</small>\n <div class=\"fw-semibold\">{{ lastLogin() }}</div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Navigation Tabs -->\n <ul ngbNav #profileNav=\"ngbNav\" [activeId]=\"activeTab()\" (activeIdChange)=\"setActiveTab($event)\" class=\"nav-tabs\">\n <li [ngbNavItem]=\"'profile'\">\n <button ngbNavLink (click)=\"setActiveTab('profile')\">\n <i class=\"bi bi-person me-1\"></i>Profile Settings\n </button>\n <ng-template ngbNavContent>\n <div class=\"mt-4\">\n <!-- Profile Update Form -->\n <div class=\"card\">\n <div class=\"card-header\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-pencil-square me-2\"></i>Update Profile Information\n </h6>\n </div>\n <div class=\"card-body\">\n <form [formGroup]=\"profileForm\" (ngSubmit)=\"updateProfile()\">\n <div class=\"row g-3\">\n <div class=\"col-md-6\">\n <label for=\"firstName\" class=\"form-label\">First Name</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"firstName\"\n formControlName=\"firstName\"\n [class.is-invalid]=\"profileForm.get('firstName')?.invalid && profileForm.get('firstName')?.touched\">\n @if (profileForm.get('firstName')?.invalid && profileForm.get('firstName')?.touched) {\n <div class=\"invalid-feedback\">\n First name is required (max 30 characters)\n </div>\n }\n </div>\n <div class=\"col-md-6\">\n <label for=\"lastName\" class=\"form-label\">Last Name</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"lastName\"\n formControlName=\"lastName\"\n [class.is-invalid]=\"profileForm.get('lastName')?.invalid && profileForm.get('lastName')?.touched\">\n @if (profileForm.get('lastName')?.invalid && profileForm.get('lastName')?.touched) {\n <div class=\"invalid-feedback\">\n Last name is required (max 30 characters)\n </div>\n }\n </div>\n </div>\n <div class=\"mt-3\">\n <label for=\"currentPassword\" class=\"form-label\">Current Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"currentPassword\"\n formControlName=\"currentPassword\"\n placeholder=\"Enter your current password to confirm changes\"\n [class.is-invalid]=\"profileForm.get('currentPassword')?.invalid && profileForm.get('currentPassword')?.touched\">\n @if (profileForm.get('currentPassword')?.invalid && profileForm.get('currentPassword')?.touched) {\n <div class=\"invalid-feedback\">\n Current password is required to update profile\n </div>\n }\n </div>\n\n @if (profileMessage()) {\n <div class=\"alert alert-success mt-3\">\n <i class=\"bi bi-check-circle me-2\"></i>{{ profileMessage() }}\n </div>\n }\n\n <div class=\"mt-3\">\n <button\n type=\"submit\"\n class=\"btn btn-primary\"\n [disabled]=\"profileForm.invalid || isUpdatingProfile()\">\n @if (isUpdatingProfile()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-check-circle me-1\"></i>\n Update Profile\n </button>\n </div>\n </form>\n </div>\n </div>\n </div>\n </ng-template>\n </li>\n\n <li [ngbNavItem]=\"'password'\">\n <button ngbNavLink (click)=\"setActiveTab('password')\">\n <i class=\"bi bi-shield-lock me-1\"></i>Change Password\n </button>\n <ng-template ngbNavContent>\n <div class=\"mt-4\">\n <!-- Password Change Form -->\n <div class=\"card\">\n <div class=\"card-header\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-shield-lock me-2\"></i>Change Password\n </h6>\n </div>\n <div class=\"card-body\">\n <form [formGroup]=\"passwordForm\" (ngSubmit)=\"changePassword()\">\n <div class=\"mb-3\">\n <label for=\"currentPasswordChange\" class=\"form-label\">Current Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"currentPasswordChange\"\n formControlName=\"currentPassword\"\n [class.is-invalid]=\"passwordForm.get('currentPassword')?.invalid && passwordForm.get('currentPassword')?.touched\">\n @if (passwordForm.get('currentPassword')?.invalid && passwordForm.get('currentPassword')?.touched) {\n <div class=\"invalid-feedback\">\n Current password is required\n </div>\n }\n </div>\n <div class=\"mb-3\">\n <label for=\"newPassword\" class=\"form-label\">New Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"newPassword\"\n formControlName=\"newPassword\"\n [class.is-invalid]=\"passwordForm.get('newPassword')?.invalid && passwordForm.get('newPassword')?.touched\">\n @if (passwordForm.get('newPassword')?.invalid && passwordForm.get('newPassword')?.touched) {\n <div class=\"invalid-feedback\">\n Password must be at least 8 characters long\n </div>\n }\n </div>\n <div class=\"mb-3\">\n <label for=\"confirmPassword\" class=\"form-label\">Confirm New Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"confirmPassword\"\n formControlName=\"confirmPassword\"\n [class.is-invalid]=\"(passwordForm.get('confirmPassword')?.invalid || passwordForm.hasError('passwordMismatch')) && passwordForm.get('confirmPassword')?.touched\">\n @if (passwordForm.get('confirmPassword')?.invalid && passwordForm.get('confirmPassword')?.touched) {\n <div class=\"invalid-feedback\">\n Please confirm your new password\n </div>\n }\n @if (passwordForm.hasError('passwordMismatch') && passwordForm.get('confirmPassword')?.touched) {\n <div class=\"invalid-feedback\">\n Passwords do not match\n </div>\n }\n </div>\n\n @if (passwordMessage()) {\n <div class=\"alert alert-success\">\n <i class=\"bi bi-check-circle me-2\"></i>{{ passwordMessage() }}\n </div>\n }\n\n <button\n type=\"submit\"\n class=\"btn btn-primary\"\n [disabled]=\"passwordForm.invalid || isChangingPassword()\">\n @if (isChangingPassword()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-shield-check me-1\"></i>\n Change Password\n </button>\n </form>\n </div>\n </div>\n </div>\n </ng-template>\n </li>\n\n <li [ngbNavItem]=\"'email'\">\n <button ngbNavLink (click)=\"setActiveTab('email')\">\n <i class=\"bi bi-envelope me-1\"></i>Change Email\n </button>\n <ng-template ngbNavContent>\n <div class=\"mt-4\">\n <!-- Email Change Form -->\n <div class=\"card\">\n <div class=\"card-header\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-envelope me-2\"></i>Change Email Address\n </h6>\n </div>\n <div class=\"card-body\">\n <div class=\"alert alert-info\">\n <i class=\"bi bi-info-circle me-2\"></i>\n Changing your email will require verification. You'll receive a confirmation email at your new address.\n </div>\n \n <form [formGroup]=\"emailChangeForm\" (ngSubmit)=\"requestEmailChange()\">\n <div class=\"mb-3\">\n <label for=\"currentEmail\" class=\"form-label\">Current Email</label>\n <input\n type=\"email\"\n class=\"form-control\"\n id=\"currentEmail\"\n [value]=\"currentUser()?.email\"\n readonly>\n </div>\n <div class=\"mb-3\">\n <label for=\"newEmail\" class=\"form-label\">New Email</label>\n <input\n type=\"email\"\n class=\"form-control\"\n id=\"newEmail\"\n formControlName=\"newEmail\"\n [class.is-invalid]=\"emailChangeForm.get('newEmail')?.invalid && emailChangeForm.get('newEmail')?.touched\">\n @if (emailChangeForm.get('newEmail')?.invalid && emailChangeForm.get('newEmail')?.touched) {\n <div class=\"invalid-feedback\">\n Please enter a valid email address\n </div>\n }\n </div>\n <div class=\"mb-3\">\n <label for=\"passwordEmailChange\" class=\"form-label\">Current Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"passwordEmailChange\"\n formControlName=\"currentPassword\"\n [class.is-invalid]=\"emailChangeForm.get('currentPassword')?.invalid && emailChangeForm.get('currentPassword')?.touched\">\n @if (emailChangeForm.get('currentPassword')?.invalid && emailChangeForm.get('currentPassword')?.touched) {\n <div class=\"invalid-feedback\">\n Current password is required\n </div>\n }\n </div>\n\n @if (emailMessage()) {\n <div class=\"alert alert-success\">\n <i class=\"bi bi-check-circle me-2\"></i>{{ emailMessage() }}\n </div>\n }\n\n <button\n type=\"submit\"\n class=\"btn btn-primary\"\n [disabled]=\"emailChangeForm.invalid || isChangingEmail()\">\n @if (isChangingEmail()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-envelope-check me-1\"></i>\n Request Email Change\n </button>\n </form>\n </div>\n </div>\n </div>\n </ng-template>\n </li>\n </ul>\n\n <div [ngbNavOutlet]=\"profileNav\" class=\"mt-3\"></div>\n\n <!-- Error Messages -->\n @if (errorMessage()) {\n <div class=\"alert alert-danger mt-3\">\n <i class=\"bi bi-exclamation-triangle me-2\"></i>{{ errorMessage() }}\n </div>\n }\n }\n </div>\n</div>","import { Component, inject, OnInit, signal, computed } from '@angular/core';\r\nimport { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NgbAlert } from '@ng-bootstrap/ng-bootstrap';\r\nimport { SiteConfigService } from '../../services/site-config';\r\nimport { SiteConfig } from '../../models';\r\n\r\n@Component({\r\n selector: 'ccc-site-config',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, NgbAlert],\r\n templateUrl: './site-config.html',\r\n styleUrl: './site-config.scss'\r\n})\r\nexport class SiteConfigComponent implements OnInit {\r\n private fb = inject(FormBuilder);\r\n private siteConfigService = inject(SiteConfigService);\r\n\r\n configForm: FormGroup;\r\n \r\n // Signals for reactive state management\r\n loading = signal(false);\r\n error = signal<string | null>(null);\r\n success = signal<string | null>(null);\r\n selectedLogoFile = signal<File | null>(null);\r\n currentConfig = signal<SiteConfig | null>(null);\r\n\r\n // Computed signal for preview configuration\r\n previewConfig = computed(() => {\r\n if (!this.currentConfig()) return null;\r\n return { ...this.currentConfig()!, ...this.configForm.value };\r\n });\r\n\r\n constructor() {\r\n this.configForm = this.fb.group({\r\n siteName: ['', [Validators.required, Validators.minLength(1), Validators.maxLength(255)]],\r\n logoUrl: [''],\r\n primaryColor: ['#1976d2', [Validators.pattern(/^#[0-9A-Fa-f]{6}$/)]],\r\n showPoweredBy: [true],\r\n allowUserRegistration: [false],\r\n enableOrcidLogin: [false]\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n // Load current configuration for admin (authenticated endpoint)\r\n this.siteConfigService.getCurrentConfig().subscribe({\r\n next: (config) => {\r\n this.currentConfig.set(config);\r\n this.configForm.patchValue(config);\r\n },\r\n error: (error) => {\r\n this.error.set('Failed to load current configuration.');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Update site configuration\r\n */\r\n onSubmit() {\r\n if (this.configForm.valid) {\r\n this.loading.set(true);\r\n this.error.set(null);\r\n this.success.set(null);\r\n\r\n const config: Partial<SiteConfig> = this.configForm.value;\r\n\r\n this.siteConfigService.updateConfig(config).subscribe({\r\n next: (updatedConfig) => {\r\n this.loading.set(false);\r\n this.success.set('Site configuration updated successfully!');\r\n this.currentConfig.set(updatedConfig);\r\n\r\n localStorage.setItem('site_config', JSON.stringify(updatedConfig));\r\n\r\n setTimeout(() => {\r\n this.success.set(null);\r\n }, 3000);\r\n },\r\n error: (error) => {\r\n this.loading.set(false);\r\n this.error.set(error.error?.detail || 'Failed to update site configuration.');\r\n\r\n setTimeout(() => {\r\n this.error.set(null);\r\n }, 5000);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Reset form to current configuration\r\n */\r\n resetForm() {\r\n if (this.currentConfig()) {\r\n this.configForm.patchValue(this.currentConfig()!);\r\n }\r\n this.error.set(null);\r\n this.success.set(null);\r\n }\r\n\r\n /**\r\n * Get a darker version of the given color for gradients\r\n */\r\n getDarkerColor(hex: string): string {\r\n if (!hex || !hex.startsWith('#')) {\r\n return '#1565c0'; // Default darker color\r\n }\r\n \r\n // Remove # and convert to RGB\r\n const r = parseInt(hex.slice(1, 3), 16);\r\n const g = parseInt(hex.slice(3, 5), 16);\r\n const b = parseInt(hex.slice(5, 7), 16);\r\n \r\n // Darken by 20%\r\n const factor = 0.8;\r\n const darkR = Math.floor(r * factor);\r\n const darkG = Math.floor(g * factor);\r\n const darkB = Math.floor(b * factor);\r\n \r\n // Convert back to hex\r\n const toHex = (n: number) => n.toString(16).padStart(2, '0');\r\n return `#${toHex(darkR)}${toHex(darkG)}${toHex(darkB)}`;\r\n }\r\n\r\n /**\r\n * Get the current primary color value for styling\r\n */\r\n getCurrentPrimaryColor(): string {\r\n return this.configForm.get('primaryColor')?.value || '#1976d2';\r\n }\r\n\r\n /**\r\n * Clear error message\r\n */\r\n clearError() {\r\n this.error.set(null);\r\n }\r\n\r\n /**\r\n * Clear success message\r\n */\r\n clearSuccess() {\r\n this.success.set(null);\r\n }\r\n\r\n /**\r\n * Handle logo file selection\r\n */\r\n onLogoFileSelected(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n if (target.files && target.files.length > 0) {\r\n const file = target.files[0];\r\n\r\n // Validate file type\r\n const allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml'];\r\n if (!allowedTypes.includes(file.type)) {\r\n this.error.set('Please select a valid image file (JPEG, PNG, GIF, or SVG).');\r\n this.selectedLogoFile.set(null);\r\n target.value = '';\r\n return;\r\n }\r\n\r\n // Validate file size (max 5MB)\r\n const maxSize = 5 * 1024 * 1024; // 5MB\r\n if (file.size > maxSize) {\r\n this.error.set('Logo file size must be less than 5MB.');\r\n this.selectedLogoFile.set(null);\r\n target.value = '';\r\n return;\r\n }\r\n\r\n this.selectedLogoFile.set(file);\r\n this.error.set(null);\r\n }\r\n }\r\n\r\n /**\r\n * Remove selected logo file\r\n */\r\n clearLogoFile() {\r\n this.selectedLogoFile.set(null);\r\n const fileInput = document.querySelector('input[type=\"file\"]') as HTMLInputElement;\r\n if (fileInput) {\r\n fileInput.value = '';\r\n }\r\n }\r\n\r\n}\r\n","<div class=\"site-config-container\">\r\n <!-- Header Section -->\r\n <nav class=\"navbar navbar-expand-lg bg-body-tertiary shadow-sm\">\r\n <div class=\"container-fluid\">\r\n <div class=\"d-flex align-items-center justify-content-between w-100\">\r\n <div class=\"d-flex align-items-center\">\r\n <h4 class=\"navbar-brand m-0 fw-bold\">\r\n <i class=\"bi bi-gear me-2\"></i>Site Configuration\r\n </h4>\r\n </div>\r\n <div class=\"d-flex gap-2\">\r\n <button \r\n type=\"submit\" \r\n form=\"configForm\"\r\n class=\"btn btn-primary btn-sm\"\r\n [disabled]=\"configForm.invalid || loading()\">\r\n @if (loading()) {\r\n <span class=\"spinner-border spinner-border-sm me-1\" aria-hidden=\"true\"></span>\r\n } @else {\r\n <i class=\"bi bi-check-lg me-1\"></i>\r\n }\r\n Save Configuration\r\n </button>\r\n \r\n <button \r\n type=\"button\" \r\n class=\"btn btn-outline-secondary btn-sm\"\r\n (click)=\"resetForm()\"\r\n [disabled]=\"loading()\">\r\n <i class=\"bi bi-arrow-clockwise me-1\"></i>\r\n Reset\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </nav>\r\n\r\n <div class=\"config-content p-4\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-8\">\r\n <!-- Site Branding Card -->\r\n <div class=\"card mb-4\">\r\n <div class=\"card-header\">\r\n <h5 class=\"mb-0\">\r\n <i class=\"bi bi-brush me-2\"></i>Site Branding\r\n </h5>\r\n </div>\r\n <div class=\"card-body\">\r\n <!-- Success Alert -->\r\n @if (success()) {\r\n <ngb-alert type=\"success\" (closed)=\"clearSuccess()\" [dismissible]=\"true\">\r\n <i class=\"bi bi-check-circle me-2\"></i>{{ success() }}\r\n </ngb-alert>\r\n }\r\n\r\n <!-- Error Alert -->\r\n @if (error()) {\r\n <ngb-alert type=\"danger\" (closed)=\"clearError()\" [dismissible]=\"true\">\r\n <i class=\"bi bi-exclamation-triangle me-2\"></i>{{ error() }}\r\n </ngb-alert>\r\n }\r\n\r\n <form id=\"configForm\" [formGroup]=\"configForm\" (ngSubmit)=\"onSubmit()\">\r\n <!-- Site Name -->\r\n <div class=\"mb-3\">\r\n <label for=\"site_name\" class=\"form-label\">\r\n <i class=\"bi bi-building me-1\"></i>\r\n Site Name <span class=\"text-danger\">*</span>\r\n </label>\r\n <input \r\n type=\"text\" \r\n class=\"form-control\" \r\n id=\"site_name\"\r\n formControlName=\"siteName\"\r\n [class.is-invalid]=\"configForm.get('siteName')?.invalid && configForm.get('siteName')?.touched\"\r\n placeholder=\"Enter your site name\">\r\n @if (configForm.get('siteName')?.invalid && configForm.get('siteName')?.touched) {\r\n <div class=\"invalid-feedback\">\r\n @if (configForm.get('siteName')?.errors?.['required']) {\r\n <span>Site name is required</span>\r\n }\r\n @if (configForm.get('siteName')?.errors?.['minlength']) {\r\n <span>Site name must be at least 1 character</span>\r\n }\r\n @if (configForm.get('siteName')?.errors?.['maxlength']) {\r\n <span>Site name must be less than 255 characters</span>\r\n }\r\n </div>\r\n }\r\n <div class=\"form-text\">\r\n This will appear in the navigation bar and login page\r\n </div>\r\n </div>\r\n\r\n <!-- Logo URL -->\r\n <div class=\"mb-3\">\r\n <label for=\"logo_url\" class=\"form-label\">\r\n <i class=\"bi bi-image me-1\"></i>\r\n Logo URL\r\n </label>\r\n <input \r\n type=\"url\" \r\n class=\"form-control\" \r\n id=\"logo_url\"\r\n formControlName=\"logoUrl\"\r\n placeholder=\"https://example.com/logo.png\">\r\n <div class=\"form-text\">\r\n Optional: URL to your organization's logo\r\n </div>\r\n </div>\r\n\r\n <!-- Logo File Upload -->\r\n <div class=\"mb-3\">\r\n <label for=\"logo_file\" class=\"form-label\">\r\n <i class=\"bi bi-upload me-1\"></i>\r\n Upload Logo File\r\n </label>\r\n <input \r\n type=\"file\" \r\n class=\"form-control\" \r\n id=\"logo_file\"\r\n accept=\"image/*\"\r\n (change)=\"onLogoFileSelected($event)\">\r\n <div class=\"form-text\">\r\n Upload a logo file (overrides logo URL). Supported: JPEG, PNG, GIF, SVG. Max 5MB.\r\n </div>\r\n @if (selectedLogoFile()) {\r\n <div class=\"mt-2\">\r\n <div class=\"alert alert-info py-2\">\r\n <i class=\"bi bi-file-image me-1\"></i>\r\n Selected: {{ selectedLogoFile()?.name }}\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger ms-2\" (click)=\"clearLogoFile()\">\r\n <i class=\"bi bi-x\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Primary Color -->\r\n <div class=\"mb-3\">\r\n <label for=\"primary_color\" class=\"form-label\">\r\n <i class=\"bi bi-palette me-1\"></i>\r\n Primary Color\r\n </label>\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <input\r\n type=\"color\"\r\n id=\"primary_color\"\r\n class=\"form-control form-control-color\"\r\n formControlName=\"primaryColor\"\r\n style=\"width: 60px; height: 40px;\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n formControlName=\"primaryColor\"\r\n placeholder=\"#1976d2\"\r\n [class.is-invalid]=\"configForm.get('primaryColor')?.invalid && configForm.get('primaryColor')?.touched\">\r\n </div>\r\n @if (configForm.get('primaryColor')?.invalid && configForm.get('primaryColor')?.touched) {\r\n <div class=\"invalid-feedback\">\r\n @if (configForm.get('primaryColor')?.errors?.['pattern']) {\r\n <span>Please enter a valid hex color (e.g., #1976d2)</span>\r\n }\r\n </div>\r\n }\r\n <div class=\"form-text\">\r\n Main theme color for navigation and buttons\r\n </div>\r\n </div>\r\n\r\n <!-- Show Powered By -->\r\n <div class=\"mb-4\">\r\n <div class=\"form-check\">\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n id=\"show_powered_by\"\r\n formControlName=\"showPoweredBy\">\r\n <label class=\"form-check-label\" for=\"show_powered_by\">\r\n <i class=\"bi bi-lightning-charge me-1\"></i>\r\n Show \"Powered by CUPCAKE Vanilla\"\r\n </label>\r\n </div>\r\n <div class=\"form-text\">\r\n Display a small footer credit (appears on hover in bottom-right corner)\r\n </div>\r\n </div>\r\n\r\n <!-- Authentication Settings Section -->\r\n <div class=\"mb-4\">\r\n <h6 class=\"text-muted border-bottom pb-2\">\r\n <i class=\"bi bi-shield-lock me-2\"></i>Authentication Settings\r\n </h6>\r\n \r\n <!-- Allow User Registration -->\r\n <div class=\"mb-3\">\r\n <div class=\"form-check\">\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n id=\"allow_user_registration\"\r\n formControlName=\"allowUserRegistration\">\r\n <label class=\"form-check-label\" for=\"allow_user_registration\">\r\n <i class=\"bi bi-person-plus me-1\"></i>\r\n Allow Public User Registration\r\n </label>\r\n </div>\r\n <div class=\"form-text\">\r\n When enabled, users can register new accounts without admin approval. \r\n The registration API endpoint will be accessible to the public.\r\n </div>\r\n </div>\r\n\r\n <!-- Enable ORCID Login -->\r\n <div class=\"mb-3\">\r\n <div class=\"form-check\">\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n id=\"enable_orcid_login\"\r\n formControlName=\"enableOrcidLogin\">\r\n <label class=\"form-check-label\" for=\"enable_orcid_login\">\r\n <i class=\"bi bi-person-badge me-1\"></i>\r\n Enable ORCID OAuth Login\r\n </label>\r\n </div>\r\n <div class=\"form-text\">\r\n Allow users to log in using their ORCID account. \r\n Requires ORCID OAuth configuration in server settings.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </form>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"col-lg-4\">\r\n <!-- Preview Panel -->\r\n <div class=\"card mb-4\">\r\n <div class=\"card-header\">\r\n <h5 class=\"mb-0\">\r\n <i class=\"bi bi-eye me-2\"></i>Preview\r\n </h5>\r\n </div>\r\n <div class=\"card-body\">\r\n <div class=\"preview-navbar mb-3\" \r\n [style.background]=\"'linear-gradient(135deg, ' + (configForm.get('primaryColor')?.value || '#1976d2') + ' 0%, ' + getDarkerColor(configForm.get('primaryColor')?.value || '#1976d2') + ' 100%)'\">\r\n <div class=\"preview-nav\">\r\n <span class=\"preview-brand\">\r\n @if (configForm.get('logoUrl')?.value) {\r\n <img [src]=\"configForm.get('logoUrl')?.value\" alt=\"Logo\" style=\"height: 20px; width: auto;\" class=\"me-2\">\r\n } @else {\r\n <i class=\"bi bi-flask me-2\"></i>\r\n }\r\n {{ configForm.get('siteName')?.value || 'Your Site Name' }}\r\n </span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"preview-login-card\">\r\n <h6 class=\"text-center mb-3\">\r\n @if (configForm.get('logoUrl')?.value) {\r\n <img [src]=\"configForm.get('logoUrl')?.value\" alt=\"Logo\" style=\"height: 24px; width: auto;\" class=\"me-2\">\r\n } @else {\r\n <i class=\"bi bi-flask me-2\"></i>\r\n }\r\n {{ configForm.get('siteName')?.value || 'Your Site Name' }}\r\n </h6>\r\n @if (configForm.get('enableOrcidLogin')?.value) {\r\n <div class=\"preview-button mb-2\"\r\n [style.background]=\"'linear-gradient(135deg, ' + (configForm.get('primaryColor')?.value || '#1976d2') + ' 0%, ' + getDarkerColor(configForm.get('primaryColor')?.value || '#1976d2') + ' 100%)'\">\r\n <i class=\"bi bi-person-badge me-2\"></i>\r\n Login with ORCID\r\n </div>\r\n }\r\n <div class=\"preview-button mb-2\"\r\n [style.background]=\"'linear-gradient(135deg, ' + (configForm.get('primaryColor')?.value || '#1976d2') + ' 0%, ' + getDarkerColor(configForm.get('primaryColor')?.value || '#1976d2') + ' 100%)'\">\r\n <i class=\"bi bi-box-arrow-in-right me-2\"></i>\r\n Regular Login\r\n </div>\r\n @if (configForm.get('allowUserRegistration')?.value) {\r\n <div class=\"text-center mb-2\">\r\n <small class=\"text-muted\">\r\n <i class=\"bi bi-person-plus me-1\"></i>\r\n Don't have an account? <a href=\"#\" class=\"text-decoration-none\">Register here</a>\r\n </small>\r\n </div>\r\n }\r\n <div class=\"text-center\">\r\n <small class=\"text-muted\">\r\n {{ configForm.get('siteName')?.value || 'Your Site Name' }} - Scientific Metadata Management\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mt-3\">\r\n <h6 class=\"text-muted\">Authentication Status:</h6>\r\n <ul class=\"list-unstyled small text-muted mb-0\">\r\n <li>\r\n <i class=\"bi bi-check-circle-fill text-success me-1\"></i>\r\n Regular login: Always enabled\r\n </li>\r\n <li>\r\n @if (configForm.get('enableOrcidLogin')?.value) {\r\n <i class=\"bi bi-check-circle-fill text-success me-1\"></i>\r\n ORCID login: Enabled\r\n } @else {\r\n <i class=\"bi bi-x-circle-fill text-danger me-1\"></i>\r\n ORCID login: Disabled\r\n }\r\n </li>\r\n <li>\r\n @if (configForm.get('allowUserRegistration')?.value) {\r\n <i class=\"bi bi-check-circle-fill text-success me-1\"></i>\r\n Public registration: Enabled\r\n } @else {\r\n <i class=\"bi bi-x-circle-fill text-danger me-1\"></i>\r\n Public registration: Disabled\r\n }\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n @if (configForm.get('showPoweredBy')?.value) {\r\n <div class=\"mt-3\">\r\n <small class=\"text-muted\">\r\n <i class=\"bi bi-lightning-charge me-1\"></i>\r\n Footer: \"Powered by CUPCAKE Vanilla\" will appear on hover\r\n </small>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>","import { Component, inject, ChangeDetectorRef, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgbModule } from '@ng-bootstrap/ng-bootstrap';\nimport { ToastService, ToastMessage } from '../../services/toast';\n\n@Component({\n selector: 'ccc-toast-container',\n standalone: true,\n imports: [CommonModule, NgbModule],\n templateUrl: './toast-container.html',\n styleUrl: './toast-container.scss'\n})\nexport class ToastContainerComponent {\n private toastService = inject(ToastService);\n private cdr = inject(ChangeDetectorRef);\n\n toasts = this.toastService.toasts;\n\n constructor() {\n effect(() => {\n const currentToasts = this.toasts();\n this.cdr.detectChanges();\n });\n }\n\n remove(toast: ToastMessage) {\n this.toastService.remove(toast.id);\n }\n\n getToastClass(type: string): string {\n switch (type) {\n case 'success':\n return 'bg-success text-white';\n case 'error':\n return 'bg-danger text-white';\n case 'warning':\n return 'bg-warning text-dark';\n case 'info':\n default:\n return 'bg-primary text-white';\n }\n }\n\n getToastIcon(type: string): string {\n switch (type) {\n case 'success':\n return 'bi-check-circle-fill';\n case 'error':\n return 'bi-exclamation-triangle-fill';\n case 'warning':\n return 'bi-exclamation-circle-fill';\n case 'info':\n default:\n return 'bi-info-circle-fill';\n }\n }\n}","<div class=\"toast-container position-fixed bottom-0 end-0 p-3\" style=\"z-index: 9999;\">\n @for (toast of toasts(); track toast.id) {\n <ngb-toast \n [class]=\"getToastClass(toast.type)\"\n [autohide]=\"true\"\n [delay]=\"toast.duration || 5000\"\n (hidden)=\"remove(toast)\">\n <ng-template ngbToastHeader>\n <i [class]=\"'bi ' + getToastIcon(toast.type) + ' me-2'\"></i>\n <strong class=\"me-auto\">\n {{ toast.type | titlecase }}\n </strong>\n </ng-template>\n {{ toast.message }}\n </ngb-toast>\n }\n</div>\n","import { Component, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SiteConfigService } from '../../services/site-config';\r\n\r\n@Component({\r\n selector: 'ccc-powered-by-footer',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './powered-by-footer.html',\r\n styleUrl: './powered-by-footer.scss'\r\n})\r\nexport class PoweredByFooterComponent {\r\n private siteConfigService = inject(SiteConfigService);\r\n\r\n siteConfig$ = this.siteConfigService.config$;\r\n}","@if ((siteConfig$ | async)?.showPoweredBy !== false) {\r\n <div class=\"powered-by-footer\">\r\n <div class=\"footer-trigger\"></div>\r\n <div class=\"footer-content\">\r\n <span class=\"footer-text\">\r\n <i class=\"bi bi-lightning-charge me-1\"></i>\r\n Powered by <strong>CUPCAKE Vanilla</strong>\r\n </span>\r\n </div>\r\n </div>\r\n}","// Auth components\r\nexport * from './auth/login/login';\r\nexport * from './auth/register/register';\r\n\r\n// User management components \r\nexport * from './user-management/admin-user-management/user-management';\r\nexport * from './user-management/lab-groups/lab-groups';\r\nexport * from './user-management/user-profile/user-profile';\r\n\r\n// Site configuration\r\nexport * from './site-config/site-config';\r\n\r\n// Utility components\r\nexport * from './toast-container/toast-container';\r\nexport * from './powered-by-footer/powered-by-footer';","import { NgModule, ModuleWithProviders, InjectionToken } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { HttpClientModule, provideHttpClient, withInterceptors } from '@angular/common/http';\r\nimport { RouterModule } from '@angular/router';\r\nimport { NgbModule } from '@ng-bootstrap/ng-bootstrap';\r\n\r\nimport { LoginComponent } from './components/auth/login/login';\r\nimport { RegisterComponent } from './components/auth/register/register';\r\nimport { ToastContainerComponent } from './components/toast-container/toast-container';\r\n\r\nimport { CupcakeCoreConfig, CUPCAKE_CORE_CONFIG } from './services/auth';\r\nimport { authInterceptor } from './interceptors/auth-interceptor';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n HttpClientModule,\r\n RouterModule,\r\n NgbModule,\r\n LoginComponent,\r\n RegisterComponent,\r\n ToastContainerComponent\r\n ],\r\n exports: [\r\n LoginComponent,\r\n RegisterComponent, \r\n ToastContainerComponent,\r\n CommonModule,\r\n ReactiveFormsModule,\r\n NgbModule\r\n ]\r\n})\r\nexport class CupcakeCoreModule {\r\n static forRoot(config: CupcakeCoreConfig): ModuleWithProviders<CupcakeCoreModule> {\r\n return {\r\n ngModule: CupcakeCoreModule,\r\n providers: [\r\n { provide: CUPCAKE_CORE_CONFIG, useValue: config },\r\n provideHttpClient(\r\n withInterceptors([authInterceptor])\r\n )\r\n ]\r\n };\r\n }\r\n}","/*\n * Public API Surface of cupcake-core\n */\n\nexport * from './lib/models';\n\nexport * from './lib/services';\n\nexport * from './lib/guards';\n\nexport * from './lib/interceptors';\n\nexport * from './lib/components';\n\nexport * from './lib/cupcake-core.module';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["map","i1.ToastService","tap","switchMap","i1.AuthService","getCleanReturnUrl","i1","i2","i3"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"noatgnu-cupcake-core.mjs","sources":["../../../projects/cupcake-core/src/lib/models/enums.ts","../../../projects/cupcake-core/src/lib/models/annotation.ts","../../../projects/cupcake-core/src/lib/models/index.ts","../../../projects/cupcake-core/src/lib/interceptors/auth-interceptor.ts","../../../projects/cupcake-core/src/lib/services/auth.ts","../../../projects/cupcake-core/src/lib/services/resource.ts","../../../projects/cupcake-core/src/lib/services/api.ts","../../../projects/cupcake-core/src/lib/services/base-api.ts","../../../projects/cupcake-core/src/lib/services/toast.ts","../../../projects/cupcake-core/src/lib/services/notification.ts","../../../projects/cupcake-core/src/lib/services/site-config.ts","../../../projects/cupcake-core/src/lib/services/theme.ts","../../../projects/cupcake-core/src/lib/services/user-management.ts","../../../projects/cupcake-core/src/lib/services/websocket.ts","../../../projects/cupcake-core/src/lib/services/websocket-config.ts","../../../projects/cupcake-core/src/lib/services/lab-group.ts","../../../projects/cupcake-core/src/lib/guards/auth-guard.ts","../../../projects/cupcake-core/src/lib/guards/admin-guard.ts","../../../projects/cupcake-core/src/lib/components/auth/login/login.ts","../../../projects/cupcake-core/src/lib/components/auth/login/login.html","../../../projects/cupcake-core/src/lib/components/auth/register/register.ts","../../../projects/cupcake-core/src/lib/components/auth/register/register.html","../../../projects/cupcake-core/src/lib/components/user-management/admin-user-management/user-management.ts","../../../projects/cupcake-core/src/lib/components/user-management/admin-user-management/user-management.html","../../../projects/cupcake-core/src/lib/components/user-management/lab-groups/lab-groups.ts","../../../projects/cupcake-core/src/lib/components/user-management/lab-groups/lab-groups.html","../../../projects/cupcake-core/src/lib/components/user-management/user-profile/user-profile.ts","../../../projects/cupcake-core/src/lib/components/user-management/user-profile/user-profile.html","../../../projects/cupcake-core/src/lib/components/site-config/site-config.ts","../../../projects/cupcake-core/src/lib/components/site-config/site-config.html","../../../projects/cupcake-core/src/lib/components/toast-container/toast-container.ts","../../../projects/cupcake-core/src/lib/components/toast-container/toast-container.html","../../../projects/cupcake-core/src/lib/components/powered-by-footer/powered-by-footer.ts","../../../projects/cupcake-core/src/lib/components/powered-by-footer/powered-by-footer.html","../../../projects/cupcake-core/src/lib/components/index.ts","../../../projects/cupcake-core/src/lib/cupcake-core.module.ts","../../../projects/cupcake-core/src/public-api.ts","../../../projects/cupcake-core/src/noatgnu-cupcake-core.ts"],"sourcesContent":["export enum ResourceType {\r\n METADATA_TABLE = 'metadata_table',\r\n METADATA_TABLE_TEMPLATE = 'metadata_table_template', \r\n METADATA_COLUMN_TEMPLATE = 'metadata_column_template',\r\n FILE = 'file',\r\n DATASET = 'dataset',\r\n SCHEMA = 'schema'\r\n}\r\nexport const ResourceTypeLabels: Record<ResourceType, string> = {\r\n [ResourceType.METADATA_TABLE]: 'Metadata Table',\r\n [ResourceType.METADATA_TABLE_TEMPLATE]: 'Metadata Table Template',\r\n [ResourceType.METADATA_COLUMN_TEMPLATE]: 'Metadata Column Template',\r\n [ResourceType.FILE]: 'File',\r\n [ResourceType.DATASET]: 'Dataset',\r\n [ResourceType.SCHEMA]: 'Schema'\r\n};\r\n\r\nexport enum ResourceVisibility {\r\n PRIVATE = 'private',\r\n GROUP = 'group',\r\n PUBLIC = 'public'\r\n}\r\n\r\nexport const ResourceVisibilityLabels: Record<ResourceVisibility, string> = {\r\n [ResourceVisibility.PRIVATE]: 'Private',\r\n [ResourceVisibility.GROUP]: 'Lab Group',\r\n [ResourceVisibility.PUBLIC]: 'Public'\r\n};\r\n\r\nexport enum ResourceRole {\r\n OWNER = 'owner',\r\n ADMIN = 'admin',\r\n EDITOR = 'editor',\r\n VIEWER = 'viewer'\r\n}\r\n\r\nexport const ResourceRoleLabels: Record<ResourceRole, string> = {\r\n [ResourceRole.OWNER]: 'Owner',\r\n [ResourceRole.ADMIN]: 'Administrator', \r\n [ResourceRole.EDITOR]: 'Editor',\r\n [ResourceRole.VIEWER]: 'Viewer'\r\n};\r\n\r\nexport enum InvitationStatus {\r\n PENDING = 'pending',\r\n ACCEPTED = 'accepted',\r\n REJECTED = 'rejected',\r\n EXPIRED = 'expired',\r\n CANCELLED = 'cancelled'\r\n}\r\n\r\nexport const InvitationStatusLabels: Record<InvitationStatus, string> = {\r\n [InvitationStatus.PENDING]: 'Pending',\r\n [InvitationStatus.ACCEPTED]: 'Accepted',\r\n [InvitationStatus.REJECTED]: 'Rejected',\r\n [InvitationStatus.EXPIRED]: 'Expired',\r\n [InvitationStatus.CANCELLED]: 'Cancelled'\r\n};","import { BaseResource } from './base';\r\n\r\nexport enum AnnotationType {\r\n Text = 'text',\r\n File = 'file',\r\n Image = 'image',\r\n Video = 'video',\r\n Audio = 'audio',\r\n Sketch = 'sketch',\r\n Other = 'other',\r\n Checklist = 'checklist',\r\n Counter = 'counter',\r\n Table = 'table',\r\n Alignment = 'alignment',\r\n Calculator = 'calculator',\r\n MolarityCalculator = 'mcalculator',\r\n Randomization = 'randomization',\r\n Instrument = 'instrument',\r\n Metadata = 'metadata',\r\n Booking = 'booking'\r\n}\r\n\r\nexport interface AnnotationFolder extends BaseResource {\r\n folderName: string;\r\n parentFolder?: number;\r\n isSharedDocumentFolder: boolean;\r\n ownerName?: string;\r\n fullPath?: string;\r\n childFoldersCount: number;\r\n annotationsCount: number;\r\n}\r\n\r\nexport interface Annotation extends BaseResource {\r\n annotation: string;\r\n annotationType: string;\r\n file?: string;\r\n fileUrl?: string;\r\n fileSize?: number;\r\n folder?: number;\r\n folderPath?: string;\r\n transcribed: boolean;\r\n transcription?: string;\r\n language?: string;\r\n translation?: string;\r\n scratched: boolean;\r\n ownerName?: string;\r\n canEdit?: boolean;\r\n canView?: boolean;\r\n canDelete?: boolean;\r\n}\r\n\r\nexport interface AnnotationFolderCreateRequest {\r\n folderName: string;\r\n parentFolder?: number;\r\n isSharedDocumentFolder?: boolean;\r\n labGroup?: number;\r\n visibility?: string;\r\n}\r\n\r\nexport interface AnnotationFolderUpdateRequest {\r\n folderName?: string;\r\n parentFolder?: number;\r\n isSharedDocumentFolder?: boolean;\r\n isActive?: boolean;\r\n}\r\n\r\nexport interface AnnotationCreateRequest {\r\n annotation: string;\r\n annotationType?: string;\r\n file?: File;\r\n folder?: number;\r\n transcribed?: boolean;\r\n transcription?: string;\r\n language?: string;\r\n translation?: string;\r\n labGroup?: number;\r\n visibility?: string;\r\n autoTranscribe?: boolean;\r\n}\r\n\r\nexport interface AnnotationUpdateRequest {\r\n annotation?: string;\r\n annotationType?: string;\r\n folder?: number;\r\n transcribed?: boolean;\r\n transcription?: string;\r\n language?: string;\r\n translation?: string;\r\n scratched?: boolean;\r\n}","/**\r\n * CUPCAKE Core (CCC) - Models barrel export\r\n * User management, lab groups, and core functionality interfaces\r\n */\r\n\r\n// Base types and enums\r\nexport * from './base';\r\nexport * from './enums';\r\n\r\n// Core models\r\nexport * from './site-config';\r\nexport * from './user';\r\nexport * from './lab-group';\r\nexport * from './annotation';\r\nexport * from './resource-permission';\r\nexport * from './remote-host';\r\nexport * from './notification';","import { inject } from '@angular/core';\nimport { HttpInterceptorFn, HttpErrorResponse, HttpClient, HttpRequest, HttpEvent, HttpHandlerFn } from '@angular/common/http';\nimport { Router } from '@angular/router';\nimport { catchError, throwError, switchMap, BehaviorSubject, filter, take, Observable } from 'rxjs';\nimport { CUPCAKE_CORE_CONFIG } from '../services/auth';\n\nlet isRefreshing = false;\nlet refreshFailedCount = 0;\nlet lastRefreshFailTime = 0;\nconst MAX_REFRESH_RETRIES = 3;\nconst REFRESH_RETRY_WINDOW_MS = 60000;\nconst refreshTokenSubject: BehaviorSubject<string | null> = new BehaviorSubject<string | null>(null);\n\nexport function resetRefreshState(): void {\n refreshFailedCount = 0;\n lastRefreshFailTime = 0;\n isRefreshing = false;\n}\n\nexport const authInterceptor: HttpInterceptorFn = (req, next) => {\n const router = inject(Router);\n const http = inject(HttpClient);\n const config = inject(CUPCAKE_CORE_CONFIG);\n\n if (req.url.includes('/auth/login/') || \n req.url.includes('/auth/token/') || \n req.url.includes('/auth/orcid/') || \n req.url.includes('/auth/register/') ||\n req.url.includes('/site-config/public/')) {\n return next(req);\n }\n\n const token = localStorage.getItem('ccvAccessToken');\n\n let authReq = req;\n if (token) {\n authReq = addTokenToRequest(req, token);\n }\n\n return next(authReq).pipe(\n catchError((error: HttpErrorResponse) => {\n if (error.status === 401) {\n return handle401Error(authReq, next, http, router, config);\n }\n \n return throwError(() => error);\n })\n );\n};\n\nfunction addTokenToRequest(request: HttpRequest<any>, token: string): HttpRequest<any> {\n return request.clone({\n setHeaders: {\n Authorization: `Bearer ${token}`\n }\n });\n}\n\nfunction handle401Error(request: HttpRequest<any>, next: HttpHandlerFn, http: HttpClient, router: Router, config: any): Observable<HttpEvent<unknown>> {\n const now = Date.now();\n\n if (now - lastRefreshFailTime > REFRESH_RETRY_WINDOW_MS) {\n refreshFailedCount = 0;\n }\n\n if (refreshFailedCount >= MAX_REFRESH_RETRIES) {\n return throwError(() => new Error('Maximum token refresh attempts exceeded. Please log in again.')) as Observable<HttpEvent<unknown>>;\n }\n\n if (!isRefreshing) {\n isRefreshing = true;\n refreshTokenSubject.next(null);\n\n const refreshToken = localStorage.getItem('ccvRefreshToken');\n\n if (refreshToken) {\n return http.post<{access: string}>(`${config.apiUrl}/auth/token/refresh/`, {\n refresh: refreshToken\n }).pipe(\n switchMap((tokenResponse: {access: string}): Observable<HttpEvent<unknown>> => {\n isRefreshing = false;\n refreshFailedCount = 0;\n lastRefreshFailTime = 0;\n\n localStorage.setItem('ccvAccessToken', tokenResponse.access);\n refreshTokenSubject.next(tokenResponse.access);\n\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('tokenRefreshed'));\n }\n\n return next(addTokenToRequest(request, tokenResponse.access));\n }),\n catchError((refreshError) => {\n isRefreshing = false;\n refreshFailedCount++;\n lastRefreshFailTime = Date.now();\n localStorage.removeItem('ccvAccessToken');\n localStorage.removeItem('ccvRefreshToken');\n refreshTokenSubject.next(null);\n\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('authCleared'));\n }\n\n if (refreshFailedCount >= MAX_REFRESH_RETRIES) {\n router.navigate(['/login'], {\n queryParams: { returnUrl: router.url }\n });\n }\n\n return throwError(() => refreshError) as Observable<HttpEvent<unknown>>;\n })\n );\n } else {\n isRefreshing = false;\n refreshFailedCount++;\n lastRefreshFailTime = Date.now();\n localStorage.removeItem('ccvAccessToken');\n localStorage.removeItem('ccvRefreshToken');\n\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('authCleared'));\n }\n\n if (refreshFailedCount >= MAX_REFRESH_RETRIES) {\n router.navigate(['/login'], {\n queryParams: { returnUrl: router.url }\n });\n }\n\n return throwError(() => new Error('No refresh token available')) as Observable<HttpEvent<unknown>>;\n }\n } else {\n return refreshTokenSubject.pipe(\n filter((token): token is string => token !== null),\n take(1),\n switchMap((token: string): Observable<HttpEvent<unknown>> => {\n return next(addTokenToRequest(request, token));\n })\n );\n }\n}\n","import { Injectable, inject, Inject, InjectionToken } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable, BehaviorSubject, tap, throwError, catchError, map } from 'rxjs';\nimport { User } from '../models';\nimport { resetRefreshState } from '../interceptors';\n\nexport interface CupcakeCoreConfig {\n apiUrl: string;\n}\n\nexport const CUPCAKE_CORE_CONFIG = new InjectionToken<CupcakeCoreConfig>('CUPCAKE_CORE_CONFIG');\n\nexport interface AuthResponse {\n accessToken: string;\n refreshToken: string;\n user: User;\n}\n\nexport interface AuthStatus {\n authenticated: boolean;\n user?: User;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthService {\n private http = inject(HttpClient);\n private config = inject(CUPCAKE_CORE_CONFIG);\n private apiUrl = this.config.apiUrl;\n\n private currentUserSubject = new BehaviorSubject<User | null>(null);\n public currentUser$ = this.currentUserSubject.asObservable();\n private isAuthenticatedSubject = new BehaviorSubject<boolean>(this.hasValidTokenOnInit());\n public isAuthenticated$ = this.isAuthenticatedSubject.asObservable();\n\n constructor() {\n this.initializeAuthState();\n\n if (typeof window !== 'undefined') {\n window.addEventListener('tokenRefreshed', () => {\n this.updateAuthStateAfterRefresh();\n });\n \n window.addEventListener('authCleared', () => {\n this.clearAuthData();\n });\n }\n }\n\n private hasValidTokenOnInit(): boolean {\n if (typeof window === 'undefined') return false;\n \n const token = localStorage.getItem('ccvAccessToken');\n if (!token) return false;\n \n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n const now = Math.floor(Date.now() / 1000);\n return payload.exp > now;\n } catch {\n return false;\n }\n }\n\n private initializeAuthState(): void {\n const token = this.getAccessToken();\n const refreshToken = this.getRefreshToken();\n \n if (token && !this.isTokenExpired(token)) {\n this.isAuthenticatedSubject.next(true);\n \n const user = this.getUserFromToken();\n if (user) {\n this.currentUserSubject.next(user);\n }\n\n this.fetchUserProfile().subscribe({\n next: (fullUser) => {\n },\n error: (error) => {\n }\n });\n } else if (refreshToken && token && this.isTokenExpired(token)) {\n this.isAuthenticatedSubject.next(false);\n this.currentUserSubject.next(null);\n } else if (refreshToken && !token) {\n this.isAuthenticatedSubject.next(false);\n this.currentUserSubject.next(null);\n } else {\n this.isAuthenticatedSubject.next(false);\n this.currentUserSubject.next(null);\n }\n }\n\n private isTokenExpired(token: string): boolean {\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n const now = Math.floor(Date.now() / 1000);\n return payload.exp < now;\n } catch {\n return true;\n }\n }\n\n private convertUserFromSnakeToCamel(user: any): User {\n return {\n id: user.id || user.user_id,\n username: user.username || '',\n email: user.email || '',\n firstName: user.firstName || user.first_name || '',\n lastName: user.lastName || user.last_name || '',\n isStaff: user.isStaff !== undefined ? user.isStaff : (user.is_staff || false),\n isSuperuser: user.isSuperuser !== undefined ? user.isSuperuser : (user.is_superuser || false),\n isActive: user.isActive !== undefined ? user.isActive : (user.is_active !== undefined ? user.is_active : true),\n dateJoined: user.dateJoined || user.date_joined || '',\n lastLogin: user.lastLogin || user.last_login || null,\n hasOrcid: user.hasOrcid !== undefined ? user.hasOrcid : (user.orcid_id ? true : false),\n orcidId: user.orcidId || user.orcid_id\n };\n }\n\n getUserFromToken(): User | null {\n const token = this.getAccessToken();\n if (!token) return null;\n\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n return this.convertUserFromSnakeToCamel({\n id: payload.user_id,\n username: payload.username,\n email: payload.email,\n first_name: payload.first_name,\n last_name: payload.last_name,\n is_staff: payload.is_staff,\n is_superuser: payload.is_superuser,\n is_active: payload.is_active,\n date_joined: payload.date_joined,\n last_login: payload.last_login,\n orcid_id: payload.orcid_id\n });\n } catch {\n return null;\n }\n }\n\n initiateORCIDLogin(): Observable<{authorizationUrl: string, state: string}> {\n return this.http.get<{authorization_url: string, state: string}>(`${this.apiUrl}/auth/orcid/login/`)\n .pipe(\n map(response => ({\n authorizationUrl: response.authorization_url,\n state: response.state\n }))\n );\n }\n\n handleORCIDCallback(code: string, state: string): Observable<AuthResponse> {\n const params = new URLSearchParams({ code, state });\n return this.http.get<AuthResponse>(`${this.apiUrl}/auth/orcid/callback/?${params}`)\n .pipe(\n tap(response => this.setAuthData(response))\n );\n }\n\n exchangeORCIDToken(accessToken: string, orcidId: string): Observable<AuthResponse> {\n return this.http.post<AuthResponse>(`${this.apiUrl}/auth/orcid/token/`, {\n access_token: accessToken,\n orcid_id: orcidId\n }).pipe(\n tap(response => this.setAuthData(response))\n );\n }\n\n login(username: string, password: string): Observable<AuthResponse> {\n return this.http.post<AuthResponse>(`${this.apiUrl}/auth/login/`, {\n username,\n password\n }).pipe(\n tap(response => this.setAuthData(response))\n );\n }\n\n logout(): Observable<any> {\n const refreshToken = this.getRefreshToken();\n const payload = refreshToken ? { refresh: refreshToken } : {};\n \n return this.http.post(`${this.apiUrl}/auth/logout/`, payload)\n .pipe(\n tap(() => this.clearAuthData())\n );\n }\n\n checkAuthStatus(): Observable<AuthStatus> {\n return this.http.get<AuthStatus>(`${this.apiUrl}/auth/status/`)\n .pipe(\n tap(status => {\n if (status.authenticated && status.user) {\n this.currentUserSubject.next(status.user);\n this.isAuthenticatedSubject.next(true);\n } else {\n this.clearAuthData();\n }\n })\n );\n }\n\n fetchUserProfile(): Observable<User> {\n return this.http.get<{user: any}>(`${this.apiUrl}/auth/profile/`)\n .pipe(\n map(response => this.convertUserFromSnakeToCamel(response.user)),\n tap(user => {\n this.currentUserSubject.next(user);\n this.isAuthenticatedSubject.next(true);\n })\n );\n }\n\n getCurrentUser(): User | null {\n return this.currentUserSubject.value;\n }\n\n isAuthenticated(): boolean {\n return this.isAuthenticatedSubject.value;\n }\n\n getAccessToken(): string | null {\n return localStorage.getItem('ccvAccessToken');\n }\n\n getRefreshToken(): string | null {\n return localStorage.getItem('ccvRefreshToken');\n }\n\n private setAuthData(response: AuthResponse): void {\n const accessToken = response.accessToken || (response as any).access_token || (response as any).access;\n const refreshToken = response.refreshToken || (response as any).refresh_token || (response as any).refresh;\n\n localStorage.setItem('ccvAccessToken', accessToken);\n localStorage.setItem('ccvRefreshToken', refreshToken);\n const convertedUser = this.convertUserFromSnakeToCamel(response.user);\n this.currentUserSubject.next(convertedUser);\n this.isAuthenticatedSubject.next(true);\n resetRefreshState();\n }\n\n tryRefreshToken(): Observable<{access: string}> {\n const refreshToken = this.getRefreshToken();\n \n if (!refreshToken) {\n this.clearAuthData();\n return throwError(() => new Error('No refresh token available'));\n }\n\n return this.http.post<{access: string}>(`${this.apiUrl}/auth/token/refresh/`, {\n refresh: refreshToken\n }).pipe(\n tap((response) => {\n localStorage.setItem('ccvAccessToken', response.access);\n this.isAuthenticatedSubject.next(true);\n\n const user = this.getUserFromToken();\n if (user) {\n this.currentUserSubject.next(user);\n }\n\n this.fetchUserProfile().subscribe({\n next: (fullUser) => {\n },\n error: (error) => {\n }\n });\n }),\n catchError((error) => {\n this.clearAuthData();\n return throwError(() => error);\n })\n );\n }\n\n refreshToken(): Observable<{access: string}> {\n const refreshToken = this.getRefreshToken();\n if (!refreshToken) {\n throw new Error('No refresh token available');\n }\n\n return this.http.post<{access: string}>(`${this.apiUrl}/auth/token/refresh/`, {\n refresh: refreshToken\n }).pipe(\n tap(response => {\n localStorage.setItem('ccvAccessToken', response.access);\n this.isAuthenticatedSubject.next(true);\n\n this.fetchUserProfile().subscribe({\n next: (fullUser) => {\n },\n error: (error) => {\n }\n });\n })\n );\n }\n\n updateAuthStateAfterRefresh(): void {\n const token = this.getAccessToken();\n if (token && !this.isTokenExpired(token)) {\n this.isAuthenticatedSubject.next(true);\n\n const user = this.getUserFromToken();\n if (user) {\n this.currentUserSubject.next(user);\n }\n\n this.fetchUserProfile().subscribe({\n next: (fullUser) => {\n },\n error: (error) => {\n }\n });\n }\n }\n\n private clearAuthData(): void {\n localStorage.removeItem('ccvAccessToken');\n localStorage.removeItem('ccvRefreshToken');\n this.currentUserSubject.next(null);\n this.isAuthenticatedSubject.next(false);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BaseResource, ResourceVisibility, ResourceRole } from '../models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ResourceService {\n\n convertLegacyVisibility(isPublic: boolean | undefined, isDefault: boolean = false): ResourceVisibility {\n if (isDefault || isPublic) {\n return ResourceVisibility.PUBLIC;\n }\n return ResourceVisibility.PRIVATE;\n }\n\n convertToLegacyVisibility(visibility: ResourceVisibility): boolean {\n return visibility === ResourceVisibility.PUBLIC;\n }\n\n getVisibilityLabel(visibility: ResourceVisibility): string {\n switch (visibility) {\n case ResourceVisibility.PRIVATE:\n return 'Private';\n case ResourceVisibility.GROUP:\n return 'Lab Group';\n case ResourceVisibility.PUBLIC:\n return 'Public';\n default:\n return 'Unknown';\n }\n }\n\n getRoleLabel(role: ResourceRole): string {\n switch (role) {\n case ResourceRole.OWNER:\n return 'Owner';\n case ResourceRole.ADMIN:\n return 'Administrator';\n case ResourceRole.EDITOR:\n return 'Editor';\n case ResourceRole.VIEWER:\n return 'Viewer';\n default:\n return 'Unknown';\n }\n }\n\n canPerformAction(resource: BaseResource, action: 'view' | 'edit' | 'delete' | 'share'): boolean {\n switch (action) {\n case 'view':\n return resource.canView ?? true;\n case 'edit':\n return resource.canEdit ?? false;\n case 'delete':\n return resource.canDelete ?? false;\n case 'share':\n // Share permission is based on ownership or admin role\n // This would typically require checking permissions via API\n return resource.canEdit ?? false;\n default:\n return false;\n }\n }\n\n getVisibilityOptions(): Array<{value: ResourceVisibility, label: string, description: string}> {\n return [\n {\n value: ResourceVisibility.PRIVATE,\n label: 'Private',\n description: 'Only you can access this resource'\n },\n {\n value: ResourceVisibility.GROUP,\n label: 'Lab Group',\n description: 'Members of your lab group can access this resource'\n },\n {\n value: ResourceVisibility.PUBLIC,\n label: 'Public',\n description: 'All users can access this resource'\n }\n ];\n }\n\n getRoleOptions(): Array<{value: ResourceRole, label: string, description: string}> {\n return [\n {\n value: ResourceRole.VIEWER,\n label: 'Viewer',\n description: 'Can view the resource'\n },\n {\n value: ResourceRole.EDITOR,\n label: 'Editor',\n description: 'Can view and edit the resource'\n },\n {\n value: ResourceRole.ADMIN,\n label: 'Administrator',\n description: 'Can view, edit, and manage permissions'\n },\n {\n value: ResourceRole.OWNER,\n label: 'Owner',\n description: 'Full control over the resource'\n }\n ];\n }\n\n transformLegacyResource<T extends Partial<BaseResource>>(legacyData: any): T {\n const transformed = { ...legacyData };\n\n if (legacyData.creator !== undefined) {\n transformed.owner = legacyData.creator;\n delete transformed.creator;\n }\n if (legacyData.creator_username !== undefined) {\n transformed.ownerUsername = legacyData.creator_username;\n delete transformed.creator_username;\n }\n\n if (legacyData.isPublic !== undefined) {\n transformed.visibility = this.convertLegacyVisibility(legacyData.isPublic, legacyData.isDefault);\n delete transformed.isPublic;\n }\n\n if (transformed.visibility === undefined) {\n transformed.visibility = ResourceVisibility.PRIVATE;\n }\n if (transformed.isActive === undefined) {\n transformed.isActive = true;\n }\n if (transformed.isLocked === undefined) {\n transformed.isLocked = false;\n }\n\n return transformed as T;\n }\n\n prepareForAPI<T extends Record<string, any>>(resourceData: T): any {\n const prepared: any = { ...resourceData };\n\n if (prepared.owner !== undefined) {\n prepared.creator = prepared.owner;\n delete prepared.owner;\n }\n if (prepared.ownerUsername !== undefined) {\n prepared.creator_username = prepared.ownerUsername;\n delete prepared.ownerUsername;\n }\n\n if (prepared.visibility !== undefined) {\n prepared.isPublic = this.convertToLegacyVisibility(prepared.visibility);\n delete prepared.visibility;\n }\n\n return prepared;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { ResourceService } from './resource';\nimport {\n SiteConfig,\n AuthConfig,\n RegistrationStatus,\n User,\n UserCreateRequest,\n UserRegistrationRequest,\n UserResponse,\n UserListResponse,\n PasswordChangeRequest,\n PasswordChangeResponse,\n AdminPasswordResetRequest,\n PasswordResetRequest,\n PasswordResetConfirmRequest,\n UserProfileUpdateRequest,\n EmailChangeRequest,\n EmailChangeConfirmRequest,\n Annotation,\n AnnotationFolder,\n AnnotationCreateRequest,\n AnnotationUpdateRequest,\n AnnotationFolderCreateRequest,\n AnnotationFolderUpdateRequest,\n ResourcePermission,\n ResourcePermissionCreateRequest,\n ResourcePermissionUpdateRequest,\n BulkPermissionRequest,\n RemoteHost,\n RemoteHostCreateRequest,\n RemoteHostUpdateRequest\n} from '../models';\nimport { CUPCAKE_CORE_CONFIG } from './auth';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ApiService {\n private config = inject(CUPCAKE_CORE_CONFIG);\n private apiUrl = this.config.apiUrl;\n private resourceService = inject(ResourceService);\n\n constructor(private http: HttpClient) {}\n\n // ===== SYSTEMATIC CASE TRANSFORMATION METHODS =====\n\n /**\n * Transform camelCase object to snake_case for API requests\n */\n private transformToSnakeCase(obj: any): any {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => this.transformToSnakeCase(item));\n }\n\n const transformed: any = {};\n Object.entries(obj).forEach(([key, value]) => {\n // Convert camelCase to snake_case\n const snakeKey = key.replace(/([A-Z])/g, '_$1').toLowerCase();\n transformed[snakeKey] = this.transformToSnakeCase(value);\n });\n\n return transformed;\n }\n\n /**\n * Transform snake_case object to camelCase for TypeScript interfaces\n */\n private transformToCamelCase(obj: any): any {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => this.transformToCamelCase(item));\n }\n\n const transformed: any = {};\n Object.entries(obj).forEach(([key, value]) => {\n // Convert snake_case to camelCase\n const camelKey = key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n transformed[camelKey] = this.transformToCamelCase(value);\n });\n\n return transformed;\n }\n\n /**\n * Make HTTP GET request with automatic snake_case to camelCase transformation\n */\n public get<T>(url: string, options?: any): Observable<T> {\n return this.http.get(url, options).pipe(\n map(response => this.transformToCamelCase(response) as T)\n );\n }\n\n /**\n * Make HTTP POST request with automatic camelCase to snake_case transformation\n */\n public post<T>(url: string, body: any, options?: any): Observable<T> {\n const transformedBody = this.transformToSnakeCase(body);\n return this.http.post(url, transformedBody, options).pipe(\n map(response => this.transformToCamelCase(response) as T)\n );\n }\n\n /**\n * Make HTTP PUT request with automatic camelCase to snake_case transformation\n */\n public put<T>(url: string, body: any, options?: any): Observable<T> {\n const transformedBody = this.transformToSnakeCase(body);\n return this.http.put(url, transformedBody, options).pipe(\n map(response => this.transformToCamelCase(response) as T)\n );\n }\n\n /**\n * Make HTTP PATCH request with automatic camelCase to snake_case transformation\n */\n public patch<T>(url: string, body: any, options?: any): Observable<T> {\n const transformedBody = this.transformToSnakeCase(body);\n return this.http.patch(url, transformedBody, options).pipe(\n map(response => this.transformToCamelCase(response) as T)\n );\n }\n\n /**\n * Make HTTP DELETE request with automatic snake_case to camelCase transformation\n */\n public delete<T>(url: string, options?: any): Observable<T> {\n return this.http.delete(url, options).pipe(\n map(response => this.transformToCamelCase(response) as T)\n );\n }\n\n // USER PROFILE\n getUserProfile(): Observable<{user: any}> {\n return this.http.get<{user: any}>(`${this.apiUrl}/auth/profile/`);\n }\n\n\n // ===================================================================\n // SITE CONFIGURATION METHODS\n // ===================================================================\n\n getSiteConfig(): Observable<SiteConfig[]> {\n return this.http.get<SiteConfig[]>(`${this.apiUrl}/site_config/`);\n }\n\n updateSiteConfig(id: number, config: Partial<SiteConfig>): Observable<SiteConfig> {\n return this.http.patch<SiteConfig>(`${this.apiUrl}/site_config/${id}/`, config);\n }\n\n // ===================================================================\n // USER MANAGEMENT METHODS\n // ===================================================================\n\n // Admin-only user management\n getUsers(params?: {\n isStaff?: boolean;\n isActive?: boolean;\n search?: string;\n limit?: number;\n offset?: number;\n }): Observable<UserListResponse> {\n let httpParams = new HttpParams();\n if (params?.isStaff !== undefined) httpParams = httpParams.set('is_staff', params.isStaff.toString());\n if (params?.isActive !== undefined) httpParams = httpParams.set('is_active', params.isActive.toString());\n if (params?.search) httpParams = httpParams.set('search', params.search);\n if (params?.limit) httpParams = httpParams.set('limit', params.limit.toString());\n if (params?.offset !== undefined) httpParams = httpParams.set('offset', params.offset.toString());\n\n return this.http.get<UserListResponse>(`${this.apiUrl}/users/`, { params: httpParams });\n }\n\n getUser(id: number): Observable<User> {\n return this.http.get<User>(`${this.apiUrl}/users/${id}/`);\n }\n\n createUser(userData: UserCreateRequest): Observable<UserResponse> {\n return this.post<UserResponse>(`${this.apiUrl}/users/admin_create/`, userData);\n }\n\n updateUser(id: number, userData: Partial<User>): Observable<User> {\n return this.http.patch<User>(`${this.apiUrl}/users/${id}/`, userData);\n }\n\n deleteUser(id: number): Observable<void> {\n return this.http.delete<void>(`${this.apiUrl}/users/${id}/`);\n }\n\n // Public user registration\n registerUser(userData: UserRegistrationRequest): Observable<UserResponse> {\n return this.http.post<UserResponse>(`${this.apiUrl}/users/register/`, userData);\n }\n\n // Authentication configuration\n getAuthConfig(): Observable<AuthConfig> {\n return this.http.get<AuthConfig>(`${this.apiUrl}/users/auth_config/`);\n }\n\n getRegistrationStatus(): Observable<RegistrationStatus> {\n return this.http.get<RegistrationStatus>(`${this.apiUrl}/users/registration_status/`);\n }\n\n // ===================================================================\n // PASSWORD MANAGEMENT METHODS\n // ===================================================================\n\n // User password change (authenticated user)\n changePassword(passwordData: PasswordChangeRequest): Observable<PasswordChangeResponse> {\n return this.http.post<PasswordChangeResponse>(`${this.apiUrl}/users/change_password/`, passwordData);\n }\n\n // User profile update\n updateProfile(profileData: UserProfileUpdateRequest): Observable<UserResponse> {\n return this.http.post<UserResponse>(`${this.apiUrl}/users/update_profile/`, profileData);\n }\n\n // Email change with verification\n requestEmailChange(emailData: EmailChangeRequest): Observable<{message: string, new_email: string}> {\n return this.http.post<{message: string, new_email: string}>(`${this.apiUrl}/users/request_email_change/`, emailData);\n }\n\n confirmEmailChange(confirmData: EmailChangeConfirmRequest): Observable<{message: string}> {\n return this.http.post<{message: string}>(`${this.apiUrl}/users/confirm_email_change/`, confirmData);\n }\n\n // Admin password reset\n resetUserPassword(userId: number, passwordData: AdminPasswordResetRequest): Observable<PasswordChangeResponse> {\n const apiData = {\n user_id: passwordData.userId,\n new_password: passwordData.newPassword,\n confirm_password: passwordData.confirmPassword,\n force_password_change: passwordData.forcePasswordChange,\n reason: passwordData.reason\n };\n return this.http.post<PasswordChangeResponse>(`${this.apiUrl}/users/${userId}/reset_password/`, apiData);\n }\n\n // Password reset request (forgot password)\n requestPasswordReset(resetData: PasswordResetRequest): Observable<PasswordChangeResponse> {\n return this.http.post<PasswordChangeResponse>(`${this.apiUrl}/users/request_password_reset/`, resetData);\n }\n\n // Confirm password reset with token\n confirmPasswordReset(confirmData: PasswordResetConfirmRequest): Observable<PasswordChangeResponse> {\n return this.http.post<PasswordChangeResponse>(`${this.apiUrl}/users/confirm_password_reset/`, confirmData);\n }\n\n // ===================================================================\n // ACCOUNT LINKING METHODS\n // ===================================================================\n\n // Link ORCID to current user account\n linkOrcid(orcidData: { orcidId: string; verificationCode?: string }): Observable<any> {\n return this.http.post<any>(`${this.apiUrl}/users/link_orcid/`, orcidData);\n }\n\n // Unlink ORCID from current user account\n unlinkOrcid(): Observable<PasswordChangeResponse> {\n return this.http.delete<PasswordChangeResponse>(`${this.apiUrl}/users/unlink_orcid/`);\n }\n\n // Detect duplicate accounts\n detectDuplicateAccounts(searchData: {\n email?: string;\n orcidId?: string;\n firstName?: string;\n lastName?: string;\n }): Observable<any> {\n return this.http.post<any>(`${this.apiUrl}/users/detect_duplicates/`, searchData);\n }\n\n // Request account merge\n requestAccountMerge(mergeData: {\n duplicateUserId: number;\n reason: string;\n }): Observable<any> {\n return this.http.post<any>(`${this.apiUrl}/users/request_merge/`, mergeData);\n }\n\n // ANNOTATION MANAGEMENT\n\n getAnnotationFolders(params?: {\n search?: string;\n parentFolder?: number;\n isSharedDocumentFolder?: boolean;\n labGroup?: number;\n limit?: number;\n offset?: number;\n }): Observable<{count: number, results: AnnotationFolder[]}> {\n let httpParams = new HttpParams();\n if (params) {\n Object.keys(params).forEach(key => {\n const value = params[key as keyof typeof params];\n if (value !== undefined && value !== null) {\n httpParams = httpParams.set(key, value.toString());\n }\n });\n }\n return this.http.get<any>(`${this.apiUrl}/annotation-folders/`, { params: httpParams }).pipe(\n map(response => ({\n ...response,\n results: response.results.map((folder: any) => this.resourceService.transformLegacyResource(folder))\n }))\n );\n }\n\n getAnnotationFolder(id: number): Observable<AnnotationFolder> {\n return this.http.get<any>(`${this.apiUrl}/annotation-folders/${id}/`).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n createAnnotationFolder(folderData: AnnotationFolderCreateRequest): Observable<AnnotationFolder> {\n const preparedData = this.resourceService.prepareForAPI(folderData);\n return this.http.post<any>(`${this.apiUrl}/annotation-folders/`, preparedData).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n updateAnnotationFolder(id: number, folderData: AnnotationFolderUpdateRequest): Observable<AnnotationFolder> {\n const preparedData = this.resourceService.prepareForAPI(folderData);\n return this.http.patch<any>(`${this.apiUrl}/annotation-folders/${id}/`, preparedData).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n deleteAnnotationFolder(id: number): Observable<void> {\n return this.http.delete<void>(`${this.apiUrl}/annotation-folders/${id}/`);\n }\n\n /**\n * WARNING: This method accesses the base annotation endpoint and should only be used\n * for standalone annotations that are NOT attached to parent resources.\n *\n * For annotations attached to parent resources, use the specialized services instead:\n * - Instrument annotations: Use InstrumentService from @noatgnu/cupcake-macaron\n * - StoredReagent annotations: Use ReagentService from @noatgnu/cupcake-macaron\n * - Session annotations: Use SessionService from @noatgnu/cupcake-red-velvet\n *\n * These specialized services ensure proper permission checking through parent resources.\n */\n getAnnotations(params?: {\n search?: string;\n annotationType?: string;\n folder?: number;\n transcribed?: boolean;\n scratched?: boolean;\n labGroup?: number;\n limit?: number;\n offset?: number;\n }): Observable<{count: number, results: Annotation[]}> {\n let httpParams = new HttpParams();\n if (params) {\n Object.keys(params).forEach(key => {\n const value = params[key as keyof typeof params];\n if (value !== undefined && value !== null) {\n httpParams = httpParams.set(key, value.toString());\n }\n });\n }\n return this.http.get<any>(`${this.apiUrl}/annotations/`, { params: httpParams }).pipe(\n map(response => ({\n ...response,\n results: response.results.map((annotation: any) => this.resourceService.transformLegacyResource(annotation))\n }))\n );\n }\n\n /**\n * WARNING: This method accesses the base annotation endpoint and should only be used\n * for standalone annotations that are NOT attached to parent resources.\n *\n * For annotations attached to parent resources, use the specialized services instead:\n * - Instrument annotations: Use InstrumentService.getInstrumentAnnotation()\n * - StoredReagent annotations: Use ReagentService.getStoredReagentAnnotation()\n * - Session annotations: Use SessionService (session folder annotations)\n *\n * The backend enforces parent resource permissions, but using specialized services\n * provides cleaner access control and better context.\n */\n getAnnotation(id: number): Observable<Annotation> {\n return this.http.get<any>(`${this.apiUrl}/annotations/${id}/`).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n /**\n * WARNING: This method accesses the base annotation endpoint and should only be used\n * for standalone annotations that are NOT attached to parent resources.\n *\n * For creating annotations attached to parent resources, use specialized upload methods:\n * - Instrument annotations: Use InstrumentService.uploadAnnotation()\n * - StoredReagent annotations: Use ReagentService.uploadAnnotation()\n * - Session/Step annotations: Use the appropriate chunked upload service\n *\n * These specialized methods provide chunked upload support, progress tracking,\n * and automatic binding to parent resources with proper permission enforcement.\n */\n createAnnotation(annotationData: AnnotationCreateRequest): Observable<Annotation> {\n const formData = new FormData();\n Object.keys(annotationData).forEach(key => {\n const value = (annotationData as any)[key];\n if (value !== undefined && value !== null) {\n if (key === 'file' && value instanceof File) {\n formData.append(key, value);\n } else {\n formData.append(key, value.toString());\n }\n }\n });\n return this.http.post<any>(`${this.apiUrl}/annotations/`, formData).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n /**\n * WARNING: This method accesses the base annotation endpoint and should only be used\n * for standalone annotations that are NOT attached to parent resources.\n *\n * For annotations attached to parent resources, the backend enforces parent resource\n * permissions. However, using specialized services provides better context and access control.\n */\n updateAnnotation(id: number, annotationData: AnnotationUpdateRequest): Observable<Annotation> {\n const preparedData = this.resourceService.prepareForAPI(annotationData);\n return this.http.patch<any>(`${this.apiUrl}/annotations/${id}/`, preparedData).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n /**\n * WARNING: This method accesses the base annotation endpoint and should only be used\n * for standalone annotations that are NOT attached to parent resources.\n *\n * For deleting annotations attached to parent resources, use specialized services:\n * - Instrument annotations: Use InstrumentService.deleteInstrumentAnnotation()\n * - StoredReagent annotations: Use ReagentService.deleteStoredReagentAnnotation()\n * - Session annotations: Use appropriate session/step annotation delete methods\n *\n * The backend enforces parent resource permissions, but using specialized services\n * provides clearer intent and better access control context.\n */\n deleteAnnotation(id: number): Observable<void> {\n return this.http.delete<void>(`${this.apiUrl}/annotations/${id}/`);\n }\n\n // RESOURCE PERMISSIONS\n\n getResourcePermissions(params?: {\n user?: number;\n resourceContentType?: number;\n resourceObjectId?: number;\n role?: string;\n limit?: number;\n offset?: number;\n }): Observable<{count: number, results: ResourcePermission[]}> {\n let httpParams = new HttpParams();\n if (params) {\n Object.keys(params).forEach(key => {\n const value = params[key as keyof typeof params];\n if (value !== undefined && value !== null) {\n httpParams = httpParams.set(key, value.toString());\n }\n });\n }\n return this.http.get<any>(`${this.apiUrl}/resource-permissions/`, { params: httpParams }).pipe(\n map(response => ({\n ...response,\n results: response.results.map((permission: any) => this.resourceService.transformLegacyResource(permission))\n }))\n );\n }\n\n getResourcePermission(id: number): Observable<ResourcePermission> {\n return this.http.get<any>(`${this.apiUrl}/resource-permissions/${id}/`).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n createResourcePermission(permissionData: ResourcePermissionCreateRequest): Observable<ResourcePermission> {\n const preparedData = this.resourceService.prepareForAPI(permissionData);\n return this.http.post<any>(`${this.apiUrl}/resource-permissions/`, preparedData).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n updateResourcePermission(id: number, permissionData: ResourcePermissionUpdateRequest): Observable<ResourcePermission> {\n const preparedData = this.resourceService.prepareForAPI(permissionData);\n return this.http.patch<any>(`${this.apiUrl}/resource-permissions/${id}/`, preparedData).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n deleteResourcePermission(id: number): Observable<void> {\n return this.http.delete<void>(`${this.apiUrl}/resource-permissions/${id}/`);\n }\n\n createBulkPermissions(bulkData: BulkPermissionRequest): Observable<{created: ResourcePermission[], errors: any[]}> {\n const preparedData = this.resourceService.prepareForAPI(bulkData);\n return this.http.post<any>(`${this.apiUrl}/resource-permissions/bulk_create/`, preparedData).pipe(\n map(response => ({\n ...response,\n created: response.created.map((permission: any) => this.resourceService.transformLegacyResource(permission))\n }))\n );\n }\n\n getResourcePermissionsByResource(resourceContentType: number, resourceObjectId: number): Observable<ResourcePermission[]> {\n const httpParams = new HttpParams()\n .set('resourceContentType', resourceContentType.toString())\n .set('resourceObjectId', resourceObjectId.toString());\n return this.http.get<any[]>(`${this.apiUrl}/resource-permissions/by_resource/`, { params: httpParams }).pipe(\n map(permissions => permissions.map(permission => this.resourceService.transformLegacyResource(permission)))\n );\n }\n\n // REMOTE HOST MANAGEMENT\n\n getRemoteHosts(params?: {\n search?: string;\n hostName?: string;\n hostProtocol?: string;\n limit?: number;\n offset?: number;\n }): Observable<{count: number, results: RemoteHost[]}> {\n let httpParams = new HttpParams();\n if (params) {\n Object.keys(params).forEach(key => {\n const value = params[key as keyof typeof params];\n if (value !== undefined && value !== null) {\n httpParams = httpParams.set(key, value.toString());\n }\n });\n }\n return this.http.get<any>(`${this.apiUrl}/remote-hosts/`, { params: httpParams }).pipe(\n map(response => ({\n ...response,\n results: response.results.map((host: any) => this.resourceService.transformLegacyResource(host))\n }))\n );\n }\n\n getRemoteHost(id: number): Observable<RemoteHost> {\n return this.http.get<any>(`${this.apiUrl}/remote-hosts/${id}/`).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n createRemoteHost(hostData: RemoteHostCreateRequest): Observable<RemoteHost> {\n const preparedData = this.resourceService.prepareForAPI(hostData);\n return this.http.post<any>(`${this.apiUrl}/remote-hosts/`, preparedData).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n updateRemoteHost(id: number, hostData: RemoteHostUpdateRequest): Observable<RemoteHost> {\n const preparedData = this.resourceService.prepareForAPI(hostData);\n return this.http.patch<any>(`${this.apiUrl}/remote-hosts/${id}/`, preparedData).pipe(\n map(response => this.resourceService.transformLegacyResource(response))\n );\n }\n\n deleteRemoteHost(id: number): Observable<void> {\n return this.http.delete<void>(`${this.apiUrl}/remote-hosts/${id}/`);\n }\n\n testRemoteHostConnection(id: number): Observable<{success: boolean, message: string}> {\n return this.http.post<{success: boolean, message: string}>(`${this.apiUrl}/remote-hosts/${id}/test_connection/`, {});\n }\n}\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { CUPCAKE_CORE_CONFIG } from './auth';\r\n\r\n/**\r\n * Base API service with systematic case transformation\r\n * All other API services should extend this to get automatic snake_case <-> camelCase conversion\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class BaseApiService {\r\n protected http = inject(HttpClient);\r\n private config = inject(CUPCAKE_CORE_CONFIG);\r\n protected apiUrl = this.config.apiUrl;\r\n\r\n // ===== SYSTEMATIC CASE TRANSFORMATION METHODS =====\r\n\r\n /**\r\n * Transform camelCase object to snake_case for API requests\r\n */\r\n protected transformToSnakeCase(obj: any): any {\r\n if (obj === null || typeof obj !== 'object') {\r\n return obj;\r\n }\r\n\r\n // Skip FormData objects - they should not be transformed\r\n if (obj instanceof FormData) {\r\n return obj;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(item => this.transformToSnakeCase(item));\r\n }\r\n\r\n const transformed: any = {};\r\n Object.entries(obj).forEach(([key, value]) => {\r\n const snakeKey = key.replace(/([A-Z])/g, '_$1').toLowerCase();\r\n transformed[snakeKey] = this.transformToSnakeCase(value);\r\n });\r\n\r\n return transformed;\r\n }\r\n\r\n /**\r\n * Transform snake_case object to camelCase for TypeScript interfaces\r\n */\r\n protected transformToCamelCase(obj: any): any {\r\n if (obj === null || typeof obj !== 'object') {\r\n return obj;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(item => this.transformToCamelCase(item));\r\n }\r\n\r\n const transformed: any = {};\r\n Object.entries(obj).forEach(([key, value]) => {\r\n const camelKey = key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\r\n transformed[camelKey] = this.transformToCamelCase(value);\r\n });\r\n\r\n return transformed;\r\n }\r\n\r\n // ===== HTTP METHODS WITH AUTOMATIC TRANSFORMATION =====\r\n\r\n /**\r\n * Make HTTP GET request with automatic snake_case to camelCase transformation\r\n */\r\n protected get<T>(url: string, options?: any): Observable<T> {\r\n return this.http.get(url, options).pipe(\r\n map(response => this.transformToCamelCase(response) as T)\r\n );\r\n }\r\n\r\n /**\r\n * Make HTTP POST request with automatic camelCase to snake_case transformation\r\n */\r\n protected post<T>(url: string, body: any, options?: any): Observable<T> {\r\n const transformedBody = this.transformToSnakeCase(body);\r\n return this.http.post(url, transformedBody, options).pipe(\r\n map(response => this.transformToCamelCase(response) as T)\r\n );\r\n }\r\n\r\n /**\r\n * Make HTTP PUT request with automatic camelCase to snake_case transformation\r\n */\r\n protected put<T>(url: string, body: any, options?: any): Observable<T> {\r\n const transformedBody = this.transformToSnakeCase(body);\r\n return this.http.put(url, transformedBody, options).pipe(\r\n map(response => this.transformToCamelCase(response) as T)\r\n );\r\n }\r\n\r\n /**\r\n * Make HTTP PATCH request with automatic camelCase to snake_case transformation\r\n */\r\n protected patch<T>(url: string, body: any, options?: any): Observable<T> {\r\n const transformedBody = this.transformToSnakeCase(body);\r\n return this.http.patch(url, transformedBody, options).pipe(\r\n map(response => this.transformToCamelCase(response) as T)\r\n );\r\n }\r\n\r\n /**\r\n * Make HTTP DELETE request with automatic snake_case to camelCase transformation\r\n */\r\n protected delete<T>(url: string, options?: any): Observable<T> {\r\n return this.http.delete(url, options).pipe(\r\n map(response => this.transformToCamelCase(response) as T)\r\n );\r\n }\r\n\r\n /**\r\n * Build HttpParams from query parameters object with automatic case transformation\r\n */\r\n protected buildHttpParams(params: any): HttpParams {\r\n let httpParams = new HttpParams();\r\n \r\n if (params) {\r\n const transformedParams = this.transformToSnakeCase(params);\r\n Object.entries(transformedParams).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n httpParams = httpParams.set(key, value.toString());\r\n }\r\n });\r\n }\r\n \r\n return httpParams;\r\n }\r\n}","import { Injectable, signal } from '@angular/core';\n\nexport interface ToastMessage {\n id: string;\n message: string;\n type: 'success' | 'error' | 'warning' | 'info';\n duration?: number;\n dismissible?: boolean;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ToastService {\n private toastsSignal = signal<ToastMessage[]>([]);\n \n readonly toasts = this.toastsSignal.asReadonly();\n\n show(message: string, type: 'success' | 'error' | 'warning' | 'info' = 'info', duration = 5000) {\n const id = this.generateId();\n const toast: ToastMessage = {\n id,\n message,\n type,\n duration,\n dismissible: true\n };\n\n this.toastsSignal.update(toasts => [...toasts, toast]);\n\n if (duration > 0) {\n setTimeout(() => {\n this.remove(id);\n }, duration);\n }\n }\n\n success(message: string, duration = 5000) {\n this.show(message, 'success', duration);\n }\n\n error(message: string, duration = 8000) {\n this.show(message, 'error', duration);\n }\n\n warning(message: string, duration = 6000) {\n this.show(message, 'warning', duration);\n }\n\n info(message: string, duration = 5000) {\n this.show(message, 'info', duration);\n }\n\n remove(id: string) {\n this.toastsSignal.update(toasts => toasts.filter(toast => toast.id !== id));\n }\n\n clear() {\n this.toastsSignal.set([]);\n }\n\n private generateId(): string {\n return Math.random().toString(36).substring(2) + Date.now().toString(36);\n }\n}\n","import { Injectable, signal, computed } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { ToastService } from './toast';\r\n\r\nexport interface NotificationItem {\r\n id: string;\r\n type: string;\r\n title: string;\r\n message: string;\r\n timestamp: Date;\r\n read: boolean;\r\n level?: 'info' | 'success' | 'warning' | 'error';\r\n actions?: NotificationAction[];\r\n autoClose?: boolean;\r\n data?: any;\r\n}\r\n\r\nexport interface NotificationAction {\r\n label: string;\r\n action: string;\r\n style?: 'primary' | 'secondary' | 'success' | 'warning' | 'danger';\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NotificationService {\r\n private notifications = signal<NotificationItem[]>([]);\r\n private notificationSubject = new Subject<NotificationItem>();\r\n\r\n readonly allNotifications = computed(() => this.notifications());\r\n readonly unreadNotifications = computed(() =>\r\n this.notifications().filter(n => !n.read)\r\n );\r\n readonly unreadCount = computed(() => this.unreadNotifications().length);\r\n\r\n readonly notification$ = this.notificationSubject.asObservable();\r\n\r\n constructor(protected toastService: ToastService) {}\r\n\r\n protected addNotification(notification: NotificationItem): void {\r\n this.notifications.update(notifications => {\r\n const updated = [notification, ...notifications];\r\n return updated.slice(0, 100);\r\n });\r\n\r\n this.notificationSubject.next(notification);\r\n console.log('Notification added:', notification);\r\n }\r\n\r\n protected generateNotificationId(): string {\r\n return `notification_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n\r\n markAsRead(notificationId: string): void {\r\n this.notifications.update(notifications =>\r\n notifications.map(n =>\r\n n.id === notificationId ? { ...n, read: true } : n\r\n )\r\n );\r\n }\r\n\r\n markAllAsRead(): void {\r\n this.notifications.update(notifications =>\r\n notifications.map(n => ({ ...n, read: true }))\r\n );\r\n }\r\n\r\n removeNotification(notificationId: string): void {\r\n this.notifications.update(notifications =>\r\n notifications.filter(n => n.id !== notificationId)\r\n );\r\n }\r\n\r\n clearAll(): void {\r\n this.notifications.set([]);\r\n }\r\n\r\n clearRead(): void {\r\n this.notifications.update(notifications =>\r\n notifications.filter(n => !n.read)\r\n );\r\n }\r\n\r\n createLocalNotification(\r\n type: string,\r\n title: string,\r\n message: string,\r\n level: 'info' | 'success' | 'warning' | 'error' = 'info',\r\n autoClose = true\r\n ): void {\r\n const notification: NotificationItem = {\r\n id: this.generateNotificationId(),\r\n type,\r\n title,\r\n message,\r\n timestamp: new Date(),\r\n read: false,\r\n level,\r\n autoClose\r\n };\r\n\r\n this.addNotification(notification);\r\n\r\n switch (level) {\r\n case 'error':\r\n this.toastService.error(`${title}: ${message}`);\r\n break;\r\n case 'warning':\r\n this.toastService.warning(`${title}: ${message}`);\r\n break;\r\n case 'success':\r\n this.toastService.success(`${title}: ${message}`);\r\n break;\r\n default:\r\n this.toastService.info(`${title}: ${message}`);\r\n }\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { BaseApiService } from './base-api';\r\nimport { SiteConfig } from '../models/site-config';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SiteConfigService extends BaseApiService {\r\n\r\n private readonly defaultConfig: SiteConfig = {\r\n siteName: 'CUPCAKE Vanilla',\r\n showPoweredBy: true,\r\n primaryColor: '#1976d2',\r\n allowUserRegistration: false,\r\n enableOrcidLogin: false,\r\n bookingDeletionWindowMinutes: 30,\r\n installedApps: {},\r\n createdAt: new Date().toISOString(),\r\n updatedAt: new Date().toISOString()\r\n };\r\n\r\n private configSubject = new BehaviorSubject<SiteConfig>(this.defaultConfig);\r\n public config$ = this.configSubject.asObservable();\r\n\r\n constructor() {\r\n super();\r\n this.loadConfig();\r\n }\r\n\r\n private loadConfig(): void {\r\n const savedConfig = localStorage.getItem('site_config');\r\n if (savedConfig) {\r\n try {\r\n const config = JSON.parse(savedConfig);\r\n this.configSubject.next({ ...this.defaultConfig, ...config });\r\n } catch (error) {\r\n // Invalid config, use defaults\r\n }\r\n }\r\n\r\n this.fetchConfigFromBackend().subscribe({\r\n next: (config) => {\r\n this.configSubject.next({ ...this.defaultConfig, ...config });\r\n localStorage.setItem('site_config', JSON.stringify(config));\r\n },\r\n error: () => {\r\n // Continue with current config\r\n }\r\n });\r\n }\r\n\r\n private fetchConfigFromBackend(): Observable<Partial<SiteConfig>> {\r\n return this.get<Partial<SiteConfig>>(`${this.apiUrl}/site-config/public/`);\r\n }\r\n\r\n getCurrentConfig(): Observable<SiteConfig> {\r\n return this.get<SiteConfig>(`${this.apiUrl}/site-config/current/`);\r\n }\r\n\r\n updateConfig(config: Partial<SiteConfig>): Observable<SiteConfig> {\r\n return this.put<SiteConfig>(`${this.apiUrl}/site-config/update_config/`, config);\r\n }\r\n\r\n getSiteName(): string {\r\n return this.configSubject.value.siteName;\r\n }\r\n\r\n shouldShowPoweredBy(): boolean {\r\n return this.configSubject.value.showPoweredBy !== false;\r\n }\r\n\r\n getLogoUrl(): string | null {\r\n const config = this.configSubject.value;\r\n return config.logoImage || config.logoUrl || null;\r\n }\r\n\r\n getPrimaryColor(): string {\r\n return this.configSubject.value.primaryColor || '#1976d2';\r\n }\r\n\r\n isRegistrationEnabled(): boolean {\r\n return this.configSubject.value.allowUserRegistration === true;\r\n }\r\n\r\n isOrcidLoginEnabled(): boolean {\r\n return this.configSubject.value.enableOrcidLogin === true;\r\n }\r\n}\r\n","import { Injectable, signal, computed } from '@angular/core';\r\n\r\nexport type Theme = 'light' | 'dark' | 'auto';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ThemeService {\r\n private readonly THEME_KEY = 'cupcake-theme';\r\n private readonly mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\r\n\r\n private _theme = signal<Theme>(this.loadStoredTheme());\r\n\r\n readonly theme = this._theme.asReadonly();\r\n readonly isDark = computed(() => {\r\n const theme = this._theme();\r\n if (theme === 'auto') {\r\n return this.mediaQuery.matches;\r\n }\r\n return theme === 'dark';\r\n });\r\n\r\n constructor() {\r\n this.mediaQuery.addEventListener('change', () => {\r\n if (this._theme() === 'auto') {\r\n this.updateDocumentTheme();\r\n }\r\n });\r\n\r\n this.updateDocumentTheme();\r\n }\r\n\r\n setTheme(theme: Theme): void {\r\n this._theme.set(theme);\r\n localStorage.setItem(this.THEME_KEY, theme);\r\n this.updateDocumentTheme();\r\n }\r\n\r\n toggleTheme(): void {\r\n const current = this._theme();\r\n if (current === 'light') {\r\n this.setTheme('dark');\r\n } else if (current === 'dark') {\r\n this.setTheme('auto');\r\n } else {\r\n this.setTheme('light');\r\n }\r\n }\r\n\r\n private loadStoredTheme(): Theme {\r\n const stored = localStorage.getItem(this.THEME_KEY) as Theme;\r\n return stored && ['light', 'dark', 'auto'].includes(stored) ? stored : 'auto';\r\n }\r\n\r\n private updateDocumentTheme(): void {\r\n const isDark = this.isDark();\r\n document.documentElement.setAttribute('data-bs-theme', isDark ? 'dark' : 'light');\r\n document.documentElement.classList.toggle('dark-mode', isDark);\r\n }\r\n\r\n getThemeIcon(): string {\r\n const theme = this._theme();\r\n switch (theme) {\r\n case 'light': return 'bi-sun-fill';\r\n case 'dark': return 'bi-moon-fill';\r\n case 'auto': return 'bi-circle-half';\r\n default: return 'bi-circle-half';\r\n }\r\n }\r\n\r\n getThemeLabel(): string {\r\n const theme = this._theme();\r\n switch (theme) {\r\n case 'light': return 'Light Mode';\r\n case 'dark': return 'Dark Mode';\r\n case 'auto': return 'Auto Mode';\r\n default: return 'Auto Mode';\r\n }\r\n }\r\n}","import { Injectable, inject } from '@angular/core';\nimport { Observable, BehaviorSubject } from 'rxjs';\nimport { ApiService } from './api';\nimport { AuthService } from './auth';\nimport { \n User, \n UserCreateRequest, \n UserProfileUpdateRequest,\n PasswordChangeRequest,\n EmailChangeRequest,\n PaginatedResponse,\n UserResponse,\n AdminPasswordResetRequest,\n PasswordChangeResponse\n} from '../models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class UserManagementService {\n private apiService = inject(ApiService);\n private authService = inject(AuthService);\n\n private usersSubject = new BehaviorSubject<User[]>([]);\n public users$ = this.usersSubject.asObservable();\n\n private totalUsersSubject = new BehaviorSubject<number>(0);\n public totalUsers$ = this.totalUsersSubject.asObservable();\n\n constructor() { }\n\n getUserProfile(): Observable<{user: User}> {\n return this.apiService.getUserProfile();\n }\n\n updateProfile(profileData: UserProfileUpdateRequest): Observable<UserResponse> {\n return this.apiService.updateProfile(profileData);\n }\n\n changePassword(passwordData: PasswordChangeRequest): Observable<{message: string}> {\n return this.apiService.changePassword(passwordData);\n }\n\n requestEmailChange(emailData: EmailChangeRequest): Observable<{message: string; new_email: string}> {\n return this.apiService.requestEmailChange(emailData);\n }\n\n getUsers(params?: {\n isStaff?: boolean;\n isActive?: boolean;\n search?: string;\n limit?: number;\n offset?: number;\n }): Observable<PaginatedResponse<User>> {\n return this.apiService.getUsers(params);\n }\n\n getUser(id: number): Observable<User> {\n return this.apiService.getUser(id);\n }\n\n createUser(userData: UserCreateRequest): Observable<UserResponse> {\n return this.apiService.createUser(userData);\n }\n\n updateUser(id: number, userData: Partial<User>): Observable<User> {\n return this.apiService.updateUser(id, userData);\n }\n\n deleteUser(id: number): Observable<void> {\n return this.apiService.deleteUser(id);\n }\n\n resetUserPassword(userId: number, passwordData: AdminPasswordResetRequest): Observable<PasswordChangeResponse> {\n return this.apiService.resetUserPassword(userId, passwordData);\n }\n\n getUserDisplayName(user: User | null): string {\n if (!user) return '';\n \n if (user.firstName || user.lastName) {\n return `${user.firstName} ${user.lastName}`.trim();\n }\n \n return user.username || user.email || 'User';\n }\n\n formatDate(dateString?: string): string {\n return dateString ? new Date(dateString).toLocaleDateString() : 'Never';\n }\n\n isCurrentUserAdmin(): boolean {\n const user = this.authService.getCurrentUser();\n return user?.isStaff || false;\n }\n\n isCurrentUserSuperuser(): boolean {\n const user = this.authService.getCurrentUser();\n return user?.isSuperuser || false;\n }\n\n updateUsersState(users: User[], total: number): void {\n this.usersSubject.next(users);\n this.totalUsersSubject.next(total);\n }\n\n getCurrentUsers(): User[] {\n return this.usersSubject.getValue();\n }\n\n getCurrentTotalUsers(): number {\n return this.totalUsersSubject.getValue();\n }\n}","import { Injectable, signal, computed, inject, InjectionToken, Optional } from '@angular/core';\r\nimport { BehaviorSubject, Subject, Observable, timer, EMPTY } from 'rxjs';\r\nimport { takeUntil, switchMap, retry, tap } from 'rxjs/operators';\r\nimport { AuthService, CUPCAKE_CORE_CONFIG } from './auth';\r\n\r\nexport const WEBSOCKET_ENDPOINT = new InjectionToken<string>('WEBSOCKET_ENDPOINT', {\r\n providedIn: 'root',\r\n factory: () => 'notifications'\r\n});\r\n\r\nexport interface WebSocketMessage {\r\n type: string;\r\n message?: string;\r\n timestamp?: string;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface WebSocketConfig {\r\n url: string;\r\n endpoint?: string;\r\n protocols?: string[];\r\n reconnectInterval?: number;\r\n maxReconnectAttempts?: number;\r\n pingInterval?: number;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WebSocketService {\r\n protected ws: WebSocket | null = null;\r\n protected config: WebSocketConfig;\r\n protected destroy$ = new Subject<void>();\r\n protected reconnectAttempts = 0;\r\n protected isConnecting = false;\r\n\r\n protected connectionState = signal<'disconnected' | 'connecting' | 'connected' | 'error'>('disconnected');\r\n protected lastError = signal<string | null>(null);\r\n\r\n protected messageSubject = new Subject<WebSocketMessage>();\r\n protected connectionSubject = new BehaviorSubject<boolean>(false);\r\n\r\n readonly messages$ = this.messageSubject.asObservable();\r\n readonly isConnected$ = this.connectionSubject.asObservable();\r\n readonly connectionState$ = computed(() => this.connectionState());\r\n readonly lastError$ = computed(() => this.lastError());\r\n\r\n protected config_token = inject(CUPCAKE_CORE_CONFIG);\r\n protected endpoint = inject(WEBSOCKET_ENDPOINT, { optional: true }) || 'notifications';\r\n\r\n constructor(protected authService: AuthService) {\r\n this.config = {\r\n url: this.getWebSocketUrl(),\r\n endpoint: this.endpoint,\r\n reconnectInterval: this.getAdaptiveReconnectInterval(),\r\n maxReconnectAttempts: 3\r\n };\r\n\r\n this.authService.isAuthenticated$.subscribe(isAuthenticated => {\r\n if (!isAuthenticated && this.ws) {\r\n console.log('User logged out - disconnecting WebSocket');\r\n this.disconnect();\r\n }\r\n });\r\n\r\n this.setupBrowserResourceHandling();\r\n }\r\n\r\n protected getWebSocketUrl(): string {\r\n const apiUrl = this.config_token.apiUrl;\r\n\r\n try {\r\n const url = new URL(apiUrl);\r\n const protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\r\n const host = url.host;\r\n const endpoint = this.config?.endpoint || 'notifications';\r\n\r\n return `${protocol}//${host}/ws/${endpoint}/`;\r\n } catch (error) {\r\n console.error('Invalid API URL in cupcake config:', apiUrl);\r\n\r\n const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\r\n const host = window.location.host;\r\n const endpoint = this.config?.endpoint || 'notifications';\r\n return `${protocol}//${host}/ws/${endpoint}/`;\r\n }\r\n }\r\n\r\n connect(): void {\r\n console.log('🔌 WebSocket connect() called');\r\n console.log('🔌 Current connection state:', this.connectionState());\r\n console.log('🔌 WebSocket URL:', this.config.url);\r\n\r\n if (this.isConnecting) {\r\n console.log('WebSocket connection already in progress');\r\n return;\r\n }\r\n\r\n if (this.ws?.readyState === WebSocket.OPEN) {\r\n console.log('WebSocket already connected');\r\n return;\r\n }\r\n\r\n if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {\r\n console.log('Closing existing WebSocket connection');\r\n this.ws.close();\r\n this.ws = null;\r\n }\r\n\r\n const token = this.authService.getAccessToken();\r\n if (!token) {\r\n console.error('❌ Cannot connect WebSocket - no authentication token');\r\n this.lastError.set('Authentication required');\r\n this.connectionState.set('error');\r\n return;\r\n }\r\n\r\n this.isConnecting = true;\r\n this.connectionState.set('connecting');\r\n this.lastError.set(null);\r\n\r\n try {\r\n const wsUrl = `${this.config.url}?token=${encodeURIComponent(token)}`;\r\n console.log('Connecting to WebSocket:', wsUrl.replace(token, '[TOKEN_HIDDEN]'));\r\n\r\n this.ws = new WebSocket(wsUrl);\r\n\r\n this.ws.onopen = this.onOpen.bind(this);\r\n this.ws.onmessage = this.onMessage.bind(this);\r\n this.ws.onerror = this.onError.bind(this);\r\n this.ws.onclose = this.onClose.bind(this);\r\n\r\n const connectionTimeout = setTimeout(() => {\r\n if (this.ws?.readyState === WebSocket.CONNECTING) {\r\n console.warn('WebSocket connection timeout - closing');\r\n this.ws.close();\r\n this.lastError.set('Connection timeout');\r\n this.connectionState.set('error');\r\n this.isConnecting = false;\r\n }\r\n }, 10000);\r\n\r\n this.ws.onopen = (event) => {\r\n clearTimeout(connectionTimeout);\r\n this.onOpen(event);\r\n };\r\n\r\n } catch (error) {\r\n console.error('WebSocket connection error:', error);\r\n this.connectionState.set('error');\r\n this.lastError.set('Connection failed');\r\n this.isConnecting = false;\r\n }\r\n }\r\n\r\n disconnect(): void {\r\n this.destroy$.next();\r\n this.isConnecting = false;\r\n\r\n if (this.ws) {\r\n this.ws.close(1000, 'User disconnected');\r\n this.ws = null;\r\n }\r\n\r\n this.connectionState.set('disconnected');\r\n this.connectionSubject.next(false);\r\n this.reconnectAttempts = 0;\r\n }\r\n\r\n send(message: any): void {\r\n if (this.ws?.readyState === WebSocket.OPEN) {\r\n this.ws.send(JSON.stringify(message));\r\n } else {\r\n console.warn('WebSocket not connected, cannot send message:', message);\r\n }\r\n }\r\n\r\n subscribe(subscriptionType: string, options: any = {}): void {\r\n this.send({\r\n type: 'subscribe',\r\n subscription_type: subscriptionType,\r\n ...options\r\n });\r\n }\r\n\r\n protected onOpen(event: Event): void {\r\n console.log('WebSocket connected');\r\n this.isConnecting = false;\r\n this.connectionState.set('connected');\r\n this.connectionSubject.next(true);\r\n this.reconnectAttempts = 0;\r\n this.lastError.set(null);\r\n }\r\n\r\n protected onMessage(event: MessageEvent): void {\r\n try {\r\n const data: WebSocketMessage = JSON.parse(event.data);\r\n console.log('WebSocket message received:', data);\r\n this.messageSubject.next(data);\r\n } catch (error) {\r\n console.error('Error parsing WebSocket message:', error);\r\n }\r\n }\r\n\r\n protected onError(event: Event): void {\r\n console.error('WebSocket error:', event);\r\n this.isConnecting = false;\r\n this.connectionState.set('error');\r\n this.lastError.set('Connection error occurred');\r\n }\r\n\r\n protected onClose(event: CloseEvent): void {\r\n console.log(`WebSocket closed: ${event.code} ${event.reason}`);\r\n this.isConnecting = false;\r\n this.connectionState.set('disconnected');\r\n this.connectionSubject.next(false);\r\n\r\n if (event.code === 4001) {\r\n this.lastError.set('Authentication failed');\r\n console.error('WebSocket authentication failed');\r\n return;\r\n } else if (event.code === 4003) {\r\n this.lastError.set('Insufficient permissions');\r\n console.error('WebSocket permission denied');\r\n return;\r\n }\r\n\r\n if (event.code !== 1000 && this.reconnectAttempts < (this.config.maxReconnectAttempts || 5)) {\r\n this.attemptReconnection();\r\n }\r\n }\r\n\r\n protected attemptReconnection(): void {\r\n this.reconnectAttempts++;\r\n const delay = this.config.reconnectInterval || 5000;\r\n\r\n console.log(`WebSocket reconnection attempt ${this.reconnectAttempts} in ${delay}ms`);\r\n\r\n timer(delay).pipe(\r\n takeUntil(this.destroy$),\r\n tap(() => {\r\n if (this.reconnectAttempts <= (this.config.maxReconnectAttempts || 5)) {\r\n this.connect();\r\n } else {\r\n console.error('Max WebSocket reconnection attempts reached');\r\n this.lastError.set('Connection failed - max attempts reached');\r\n }\r\n })\r\n ).subscribe();\r\n }\r\n\r\n filterMessages<T extends WebSocketMessage>(type: string): Observable<T> {\r\n return this.messages$.pipe(\r\n tap(msg => console.log('Filtering message:', msg.type, 'looking for:', type)),\r\n switchMap(message => message.type === type ? [message as T] : EMPTY)\r\n );\r\n }\r\n\r\n getNotifications(): Observable<WebSocketMessage> {\r\n return this.filterMessages('notification');\r\n }\r\n\r\n getSystemNotifications(): Observable<WebSocketMessage> {\r\n return this.filterMessages('system.notification');\r\n }\r\n\r\n reconnectWithNewToken(): void {\r\n if (this.ws?.readyState === WebSocket.OPEN) {\r\n console.log('Reconnecting WebSocket with new token');\r\n this.disconnect();\r\n setTimeout(() => this.connect(), 100);\r\n }\r\n }\r\n\r\n shouldConnect(): boolean {\r\n return this.authService.isAuthenticated() && !!this.authService.getAccessToken();\r\n }\r\n\r\n updateConfig(): void {\r\n this.config.url = this.getWebSocketUrl();\r\n console.log('WebSocket URL updated to:', this.config.url);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.disconnect();\r\n }\r\n\r\n protected getAdaptiveReconnectInterval(): number {\r\n const baseInterval = 5000;\r\n const tabCount = this.estimateTabCount();\r\n\r\n if (tabCount > 20) {\r\n return baseInterval * 3;\r\n } else if (tabCount > 10) {\r\n return baseInterval * 2;\r\n }\r\n\r\n return baseInterval;\r\n }\r\n\r\n protected estimateTabCount(): number {\r\n try {\r\n if ('memory' in performance) {\r\n const memory = (performance as any).memory;\r\n const usedMB = memory.usedJSHeapSize / (1024 * 1024);\r\n\r\n if (usedMB > 500) return 25;\r\n if (usedMB > 300) return 15;\r\n if (usedMB > 150) return 10;\r\n return 5;\r\n }\r\n\r\n return 10;\r\n } catch (error) {\r\n return 10;\r\n }\r\n }\r\n\r\n protected canConnectSafely(): boolean {\r\n try {\r\n if ('memory' in performance) {\r\n const memory = (performance as any).memory;\r\n const usedMB = memory.usedJSHeapSize / (1024 * 1024);\r\n const totalMB = memory.totalJSHeapSize / (1024 * 1024);\r\n\r\n const memoryUsageRatio = usedMB / totalMB;\r\n if (memoryUsageRatio > 0.9) {\r\n console.warn('High memory usage detected, delaying WebSocket connection');\r\n return false;\r\n }\r\n }\r\n\r\n const tabCount = this.estimateTabCount();\r\n if (tabCount > 30) {\r\n console.warn('Too many tabs detected, may affect WebSocket reliability');\r\n return false;\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n return true;\r\n }\r\n }\r\n\r\n protected setupBrowserResourceHandling(): void {\r\n document.addEventListener('visibilitychange', () => {\r\n if (document.visibilityState === 'visible') {\r\n if (this.shouldConnect() && this.connectionState() === 'disconnected') {\r\n console.log('Tab became active - attempting WebSocket reconnection');\r\n setTimeout(() => this.connect(), 1000);\r\n }\r\n } else {\r\n const tabCount = this.estimateTabCount();\r\n if (tabCount > 15 && this.ws?.readyState === WebSocket.OPEN) {\r\n console.log('Tab inactive with high tab count - maintaining connection with reduced activity');\r\n }\r\n }\r\n });\r\n\r\n window.addEventListener('beforeunload', () => {\r\n if (this.ws) {\r\n this.ws.close(1000, 'Page unloading');\r\n }\r\n });\r\n }\r\n}","import { Injectable, InjectionToken } from '@angular/core';\r\n\r\nexport interface WebSocketEndpointConfig {\r\n app: string;\r\n endpoint: string;\r\n description?: string;\r\n}\r\n\r\nexport const WEBSOCKET_ENDPOINTS = new InjectionToken<WebSocketEndpointConfig[]>('WEBSOCKET_ENDPOINTS');\r\n\r\nexport class WebSocketEndpoints {\r\n static readonly CORE_NOTIFICATIONS = 'notifications';\r\n static readonly CORE_ADMIN = 'admin';\r\n static readonly CCV_NOTIFICATIONS = 'ccv/notifications';\r\n static readonly CCV_ADMIN = 'ccv/admin';\r\n static readonly CCM_NOTIFICATIONS = 'ccm/notifications';\r\n static readonly CCRV_NOTIFICATIONS = 'ccrv/notifications';\r\n static readonly CCSC_NOTIFICATIONS = 'ccsc/notifications';\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WebSocketConfigService {\r\n private readonly endpoints: Map<string, WebSocketEndpointConfig> = new Map();\r\n\r\n constructor() {\r\n this.registerDefaultEndpoints();\r\n }\r\n\r\n private registerDefaultEndpoints(): void {\r\n this.registerEndpoint({\r\n app: 'core',\r\n endpoint: WebSocketEndpoints.CORE_NOTIFICATIONS,\r\n description: 'Core notification endpoint'\r\n });\r\n\r\n this.registerEndpoint({\r\n app: 'core',\r\n endpoint: WebSocketEndpoints.CORE_ADMIN,\r\n description: 'Core admin notification endpoint'\r\n });\r\n\r\n this.registerEndpoint({\r\n app: 'ccv',\r\n endpoint: WebSocketEndpoints.CCV_NOTIFICATIONS,\r\n description: 'CCV notification endpoint'\r\n });\r\n\r\n this.registerEndpoint({\r\n app: 'ccv',\r\n endpoint: WebSocketEndpoints.CCV_ADMIN,\r\n description: 'CCV admin notification endpoint'\r\n });\r\n\r\n this.registerEndpoint({\r\n app: 'ccm',\r\n endpoint: WebSocketEndpoints.CCM_NOTIFICATIONS,\r\n description: 'CCM notification endpoint'\r\n });\r\n\r\n this.registerEndpoint({\r\n app: 'ccrv',\r\n endpoint: WebSocketEndpoints.CCRV_NOTIFICATIONS,\r\n description: 'CCRV notification endpoint'\r\n });\r\n\r\n this.registerEndpoint({\r\n app: 'ccsc',\r\n endpoint: WebSocketEndpoints.CCSC_NOTIFICATIONS,\r\n description: 'CCSC notification endpoint'\r\n });\r\n }\r\n\r\n registerEndpoint(config: WebSocketEndpointConfig): void {\r\n this.endpoints.set(config.endpoint, config);\r\n }\r\n\r\n getEndpoint(endpoint: string): WebSocketEndpointConfig | undefined {\r\n return this.endpoints.get(endpoint);\r\n }\r\n\r\n getEndpointsForApp(app: string): WebSocketEndpointConfig[] {\r\n return Array.from(this.endpoints.values()).filter(config => config.app === app);\r\n }\r\n\r\n getAllEndpoints(): WebSocketEndpointConfig[] {\r\n return Array.from(this.endpoints.values());\r\n }\r\n\r\n validateEndpoint(endpoint: string): boolean {\r\n return this.endpoints.has(endpoint);\r\n }\r\n\r\n getDefaultEndpointForApp(app: string): string {\r\n const endpoints = this.getEndpointsForApp(app);\r\n if (endpoints.length === 0) {\r\n return WebSocketEndpoints.CORE_NOTIFICATIONS;\r\n }\r\n\r\n const notificationEndpoint = endpoints.find(e => e.endpoint.includes('notifications'));\r\n return notificationEndpoint?.endpoint || endpoints[0].endpoint;\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { HttpParams } from '@angular/common/http';\r\nimport { BaseApiService } from './base-api';\r\n\r\nimport {\r\n LabGroup,\r\n LabGroupCreateRequest,\r\n LabGroupQueryResponse,\r\n LabGroupInvitation,\r\n LabGroupInvitationQueryResponse,\r\n LabGroupInvitationCreateRequest,\r\n LabGroupMember,\r\n LabGroupPermission,\r\n LabGroupPermissionCreateRequest,\r\n LabGroupPermissionUpdateRequest,\r\n LabGroupPermissionQueryResponse\r\n} from '../models';\r\n\r\nexport interface LabGroupQueryParams {\r\n search?: string;\r\n parentGroup?: number;\r\n parentGroup__isnull?: string;\r\n limit?: number;\r\n offset?: number;\r\n}\r\n\r\nexport interface LabGroupInvitationQueryParams {\r\n labGroup?: number;\r\n status?: string;\r\n limit?: number;\r\n offset?: number;\r\n}\r\n\r\nexport interface LabGroupPermissionQueryParams {\r\n labGroup?: number;\r\n user?: number;\r\n canView?: boolean;\r\n canInvite?: boolean;\r\n canManage?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LabGroupService extends BaseApiService {\r\n\r\n // LAB GROUPS\r\n getLabGroups(params?: LabGroupQueryParams): Observable<LabGroupQueryResponse> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<LabGroupQueryResponse>(`${this.apiUrl}/lab-groups/`, { params: httpParams });\r\n }\r\n\r\n getMyLabGroups(params?: LabGroupQueryParams): Observable<LabGroupQueryResponse> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<LabGroupQueryResponse>(`${this.apiUrl}/lab-groups/my_groups/`, { params: httpParams });\r\n }\r\n\r\n createLabGroup(labGroup: LabGroupCreateRequest): Observable<LabGroup> {\r\n return this.post<LabGroup>(`${this.apiUrl}/lab-groups/`, labGroup);\r\n }\r\n\r\n updateLabGroup(id: number, labGroup: Partial<LabGroup>): Observable<LabGroup> {\r\n return this.patch<LabGroup>(`${this.apiUrl}/lab-groups/${id}/`, labGroup);\r\n }\r\n\r\n deleteLabGroup(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/lab-groups/${id}/`);\r\n }\r\n\r\n getLabGroupMembers(id: number, params?: { directOnly?: boolean; pageSize?: number; limit?: number; offset?: number }): Observable<{count: number; next: string | null; previous: string | null; results: LabGroupMember[]}> {\r\n const httpParams = this.buildHttpParams({\r\n direct_only: params?.directOnly?.toString(),\r\n page_size: params?.pageSize?.toString(),\r\n limit: params?.limit?.toString(),\r\n offset: params?.offset?.toString()\r\n });\r\n return this.get<{count: number; next: string | null; previous: string | null; results: LabGroupMember[]}>(`${this.apiUrl}/lab-groups/${id}/members/`, { params: httpParams });\r\n }\r\n\r\n inviteUserToLabGroup(id: number, invitation: LabGroupInvitationCreateRequest): Observable<LabGroupInvitation> {\r\n return this.post<LabGroupInvitation>(`${this.apiUrl}/lab-groups/${id}/invite_user/`, invitation);\r\n }\r\n\r\n leaveLabGroup(id: number): Observable<{message: string}> {\r\n return this.post<{message: string}>(`${this.apiUrl}/lab-groups/${id}/leave/`, {});\r\n }\r\n\r\n removeMemberFromLabGroup(id: number, userId: number): Observable<{message: string}> {\r\n return this.post<{message: string}>(`${this.apiUrl}/lab-groups/${id}/remove_member/`, { userId });\r\n }\r\n\r\n getRootLabGroups(params?: Omit<LabGroupQueryParams, 'parentGroup'>): Observable<LabGroupQueryResponse> {\r\n const httpParams = this.buildHttpParams({ ...params, parentGroup__isnull: 'true' });\r\n return this.get<LabGroupQueryResponse>(`${this.apiUrl}/lab-groups/`, { params: httpParams });\r\n }\r\n\r\n getSubGroups(parentGroupId: number, params?: Omit<LabGroupQueryParams, 'parentGroup'>): Observable<LabGroupQueryResponse> {\r\n return this.getLabGroups({ ...params, parentGroup: parentGroupId });\r\n }\r\n\r\n // LAB GROUP INVITATIONS\r\n getLabGroupInvitations(params?: LabGroupInvitationQueryParams): Observable<LabGroupInvitationQueryResponse> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<LabGroupInvitationQueryResponse>(`${this.apiUrl}/lab-group-invitations/`, { params: httpParams });\r\n }\r\n\r\n getMyPendingInvitations(): Observable<LabGroupInvitation[]> {\r\n return this.get<LabGroupInvitation[]>(`${this.apiUrl}/lab-group-invitations/my_pending_invitations/`);\r\n }\r\n\r\n acceptLabGroupInvitation(id: number): Observable<{message: string, invitation: LabGroupInvitation}> {\r\n return this.post<{message: string, invitation: LabGroupInvitation}>(`${this.apiUrl}/lab-group-invitations/${id}/accept_invitation/`, {});\r\n }\r\n\r\n rejectLabGroupInvitation(id: number): Observable<{message: string, invitation: LabGroupInvitation}> {\r\n return this.post<{message: string, invitation: LabGroupInvitation}>(`${this.apiUrl}/lab-group-invitations/${id}/reject_invitation/`, {});\r\n }\r\n\r\n cancelLabGroupInvitation(id: number): Observable<{message: string}> {\r\n return this.post<{message: string}>(`${this.apiUrl}/lab-group-invitations/${id}/cancel_invitation/`, {});\r\n }\r\n\r\n // LAB GROUP PERMISSIONS\r\n getLabGroupPermissions(params?: LabGroupPermissionQueryParams): Observable<LabGroupPermissionQueryResponse> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<LabGroupPermissionQueryResponse>(`${this.apiUrl}/lab-group-permissions/`, { params: httpParams });\r\n }\r\n\r\n getLabGroupPermission(id: number): Observable<LabGroupPermission> {\r\n return this.get<LabGroupPermission>(`${this.apiUrl}/lab-group-permissions/${id}/`);\r\n }\r\n\r\n createLabGroupPermission(permission: LabGroupPermissionCreateRequest): Observable<LabGroupPermission> {\r\n return this.post<LabGroupPermission>(`${this.apiUrl}/lab-group-permissions/`, permission);\r\n }\r\n\r\n updateLabGroupPermission(id: number, permission: LabGroupPermissionUpdateRequest): Observable<LabGroupPermission> {\r\n return this.patch<LabGroupPermission>(`${this.apiUrl}/lab-group-permissions/${id}/`, permission);\r\n }\r\n\r\n deleteLabGroupPermission(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/lab-group-permissions/${id}/`);\r\n }\r\n\r\n getLabGroupPermissionsForLabGroup(labGroupId: number): Observable<LabGroupPermissionQueryResponse> {\r\n return this.getLabGroupPermissions({ labGroup: labGroupId });\r\n }\r\n\r\n getLabGroupPermissionsForUser(userId: number): Observable<LabGroupPermissionQueryResponse> {\r\n return this.getLabGroupPermissions({ user: userId });\r\n }\r\n}","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { AuthService } from '../services/auth';\nimport { map, take } from 'rxjs';\n\n/**\n * Extract original return URL to prevent accumulating login URLs\n */\nfunction getCleanReturnUrl(currentUrl: string): string {\n try {\n const url = new URL(currentUrl, window.location.origin);\n\n if (url.pathname === '/login') {\n const innerReturnUrl = url.searchParams.get('returnUrl');\n if (innerReturnUrl) {\n return getCleanReturnUrl(innerReturnUrl);\n }\n return '/';\n }\n\n return url.pathname + url.search;\n } catch (error) {\n if (currentUrl.startsWith('/login')) {\n const urlParams = new URLSearchParams(currentUrl.split('?')[1]);\n const innerReturnUrl = urlParams.get('returnUrl');\n if (innerReturnUrl) {\n return getCleanReturnUrl(innerReturnUrl);\n }\n return '/';\n }\n return currentUrl;\n }\n}\n\nexport const authGuard: CanActivateFn = (route, state) => {\n const authService = inject(AuthService);\n const router = inject(Router);\n\n return authService.isAuthenticated$.pipe(\n take(1),\n map(isAuthenticated => {\n if (isAuthenticated) {\n return true;\n }\n\n const cleanReturnUrl = getCleanReturnUrl(state.url);\n\n router.navigate(['/login'], {\n queryParams: { returnUrl: cleanReturnUrl }\n });\n\n return false;\n })\n );\n};\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { AuthService } from '../services/auth';\n\n/**\n * Extract original return URL to prevent accumulating login URLs\n */\nfunction getCleanReturnUrl(currentUrl: string): string {\n try {\n const url = new URL(currentUrl, window.location.origin);\n\n // If current URL is already a login page, extract its returnUrl\n if (url.pathname === '/login') {\n const innerReturnUrl = url.searchParams.get('returnUrl');\n if (innerReturnUrl) {\n // Recursively clean in case of nested login URLs\n return getCleanReturnUrl(innerReturnUrl);\n }\n // If no returnUrl in login URL, use home page\n return '/';\n }\n\n // Return clean URL without origin\n return url.pathname + url.search;\n } catch (error) {\n // Fallback for relative URLs\n if (currentUrl.startsWith('/login')) {\n const urlParams = new URLSearchParams(currentUrl.split('?')[1]);\n const innerReturnUrl = urlParams.get('returnUrl');\n if (innerReturnUrl) {\n return getCleanReturnUrl(innerReturnUrl);\n }\n return '/';\n }\n return currentUrl;\n }\n}\n\nexport const adminGuard: CanActivateFn = (route, state) => {\n const authService = inject(AuthService);\n const router = inject(Router);\n\n const user = authService.getCurrentUser();\n\n if (!user) {\n // Clean the return URL to prevent login URL accumulation\n const cleanReturnUrl = getCleanReturnUrl(state.url);\n\n router.navigate(['/login'], {\n queryParams: { returnUrl: cleanReturnUrl }\n });\n return false;\n }\n\n if (!user.isStaff) {\n router.navigate(['/metadata']);\n return false;\n }\n\n return true;\n};\n","import { Component, inject, OnInit, signal, computed } from '@angular/core';\nimport { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { Router, ActivatedRoute } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { NgbAlert } from '@ng-bootstrap/ng-bootstrap';\nimport { AuthService } from '../../../services/auth';\nimport { SiteConfigService } from '../../../services/site-config';\nimport { ApiService } from '../../../services/api';\nimport { AuthConfig, RegistrationStatus } from '../../../models';\n\n@Component({\n selector: 'ccc-login',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbAlert],\n templateUrl: './login.html',\n styleUrl: './login.scss'\n})\nexport class LoginComponent implements OnInit {\n private authService = inject(AuthService);\n private fb = inject(FormBuilder);\n private router = inject(Router);\n private route = inject(ActivatedRoute);\n private siteConfigService = inject(SiteConfigService);\n private apiService = inject(ApiService);\n\n loginForm: FormGroup;\n loading = signal(false);\n error = signal<string | null>(null);\n success = signal<string | null>(null);\n\n siteConfig$ = this.siteConfigService.config$;\n\n authConfig = signal<AuthConfig | null>(null);\n registrationStatus = signal<RegistrationStatus | null>(null);\n\n constructor() {\n this.loginForm = this.fb.group({\n username: ['', [Validators.required]],\n password: ['', [Validators.required]]\n });\n }\n\n private returnUrl: string = '/';\n\n ngOnInit() {\n this.loadAuthConfig();\n\n this.route.queryParams.subscribe(params => {\n this.returnUrl = this.cleanReturnUrl(params['returnUrl']) || '/';\n\n if (params['code'] && params['state']) {\n this.handleORCIDCallback(params['code'], params['state']);\n } else if (params['error']) {\n this.error.set(`ORCID authentication failed: ${params['error']}`);\n }\n\n if (params['registered'] === 'true') {\n this.success.set('Registration successful! You can now log in with your credentials.');\n if (params['username']) {\n this.loginForm.patchValue({ username: params['username'] });\n }\n }\n });\n\n this.authService.isAuthenticated$.subscribe(isAuthenticated => {\n if (isAuthenticated) {\n this.router.navigate([this.returnUrl]);\n }\n });\n }\n\n /**\n * Clean return URL to prevent accumulating login URLs\n */\n private cleanReturnUrl(returnUrl: string | null): string | null {\n if (!returnUrl) return null;\n\n try {\n const url = new URL(returnUrl, window.location.origin);\n\n if (url.pathname === '/login') {\n const innerReturnUrl = url.searchParams.get('returnUrl');\n if (innerReturnUrl) {\n return this.cleanReturnUrl(innerReturnUrl);\n }\n return '/';\n }\n\n return url.pathname + url.search;\n } catch (error) {\n if (returnUrl.startsWith('/login')) {\n const urlParams = new URLSearchParams(returnUrl.split('?')[1]);\n const innerReturnUrl = urlParams.get('returnUrl');\n if (innerReturnUrl) {\n return this.cleanReturnUrl(innerReturnUrl);\n }\n return '/';\n }\n return returnUrl;\n }\n }\n\n /**\n * Load authentication configuration to determine available login options\n */\n private loadAuthConfig(): void {\n this.apiService.getAuthConfig().subscribe({\n next: (config) => {\n this.authConfig.set(config);\n },\n error: (error) => {\n console.warn('Could not load auth config:', error);\n this.authConfig.set({\n registrationEnabled: false,\n orcidLoginEnabled: false,\n regularLoginEnabled: true\n });\n }\n });\n\n this.apiService.getRegistrationStatus().subscribe({\n next: (status) => {\n this.registrationStatus.set(status);\n },\n error: (error) => {\n console.warn('Could not load registration status:', error);\n }\n });\n }\n\n /**\n * Handle traditional username/password login\n */\n onSubmit() {\n if (this.loginForm.valid) {\n this.loading.set(true);\n this.error.set(null);\n\n const { username, password } = this.loginForm.value;\n\n this.authService.login(username, password).subscribe({\n next: (response) => {\n this.success.set('Login successful!');\n setTimeout(() => {\n this.router.navigate([this.returnUrl]);\n }, 1000);\n },\n error: (error) => {\n this.loading.set(false);\n this.error.set(error.error?.detail || 'Login failed. Please check your credentials.');\n }\n });\n }\n }\n\n /**\n * Initiate ORCID OAuth login\n */\n loginWithORCID() {\n this.loading.set(true);\n this.error.set(null);\n\n this.authService.initiateORCIDLogin().subscribe({\n next: (response) => {\n sessionStorage.setItem('orcid_state', response.state);\n window.location.href = response.authorizationUrl;\n },\n error: (error) => {\n this.loading.set(false);\n this.error.set(error.error?.error || 'Failed to initiate ORCID login.');\n }\n });\n }\n\n /**\n * Handle ORCID OAuth callback\n */\n private handleORCIDCallback(code: string, state: string) {\n this.loading.set(true);\n this.error.set(null);\n\n const storedState = sessionStorage.getItem('orcid_state');\n if (storedState !== state) {\n this.error.set('Invalid state parameter. Possible security issue.');\n this.loading.set(false);\n return;\n }\n\n sessionStorage.removeItem('orcid_state');\n\n this.authService.handleORCIDCallback(code, state).subscribe({\n next: (response) => {\n this.success.set(`Welcome, ${response.user.firstName || response.user.username}!`);\n setTimeout(() => {\n this.router.navigate([this.returnUrl]);\n }, 1000);\n },\n error: (error) => {\n this.loading.set(false);\n this.error.set(error.error?.error || 'ORCID authentication failed.');\n }\n });\n }\n\n /**\n * Clear error message\n */\n clearError() {\n this.error.set(null);\n }\n\n /**\n * Clear success message\n */\n clearSuccess() {\n this.success.set(null);\n }\n\n /**\n * Computed signals for UI display logic\n */\n shouldShowOrcidLogin = computed(() => this.authConfig()?.orcidLoginEnabled === true);\n shouldShowRegistration = computed(() => this.registrationStatus()?.registrationEnabled === true);\n shouldShowRegularLogin = computed(() => this.authConfig()?.regularLoginEnabled !== false);\n registrationMessage = computed(() => this.registrationStatus()?.message || 'Registration is currently enabled');\n\n /**\n * Navigate to registration page\n */\n goToRegister() {\n this.router.navigate(['/register'], {\n queryParams: { returnUrl: this.returnUrl }\n });\n }\n}\n","<div class=\"container\">\r\n <div class=\"login-wrapper\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n @if (siteConfig$ | async; as config) {\r\n <h3 class=\"card-title text-center mb-4\">\r\n <i class=\"bi bi-flask me-2\"></i>{{ config.siteName }}\r\n </h3>\r\n }\r\n\r\n <!-- Success Alert -->\r\n @if (success()) {\r\n <ngb-alert type=\"success\" (closed)=\"clearSuccess()\" [dismissible]=\"true\">\r\n {{ success() }}\r\n </ngb-alert>\r\n }\r\n\r\n <!-- Error Alert -->\r\n @if (error()) {\r\n <ngb-alert type=\"danger\" (closed)=\"clearError()\" [dismissible]=\"true\">\r\n {{ error() }}\r\n </ngb-alert>\r\n }\r\n\r\n <!-- ORCID Login Section -->\r\n @if (shouldShowOrcidLogin()) {\r\n <div class=\"mb-4\">\r\n <button \r\n type=\"button\" \r\n class=\"btn btn-primary w-100 mb-3\"\r\n [disabled]=\"loading()\"\r\n (click)=\"loginWithORCID()\">\r\n @if (loading()) {\r\n <span class=\"spinner-border spinner-border-sm me-2\" aria-hidden=\"true\"></span>\r\n }\r\n <i class=\"bi bi-person-badge me-2\"></i>\r\n Login with ORCID\r\n </button>\r\n <p class=\"text-muted text-center small\">\r\n Sign in with your ORCID account for seamless access\r\n </p>\r\n </div>\r\n }\r\n\r\n <!-- Divider -->\r\n @if (shouldShowOrcidLogin() && shouldShowRegularLogin()) {\r\n <div class=\"text-center mb-4\">\r\n <span class=\"text-muted\">or</span>\r\n </div>\r\n }\r\n\r\n <!-- Traditional Login Form -->\r\n @if (shouldShowRegularLogin()) {\r\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onSubmit()\">\r\n <div class=\"mb-3\">\r\n <label for=\"username\" class=\"form-label\">Username</label>\r\n <div class=\"input-group\">\r\n <span class=\"input-group-text\">\r\n <i class=\"bi bi-person\"></i>\r\n </span>\r\n <input \r\n type=\"text\" \r\n class=\"form-control\" \r\n id=\"username\"\r\n formControlName=\"username\"\r\n [class.is-invalid]=\"loginForm.get('username')?.invalid && loginForm.get('username')?.touched\"\r\n placeholder=\"Enter your username\">\r\n </div>\r\n @if (loginForm.get('username')?.invalid && loginForm.get('username')?.touched) {\r\n <div class=\"invalid-feedback d-block\">\r\n Username is required\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label for=\"password\" class=\"form-label\">Password</label>\r\n <div class=\"input-group\">\r\n <span class=\"input-group-text\">\r\n <i class=\"bi bi-lock\"></i>\r\n </span>\r\n <input \r\n type=\"password\" \r\n class=\"form-control\" \r\n id=\"password\"\r\n formControlName=\"password\"\r\n [class.is-invalid]=\"loginForm.get('password')?.invalid && loginForm.get('password')?.touched\"\r\n placeholder=\"Enter your password\">\r\n </div>\r\n @if (loginForm.get('password')?.invalid && loginForm.get('password')?.touched) {\r\n <div class=\"invalid-feedback d-block\">\r\n Password is required\r\n </div>\r\n }\r\n </div>\r\n\r\n <button \r\n type=\"submit\" \r\n class=\"btn btn-outline-primary w-100\"\r\n [disabled]=\"loginForm.invalid || loading()\">\r\n @if (loading()) {\r\n <span class=\"spinner-border spinner-border-sm me-2\" aria-hidden=\"true\"></span>\r\n }\r\n <i class=\"bi bi-box-arrow-in-right me-2\"></i>\r\n Sign In\r\n </button>\r\n </form>\r\n }\r\n\r\n <!-- Registration Information -->\r\n @if (shouldShowRegistration()) {\r\n <div class=\"mt-4 text-center\">\r\n <div class=\"alert alert-info py-2\" role=\"alert\">\r\n <i class=\"bi bi-person-plus me-1\"></i>\r\n <strong>New Users:</strong> {{ registrationMessage() }}\r\n <div class=\"mt-2\">\r\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm\" (click)=\"goToRegister()\">\r\n <i class=\"bi bi-person-plus me-1\"></i>Create Account\r\n </button>\r\n </div>\r\n <div class=\"mt-1\">\r\n <small class=\"text-muted\">\r\n @if (shouldShowOrcidLogin()) {\r\n <span>You can also sign in with ORCID to create an account</span>\r\n }\r\n </small>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Additional Information -->\r\n @if (siteConfig$ | async; as config) {\r\n <div class=\"mt-4 text-center\">\r\n <p class=\"text-muted small\">\r\n {{ config.siteName }} - Scientific Metadata Management\r\n </p>\r\n @if (shouldShowOrcidLogin() && !shouldShowRegistration()) {\r\n <p class=\"text-muted small\">\r\n <i class=\"bi bi-info-circle me-1\"></i>\r\n New users can sign in directly with ORCID\r\n </p>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, inject, OnInit, signal, computed } from '@angular/core';\nimport { FormBuilder, FormGroup, ReactiveFormsModule, Validators, AbstractControl } from '@angular/forms';\nimport { Router, ActivatedRoute } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { NgbAlert } from '@ng-bootstrap/ng-bootstrap';\nimport { ApiService } from '../../../services/api';\nimport { SiteConfigService } from '../../../services/site-config';\nimport { UserRegistrationRequest, UserResponse, RegistrationStatus } from '../../../models';\n\n@Component({\n selector: 'ccc-register',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbAlert],\n templateUrl: './register.html',\n styleUrl: './register.scss'\n})\nexport class RegisterComponent implements OnInit {\n private apiService = inject(ApiService);\n private fb = inject(FormBuilder);\n private router = inject(Router);\n private route = inject(ActivatedRoute);\n private siteConfigService = inject(SiteConfigService);\n\n registrationForm: FormGroup;\n loading = signal(false);\n error = signal<string | null>(null);\n success = signal<string | null>(null);\n \n siteConfig$ = this.siteConfigService.config$;\n\n registrationStatus = signal<RegistrationStatus | null>(null);\n registrationEnabled = signal(false);\n\n private returnUrl: string = '/login';\n\n constructor() {\n this.registrationForm = this.fb.group({\n username: ['', [Validators.required, Validators.minLength(3), Validators.maxLength(150)]],\n email: ['', [Validators.required, Validators.email, Validators.maxLength(254)]],\n firstName: ['', [Validators.required, Validators.maxLength(30)]],\n lastName: ['', [Validators.required, Validators.maxLength(30)]],\n password: ['', [Validators.required, Validators.minLength(8)]],\n confirmPassword: ['', [Validators.required]]\n }, { validators: this.passwordMatchValidator });\n }\n\n ngOnInit() {\n this.checkRegistrationStatus();\n\n this.route.queryParams.subscribe(params => {\n this.returnUrl = params['returnUrl'] || '/login';\n });\n }\n\n /**\n * Check if registration is enabled\n */\n private checkRegistrationStatus(): void {\n this.apiService.getRegistrationStatus().subscribe({\n next: (status) => {\n this.registrationStatus.set(status);\n this.registrationEnabled.set(status.registrationEnabled);\n \n if (!this.registrationEnabled()) {\n this.error.set(status.message || 'Registration is currently disabled');\n }\n },\n error: (error) => {\n this.error.set('Unable to check registration status. Please try again later.');\n }\n });\n }\n\n /**\n * Custom validator to check if passwords match\n */\n private passwordMatchValidator(form: AbstractControl): {[key: string]: any} | null {\n const password = form.get('password');\n const confirmPassword = form.get('confirmPassword');\n \n if (password && confirmPassword && password.value !== confirmPassword.value) {\n return { passwordMismatch: true };\n }\n return null;\n }\n\n /**\n * Handle form submission\n */\n onSubmit() {\n if (this.registrationForm.valid && this.registrationEnabled()) {\n this.loading.set(true);\n this.error.set(null);\n\n const registrationData: UserRegistrationRequest = {\n username: this.registrationForm.get('username')?.value,\n email: this.registrationForm.get('email')?.value,\n firstName: this.registrationForm.get('firstName')?.value,\n lastName: this.registrationForm.get('lastName')?.value,\n password: this.registrationForm.get('password')?.value,\n passwordConfirm: this.registrationForm.get('confirmPassword')?.value\n };\n\n this.apiService.registerUser(registrationData).subscribe({\n next: (response: UserResponse) => {\n this.loading.set(false);\n this.success.set(response.message || 'Registration successful! You can now log in with your credentials.');\n \n setTimeout(() => {\n this.router.navigate(['/login'], {\n queryParams: { \n returnUrl: this.returnUrl,\n registered: 'true',\n username: registrationData.username\n }\n });\n }, 2000);\n },\n error: (error) => {\n this.loading.set(false);\n \n if (error.error && typeof error.error === 'object') {\n const errors = [];\n for (const [field, messages] of Object.entries(error.error)) {\n if (Array.isArray(messages)) {\n errors.push(`${field}: ${messages.join(', ')}`);\n } else {\n errors.push(`${field}: ${messages}`);\n }\n }\n this.error.set(errors.join('\\n'));\n } else {\n this.error.set(error.error?.message || error.message || 'Registration failed. Please try again.');\n }\n }\n });\n }\n }\n\n /**\n * Navigate back to login\n */\n goToLogin() {\n this.router.navigate(['/login'], {\n queryParams: { returnUrl: this.returnUrl }\n });\n }\n\n /**\n * Clear error message\n */\n clearError() {\n this.error.set(null);\n }\n\n /**\n * Clear success message\n */\n clearSuccess() {\n this.success.set(null);\n }\n\n /**\n * Get field error message\n */\n getFieldErrorMessage(fieldName: string): string | null {\n const field = this.registrationForm.get(fieldName);\n if (field && field.invalid && field.touched) {\n if (field.errors?.['required']) {\n return `${this.getFieldDisplayName(fieldName)} is required`;\n }\n if (field.errors?.['email']) {\n return 'Please enter a valid email address';\n }\n if (field.errors?.['minlength']) {\n const requiredLength = field.errors?.['minlength'].requiredLength;\n return `${this.getFieldDisplayName(fieldName)} must be at least ${requiredLength} characters`;\n }\n if (field.errors?.['maxlength']) {\n const requiredLength = field.errors?.['maxlength'].requiredLength;\n return `${this.getFieldDisplayName(fieldName)} must be no more than ${requiredLength} characters`;\n }\n }\n \n if (fieldName === 'confirmPassword' && this.registrationForm.errors?.['passwordMismatch'] && field?.touched) {\n return 'Passwords do not match';\n }\n \n return null;\n }\n\n /**\n * Get user-friendly field display name\n */\n private getFieldDisplayName(fieldName: string): string {\n const displayNames: {[key: string]: string} = {\n username: 'Username',\n email: 'Email',\n firstName: 'First name',\n lastName: 'Last name',\n password: 'Password',\n confirmPassword: 'Confirm password'\n };\n return displayNames[fieldName] || fieldName;\n }\n\n /**\n * Check if a field has errors and should display error styling\n */\n hasFieldError(fieldName: string): boolean {\n const field = this.registrationForm.get(fieldName);\n if (fieldName === 'confirmPassword') {\n return (field?.invalid && field?.touched) || \n (this.registrationForm.errors?.['passwordMismatch'] && field?.touched) || false;\n }\n return field?.invalid && field?.touched || false;\n }\n\n /**\n * Computed signals for UI display logic\n */\n isRegistrationDisabled = computed(() => !this.registrationEnabled());\n canSubmitForm = computed(() => {\n return this.registrationForm.valid && this.registrationEnabled() && !this.loading();\n });\n}\n","<div class=\"container\">\n <div class=\"register-wrapper\">\n <div class=\"card\">\n <div class=\"card-body\">\n @if (siteConfig$ | async; as config) {\n <h3 class=\"card-title text-center mb-4\">\n <i class=\"bi bi-person-plus me-2\"></i>Create Account - {{ config.siteName }}\n </h3>\n }\n\n <!-- Success Alert -->\n @if (success()) {\n <ngb-alert type=\"success\" (closed)=\"clearSuccess()\" [dismissible]=\"true\">\n <i class=\"bi bi-check-circle me-2\"></i>{{ success() }}\n </ngb-alert>\n }\n\n <!-- Error Alert -->\n @if (error()) {\n <ngb-alert type=\"danger\" (closed)=\"clearError()\" [dismissible]=\"true\">\n <i class=\"bi bi-exclamation-triangle me-2\"></i>\n <span [innerHTML]=\"error()?.replace('\\n', '<br>') || ''\"></span>\n </ngb-alert>\n }\n\n <!-- Registration Disabled Message -->\n @if (!registrationEnabled() && !loading()) {\n <div class=\"alert alert-warning text-center\">\n <i class=\"bi bi-info-circle me-2\"></i>\n <strong>Registration Unavailable</strong>\n <div class=\"mt-2\">\n {{ registrationStatus()?.message || 'Registration is currently disabled' }}\n </div>\n <div class=\"mt-3\">\n <button type=\"button\" class=\"btn btn-outline-primary\" (click)=\"goToLogin()\">\n <i class=\"bi bi-arrow-left me-1\"></i>Back to Login\n </button>\n </div>\n </div>\n }\n\n <!-- Registration Form -->\n @if (registrationEnabled()) {\n <form [formGroup]=\"registrationForm\" (ngSubmit)=\"onSubmit()\">\n <!-- Username -->\n <div class=\"mb-3\">\n <label for=\"username\" class=\"form-label\">Username <span class=\"text-danger\">*</span></label>\n <div class=\"input-group\">\n <span class=\"input-group-text\">\n <i class=\"bi bi-person\"></i>\n </span>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"username\"\n formControlName=\"username\"\n [class.is-invalid]=\"hasFieldError('username')\"\n placeholder=\"Choose a username\">\n </div>\n @if (getFieldErrorMessage('username')) {\n <div class=\"invalid-feedback d-block\">\n {{ getFieldErrorMessage('username') }}\n </div>\n }\n <div class=\"form-text\">\n Username must be 3-150 characters. Only letters, numbers, and @/./+/-/_ allowed.\n </div>\n </div>\n\n <!-- Email -->\n <div class=\"mb-3\">\n <label for=\"email\" class=\"form-label\">Email Address <span class=\"text-danger\">*</span></label>\n <div class=\"input-group\">\n <span class=\"input-group-text\">\n <i class=\"bi bi-envelope\"></i>\n </span>\n <input \n type=\"email\" \n class=\"form-control\" \n id=\"email\"\n formControlName=\"email\"\n [class.is-invalid]=\"hasFieldError('email')\"\n placeholder=\"Enter your email address\">\n </div>\n @if (getFieldErrorMessage('email')) {\n <div class=\"invalid-feedback d-block\">\n {{ getFieldErrorMessage('email') }}\n </div>\n }\n </div>\n\n <!-- First Name and Last Name -->\n <div class=\"row\">\n <div class=\"col-md-6 mb-3\">\n <label for=\"first_name\" class=\"form-label\">First Name <span class=\"text-danger\">*</span></label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"first_name\"\n formControlName=\"firstName\"\n [class.is-invalid]=\"hasFieldError('firstName')\"\n placeholder=\"First name\">\n @if (getFieldErrorMessage('firstName')) {\n <div class=\"invalid-feedback d-block\">\n {{ getFieldErrorMessage('firstName') }}\n </div>\n }\n </div>\n <div class=\"col-md-6 mb-3\">\n <label for=\"last_name\" class=\"form-label\">Last Name <span class=\"text-danger\">*</span></label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"last_name\"\n formControlName=\"lastName\"\n [class.is-invalid]=\"hasFieldError('lastName')\"\n placeholder=\"Last name\">\n @if (getFieldErrorMessage('lastName')) {\n <div class=\"invalid-feedback d-block\">\n {{ getFieldErrorMessage('lastName') }}\n </div>\n }\n </div>\n </div>\n\n <!-- Password -->\n <div class=\"mb-3\">\n <label for=\"password\" class=\"form-label\">Password <span class=\"text-danger\">*</span></label>\n <div class=\"input-group\">\n <span class=\"input-group-text\">\n <i class=\"bi bi-lock\"></i>\n </span>\n <input \n type=\"password\" \n class=\"form-control\" \n id=\"password\"\n formControlName=\"password\"\n [class.is-invalid]=\"hasFieldError('password')\"\n placeholder=\"Create a password\">\n </div>\n @if (getFieldErrorMessage('password')) {\n <div class=\"invalid-feedback d-block\">\n {{ getFieldErrorMessage('password') }}\n </div>\n }\n <div class=\"form-text\">\n Password must be at least 8 characters long.\n </div>\n </div>\n\n <!-- Confirm Password -->\n <div class=\"mb-4\">\n <label for=\"confirm_password\" class=\"form-label\">Confirm Password <span class=\"text-danger\">*</span></label>\n <div class=\"input-group\">\n <span class=\"input-group-text\">\n <i class=\"bi bi-lock-fill\"></i>\n </span>\n <input \n type=\"password\" \n class=\"form-control\" \n id=\"confirm_password\"\n formControlName=\"confirmPassword\"\n [class.is-invalid]=\"hasFieldError('confirmPassword')\"\n placeholder=\"Confirm your password\">\n </div>\n @if (getFieldErrorMessage('confirmPassword')) {\n <div class=\"invalid-feedback d-block\">\n {{ getFieldErrorMessage('confirmPassword') }}\n </div>\n }\n </div>\n\n <!-- Submit Button -->\n <div class=\"d-grid gap-2 mb-3\">\n <button \n type=\"submit\" \n class=\"btn btn-primary\"\n [disabled]=\"registrationForm.invalid || loading() || !registrationEnabled()\">\n @if (loading()) {\n <span class=\"spinner-border spinner-border-sm me-2\" aria-hidden=\"true\"></span>\n }\n @if (!loading()) {\n <i class=\"bi bi-person-plus me-2\"></i>\n }\n Create Account\n </button>\n </div>\n\n <!-- Back to Login -->\n <div class=\"text-center\">\n <p class=\"text-muted small mb-2\">Already have an account?</p>\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"goToLogin()\">\n <i class=\"bi bi-arrow-left me-1\"></i>Back to Login\n </button>\n </div>\n </form>\n }\n\n <!-- Additional Information -->\n @if (siteConfig$ | async; as config) {\n <div class=\"mt-4 text-center\">\n <p class=\"text-muted small\">\n {{ config.siteName }} - Scientific Metadata Management\n </p>\n </div>\n }\n </div>\n </div>\n </div>\n</div>\n","import { Component, OnInit, signal, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbModule, NgbModal } from '@ng-bootstrap/ng-bootstrap';\nimport { debounceTime } from 'rxjs';\nimport { AuthService } from '../../../services/auth';\nimport { UserManagementService } from '../../../services/user-management';\nimport { \n User, \n UserCreateRequest, \n UserListResponse, \n AdminPasswordResetRequest \n} from '../../../models';\n\n@Component({\n selector: 'ccc-user-management',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, FormsModule, NgbModule],\n templateUrl: './user-management.html',\n styleUrl: './user-management.scss'\n})\nexport class UserManagementComponent implements OnInit {\n private fb = inject(FormBuilder);\n private userManagementService = inject(UserManagementService);\n private authService = inject(AuthService);\n private modalService = inject(NgbModal);\n\n // Data\n users = signal<User[]>([]);\n totalUsers = signal(0);\n isLoading = signal(false);\n \n // Search and filters\n searchForm: FormGroup;\n searchTerm = signal('');\n staffFilter = signal('');\n activeFilter = signal('');\n \n // Pagination\n currentPage = signal(1);\n pageSize = signal(10);\n \n // UI state\n selectedUser = signal<User | null>(null);\n isCreatingUser = signal(false);\n isUpdatingUser = signal(false);\n isDeletingUser = signal(false);\n isResettingPassword = signal(false);\n \n // Messages\n successMessage = signal<string>('');\n errorMessage = signal<string>('');\n\n // Make Math available in template\n Math = Math;\n\n // Computed signals\n totalPages = computed(() => Math.ceil(this.totalUsers() / this.pageSize()));\n \n pages = computed(() => {\n const total = this.totalPages();\n const current = this.currentPage();\n const pages: number[] = [];\n \n // Show up to 5 pages around current page\n const start = Math.max(1, current - 2);\n const end = Math.min(total, current + 2);\n \n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n \n return pages;\n });\n\n showingFrom = computed(() => ((this.currentPage() - 1) * this.pageSize()) + 1);\n \n showingTo = computed(() => Math.min(this.currentPage() * this.pageSize(), this.totalUsers()));\n\n hasResults = computed(() => this.users().length > 0);\n\n canGoToPreviousPage = computed(() => this.currentPage() > 1);\n \n canGoToNextPage = computed(() => this.currentPage() < this.totalPages());\n\n // Additional computed signals for UI state\n isAnyActionInProgress = computed(() => \n this.isCreatingUser() || \n this.isUpdatingUser() || \n this.isDeletingUser() || \n this.isResettingPassword()\n );\n\n selectedUserDisplayName = computed(() => {\n const user = this.selectedUser();\n return user ? this.getUserDisplayName(user) : '';\n });\n\n // Computed signal for modal states\n hasSelectedUser = computed(() => this.selectedUser() !== null);\n\n // Computed signals for form states\n canCreateUser = computed(() => !this.isCreatingUser());\n canUpdateUser = computed(() => !this.isUpdatingUser());\n canResetPassword = computed(() => !this.isResettingPassword());\n\n constructor() {\n this.searchForm = this.fb.group({\n search: [''],\n isStaff: [''],\n isActive: ['']\n });\n }\n\n ngOnInit() {\n this.loadUsers();\n \n // Subscribe to search form changes with debounce\n this.searchForm.valueChanges.pipe(\n debounceTime(300)\n ).subscribe((values) => {\n this.searchTerm.set(values.search || '');\n this.staffFilter.set(values.isStaff || '');\n this.activeFilter.set(values.isActive || '');\n this.currentPage.set(1);\n });\n }\n\n loadUsers(): void {\n this.isLoading.set(true);\n this.errorMessage.set('');\n\n const offset = (this.currentPage() - 1) * this.pageSize();\n const searchParams = {\n search: this.searchTerm() || undefined,\n isStaff: this.staffFilter() !== '' ? this.staffFilter() === 'true' : undefined,\n isActive: this.activeFilter() !== '' ? this.activeFilter() === 'true' : undefined,\n limit: this.pageSize(),\n offset: offset\n };\n\n this.userManagementService.getUsers(searchParams).subscribe({\n next: (response: UserListResponse) => {\n this.users.set(response.results);\n this.totalUsers.set(response.count);\n this.isLoading.set(false);\n },\n error: (error) => {\n this.errorMessage.set('Failed to load users');\n this.isLoading.set(false);\n }\n });\n }\n\n openCreateUserModal(content: any): void {\n this.selectedUser.set(null);\n this.modalService.open(content, { size: 'lg' });\n }\n\n openEditUserModal(content: any, user: User): void {\n this.selectedUser.set(user);\n this.modalService.open(content, { size: 'lg' });\n }\n\n openPasswordResetModal(content: any, user: User): void {\n this.selectedUser.set(user);\n this.modalService.open(content);\n }\n\n createUser(userData: UserCreateRequest): void {\n this.isCreatingUser.set(true);\n this.errorMessage.set('');\n\n this.userManagementService.createUser(userData).subscribe({\n next: (response) => {\n this.successMessage.set(`User ${userData.username} created successfully`);\n this.loadUsers();\n this.isCreatingUser.set(false);\n this.modalService.dismissAll();\n },\n error: (error) => {\n this.errorMessage.set(error.error?.message || 'Failed to create user');\n this.isCreatingUser.set(false);\n }\n });\n }\n\n updateUser(userId: number, userData: Partial<User>): void {\n this.isUpdatingUser.set(true);\n this.errorMessage.set('');\n\n this.userManagementService.updateUser(userId, userData).subscribe({\n next: (updatedUser) => {\n this.successMessage.set(`User ${updatedUser.username} updated successfully`);\n this.loadUsers();\n this.isUpdatingUser.set(false);\n this.modalService.dismissAll();\n },\n error: (error) => {\n this.errorMessage.set(error.error?.message || 'Failed to update user');\n this.isUpdatingUser.set(false);\n }\n });\n }\n\n deleteUser(user: User): void {\n if (!user.id) return;\n \n if (confirm(`Are you sure you want to delete user \"${user.username}\"? This action cannot be undone.`)) {\n this.isDeletingUser.set(true);\n this.errorMessage.set('');\n\n this.userManagementService.deleteUser(user.id).subscribe({\n next: () => {\n this.successMessage.set(`User ${user.username} deleted successfully`);\n this.loadUsers();\n this.isDeletingUser.set(false);\n },\n error: (error) => {\n this.errorMessage.set(error.error?.message || 'Failed to delete user');\n this.isDeletingUser.set(false);\n }\n });\n }\n }\n\n resetUserPassword(userId: number, passwordData: AdminPasswordResetRequest): void {\n this.isResettingPassword.set(true);\n this.errorMessage.set('');\n\n this.userManagementService.resetUserPassword(userId, passwordData).subscribe({\n next: (response) => {\n this.successMessage.set(response.message || 'Password reset successfully');\n this.isResettingPassword.set(false);\n this.modalService.dismissAll();\n },\n error: (error) => {\n this.errorMessage.set(error.error?.message || 'Failed to reset password');\n this.isResettingPassword.set(false);\n }\n });\n }\n\n toggleUserStatus(user: User): void {\n if (!user.id) return;\n \n const newStatus = !user.isActive;\n const action = newStatus ? 'activate' : 'deactivate';\n \n if (confirm(`Are you sure you want to ${action} user \"${user.username}\"?`)) {\n this.updateUser(user.id, { isActive: newStatus });\n }\n }\n\n toggleStaffStatus(user: User): void {\n if (!user.id) return;\n \n const newStatus = !user.isStaff;\n const action = newStatus ? 'grant staff privileges to' : 'revoke staff privileges from';\n \n if (confirm(`Are you sure you want to ${action} user \"${user.username}\"?`)) {\n this.updateUser(user.id, { isStaff: newStatus });\n }\n }\n\n onPageChange(page: number): void {\n this.currentPage.set(page);\n this.loadUsers();\n }\n\n clearMessages(): void {\n this.successMessage.set('');\n this.errorMessage.set('');\n }\n\n\n formatDate(dateString?: string): string {\n return this.userManagementService.formatDate(dateString);\n }\n\n getUserDisplayName(user: User): string {\n return this.userManagementService.getUserDisplayName(user);\n }\n}","<div class=\"user-management-container\">\n <!-- Header Section -->\n <nav class=\"navbar navbar-expand-lg bg-body-tertiary shadow-sm\">\n <div class=\"container-fluid\">\n <div class=\"d-flex align-items-center justify-content-between w-100\">\n <div class=\"d-flex align-items-center\">\n <h4 class=\"mb-0\">\n <i class=\"bi bi-people-fill me-2 text-primary\"></i>User Management\n </h4>\n <span class=\"badge bg-primary ms-3\">{{ totalUsers() }} users</span>\n </div>\n\n <div class=\"d-flex gap-2\">\n <button\n type=\"button\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"openCreateUserModal(createUserModal)\"\n [disabled]=\"isLoading()\">\n <i class=\"bi bi-person-plus me-1\"></i>Create User\n </button>\n </div>\n </div>\n </div>\n </nav>\n\n <div class=\"users-content p-4\">\n <!-- Search and Filters Section -->\n <div class=\"card mb-4\">\n <div class=\"card-header\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-search me-2\"></i>Search & Filters\n </h5>\n </div>\n <div class=\"card-body\">\n <form [formGroup]=\"searchForm\" class=\"row g-3\">\n <div class=\"col-md-4\">\n <label for=\"search\" class=\"form-label\">Search</label>\n <div class=\"input-group\">\n <span class=\"input-group-text\">\n <i class=\"bi bi-search\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"search\"\n formControlName=\"search\"\n placeholder=\"Search by username, email, or name\">\n </div>\n </div>\n\n <div class=\"col-md-4\">\n <label for=\"isStaff\" class=\"form-label\">Staff Status</label>\n <select class=\"form-select\" id=\"isStaff\" formControlName=\"isStaff\">\n <option value=\"\">All Users</option>\n <option value=\"true\">Staff Only</option>\n <option value=\"false\">Regular Users</option>\n </select>\n </div>\n\n <div class=\"col-md-4\">\n <label for=\"isActive\" class=\"form-label\">Account Status</label>\n <select class=\"form-select\" id=\"isActive\" formControlName=\"isActive\">\n <option value=\"\">All Accounts</option>\n <option value=\"true\">Active Only</option>\n <option value=\"false\">Inactive Only</option>\n </select>\n </div>\n </form>\n </div>\n </div>\n\n <!-- Success/Error Messages -->\n @if (successMessage()) {\n <div class=\"alert alert-success alert-dismissible\">\n <i class=\"bi bi-check-circle me-2\"></i>{{ successMessage() }}\n <button type=\"button\" class=\"btn-close\" (click)=\"clearMessages()\"></button>\n </div>\n }\n\n @if (errorMessage()) {\n <div class=\"alert alert-danger alert-dismissible\">\n <i class=\"bi bi-exclamation-triangle me-2\"></i>{{ errorMessage() }}\n <button type=\"button\" class=\"btn-close\" (click)=\"clearMessages()\"></button>\n </div>\n }\n\n <!-- Users Table -->\n <div class=\"card\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-table me-2\"></i>Users\n <span class=\"badge bg-primary ms-2\">{{ users().length }}</span>\n </h5>\n @if (isLoading()) {\n <div class=\"spinner-border spinner-border-sm text-primary\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n }\n </div>\n <div class=\"card-body p-0\">\n @if (hasResults()) {\n <div class=\"table-responsive\">\n <table class=\"table table-hover mb-0\">\n <thead class=\"table-light\">\n <tr>\n <th>User</th>\n <th>Contact</th>\n <th>Status</th>\n <th>Joined</th>\n <th>Last Login</th>\n <th class=\"text-end\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (user of users(); track user.id) {\n <tr>\n <td>\n <div class=\"d-flex align-items-center\">\n <div>\n <div class=\"fw-semibold\">{{ getUserDisplayName(user) }}</div>\n <small class=\"text-muted\">@{{ user.username }}</small>\n </div>\n </div>\n </td>\n <td>\n <div>{{ user.email }}</div>\n </td>\n <td>\n <div class=\"d-flex gap-1 flex-wrap\">\n @if (user.isActive) {\n <span class=\"badge bg-success\">Active</span>\n } @else {\n <span class=\"badge bg-danger\">Inactive</span>\n }\n @if (user.isStaff) {\n <span class=\"badge bg-warning\">Staff</span>\n }\n </div>\n </td>\n <td>{{ formatDate(user.dateJoined) }}</td>\n <td>{{ formatDate(user.lastLogin) }}</td>\n <td class=\"text-end\">\n <div class=\"btn-group btn-group-sm\" role=\"group\">\n <button\n type=\"button\"\n class=\"btn btn-outline-primary\"\n (click)=\"openEditUserModal(editUserModal, user)\"\n title=\"Edit user\">\n <i class=\"bi bi-pencil\"></i>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-outline-warning\"\n (click)=\"openPasswordResetModal(passwordResetModal, user)\"\n title=\"Reset password\">\n <i class=\"bi bi-shield-lock\"></i>\n </button>\n <button\n type=\"button\"\n class=\"btn\"\n [class]=\"user.isActive ? 'btn-outline-secondary' : 'btn-outline-success'\"\n (click)=\"toggleUserStatus(user)\"\n [title]=\"user.isActive ? 'Deactivate user' : 'Activate user'\">\n <i class=\"bi\" [class]=\"user.isActive ? 'bi-person-dash' : 'bi-person-check'\"></i>\n </button>\n <button\n type=\"button\"\n class=\"btn\"\n [class]=\"user.isStaff ? 'btn-outline-secondary' : 'btn-outline-info'\"\n (click)=\"toggleStaffStatus(user)\"\n [title]=\"user.isStaff ? 'Remove staff privileges' : 'Grant staff privileges'\">\n <i class=\"bi\" [class]=\"user.isStaff ? 'bi-person-x' : 'bi-person-badge'\"></i>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-outline-danger\"\n (click)=\"deleteUser(user)\"\n title=\"Delete user\">\n <i class=\"bi bi-trash\"></i>\n </button>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <!-- Pagination -->\n @if (totalPages() > 1) {\n <div class=\"d-flex justify-content-between align-items-center p-3 border-top\">\n <div class=\"text-muted\">\n Showing {{ showingFrom() }} to {{ showingTo() }} of {{ totalUsers() }} users\n </div>\n <nav>\n <ul class=\"pagination pagination-sm mb-0\">\n <li class=\"page-item\" [class.disabled]=\"!canGoToPreviousPage()\">\n <button class=\"page-link\" (click)=\"onPageChange(currentPage() - 1)\" [disabled]=\"!canGoToPreviousPage()\">\n <i class=\"bi bi-chevron-left\"></i>\n </button>\n </li>\n @for (page of pages(); track page) {\n <li class=\"page-item\" [class.active]=\"page === currentPage()\">\n <button class=\"page-link\" (click)=\"onPageChange(page)\">{{ page }}</button>\n </li>\n }\n <li class=\"page-item\" [class.disabled]=\"!canGoToNextPage()\">\n <button class=\"page-link\" (click)=\"onPageChange(currentPage() + 1)\" [disabled]=\"!canGoToNextPage()\">\n <i class=\"bi bi-chevron-right\"></i>\n </button>\n </li>\n </ul>\n </nav>\n </div>\n }\n } @else {\n <div class=\"text-center p-4\">\n <i class=\"bi bi-people display-4 text-muted\"></i>\n <p class=\"text-muted mt-2\">No users found</p>\n </div>\n }\n </div>\n </div>\n </div>\n</div>\n\n<!-- Create User Modal -->\n<ng-template #createUserModal let-modal>\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-person-plus me-2\"></i>Create User\n </h4>\n <button type=\"button\" class=\"btn-close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <form #createForm=\"ngForm\" (ngSubmit)=\"createUser(createForm.value)\">\n <div class=\"row g-3\">\n <div class=\"col-md-6\">\n <label for=\"createUsername\" class=\"form-label\">Username</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"createUsername\"\n name=\"username\"\n ngModel\n required\n #usernameField=\"ngModel\">\n @if (usernameField.invalid && usernameField.touched) {\n <div class=\"text-danger small\">Username is required</div>\n }\n </div>\n <div class=\"col-md-6\">\n <label for=\"createEmail\" class=\"form-label\">Email</label>\n <input\n type=\"email\"\n class=\"form-control\"\n id=\"createEmail\"\n name=\"email\"\n ngModel\n required\n email\n #emailField=\"ngModel\">\n @if (emailField.invalid && emailField.touched) {\n <div class=\"text-danger small\">Valid email is required</div>\n }\n </div>\n </div>\n <div class=\"row g-3 mt-1\">\n <div class=\"col-md-6\">\n <label for=\"createFirstName\" class=\"form-label\">First Name</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"createFirstName\"\n name=\"firstName\"\n ngModel\n required\n #firstNameField=\"ngModel\">\n @if (firstNameField.invalid && firstNameField.touched) {\n <div class=\"text-danger small\">First name is required</div>\n }\n </div>\n <div class=\"col-md-6\">\n <label for=\"createLastName\" class=\"form-label\">Last Name</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"createLastName\"\n name=\"lastName\"\n ngModel\n required\n #lastNameField=\"ngModel\">\n @if (lastNameField.invalid && lastNameField.touched) {\n <div class=\"text-danger small\">Last name is required</div>\n }\n </div>\n </div>\n <div class=\"row g-3 mt-1\">\n <div class=\"col-md-6\">\n <label for=\"createPassword\" class=\"form-label\">Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"createPassword\"\n name=\"password\"\n ngModel\n required\n minlength=\"8\"\n #passwordField=\"ngModel\">\n @if (passwordField.invalid && passwordField.touched) {\n <div class=\"text-danger small\">Password must be at least 8 characters</div>\n }\n </div>\n <div class=\"col-md-6\">\n <label for=\"createPasswordConfirm\" class=\"form-label\">Confirm Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"createPasswordConfirm\"\n name=\"password_confirm\"\n ngModel\n required\n #passwordConfirmField=\"ngModel\">\n @if (passwordConfirmField.invalid && passwordConfirmField.touched) {\n <div class=\"text-danger small\">Password confirmation is required</div>\n }\n </div>\n </div>\n <div class=\"row g-3 mt-1\">\n <div class=\"col-md-6\">\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"createIsStaff\"\n name=\"isStaff\"\n ngModel>\n <label class=\"form-check-label\" for=\"createIsStaff\">\n Staff privileges\n </label>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"createIsActive\"\n name=\"isActive\"\n ngModel\n checked>\n <label class=\"form-check-label\" for=\"createIsActive\">\n Active account\n </label>\n </div>\n </div>\n </div>\n </form>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"modal.dismiss()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"createUser(createForm.value)\"\n [disabled]=\"createForm.invalid || !canCreateUser()\">\n @if (isCreatingUser()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-person-plus me-1\"></i>Create User\n </button>\n </div>\n</ng-template>\n\n<!-- Edit User Modal -->\n<ng-template #editUserModal let-modal>\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-pencil me-2\"></i>Edit User\n </h4>\n <button type=\"button\" class=\"btn-close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n @if (hasSelectedUser()) {\n <form #editForm=\"ngForm\" id=\"editUserForm\" (ngSubmit)=\"updateUser(selectedUser()!.id!, editForm.value)\">\n <div class=\"row g-3\">\n <div class=\"col-md-6\">\n <label for=\"editUsername\" class=\"form-label\">Username</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"editUsername\"\n name=\"username\"\n [ngModel]=\"selectedUser()!.username\"\n required\n #editUsernameField=\"ngModel\">\n @if (editUsernameField.invalid && editUsernameField.touched) {\n <div class=\"text-danger small\">Username is required</div>\n }\n </div>\n <div class=\"col-md-6\">\n <label for=\"editEmail\" class=\"form-label\">Email</label>\n <input\n type=\"email\"\n class=\"form-control\"\n id=\"editEmail\"\n name=\"email\"\n [ngModel]=\"selectedUser()!.email\"\n required\n email\n #editEmailField=\"ngModel\">\n @if (editEmailField.invalid && editEmailField.touched) {\n <div class=\"text-danger small\">Valid email is required</div>\n }\n </div>\n </div>\n <div class=\"row g-3 mt-1\">\n <div class=\"col-md-6\">\n <label for=\"editFirstName\" class=\"form-label\">First Name</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"editFirstName\"\n name=\"firstName\"\n [ngModel]=\"selectedUser()!.firstName\"\n required\n #editFirstNameField=\"ngModel\">\n @if (editFirstNameField.invalid && editFirstNameField.touched) {\n <div class=\"text-danger small\">First name is required</div>\n }\n </div>\n <div class=\"col-md-6\">\n <label for=\"editLastName\" class=\"form-label\">Last Name</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"editLastName\"\n name=\"lastName\"\n [ngModel]=\"selectedUser()!.lastName\"\n required\n #editLastNameField=\"ngModel\">\n @if (editLastNameField.invalid && editLastNameField.touched) {\n <div class=\"text-danger small\">Last name is required</div>\n }\n </div>\n </div>\n <div class=\"row g-3 mt-1\">\n <div class=\"col-md-6\">\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"editIsStaff\"\n name=\"isStaff\"\n [ngModel]=\"selectedUser()!.isStaff\">\n <label class=\"form-check-label\" for=\"editIsStaff\">\n Staff privileges\n </label>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"editIsActive\"\n name=\"isActive\"\n [ngModel]=\"selectedUser()!.isActive\">\n <label class=\"form-check-label\" for=\"editIsActive\">\n Active account\n </label>\n </div>\n </div>\n </div>\n </form>\n }\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"modal.dismiss()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n @if (hasSelectedUser()) {\n <button\n type=\"submit\"\n class=\"btn btn-primary\"\n form=\"editUserForm\"\n [disabled]=\"!canUpdateUser()\">\n @if (isUpdatingUser()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-check-circle me-1\"></i>Update User\n </button>\n }\n </div>\n</ng-template>\n\n<!-- Password Reset Modal -->\n<ng-template #passwordResetModal let-modal>\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-shield-lock me-2\"></i>Reset Password\n </h4>\n <button type=\"button\" class=\"btn-close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n @if (hasSelectedUser()) {\n <div class=\"alert alert-warning\">\n <i class=\"bi bi-exclamation-triangle me-2\"></i>\n You are about to reset the password for user <strong>{{ selectedUserDisplayName() }}</strong>.\n </div>\n \n <form #resetForm=\"ngForm\" id=\"resetPasswordForm\" (ngSubmit)=\"resetUserPassword(selectedUser()!.id!, resetForm.value)\">\n <div class=\"mb-3\">\n <label for=\"resetNewPassword\" class=\"form-label\">New Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"resetNewPassword\"\n name=\"new_password\"\n ngModel\n required\n minlength=\"8\"\n #resetPasswordField=\"ngModel\">\n @if (resetPasswordField.invalid && resetPasswordField.touched) {\n <div class=\"text-danger small\">Password must be at least 8 characters</div>\n }\n </div>\n <div class=\"mb-3\">\n <label for=\"resetConfirmPassword\" class=\"form-label\">Confirm Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"resetConfirmPassword\"\n name=\"confirm_password\"\n ngModel\n required\n #resetConfirmField=\"ngModel\">\n @if (resetConfirmField.invalid && resetConfirmField.touched) {\n <div class=\"text-danger small\">Password confirmation is required</div>\n }\n </div>\n <div class=\"mb-3\">\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"forcePasswordChange\"\n name=\"force_password_change\"\n ngModel>\n <label class=\"form-check-label\" for=\"forcePasswordChange\">\n Force user to change password on next login\n </label>\n </div>\n </div>\n <div class=\"mb-3\">\n <label for=\"resetReason\" class=\"form-label\">Reason (optional)</label>\n <textarea\n class=\"form-control\"\n id=\"resetReason\"\n name=\"reason\"\n ngModel\n rows=\"2\"\n placeholder=\"Optional reason for password reset\"></textarea>\n </div>\n </form>\n }\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"modal.dismiss()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n @if (hasSelectedUser()) {\n <button\n type=\"submit\"\n class=\"btn btn-warning\"\n form=\"resetPasswordForm\"\n [disabled]=\"!canResetPassword()\">\n @if (isResettingPassword()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-shield-lock me-1\"></i>Reset Password\n </button>\n }\n </div>\n</ng-template>","import { Component, OnInit, signal, computed, effect, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, NonNullableFormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbModule, NgbModal } from '@ng-bootstrap/ng-bootstrap';\nimport { debounceTime, distinctUntilChanged } from 'rxjs';\nimport { \n LabGroup, \n LabGroupQueryResponse,\n LabGroupCreateRequest,\n LabGroupMember,\n LabGroupInvitation,\n LabGroupInvitationCreateRequest\n} from '../../../models';\nimport { LabGroupService } from '../../../services/lab-group';\nimport { ToastService } from '../../../services/toast';\n\n@Component({\n selector: 'ccc-lab-groups',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbModule],\n templateUrl: './lab-groups.html',\n styleUrls: ['./lab-groups.scss']\n})\nexport class LabGroupsComponent implements OnInit {\n // Inject services using modern inject() syntax\n private readonly fb = inject(NonNullableFormBuilder);\n private readonly labGroupService = inject(LabGroupService);\n private readonly modalService = inject(NgbModal);\n private readonly toastService = inject(ToastService);\n\n // Forms\n searchForm: FormGroup;\n createGroupForm: FormGroup;\n inviteForm: FormGroup;\n \n // Signals for reactive state management\n private searchParams = signal<{\n search: string;\n limit: number;\n offset: number;\n }>({\n search: '',\n limit: 10,\n offset: 0\n });\n\n // State signals\n isLoading = signal(false);\n isCreatingGroup = signal(false);\n isInviting = signal(false);\n currentPage = signal(1);\n pageSize = signal(10);\n totalItems = signal(0);\n \n // Data signals\n labGroupsData = signal<LabGroupQueryResponse>({ count: 0, results: [] });\n selectedGroup = signal<LabGroup | null>(null);\n groupMembers = signal<LabGroupMember[]>([]);\n pendingInvitations = signal<LabGroupInvitation[]>([]);\n\n // UI state\n showCreateForm = signal(false);\n showInviteForm = signal(false);\n selectedGroupForMembers = signal<LabGroup | null>(null);\n\n // Member pagination\n memberTotal = signal(0);\n memberPage = signal(1);\n memberPageSize = signal(10);\n directMembersOnly = signal(false);\n\n // Computed values\n hasLabGroups = computed(() => this.labGroupsData().results.length > 0);\n showPagination = computed(() => this.labGroupsData().count > this.pageSize());\n totalPages = computed(() => Math.ceil(this.labGroupsData().count / this.pageSize()));\n hasSearchValue = computed(() => (this.searchForm?.get('search')?.value || '').trim().length > 0);\n hasGroupMembers = computed(() => this.groupMembers().length > 0);\n hasPendingInvitations = computed(() => this.pendingInvitations().length > 0);\n canInviteToCurrentGroup = computed(() => this.selectedGroupForMembers()?.canInvite || false);\n canManageCurrentGroup = computed(() => this.selectedGroupForMembers()?.canManage || false);\n currentGroupName = computed(() => this.selectedGroupForMembers()?.name || '');\n groupMembersCount = computed(() => this.memberTotal());\n pendingInvitationsCount = computed(() => this.pendingInvitations().length);\n showMemberPagination = computed(() => this.memberTotal() > this.memberPageSize());\n memberTotalPages = computed(() => Math.ceil(this.memberTotal() / this.memberPageSize()));\n hasSubGroups = computed(() => (this.selectedGroupForMembers()?.subGroupsCount ?? 0) > 0);\n\n constructor() {\n this.searchForm = this.fb.group({\n search: ['']\n });\n\n this.createGroupForm = this.fb.group({\n name: ['', [Validators.required, Validators.minLength(2)]],\n description: [''],\n allowMemberInvites: [true]\n });\n\n this.inviteForm = this.fb.group({\n invitedEmail: ['', [Validators.required, Validators.email]],\n message: ['']\n });\n\n // Effect to automatically reload lab groups when search params change\n effect(() => {\n const params = this.searchParams();\n this.loadLabGroupsWithParams(params);\n }, { allowSignalWrites: true });\n }\n\n ngOnInit() {\n this.setupSearch();\n this.loadInitialData();\n }\n\n private loadInitialData(): void {\n this.searchParams.set({\n search: '',\n limit: this.pageSize(),\n offset: 0\n });\n }\n\n private setupSearch(): void {\n this.searchForm.valueChanges.pipe(\n debounceTime(300),\n distinctUntilChanged()\n ).subscribe(formValue => {\n this.currentPage.set(1);\n \n this.searchParams.set({\n search: formValue.search?.trim() || '',\n limit: this.pageSize(),\n offset: 0\n });\n });\n }\n\n private loadLabGroupsWithParams(params: { search: string; limit: number; offset: number }): void {\n this.isLoading.set(true);\n \n this.labGroupService.getLabGroups({\n search: params.search || undefined,\n limit: params.limit,\n offset: params.offset\n }).subscribe({\n next: (response: LabGroupQueryResponse) => {\n this.isLoading.set(false);\n this.totalItems.set(response.count);\n this.labGroupsData.set(response);\n },\n error: (error) => {\n this.isLoading.set(false);\n this.labGroupsData.set({ count: 0, results: [] });\n console.error('Error loading lab groups:', error);\n }\n });\n }\n\n onPageChange(page: number): void {\n this.currentPage.set(page);\n this.searchParams.update(params => ({\n ...params,\n offset: (page - 1) * this.pageSize()\n }));\n }\n\n toggleCreateForm(): void {\n this.showCreateForm.update(show => !show);\n if (!this.showCreateForm()) {\n this.createGroupForm.reset({\n name: '',\n description: '',\n allowMemberInvites: true\n });\n }\n }\n\n createLabGroup(): void {\n if (this.createGroupForm.valid) {\n this.isCreatingGroup.set(true);\n const formValue = this.createGroupForm.value as LabGroupCreateRequest;\n \n this.labGroupService.createLabGroup(formValue).subscribe({\n next: (newGroup: LabGroup) => {\n this.isCreatingGroup.set(false);\n this.toastService.success(`Lab group \"${newGroup.name}\" created successfully!`);\n this.toggleCreateForm();\n this.refreshLabGroups();\n },\n error: (error) => {\n this.isCreatingGroup.set(false);\n const errorMsg = error?.error?.detail || error?.message || 'Failed to create lab group. Please try again.';\n this.toastService.error(errorMsg);\n console.error('Error creating lab group:', error);\n }\n });\n }\n }\n\n viewGroupMembers(group: LabGroup): void {\n this.selectedGroupForMembers.set(group);\n this.memberPage.set(1);\n this.directMembersOnly.set(false);\n this.loadGroupMembers(group.id);\n this.loadPendingInvitations(group.id);\n }\n\n private loadGroupMembers(groupId: number): void {\n const offset = (this.memberPage() - 1) * this.memberPageSize();\n this.labGroupService.getLabGroupMembers(groupId, {\n directOnly: this.directMembersOnly(),\n limit: this.memberPageSize(),\n offset: offset\n }).subscribe({\n next: (response) => {\n this.groupMembers.set(response.results);\n this.memberTotal.set(response.count);\n },\n error: (error) => {\n this.groupMembers.set([]);\n this.memberTotal.set(0);\n console.error('Error loading group members:', error);\n }\n });\n }\n\n private loadPendingInvitations(groupId: number): void {\n this.labGroupService.getLabGroupInvitations({\n labGroup: groupId,\n status: 'pending'\n }).subscribe({\n next: (response) => {\n this.pendingInvitations.set(response.results);\n },\n error: (error) => {\n this.pendingInvitations.set([]);\n console.error('Error loading pending invitations:', error);\n }\n });\n }\n\n toggleInviteForm(): void {\n this.showInviteForm.update(show => !show);\n if (!this.showInviteForm()) {\n this.inviteForm.reset();\n }\n }\n\n inviteMember(): void {\n if (this.inviteForm.valid && this.selectedGroupForMembers()) {\n this.isInviting.set(true);\n const groupId = this.selectedGroupForMembers()!.id;\n \n const inviteData: LabGroupInvitationCreateRequest = {\n labGroup: groupId,\n invitedEmail: this.inviteForm.value.invitedEmail,\n message: this.inviteForm.value.message || undefined\n };\n \n this.labGroupService.inviteUserToLabGroup(groupId, inviteData).subscribe({\n next: (invitation: LabGroupInvitation) => {\n this.isInviting.set(false);\n this.toastService.success(`Invitation sent to ${invitation.invitedEmail}!`);\n this.toggleInviteForm();\n this.loadPendingInvitations(groupId);\n },\n error: (error) => {\n this.isInviting.set(false);\n const errorMsg = error?.error?.detail || error?.message || 'Failed to send invitation. Please try again.';\n this.toastService.error(errorMsg);\n console.error('Error sending invitation:', error);\n }\n });\n }\n }\n\n removeMember(userId: number): void {\n const group = this.selectedGroupForMembers();\n if (!group) return;\n\n const confirmMessage = `Are you sure you want to remove this member from \"${group.name}\"?`;\n \n if (confirm(confirmMessage)) {\n this.labGroupService.removeMemberFromLabGroup(group.id, userId).subscribe({\n next: (response: {message: string}) => {\n this.loadGroupMembers(group.id);\n this.toastService.success('Member removed successfully!');\n },\n error: (error) => {\n const errorMsg = error?.error?.detail || error?.message || 'Failed to remove member. Please try again.';\n this.toastService.error(errorMsg);\n console.error('Error removing member:', error);\n }\n });\n }\n }\n\n cancelInvitation(invitationId: number): void {\n const confirmMessage = 'Are you sure you want to cancel this invitation?';\n \n if (confirm(confirmMessage)) {\n this.labGroupService.cancelLabGroupInvitation(invitationId).subscribe({\n next: (response) => {\n const group = this.selectedGroupForMembers();\n if (group) {\n this.loadPendingInvitations(group.id);\n }\n this.toastService.success('Invitation cancelled successfully!');\n },\n error: (error) => {\n const errorMsg = error?.error?.detail || error?.message || 'Failed to cancel invitation. Please try again.';\n this.toastService.error(errorMsg);\n console.error('Error cancelling invitation:', error);\n }\n });\n }\n }\n\n leaveGroup(group: LabGroup): void {\n const confirmMessage = `Are you sure you want to leave \"${group.name}\"?`;\n \n if (confirm(confirmMessage)) {\n this.labGroupService.leaveLabGroup(group.id).subscribe({\n next: (response) => {\n this.refreshLabGroups();\n this.selectedGroupForMembers.set(null);\n this.toastService.success(`Successfully left \"${group.name}\"!`);\n },\n error: (error) => {\n const errorMsg = error?.error?.detail || error?.message || 'Failed to leave group. Please try again.';\n this.toastService.error(errorMsg);\n console.error('Error leaving group:', error);\n }\n });\n }\n }\n\n deleteGroup(group: LabGroup): void {\n const confirmMessage = `Are you sure you want to delete the lab group \"${group.name}\"?\\n\\nThis action cannot be undone.`;\n \n if (confirm(confirmMessage)) {\n this.labGroupService.deleteLabGroup(group.id).subscribe({\n next: () => {\n this.refreshLabGroups();\n this.selectedGroupForMembers.set(null);\n this.toastService.success(`Lab group \"${group.name}\" deleted successfully!`);\n },\n error: (error) => {\n const errorMsg = error?.error?.detail || error?.message || 'Failed to delete lab group. Please try again.';\n this.toastService.error(errorMsg);\n console.error('Error deleting group:', error);\n }\n });\n }\n }\n\n private refreshLabGroups(): void {\n this.searchParams.update(params => ({ ...params }));\n }\n\n closeGroupDetails(): void {\n this.selectedGroupForMembers.set(null);\n this.groupMembers.set([]);\n this.memberTotal.set(0);\n this.memberPage.set(1);\n this.pendingInvitations.set([]);\n this.showInviteForm.set(false);\n }\n\n toggleDirectMembersOnly(): void {\n this.directMembersOnly.update(v => !v);\n this.memberPage.set(1);\n const group = this.selectedGroupForMembers();\n if (group) {\n this.loadGroupMembers(group.id);\n }\n }\n\n onMemberPageChange(page: number): void {\n this.memberPage.set(page);\n const group = this.selectedGroupForMembers();\n if (group) {\n this.loadGroupMembers(group.id);\n }\n }\n}\n","<div class=\"lab-groups-container\">\n <!-- Header Section -->\n <nav class=\"navbar navbar-expand-lg bg-body-tertiary shadow-sm\">\n <div class=\"container-fluid\">\n <div class=\"d-flex align-items-center justify-content-between w-100\">\n <div class=\"d-flex align-items-center\">\n <h4 class=\"navbar-brand m-0 fw-bold\">\n <i class=\"bi bi-people me-2\"></i>Lab Groups\n </h4>\n </div>\n <div class=\"d-flex gap-2\">\n <button type=\"button\" class=\"btn btn-primary btn-sm\" (click)=\"toggleCreateForm()\">\n <i class=\"bi bi-plus me-1\"></i>New Lab Group\n </button>\n </div>\n </div>\n </div>\n </nav>\n\n <div class=\"groups-content p-4\">\n <!-- Create Group Form -->\n @if (showCreateForm()) {\n <div class=\"card mb-4\">\n <div class=\"card-header\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-plus-circle me-2\"></i>Create New Lab Group\n </h5>\n </div>\n <div class=\"card-body\">\n <form [formGroup]=\"createGroupForm\" (ngSubmit)=\"createLabGroup()\" class=\"row g-3\">\n <div class=\"col-md-6\">\n <div class=\"form-floating\">\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"groupName\" \n formControlName=\"name\"\n [class.is-invalid]=\"createGroupForm.get('name')?.invalid && createGroupForm.get('name')?.touched\"\n placeholder=\"Group name\">\n <label for=\"groupName\">Group Name *</label>\n </div>\n @if (createGroupForm.get('name')?.invalid && createGroupForm.get('name')?.touched) {\n <div class=\"invalid-feedback\">\n @if (createGroupForm.get('name')?.errors?.['required']) {\n Group name is required\n }\n @if (createGroupForm.get('name')?.errors?.['minlength']) {\n Group name must be at least 2 characters\n }\n </div>\n }\n </div>\n <div class=\"col-md-6\">\n <div class=\"form-check form-switch mt-3\">\n <input \n class=\"form-check-input\" \n type=\"checkbox\" \n id=\"allowInvites\" \n formControlName=\"allowMemberInvites\">\n <label class=\"form-check-label\" for=\"allowInvites\">\n <i class=\"bi bi-envelope me-1\"></i>Allow members to invite others\n </label>\n </div>\n </div>\n <div class=\"col-12\">\n <div class=\"form-floating\">\n <textarea \n class=\"form-control\" \n id=\"groupDescription\" \n formControlName=\"description\"\n style=\"height: 100px\"\n placeholder=\"Description\"></textarea>\n <label for=\"groupDescription\">Description (optional)</label>\n </div>\n </div>\n <div class=\"col-12\">\n <div class=\"d-flex gap-2\">\n <button \n type=\"submit\" \n class=\"btn btn-primary\"\n [disabled]=\"createGroupForm.invalid || isCreatingGroup()\">\n @if (isCreatingGroup()) {\n <span class=\"spinner-border spinner-border-sm me-2\" role=\"status\"></span>\n }\n Create Group\n </button>\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"toggleCreateForm()\">\n Cancel\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n }\n\n <!-- Search & Filters Section -->\n <div class=\"card mb-4\">\n <div class=\"card-header\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-search me-2\"></i>Search & Filters\n </h5>\n </div>\n <div class=\"card-body\">\n <form [formGroup]=\"searchForm\" class=\"row g-3\">\n <div class=\"col-md-12\">\n <div class=\"form-floating\">\n <input \n type=\"search\" \n class=\"form-control\" \n id=\"groupSearch\" \n formControlName=\"search\"\n placeholder=\"Search groups...\">\n <label for=\"groupSearch\">\n <i class=\"bi bi-search me-1\"></i>Search Groups\n </label>\n </div>\n </div>\n </form>\n </div>\n </div>\n\n <!-- Groups List -->\n <div class=\"card\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-people me-2\"></i>Lab Groups\n <span class=\"badge bg-primary ms-2\">{{ labGroupsData().count }}</span>\n </h5>\n @if (isLoading()) {\n <div class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n }\n </div>\n <div class=\"card-body p-0\">\n @if (hasLabGroups()) {\n <div class=\"table-responsive\">\n <table class=\"table table-hover mb-0\">\n <thead class=\"table-light\">\n <tr>\n <th scope=\"col\"><i class=\"bi bi-tag me-1\"></i>Group Name</th>\n <th scope=\"col\"><i class=\"bi bi-person me-1\"></i>Creator</th>\n <th scope=\"col\"><i class=\"bi bi-people me-1\"></i>Members</th>\n <th scope=\"col\"><i class=\"bi bi-check-circle me-1\"></i>Status</th>\n <th scope=\"col\"><i class=\"bi bi-calendar me-1\"></i>Created</th>\n <th scope=\"col\" style=\"width: 120px;\"><i class=\"bi bi-gear me-1\"></i>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (group of labGroupsData().results; track group.id) {\n <tr>\n <td>\n <strong>{{ group.name }}</strong>\n @if (group.description) {\n <br><small class=\"text-muted\">{{ group.description }}</small>\n }\n </td>\n <td>{{ group.creatorName || 'Unknown' }}</td>\n <td>\n <span class=\"badge bg-info\">{{ group.memberCount }}</span>\n </td>\n <td>\n @if (group.isActive) {\n <span class=\"badge bg-success\">Active</span>\n } @else {\n <span class=\"badge bg-secondary\">Inactive</span>\n }\n </td>\n <td>\n <small>{{ group.createdAt | date:'short' }}</small>\n </td>\n <td>\n <div class=\"btn-group btn-group-sm\" role=\"group\">\n <button \n type=\"button\"\n class=\"btn btn-outline-info\" \n (click)=\"viewGroupMembers(group)\"\n title=\"View members\">\n <i class=\"bi bi-people\"></i>\n </button>\n @if (group.isMember && !group.isCreator) {\n <button \n type=\"button\"\n class=\"btn btn-outline-warning\" \n (click)=\"leaveGroup(group)\"\n title=\"Leave group\">\n <i class=\"bi bi-box-arrow-right\"></i>\n </button>\n }\n @if (group.canManage) {\n <button \n type=\"button\"\n class=\"btn btn-outline-danger\" \n (click)=\"deleteGroup(group)\"\n title=\"Delete group\">\n <i class=\"bi bi-trash\"></i>\n </button>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <!-- Pagination -->\n @if (showPagination()) {\n <div class=\"d-flex justify-content-center mt-3 p-3\">\n <ngb-pagination\n [collectionSize]=\"labGroupsData().count\"\n [page]=\"currentPage()\"\n [pageSize]=\"pageSize()\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"true\"\n [rotate]=\"true\"\n (pageChange)=\"onPageChange($event)\"\n class=\"pagination-sm\">\n </ngb-pagination>\n </div>\n }\n } @else {\n <div class=\"text-center py-5\">\n <div class=\"text-muted\">\n <i class=\"bi bi-people display-1 mb-3\"></i>\n <h5>No Lab Groups Found</h5>\n <p>\n @if (hasSearchValue()) {\n Try adjusting your search criteria or create a new lab group.\n } @else {\n Get started by creating your first lab group.\n }\n </p>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"toggleCreateForm()\">\n <i class=\"bi bi-plus me-1\"></i>Create First Lab Group\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n</div>\n\n<!-- Group Members Modal -->\n@if (selectedGroupForMembers()) {\n <div class=\"modal-backdrop fade show\"></div>\n <div class=\"modal fade show d-block\" tabindex=\"-1\">\n <div class=\"modal-dialog modal-lg\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">\n <i class=\"bi bi-people me-2\"></i>{{ currentGroupName() }} - Members\n </h5>\n <button type=\"button\" class=\"btn-close\" (click)=\"closeGroupDetails()\"></button>\n </div>\n <div class=\"modal-body\">\n <!-- Invite Form -->\n @if (canInviteToCurrentGroup()) {\n <div class=\"card mb-4\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-envelope me-2\"></i>Invite Member\n </h6>\n <button \n type=\"button\"\n class=\"btn btn-sm btn-outline-primary\" \n (click)=\"toggleInviteForm()\">\n @if (showInviteForm()) {\n Cancel\n } @else {\n <i class=\"bi bi-plus me-1\"></i>Invite\n }\n </button>\n </div>\n @if (showInviteForm()) {\n <div class=\"card-body\">\n <form [formGroup]=\"inviteForm\" (ngSubmit)=\"inviteMember()\" class=\"row g-3\">\n <div class=\"col-md-8\">\n <div class=\"form-floating\">\n <input \n type=\"email\" \n class=\"form-control\" \n id=\"inviteEmail\" \n formControlName=\"invitedEmail\"\n [class.is-invalid]=\"inviteForm.get('invitedEmail')?.invalid && inviteForm.get('invitedEmail')?.touched\"\n placeholder=\"Email address\">\n <label for=\"inviteEmail\">Email Address *</label>\n </div>\n @if (inviteForm.get('invitedEmail')?.invalid && inviteForm.get('invitedEmail')?.touched) {\n <div class=\"invalid-feedback\">\n @if (inviteForm.get('invitedEmail')?.errors?.['required']) {\n Email is required\n }\n @if (inviteForm.get('invitedEmail')?.errors?.['email']) {\n Please enter a valid email address\n }\n </div>\n }\n </div>\n <div class=\"col-md-4\">\n <button \n type=\"submit\" \n class=\"btn btn-primary w-100 h-100\"\n [disabled]=\"inviteForm.invalid || isInviting()\">\n @if (isInviting()) {\n <span class=\"spinner-border spinner-border-sm me-2\" role=\"status\"></span>\n }\n Send Invite\n </button>\n </div>\n <div class=\"col-12\">\n <div class=\"form-floating\">\n <textarea \n class=\"form-control\" \n id=\"inviteMessage\" \n formControlName=\"message\"\n style=\"height: 80px\"\n placeholder=\"Message\"></textarea>\n <label for=\"inviteMessage\">Message (optional)</label>\n </div>\n </div>\n </form>\n </div>\n }\n </div>\n }\n\n <!-- Current Members -->\n <div class=\"card mb-3\">\n <div class=\"card-header\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-people me-2\"></i>Current Members ({{ groupMembersCount() }})\n </h6>\n @if (hasSubGroups()) {\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"directMembersOnly\"\n [checked]=\"directMembersOnly()\"\n (change)=\"toggleDirectMembersOnly()\">\n <label class=\"form-check-label small\" for=\"directMembersOnly\">\n Direct only\n </label>\n </div>\n }\n </div>\n </div>\n <div class=\"card-body p-0\">\n @if (hasGroupMembers()) {\n <div class=\"list-group list-group-flush\">\n @for (member of groupMembers(); track member.id) {\n <div class=\"list-group-item d-flex justify-content-between align-items-center\">\n <div>\n <strong>{{ member.firstName }} {{ member.lastName }}</strong>\n <br>\n <small class=\"text-muted\">{{ member.email }}</small>\n @if (selectedGroupForMembers() && member.id === selectedGroupForMembers()!.creator) {\n <span class=\"badge bg-warning ms-2\">Creator</span>\n }\n </div>\n @if (canManageCurrentGroup() && selectedGroupForMembers() && member.id !== selectedGroupForMembers()!.creator) {\n <button \n type=\"button\"\n class=\"btn btn-outline-danger btn-sm\" \n (click)=\"removeMember(member.id)\"\n title=\"Remove member\">\n <i class=\"bi bi-person-dash\"></i>\n </button>\n }\n </div>\n }\n </div>\n } @else {\n <div class=\"text-center py-3 text-muted\">\n <i class=\"bi bi-people fs-4 mb-2\"></i>\n <div>No members found</div>\n </div>\n }\n </div>\n @if (showMemberPagination()) {\n <div class=\"card-footer\">\n <div class=\"d-flex justify-content-center\">\n <ngb-pagination\n [collectionSize]=\"memberTotal()\"\n [page]=\"memberPage()\"\n [pageSize]=\"memberPageSize()\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"true\"\n [rotate]=\"true\"\n (pageChange)=\"onMemberPageChange($event)\"\n class=\"pagination-sm mb-0\">\n </ngb-pagination>\n </div>\n </div>\n }\n </div>\n\n <!-- Pending Invitations -->\n @if (hasPendingInvitations()) {\n <div class=\"card\">\n <div class=\"card-header\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-clock me-2\"></i>Pending Invitations ({{ pendingInvitationsCount() }})\n </h6>\n </div>\n <div class=\"card-body p-0\">\n <div class=\"list-group list-group-flush\">\n @for (invitation of pendingInvitations(); track invitation.id) {\n <div class=\"list-group-item d-flex justify-content-between align-items-center\">\n <div>\n <strong>{{ invitation.invitedEmail }}</strong>\n <br>\n <small class=\"text-muted\">\n Invited by {{ invitation.inviterName }} on {{ invitation.createdAt | date:'short' }}\n </small>\n @if (invitation.message) {\n <br>\n <small class=\"text-info\">{{ invitation.message }}</small>\n }\n </div>\n @if (canManageCurrentGroup()) {\n <button \n type=\"button\"\n class=\"btn btn-outline-danger btn-sm\" \n (click)=\"cancelInvitation(invitation.id)\"\n title=\"Cancel invitation\">\n <i class=\"bi bi-x-circle\"></i>\n </button>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"closeGroupDetails()\">\n Close\n </button>\n </div>\n </div>\n </div>\n </div>\n}","import { Component, OnInit, signal, inject, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbModule } from '@ng-bootstrap/ng-bootstrap';\nimport { ApiService } from '../../../services/api';\nimport { AuthService } from '../../../services/auth';\nimport { User, UserProfileUpdateRequest, PasswordChangeRequest, EmailChangeRequest } from '../../../models';\nimport { UserManagementService } from '../../../services/user-management';\n\n@Component({\n selector: 'ccc-user-profile',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbModule],\n templateUrl: './user-profile.html',\n styleUrl: './user-profile.scss'\n})\nexport class UserProfileComponent implements OnInit {\n private fb = inject(FormBuilder);\n private userManagementService = inject(UserManagementService);\n private authService = inject(AuthService);\n\n // User data\n currentUser = signal<User | null>(null);\n isLoading = signal(false);\n \n // Forms\n profileForm: FormGroup;\n passwordForm: FormGroup;\n emailChangeForm: FormGroup;\n \n // UI state\n activeTab = signal<'profile' | 'password' | 'email' | 'account'>('profile');\n isUpdatingProfile = signal(false);\n isChangingPassword = signal(false);\n isChangingEmail = signal(false);\n \n // Success/error messages\n profileMessage = signal<string>('');\n passwordMessage = signal<string>('');\n emailMessage = signal<string>('');\n errorMessage = signal<string>('');\n\n // Computed signals for derived values\n fullName = computed(() => {\n const user = this.currentUser();\n return user ? `${user.firstName} ${user.lastName}`.trim() : '';\n });\n\n isStaff = computed(() => this.currentUser()?.isStaff || false);\n\n joinDate = computed(() => {\n const user = this.currentUser();\n return user?.dateJoined ? new Date(user.dateJoined).toLocaleDateString() : '';\n });\n\n lastLogin = computed(() => {\n const user = this.currentUser();\n return user?.lastLogin ? new Date(user.lastLogin).toLocaleDateString() : 'Never';\n });\n\n constructor() {\n this.profileForm = this.fb.group({\n firstName: ['', [Validators.required, Validators.maxLength(30)]],\n lastName: ['', [Validators.required, Validators.maxLength(30)]],\n currentPassword: ['', [Validators.required]]\n });\n\n this.passwordForm = this.fb.group({\n currentPassword: ['', [Validators.required]],\n newPassword: ['', [Validators.required, Validators.minLength(8)]],\n confirmPassword: ['', [Validators.required]]\n }, { validators: this.passwordMatchValidator });\n\n this.emailChangeForm = this.fb.group({\n newEmail: ['', [Validators.required, Validators.email]],\n currentPassword: ['', [Validators.required]]\n });\n }\n\n ngOnInit() {\n this.loadUserProfile();\n }\n\n loadUserProfile(): void {\n this.isLoading.set(true);\n this.userManagementService.getUserProfile().subscribe({\n next: (response) => {\n this.currentUser.set(response.user);\n this.profileForm.patchValue({\n firstName: response.user.firstName,\n lastName: response.user.lastName\n });\n this.isLoading.set(false);\n },\n error: (error) => {\n this.errorMessage.set('Failed to load user profile');\n this.isLoading.set(false);\n }\n });\n }\n\n updateProfile(): void {\n if (this.profileForm.valid) {\n this.isUpdatingProfile.set(true);\n this.profileMessage.set('');\n this.errorMessage.set('');\n\n const profileData: UserProfileUpdateRequest = {\n firstName: this.profileForm.get('firstName')?.value,\n lastName: this.profileForm.get('lastName')?.value,\n currentPassword: this.profileForm.get('currentPassword')?.value\n };\n\n this.userManagementService.updateProfile(profileData).subscribe({\n next: (response) => {\n this.profileMessage.set('Profile updated successfully');\n this.currentUser.set(response.user);\n this.profileForm.get('currentPassword')?.setValue('');\n this.isUpdatingProfile.set(false);\n },\n error: (error) => {\n this.errorMessage.set(error.error?.message || 'Failed to update profile');\n this.isUpdatingProfile.set(false);\n }\n });\n }\n }\n\n changePassword(): void {\n if (this.passwordForm.valid) {\n this.isChangingPassword.set(true);\n this.passwordMessage.set('');\n this.errorMessage.set('');\n\n const passwordData: PasswordChangeRequest = {\n currentPassword: this.passwordForm.get('currentPassword')?.value,\n newPassword: this.passwordForm.get('newPassword')?.value,\n confirmPassword: this.passwordForm.get('confirmPassword')?.value\n };\n\n this.userManagementService.changePassword(passwordData).subscribe({\n next: (response) => {\n this.passwordMessage.set('Password changed successfully');\n this.passwordForm.reset();\n this.isChangingPassword.set(false);\n },\n error: (error) => {\n this.errorMessage.set(error.error?.message || 'Failed to change password');\n this.isChangingPassword.set(false);\n }\n });\n }\n }\n\n requestEmailChange(): void {\n if (this.emailChangeForm.valid) {\n this.isChangingEmail.set(true);\n this.emailMessage.set('');\n this.errorMessage.set('');\n\n const emailData: EmailChangeRequest = {\n newEmail: this.emailChangeForm.get('newEmail')?.value,\n currentPassword: this.emailChangeForm.get('currentPassword')?.value\n };\n\n this.userManagementService.requestEmailChange(emailData).subscribe({\n next: (response) => {\n this.emailMessage.set(`Verification email sent to ${response.new_email}. Please check your inbox and follow the instructions.`);\n this.emailChangeForm.reset();\n this.isChangingEmail.set(false);\n },\n error: (error) => {\n this.errorMessage.set(error.error?.message || 'Failed to request email change');\n this.isChangingEmail.set(false);\n }\n });\n }\n }\n\n setActiveTab(tab: 'profile' | 'password' | 'email' | 'account'): void {\n this.activeTab.set(tab);\n // Clear messages when switching tabs\n this.profileMessage.set('');\n this.passwordMessage.set('');\n this.emailMessage.set('');\n this.errorMessage.set('');\n }\n\n private passwordMatchValidator(form: FormGroup) {\n const newPassword = form.get('newPassword');\n const confirmPassword = form.get('confirmPassword');\n \n if (newPassword && confirmPassword && newPassword.value !== confirmPassword.value) {\n return { passwordMismatch: true };\n }\n return null;\n }\n\n}","<div class=\"user-profile-container\">\n <!-- Header Section -->\n <nav class=\"navbar navbar-expand-lg bg-body-tertiary shadow-sm\">\n <div class=\"container-fluid\">\n <div class=\"d-flex align-items-center justify-content-between w-100\">\n <div class=\"d-flex align-items-center\">\n <h4 class=\"mb-0\">\n <i class=\"bi bi-person-circle me-2 text-primary\"></i>User Profile\n </h4>\n @if (isStaff()) {\n <span class=\"badge bg-warning ms-3\">Staff</span>\n }\n </div>\n </div>\n </div>\n </nav>\n\n <div class=\"profile-content p-4\">\n @if (isLoading()) {\n <div class=\"text-center\">\n <div class=\"spinner-border text-primary me-2\"></div>\n <span>Loading profile...</span>\n </div>\n } @else {\n <!-- User Info Card -->\n <div class=\"card mb-4\">\n <div class=\"card-header\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-info-circle me-2\"></i>Account Information\n </h5>\n </div>\n <div class=\"card-body\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <small class=\"text-muted\">Full Name:</small>\n <div class=\"fw-semibold\">{{ fullName() }}</div>\n </div>\n <div class=\"col-md-6\">\n <small class=\"text-muted\">Username:</small>\n <div class=\"fw-semibold\">{{ currentUser()?.username }}</div>\n </div>\n </div>\n <div class=\"row mt-3\">\n <div class=\"col-md-6\">\n <small class=\"text-muted\">Email:</small>\n <div class=\"fw-semibold\">{{ currentUser()?.email }}</div>\n </div>\n <div class=\"col-md-6\">\n <small class=\"text-muted\">Account Status:</small>\n <div>\n @if (currentUser()?.isActive) {\n <span class=\"badge bg-success\">Active</span>\n } @else {\n <span class=\"badge bg-danger\">Inactive</span>\n }\n </div>\n </div>\n </div>\n <div class=\"row mt-3\">\n <div class=\"col-md-6\">\n <small class=\"text-muted\">Member Since:</small>\n <div class=\"fw-semibold\">{{ joinDate() }}</div>\n </div>\n <div class=\"col-md-6\">\n <small class=\"text-muted\">Last Login:</small>\n <div class=\"fw-semibold\">{{ lastLogin() }}</div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Navigation Tabs -->\n <ul ngbNav #profileNav=\"ngbNav\" [activeId]=\"activeTab()\" (activeIdChange)=\"setActiveTab($event)\" class=\"nav-tabs\">\n <li [ngbNavItem]=\"'profile'\">\n <button ngbNavLink (click)=\"setActiveTab('profile')\">\n <i class=\"bi bi-person me-1\"></i>Profile Settings\n </button>\n <ng-template ngbNavContent>\n <div class=\"mt-4\">\n <!-- Profile Update Form -->\n <div class=\"card\">\n <div class=\"card-header\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-pencil-square me-2\"></i>Update Profile Information\n </h6>\n </div>\n <div class=\"card-body\">\n <form [formGroup]=\"profileForm\" (ngSubmit)=\"updateProfile()\">\n <div class=\"row g-3\">\n <div class=\"col-md-6\">\n <label for=\"firstName\" class=\"form-label\">First Name</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"firstName\"\n formControlName=\"firstName\"\n [class.is-invalid]=\"profileForm.get('firstName')?.invalid && profileForm.get('firstName')?.touched\">\n @if (profileForm.get('firstName')?.invalid && profileForm.get('firstName')?.touched) {\n <div class=\"invalid-feedback\">\n First name is required (max 30 characters)\n </div>\n }\n </div>\n <div class=\"col-md-6\">\n <label for=\"lastName\" class=\"form-label\">Last Name</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"lastName\"\n formControlName=\"lastName\"\n [class.is-invalid]=\"profileForm.get('lastName')?.invalid && profileForm.get('lastName')?.touched\">\n @if (profileForm.get('lastName')?.invalid && profileForm.get('lastName')?.touched) {\n <div class=\"invalid-feedback\">\n Last name is required (max 30 characters)\n </div>\n }\n </div>\n </div>\n <div class=\"mt-3\">\n <label for=\"currentPassword\" class=\"form-label\">Current Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"currentPassword\"\n formControlName=\"currentPassword\"\n placeholder=\"Enter your current password to confirm changes\"\n [class.is-invalid]=\"profileForm.get('currentPassword')?.invalid && profileForm.get('currentPassword')?.touched\">\n @if (profileForm.get('currentPassword')?.invalid && profileForm.get('currentPassword')?.touched) {\n <div class=\"invalid-feedback\">\n Current password is required to update profile\n </div>\n }\n </div>\n\n @if (profileMessage()) {\n <div class=\"alert alert-success mt-3\">\n <i class=\"bi bi-check-circle me-2\"></i>{{ profileMessage() }}\n </div>\n }\n\n <div class=\"mt-3\">\n <button\n type=\"submit\"\n class=\"btn btn-primary\"\n [disabled]=\"profileForm.invalid || isUpdatingProfile()\">\n @if (isUpdatingProfile()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-check-circle me-1\"></i>\n Update Profile\n </button>\n </div>\n </form>\n </div>\n </div>\n </div>\n </ng-template>\n </li>\n\n <li [ngbNavItem]=\"'password'\">\n <button ngbNavLink (click)=\"setActiveTab('password')\">\n <i class=\"bi bi-shield-lock me-1\"></i>Change Password\n </button>\n <ng-template ngbNavContent>\n <div class=\"mt-4\">\n <!-- Password Change Form -->\n <div class=\"card\">\n <div class=\"card-header\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-shield-lock me-2\"></i>Change Password\n </h6>\n </div>\n <div class=\"card-body\">\n <form [formGroup]=\"passwordForm\" (ngSubmit)=\"changePassword()\">\n <div class=\"mb-3\">\n <label for=\"currentPasswordChange\" class=\"form-label\">Current Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"currentPasswordChange\"\n formControlName=\"currentPassword\"\n [class.is-invalid]=\"passwordForm.get('currentPassword')?.invalid && passwordForm.get('currentPassword')?.touched\">\n @if (passwordForm.get('currentPassword')?.invalid && passwordForm.get('currentPassword')?.touched) {\n <div class=\"invalid-feedback\">\n Current password is required\n </div>\n }\n </div>\n <div class=\"mb-3\">\n <label for=\"newPassword\" class=\"form-label\">New Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"newPassword\"\n formControlName=\"newPassword\"\n [class.is-invalid]=\"passwordForm.get('newPassword')?.invalid && passwordForm.get('newPassword')?.touched\">\n @if (passwordForm.get('newPassword')?.invalid && passwordForm.get('newPassword')?.touched) {\n <div class=\"invalid-feedback\">\n Password must be at least 8 characters long\n </div>\n }\n </div>\n <div class=\"mb-3\">\n <label for=\"confirmPassword\" class=\"form-label\">Confirm New Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"confirmPassword\"\n formControlName=\"confirmPassword\"\n [class.is-invalid]=\"(passwordForm.get('confirmPassword')?.invalid || passwordForm.hasError('passwordMismatch')) && passwordForm.get('confirmPassword')?.touched\">\n @if (passwordForm.get('confirmPassword')?.invalid && passwordForm.get('confirmPassword')?.touched) {\n <div class=\"invalid-feedback\">\n Please confirm your new password\n </div>\n }\n @if (passwordForm.hasError('passwordMismatch') && passwordForm.get('confirmPassword')?.touched) {\n <div class=\"invalid-feedback\">\n Passwords do not match\n </div>\n }\n </div>\n\n @if (passwordMessage()) {\n <div class=\"alert alert-success\">\n <i class=\"bi bi-check-circle me-2\"></i>{{ passwordMessage() }}\n </div>\n }\n\n <button\n type=\"submit\"\n class=\"btn btn-primary\"\n [disabled]=\"passwordForm.invalid || isChangingPassword()\">\n @if (isChangingPassword()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-shield-check me-1\"></i>\n Change Password\n </button>\n </form>\n </div>\n </div>\n </div>\n </ng-template>\n </li>\n\n <li [ngbNavItem]=\"'email'\">\n <button ngbNavLink (click)=\"setActiveTab('email')\">\n <i class=\"bi bi-envelope me-1\"></i>Change Email\n </button>\n <ng-template ngbNavContent>\n <div class=\"mt-4\">\n <!-- Email Change Form -->\n <div class=\"card\">\n <div class=\"card-header\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-envelope me-2\"></i>Change Email Address\n </h6>\n </div>\n <div class=\"card-body\">\n <div class=\"alert alert-info\">\n <i class=\"bi bi-info-circle me-2\"></i>\n Changing your email will require verification. You'll receive a confirmation email at your new address.\n </div>\n \n <form [formGroup]=\"emailChangeForm\" (ngSubmit)=\"requestEmailChange()\">\n <div class=\"mb-3\">\n <label for=\"currentEmail\" class=\"form-label\">Current Email</label>\n <input\n type=\"email\"\n class=\"form-control\"\n id=\"currentEmail\"\n [value]=\"currentUser()?.email\"\n readonly>\n </div>\n <div class=\"mb-3\">\n <label for=\"newEmail\" class=\"form-label\">New Email</label>\n <input\n type=\"email\"\n class=\"form-control\"\n id=\"newEmail\"\n formControlName=\"newEmail\"\n [class.is-invalid]=\"emailChangeForm.get('newEmail')?.invalid && emailChangeForm.get('newEmail')?.touched\">\n @if (emailChangeForm.get('newEmail')?.invalid && emailChangeForm.get('newEmail')?.touched) {\n <div class=\"invalid-feedback\">\n Please enter a valid email address\n </div>\n }\n </div>\n <div class=\"mb-3\">\n <label for=\"passwordEmailChange\" class=\"form-label\">Current Password</label>\n <input\n type=\"password\"\n class=\"form-control\"\n id=\"passwordEmailChange\"\n formControlName=\"currentPassword\"\n [class.is-invalid]=\"emailChangeForm.get('currentPassword')?.invalid && emailChangeForm.get('currentPassword')?.touched\">\n @if (emailChangeForm.get('currentPassword')?.invalid && emailChangeForm.get('currentPassword')?.touched) {\n <div class=\"invalid-feedback\">\n Current password is required\n </div>\n }\n </div>\n\n @if (emailMessage()) {\n <div class=\"alert alert-success\">\n <i class=\"bi bi-check-circle me-2\"></i>{{ emailMessage() }}\n </div>\n }\n\n <button\n type=\"submit\"\n class=\"btn btn-primary\"\n [disabled]=\"emailChangeForm.invalid || isChangingEmail()\">\n @if (isChangingEmail()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-envelope-check me-1\"></i>\n Request Email Change\n </button>\n </form>\n </div>\n </div>\n </div>\n </ng-template>\n </li>\n </ul>\n\n <div [ngbNavOutlet]=\"profileNav\" class=\"mt-3\"></div>\n\n <!-- Error Messages -->\n @if (errorMessage()) {\n <div class=\"alert alert-danger mt-3\">\n <i class=\"bi bi-exclamation-triangle me-2\"></i>{{ errorMessage() }}\n </div>\n }\n }\n </div>\n</div>","import { Component, inject, OnInit, signal, computed } from '@angular/core';\r\nimport { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NgbAlert } from '@ng-bootstrap/ng-bootstrap';\r\nimport { SiteConfigService } from '../../services/site-config';\r\nimport { SiteConfig } from '../../models';\r\n\r\n@Component({\r\n selector: 'ccc-site-config',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, NgbAlert],\r\n templateUrl: './site-config.html',\r\n styleUrl: './site-config.scss'\r\n})\r\nexport class SiteConfigComponent implements OnInit {\r\n private fb = inject(FormBuilder);\r\n private siteConfigService = inject(SiteConfigService);\r\n\r\n configForm: FormGroup;\r\n \r\n // Signals for reactive state management\r\n loading = signal(false);\r\n error = signal<string | null>(null);\r\n success = signal<string | null>(null);\r\n selectedLogoFile = signal<File | null>(null);\r\n currentConfig = signal<SiteConfig | null>(null);\r\n\r\n // Computed signal for preview configuration\r\n previewConfig = computed(() => {\r\n if (!this.currentConfig()) return null;\r\n return { ...this.currentConfig()!, ...this.configForm.value };\r\n });\r\n\r\n constructor() {\r\n this.configForm = this.fb.group({\r\n siteName: ['', [Validators.required, Validators.minLength(1), Validators.maxLength(255)]],\r\n logoUrl: [''],\r\n primaryColor: ['#1976d2', [Validators.pattern(/^#[0-9A-Fa-f]{6}$/)]],\r\n showPoweredBy: [true],\r\n allowUserRegistration: [false],\r\n enableOrcidLogin: [false]\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n // Load current configuration for admin (authenticated endpoint)\r\n this.siteConfigService.getCurrentConfig().subscribe({\r\n next: (config) => {\r\n this.currentConfig.set(config);\r\n this.configForm.patchValue(config);\r\n },\r\n error: (error) => {\r\n this.error.set('Failed to load current configuration.');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Update site configuration\r\n */\r\n onSubmit() {\r\n if (this.configForm.valid) {\r\n this.loading.set(true);\r\n this.error.set(null);\r\n this.success.set(null);\r\n\r\n const config: Partial<SiteConfig> = this.configForm.value;\r\n\r\n this.siteConfigService.updateConfig(config).subscribe({\r\n next: (updatedConfig) => {\r\n this.loading.set(false);\r\n this.success.set('Site configuration updated successfully!');\r\n this.currentConfig.set(updatedConfig);\r\n\r\n localStorage.setItem('site_config', JSON.stringify(updatedConfig));\r\n\r\n setTimeout(() => {\r\n this.success.set(null);\r\n }, 3000);\r\n },\r\n error: (error) => {\r\n this.loading.set(false);\r\n this.error.set(error.error?.detail || 'Failed to update site configuration.');\r\n\r\n setTimeout(() => {\r\n this.error.set(null);\r\n }, 5000);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Reset form to current configuration\r\n */\r\n resetForm() {\r\n if (this.currentConfig()) {\r\n this.configForm.patchValue(this.currentConfig()!);\r\n }\r\n this.error.set(null);\r\n this.success.set(null);\r\n }\r\n\r\n /**\r\n * Get a darker version of the given color for gradients\r\n */\r\n getDarkerColor(hex: string): string {\r\n if (!hex || !hex.startsWith('#')) {\r\n return '#1565c0'; // Default darker color\r\n }\r\n \r\n // Remove # and convert to RGB\r\n const r = parseInt(hex.slice(1, 3), 16);\r\n const g = parseInt(hex.slice(3, 5), 16);\r\n const b = parseInt(hex.slice(5, 7), 16);\r\n \r\n // Darken by 20%\r\n const factor = 0.8;\r\n const darkR = Math.floor(r * factor);\r\n const darkG = Math.floor(g * factor);\r\n const darkB = Math.floor(b * factor);\r\n \r\n // Convert back to hex\r\n const toHex = (n: number) => n.toString(16).padStart(2, '0');\r\n return `#${toHex(darkR)}${toHex(darkG)}${toHex(darkB)}`;\r\n }\r\n\r\n /**\r\n * Get the current primary color value for styling\r\n */\r\n getCurrentPrimaryColor(): string {\r\n return this.configForm.get('primaryColor')?.value || '#1976d2';\r\n }\r\n\r\n /**\r\n * Clear error message\r\n */\r\n clearError() {\r\n this.error.set(null);\r\n }\r\n\r\n /**\r\n * Clear success message\r\n */\r\n clearSuccess() {\r\n this.success.set(null);\r\n }\r\n\r\n /**\r\n * Handle logo file selection\r\n */\r\n onLogoFileSelected(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n if (target.files && target.files.length > 0) {\r\n const file = target.files[0];\r\n\r\n // Validate file type\r\n const allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml'];\r\n if (!allowedTypes.includes(file.type)) {\r\n this.error.set('Please select a valid image file (JPEG, PNG, GIF, or SVG).');\r\n this.selectedLogoFile.set(null);\r\n target.value = '';\r\n return;\r\n }\r\n\r\n // Validate file size (max 5MB)\r\n const maxSize = 5 * 1024 * 1024; // 5MB\r\n if (file.size > maxSize) {\r\n this.error.set('Logo file size must be less than 5MB.');\r\n this.selectedLogoFile.set(null);\r\n target.value = '';\r\n return;\r\n }\r\n\r\n this.selectedLogoFile.set(file);\r\n this.error.set(null);\r\n }\r\n }\r\n\r\n /**\r\n * Remove selected logo file\r\n */\r\n clearLogoFile() {\r\n this.selectedLogoFile.set(null);\r\n const fileInput = document.querySelector('input[type=\"file\"]') as HTMLInputElement;\r\n if (fileInput) {\r\n fileInput.value = '';\r\n }\r\n }\r\n\r\n}\r\n","<div class=\"site-config-container\">\r\n <!-- Header Section -->\r\n <nav class=\"navbar navbar-expand-lg bg-body-tertiary shadow-sm\">\r\n <div class=\"container-fluid\">\r\n <div class=\"d-flex align-items-center justify-content-between w-100\">\r\n <div class=\"d-flex align-items-center\">\r\n <h4 class=\"navbar-brand m-0 fw-bold\">\r\n <i class=\"bi bi-gear me-2\"></i>Site Configuration\r\n </h4>\r\n </div>\r\n <div class=\"d-flex gap-2\">\r\n <button \r\n type=\"submit\" \r\n form=\"configForm\"\r\n class=\"btn btn-primary btn-sm\"\r\n [disabled]=\"configForm.invalid || loading()\">\r\n @if (loading()) {\r\n <span class=\"spinner-border spinner-border-sm me-1\" aria-hidden=\"true\"></span>\r\n } @else {\r\n <i class=\"bi bi-check-lg me-1\"></i>\r\n }\r\n Save Configuration\r\n </button>\r\n \r\n <button \r\n type=\"button\" \r\n class=\"btn btn-outline-secondary btn-sm\"\r\n (click)=\"resetForm()\"\r\n [disabled]=\"loading()\">\r\n <i class=\"bi bi-arrow-clockwise me-1\"></i>\r\n Reset\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </nav>\r\n\r\n <div class=\"config-content p-4\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-8\">\r\n <!-- Site Branding Card -->\r\n <div class=\"card mb-4\">\r\n <div class=\"card-header\">\r\n <h5 class=\"mb-0\">\r\n <i class=\"bi bi-brush me-2\"></i>Site Branding\r\n </h5>\r\n </div>\r\n <div class=\"card-body\">\r\n <!-- Success Alert -->\r\n @if (success()) {\r\n <ngb-alert type=\"success\" (closed)=\"clearSuccess()\" [dismissible]=\"true\">\r\n <i class=\"bi bi-check-circle me-2\"></i>{{ success() }}\r\n </ngb-alert>\r\n }\r\n\r\n <!-- Error Alert -->\r\n @if (error()) {\r\n <ngb-alert type=\"danger\" (closed)=\"clearError()\" [dismissible]=\"true\">\r\n <i class=\"bi bi-exclamation-triangle me-2\"></i>{{ error() }}\r\n </ngb-alert>\r\n }\r\n\r\n <form id=\"configForm\" [formGroup]=\"configForm\" (ngSubmit)=\"onSubmit()\">\r\n <!-- Site Name -->\r\n <div class=\"mb-3\">\r\n <label for=\"site_name\" class=\"form-label\">\r\n <i class=\"bi bi-building me-1\"></i>\r\n Site Name <span class=\"text-danger\">*</span>\r\n </label>\r\n <input \r\n type=\"text\" \r\n class=\"form-control\" \r\n id=\"site_name\"\r\n formControlName=\"siteName\"\r\n [class.is-invalid]=\"configForm.get('siteName')?.invalid && configForm.get('siteName')?.touched\"\r\n placeholder=\"Enter your site name\">\r\n @if (configForm.get('siteName')?.invalid && configForm.get('siteName')?.touched) {\r\n <div class=\"invalid-feedback\">\r\n @if (configForm.get('siteName')?.errors?.['required']) {\r\n <span>Site name is required</span>\r\n }\r\n @if (configForm.get('siteName')?.errors?.['minlength']) {\r\n <span>Site name must be at least 1 character</span>\r\n }\r\n @if (configForm.get('siteName')?.errors?.['maxlength']) {\r\n <span>Site name must be less than 255 characters</span>\r\n }\r\n </div>\r\n }\r\n <div class=\"form-text\">\r\n This will appear in the navigation bar and login page\r\n </div>\r\n </div>\r\n\r\n <!-- Logo URL -->\r\n <div class=\"mb-3\">\r\n <label for=\"logo_url\" class=\"form-label\">\r\n <i class=\"bi bi-image me-1\"></i>\r\n Logo URL\r\n </label>\r\n <input \r\n type=\"url\" \r\n class=\"form-control\" \r\n id=\"logo_url\"\r\n formControlName=\"logoUrl\"\r\n placeholder=\"https://example.com/logo.png\">\r\n <div class=\"form-text\">\r\n Optional: URL to your organization's logo\r\n </div>\r\n </div>\r\n\r\n <!-- Logo File Upload -->\r\n <div class=\"mb-3\">\r\n <label for=\"logo_file\" class=\"form-label\">\r\n <i class=\"bi bi-upload me-1\"></i>\r\n Upload Logo File\r\n </label>\r\n <input \r\n type=\"file\" \r\n class=\"form-control\" \r\n id=\"logo_file\"\r\n accept=\"image/*\"\r\n (change)=\"onLogoFileSelected($event)\">\r\n <div class=\"form-text\">\r\n Upload a logo file (overrides logo URL). Supported: JPEG, PNG, GIF, SVG. Max 5MB.\r\n </div>\r\n @if (selectedLogoFile()) {\r\n <div class=\"mt-2\">\r\n <div class=\"alert alert-info py-2\">\r\n <i class=\"bi bi-file-image me-1\"></i>\r\n Selected: {{ selectedLogoFile()?.name }}\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger ms-2\" (click)=\"clearLogoFile()\">\r\n <i class=\"bi bi-x\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Primary Color -->\r\n <div class=\"mb-3\">\r\n <label for=\"primary_color\" class=\"form-label\">\r\n <i class=\"bi bi-palette me-1\"></i>\r\n Primary Color\r\n </label>\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <input\r\n type=\"color\"\r\n id=\"primary_color\"\r\n class=\"form-control form-control-color\"\r\n formControlName=\"primaryColor\"\r\n style=\"width: 60px; height: 40px;\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n formControlName=\"primaryColor\"\r\n placeholder=\"#1976d2\"\r\n [class.is-invalid]=\"configForm.get('primaryColor')?.invalid && configForm.get('primaryColor')?.touched\">\r\n </div>\r\n @if (configForm.get('primaryColor')?.invalid && configForm.get('primaryColor')?.touched) {\r\n <div class=\"invalid-feedback\">\r\n @if (configForm.get('primaryColor')?.errors?.['pattern']) {\r\n <span>Please enter a valid hex color (e.g., #1976d2)</span>\r\n }\r\n </div>\r\n }\r\n <div class=\"form-text\">\r\n Main theme color for navigation and buttons\r\n </div>\r\n </div>\r\n\r\n <!-- Show Powered By -->\r\n <div class=\"mb-4\">\r\n <div class=\"form-check\">\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n id=\"show_powered_by\"\r\n formControlName=\"showPoweredBy\">\r\n <label class=\"form-check-label\" for=\"show_powered_by\">\r\n <i class=\"bi bi-lightning-charge me-1\"></i>\r\n Show \"Powered by CUPCAKE Vanilla\"\r\n </label>\r\n </div>\r\n <div class=\"form-text\">\r\n Display a small footer credit (appears on hover in bottom-right corner)\r\n </div>\r\n </div>\r\n\r\n <!-- Authentication Settings Section -->\r\n <div class=\"mb-4\">\r\n <h6 class=\"text-muted border-bottom pb-2\">\r\n <i class=\"bi bi-shield-lock me-2\"></i>Authentication Settings\r\n </h6>\r\n \r\n <!-- Allow User Registration -->\r\n <div class=\"mb-3\">\r\n <div class=\"form-check\">\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n id=\"allow_user_registration\"\r\n formControlName=\"allowUserRegistration\">\r\n <label class=\"form-check-label\" for=\"allow_user_registration\">\r\n <i class=\"bi bi-person-plus me-1\"></i>\r\n Allow Public User Registration\r\n </label>\r\n </div>\r\n <div class=\"form-text\">\r\n When enabled, users can register new accounts without admin approval. \r\n The registration API endpoint will be accessible to the public.\r\n </div>\r\n </div>\r\n\r\n <!-- Enable ORCID Login -->\r\n <div class=\"mb-3\">\r\n <div class=\"form-check\">\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n id=\"enable_orcid_login\"\r\n formControlName=\"enableOrcidLogin\">\r\n <label class=\"form-check-label\" for=\"enable_orcid_login\">\r\n <i class=\"bi bi-person-badge me-1\"></i>\r\n Enable ORCID OAuth Login\r\n </label>\r\n </div>\r\n <div class=\"form-text\">\r\n Allow users to log in using their ORCID account. \r\n Requires ORCID OAuth configuration in server settings.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </form>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"col-lg-4\">\r\n <!-- Preview Panel -->\r\n <div class=\"card mb-4\">\r\n <div class=\"card-header\">\r\n <h5 class=\"mb-0\">\r\n <i class=\"bi bi-eye me-2\"></i>Preview\r\n </h5>\r\n </div>\r\n <div class=\"card-body\">\r\n <div class=\"preview-navbar mb-3\" \r\n [style.background]=\"'linear-gradient(135deg, ' + (configForm.get('primaryColor')?.value || '#1976d2') + ' 0%, ' + getDarkerColor(configForm.get('primaryColor')?.value || '#1976d2') + ' 100%)'\">\r\n <div class=\"preview-nav\">\r\n <span class=\"preview-brand\">\r\n @if (configForm.get('logoUrl')?.value) {\r\n <img [src]=\"configForm.get('logoUrl')?.value\" alt=\"Logo\" style=\"height: 20px; width: auto;\" class=\"me-2\">\r\n } @else {\r\n <i class=\"bi bi-flask me-2\"></i>\r\n }\r\n {{ configForm.get('siteName')?.value || 'Your Site Name' }}\r\n </span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"preview-login-card\">\r\n <h6 class=\"text-center mb-3\">\r\n @if (configForm.get('logoUrl')?.value) {\r\n <img [src]=\"configForm.get('logoUrl')?.value\" alt=\"Logo\" style=\"height: 24px; width: auto;\" class=\"me-2\">\r\n } @else {\r\n <i class=\"bi bi-flask me-2\"></i>\r\n }\r\n {{ configForm.get('siteName')?.value || 'Your Site Name' }}\r\n </h6>\r\n @if (configForm.get('enableOrcidLogin')?.value) {\r\n <div class=\"preview-button mb-2\"\r\n [style.background]=\"'linear-gradient(135deg, ' + (configForm.get('primaryColor')?.value || '#1976d2') + ' 0%, ' + getDarkerColor(configForm.get('primaryColor')?.value || '#1976d2') + ' 100%)'\">\r\n <i class=\"bi bi-person-badge me-2\"></i>\r\n Login with ORCID\r\n </div>\r\n }\r\n <div class=\"preview-button mb-2\"\r\n [style.background]=\"'linear-gradient(135deg, ' + (configForm.get('primaryColor')?.value || '#1976d2') + ' 0%, ' + getDarkerColor(configForm.get('primaryColor')?.value || '#1976d2') + ' 100%)'\">\r\n <i class=\"bi bi-box-arrow-in-right me-2\"></i>\r\n Regular Login\r\n </div>\r\n @if (configForm.get('allowUserRegistration')?.value) {\r\n <div class=\"text-center mb-2\">\r\n <small class=\"text-muted\">\r\n <i class=\"bi bi-person-plus me-1\"></i>\r\n Don't have an account? <a href=\"#\" class=\"text-decoration-none\">Register here</a>\r\n </small>\r\n </div>\r\n }\r\n <div class=\"text-center\">\r\n <small class=\"text-muted\">\r\n {{ configForm.get('siteName')?.value || 'Your Site Name' }} - Scientific Metadata Management\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mt-3\">\r\n <h6 class=\"text-muted\">Authentication Status:</h6>\r\n <ul class=\"list-unstyled small text-muted mb-0\">\r\n <li>\r\n <i class=\"bi bi-check-circle-fill text-success me-1\"></i>\r\n Regular login: Always enabled\r\n </li>\r\n <li>\r\n @if (configForm.get('enableOrcidLogin')?.value) {\r\n <i class=\"bi bi-check-circle-fill text-success me-1\"></i>\r\n ORCID login: Enabled\r\n } @else {\r\n <i class=\"bi bi-x-circle-fill text-danger me-1\"></i>\r\n ORCID login: Disabled\r\n }\r\n </li>\r\n <li>\r\n @if (configForm.get('allowUserRegistration')?.value) {\r\n <i class=\"bi bi-check-circle-fill text-success me-1\"></i>\r\n Public registration: Enabled\r\n } @else {\r\n <i class=\"bi bi-x-circle-fill text-danger me-1\"></i>\r\n Public registration: Disabled\r\n }\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n @if (configForm.get('showPoweredBy')?.value) {\r\n <div class=\"mt-3\">\r\n <small class=\"text-muted\">\r\n <i class=\"bi bi-lightning-charge me-1\"></i>\r\n Footer: \"Powered by CUPCAKE Vanilla\" will appear on hover\r\n </small>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>","import { Component, inject, ChangeDetectorRef, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgbModule } from '@ng-bootstrap/ng-bootstrap';\nimport { ToastService, ToastMessage } from '../../services/toast';\n\n@Component({\n selector: 'ccc-toast-container',\n standalone: true,\n imports: [CommonModule, NgbModule],\n templateUrl: './toast-container.html',\n styleUrl: './toast-container.scss'\n})\nexport class ToastContainerComponent {\n private toastService = inject(ToastService);\n private cdr = inject(ChangeDetectorRef);\n\n toasts = this.toastService.toasts;\n\n constructor() {\n effect(() => {\n const currentToasts = this.toasts();\n this.cdr.detectChanges();\n });\n }\n\n remove(toast: ToastMessage) {\n this.toastService.remove(toast.id);\n }\n\n getToastClass(type: string): string {\n switch (type) {\n case 'success':\n return 'bg-success text-white';\n case 'error':\n return 'bg-danger text-white';\n case 'warning':\n return 'bg-warning text-dark';\n case 'info':\n default:\n return 'bg-primary text-white';\n }\n }\n\n getToastIcon(type: string): string {\n switch (type) {\n case 'success':\n return 'bi-check-circle-fill';\n case 'error':\n return 'bi-exclamation-triangle-fill';\n case 'warning':\n return 'bi-exclamation-circle-fill';\n case 'info':\n default:\n return 'bi-info-circle-fill';\n }\n }\n}","<div class=\"toast-container position-fixed bottom-0 end-0 p-3\" style=\"z-index: 9999;\">\n @for (toast of toasts(); track toast.id) {\n <ngb-toast \n [class]=\"getToastClass(toast.type)\"\n [autohide]=\"true\"\n [delay]=\"toast.duration || 5000\"\n (hidden)=\"remove(toast)\">\n <ng-template ngbToastHeader>\n <i [class]=\"'bi ' + getToastIcon(toast.type) + ' me-2'\"></i>\n <strong class=\"me-auto\">\n {{ toast.type | titlecase }}\n </strong>\n </ng-template>\n {{ toast.message }}\n </ngb-toast>\n }\n</div>\n","import { Component, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SiteConfigService } from '../../services/site-config';\r\n\r\n@Component({\r\n selector: 'ccc-powered-by-footer',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './powered-by-footer.html',\r\n styleUrl: './powered-by-footer.scss'\r\n})\r\nexport class PoweredByFooterComponent {\r\n private siteConfigService = inject(SiteConfigService);\r\n\r\n siteConfig$ = this.siteConfigService.config$;\r\n}","@if ((siteConfig$ | async)?.showPoweredBy !== false) {\r\n <div class=\"powered-by-footer\">\r\n <div class=\"footer-trigger\"></div>\r\n <div class=\"footer-content\">\r\n <span class=\"footer-text\">\r\n <i class=\"bi bi-lightning-charge me-1\"></i>\r\n Powered by <strong>CUPCAKE Vanilla</strong>\r\n </span>\r\n </div>\r\n </div>\r\n}","// Auth components\r\nexport * from './auth/login/login';\r\nexport * from './auth/register/register';\r\n\r\n// User management components \r\nexport * from './user-management/admin-user-management/user-management';\r\nexport * from './user-management/lab-groups/lab-groups';\r\nexport * from './user-management/user-profile/user-profile';\r\n\r\n// Site configuration\r\nexport * from './site-config/site-config';\r\n\r\n// Utility components\r\nexport * from './toast-container/toast-container';\r\nexport * from './powered-by-footer/powered-by-footer';","import { NgModule, ModuleWithProviders, InjectionToken } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { HttpClientModule, provideHttpClient, withInterceptors } from '@angular/common/http';\r\nimport { RouterModule } from '@angular/router';\r\nimport { NgbModule } from '@ng-bootstrap/ng-bootstrap';\r\n\r\nimport { LoginComponent } from './components/auth/login/login';\r\nimport { RegisterComponent } from './components/auth/register/register';\r\nimport { ToastContainerComponent } from './components/toast-container/toast-container';\r\n\r\nimport { CupcakeCoreConfig, CUPCAKE_CORE_CONFIG } from './services/auth';\r\nimport { authInterceptor } from './interceptors/auth-interceptor';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n HttpClientModule,\r\n RouterModule,\r\n NgbModule,\r\n LoginComponent,\r\n RegisterComponent,\r\n ToastContainerComponent\r\n ],\r\n exports: [\r\n LoginComponent,\r\n RegisterComponent, \r\n ToastContainerComponent,\r\n CommonModule,\r\n ReactiveFormsModule,\r\n NgbModule\r\n ]\r\n})\r\nexport class CupcakeCoreModule {\r\n static forRoot(config: CupcakeCoreConfig): ModuleWithProviders<CupcakeCoreModule> {\r\n return {\r\n ngModule: CupcakeCoreModule,\r\n providers: [\r\n { provide: CUPCAKE_CORE_CONFIG, useValue: config },\r\n provideHttpClient(\r\n withInterceptors([authInterceptor])\r\n )\r\n ]\r\n };\r\n }\r\n}","/*\n * Public API Surface of cupcake-core\n */\n\nexport * from './lib/models';\n\nexport * from './lib/services';\n\nexport * from './lib/guards';\n\nexport * from './lib/interceptors';\n\nexport * from './lib/components';\n\nexport * from './lib/cupcake-core.module';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["map","i1.ToastService","tap","switchMap","i1.AuthService","getCleanReturnUrl","i1","i2","i3"],"mappings":"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"}
|