@progalaxyelabs/ngx-stonescriptphp-client 1.18.1 → 1.18.2

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":"progalaxyelabs-ngx-stonescriptphp-client.mjs","sources":["../../src/my-environment.model.ts","../../src/auth.plugin.ts","../../src/plugins/stonescriptphp-auth.plugin.ts","../../src/provide.ts","../../src/plugins/progalaxyelabs-auth.plugin.ts","../../src/api-response.model.ts","../../src/token.service.ts","../../src/signin-status.service.ts","../../src/auth.service.ts","../../src/api-connection.service.ts","../../src/db.service.ts","../../src/csrf.service.ts","../../src/files.service.ts","../../src/provider-registry.service.ts","../../src/lib/components/tenant-login.component.ts","../../src/lib/components/register.component.ts","../../src/lib/components/auth-page.component.ts","../../src/lib/components/login-dialog.component.ts","../../src/lib/components/tenant-register.component.ts","../../src/lib/components/tenant-login-dialog.component.ts","../../src/lib/components/tenant-register-dialog.component.ts","../../src/index.ts","../../src/progalaxyelabs-ngx-stonescriptphp-client.ts"],"sourcesContent":["export type AuthMode = 'cookie' | 'body' | 'none';\n\nexport interface AuthConfig {\n /**\n * Authentication mode:\n * - 'cookie': Use httpOnly cookies + CSRF tokens (recommended, matches StoneScriptPHP v2.1.x)\n * - 'body': Send tokens in request body (legacy mode)\n * - 'none': No automatic token refresh\n */\n mode: AuthMode;\n\n /**\n * Auth server host for token refresh and all auth operations.\n * Use this when auth is on a different server than the API.\n * Replaces the deprecated accountsUrl and accountsServer fields.\n * @example 'https://accounts.progalaxyelabs.com'\n */\n host?: string;\n\n /**\n * Token refresh endpoint path.\n * @default '/auth/refresh' for cookie mode, '/user/refresh_access' for body mode\n */\n refreshEndpoint?: string;\n\n /**\n * Enable CSRF token support (required for cookie mode).\n * @default true for cookie mode, false for body mode\n */\n useCsrf?: boolean;\n\n /**\n * Cookie name for refresh token.\n * @default 'refresh_token'\n */\n refreshTokenCookieName?: string;\n\n /**\n * Cookie name for CSRF token.\n * @default 'csrf_token'\n */\n csrfTokenCookieName?: string;\n\n /**\n * CSRF header name.\n * @default 'X-CSRF-Token'\n */\n csrfHeaderName?: string;\n\n /**\n * Response field mapping for external auth compatibility.\n * Defaults to StoneScriptPHP format: { status:'ok', data:{ access_token, user } }\n * Replaces the deprecated top-level authResponseMap field.\n */\n responseMap?: Partial<AuthResponseMap>;\n}\n\n/**\n * Authentication server configuration (for multi-server mode via StoneScriptPHPAuth).\n */\nexport interface AuthServerConfig {\n /** Server URL (e.g., 'https://accounts.progalaxyelabs.com') */\n url: string;\n /** JWKS endpoint for token validation (optional, defaults to /api/auth/jwks) */\n jwksEndpoint?: string;\n /** Whether this is the default server */\n default?: boolean;\n}\n\n/**\n * Configuration for a custom OAuth provider.\n */\nexport interface OAuthProviderConfig {\n /** Display label for the provider (e.g., \"Okta\") */\n label: string;\n /** Optional icon character or emoji to display */\n icon?: string;\n /** Optional CSS class to apply to the button (e.g., \"btn-okta\") */\n cssClass?: string;\n /** Optional inline button styles for custom branding */\n buttonStyle?: {\n borderColor?: string;\n backgroundColor?: string;\n color?: string;\n };\n}\n\n/**\n * Maps auth service response fields to expected locations.\n * Paths use dot-notation (e.g., 'data.access_token' for nested fields).\n *\n * StoneScriptPHP format: { status: 'ok', data: { access_token, user, ... } }\n * Raw/external format: { access_token, identity, ... }\n */\nexport interface AuthResponseMap {\n /**\n * Dot-path to check for success (e.g., 'status' for StoneScriptPHP).\n * If omitted, success is determined by presence of accessToken.\n */\n successPath?: string;\n\n /** Value that indicates success at successPath (e.g., 'ok') */\n successValue?: string;\n\n /** Dot-path to the access token (default: 'data.access_token') */\n accessTokenPath: string;\n\n /** Dot-path to the refresh token (default: 'data.refresh_token') */\n refreshTokenPath: string;\n\n /** Dot-path to the user/identity object (default: 'data.user') */\n userPath: string;\n\n /** Dot-path to error message (default: 'message') */\n errorMessagePath?: string;\n}\n\nexport class MyEnvironmentModel {\n production: boolean = true\n\n /**\n * Platform code identifier (e.g., 'progalaxy', 'hr', 'admin').\n * Used for multi-tenant authentication.\n */\n platformCode: string = '';\n\n apiServer: {\n host: string\n } = { host: '' }\n\n /**\n * Files service server configuration.\n * Used by FilesService for file upload/download operations.\n * @example { host: 'https://files.progalaxyelabs.com/api/' }\n */\n filesServer?: {\n host: string\n }\n\n /**\n * Chat service server configuration.\n * Used by Angular portals to establish authenticated WebSocket connections.\n * @example { host: 'wss://chat.progalaxyelabs.com' }\n */\n chatServer?: {\n host: string\n }\n\n /**\n * Authentication configuration.\n * @default { mode: 'cookie', refreshEndpoint: '/auth/refresh', useCsrf: true }\n */\n auth?: AuthConfig = {\n mode: 'cookie',\n refreshEndpoint: '/auth/refresh',\n useCsrf: true,\n refreshTokenCookieName: 'refresh_token',\n csrfTokenCookieName: 'csrf_token',\n csrfHeaderName: 'X-CSRF-Token'\n };\n\n /**\n * Multiple authentication servers configuration (for StoneScriptPHPAuth multi-server mode).\n * @example\n * ```typescript\n * authServers: {\n * customer: { url: 'https://auth.progalaxyelabs.com', default: true },\n * employee: { url: 'https://admin-auth.progalaxyelabs.com' }\n * }\n * ```\n */\n authServers?: Record<string, AuthServerConfig>;\n\n /**\n * Custom OAuth provider configurations.\n * @example\n * ```typescript\n * customProviders: {\n * okta: { label: 'Sign in with Okta', cssClass: 'btn-okta', buttonStyle: { borderColor: '#007dc1' } }\n * }\n * ```\n */\n customProviders?: Record<string, OAuthProviderConfig>;\n\n /**\n * Branding configuration for auth UI components.\n */\n branding?: {\n appName: string;\n logo?: string;\n primaryColor?: string;\n gradientStart?: string;\n gradientEnd?: string;\n subtitle?: string;\n };\n\n // ── Deprecated fields (kept for backward compatibility) ──────────────────\n\n /**\n * @deprecated Use auth.host instead.\n * Auth server URL for centralized authentication.\n */\n accountsUrl: string = '';\n\n /**\n * @deprecated Use auth.host instead.\n * Accounts/Authentication service server configuration.\n */\n accountsServer?: {\n host: string\n }\n\n /**\n * @deprecated Use auth.responseMap instead.\n * Auth response field mapping for external auth compatibility.\n */\n authResponseMap?: AuthResponseMap;\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const AUTH_PLUGIN = new InjectionToken<AuthPlugin>('AUTH_PLUGIN');\n\nexport interface User {\n user_id?: number; // Optional - not present in new auth responses (post-cleanup)\n id?: string; // Optional - not present in new auth responses (post-cleanup)\n email: string;\n display_name: string; // Always provided (fallback to email prefix if missing)\n photo_url?: string;\n is_email_verified: boolean; // Always provided (defaults to false if missing)\n}\n\nexport interface AuthResult {\n success: boolean;\n message?: string;\n user?: User;\n /** Set by the plugin on successful auth — AuthService stores it in TokenService */\n accessToken?: string;\n /** Set by the plugin for body mode — AuthService stores it in TokenService */\n refreshToken?: string;\n needsVerification?: boolean;\n /** Membership returned directly by the login response (avoids extra API call) */\n membership?: TenantMembership;\n /** True when the user is new (has identity but no tenant membership) */\n isNewIdentity?: boolean;\n /** Auth method used (e.g., 'oauth', 'emailPassword') */\n authMethod?: string;\n /** OAuth provider used (e.g., 'google') */\n oauthProvider?: string;\n /** Identity info for new users (used with isNewIdentity) */\n identity?: { email: string; display_name?: string; picture?: string };\n /** Multiple tenant memberships for tenant selection flow */\n memberships?: TenantMembership[];\n}\n\nexport interface TenantMembership {\n tenant_id: string;\n slug: string;\n name: string;\n role: string;\n status: string;\n last_accessed?: string;\n}\n\n/**\n * Auth plugin interface — implement this to support any auth backend.\n *\n * The library ships StoneScriptPHPAuth as the built-in plugin.\n * For external providers (Firebase, progalaxyelabs-auth, Okta, etc.),\n * create a class implementing this interface and provide it via\n * provideNgxStoneScriptPhpClient(environment, new YourAuthPlugin(...))\n *\n * @example Firebase\n * ```typescript\n * // firebase-auth.auth-plugin.ts (in your app)\n * export class FirebaseAuthPlugin implements AuthPlugin {\n * async login(email, password): Promise<AuthResult> {\n * const cred = await signInWithEmailAndPassword(getAuth(), email, password);\n * return { success: true, accessToken: await cred.user.getIdToken() };\n * }\n * async refresh(): Promise<string | null> {\n * const user = getAuth().currentUser;\n * return user ? await user.getIdToken(true) : null;\n * }\n * // ...\n * }\n * ```\n */\nexport interface AuthPlugin {\n // ── Required ──────────────────────────────────────────────────────────────\n\n /**\n * Authenticate with email and password.\n * Return accessToken (and optionally refreshToken for body mode) in result.\n */\n login(email: string, password: string): Promise<AuthResult>;\n\n /**\n * Register a new user account.\n * Return accessToken on success.\n */\n register(email: string, password: string, displayName: string): Promise<AuthResult>;\n\n /**\n * Sign out the current user.\n * @param refreshToken - Current refresh token (for body mode revocation)\n */\n logout(refreshToken?: string): Promise<void>;\n\n /**\n * Check for an existing session on app init (e.g., via httpOnly refresh cookie).\n * Return success + accessToken if session is valid.\n */\n checkSession(): Promise<AuthResult>;\n\n /**\n * Refresh the access token.\n * @param accessToken - Current access token (for body mode)\n * @param refreshToken - Current refresh token (for body mode)\n * @returns New access token, or null if refresh failed\n */\n refresh(accessToken: string, refreshToken?: string): Promise<string | null>;\n\n // ── Optional ──────────────────────────────────────────────────────────────\n\n /** OAuth popup login (google, github, linkedin, etc.) */\n loginWithProvider?(provider: string): Promise<AuthResult>;\n\n /** Select a tenant and get a tenant-scoped access token */\n selectTenant?(tenantId: string, accessToken: string): Promise<AuthResult>;\n\n /** List tenant memberships for the authenticated user */\n getTenantMemberships?(accessToken: string): Promise<TenantMembership[]>;\n\n /** Check if a tenant slug is available */\n checkTenantSlugAvailable?(slug: string): Promise<{ available: boolean; suggestion?: string }>;\n\n /** Check onboarding status for a user identity */\n checkOnboardingStatus?(identityId: string, platformCode?: string): Promise<any>;\n\n /** Check if user email exists */\n checkEmail?(email: string): Promise<{ exists: boolean; user?: any }>;\n\n // ── Multi-server (implemented by StoneScriptPHPAuth) ──────────────────────\n\n switchServer?(serverName: string): void;\n getAvailableServers?(): string[];\n getActiveServer?(): string | null;\n getServerConfig?(serverName?: string): any;\n}\n","import { AuthPlugin, AuthResult, TenantMembership, User } from '../auth.plugin';\nimport { AuthResponseMap, AuthConfig, AuthServerConfig } from '../my-environment.model';\n\nexport interface StoneScriptPHPAuthConfig {\n /** Auth server base URL (e.g., 'https://accounts.progalaxyelabs.com') */\n host: string;\n\n /** Platform code for multi-tenant auth (e.g., 'progalaxy', 'hr') */\n platformCode?: string;\n\n /**\n * Named auth servers for multi-server mode.\n * When set, host is used as fallback if no default server is specified.\n */\n authServers?: Record<string, AuthServerConfig>;\n\n /**\n * Response field mapping for external format compatibility.\n * Defaults to StoneScriptPHP format: { status:'ok', data:{ access_token, user } }\n */\n responseMap?: Partial<AuthResponseMap>;\n\n /**\n * Auth mode and CSRF configuration.\n * Defaults: mode='cookie', refreshEndpoint='/auth/refresh', useCsrf=true\n */\n auth?: Pick<AuthConfig, 'mode' | 'refreshEndpoint' | 'useCsrf' | 'csrfTokenCookieName' | 'csrfHeaderName'>;\n\n}\n\nconst ACTIVE_SERVER_KEY = 'progalaxyapi_active_auth_server';\n\nconst DEFAULT_RESPONSE_MAP: Required<AuthResponseMap> = {\n successPath: 'status',\n successValue: 'ok',\n accessTokenPath: 'data.access_token',\n refreshTokenPath: 'data.refresh_token',\n userPath: 'data.user',\n errorMessagePath: 'message'\n};\n\n/**\n * Built-in auth plugin for StoneScriptPHP backends.\n *\n * Handles StoneScriptPHP's auth format ({ status:'ok', data:{ access_token } })\n * with optional authResponseMap overrides for external backends.\n *\n * Supports:\n * - Cookie mode (httpOnly refresh token + CSRF)\n * - Body mode (tokens in localStorage)\n * - Multi-server auth (named authServers config)\n * - OAuth popup login\n * - Multi-tenant operations\n */\nexport class StoneScriptPHPAuth implements AuthPlugin {\n private activeServer: string | null = null;\n\n constructor(private config: StoneScriptPHPAuthConfig) {\n this.restoreActiveServer();\n }\n\n // ── Response mapping ────────────────────────────────────────────────────\n\n private get responseMap(): Required<AuthResponseMap> {\n const m = this.config.responseMap;\n if (!m) return DEFAULT_RESPONSE_MAP;\n return { ...DEFAULT_RESPONSE_MAP, ...m };\n }\n\n private resolvePath(obj: any, path: string): any {\n return path.split('.').reduce((o, key) => o?.[key], obj);\n }\n\n private isAuthSuccess(data: any): boolean {\n const map = this.responseMap;\n if (map.successPath) {\n return this.resolvePath(data, map.successPath) === (map.successValue ?? 'ok');\n }\n return !!this.resolvePath(data, map.accessTokenPath);\n }\n\n private resolveAccessToken(data: any): string | undefined {\n return this.resolvePath(data, this.responseMap.accessTokenPath);\n }\n\n private resolveRefreshToken(data: any): string | undefined {\n return this.resolvePath(data, this.responseMap.refreshTokenPath);\n }\n\n private resolveUser(data: any): User | undefined {\n const raw = this.resolvePath(data, this.responseMap.userPath);\n return raw ? this.normalizeUser(raw) : undefined;\n }\n\n private resolveMembership(data: any): TenantMembership | undefined {\n const raw = this.resolvePath(data, 'data.membership');\n return raw ? raw as TenantMembership : undefined;\n }\n\n private resolveErrorMessage(data: any, fallback: string): string {\n const path = this.responseMap.errorMessagePath ?? 'message';\n return this.resolvePath(data, path) || fallback;\n }\n\n private normalizeUser(raw: any): User {\n const user: User = {\n email: raw.email,\n display_name: raw.display_name ?? raw.email?.split('@')[0] ?? '',\n photo_url: raw.photo_url,\n is_email_verified: raw.is_email_verified ?? false\n };\n // id and user_id are optional after auth response cleanup (task #1552)\n // Only populate them if the raw data contains them\n if (raw.id) {\n user.id = raw.id;\n } else if (raw.user_id) {\n user.id = String(raw.user_id);\n }\n if (raw.user_id) {\n user.user_id = raw.user_id;\n } else if (raw.id) {\n user.user_id = this.hashUUID(raw.id);\n }\n return user;\n }\n\n private hashUUID(uuid: string): number {\n let hash = 0;\n for (let i = 0; i < uuid.length; i++) {\n const char = uuid.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash);\n }\n\n // ── CSRF (inlined, no Angular DI needed) ────────────────────────────────\n\n private getCsrfToken(): string | null {\n const cookieName = this.config.auth?.csrfTokenCookieName ?? 'csrf_token';\n const cookies = document.cookie.split(';');\n for (const cookie of cookies) {\n const [name, value] = cookie.trim().split('=');\n if (name === cookieName) return decodeURIComponent(value);\n }\n return null;\n }\n\n // ── Server resolution ────────────────────────────────────────────────────\n\n private getAccountsUrl(serverName?: string): string {\n if (this.config.authServers && Object.keys(this.config.authServers).length > 0) {\n const target = serverName || this.activeServer || this.getDefaultServer();\n if (!target) throw new Error('No auth server specified and no default server configured');\n const serverConfig = this.config.authServers[target];\n if (!serverConfig) throw new Error(`Auth server '${target}' not found in configuration`);\n return serverConfig.url;\n }\n return this.config.host;\n }\n\n private getDefaultServer(): string | null {\n if (!this.config.authServers) return null;\n for (const [name, cfg] of Object.entries(this.config.authServers)) {\n if (cfg.default) return name;\n }\n return Object.keys(this.config.authServers)[0] || null;\n }\n\n private restoreActiveServer(): void {\n try {\n const saved = localStorage.getItem(ACTIVE_SERVER_KEY);\n this.activeServer = (saved && this.config.authServers?.[saved])\n ? saved\n : this.getDefaultServer();\n } catch {\n this.activeServer = this.getDefaultServer();\n }\n }\n\n // ── Multi-server public API ──────────────────────────────────────────────\n\n switchServer(serverName: string): void {\n if (!this.config.authServers?.[serverName]) {\n throw new Error(`Auth server '${serverName}' not found in configuration`);\n }\n try { localStorage.setItem(ACTIVE_SERVER_KEY, serverName); } catch { /* ignore */ }\n this.activeServer = serverName;\n }\n\n getAvailableServers(): string[] {\n return Object.keys(this.config.authServers ?? {});\n }\n\n getActiveServer(): string | null {\n return this.activeServer;\n }\n\n getServerConfig(serverName?: string): AuthServerConfig | null {\n if (!this.config.authServers) return null;\n const target = serverName || this.activeServer || this.getDefaultServer();\n return target ? (this.config.authServers[target] ?? null) : null;\n }\n\n // ── Core auth operations ─────────────────────────────────────────────────\n\n async login(email: string, password: string): Promise<AuthResult> {\n try {\n const accountsUrl = this.getAccountsUrl();\n const response = await fetch(`${accountsUrl}/api/auth/login`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ email, password, platform: this.config.platformCode })\n });\n const data = await response.json();\n if (this.isAuthSuccess(data)) {\n return {\n success: true,\n accessToken: this.resolveAccessToken(data),\n refreshToken: this.resolveRefreshToken(data),\n user: this.resolveUser(data),\n membership: this.resolveMembership(data)\n };\n }\n return { success: false, message: this.resolveErrorMessage(data, 'Invalid credentials') };\n } catch {\n return { success: false, message: 'Network error. Please try again.' };\n }\n }\n\n async register(email: string, password: string, displayName: string): Promise<AuthResult> {\n try {\n const accountsUrl = this.getAccountsUrl();\n const response = await fetch(`${accountsUrl}/api/auth/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n email,\n password,\n display_name: displayName,\n platform: this.config.platformCode\n })\n });\n const data = await response.json();\n if (this.isAuthSuccess(data)) {\n return {\n success: true,\n accessToken: this.resolveAccessToken(data),\n refreshToken: this.resolveRefreshToken(data),\n user: this.resolveUser(data),\n needsVerification: !!data.needs_verification,\n message: data.needs_verification ? 'Please verify your email' : undefined\n };\n }\n return { success: false, message: this.resolveErrorMessage(data, 'Registration failed') };\n } catch {\n return { success: false, message: 'Network error. Please try again.' };\n }\n }\n\n async logout(refreshToken?: string): Promise<void> {\n try {\n const accountsUrl = this.getAccountsUrl();\n await fetch(`${accountsUrl}/api/auth/logout`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ refresh_token: refreshToken })\n });\n } catch (error) {\n console.error('Logout API call failed:', error);\n }\n }\n\n async checkSession(): Promise<AuthResult> {\n try {\n const accountsUrl = this.getAccountsUrl();\n const response = await fetch(`${accountsUrl}/api/auth/refresh`, {\n method: 'POST',\n credentials: 'include'\n });\n if (!response.ok) return { success: false };\n const data = await response.json();\n const accessToken = this.resolveAccessToken(data);\n if (accessToken) {\n return { success: true, accessToken, user: this.resolveUser(data) };\n }\n return { success: false };\n } catch {\n return { success: false };\n }\n }\n\n async refresh(accessToken: string, refreshToken?: string): Promise<string | null> {\n const mode = this.config.auth?.mode ?? 'cookie';\n if (mode === 'none') return null;\n return mode === 'cookie'\n ? this.refreshCookieMode()\n : this.refreshBodyMode(accessToken, refreshToken);\n }\n\n private async refreshCookieMode(): Promise<string | null> {\n try {\n const authHost = this.getAccountsUrl();\n const endpoint = this.config.auth?.refreshEndpoint ?? '/auth/refresh';\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\n if (this.config.auth?.useCsrf !== false) {\n const csrfToken = this.getCsrfToken();\n if (!csrfToken) {\n console.error('CSRF token not found in cookie');\n return null;\n }\n headers[this.config.auth?.csrfHeaderName ?? 'X-CSRF-Token'] = csrfToken;\n }\n\n const response = await fetch(`${authHost}${endpoint}`, {\n method: 'POST',\n mode: 'cors',\n credentials: 'include',\n redirect: 'error',\n headers\n });\n if (!response.ok) return null;\n\n const data = await response.json();\n if (!this.isAuthSuccess(data)) return null;\n\n return this.resolveAccessToken(data) ?? null;\n } catch (error) {\n console.error('Token refresh failed (cookie mode):', error);\n return null;\n }\n }\n\n private async refreshBodyMode(accessToken: string, refreshToken?: string): Promise<string | null> {\n if (!refreshToken) return null;\n try {\n const authHost = this.getAccountsUrl();\n const endpoint = this.config.auth?.refreshEndpoint ?? '/user/refresh_access';\n const response = await fetch(`${authHost}${endpoint}`, {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ access_token: accessToken, refresh_token: refreshToken })\n });\n if (!response.ok) return null;\n\n const data = await response.json();\n return this.resolveAccessToken(data) ?? null;\n } catch (error) {\n console.error('Token refresh failed (body mode):', error);\n return null;\n }\n }\n\n // ── OAuth ────────────────────────────────────────────────────────────────\n\n async loginWithProvider(provider: string): Promise<AuthResult> {\n return new Promise((resolve) => {\n const width = 500, height = 600;\n const left = (window.screen.width - width) / 2;\n const top = (window.screen.height - height) / 2;\n\n const accountsUrl = this.getAccountsUrl();\n const oauthUrl = `${accountsUrl}/oauth/${provider}?platform=${this.config.platformCode}&mode=popup`;\n\n const popup = window.open(oauthUrl, `${provider}_login`,\n `width=${width},height=${height},left=${left},top=${top}`);\n\n if (!popup) {\n resolve({ success: false, message: 'Popup blocked. Please allow popups for this site.' });\n return;\n }\n\n const cleanup = () => {\n window.removeEventListener('message', messageHandler);\n clearInterval(checkClosed);\n if (popup && !popup.closed) popup.close();\n };\n\n const messageHandler = (event: MessageEvent) => {\n if (event.origin !== new URL(accountsUrl).origin) return;\n\n if (event.data.type === 'oauth_new_identity') {\n cleanup();\n resolve({\n success: true,\n accessToken: event.data.access_token,\n refreshToken: event.data.refresh_token,\n isNewIdentity: true,\n authMethod: event.data.auth_method,\n oauthProvider: event.data.oauth_provider,\n identity: event.data.identity,\n });\n } else if (event.data.type === 'oauth_success') {\n cleanup();\n const rawUser = event.data.user || this.resolveUser(event.data);\n resolve({\n success: true,\n accessToken: event.data.access_token,\n refreshToken: event.data.refresh_token,\n user: rawUser ? this.normalizeUser(rawUser) : undefined,\n membership: event.data.membership,\n });\n } else if (event.data.type === 'oauth_tenant_selection') {\n cleanup();\n resolve({\n success: true,\n accessToken: event.data.selection_token,\n memberships: event.data.memberships,\n });\n } else if (event.data.type === 'oauth_error') {\n cleanup();\n resolve({ success: false, message: event.data.message || 'OAuth login failed' });\n }\n };\n\n window.addEventListener('message', messageHandler);\n\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkClosed);\n window.removeEventListener('message', messageHandler);\n resolve({ success: false, message: 'Login cancelled' });\n }\n }, 500);\n });\n }\n\n // ── Multi-tenant ─────────────────────────────────────────────────────────\n\n async selectTenant(tenantId: string, accessToken: string): Promise<AuthResult> {\n try {\n const accountsUrl = this.getAccountsUrl();\n const response = await fetch(`${accountsUrl}/api/auth/select-tenant`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${accessToken}`,\n 'Content-Type': 'application/json'\n },\n credentials: 'include',\n body: JSON.stringify({ tenant_id: tenantId })\n });\n const data = await response.json();\n if (this.isAuthSuccess(data)) {\n return { success: true, accessToken: this.resolveAccessToken(data) };\n }\n return { success: false, message: this.resolveErrorMessage(data, 'Failed to select tenant') };\n } catch {\n return { success: false, message: 'Network error. Please try again.' };\n }\n }\n\n async getTenantMemberships(accessToken: string): Promise<TenantMembership[]> {\n try {\n const accountsUrl = this.getAccountsUrl();\n const platformCode = encodeURIComponent(this.config.platformCode ?? '');\n const response = await fetch(`${accountsUrl}/api/auth/memberships?platform_code=${platformCode}`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${accessToken}`,\n 'Content-Type': 'application/json'\n },\n credentials: 'include'\n });\n const data = await response.json();\n return data.memberships || [];\n } catch {\n return [];\n }\n }\n\n async checkTenantSlugAvailable(slug: string): Promise<{ available: boolean; suggestion?: string }> {\n try {\n const accountsUrl = this.getAccountsUrl();\n const response = await fetch(`${accountsUrl}/api/auth/check-tenant-slug/${slug}`, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' }\n });\n const data = await response.json();\n return { available: data.available || false, suggestion: data.suggestion };\n } catch {\n return { available: true };\n }\n }\n\n async checkOnboardingStatus(identityId: string, platformCode?: string): Promise<any> {\n const accountsUrl = this.getAccountsUrl();\n const platform = platformCode ?? this.config.platformCode ?? '';\n const response = await fetch(\n `${accountsUrl}/api/auth/onboarding/status?platform_code=${platform}&identity_id=${identityId}`,\n { method: 'GET', headers: { 'Content-Type': 'application/json' }, credentials: 'include' }\n );\n if (!response.ok) throw new Error('Failed to check onboarding status');\n return response.json();\n }\n\n async checkEmail(email: string): Promise<{ exists: boolean; user?: any }> {\n try {\n const accountsUrl = this.getAccountsUrl();\n const response = await fetch(`${accountsUrl}/api/auth/check-email`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email })\n });\n const data = await response.json();\n return { exists: data.exists, user: data.user };\n } catch {\n return { exists: false };\n }\n }\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { MyEnvironmentModel } from './my-environment.model';\nimport { AUTH_PLUGIN, AuthPlugin } from './auth.plugin';\nimport { StoneScriptPHPAuth } from './plugins/stonescriptphp-auth.plugin';\n\n/**\n * Configure the ngx-stonescriptphp-client library.\n *\n * @param environment - Library configuration (API server, auth settings, etc.)\n * @param plugin - Optional auth plugin override. Defaults to StoneScriptPHPAuth.\n * Provide your own plugin to use Firebase, progalaxyelabs-auth, Okta, or any other auth backend.\n *\n * @example Default (StoneScriptPHP backend)\n * ```typescript\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideNgxStoneScriptPhpClient(environment)\n * ]\n * };\n * ```\n *\n * @example External auth plugin\n * ```typescript\n * import { ProgalaxyElabsAuth } from './progalaxyelabs-auth.auth-plugin';\n *\n * providers: [\n * provideNgxStoneScriptPhpClient(environment, new ProgalaxyElabsAuth({ host: '...' }))\n * ]\n * ```\n *\n * @example Firebase\n * ```typescript\n * import { FirebaseAuthPlugin } from './firebase-auth.auth-plugin';\n *\n * providers: [\n * provideNgxStoneScriptPhpClient(environment, new FirebaseAuthPlugin(firebaseConfig))\n * ]\n * ```\n */\nexport function provideNgxStoneScriptPhpClient(\n environment: MyEnvironmentModel,\n plugin?: AuthPlugin\n): EnvironmentProviders {\n const resolvedPlugin = plugin ?? new StoneScriptPHPAuth({\n // Resolve auth host: auth.host → accountsServer.host (compat) → accountsUrl (compat) → apiServer.host\n host: environment.auth?.host\n || environment.accountsServer?.host\n || environment.accountsUrl\n || environment.apiServer.host,\n platformCode: environment.platformCode,\n authServers: environment.authServers,\n responseMap: environment.auth?.responseMap ?? environment.authResponseMap,\n auth: environment.auth\n });\n\n return makeEnvironmentProviders([\n { provide: MyEnvironmentModel, useValue: environment },\n { provide: AUTH_PLUGIN, useValue: resolvedPlugin }\n ]);\n}\n","import { AuthPlugin, AuthResult, TenantMembership, User } from '../auth.plugin';\n\nexport interface ProgalaxyElabsAuthConfig {\n host: string;\n platformCode: string;\n}\n\n/**\n * Auth plugin for progalaxyelabs-auth (Rust/Axum).\n *\n * Speaks the Rust auth server's native format:\n * - Login: { access_token, refresh_token, identity, membership, ... }\n * - Tenant selection: { requires_tenant_selection, selection_token, memberships }\n * - New identity: { access_token, identity, is_new_identity, memberships:[] }\n * - select-tenant: Bearer header + { tenant_id } body\n * - refresh: { access_token, refresh_token } body mode\n */\nexport class ProgalaxyElabsAuth implements AuthPlugin {\n\n constructor(private config: ProgalaxyElabsAuthConfig) {}\n\n private get host(): string {\n return this.config.host;\n }\n\n // -- Login ----------------------------------------------------------------\n\n async login(email: string, password: string): Promise<AuthResult> {\n try {\n const response = await fetch(`${this.host}/api/auth/login`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, password, platform: this.config.platformCode })\n });\n const data = await response.json();\n if (!response.ok) {\n return { success: false, message: data.error || data.message || 'Login failed' };\n }\n return this.handleLoginResponse(data);\n } catch {\n return { success: false, message: 'Network error. Please try again.' };\n }\n }\n\n async register(email: string, password: string, displayName: string): Promise<AuthResult> {\n try {\n const response = await fetch(`${this.host}/api/auth/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n email,\n password,\n display_name: displayName,\n platform: this.config.platformCode\n })\n });\n const data = await response.json();\n if (!response.ok) {\n return { success: false, message: data.error || data.message || 'Registration failed' };\n }\n return this.handleLoginResponse(data);\n } catch {\n return { success: false, message: 'Network error. Please try again.' };\n }\n }\n\n // -- Logout ---------------------------------------------------------------\n\n async logout(refreshToken?: string): Promise<void> {\n try {\n await fetch(`${this.host}/api/auth/logout`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refresh_token: refreshToken })\n });\n } catch { /* ignore */ }\n }\n\n // -- Session & Refresh ----------------------------------------------------\n\n async checkSession(): Promise<AuthResult> {\n return { success: false };\n }\n\n async refresh(accessToken: string, refreshToken?: string): Promise<string | null> {\n if (!refreshToken) return null;\n try {\n const response = await fetch(`${this.host}/api/auth/refresh`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ access_token: accessToken, refresh_token: refreshToken })\n });\n if (!response.ok) return null;\n const data = await response.json();\n\n // Refresh can also return tenant_selection if memberships changed\n if (data.requires_tenant_selection) return null;\n\n return data.access_token ?? null;\n } catch {\n return null;\n }\n }\n\n // -- Tenant operations ----------------------------------------------------\n\n async selectTenant(tenantId: string, selectionToken: string): Promise<AuthResult> {\n try {\n const response = await fetch(`${this.host}/api/auth/select-tenant`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${selectionToken}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ tenant_id: tenantId })\n });\n const data = await response.json();\n if (!response.ok) {\n return { success: false, message: data.error || data.message || 'Tenant selection failed' };\n }\n return {\n success: true,\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n user: this.toUser(data.identity),\n membership: this.toMembership(data.membership),\n };\n } catch {\n return { success: false, message: 'Network error. Please try again.' };\n }\n }\n\n async getTenantMemberships(accessToken: string): Promise<TenantMembership[]> {\n try {\n const platformCode = encodeURIComponent(this.config.platformCode);\n const response = await fetch(`${this.host}/api/auth/memberships?platform_code=${platformCode}`, {\n method: 'GET',\n headers: { 'Authorization': `Bearer ${accessToken}` }\n });\n if (!response.ok) return [];\n const data = await response.json();\n return (data.memberships || []).map((m: any) => this.toMembership(m));\n } catch {\n return [];\n }\n }\n\n async checkTenantSlugAvailable(slug: string): Promise<{ available: boolean; suggestion?: string }> {\n try {\n const response = await fetch(`${this.host}/api/auth/check-tenant-slug/${slug}`);\n const data = await response.json();\n return { available: data.available || false, suggestion: data.suggestion };\n } catch {\n return { available: true };\n }\n }\n\n async checkOnboardingStatus(identityId: string, platformCode?: string): Promise<any> {\n const platform = platformCode ?? this.config.platformCode;\n const response = await fetch(\n `${this.host}/api/auth/onboarding/status?platform_code=${platform}&identity_id=${identityId}`\n );\n if (!response.ok) throw new Error('Failed to check onboarding status');\n return response.json();\n }\n\n async checkEmail(email: string): Promise<{ exists: boolean; user?: any }> {\n try {\n const response = await fetch(`${this.host}/api/auth/check-email`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email })\n });\n const data = await response.json();\n return { exists: data.exists, user: data.user };\n } catch {\n return { exists: false };\n }\n }\n\n // -- OAuth ----------------------------------------------------------------\n\n async loginWithProvider(provider: string): Promise<AuthResult> {\n return new Promise((resolve) => {\n const width = 500, height = 600;\n const left = (window.screen.width - width) / 2;\n const top = (window.screen.height - height) / 2;\n\n const oauthUrl = `${this.host}/oauth/${provider}?platform=${this.config.platformCode}&mode=popup`;\n const popup = window.open(oauthUrl, `${provider}_login`,\n `width=${width},height=${height},left=${left},top=${top}`);\n\n if (!popup) {\n resolve({ success: false, message: 'Popup blocked. Please allow popups for this site.' });\n return;\n }\n\n const cleanup = () => {\n window.removeEventListener('message', messageHandler);\n clearInterval(checkClosed);\n if (popup && !popup.closed) popup.close();\n };\n\n const messageHandler = (event: MessageEvent) => {\n if (event.origin !== new URL(this.host).origin) return;\n cleanup();\n\n if (event.data.type === 'oauth_success') {\n resolve({\n success: true,\n accessToken: event.data.access_token,\n refreshToken: event.data.refresh_token,\n user: this.toUser(event.data.user || event.data.identity),\n membership: event.data.membership ? this.toMembership(event.data.membership) : undefined,\n });\n } else if (event.data.type === 'oauth_tenant_selection') {\n resolve({\n success: true,\n accessToken: event.data.selection_token,\n memberships: (event.data.memberships || []).map((m: any) => this.toMembership(m)),\n });\n } else if (event.data.type === 'oauth_new_identity') {\n resolve({\n success: true,\n accessToken: event.data.access_token,\n refreshToken: event.data.refresh_token,\n isNewIdentity: true,\n authMethod: event.data.auth_method,\n oauthProvider: event.data.oauth_provider,\n identity: event.data.identity,\n });\n } else if (event.data.type === 'oauth_error') {\n resolve({ success: false, message: event.data.message || 'OAuth login failed' });\n }\n };\n\n window.addEventListener('message', messageHandler);\n\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkClosed);\n window.removeEventListener('message', messageHandler);\n resolve({ success: false, message: 'Login cancelled' });\n }\n }, 500);\n });\n }\n\n // -- Internal helpers -----------------------------------------------------\n\n private handleLoginResponse(data: any): AuthResult {\n // New identity — needs onboarding\n if (data.is_new_identity) {\n return {\n success: true,\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n isNewIdentity: true,\n authMethod: data.auth_method,\n oauthProvider: data.oauth_provider,\n identity: data.identity,\n };\n }\n\n // Multi-tenant selection required\n if (data.requires_tenant_selection) {\n return {\n success: true,\n accessToken: data.selection_token,\n memberships: (data.memberships || []).map((m: any) => this.toMembership(m)),\n };\n }\n\n // Standard success (single tenant auto-selected or tenant specified)\n return {\n success: true,\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n user: this.toUser(data.identity),\n membership: this.toMembership(data.membership),\n };\n }\n\n private toUser(raw: any): User | undefined {\n if (!raw) return undefined;\n return {\n email: raw.email,\n display_name: raw.display_name ?? raw.email?.split('@')[0] ?? '',\n photo_url: raw.photo_url ?? raw.picture,\n is_email_verified: raw.is_email_verified ?? false\n };\n }\n\n private toMembership(raw: any): TenantMembership {\n return {\n tenant_id: raw.tenant_id,\n slug: raw.tenant_slug ?? raw.slug ?? '',\n name: raw.tenant_name ?? raw.name ?? '',\n role: raw.role ?? '',\n status: raw.status ?? 'active',\n };\n }\n}\n","export class ApiResponse<DataType> {\n public readonly status: string\n public readonly data: DataType | null\n public readonly message: string\n\n get success(): boolean {\n return this.status === 'ok'\n }\n\n get errors(): string[] {\n return this.message ? [this.message] : []\n }\n\n constructor(status: string, data: any = null, message: string = '') {\n this.status = status\n this.data = data || null\n this.message = message\n }\n\n onOk(callback: (data: DataType) => void): ApiResponse<DataType> {\n if (this.status === 'ok') {\n callback(this.data as DataType)\n }\n return this\n }\n\n onNotOk(callback: (message: string, data: DataType) => void): ApiResponse<DataType> {\n if (this.status === 'not ok') {\n callback(this.message, this.data as DataType)\n }\n return this\n }\n\n onError(callback: () => void): ApiResponse<DataType> {\n if (this.status === 'error') {\n callback()\n }\n return this\n }\n\n isSuccess(): boolean {\n return this.status === 'ok'\n }\n\n isError(): boolean {\n return this.status === 'error' || this.status === 'not ok'\n }\n\n getData(): DataType | null {\n return this.data || null\n }\n\n getError(): string {\n return this.message || 'Unknown error'\n }\n\n getStatus(): string {\n return this.status\n }\n\n getMessage(): string {\n return this.message\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TokenService {\n private accessToken = ''\n private refreshToken = ''\n\n private lsAccessTokenKey = 'progalaxyapi_access_token'\n private lsRefreshTokenKey = 'progalaxyapi_refresh_token'\n\n constructor() { }\n\n setTokens(accessToken: string, refreshToken: string) {\n this.accessToken = accessToken\n this.refreshToken = refreshToken\n localStorage.setItem(this.lsAccessTokenKey, accessToken)\n localStorage.setItem(this.lsRefreshTokenKey, refreshToken)\n }\n\n setAccessToken(accessToken: string) {\n this.accessToken = accessToken\n localStorage.setItem(this.lsAccessTokenKey, accessToken)\n }\n\n setRefreshToken(refreshToken: string) {\n this.refreshToken = refreshToken\n localStorage.setItem(this.lsRefreshTokenKey, refreshToken)\n }\n\n getAccessToken() {\n if (this.accessToken) {\n return this.accessToken\n }\n\n const storedAccessToken = localStorage.getItem(this.lsAccessTokenKey)\n if (storedAccessToken) {\n return storedAccessToken\n } else {\n return ''\n }\n }\n\n getRefreshToken() {\n if (this.refreshToken) {\n return this.refreshToken\n }\n\n const storedRefreshToken = localStorage.getItem(this.lsRefreshTokenKey)\n if (storedRefreshToken) {\n return storedRefreshToken\n } else {\n return ''\n }\n }\n\n clear() {\n this.accessToken = ''\n this.refreshToken = ''\n localStorage.removeItem(this.lsAccessTokenKey)\n localStorage.removeItem(this.lsRefreshTokenKey)\n }\n\n /**\n * Check if there is a non-empty access token.\n * Token is treated as opaque — validity is determined by the auth server.\n */\n hasValidAccessToken(): boolean {\n const token = this.getAccessToken()\n return token !== null && token !== ''\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n/**\n * @deprecated Use boolean directly. Kept for backward compatibility.\n */\nexport enum VerifyStatus {\n initialized = 'initialized',\n yes = 'yes',\n no = 'no'\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SigninStatusService {\n public status: BehaviorSubject<boolean | VerifyStatus>\n\n constructor() {\n this.status = new BehaviorSubject<boolean>(false)\n }\n\n signedOut(): void {\n this.status.next(false)\n }\n\n signedIn(): void {\n this.status.next(true)\n }\n\n /**\n * Set signin status\n * @param isSignedIn - True if user is signed in, false otherwise\n */\n setSigninStatus(isSignedIn: boolean): void {\n this.status.next(isSignedIn)\n }\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { TokenService } from './token.service';\nimport { SigninStatusService } from './signin-status.service';\nimport { AUTH_PLUGIN, AuthPlugin, AuthResult, TenantMembership, User } from './auth.plugin';\n\n// Re-export types for backward compatibility\nexport type { AuthResult, TenantMembership, User };\nexport type { AuthPlugin };\n\nexport type BuiltInProvider = 'google' | 'linkedin' | 'apple' | 'microsoft' | 'github' | 'zoho' | 'emailPassword';\n\n/**\n * Authentication provider identifier.\n * Includes all built-in providers plus any custom string identifier.\n * The (string & {}) trick preserves autocomplete for built-in values.\n */\nexport type AuthProvider = BuiltInProvider | (string & {});\n\n/**\n * AuthService — manages auth state and delegates all auth operations to the AuthPlugin.\n *\n * This service holds user state (via BehaviorSubject) and tokens (via TokenService).\n * It does not make any HTTP calls directly — all auth logic lives in the plugin.\n *\n * Provide a plugin via provideNgxStoneScriptPhpClient():\n * - Default: StoneScriptPHPAuth (built-in, matches StoneScriptPHP backend)\n * - External: any class implementing AuthPlugin (Firebase, progalaxyelabs-auth, Okta, etc.)\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthService {\n private readonly USER_STORAGE_KEY = 'progalaxyapi_user';\n\n private userSubject = new BehaviorSubject<User | null>(null);\n public user$: Observable<User | null> = this.userSubject.asObservable();\n\n constructor(\n @Inject(AUTH_PLUGIN) private plugin: AuthPlugin,\n private tokens: TokenService,\n private signinStatus: SigninStatusService\n ) {\n this.restoreUser();\n }\n\n // ── State management ──────────────────────────────────────────────────────\n\n private restoreUser(): void {\n try {\n const userJson = localStorage.getItem(this.USER_STORAGE_KEY);\n if (userJson) this.updateUser(JSON.parse(userJson));\n } catch (error) {\n console.error('Failed to restore user from localStorage:', error);\n }\n }\n\n private saveUser(user: User | null): void {\n try {\n if (user) {\n localStorage.setItem(this.USER_STORAGE_KEY, JSON.stringify(user));\n } else {\n localStorage.removeItem(this.USER_STORAGE_KEY);\n }\n } catch (error) {\n console.error('Failed to save user to localStorage:', error);\n }\n }\n\n private updateUser(user: User | null): void {\n this.userSubject.next(user);\n this.saveUser(user);\n }\n\n private storeAuthResult(result: AuthResult): void {\n if (result.accessToken) this.tokens.setAccessToken(result.accessToken);\n if (result.refreshToken) this.tokens.setRefreshToken(result.refreshToken);\n if (result.user) this.updateUser(result.user);\n this.signinStatus.setSigninStatus(true);\n }\n\n // ── Core auth operations ──────────────────────────────────────────────────\n\n async loginWithEmail(email: string, password: string): Promise<AuthResult> {\n const result = await this.plugin.login(email, password);\n if (result.success) this.storeAuthResult(result);\n return result;\n }\n\n async loginWithGoogle(serverName?: string): Promise<AuthResult> {\n return this.loginWithProvider('google');\n }\n\n async loginWithGitHub(serverName?: string): Promise<AuthResult> {\n return this.loginWithProvider('github');\n }\n\n async loginWithLinkedIn(serverName?: string): Promise<AuthResult> {\n return this.loginWithProvider('linkedin');\n }\n\n async loginWithApple(serverName?: string): Promise<AuthResult> {\n return this.loginWithProvider('apple');\n }\n\n async loginWithMicrosoft(serverName?: string): Promise<AuthResult> {\n return this.loginWithProvider('microsoft');\n }\n\n async loginWithZoho(serverName?: string): Promise<AuthResult> {\n return this.loginWithProvider('zoho');\n }\n\n async loginWithProvider(provider: AuthProvider, serverName?: string): Promise<AuthResult> {\n if (provider === 'emailPassword') {\n throw new Error('Use loginWithEmail() for email/password authentication');\n }\n if (!this.plugin.loginWithProvider) {\n return { success: false, message: 'OAuth not supported by the configured auth plugin' };\n }\n const result = await this.plugin.loginWithProvider(provider);\n if (result.success) this.storeAuthResult(result);\n return result;\n }\n\n async register(\n email: string,\n password: string,\n displayName: string,\n serverName?: string\n ): Promise<AuthResult> {\n const result = await this.plugin.register(email, password, displayName);\n if (result.success) this.storeAuthResult(result);\n return result;\n }\n\n async signout(serverName?: string): Promise<void> {\n const refreshToken = this.tokens.getRefreshToken() || undefined;\n await this.plugin.logout(refreshToken);\n this.tokens.clear();\n this.signinStatus.setSigninStatus(false);\n this.updateUser(null);\n }\n\n async checkSession(serverName?: string): Promise<boolean> {\n if (this.tokens.hasValidAccessToken()) {\n this.signinStatus.setSigninStatus(true);\n return true;\n }\n const result = await this.plugin.checkSession();\n if (result.success && result.accessToken) {\n this.tokens.setAccessToken(result.accessToken);\n if (result.user) this.updateUser(result.user);\n this.signinStatus.setSigninStatus(true);\n return true;\n }\n this.tokens.clear();\n this.updateUser(null);\n this.signinStatus.setSigninStatus(false);\n return false;\n }\n\n /**\n * Refresh the access token. Called by ApiConnectionService on 401.\n * @returns true if token was refreshed, false if refresh failed (user is signed out)\n */\n async refresh(): Promise<boolean> {\n const newToken = await this.plugin.refresh(\n this.tokens.getAccessToken(),\n this.tokens.getRefreshToken() || undefined\n );\n if (newToken) {\n this.tokens.setAccessToken(newToken);\n return true;\n }\n this.tokens.clear();\n this.updateUser(null);\n this.signinStatus.signedOut();\n return false;\n }\n\n isAuthenticated(): boolean {\n return this.tokens.hasValidAccessToken();\n }\n\n getCurrentUser(): User | null {\n return this.userSubject.value;\n }\n\n // ── Multi-tenant operations ───────────────────────────────────────────────\n\n async getTenantMemberships(serverName?: string): Promise<{ memberships: TenantMembership[] }> {\n if (!this.plugin.getTenantMemberships) return { memberships: [] };\n const memberships = await this.plugin.getTenantMemberships(this.tokens.getAccessToken());\n return { memberships };\n }\n\n async selectTenant(tenantId: string, serverName?: string): Promise<{\n success: boolean;\n message?: string;\n access_token?: string;\n }> {\n if (!this.plugin.selectTenant) {\n return { success: false, message: 'selectTenant not supported by the configured auth plugin' };\n }\n const result = await this.plugin.selectTenant(tenantId, this.tokens.getAccessToken());\n if (result.success && result.accessToken) {\n this.tokens.setAccessToken(result.accessToken);\n }\n return { success: result.success, message: result.message, access_token: result.accessToken };\n }\n\n async checkTenantSlugAvailable(slug: string, serverName?: string): Promise<{\n available: boolean;\n suggestion?: string;\n }> {\n if (!this.plugin.checkTenantSlugAvailable) return { available: true };\n return this.plugin.checkTenantSlugAvailable(slug);\n }\n\n async checkOnboardingStatus(identityId: string, serverName?: string): Promise<any> {\n if (!this.plugin.checkOnboardingStatus) throw new Error('checkOnboardingStatus not supported');\n return this.plugin.checkOnboardingStatus(identityId);\n }\n\n // ── Multi-server (delegated to plugin) ────────────────────────────────────\n\n public getAvailableAuthServers(): string[] {\n return this.plugin.getAvailableServers?.() ?? [];\n }\n\n public getActiveAuthServer(): string | null {\n return this.plugin.getActiveServer?.() ?? null;\n }\n\n public switchAuthServer(serverName: string): void {\n if (!this.plugin.switchServer) {\n throw new Error('Multi-server mode not supported by the configured auth plugin');\n }\n this.plugin.switchServer(serverName);\n }\n\n public getAuthServerConfig(serverName?: string): any | null {\n return this.plugin.getServerConfig?.(serverName) ?? null;\n }\n\n public isMultiServerMode(): boolean {\n return (this.plugin.getAvailableServers?.() ?? []).length > 0;\n }\n\n // ── Backward compatibility ────────────────────────────────────────────────\n\n /** @deprecated Use getCurrentUser()?.user_id instead */\n getUserId(): number { return this.userSubject.value?.user_id || 0; }\n\n /** @deprecated Use getCurrentUser()?.display_name instead */\n getUserName(): string { return this.userSubject.value?.display_name || ''; }\n\n /** @deprecated Use getCurrentUser()?.photo_url instead */\n getPhotoUrl(): string { return this.userSubject.value?.photo_url || ''; }\n\n /** @deprecated Use getCurrentUser()?.display_name instead */\n getDisplayName(): string { return this.userSubject.value?.display_name || ''; }\n\n /** @deprecated Use `/profile/${getCurrentUser()?.user_id}` instead */\n getProfileUrl(): string {\n const userId = this.userSubject.value?.user_id;\n return userId ? `/profile/${userId}` : '';\n }\n\n /** @deprecated Use isAuthenticated() instead */\n async signin(): Promise<boolean> { return this.isAuthenticated(); }\n\n /** @deprecated Use loginWithEmail() instead */\n async verifyCredentials(email: string, password: string): Promise<boolean> {\n const result = await this.loginWithEmail(email, password);\n return result.success;\n }\n\n /** @deprecated Check user.is_email_verified from getCurrentUser() instead */\n isSigninEmailValid(): boolean { return this.userSubject.value?.is_email_verified || false; }\n\n /** @deprecated No longer needed */\n onDialogClose(): void { }\n\n /** @deprecated No longer needed */\n closeSocialAuthDialog(): void { }\n\n /** @deprecated Use checkEmail() from the plugin directly */\n async getUserProfile(email: string, serverName?: string): Promise<User | null> {\n if (!this.plugin.checkEmail) return null;\n const result = await this.plugin.checkEmail(email);\n return result.exists ? result.user : null;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { TokenService } from './token.service';\nimport { SigninStatusService } from './signin-status.service';\nimport { ApiResponse } from './api-response.model';\nimport { MyEnvironmentModel } from './my-environment.model';\nimport { AuthService } from './auth.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ApiConnectionService {\n\n private host = '' // base URL without trailing slash\n\n constructor(\n private tokens: TokenService,\n private signinStatus: SigninStatusService,\n private environment: MyEnvironmentModel,\n private authService: AuthService\n ) {\n this.host = environment.apiServer.host\n }\n\n private async request<DataType>(url: string, options: any, data: any | null): Promise<ApiResponse<DataType>> {\n try {\n if (data !== null) {\n const body = JSON.stringify(data)\n options.body = body || {}\n }\n\n const accessTokenIncluded = this.includeAccessToken(options)\n\n let response: Response = await fetch(url, options)\n\n if (response.status === 401 && accessTokenIncluded) {\n response = await this.refreshAndRetry(url, options, response)\n }\n\n if (response.ok) {\n const json = await response.json()\n return new ApiResponse<DataType>(json.status, json.data, json.message)\n }\n\n if (response.status === 401) {\n this.signinStatus.signedOut()\n }\n\n return this.handleError<DataType>(response)\n } catch (error) {\n return this.handleError<DataType>(error)\n }\n }\n\n private handleError<DataType>(error: any): ApiResponse<DataType> {\n console.error(`Backend returned code ${error.status}, full error: `, error)\n return new ApiResponse<DataType>('error')\n }\n\n async get<DataType>(endpoint: string, queryParamsObj?: any): Promise<ApiResponse<DataType>> {\n const url = this.host + endpoint + this.buildQueryString(queryParamsObj)\n const fetchOptions: RequestInit = { mode: 'cors', redirect: 'error' }\n return this.request(url, fetchOptions, null)\n }\n\n async post<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>> {\n const url = this.host + pathWithQueryParams\n const fetchOptions: RequestInit = {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data)\n }\n return this.request(url, fetchOptions, data)\n }\n\n async put<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>> {\n const url = this.host + pathWithQueryParams\n const fetchOptions: RequestInit = {\n method: 'PUT',\n mode: 'cors',\n redirect: 'error',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data)\n }\n return this.request(url, fetchOptions, data)\n }\n\n async patch<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>> {\n const url = this.host + pathWithQueryParams\n const fetchOptions: RequestInit = {\n method: 'PATCH',\n mode: 'cors',\n redirect: 'error',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data)\n }\n return this.request(url, fetchOptions, data)\n }\n\n async delete<DataType>(endpoint: string, queryParamsObj?: any): Promise<ApiResponse<DataType>> {\n const url = this.host + endpoint + this.buildQueryString(queryParamsObj)\n const fetchOptions: RequestInit = { method: 'DELETE', mode: 'cors', redirect: 'error' }\n return this.request(url, fetchOptions, null)\n }\n\n private includeAccessToken(options: any): boolean {\n const accessToken = this.tokens.getAccessToken()\n if (!accessToken) return false\n if (!options.headers) options.headers = {}\n options.headers['Authorization'] = 'Bearer ' + accessToken\n return true\n }\n\n private async refreshAndRetry(url: string, fetchOptions: any, response: Response): Promise<Response> {\n const refreshed = await this.authService.refresh()\n if (!refreshed) return response\n fetchOptions.headers['Authorization'] = 'Bearer ' + this.tokens.getAccessToken()\n return fetch(url, fetchOptions)\n }\n\n /**\n * Refresh the access token (delegates to AuthService → AuthPlugin).\n * Kept public for backward compatibility.\n */\n async refreshAccessToken(): Promise<boolean> {\n return this.authService.refresh()\n }\n\n buildQueryString(options?: any): string {\n if (options === undefined) return ''\n const array = []\n for (const key in options) {\n if (options.hasOwnProperty(key) && options[key] !== null && options[key] !== undefined) {\n array.push(encodeURIComponent(key) + '=' + encodeURIComponent(options[key]))\n }\n }\n const str = array.join('&')\n return str ? '?' + str : ''\n }\n\n /**\n * Upload a drawing (uses upload server if configured, otherwise API server)\n * @deprecated Platform-specific method - consider moving to platform service\n */\n async uploadDrawing<DataType>(formData: FormData): Promise<ApiResponse<DataType>> {\n const uploadHost = (this.environment as any).uploadServer?.host || this.host\n const url = uploadHost + '/upload/drawing'\n const fetchOptions: RequestInit = { method: 'POST', mode: 'cors', redirect: 'error', body: formData }\n return this.request(url, fetchOptions, null)\n }\n\n /**\n * Upload an image (uses upload server if configured, otherwise API server)\n * @deprecated Platform-specific method - consider moving to platform service\n */\n async uploadImage<DataType>(formData: FormData): Promise<ApiResponse<DataType>> {\n const uploadHost = (this.environment as any).uploadServer?.host || this.host\n const url = uploadHost + '/upload/image'\n const fetchOptions: RequestInit = { method: 'POST', mode: 'cors', redirect: 'error', body: formData }\n return this.request(url, fetchOptions, null)\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DbService {\n\n constructor() { }\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * CSRF Token Service\n *\n * Manages CSRF tokens for cookie-based authentication.\n * Reads CSRF token from cookies and provides it for request headers.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class CsrfService {\n\n /**\n * Get CSRF token from cookie\n */\n getCsrfToken(cookieName: string = 'csrf_token'): string | null {\n const cookies = document.cookie.split(';');\n for (const cookie of cookies) {\n const [name, value] = cookie.trim().split('=');\n if (name === cookieName) {\n return decodeURIComponent(value);\n }\n }\n return null;\n }\n\n /**\n * Check if CSRF token exists\n */\n hasCsrfToken(cookieName: string = 'csrf_token'): boolean {\n return this.getCsrfToken(cookieName) !== null;\n }\n\n /**\n * Clear CSRF token (for logout)\n * Note: Client-side deletion is limited for httpOnly cookies\n */\n clearCsrfToken(cookieName: string = 'csrf_token'): void {\n // Can only clear non-httpOnly cookies\n document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { TokenService } from './token.service';\nimport { SigninStatusService } from './signin-status.service';\nimport { MyEnvironmentModel, AuthConfig } from './my-environment.model';\nimport { CsrfService } from './csrf.service';\nimport {\n FileUploadResult,\n FileMetadata,\n FileUploadResponse,\n FileListResponse,\n FileDeleteResponse\n} from './files.model';\n\n/**\n * Service for interacting with the stonescriptphp-files server.\n * Handles file upload, download, list, and delete operations\n * with automatic Bearer token injection and 401 refresh handling.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class FilesService {\n\n private host = '';\n private apiHost = '';\n private authConfig: AuthConfig;\n\n constructor(\n private tokens: TokenService,\n private signinStatus: SigninStatusService,\n private environment: MyEnvironmentModel,\n private csrf: CsrfService\n ) {\n this.host = environment.filesServer?.host || '';\n this.apiHost = environment.apiServer.host;\n\n this.authConfig = {\n mode: environment.auth?.mode || 'cookie',\n refreshEndpoint: environment.auth?.refreshEndpoint,\n useCsrf: environment.auth?.useCsrf,\n refreshTokenCookieName: environment.auth?.refreshTokenCookieName || 'refresh_token',\n csrfTokenCookieName: environment.auth?.csrfTokenCookieName || 'csrf_token',\n csrfHeaderName: environment.auth?.csrfHeaderName || 'X-CSRF-Token'\n };\n\n if (!this.authConfig.refreshEndpoint) {\n this.authConfig.refreshEndpoint = this.authConfig.mode === 'cookie'\n ? '/auth/refresh'\n : '/user/refresh_access';\n }\n\n if (this.authConfig.useCsrf === undefined) {\n this.authConfig.useCsrf = this.authConfig.mode === 'cookie';\n }\n }\n\n /**\n * Check if the files server is configured.\n */\n isConfigured(): boolean {\n return !!this.host;\n }\n\n /**\n * Upload a file to the files service.\n * Uses FormData — does NOT set Content-Type header (browser sets multipart boundary).\n *\n * @param file The File object to upload\n * @param entityType Optional entity type for server-side reference linking\n * @param entityId Optional entity ID for server-side reference linking\n * @returns Promise resolving to the upload result\n */\n async upload(file: File, entityType?: string, entityId?: string): Promise<FileUploadResult> {\n const formData = new FormData();\n formData.append('file', file);\n\n if (entityType) {\n formData.append('entityType', entityType);\n }\n if (entityId) {\n formData.append('entityId', entityId);\n }\n\n const url = this.host + 'upload';\n const options: RequestInit = {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n body: formData\n // No Content-Type header — browser sets multipart boundary automatically\n };\n\n const response = await this.requestWithRetry<FileUploadResponse>(url, options);\n return response.file;\n }\n\n /**\n * Download a file from the files service.\n * Returns a Blob suitable for URL.createObjectURL().\n *\n * @param fileId UUID of the file to download\n * @returns Promise resolving to the file Blob\n */\n async download(fileId: string): Promise<Blob> {\n const url = this.host + 'files/' + fileId;\n const options: RequestInit = {\n method: 'GET',\n mode: 'cors',\n redirect: 'error'\n };\n\n this.includeAccessToken(options);\n\n let response = await fetch(url, options);\n\n if (response.status === 401) {\n const refreshed = await this.refreshAccessToken();\n if (refreshed) {\n this.includeAccessToken(options);\n response = await fetch(url, options);\n }\n }\n\n if (response.status === 401) {\n this.signinStatus.signedOut();\n }\n\n if (!response.ok) {\n throw new Error(`Download failed: ${response.status} ${response.statusText}`);\n }\n\n return response.blob();\n }\n\n /**\n * List all files for the current user.\n *\n * @returns Promise resolving to array of file metadata\n */\n async list(): Promise<FileMetadata[]> {\n const url = this.host + 'files';\n const options: RequestInit = {\n method: 'GET',\n mode: 'cors',\n redirect: 'error'\n };\n\n const response = await this.requestWithRetry<FileListResponse>(url, options);\n return response.files;\n }\n\n /**\n * Delete a file from the files service.\n *\n * @param fileId UUID of the file to delete\n * @returns Promise resolving to true on success\n */\n async delete(fileId: string): Promise<boolean> {\n const url = this.host + 'files/' + fileId;\n const options: RequestInit = {\n method: 'DELETE',\n mode: 'cors',\n redirect: 'error'\n };\n\n const response = await this.requestWithRetry<FileDeleteResponse>(url, options);\n return response.success;\n }\n\n /**\n * Make a request with automatic Bearer token injection and 401 retry.\n */\n private async requestWithRetry<T>(url: string, options: RequestInit): Promise<T> {\n this.includeAccessToken(options);\n\n let response = await fetch(url, options);\n\n if (response.status === 401) {\n const refreshed = await this.refreshAccessToken();\n if (refreshed) {\n this.includeAccessToken(options);\n response = await fetch(url, options);\n }\n }\n\n if (response.status === 401) {\n this.signinStatus.signedOut();\n }\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throw new Error(body.message || `Request failed: ${response.status}`);\n }\n\n return response.json();\n }\n\n private includeAccessToken(options: RequestInit): void {\n const accessToken = this.tokens.getAccessToken();\n if (!accessToken) return;\n\n if (!options.headers) {\n options.headers = {};\n }\n (options.headers as Record<string, string>)['Authorization'] = 'Bearer ' + accessToken;\n }\n\n private async refreshAccessToken(): Promise<boolean> {\n if (this.authConfig.mode === 'none') {\n return false;\n }\n\n if (this.authConfig.mode === 'cookie') {\n return this.refreshAccessTokenCookieMode();\n } else {\n return this.refreshAccessTokenBodyMode();\n }\n }\n\n private async refreshAccessTokenCookieMode(): Promise<boolean> {\n try {\n const refreshTokenUrl = this.apiHost + this.authConfig.refreshEndpoint!.replace(/^\\/+/, '');\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json'\n };\n\n if (this.authConfig.useCsrf) {\n const csrfToken = this.csrf.getCsrfToken(this.authConfig.csrfTokenCookieName!);\n if (!csrfToken) {\n return false;\n }\n headers[this.authConfig.csrfHeaderName!] = csrfToken;\n }\n\n const response = await fetch(refreshTokenUrl, {\n method: 'POST',\n mode: 'cors',\n credentials: 'include',\n redirect: 'error',\n headers\n });\n\n if (!response.ok) {\n this.tokens.clear();\n return false;\n }\n\n const data = await response.json();\n if (!data || data.status !== 'ok') {\n return false;\n }\n\n const newAccessToken = data.data?.access_token || data.access_token;\n if (!newAccessToken) {\n return false;\n }\n\n this.tokens.setAccessToken(newAccessToken);\n return true;\n } catch {\n this.tokens.clear();\n return false;\n }\n }\n\n private async refreshAccessTokenBodyMode(): Promise<boolean> {\n try {\n const refreshToken = this.tokens.getRefreshToken();\n if (!refreshToken) {\n return false;\n }\n\n const accessToken = this.tokens.getAccessToken();\n const refreshTokenUrl = this.apiHost + this.authConfig.refreshEndpoint!.replace(/^\\/+/, '');\n\n const response = await fetch(refreshTokenUrl, {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n access_token: accessToken,\n refresh_token: refreshToken\n })\n });\n\n if (!response.ok) {\n this.tokens.clear();\n return false;\n }\n\n const data = await response.json();\n if (!data) {\n return false;\n }\n\n const newAccessToken = data.data?.access_token || data.access_token;\n if (!newAccessToken) {\n return false;\n }\n\n this.tokens.setTokens(newAccessToken, refreshToken);\n return true;\n } catch {\n this.tokens.clear();\n return false;\n }\n }\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { BuiltInProvider } from './auth.service';\nimport { MyEnvironmentModel, OAuthProviderConfig } from './my-environment.model';\n\n/**\n * Default configurations for built-in OAuth providers.\n * These serve as fallback values when no custom configuration is registered.\n */\nconst BUILT_IN_PROVIDERS: Record<BuiltInProvider, OAuthProviderConfig> = {\n google: {\n label: 'Google',\n cssClass: 'btn-google',\n buttonStyle: { borderColor: '#4285f4' }\n },\n linkedin: {\n label: 'LinkedIn',\n cssClass: 'btn-linkedin',\n buttonStyle: { borderColor: '#0077b5' }\n },\n apple: {\n label: 'Apple',\n cssClass: 'btn-apple',\n buttonStyle: { borderColor: '#000' }\n },\n microsoft: {\n label: 'Microsoft',\n cssClass: 'btn-microsoft',\n buttonStyle: { borderColor: '#00a4ef' }\n },\n github: {\n label: 'GitHub',\n cssClass: 'btn-github',\n buttonStyle: { borderColor: '#333' }\n },\n zoho: {\n label: 'Zoho',\n icon: '🔶',\n cssClass: 'btn-zoho',\n buttonStyle: {\n borderColor: '#d63b32',\n backgroundColor: '#f0483e',\n color: '#ffffff'\n }\n },\n emailPassword: {\n label: 'Email',\n cssClass: 'btn-email'\n }\n};\n\n/**\n * Service for managing OAuth provider configurations.\n *\n * Provides a central registry for both built-in and custom OAuth providers.\n * Custom providers can be registered either through the environment configuration\n * (customProviders field) or programmatically via registerProvider/registerProviders.\n *\n * Custom registrations take precedence over built-in defaults.\n * Unknown providers receive an auto-generated fallback configuration.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ProviderRegistryService {\n private customProviders = new Map<string, OAuthProviderConfig>();\n\n constructor(\n @Inject(MyEnvironmentModel) private environment: MyEnvironmentModel\n ) {\n // Seed from environment customProviders if present\n if (this.environment.customProviders) {\n for (const [id, config] of Object.entries(this.environment.customProviders)) {\n this.customProviders.set(id, config);\n }\n }\n }\n\n /**\n * Register a custom OAuth provider configuration.\n * If a provider with the same id already exists, it will be overwritten.\n * @param id - Provider identifier (e.g., 'okta', 'auth0')\n * @param config - Provider display configuration\n */\n registerProvider(id: string, config: OAuthProviderConfig): void {\n this.customProviders.set(id, config);\n }\n\n /**\n * Register multiple custom OAuth provider configurations at once.\n * @param providers - Record of provider id to configuration\n */\n registerProviders(providers: Record<string, OAuthProviderConfig>): void {\n for (const [id, config] of Object.entries(providers)) {\n this.customProviders.set(id, config);\n }\n }\n\n /**\n * Get the full configuration for a provider.\n * Resolution order: custom registration > built-in default > auto-generated fallback.\n * @param provider - Provider identifier\n */\n getProviderConfig(provider: string): OAuthProviderConfig {\n // 1. Check custom registrations first\n const custom = this.customProviders.get(provider);\n if (custom) {\n return custom;\n }\n\n // 2. Check built-in providers\n const builtIn = BUILT_IN_PROVIDERS[provider as BuiltInProvider];\n if (builtIn) {\n return builtIn;\n }\n\n // 3. Auto-generated fallback for unknown providers\n const displayName = provider.charAt(0).toUpperCase() + provider.slice(1);\n return {\n label: displayName,\n cssClass: `btn-${provider}`\n };\n }\n\n /**\n * Get the display label for a provider, formatted for sign-in context.\n * @param provider - Provider identifier\n * @returns Label like \"Sign in with Google\"\n */\n getLabel(provider: string): string {\n const config = this.getProviderConfig(provider);\n if (provider === 'emailPassword') {\n return `Sign in with ${config.label}`;\n }\n return `Sign in with ${config.label}`;\n }\n\n /**\n * Get the display label for a provider, formatted for sign-up context.\n * @param provider - Provider identifier\n * @returns Label like \"Sign up with Google\"\n */\n getSignupLabel(provider: string): string {\n const config = this.getProviderConfig(provider);\n return `Sign up with ${config.label}`;\n }\n\n /**\n * Get the icon for a provider, if configured.\n * @param provider - Provider identifier\n * @returns Icon string or undefined\n */\n getIcon(provider: string): string | undefined {\n const config = this.getProviderConfig(provider);\n return config.icon;\n }\n\n /**\n * Get the CSS class for a provider button.\n * @param provider - Provider identifier\n * @returns CSS class string (e.g., \"btn-google\")\n */\n getCssClass(provider: string): string {\n const config = this.getProviderConfig(provider);\n return config.cssClass || `btn-${provider}`;\n }\n\n /**\n * Get inline button styles for a provider, if configured.\n * @param provider - Provider identifier\n * @returns Style object for ngStyle binding, or null if no custom styles\n */\n getButtonStyle(provider: string): Record<string, string> | null {\n const config = this.getProviderConfig(provider);\n if (!config.buttonStyle) {\n return null;\n }\n\n const styles: Record<string, string> = {};\n if (config.buttonStyle.borderColor) {\n styles['border-color'] = config.buttonStyle.borderColor;\n }\n if (config.buttonStyle.backgroundColor) {\n styles['background-color'] = config.buttonStyle.backgroundColor;\n }\n if (config.buttonStyle.color) {\n styles['color'] = config.buttonStyle.color;\n }\n return Object.keys(styles).length > 0 ? styles : null;\n }\n}\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { AuthService, AuthProvider, AuthResult } from '../../auth.service';\nimport { ProviderRegistryService } from '../../provider-registry.service';\nimport { TenantMembership } from '../../auth.plugin';\n\nexport type { TenantMembership };\n\nexport interface TenantSelectedEvent {\n tenantId: string;\n tenantSlug: string;\n role: string;\n}\n\nexport interface OnboardingNeededEvent {\n auth_method: string;\n oauth_provider?: string;\n is_new_identity: boolean;\n identity: {\n email: string;\n display_name?: string;\n picture?: string;\n };\n}\n\n@Component({\n selector: 'lib-tenant-login',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"tenant-login-dialog\">\n @if (!showingTenantSelector) {\n <!-- Step 1: Authentication -->\n <h2 class=\"login-title\">{{ title }}</h2>\n\n <!-- Email/Password Form (if enabled) -->\n @if (isProviderEnabled('emailPassword') && !useOAuth) {\n <form (ngSubmit)=\"onEmailLogin()\" class=\"email-form\">\n <div class=\"form-group\">\n <input\n [(ngModel)]=\"email\"\n name=\"email\"\n placeholder=\"Email\"\n type=\"email\"\n required\n class=\"form-control\">\n </div>\n <div class=\"form-group password-group\">\n <input\n [(ngModel)]=\"password\"\n name=\"password\"\n placeholder=\"Password\"\n [type]=\"showPassword ? 'text' : 'password'\"\n required\n class=\"form-control password-input\">\n <button\n type=\"button\"\n class=\"password-toggle\"\n (click)=\"showPassword = !showPassword\"\n [attr.aria-label]=\"showPassword ? 'Hide password' : 'Show password'\">\n {{ showPassword ? '👁️' : '👁️‍🗨️' }}\n </button>\n </div>\n <button\n type=\"submit\"\n [disabled]=\"loading\"\n class=\"btn btn-primary btn-block\">\n {{ loading ? 'Signing in...' : 'Sign in with Email' }}\n </button>\n </form>\n\n <!-- Divider -->\n @if (oauthProviders.length > 0) {\n <div class=\"divider\">\n <span>OR</span>\n </div>\n }\n }\n\n <!-- OAuth Providers -->\n @if (oauthProviders.length > 0 && (useOAuth || !isProviderEnabled('emailPassword'))) {\n <div class=\"oauth-buttons\">\n @for (provider of oauthProviders; track provider) {\n <button\n type=\"button\"\n (click)=\"onOAuthLogin(provider)\"\n [disabled]=\"loading\"\n [class]=\"'btn btn-oauth ' + getProviderCssClass(provider)\"\n [ngStyle]=\"getProviderButtonStyle(provider)\">\n @if (getProviderIcon(provider)) {\n <span class=\"oauth-icon\">\n {{ getProviderIcon(provider) }}\n </span>\n }\n {{ getProviderLabel(provider) }}\n </button>\n }\n </div>\n\n <!-- Switch to Email/Password -->\n @if (isProviderEnabled('emailPassword') && oauthProviders.length > 0) {\n <div class=\"switch-method\">\n <a href=\"#\" (click)=\"toggleAuthMethod($event)\">\n {{ useOAuth ? 'Use email/password instead' : 'Use OAuth instead' }}\n </a>\n </div>\n }\n }\n\n <!-- Error Message -->\n @if (error) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n\n <!-- Register Link -->\n @if (allowTenantCreation) {\n <div class=\"register-link\">\n {{ registerLinkText }}\n <a href=\"#\" (click)=\"onCreateTenantClick($event)\">{{ registerLinkAction }}</a>\n </div>\n }\n } @else {\n <!-- Step 2: Tenant Selection -->\n <h2 class=\"login-title\">{{ tenantSelectorTitle }}</h2>\n\n @if (userName) {\n <div class=\"welcome-message\">\n Welcome back, <strong>{{ userName }}</strong>!\n </div>\n }\n\n <p class=\"selector-description\">{{ tenantSelectorDescription }}</p>\n\n <div class=\"tenant-list\">\n @for (membership of memberships; track membership.tenant_id) {\n <div\n class=\"tenant-item\"\n [class.selected]=\"selectedTenantId === membership.tenant_id\"\n (click)=\"selectTenantItem(membership.tenant_id)\">\n <div class=\"tenant-radio\">\n <input\n type=\"radio\"\n [checked]=\"selectedTenantId === membership.tenant_id\"\n [name]=\"'tenant-' + membership.tenant_id\"\n [id]=\"'tenant-' + membership.tenant_id\">\n </div>\n <div class=\"tenant-info\">\n <div class=\"tenant-name\">{{ membership.name }}</div>\n <div class=\"tenant-meta\">\n <span class=\"tenant-role\">{{ formatRole(membership.role) }}</span>\n @if (membership.last_accessed) {\n <span class=\"tenant-separator\">·</span>\n <span class=\"tenant-last-accessed\">\n Last accessed {{ formatLastAccessed(membership.last_accessed) }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n\n <button\n type=\"button\"\n (click)=\"onContinueWithTenant()\"\n [disabled]=\"!selectedTenantId || loading\"\n class=\"btn btn-primary btn-block\">\n {{ loading ? 'Loading...' : continueButtonText }}\n </button>\n\n <!-- Error Message -->\n @if (error) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n\n <!-- Create New Tenant Link -->\n @if (allowTenantCreation) {\n <div class=\"create-tenant-link\">\n {{ createTenantLinkText }}\n <a href=\"#\" (click)=\"onCreateTenantClick($event)\">{{ createTenantLinkAction }}</a>\n </div>\n }\n }\n\n <!-- Loading Overlay -->\n @if (loading) {\n <div class=\"loading-overlay\">\n <div class=\"spinner\"></div>\n </div>\n }\n </div>\n `,\n styles: [`\n .tenant-login-dialog {\n padding: 24px;\n max-width: 450px;\n position: relative;\n }\n\n .login-title {\n margin: 0 0 24px 0;\n font-size: 24px;\n font-weight: 500;\n text-align: center;\n }\n\n .welcome-message {\n margin-bottom: 16px;\n padding: 12px;\n background: #e8f5e9;\n border-radius: 4px;\n text-align: center;\n font-size: 14px;\n color: #2e7d32;\n }\n\n .selector-description {\n margin-bottom: 20px;\n font-size: 14px;\n color: #666;\n text-align: center;\n }\n\n .email-form {\n margin-bottom: 16px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .password-group {\n position: relative;\n }\n\n .form-control {\n width: 100%;\n padding: 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n box-sizing: border-box;\n }\n\n .password-input {\n padding-right: 45px;\n }\n\n .password-toggle {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n cursor: pointer;\n font-size: 18px;\n padding: 8px;\n line-height: 1;\n opacity: 0.6;\n transition: opacity 0.2s;\n }\n\n .password-toggle:hover {\n opacity: 1;\n }\n\n .password-toggle:focus {\n outline: 2px solid #4285f4;\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n .form-control:focus {\n outline: none;\n border-color: #4285f4;\n }\n\n .btn {\n padding: 12px 24px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s;\n }\n\n .btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-block {\n width: 100%;\n }\n\n .btn-primary {\n background-color: #4285f4;\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background-color: #357ae8;\n }\n\n .divider {\n margin: 16px 0;\n text-align: center;\n position: relative;\n }\n\n .divider::before {\n content: '';\n position: absolute;\n top: 50%;\n left: 0;\n right: 0;\n height: 1px;\n background: #ddd;\n }\n\n .divider span {\n background: white;\n padding: 0 12px;\n position: relative;\n color: #666;\n font-size: 12px;\n }\n\n .oauth-buttons {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .btn-oauth {\n width: 100%;\n background: white;\n color: #333;\n border: 1px solid #ddd;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n\n .btn-oauth:hover:not(:disabled) {\n background: #f8f8f8;\n }\n\n .btn-google {\n border-color: #4285f4;\n }\n\n .btn-linkedin {\n border-color: #0077b5;\n }\n\n .btn-apple {\n border-color: #000;\n }\n\n .btn-microsoft {\n border-color: #00a4ef;\n }\n\n .btn-github {\n border-color: #333;\n }\n\n .btn-zoho {\n background-color: #f0483e;\n color: white;\n border: 1px solid #d63b32;\n }\n\n .btn-zoho:hover {\n background-color: #d63b32;\n }\n\n .oauth-icon {\n font-size: 18px;\n }\n\n .switch-method {\n margin-top: 12px;\n text-align: center;\n font-size: 14px;\n }\n\n .switch-method a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .switch-method a:hover {\n text-decoration: underline;\n }\n\n .tenant-list {\n margin-bottom: 20px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .tenant-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n border: 2px solid #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .tenant-item:hover {\n border-color: #4285f4;\n background: #f8f9ff;\n }\n\n .tenant-item.selected {\n border-color: #4285f4;\n background: #e8f0fe;\n }\n\n .tenant-radio {\n flex-shrink: 0;\n padding-top: 2px;\n }\n\n .tenant-radio input[type=\"radio\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n }\n\n .tenant-info {\n flex: 1;\n }\n\n .tenant-name {\n font-size: 16px;\n font-weight: 500;\n color: #333;\n margin-bottom: 4px;\n }\n\n .tenant-meta {\n font-size: 13px;\n color: #666;\n }\n\n .tenant-role {\n font-weight: 500;\n color: #4285f4;\n }\n\n .tenant-separator {\n margin: 0 6px;\n }\n\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fee;\n color: #c33;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #4285f4;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .register-link {\n margin-top: 16px;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n .register-link a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .register-link a:hover {\n text-decoration: underline;\n }\n\n .create-tenant-link {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid #e0e0e0;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n .create-tenant-link a {\n color: #4285f4;\n text-decoration: none;\n font-weight: 500;\n }\n\n .create-tenant-link a:hover {\n text-decoration: underline;\n }\n `]\n})\nexport class TenantLoginComponent implements OnInit {\n // Component Configuration\n @Input() title: string = 'Sign In';\n @Input() providers: AuthProvider[] = ['google'];\n @Input() showTenantSelector: boolean = true;\n @Input() autoSelectSingleTenant: boolean = true;\n @Input() prefillEmail?: string; // Email to prefill (for account linking flow)\n @Input() allowTenantCreation: boolean = true;\n\n // Tenant Selector Labels\n @Input() tenantSelectorTitle: string = 'Select Organization';\n @Input() tenantSelectorDescription: string = 'Choose which organization you want to access:';\n @Input() continueButtonText: string = 'Continue';\n\n // Link Labels\n @Input() registerLinkText: string = \"Don't have an account?\";\n @Input() registerLinkAction: string = 'Sign up';\n @Input() createTenantLinkText: string = \"Don't see your organization?\";\n @Input() createTenantLinkAction: string = 'Create New Organization';\n\n // Outputs\n @Output() tenantSelected = new EventEmitter<TenantSelectedEvent>();\n @Output() needsOnboarding = new EventEmitter<OnboardingNeededEvent>();\n @Output() createTenant = new EventEmitter<void>();\n\n // Form Fields\n email = '';\n password = '';\n\n // State\n error = '';\n loading = false;\n showPassword = false;\n useOAuth = true;\n oauthProviders: AuthProvider[] = [];\n\n // Tenant Selection State\n showingTenantSelector = false;\n memberships: TenantMembership[] = [];\n selectedTenantId: string | null = null;\n userName: string = '';\n\n constructor(\n private auth: AuthService,\n private providerRegistry: ProviderRegistryService\n ) {}\n\n ngOnInit() {\n if (!this.providers || this.providers.length === 0) {\n this.error = 'Configuration Error: No authentication providers specified.';\n throw new Error('TenantLoginComponent requires providers input.');\n }\n\n this.oauthProviders = this.providers.filter(p => p !== 'emailPassword');\n\n // If only emailPassword is available, use it by default\n if (this.oauthProviders.length === 0 && this.isProviderEnabled('emailPassword')) {\n this.useOAuth = false;\n }\n\n // Prefill email if provided (for account linking flow)\n if (this.prefillEmail) {\n this.email = this.prefillEmail;\n this.useOAuth = false; // Switch to email/password form\n }\n }\n\n isProviderEnabled(provider: AuthProvider): boolean {\n return this.providers.includes(provider);\n }\n\n getProviderLabel(provider: AuthProvider): string {\n return this.providerRegistry.getLabel(provider);\n }\n\n getProviderIcon(provider: AuthProvider): string | undefined {\n return this.providerRegistry.getIcon(provider);\n }\n\n getProviderCssClass(provider: AuthProvider): string {\n return this.providerRegistry.getCssClass(provider);\n }\n\n getProviderButtonStyle(provider: AuthProvider): Record<string, string> | null {\n return this.providerRegistry.getButtonStyle(provider);\n }\n\n toggleAuthMethod(event: Event) {\n event.preventDefault();\n this.useOAuth = !this.useOAuth;\n this.error = '';\n }\n\n async onEmailLogin() {\n if (!this.email || !this.password) {\n this.error = 'Please enter email and password';\n return;\n }\n\n this.loading = true;\n this.error = '';\n\n try {\n const result = await this.auth.loginWithEmail(this.email, this.password);\n\n if (!result.success) {\n this.error = result.message || 'Login failed';\n return;\n }\n\n // Authentication successful — pass result so membership can be reused\n await this.handlePostAuthFlow(result);\n } catch (err: any) {\n this.error = err.message || 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n async onOAuthLogin(provider: AuthProvider) {\n this.loading = true;\n this.error = '';\n\n try {\n const result = await this.auth.loginWithProvider(provider);\n\n if (!result.success) {\n this.error = result.message || 'OAuth login failed';\n return;\n }\n\n // New identity — user exists but has no tenant membership\n if (result.isNewIdentity && result.identity) {\n this.needsOnboarding.emit({\n auth_method: result.authMethod || 'oauth',\n oauth_provider: result.oauthProvider,\n is_new_identity: true,\n identity: result.identity,\n });\n return;\n }\n\n // Multi-tenant selection — user has multiple memberships\n if (result.memberships && result.memberships.length > 0) {\n this.memberships = result.memberships;\n this.showingTenantSelector = true;\n return;\n }\n\n // Standard success — pass result so membership can be reused if present\n await this.handlePostAuthFlow(result);\n } catch (err: any) {\n this.error = err.message || 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n async handlePostAuthFlow(loginResult?: AuthResult) {\n if (!this.showTenantSelector) {\n // Tenant selection is disabled, emit event immediately\n this.tenantSelected.emit({\n tenantId: '',\n tenantSlug: '',\n role: ''\n });\n return;\n }\n\n // Resolve memberships — prefer data from login response to avoid extra API call\n this.loading = true;\n\n try {\n let memberships: TenantMembership[];\n\n if (loginResult?.membership) {\n // Login response already included membership — use it directly\n memberships = [loginResult.membership];\n } else {\n // Fall back to fetching memberships from API (with platform_code param)\n const result = await this.auth.getTenantMemberships();\n memberships = result.memberships;\n }\n\n if (!memberships || memberships.length === 0) {\n // User has no tenants, prompt to create one\n this.error = 'You are not a member of any organization. Please create one.';\n if (this.allowTenantCreation) {\n setTimeout(() => this.createTenant.emit(), 2000);\n }\n return;\n }\n\n this.memberships = memberships;\n\n // Get user name if available\n const currentUser = this.auth.getCurrentUser();\n if (currentUser) {\n this.userName = currentUser.display_name || currentUser.email;\n }\n\n // Auto-select if user has only one tenant\n if (this.memberships.length === 1 && this.autoSelectSingleTenant) {\n const m = this.memberships[0];\n // If login already returned a tenant-scoped token (via membership in response),\n // just emit — no need to call select-tenant again.\n if (loginResult?.membership) {\n this.tenantSelected.emit({ tenantId: m.tenant_id, tenantSlug: m.slug, role: m.role });\n return;\n }\n await this.selectAndContinue(m);\n } else {\n // Show tenant selector\n this.showingTenantSelector = true;\n }\n } catch (err: any) {\n this.error = err.message || 'Failed to load organizations';\n } finally {\n this.loading = false;\n }\n }\n\n selectTenantItem(tenantId: string) {\n this.selectedTenantId = tenantId;\n }\n\n async onContinueWithTenant() {\n if (!this.selectedTenantId) {\n this.error = 'Please select an organization';\n return;\n }\n\n const membership = this.memberships.find(m => m.tenant_id === this.selectedTenantId);\n if (!membership) {\n this.error = 'Selected organization not found';\n return;\n }\n\n await this.selectAndContinue(membership);\n }\n\n async selectAndContinue(membership: TenantMembership) {\n this.loading = true;\n this.error = '';\n\n try {\n const result = await this.auth.selectTenant(membership.tenant_id);\n\n if (!result.success) {\n this.error = result.message || 'Failed to select organization';\n return;\n }\n\n // Emit tenant selected event\n this.tenantSelected.emit({\n tenantId: membership.tenant_id,\n tenantSlug: membership.slug,\n role: membership.role\n });\n } catch (err: any) {\n this.error = err.message || 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n formatRole(role: string): string {\n return role.charAt(0).toUpperCase() + role.slice(1);\n }\n\n formatLastAccessed(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'today';\n if (diffDays === 1) return 'yesterday';\n if (diffDays < 7) return `${diffDays} days ago`;\n if (diffDays < 30) return `${Math.floor(diffDays / 7)} weeks ago`;\n return `${Math.floor(diffDays / 30)} months ago`;\n } catch {\n return dateStr;\n }\n }\n\n onCreateTenantClick(event: Event) {\n event.preventDefault();\n this.createTenant.emit();\n }\n}\n","import { Component, Output, EventEmitter, Inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { AuthService } from '../../auth.service';\nimport { MyEnvironmentModel } from '../../my-environment.model';\n\n@Component({\n selector: 'lib-register',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"register-dialog\">\n <h2 class=\"register-title\">Create Account</h2>\n\n <!-- Account Link Prompt -->\n @if (showAccountLinkPrompt) {\n <div class=\"account-link-prompt\">\n <div class=\"prompt-icon\">🔗</div>\n <h3>Account Already Exists</h3>\n <p>\n You already have an account with <strong>{{ existingEmail }}</strong>,\n used on another ProGalaxy E-Labs platform.\n </p>\n <p>\n Would you like to use the same account to access this platform?\n </p>\n <div class=\"prompt-actions\">\n <button type=\"button\" class=\"btn btn-primary btn-block\" (click)=\"linkExistingAccount()\">\n Yes, Use My Existing Account\n </button>\n <button type=\"button\" class=\"btn btn-secondary btn-block\" (click)=\"cancelLinking()\">\n No, Use Different Email\n </button>\n </div>\n </div>\n }\n\n <form *ngIf=\"!showAccountLinkPrompt\" (ngSubmit)=\"onRegister()\" class=\"register-form\">\n <div class=\"form-group\">\n <label for=\"displayName\">Full Name</label>\n <input\n id=\"displayName\"\n [(ngModel)]=\"displayName\"\n name=\"displayName\"\n placeholder=\"Enter your full name\"\n type=\"text\"\n required\n class=\"form-control\">\n </div>\n\n <div class=\"form-group\">\n <label for=\"email\">Email</label>\n <input\n id=\"email\"\n [(ngModel)]=\"email\"\n name=\"email\"\n placeholder=\"Enter your email\"\n type=\"email\"\n required\n class=\"form-control\">\n </div>\n\n <div class=\"form-group password-group\">\n <label for=\"password\">Password</label>\n <input\n id=\"password\"\n [(ngModel)]=\"password\"\n name=\"password\"\n placeholder=\"Create a password\"\n [type]=\"showPassword ? 'text' : 'password'\"\n required\n minlength=\"8\"\n class=\"form-control password-input\">\n <button\n type=\"button\"\n class=\"password-toggle\"\n (click)=\"showPassword = !showPassword\"\n [attr.aria-label]=\"showPassword ? 'Hide password' : 'Show password'\">\n {{ showPassword ? '👁️' : '👁️‍🗨️' }}\n </button>\n <small class=\"form-hint\">At least 8 characters</small>\n </div>\n\n <div class=\"form-group password-group\">\n <label for=\"confirmPassword\">Confirm Password</label>\n <input\n id=\"confirmPassword\"\n [(ngModel)]=\"confirmPassword\"\n name=\"confirmPassword\"\n placeholder=\"Confirm your password\"\n [type]=\"showConfirmPassword ? 'text' : 'password'\"\n required\n class=\"form-control password-input\">\n <button\n type=\"button\"\n class=\"password-toggle\"\n (click)=\"showConfirmPassword = !showConfirmPassword\"\n [attr.aria-label]=\"showConfirmPassword ? 'Hide password' : 'Show password'\">\n {{ showConfirmPassword ? '👁️' : '👁️‍🗨️' }}\n </button>\n </div>\n\n <button\n type=\"submit\"\n [disabled]=\"loading\"\n class=\"btn btn-primary btn-block\">\n {{ loading ? 'Creating account...' : 'Sign Up' }}\n </button>\n </form>\n\n <!-- Error Message -->\n @if (error && !showAccountLinkPrompt) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n\n <!-- Success Message -->\n @if (success) {\n <div class=\"success-message\">\n {{ success }}\n </div>\n }\n\n <!-- Loading State -->\n @if (loading) {\n <div class=\"loading-overlay\">\n <div class=\"spinner\"></div>\n </div>\n }\n\n <!-- Login Link -->\n <div *ngIf=\"!showAccountLinkPrompt\" class=\"login-link\">\n Already have an account?\n <a href=\"#\" (click)=\"onLoginClick($event)\">Sign in</a>\n </div>\n </div>\n `,\n styles: [`\n .register-dialog {\n padding: 24px;\n max-width: 400px;\n position: relative;\n }\n\n .register-title {\n margin: 0 0 24px 0;\n font-size: 24px;\n font-weight: 500;\n text-align: center;\n }\n\n .register-form {\n margin-bottom: 16px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .password-group {\n position: relative;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #333;\n }\n\n .form-control {\n width: 100%;\n padding: 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n box-sizing: border-box;\n }\n\n .password-input {\n padding-right: 45px;\n }\n\n .password-toggle {\n position: absolute;\n right: 8px;\n top: 38px;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 18px;\n padding: 8px;\n line-height: 1;\n opacity: 0.6;\n transition: opacity 0.2s;\n }\n\n .password-toggle:hover {\n opacity: 1;\n }\n\n .password-toggle:focus {\n outline: 2px solid #4285f4;\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n .form-control:focus {\n outline: none;\n border-color: #4285f4;\n }\n\n .form-hint {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: #666;\n }\n\n .btn {\n padding: 12px 24px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s;\n }\n\n .btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-block {\n width: 100%;\n }\n\n .btn-primary {\n background-color: #4285f4;\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background-color: #357ae8;\n }\n\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fee;\n color: #c33;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .success-message {\n margin-top: 16px;\n padding: 12px;\n background: #efe;\n color: #3a3;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #4285f4;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .login-link {\n margin-top: 16px;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n .login-link a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .login-link a:hover {\n text-decoration: underline;\n }\n\n .account-link-prompt {\n background: #f8f9fa;\n border: 2px solid #4285f4;\n border-radius: 8px;\n padding: 24px;\n margin-bottom: 16px;\n text-align: center;\n }\n\n .prompt-icon {\n font-size: 48px;\n margin-bottom: 12px;\n }\n\n .account-link-prompt h3 {\n margin: 0 0 12px 0;\n color: #333;\n font-size: 20px;\n font-weight: 500;\n }\n\n .account-link-prompt p {\n margin: 8px 0;\n color: #555;\n font-size: 14px;\n line-height: 1.6;\n }\n\n .prompt-actions {\n margin-top: 20px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .btn-secondary {\n background: white;\n color: #333;\n border: 1px solid #ddd;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: #f8f9fa;\n border-color: #ccc;\n }\n `]\n})\nexport class RegisterComponent {\n @Output() navigateToLogin = new EventEmitter<string>();\n\n displayName = '';\n email = '';\n password = '';\n confirmPassword = '';\n error = '';\n success = '';\n loading = false;\n showAccountLinkPrompt = false;\n existingEmail = '';\n showPassword = false;\n showConfirmPassword = false;\n\n constructor(\n private auth: AuthService,\n @Inject(MyEnvironmentModel) private environment: MyEnvironmentModel\n ) {}\n\n async onRegister() {\n // Reset messages\n this.error = '';\n this.success = '';\n\n // Validate fields\n if (!this.displayName || !this.email || !this.password || !this.confirmPassword) {\n this.error = 'Please fill in all fields';\n return;\n }\n\n if (this.password.length < 8) {\n this.error = 'Password must be at least 8 characters';\n return;\n }\n\n if (this.password !== this.confirmPassword) {\n this.error = 'Passwords do not match';\n return;\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(this.email)) {\n this.error = 'Please enter a valid email address';\n return;\n }\n\n this.loading = true;\n\n try {\n // Direct API call to check for email already registered\n const response = await fetch(`${this.environment.accountsUrl}/api/auth/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n email: this.email,\n password: this.password,\n display_name: this.displayName,\n platform: this.environment.platformCode\n })\n });\n\n const data = await response.json();\n\n if (response.ok && data.identity_id) {\n // Registration successful - now login\n const loginResult = await this.auth.loginWithEmail(this.email, this.password);\n\n if (loginResult.success) {\n this.success = 'Account created successfully!';\n } else {\n this.success = 'Account created! Please sign in.';\n }\n } else {\n // Check if email already registered\n if (data.error === 'Email already registered' || data.details?.includes('Email already registered')) {\n this.existingEmail = this.email;\n this.showAccountLinkPrompt = true;\n this.error = '';\n } else {\n // Other errors\n this.error = data.error || data.details || 'Registration failed';\n }\n }\n } catch (err) {\n this.error = 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n onLoginClick(event: Event) {\n event.preventDefault();\n this.navigateToLogin.emit('');\n }\n\n linkExistingAccount() {\n // User confirmed they want to link their existing account\n this.navigateToLogin.emit(this.existingEmail);\n }\n\n cancelLinking() {\n // User decided not to link - reset form\n this.showAccountLinkPrompt = false;\n this.existingEmail = '';\n this.email = '';\n this.password = '';\n this.confirmPassword = '';\n this.displayName = '';\n }\n}\n","import { Component, OnInit, Output, EventEmitter, Inject, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TenantLoginComponent, TenantSelectedEvent } from './tenant-login.component';\nimport { RegisterComponent } from './register.component';\nimport { MyEnvironmentModel } from '../../my-environment.model';\nimport { AuthProvider } from '../../auth.service';\n\n@Component({\n selector: 'lib-auth-page',\n standalone: true,\n imports: [CommonModule, TenantLoginComponent, RegisterComponent],\n template: `\n <div class=\"auth-container\" [style.background]=\"gradientStyle\">\n <div class=\"auth-card\">\n @if (logo) {\n <img [src]=\"logo\" [alt]=\"appName + ' logo'\" class=\"logo\">\n }\n <h1 class=\"app-name\">{{ appName }}</h1>\n @if (subtitle) {\n <p class=\"subtitle\">{{ subtitle }}</p>\n }\n\n @if (mode === 'login') {\n <lib-tenant-login\n [providers]=\"providers\"\n [allowTenantCreation]=\"false\"\n (tenantSelected)=\"onAuthenticated($event)\"\n (createTenant)=\"mode = 'register'\">\n </lib-tenant-login>\n } @else {\n <lib-register\n (navigateToLogin)=\"mode = 'login'\">\n </lib-register>\n }\n </div>\n </div>\n `,\n styles: [`\n .auth-container {\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n }\n\n .auth-card {\n background: white;\n border-radius: 12px;\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);\n padding: 40px;\n width: 100%;\n max-width: 480px;\n }\n\n .logo {\n display: block;\n max-width: 200px;\n max-height: 80px;\n margin: 0 auto 24px;\n }\n\n .app-name {\n margin: 0 0 12px 0;\n font-size: 28px;\n font-weight: 600;\n text-align: center;\n color: #1a202c;\n }\n\n .subtitle {\n margin: 0 0 32px 0;\n font-size: 16px;\n text-align: center;\n color: #718096;\n }\n\n :host ::ng-deep .tenant-login-dialog,\n :host ::ng-deep .register-dialog {\n padding: 0;\n max-width: none;\n }\n\n :host ::ng-deep .login-title,\n :host ::ng-deep .register-title {\n display: none;\n }\n `]\n})\nexport class AuthPageComponent implements OnInit {\n @Input() providers: AuthProvider[] = ['google', 'emailPassword'];\n @Output() authenticated = new EventEmitter<TenantSelectedEvent>();\n\n mode: 'login' | 'register' = 'login';\n\n appName: string = '';\n logo?: string;\n subtitle?: string;\n gradientStyle: string = 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)';\n\n constructor(@Inject(MyEnvironmentModel) private environment: MyEnvironmentModel) {}\n\n ngOnInit() {\n const branding = this.environment.branding;\n\n if (branding) {\n this.appName = branding.appName || 'Sign In';\n this.logo = branding.logo;\n this.subtitle = branding.subtitle;\n\n if (branding.gradientStart && branding.gradientEnd) {\n this.gradientStyle = `linear-gradient(135deg, ${branding.gradientStart} 0%, ${branding.gradientEnd} 100%)`;\n } else if (branding.primaryColor) {\n const color = branding.primaryColor;\n this.gradientStyle = `linear-gradient(135deg, ${color} 0%, ${this.adjustColor(color, -20)} 100%)`;\n }\n } else {\n this.appName = 'Sign In';\n }\n }\n\n onAuthenticated(event: TenantSelectedEvent) {\n this.authenticated.emit(event);\n }\n\n /**\n * Adjust color brightness (simple implementation)\n * @param color Hex color (e.g., '#667eea')\n * @param percent Percentage to darken (negative) or lighten (positive)\n */\n private adjustColor(color: string, percent: number): string {\n const num = parseInt(color.replace('#', ''), 16);\n const amt = Math.round(2.55 * percent);\n const R = (num >> 16) + amt;\n const G = (num >> 8 & 0x00FF) + amt;\n const B = (num & 0x0000FF) + amt;\n return '#' + (0x1000000 + (R < 255 ? R < 1 ? 0 : R : 255) * 0x10000 +\n (G < 255 ? G < 1 ? 0 : G : 255) * 0x100 +\n (B < 255 ? B < 1 ? 0 : B : 255))\n .toString(16).slice(1);\n }\n}\n","import { Component, OnInit, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { AuthService, AuthProvider } from '../../auth.service';\nimport { ProviderRegistryService } from '../../provider-registry.service';\n\n@Component({\n selector: 'lib-login-dialog',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"login-dialog\">\n <h2 class=\"login-title\">Sign In</h2>\n\n <!-- Email/Password Form (if enabled) -->\n @if (isProviderEnabled('emailPassword')) {\n <form (ngSubmit)=\"onEmailLogin()\" class=\"email-form\">\n <div class=\"form-group\">\n <input\n [(ngModel)]=\"email\"\n name=\"email\"\n placeholder=\"Email\"\n type=\"email\"\n required\n class=\"form-control\">\n </div>\n <div class=\"form-group password-group\">\n <input\n [(ngModel)]=\"password\"\n name=\"password\"\n placeholder=\"Password\"\n [type]=\"showPassword ? 'text' : 'password'\"\n required\n class=\"form-control password-input\">\n <button\n type=\"button\"\n class=\"password-toggle\"\n (click)=\"showPassword = !showPassword\"\n [attr.aria-label]=\"showPassword ? 'Hide password' : 'Show password'\">\n {{ showPassword ? '👁️' : '👁️‍🗨️' }}\n </button>\n </div>\n <button\n type=\"submit\"\n [disabled]=\"loading\"\n class=\"btn btn-primary btn-block\">\n {{ loading ? 'Signing in...' : getProviderLabel('emailPassword') }}\n </button>\n </form>\n }\n\n <!-- Divider if both email and OAuth are present -->\n @if (isProviderEnabled('emailPassword') && oauthProviders.length > 0) {\n <div class=\"divider\">\n <span>OR</span>\n </div>\n }\n\n <!-- OAuth Providers -->\n @if (oauthProviders.length > 0) {\n <div class=\"oauth-buttons\">\n @for (provider of oauthProviders; track provider) {\n <button\n (click)=\"onOAuthLogin(provider)\"\n [disabled]=\"loading\"\n [class]=\"'btn btn-oauth ' + getProviderCssClass(provider)\"\n [ngStyle]=\"getProviderButtonStyle(provider)\">\n @if (getProviderIcon(provider)) {\n <span class=\"oauth-icon\">\n {{ getProviderIcon(provider) }}\n </span>\n }\n {{ getProviderLabel(provider) }}\n </button>\n }\n </div>\n }\n\n <!-- Error Message -->\n @if (error) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n\n <!-- Loading State -->\n @if (loading) {\n <div class=\"loading-overlay\">\n <div class=\"spinner\"></div>\n </div>\n }\n\n <!-- Register Link -->\n <div class=\"register-link\">\n Don't have an account?\n <a href=\"#\" (click)=\"onRegisterClick($event)\">Sign up</a>\n </div>\n </div>\n `,\n styles: [`\n .login-dialog {\n padding: 24px;\n max-width: 400px;\n position: relative;\n }\n\n .login-title {\n margin: 0 0 24px 0;\n font-size: 24px;\n font-weight: 500;\n text-align: center;\n }\n\n .email-form {\n margin-bottom: 16px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .password-group {\n position: relative;\n }\n\n .form-control {\n width: 100%;\n padding: 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n box-sizing: border-box;\n }\n\n .password-input {\n padding-right: 45px;\n }\n\n .password-toggle {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n cursor: pointer;\n font-size: 18px;\n padding: 8px;\n line-height: 1;\n opacity: 0.6;\n transition: opacity 0.2s;\n }\n\n .password-toggle:hover {\n opacity: 1;\n }\n\n .password-toggle:focus {\n outline: 2px solid #4285f4;\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n .form-control:focus {\n outline: none;\n border-color: #4285f4;\n }\n\n .btn {\n padding: 12px 24px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s;\n }\n\n .btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-block {\n width: 100%;\n }\n\n .btn-primary {\n background-color: #4285f4;\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background-color: #357ae8;\n }\n\n .divider {\n margin: 16px 0;\n text-align: center;\n position: relative;\n }\n\n .divider::before {\n content: '';\n position: absolute;\n top: 50%;\n left: 0;\n right: 0;\n height: 1px;\n background: #ddd;\n }\n\n .divider span {\n background: white;\n padding: 0 12px;\n position: relative;\n color: #666;\n font-size: 12px;\n }\n\n .oauth-buttons {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .btn-oauth {\n width: 100%;\n background: white;\n color: #333;\n border: 1px solid #ddd;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n\n .btn-oauth:hover:not(:disabled) {\n background: #f8f8f8;\n }\n\n .btn-google {\n border-color: #4285f4;\n }\n\n .btn-linkedin {\n border-color: #0077b5;\n }\n\n .btn-apple {\n border-color: #000;\n }\n\n .btn-microsoft {\n border-color: #00a4ef;\n }\n\n .btn-github {\n border-color: #333;\n }\n\n .oauth-icon {\n font-size: 18px;\n }\n\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fee;\n color: #c33;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #4285f4;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .register-link {\n margin-top: 16px;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n .register-link a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .register-link a:hover {\n text-decoration: underline;\n }\n `]\n})\nexport class LoginDialogComponent implements OnInit {\n /**\n * REQUIRED: Which authentication providers to show in this dialog\n * @example ['google', 'linkedin', 'emailPassword']\n */\n @Input() providers: AuthProvider[] = [];\n\n email = '';\n password = '';\n error = '';\n loading = false;\n showPassword = false;\n\n oauthProviders: AuthProvider[] = [];\n\n constructor(\n private auth: AuthService,\n private providerRegistry: ProviderRegistryService\n ) {}\n\n ngOnInit() {\n if (!this.providers || this.providers.length === 0) {\n this.error = 'Configuration Error: No authentication providers specified. Please pass providers to LoginDialogComponent.';\n throw new Error('LoginDialogComponent requires providers input. Example: dialogRef.componentInstance.providers = [\\'google\\', \\'emailPassword\\']');\n }\n\n // Get OAuth providers (excluding emailPassword)\n this.oauthProviders = this.providers\n .filter(p => p !== 'emailPassword');\n }\n\n isProviderEnabled(provider: AuthProvider): boolean {\n return this.providers.includes(provider);\n }\n\n getProviderLabel(provider: AuthProvider): string {\n return this.providerRegistry.getLabel(provider);\n }\n\n getProviderIcon(provider: AuthProvider): string | undefined {\n return this.providerRegistry.getIcon(provider);\n }\n\n getProviderCssClass(provider: AuthProvider): string {\n return this.providerRegistry.getCssClass(provider);\n }\n\n getProviderButtonStyle(provider: AuthProvider): Record<string, string> | null {\n return this.providerRegistry.getButtonStyle(provider);\n }\n\n async onEmailLogin() {\n if (!this.email || !this.password) {\n this.error = 'Please enter email and password';\n return;\n }\n\n this.loading = true;\n this.error = '';\n\n try {\n const result = await this.auth.loginWithEmail(this.email, this.password);\n if (!result.success) {\n this.error = result.message || 'Login failed';\n }\n // On success, parent component/dialog should close automatically via user$ subscription\n } catch (err) {\n this.error = 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n async onOAuthLogin(provider: AuthProvider) {\n this.loading = true;\n this.error = '';\n\n try {\n const result = await this.auth.loginWithProvider(provider);\n if (!result.success) {\n this.error = result.message || 'OAuth login failed';\n }\n // On success, parent component/dialog should close automatically via user$ subscription\n } catch (err) {\n this.error = 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n onRegisterClick(event: Event) {\n event.preventDefault();\n // Platforms can override this or listen for a custom event\n // For now, just emit a console message\n console.log('Register clicked - platform should handle navigation');\n }\n}\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { AuthService, AuthProvider } from '../../auth.service';\nimport { ProviderRegistryService } from '../../provider-registry.service';\n\nexport interface TenantCreatedEvent {\n user: { id?: string; email: string; display_name: string };\n}\n\nexport interface TenantRegisterRequestEvent {\n tenantName: string;\n tenantSlug: string;\n displayName?: string;\n email?: string;\n password?: string;\n provider: string;\n}\n\n@Component({\n selector: 'lib-tenant-register',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"tenant-register-dialog\">\n <h2 class=\"register-title\">{{ title }}</h2>\n\n <!-- Ownership Warning Message -->\n <div class=\"warning-box\">\n <div class=\"warning-icon\">⚠️</div>\n <div class=\"warning-content\">\n <strong>{{ ownershipTitle }}</strong>\n <p>{{ ownershipMessage }}</p>\n </div>\n </div>\n\n <form (ngSubmit)=\"onRegister()\" class=\"register-form\">\n <!-- Tenant Information Section -->\n <div class=\"section-header\">{{ tenantSectionTitle }}</div>\n\n <div class=\"form-group\">\n <label for=\"tenantName\">{{ tenantNameLabel }} *</label>\n <input\n id=\"tenantName\"\n [(ngModel)]=\"tenantName\"\n name=\"tenantName\"\n [placeholder]=\"tenantNamePlaceholder\"\n type=\"text\"\n required\n (input)=\"onTenantNameChange()\"\n class=\"form-control\">\n </div>\n\n <div class=\"form-group\">\n <label for=\"tenantSlug\">{{ tenantSlugLabel }} *</label>\n <input\n id=\"tenantSlug\"\n [(ngModel)]=\"tenantSlug\"\n name=\"tenantSlug\"\n [placeholder]=\"tenantSlugPlaceholder\"\n type=\"text\"\n required\n pattern=\"[a-z0-9-]+\"\n (blur)=\"checkSlugAvailability()\"\n class=\"form-control\"\n [class.input-error]=\"slugError\"\n [class.input-success]=\"slugAvailable && tenantSlug\">\n @if (tenantSlug && urlPreviewEnabled) {\n <small class=\"form-hint\">\n {{ urlPreviewPrefix }}{{ tenantSlug }}\n @if (checkingSlug) {\n <span class=\"checking\">Checking...</span>\n }\n @if (slugAvailable && !checkingSlug) {\n <span class=\"available\">✓ Available</span>\n }\n @if (slugError) {\n <span class=\"error-text\">{{ slugError }}</span>\n }\n </small>\n }\n </div>\n\n <!-- User Information Section -->\n <div class=\"section-header\">{{ userSectionTitle }}</div>\n\n <!-- OAuth Providers (Primary Option) -->\n @if (oauthProviders.length > 0 && !useEmailPassword) {\n <div class=\"oauth-section\">\n <p class=\"oauth-description\">{{ oauthDescription }}</p>\n <div class=\"oauth-buttons\">\n @for (provider of oauthProviders; track provider) {\n <button\n type=\"button\"\n (click)=\"onOAuthRegister(provider)\"\n [disabled]=\"loading || !isFormValid()\"\n [class]=\"'btn btn-oauth ' + getProviderCssClass(provider)\"\n [ngStyle]=\"getProviderButtonStyle(provider)\">\n @if (getProviderIcon(provider)) {\n <span class=\"oauth-icon\">\n {{ getProviderIcon(provider) }}\n </span>\n }\n {{ getProviderLabel(provider) }}\n </button>\n }\n </div>\n </div>\n\n <!-- Switch to Email/Password -->\n @if (isProviderEnabled('emailPassword')) {\n <div class=\"switch-method\">\n <a href=\"#\" (click)=\"toggleAuthMethod($event)\">\n {{ useEmailPassword ? 'Use OAuth instead' : 'Use email/password instead' }}\n </a>\n </div>\n }\n }\n\n <!-- Email/Password Form (Fallback or Manual Entry) -->\n @if (useEmailPassword || oauthProviders.length === 0) {\n <div class=\"form-group\">\n <label for=\"displayName\">Full Name *</label>\n <input\n id=\"displayName\"\n [(ngModel)]=\"displayName\"\n name=\"displayName\"\n placeholder=\"Enter your full name\"\n type=\"text\"\n required\n class=\"form-control\">\n </div>\n\n <div class=\"form-group\">\n <label for=\"email\">Email *</label>\n <input\n id=\"email\"\n [(ngModel)]=\"email\"\n name=\"email\"\n placeholder=\"Enter your email\"\n type=\"email\"\n required\n class=\"form-control\">\n </div>\n\n <div class=\"form-group password-group\">\n <label for=\"password\">Password *</label>\n <input\n id=\"password\"\n [(ngModel)]=\"password\"\n name=\"password\"\n placeholder=\"Create a password\"\n [type]=\"showPassword ? 'text' : 'password'\"\n required\n minlength=\"8\"\n class=\"form-control password-input\">\n <button\n type=\"button\"\n class=\"password-toggle\"\n (click)=\"showPassword = !showPassword\"\n [attr.aria-label]=\"showPassword ? 'Hide password' : 'Show password'\">\n {{ showPassword ? '👁️' : '👁️‍🗨️' }}\n </button>\n <small class=\"form-hint\">At least 8 characters</small>\n </div>\n\n <div class=\"form-group password-group\">\n <label for=\"confirmPassword\">Confirm Password *</label>\n <input\n id=\"confirmPassword\"\n [(ngModel)]=\"confirmPassword\"\n name=\"confirmPassword\"\n placeholder=\"Confirm your password\"\n [type]=\"showConfirmPassword ? 'text' : 'password'\"\n required\n class=\"form-control password-input\">\n <button\n type=\"button\"\n class=\"password-toggle\"\n (click)=\"showConfirmPassword = !showConfirmPassword\"\n [attr.aria-label]=\"showConfirmPassword ? 'Hide password' : 'Show password'\">\n {{ showConfirmPassword ? '👁️' : '👁️‍🗨️' }}\n </button>\n </div>\n\n <button\n type=\"submit\"\n [disabled]=\"loading || !isFormValid()\"\n class=\"btn btn-primary btn-block\">\n {{ loading ? 'Creating...' : submitButtonText }}\n </button>\n\n <!-- Switch to OAuth -->\n @if (oauthProviders.length > 0) {\n <div class=\"switch-method\">\n <a href=\"#\" (click)=\"toggleAuthMethod($event)\">\n Use OAuth instead\n </a>\n </div>\n }\n }\n </form>\n\n <!-- Error Message -->\n @if (error) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n\n <!-- Success Message -->\n @if (success) {\n <div class=\"success-message\">\n {{ success }}\n </div>\n }\n\n <!-- Loading Overlay -->\n @if (loading) {\n <div class=\"loading-overlay\">\n <div class=\"spinner\"></div>\n <p class=\"loading-text\">{{ loadingText }}</p>\n </div>\n }\n\n <!-- Login Link -->\n <div class=\"login-link\">\n {{ loginLinkText }}\n <a href=\"#\" (click)=\"onLoginClick($event)\">{{ loginLinkAction }}</a>\n </div>\n </div>\n `,\n styles: [`\n .tenant-register-dialog {\n padding: 24px;\n max-width: 500px;\n position: relative;\n }\n\n .register-title {\n margin: 0 0 20px 0;\n font-size: 24px;\n font-weight: 500;\n text-align: center;\n }\n\n .warning-box {\n display: flex;\n gap: 12px;\n padding: 16px;\n background: #fff3cd;\n border: 1px solid #ffc107;\n border-radius: 6px;\n margin-bottom: 24px;\n }\n\n .warning-icon {\n font-size: 24px;\n line-height: 1;\n }\n\n .warning-content {\n flex: 1;\n }\n\n .warning-content strong {\n display: block;\n margin-bottom: 4px;\n color: #856404;\n font-size: 14px;\n }\n\n .warning-content p {\n margin: 0;\n color: #856404;\n font-size: 13px;\n line-height: 1.5;\n }\n\n .section-header {\n font-size: 16px;\n font-weight: 600;\n margin: 20px 0 12px 0;\n padding-bottom: 8px;\n border-bottom: 2px solid #e0e0e0;\n color: #333;\n }\n\n .register-form {\n margin-bottom: 16px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .password-group {\n position: relative;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #333;\n }\n\n .form-control {\n width: 100%;\n padding: 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n box-sizing: border-box;\n transition: border-color 0.2s;\n }\n\n .password-input {\n padding-right: 45px;\n }\n\n .password-toggle {\n position: absolute;\n right: 8px;\n top: 38px;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 18px;\n padding: 8px;\n line-height: 1;\n opacity: 0.6;\n transition: opacity 0.2s;\n }\n\n .password-toggle:hover {\n opacity: 1;\n }\n\n .password-toggle:focus {\n outline: 2px solid #4285f4;\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n .form-control:focus {\n outline: none;\n border-color: #4285f4;\n }\n\n .form-control.input-error {\n border-color: #dc3545;\n }\n\n .form-control.input-success {\n border-color: #28a745;\n }\n\n .form-hint {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: #666;\n }\n\n .form-hint .checking {\n color: #666;\n }\n\n .form-hint .available {\n color: #28a745;\n font-weight: 500;\n }\n\n .form-hint .error-text {\n color: #dc3545;\n }\n\n .oauth-section {\n margin: 16px 0;\n }\n\n .oauth-description {\n margin-bottom: 12px;\n font-size: 14px;\n color: #666;\n text-align: center;\n }\n\n .oauth-buttons {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .btn {\n padding: 12px 24px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s, opacity 0.2s;\n }\n\n .btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-block {\n width: 100%;\n }\n\n .btn-primary {\n background-color: #4285f4;\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background-color: #357ae8;\n }\n\n .btn-oauth {\n width: 100%;\n background: white;\n color: #333;\n border: 1px solid #ddd;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n\n .btn-oauth:hover:not(:disabled) {\n background: #f8f8f8;\n }\n\n .btn-google {\n border-color: #4285f4;\n }\n\n .btn-linkedin {\n border-color: #0077b5;\n }\n\n .btn-apple {\n border-color: #000;\n }\n\n .btn-microsoft {\n border-color: #00a4ef;\n }\n\n .btn-github {\n border-color: #333;\n }\n\n .oauth-icon {\n font-size: 18px;\n }\n\n .switch-method {\n margin-top: 12px;\n text-align: center;\n font-size: 14px;\n }\n\n .switch-method a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .switch-method a:hover {\n text-decoration: underline;\n }\n\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fee;\n color: #c33;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .success-message {\n margin-top: 16px;\n padding: 12px;\n background: #efe;\n color: #3a3;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.95);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n }\n\n .spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #4285f4;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .loading-text {\n margin: 0;\n font-size: 14px;\n color: #666;\n }\n\n .login-link {\n margin-top: 16px;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n .login-link a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .login-link a:hover {\n text-decoration: underline;\n }\n `]\n})\nexport class TenantRegisterComponent implements OnInit {\n // Component Configuration\n @Input() title: string = 'Create New Organization';\n @Input() providers: AuthProvider[] = ['google'];\n @Input() requireTenantName: boolean = true;\n\n // Tenant Labels\n @Input() tenantSectionTitle: string = 'Organization Information';\n @Input() tenantNameLabel: string = 'Organization Name';\n @Input() tenantNamePlaceholder: string = 'Enter your organization name';\n @Input() tenantSlugLabel: string = 'Organization URL';\n @Input() tenantSlugPlaceholder: string = 'organization-name';\n @Input() urlPreviewEnabled: boolean = true;\n @Input() urlPreviewPrefix: string = 'yourapp.com/';\n\n // User Labels\n @Input() userSectionTitle: string = 'Your Information';\n @Input() oauthDescription: string = 'Recommended: Sign up with your Google account';\n\n // Warning Message\n @Input() ownershipTitle: string = 'CREATING A NEW ORGANIZATION';\n @Input() ownershipMessage: string = 'You are registering as an organization owner. This will create a new organization that you will manage. If you are an employee, DO NOT use this form. Ask your organization owner to invite you, then use the Login page.';\n\n // Buttons and Links\n @Input() submitButtonText: string = 'Create Organization';\n @Input() loginLinkText: string = 'Already have an account?';\n @Input() loginLinkAction: string = 'Sign in';\n\n // Outputs\n @Output() tenantCreated = new EventEmitter<TenantCreatedEvent>();\n @Output() registerRequested = new EventEmitter<TenantRegisterRequestEvent>();\n @Output() navigateToLogin = new EventEmitter<void>();\n\n // Form Fields\n tenantName = '';\n tenantSlug = '';\n displayName = '';\n email = '';\n password = '';\n confirmPassword = '';\n\n // State\n error = '';\n success = '';\n loading = false;\n loadingText = 'Creating your organization...';\n checkingSlug = false;\n slugAvailable = false;\n slugError = '';\n useEmailPassword = false;\n oauthProviders: AuthProvider[] = [];\n showPassword = false;\n showConfirmPassword = false;\n\n constructor(\n private auth: AuthService,\n private providerRegistry: ProviderRegistryService\n ) {}\n\n ngOnInit() {\n if (!this.providers || this.providers.length === 0) {\n this.error = 'Configuration Error: No authentication providers specified.';\n throw new Error('TenantRegisterComponent requires providers input.');\n }\n\n this.oauthProviders = this.providers.filter(p => p !== 'emailPassword');\n\n // If only emailPassword is available, show it by default\n if (this.oauthProviders.length === 0 && this.isProviderEnabled('emailPassword')) {\n this.useEmailPassword = true;\n }\n }\n\n isProviderEnabled(provider: AuthProvider): boolean {\n return this.providers.includes(provider);\n }\n\n getProviderLabel(provider: AuthProvider): string {\n return this.providerRegistry.getSignupLabel(provider);\n }\n\n getProviderIcon(provider: AuthProvider): string | undefined {\n return this.providerRegistry.getIcon(provider);\n }\n\n getProviderCssClass(provider: AuthProvider): string {\n return this.providerRegistry.getCssClass(provider);\n }\n\n getProviderButtonStyle(provider: AuthProvider): Record<string, string> | null {\n return this.providerRegistry.getButtonStyle(provider);\n }\n\n onTenantNameChange() {\n // Auto-generate slug from tenant name\n if (this.tenantName) {\n const slug = this.tenantName\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n\n this.tenantSlug = slug;\n this.slugError = '';\n this.slugAvailable = false;\n }\n }\n\n async checkSlugAvailability() {\n if (!this.tenantSlug || this.tenantSlug.length < 3) {\n this.slugError = 'Slug must be at least 3 characters';\n return;\n }\n\n if (!/^[a-z0-9-]+$/.test(this.tenantSlug)) {\n this.slugError = 'Only lowercase letters, numbers, and hyphens allowed';\n return;\n }\n\n this.checkingSlug = true;\n this.slugError = '';\n\n try {\n const result = await this.auth.checkTenantSlugAvailable(this.tenantSlug);\n\n if (result.available) {\n this.slugAvailable = true;\n } else {\n this.slugError = 'This URL is already taken';\n if (result.suggestion) {\n this.slugError += `. Try: ${result.suggestion}`;\n }\n }\n } catch (err) {\n // Slug check failed, but don't block registration\n console.warn('Slug availability check failed:', err);\n } finally {\n this.checkingSlug = false;\n }\n }\n\n toggleAuthMethod(event: Event) {\n event.preventDefault();\n this.useEmailPassword = !this.useEmailPassword;\n this.error = '';\n }\n\n isFormValid(): boolean {\n // Tenant information must be valid\n if (!this.tenantName || !this.tenantSlug) {\n return false;\n }\n\n if (this.slugError) {\n return false;\n }\n\n // If using email/password, check those fields\n if (this.useEmailPassword) {\n if (!this.displayName || !this.email || !this.password || !this.confirmPassword) {\n return false;\n }\n\n if (this.password.length < 8) {\n return false;\n }\n\n if (this.password !== this.confirmPassword) {\n return false;\n }\n }\n\n return true;\n }\n\n onOAuthRegister(provider: AuthProvider) {\n if (!this.isFormValid()) {\n this.error = 'Please complete the organization information';\n return;\n }\n\n this.error = '';\n this.registerRequested.emit({\n tenantName: this.tenantName,\n tenantSlug: this.tenantSlug,\n provider: provider\n });\n }\n\n onRegister() {\n if (!this.isFormValid()) {\n this.error = 'Please fill in all required fields correctly';\n return;\n }\n\n this.error = '';\n this.success = '';\n this.registerRequested.emit({\n tenantName: this.tenantName,\n tenantSlug: this.tenantSlug,\n displayName: this.displayName,\n email: this.email,\n password: this.password,\n provider: 'emailPassword'\n });\n }\n\n /** Call from consuming component after handling registerRequested to show loading state */\n setLoading(loading: boolean, text?: string) {\n this.loading = loading;\n if (text) this.loadingText = text;\n }\n\n /** Call from consuming component to show success/error after handling registerRequested */\n setResult(result: { success: boolean; message?: string; user?: any }) {\n this.loading = false;\n if (result.success && result.user) {\n this.success = 'Organization created successfully!';\n this.tenantCreated.emit({ user: result.user });\n } else if (!result.success) {\n this.error = result.message || 'Registration failed';\n }\n }\n\n onLoginClick(event: Event) {\n event.preventDefault();\n this.navigateToLogin.emit();\n }\n}\n","import { Component, Inject, Optional } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TenantLoginComponent, TenantSelectedEvent } from './tenant-login.component';\nimport { AuthProvider } from '../../auth.service';\n\n/**\n * Dialog wrapper for TenantLoginComponent\n *\n * Usage with Angular Material Dialog:\n * ```typescript\n * const dialogRef = this.dialog.open(TenantLoginDialogComponent, {\n * width: '450px',\n * data: {\n * providers: ['google'],\n * showTenantSelector: true\n * }\n * });\n *\n * dialogRef.afterClosed().subscribe(result => {\n * if (result && result.tenantId) {\n * console.log('Logged in to tenant:', result.tenantSlug);\n * // Redirect to dashboard\n * }\n * });\n * ```\n *\n * Usage with custom dialog service:\n * ```typescript\n * const dialog = this.dialogService.open(TenantLoginDialogComponent, {\n * providers: ['google', 'emailPassword'],\n * autoSelectSingleTenant: true\n * });\n * ```\n */\n@Component({\n selector: 'lib-tenant-login-dialog',\n standalone: true,\n imports: [CommonModule, TenantLoginComponent],\n template: `\n <div class=\"dialog-wrapper\">\n <lib-tenant-login\n [title]=\"data?.title || 'Sign In'\"\n [providers]=\"data?.providers || ['google']\"\n [showTenantSelector]=\"data?.showTenantSelector !== false\"\n [autoSelectSingleTenant]=\"data?.autoSelectSingleTenant !== false\"\n [allowTenantCreation]=\"data?.allowTenantCreation !== false\"\n [tenantSelectorTitle]=\"data?.tenantSelectorTitle || 'Select Organization'\"\n [tenantSelectorDescription]=\"data?.tenantSelectorDescription || 'Choose which organization you want to access:'\"\n [continueButtonText]=\"data?.continueButtonText || 'Continue'\"\n [registerLinkText]=\"data?.registerLinkText || 'Don\\\\'t have an account?'\"\n [registerLinkAction]=\"data?.registerLinkAction || 'Sign up'\"\n [createTenantLinkText]=\"data?.createTenantLinkText || 'Don\\\\'t see your organization?'\"\n [createTenantLinkAction]=\"data?.createTenantLinkAction || 'Create New Organization'\"\n (tenantSelected)=\"onTenantSelected($event)\"\n (createTenant)=\"onCreateTenant()\">\n </lib-tenant-login>\n </div>\n `,\n styles: [`\n .dialog-wrapper {\n padding: 0;\n }\n `]\n})\nexport class TenantLoginDialogComponent {\n data: any;\n dialogRef: any;\n\n constructor(\n @Optional() @Inject('DIALOG_DATA') injectedData?: any,\n @Optional() @Inject('DIALOG_REF') injectedDialogRef?: any\n ) {\n // Support both Angular Material Dialog and custom dialog implementations\n this.data = injectedData || {};\n this.dialogRef = injectedDialogRef;\n }\n\n onTenantSelected(event: TenantSelectedEvent) {\n // Close dialog and return the selected tenant\n if (this.dialogRef && this.dialogRef.close) {\n this.dialogRef.close(event);\n }\n }\n\n onCreateTenant() {\n // Close dialog and signal that user wants to create a tenant\n if (this.dialogRef && this.dialogRef.close) {\n this.dialogRef.close({ action: 'create_tenant' });\n }\n }\n}\n","import { Component, Inject, Optional } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TenantRegisterComponent, TenantCreatedEvent } from './tenant-register.component';\nimport { AuthProvider } from '../../auth.service';\n\n/**\n * Dialog wrapper for TenantRegisterComponent\n *\n * Usage with Angular Material Dialog:\n * ```typescript\n * const dialogRef = this.dialog.open(TenantRegisterDialogComponent, {\n * width: '500px',\n * data: {\n * providers: ['google'],\n * tenantNameLabel: 'Store Name'\n * }\n * });\n *\n * dialogRef.afterClosed().subscribe(result => {\n * if (result && result.tenant) {\n * console.log('Tenant created:', result.tenant);\n * }\n * });\n * ```\n *\n * Usage with custom dialog service:\n * ```typescript\n * const dialog = this.dialogService.open(TenantRegisterDialogComponent, {\n * providers: ['google', 'emailPassword']\n * });\n * ```\n */\n@Component({\n selector: 'lib-tenant-register-dialog',\n standalone: true,\n imports: [CommonModule, TenantRegisterComponent],\n template: `\n <div class=\"dialog-wrapper\">\n <lib-tenant-register\n [title]=\"data?.title || 'Create New Organization'\"\n [providers]=\"data?.providers || ['google']\"\n [requireTenantName]=\"data?.requireTenantName !== false\"\n [tenantSectionTitle]=\"data?.tenantSectionTitle || 'Organization Information'\"\n [tenantNameLabel]=\"data?.tenantNameLabel || 'Organization Name'\"\n [tenantNamePlaceholder]=\"data?.tenantNamePlaceholder || 'Enter your organization name'\"\n [tenantSlugLabel]=\"data?.tenantSlugLabel || 'Organization URL'\"\n [tenantSlugPlaceholder]=\"data?.tenantSlugPlaceholder || 'organization-name'\"\n [urlPreviewEnabled]=\"data?.urlPreviewEnabled !== false\"\n [urlPreviewPrefix]=\"data?.urlPreviewPrefix || 'app.example.com/'\"\n [userSectionTitle]=\"data?.userSectionTitle || 'Your Information'\"\n [oauthDescription]=\"data?.oauthDescription || 'Recommended: Sign up with your Google account'\"\n [ownershipTitle]=\"data?.ownershipTitle || 'CREATING A NEW ORGANIZATION'\"\n [ownershipMessage]=\"data?.ownershipMessage || 'You are registering as an organization owner. If you are an employee, use Login instead.'\"\n [submitButtonText]=\"data?.submitButtonText || 'Create Organization'\"\n [loginLinkText]=\"data?.loginLinkText || 'Already have an account?'\"\n [loginLinkAction]=\"data?.loginLinkAction || 'Sign in'\"\n (tenantCreated)=\"onTenantCreated($event)\"\n (navigateToLogin)=\"onNavigateToLogin()\">\n </lib-tenant-register>\n </div>\n `,\n styles: [`\n .dialog-wrapper {\n padding: 0;\n }\n `]\n})\nexport class TenantRegisterDialogComponent {\n data: any;\n dialogRef: any;\n\n constructor(\n @Optional() @Inject('DIALOG_DATA') injectedData?: any,\n @Optional() @Inject('DIALOG_REF') injectedDialogRef?: any\n ) {\n // Support both Angular Material Dialog and custom dialog implementations\n this.data = injectedData || {};\n this.dialogRef = injectedDialogRef;\n }\n\n onTenantCreated(event: TenantCreatedEvent) {\n // Close dialog and return the created tenant\n if (this.dialogRef && this.dialogRef.close) {\n this.dialogRef.close(event);\n }\n }\n\n onNavigateToLogin() {\n // Close dialog without result (user wants to login instead)\n if (this.dialogRef && this.dialogRef.close) {\n this.dialogRef.close({ action: 'navigate_to_login' });\n }\n }\n}\n","/*\n * Public API Surface of ngx-stonescriptphp-client\n */\n\n// ── Core setup ────────────────────────────────────────────────────────────────\nexport * from './provide'; // provideNgxStoneScriptPhpClient()\nexport * from './auth.plugin'; // AuthPlugin, AUTH_PLUGIN, AuthResult, User, ...\n\n// ── Auth plugins ─────────────────────────────────────────────────────────────\nexport * from './plugins/stonescriptphp-auth.plugin'; // StoneScriptPHPAuth, StoneScriptPHPAuthConfig\nexport * from './plugins/progalaxyelabs-auth.plugin'; // ProgalaxyElabsAuth, ProgalaxyElabsAuthConfig\n\n// ── Services ──────────────────────────────────────────────────────────────────\nexport * from './api-connection.service';\nexport * from './auth.service';\nexport * from './db.service';\nexport * from './signin-status.service';\nexport * from './token.service';\nexport * from './csrf.service';\nexport * from './files.service';\nexport * from './provider-registry.service';\n\n// ── Models ────────────────────────────────────────────────────────────────────\nexport * from './api-response.model';\nexport * from './my-environment.model';\nexport * from './files.model';\n\n// ── UI Components - Embeddable (standalone components) ────────────────────────\nexport * from './lib/components/auth-page.component';\nexport * from './lib/components/login-dialog.component';\nexport * from './lib/components/register.component';\nexport * from './lib/components/tenant-login.component';\nexport * from './lib/components/tenant-register.component';\n\n// ── UI Components - Dialog/Modal wrappers ─────────────────────────────────────\nexport * from './lib/components/tenant-login-dialog.component';\nexport * from './lib/components/tenant-register-dialog.component';\n\n// ── Re-export types for convenience ──────────────────────────────────────────\nexport type { OAuthProviderConfig } from './my-environment.model';\nexport { VerifyStatus } from './signin-status.service';\n\n// ── Multi-tenant types ────────────────────────────────────────────────────────\nexport type { TenantSelectedEvent, OnboardingNeededEvent } from './lib/components/tenant-login.component';\nexport type { TenantCreatedEvent, TenantRegisterRequestEvent } from './lib/components/tenant-register.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.TokenService","i2.SigninStatusService","i3.MyEnvironmentModel","i4.AuthService","i4.CsrfService","i1.AuthService","i2.ProviderRegistryService","i3"],"mappings":"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"}
1
+ {"version":3,"file":"progalaxyelabs-ngx-stonescriptphp-client.mjs","sources":["../../src/my-environment.model.ts","../../src/auth.plugin.ts","../../src/plugins/stonescriptphp-auth.plugin.ts","../../src/provide.ts","../../src/plugins/progalaxyelabs-auth.plugin.ts","../../src/api-response.model.ts","../../src/token.service.ts","../../src/signin-status.service.ts","../../src/auth.service.ts","../../src/api-connection.service.ts","../../src/db.service.ts","../../src/csrf.service.ts","../../src/files.service.ts","../../src/provider-registry.service.ts","../../src/lib/components/tenant-login.component.ts","../../src/lib/components/register.component.ts","../../src/lib/components/auth-page.component.ts","../../src/lib/components/login-dialog.component.ts","../../src/lib/components/tenant-register.component.ts","../../src/lib/components/tenant-login-dialog.component.ts","../../src/lib/components/tenant-register-dialog.component.ts","../../src/index.ts","../../src/progalaxyelabs-ngx-stonescriptphp-client.ts"],"sourcesContent":["export type AuthMode = 'cookie' | 'body' | 'none';\n\nexport interface AuthConfig {\n /**\n * Authentication mode:\n * - 'cookie': Use httpOnly cookies + CSRF tokens (recommended, matches StoneScriptPHP v2.1.x)\n * - 'body': Send tokens in request body (legacy mode)\n * - 'none': No automatic token refresh\n */\n mode: AuthMode;\n\n /**\n * Auth server host for token refresh and all auth operations.\n * Use this when auth is on a different server than the API.\n * Replaces the deprecated accountsUrl and accountsServer fields.\n * @example 'https://accounts.progalaxyelabs.com'\n */\n host?: string;\n\n /**\n * Token refresh endpoint path.\n * @default '/auth/refresh' for cookie mode, '/user/refresh_access' for body mode\n */\n refreshEndpoint?: string;\n\n /**\n * Enable CSRF token support (required for cookie mode).\n * @default true for cookie mode, false for body mode\n */\n useCsrf?: boolean;\n\n /**\n * Cookie name for refresh token.\n * @default 'refresh_token'\n */\n refreshTokenCookieName?: string;\n\n /**\n * Cookie name for CSRF token.\n * @default 'csrf_token'\n */\n csrfTokenCookieName?: string;\n\n /**\n * CSRF header name.\n * @default 'X-CSRF-Token'\n */\n csrfHeaderName?: string;\n\n /**\n * Response field mapping for external auth compatibility.\n * Defaults to StoneScriptPHP format: { status:'ok', data:{ access_token, user } }\n * Replaces the deprecated top-level authResponseMap field.\n */\n responseMap?: Partial<AuthResponseMap>;\n}\n\n/**\n * Authentication server configuration (for multi-server mode via StoneScriptPHPAuth).\n */\nexport interface AuthServerConfig {\n /** Server URL (e.g., 'https://accounts.progalaxyelabs.com') */\n url: string;\n /** JWKS endpoint for token validation (optional, defaults to /api/auth/jwks) */\n jwksEndpoint?: string;\n /** Whether this is the default server */\n default?: boolean;\n}\n\n/**\n * Configuration for a custom OAuth provider.\n */\nexport interface OAuthProviderConfig {\n /** Display label for the provider (e.g., \"Okta\") */\n label: string;\n /** Optional icon character or emoji to display */\n icon?: string;\n /** Optional CSS class to apply to the button (e.g., \"btn-okta\") */\n cssClass?: string;\n /** Optional inline button styles for custom branding */\n buttonStyle?: {\n borderColor?: string;\n backgroundColor?: string;\n color?: string;\n };\n}\n\n/**\n * Maps auth service response fields to expected locations.\n * Paths use dot-notation (e.g., 'data.access_token' for nested fields).\n *\n * StoneScriptPHP format: { status: 'ok', data: { access_token, user, ... } }\n * Raw/external format: { access_token, identity, ... }\n */\nexport interface AuthResponseMap {\n /**\n * Dot-path to check for success (e.g., 'status' for StoneScriptPHP).\n * If omitted, success is determined by presence of accessToken.\n */\n successPath?: string;\n\n /** Value that indicates success at successPath (e.g., 'ok') */\n successValue?: string;\n\n /** Dot-path to the access token (default: 'data.access_token') */\n accessTokenPath: string;\n\n /** Dot-path to the refresh token (default: 'data.refresh_token') */\n refreshTokenPath: string;\n\n /** Dot-path to the user/identity object (default: 'data.user') */\n userPath: string;\n\n /** Dot-path to error message (default: 'message') */\n errorMessagePath?: string;\n}\n\nexport class MyEnvironmentModel {\n production: boolean = true\n\n /**\n * Platform code identifier (e.g., 'progalaxy', 'hr', 'admin').\n * Used for multi-tenant authentication.\n */\n platformCode: string = '';\n\n apiServer: {\n host: string\n } = { host: '' }\n\n /**\n * Files service server configuration.\n * Used by FilesService for file upload/download operations.\n * @example { host: 'https://files.progalaxyelabs.com/api/' }\n */\n filesServer?: {\n host: string\n }\n\n /**\n * Chat service server configuration.\n * Used by Angular portals to establish authenticated WebSocket connections.\n * @example { host: 'wss://chat.progalaxyelabs.com' }\n */\n chatServer?: {\n host: string\n }\n\n /**\n * Authentication configuration.\n * @default { mode: 'cookie', refreshEndpoint: '/auth/refresh', useCsrf: true }\n */\n auth?: AuthConfig = {\n mode: 'cookie',\n refreshEndpoint: '/auth/refresh',\n useCsrf: true,\n refreshTokenCookieName: 'refresh_token',\n csrfTokenCookieName: 'csrf_token',\n csrfHeaderName: 'X-CSRF-Token'\n };\n\n /**\n * Multiple authentication servers configuration (for StoneScriptPHPAuth multi-server mode).\n * @example\n * ```typescript\n * authServers: {\n * customer: { url: 'https://auth.progalaxyelabs.com', default: true },\n * employee: { url: 'https://admin-auth.progalaxyelabs.com' }\n * }\n * ```\n */\n authServers?: Record<string, AuthServerConfig>;\n\n /**\n * Custom OAuth provider configurations.\n * @example\n * ```typescript\n * customProviders: {\n * okta: { label: 'Sign in with Okta', cssClass: 'btn-okta', buttonStyle: { borderColor: '#007dc1' } }\n * }\n * ```\n */\n customProviders?: Record<string, OAuthProviderConfig>;\n\n /**\n * Branding configuration for auth UI components.\n */\n branding?: {\n appName: string;\n logo?: string;\n primaryColor?: string;\n gradientStart?: string;\n gradientEnd?: string;\n subtitle?: string;\n };\n\n // ── Deprecated fields (kept for backward compatibility) ──────────────────\n\n /**\n * @deprecated Use auth.host instead.\n * Auth server URL for centralized authentication.\n */\n accountsUrl: string = '';\n\n /**\n * @deprecated Use auth.host instead.\n * Accounts/Authentication service server configuration.\n */\n accountsServer?: {\n host: string\n }\n\n /**\n * @deprecated Use auth.responseMap instead.\n * Auth response field mapping for external auth compatibility.\n */\n authResponseMap?: AuthResponseMap;\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const AUTH_PLUGIN = new InjectionToken<AuthPlugin>('AUTH_PLUGIN');\n\nexport interface User {\n user_id?: number; // Optional - not present in new auth responses (post-cleanup)\n id?: string; // Optional - not present in new auth responses (post-cleanup)\n email: string;\n display_name: string; // Always provided (fallback to email prefix if missing)\n photo_url?: string;\n is_email_verified: boolean; // Always provided (defaults to false if missing)\n}\n\nexport interface AuthResult {\n success: boolean;\n message?: string;\n user?: User;\n /** Set by the plugin on successful auth — AuthService stores it in TokenService */\n accessToken?: string;\n /** Set by the plugin for body mode — AuthService stores it in TokenService */\n refreshToken?: string;\n needsVerification?: boolean;\n /** Membership returned directly by the login response (avoids extra API call) */\n membership?: TenantMembership;\n /** True when the user is new (has identity but no tenant membership) */\n isNewIdentity?: boolean;\n /** Auth method used (e.g., 'oauth', 'emailPassword') */\n authMethod?: string;\n /** OAuth provider used (e.g., 'google') */\n oauthProvider?: string;\n /** Identity info for new users (used with isNewIdentity) */\n identity?: { email: string; display_name?: string; picture?: string };\n /** Multiple tenant memberships for tenant selection flow */\n memberships?: TenantMembership[];\n}\n\nexport interface TenantMembership {\n tenant_id: string;\n slug: string;\n name: string;\n role: string;\n status: string;\n last_accessed?: string;\n}\n\n/**\n * Auth plugin interface — implement this to support any auth backend.\n *\n * The library ships StoneScriptPHPAuth as the built-in plugin.\n * For external providers (Firebase, progalaxyelabs-auth, Okta, etc.),\n * create a class implementing this interface and provide it via\n * provideNgxStoneScriptPhpClient(environment, new YourAuthPlugin(...))\n *\n * @example Firebase\n * ```typescript\n * // firebase-auth.auth-plugin.ts (in your app)\n * export class FirebaseAuthPlugin implements AuthPlugin {\n * async login(email, password): Promise<AuthResult> {\n * const cred = await signInWithEmailAndPassword(getAuth(), email, password);\n * return { success: true, accessToken: await cred.user.getIdToken() };\n * }\n * async refresh(): Promise<string | null> {\n * const user = getAuth().currentUser;\n * return user ? await user.getIdToken(true) : null;\n * }\n * // ...\n * }\n * ```\n */\nexport interface AuthPlugin {\n // ── Required ──────────────────────────────────────────────────────────────\n\n /**\n * Authenticate with email and password.\n * Return accessToken (and optionally refreshToken for body mode) in result.\n */\n login(email: string, password: string): Promise<AuthResult>;\n\n /**\n * Register a new user account.\n * Return accessToken on success.\n */\n register(email: string, password: string, displayName: string): Promise<AuthResult>;\n\n /**\n * Sign out the current user.\n * @param refreshToken - Current refresh token (for body mode revocation)\n */\n logout(refreshToken?: string): Promise<void>;\n\n /**\n * Check for an existing session on app init (e.g., via httpOnly refresh cookie).\n * Return success + accessToken if session is valid.\n */\n checkSession(): Promise<AuthResult>;\n\n /**\n * Refresh the access token.\n * @param accessToken - Current access token (for body mode)\n * @param refreshToken - Current refresh token (for body mode)\n * @returns New access token, or null if refresh failed\n */\n refresh(accessToken: string, refreshToken?: string): Promise<string | null>;\n\n // ── Optional ──────────────────────────────────────────────────────────────\n\n /** OAuth popup login (google, github, linkedin, etc.) */\n loginWithProvider?(provider: string): Promise<AuthResult>;\n\n /** Select a tenant and get a tenant-scoped access token */\n selectTenant?(tenantId: string, accessToken: string): Promise<AuthResult>;\n\n /** List tenant memberships for the authenticated user */\n getTenantMemberships?(accessToken: string): Promise<TenantMembership[]>;\n\n /** Check if a tenant slug is available */\n checkTenantSlugAvailable?(slug: string): Promise<{ available: boolean; suggestion?: string }>;\n\n /** Check onboarding status for a user identity */\n checkOnboardingStatus?(identityId: string, platformCode?: string): Promise<any>;\n\n /** Check if user email exists */\n checkEmail?(email: string): Promise<{ exists: boolean; user?: any }>;\n\n // ── Multi-server (implemented by StoneScriptPHPAuth) ──────────────────────\n\n switchServer?(serverName: string): void;\n getAvailableServers?(): string[];\n getActiveServer?(): string | null;\n getServerConfig?(serverName?: string): any;\n}\n","import { AuthPlugin, AuthResult, TenantMembership, User } from '../auth.plugin';\nimport { AuthResponseMap, AuthConfig, AuthServerConfig } from '../my-environment.model';\n\nexport interface StoneScriptPHPAuthConfig {\n /** Auth server base URL (e.g., 'https://accounts.progalaxyelabs.com') */\n host: string;\n\n /** Platform code for multi-tenant auth (e.g., 'progalaxy', 'hr') */\n platformCode?: string;\n\n /**\n * Named auth servers for multi-server mode.\n * When set, host is used as fallback if no default server is specified.\n */\n authServers?: Record<string, AuthServerConfig>;\n\n /**\n * Response field mapping for external format compatibility.\n * Defaults to StoneScriptPHP format: { status:'ok', data:{ access_token, user } }\n */\n responseMap?: Partial<AuthResponseMap>;\n\n /**\n * Auth mode and CSRF configuration.\n * Defaults: mode='cookie', refreshEndpoint='/auth/refresh', useCsrf=true\n */\n auth?: Pick<AuthConfig, 'mode' | 'refreshEndpoint' | 'useCsrf' | 'csrfTokenCookieName' | 'csrfHeaderName'>;\n\n}\n\nconst ACTIVE_SERVER_KEY = 'progalaxyapi_active_auth_server';\n\nconst DEFAULT_RESPONSE_MAP: Required<AuthResponseMap> = {\n successPath: 'status',\n successValue: 'ok',\n accessTokenPath: 'data.access_token',\n refreshTokenPath: 'data.refresh_token',\n userPath: 'data.user',\n errorMessagePath: 'message'\n};\n\n/**\n * Built-in auth plugin for StoneScriptPHP backends.\n *\n * Handles StoneScriptPHP's auth format ({ status:'ok', data:{ access_token } })\n * with optional authResponseMap overrides for external backends.\n *\n * Supports:\n * - Cookie mode (httpOnly refresh token + CSRF)\n * - Body mode (tokens in localStorage)\n * - Multi-server auth (named authServers config)\n * - OAuth popup login\n * - Multi-tenant operations\n */\nexport class StoneScriptPHPAuth implements AuthPlugin {\n private activeServer: string | null = null;\n\n constructor(private config: StoneScriptPHPAuthConfig) {\n this.restoreActiveServer();\n }\n\n // ── Response mapping ────────────────────────────────────────────────────\n\n private get responseMap(): Required<AuthResponseMap> {\n const m = this.config.responseMap;\n if (!m) return DEFAULT_RESPONSE_MAP;\n return { ...DEFAULT_RESPONSE_MAP, ...m };\n }\n\n private resolvePath(obj: any, path: string): any {\n return path.split('.').reduce((o, key) => o?.[key], obj);\n }\n\n private isAuthSuccess(data: any): boolean {\n const map = this.responseMap;\n if (map.successPath) {\n return this.resolvePath(data, map.successPath) === (map.successValue ?? 'ok');\n }\n return !!this.resolvePath(data, map.accessTokenPath);\n }\n\n private resolveAccessToken(data: any): string | undefined {\n return this.resolvePath(data, this.responseMap.accessTokenPath);\n }\n\n private resolveRefreshToken(data: any): string | undefined {\n return this.resolvePath(data, this.responseMap.refreshTokenPath);\n }\n\n private resolveUser(data: any): User | undefined {\n const raw = this.resolvePath(data, this.responseMap.userPath);\n return raw ? this.normalizeUser(raw) : undefined;\n }\n\n private resolveMembership(data: any): TenantMembership | undefined {\n const raw = this.resolvePath(data, 'data.membership');\n return raw ? raw as TenantMembership : undefined;\n }\n\n private resolveErrorMessage(data: any, fallback: string): string {\n const path = this.responseMap.errorMessagePath ?? 'message';\n return this.resolvePath(data, path) || fallback;\n }\n\n private normalizeUser(raw: any): User {\n const user: User = {\n email: raw.email,\n display_name: raw.display_name ?? raw.email?.split('@')[0] ?? '',\n photo_url: raw.photo_url,\n is_email_verified: raw.is_email_verified ?? false\n };\n // id and user_id are optional after auth response cleanup (task #1552)\n // Only populate them if the raw data contains them\n if (raw.id) {\n user.id = raw.id;\n } else if (raw.user_id) {\n user.id = String(raw.user_id);\n }\n if (raw.user_id) {\n user.user_id = raw.user_id;\n } else if (raw.id) {\n user.user_id = this.hashUUID(raw.id);\n }\n return user;\n }\n\n private hashUUID(uuid: string): number {\n let hash = 0;\n for (let i = 0; i < uuid.length; i++) {\n const char = uuid.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash);\n }\n\n // ── CSRF (inlined, no Angular DI needed) ────────────────────────────────\n\n private getCsrfToken(): string | null {\n const cookieName = this.config.auth?.csrfTokenCookieName ?? 'csrf_token';\n const cookies = document.cookie.split(';');\n for (const cookie of cookies) {\n const [name, value] = cookie.trim().split('=');\n if (name === cookieName) return decodeURIComponent(value);\n }\n return null;\n }\n\n // ── Server resolution ────────────────────────────────────────────────────\n\n private getAccountsUrl(serverName?: string): string {\n if (this.config.authServers && Object.keys(this.config.authServers).length > 0) {\n const target = serverName || this.activeServer || this.getDefaultServer();\n if (!target) throw new Error('No auth server specified and no default server configured');\n const serverConfig = this.config.authServers[target];\n if (!serverConfig) throw new Error(`Auth server '${target}' not found in configuration`);\n return serverConfig.url;\n }\n return this.config.host;\n }\n\n private getDefaultServer(): string | null {\n if (!this.config.authServers) return null;\n for (const [name, cfg] of Object.entries(this.config.authServers)) {\n if (cfg.default) return name;\n }\n return Object.keys(this.config.authServers)[0] || null;\n }\n\n private restoreActiveServer(): void {\n try {\n const saved = localStorage.getItem(ACTIVE_SERVER_KEY);\n this.activeServer = (saved && this.config.authServers?.[saved])\n ? saved\n : this.getDefaultServer();\n } catch {\n this.activeServer = this.getDefaultServer();\n }\n }\n\n // ── Multi-server public API ──────────────────────────────────────────────\n\n switchServer(serverName: string): void {\n if (!this.config.authServers?.[serverName]) {\n throw new Error(`Auth server '${serverName}' not found in configuration`);\n }\n try { localStorage.setItem(ACTIVE_SERVER_KEY, serverName); } catch { /* ignore */ }\n this.activeServer = serverName;\n }\n\n getAvailableServers(): string[] {\n return Object.keys(this.config.authServers ?? {});\n }\n\n getActiveServer(): string | null {\n return this.activeServer;\n }\n\n getServerConfig(serverName?: string): AuthServerConfig | null {\n if (!this.config.authServers) return null;\n const target = serverName || this.activeServer || this.getDefaultServer();\n return target ? (this.config.authServers[target] ?? null) : null;\n }\n\n // ── Core auth operations ─────────────────────────────────────────────────\n\n async login(email: string, password: string): Promise<AuthResult> {\n try {\n const accountsUrl = this.getAccountsUrl();\n const response = await fetch(`${accountsUrl}/api/auth/login`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ email, password, platform: this.config.platformCode })\n });\n const data = await response.json();\n if (this.isAuthSuccess(data)) {\n return {\n success: true,\n accessToken: this.resolveAccessToken(data),\n refreshToken: this.resolveRefreshToken(data),\n user: this.resolveUser(data),\n membership: this.resolveMembership(data)\n };\n }\n return { success: false, message: this.resolveErrorMessage(data, 'Invalid credentials') };\n } catch {\n return { success: false, message: 'Network error. Please try again.' };\n }\n }\n\n async register(email: string, password: string, displayName: string): Promise<AuthResult> {\n try {\n const accountsUrl = this.getAccountsUrl();\n const response = await fetch(`${accountsUrl}/api/auth/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n email,\n password,\n display_name: displayName,\n platform: this.config.platformCode\n })\n });\n const data = await response.json();\n if (this.isAuthSuccess(data)) {\n return {\n success: true,\n accessToken: this.resolveAccessToken(data),\n refreshToken: this.resolveRefreshToken(data),\n user: this.resolveUser(data),\n needsVerification: !!data.needs_verification,\n message: data.needs_verification ? 'Please verify your email' : undefined\n };\n }\n return { success: false, message: this.resolveErrorMessage(data, 'Registration failed') };\n } catch {\n return { success: false, message: 'Network error. Please try again.' };\n }\n }\n\n async logout(refreshToken?: string): Promise<void> {\n try {\n const accountsUrl = this.getAccountsUrl();\n await fetch(`${accountsUrl}/api/auth/logout`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ refresh_token: refreshToken })\n });\n } catch (error) {\n console.error('Logout API call failed:', error);\n }\n }\n\n async checkSession(): Promise<AuthResult> {\n try {\n const accountsUrl = this.getAccountsUrl();\n const response = await fetch(`${accountsUrl}/api/auth/refresh`, {\n method: 'POST',\n credentials: 'include'\n });\n if (!response.ok) return { success: false };\n const data = await response.json();\n const accessToken = this.resolveAccessToken(data);\n if (accessToken) {\n return { success: true, accessToken, user: this.resolveUser(data) };\n }\n return { success: false };\n } catch {\n return { success: false };\n }\n }\n\n async refresh(accessToken: string, refreshToken?: string): Promise<string | null> {\n const mode = this.config.auth?.mode ?? 'cookie';\n if (mode === 'none') return null;\n return mode === 'cookie'\n ? this.refreshCookieMode()\n : this.refreshBodyMode(accessToken, refreshToken);\n }\n\n private async refreshCookieMode(): Promise<string | null> {\n try {\n const authHost = this.getAccountsUrl();\n const endpoint = this.config.auth?.refreshEndpoint ?? '/auth/refresh';\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\n if (this.config.auth?.useCsrf !== false) {\n const csrfToken = this.getCsrfToken();\n if (!csrfToken) {\n console.error('CSRF token not found in cookie');\n return null;\n }\n headers[this.config.auth?.csrfHeaderName ?? 'X-CSRF-Token'] = csrfToken;\n }\n\n const response = await fetch(`${authHost}${endpoint}`, {\n method: 'POST',\n mode: 'cors',\n credentials: 'include',\n redirect: 'error',\n headers\n });\n if (!response.ok) return null;\n\n const data = await response.json();\n if (!this.isAuthSuccess(data)) return null;\n\n return this.resolveAccessToken(data) ?? null;\n } catch (error) {\n console.error('Token refresh failed (cookie mode):', error);\n return null;\n }\n }\n\n private async refreshBodyMode(accessToken: string, refreshToken?: string): Promise<string | null> {\n if (!refreshToken) return null;\n try {\n const authHost = this.getAccountsUrl();\n const endpoint = this.config.auth?.refreshEndpoint ?? '/user/refresh_access';\n const response = await fetch(`${authHost}${endpoint}`, {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ access_token: accessToken, refresh_token: refreshToken })\n });\n if (!response.ok) return null;\n\n const data = await response.json();\n return this.resolveAccessToken(data) ?? null;\n } catch (error) {\n console.error('Token refresh failed (body mode):', error);\n return null;\n }\n }\n\n // ── OAuth ────────────────────────────────────────────────────────────────\n\n async loginWithProvider(provider: string): Promise<AuthResult> {\n return new Promise((resolve) => {\n const width = 500, height = 600;\n const left = (window.screen.width - width) / 2;\n const top = (window.screen.height - height) / 2;\n\n const accountsUrl = this.getAccountsUrl();\n const oauthUrl = `${accountsUrl}/oauth/${provider}?platform=${this.config.platformCode}&mode=popup`;\n\n const popup = window.open(oauthUrl, `${provider}_login`,\n `width=${width},height=${height},left=${left},top=${top}`);\n\n if (!popup) {\n resolve({ success: false, message: 'Popup blocked. Please allow popups for this site.' });\n return;\n }\n\n const cleanup = () => {\n window.removeEventListener('message', messageHandler);\n clearInterval(checkClosed);\n if (popup && !popup.closed) popup.close();\n };\n\n const messageHandler = (event: MessageEvent) => {\n if (event.origin !== new URL(accountsUrl).origin) return;\n\n if (event.data.type === 'oauth_new_identity') {\n cleanup();\n resolve({\n success: true,\n accessToken: event.data.access_token,\n refreshToken: event.data.refresh_token,\n isNewIdentity: true,\n authMethod: event.data.auth_method,\n oauthProvider: event.data.oauth_provider,\n identity: event.data.identity,\n });\n } else if (event.data.type === 'oauth_success') {\n cleanup();\n const rawUser = event.data.user || this.resolveUser(event.data);\n resolve({\n success: true,\n accessToken: event.data.access_token,\n refreshToken: event.data.refresh_token,\n user: rawUser ? this.normalizeUser(rawUser) : undefined,\n membership: event.data.membership,\n });\n } else if (event.data.type === 'oauth_tenant_selection') {\n cleanup();\n resolve({\n success: true,\n accessToken: event.data.selection_token,\n memberships: event.data.memberships,\n });\n } else if (event.data.type === 'oauth_error') {\n cleanup();\n resolve({ success: false, message: event.data.message || 'OAuth login failed' });\n }\n };\n\n window.addEventListener('message', messageHandler);\n\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkClosed);\n window.removeEventListener('message', messageHandler);\n resolve({ success: false, message: 'Login cancelled' });\n }\n }, 500);\n });\n }\n\n // ── Multi-tenant ─────────────────────────────────────────────────────────\n\n async selectTenant(tenantId: string, accessToken: string): Promise<AuthResult> {\n try {\n const accountsUrl = this.getAccountsUrl();\n const response = await fetch(`${accountsUrl}/api/auth/select-tenant`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${accessToken}`,\n 'Content-Type': 'application/json'\n },\n credentials: 'include',\n body: JSON.stringify({ tenant_id: tenantId })\n });\n const data = await response.json();\n if (this.isAuthSuccess(data)) {\n return { success: true, accessToken: this.resolveAccessToken(data) };\n }\n return { success: false, message: this.resolveErrorMessage(data, 'Failed to select tenant') };\n } catch {\n return { success: false, message: 'Network error. Please try again.' };\n }\n }\n\n async getTenantMemberships(accessToken: string): Promise<TenantMembership[]> {\n try {\n const accountsUrl = this.getAccountsUrl();\n const platformCode = encodeURIComponent(this.config.platformCode ?? '');\n const response = await fetch(`${accountsUrl}/api/auth/memberships?platform_code=${platformCode}`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${accessToken}`,\n 'Content-Type': 'application/json'\n },\n credentials: 'include'\n });\n const data = await response.json();\n return data.memberships || [];\n } catch {\n return [];\n }\n }\n\n async checkTenantSlugAvailable(slug: string): Promise<{ available: boolean; suggestion?: string }> {\n try {\n const accountsUrl = this.getAccountsUrl();\n const response = await fetch(`${accountsUrl}/api/auth/check-tenant-slug/${slug}`, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' }\n });\n const data = await response.json();\n return { available: data.available || false, suggestion: data.suggestion };\n } catch {\n return { available: true };\n }\n }\n\n async checkOnboardingStatus(identityId: string, platformCode?: string): Promise<any> {\n const accountsUrl = this.getAccountsUrl();\n const platform = platformCode ?? this.config.platformCode ?? '';\n const response = await fetch(\n `${accountsUrl}/api/auth/onboarding/status?platform_code=${platform}&identity_id=${identityId}`,\n { method: 'GET', headers: { 'Content-Type': 'application/json' }, credentials: 'include' }\n );\n if (!response.ok) throw new Error('Failed to check onboarding status');\n return response.json();\n }\n\n async checkEmail(email: string): Promise<{ exists: boolean; user?: any }> {\n try {\n const accountsUrl = this.getAccountsUrl();\n const response = await fetch(`${accountsUrl}/api/auth/check-email`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email })\n });\n const data = await response.json();\n return { exists: data.exists, user: data.user };\n } catch {\n return { exists: false };\n }\n }\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { MyEnvironmentModel } from './my-environment.model';\nimport { AUTH_PLUGIN, AuthPlugin } from './auth.plugin';\nimport { StoneScriptPHPAuth } from './plugins/stonescriptphp-auth.plugin';\n\n/**\n * Configure the ngx-stonescriptphp-client library.\n *\n * @param environment - Library configuration (API server, auth settings, etc.)\n * @param plugin - Optional auth plugin override. Defaults to StoneScriptPHPAuth.\n * Provide your own plugin to use Firebase, progalaxyelabs-auth, Okta, or any other auth backend.\n *\n * @example Default (StoneScriptPHP backend)\n * ```typescript\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideNgxStoneScriptPhpClient(environment)\n * ]\n * };\n * ```\n *\n * @example External auth plugin\n * ```typescript\n * import { ProgalaxyElabsAuth } from './progalaxyelabs-auth.auth-plugin';\n *\n * providers: [\n * provideNgxStoneScriptPhpClient(environment, new ProgalaxyElabsAuth({ host: '...' }))\n * ]\n * ```\n *\n * @example Firebase\n * ```typescript\n * import { FirebaseAuthPlugin } from './firebase-auth.auth-plugin';\n *\n * providers: [\n * provideNgxStoneScriptPhpClient(environment, new FirebaseAuthPlugin(firebaseConfig))\n * ]\n * ```\n */\nexport function provideNgxStoneScriptPhpClient(\n environment: MyEnvironmentModel,\n plugin?: AuthPlugin\n): EnvironmentProviders {\n const resolvedPlugin = plugin ?? new StoneScriptPHPAuth({\n // Resolve auth host: auth.host → accountsServer.host (compat) → accountsUrl (compat) → apiServer.host\n host: environment.auth?.host\n || environment.accountsServer?.host\n || environment.accountsUrl\n || environment.apiServer.host,\n platformCode: environment.platformCode,\n authServers: environment.authServers,\n responseMap: environment.auth?.responseMap ?? environment.authResponseMap,\n auth: environment.auth\n });\n\n return makeEnvironmentProviders([\n { provide: MyEnvironmentModel, useValue: environment },\n { provide: AUTH_PLUGIN, useValue: resolvedPlugin }\n ]);\n}\n","import { AuthPlugin, AuthResult, TenantMembership, User } from '../auth.plugin';\n\nexport interface ProgalaxyElabsAuthConfig {\n host: string;\n platformCode: string;\n}\n\n/**\n * Auth plugin for progalaxyelabs-auth (Rust/Axum).\n *\n * Speaks the Rust auth server's native format:\n * - Login: { access_token, refresh_token, identity, membership, ... }\n * - Tenant selection: { requires_tenant_selection, selection_token, memberships }\n * - New identity: { access_token, identity, is_new_identity, memberships:[] }\n * - select-tenant: Bearer header + { tenant_id } body\n * - refresh: { access_token, refresh_token } body mode\n */\nexport class ProgalaxyElabsAuth implements AuthPlugin {\n\n constructor(private config: ProgalaxyElabsAuthConfig) {}\n\n private get host(): string {\n return this.config.host;\n }\n\n // -- Login ----------------------------------------------------------------\n\n async login(email: string, password: string): Promise<AuthResult> {\n try {\n const response = await fetch(`${this.host}/api/auth/login`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, password, platform: this.config.platformCode })\n });\n const data = await response.json();\n if (!response.ok) {\n return { success: false, message: data.error || data.message || 'Login failed' };\n }\n return this.handleLoginResponse(data);\n } catch {\n return { success: false, message: 'Network error. Please try again.' };\n }\n }\n\n async register(email: string, password: string, displayName: string): Promise<AuthResult> {\n try {\n const response = await fetch(`${this.host}/api/auth/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n email,\n password,\n display_name: displayName,\n platform: this.config.platformCode\n })\n });\n const data = await response.json();\n if (!response.ok) {\n return { success: false, message: data.error || data.message || 'Registration failed' };\n }\n return this.handleLoginResponse(data);\n } catch {\n return { success: false, message: 'Network error. Please try again.' };\n }\n }\n\n // -- Logout ---------------------------------------------------------------\n\n async logout(refreshToken?: string): Promise<void> {\n try {\n await fetch(`${this.host}/api/auth/logout`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refresh_token: refreshToken })\n });\n } catch { /* ignore */ }\n }\n\n // -- Session & Refresh ----------------------------------------------------\n\n async checkSession(): Promise<AuthResult> {\n return { success: false };\n }\n\n async refresh(accessToken: string, refreshToken?: string): Promise<string | null> {\n if (!refreshToken) return null;\n try {\n const response = await fetch(`${this.host}/api/auth/refresh`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ access_token: accessToken, refresh_token: refreshToken })\n });\n if (!response.ok) return null;\n const data = await response.json();\n\n // Refresh can also return tenant_selection if memberships changed\n if (data.requires_tenant_selection) return null;\n\n return data.access_token ?? null;\n } catch {\n return null;\n }\n }\n\n // -- Tenant operations ----------------------------------------------------\n\n async selectTenant(tenantId: string, selectionToken: string): Promise<AuthResult> {\n try {\n const response = await fetch(`${this.host}/api/auth/select-tenant`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${selectionToken}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ tenant_id: tenantId })\n });\n const data = await response.json();\n if (!response.ok) {\n return { success: false, message: data.error || data.message || 'Tenant selection failed' };\n }\n return {\n success: true,\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n user: this.toUser(data.identity),\n membership: this.toMembership(data.membership),\n };\n } catch {\n return { success: false, message: 'Network error. Please try again.' };\n }\n }\n\n async getTenantMemberships(accessToken: string): Promise<TenantMembership[]> {\n try {\n const platformCode = encodeURIComponent(this.config.platformCode);\n const response = await fetch(`${this.host}/api/auth/memberships?platform_code=${platformCode}`, {\n method: 'GET',\n headers: { 'Authorization': `Bearer ${accessToken}` }\n });\n if (!response.ok) return [];\n const data = await response.json();\n return (data.memberships || []).map((m: any) => this.toMembership(m));\n } catch {\n return [];\n }\n }\n\n async checkTenantSlugAvailable(slug: string): Promise<{ available: boolean; suggestion?: string }> {\n try {\n const response = await fetch(`${this.host}/api/auth/check-tenant-slug/${slug}`);\n const data = await response.json();\n return { available: data.available || false, suggestion: data.suggestion };\n } catch {\n return { available: true };\n }\n }\n\n async checkOnboardingStatus(identityId: string, platformCode?: string): Promise<any> {\n const platform = platformCode ?? this.config.platformCode;\n const response = await fetch(\n `${this.host}/api/auth/onboarding/status?platform_code=${platform}&identity_id=${identityId}`\n );\n if (!response.ok) throw new Error('Failed to check onboarding status');\n return response.json();\n }\n\n async checkEmail(email: string): Promise<{ exists: boolean; user?: any }> {\n try {\n const response = await fetch(`${this.host}/api/auth/check-email`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email })\n });\n const data = await response.json();\n return { exists: data.exists, user: data.user };\n } catch {\n return { exists: false };\n }\n }\n\n // -- OAuth ----------------------------------------------------------------\n\n async loginWithProvider(provider: string): Promise<AuthResult> {\n return new Promise((resolve) => {\n const width = 500, height = 600;\n const left = (window.screen.width - width) / 2;\n const top = (window.screen.height - height) / 2;\n\n const oauthUrl = `${this.host}/oauth/${provider}?platform=${this.config.platformCode}&mode=popup`;\n const popup = window.open(oauthUrl, `${provider}_login`,\n `width=${width},height=${height},left=${left},top=${top}`);\n\n if (!popup) {\n resolve({ success: false, message: 'Popup blocked. Please allow popups for this site.' });\n return;\n }\n\n const cleanup = () => {\n window.removeEventListener('message', messageHandler);\n clearInterval(checkClosed);\n if (popup && !popup.closed) popup.close();\n };\n\n const messageHandler = (event: MessageEvent) => {\n if (event.origin !== new URL(this.host).origin) return;\n cleanup();\n\n if (event.data.type === 'oauth_success') {\n resolve({\n success: true,\n accessToken: event.data.access_token,\n refreshToken: event.data.refresh_token,\n user: this.toUser(event.data.user || event.data.identity),\n membership: event.data.membership ? this.toMembership(event.data.membership) : undefined,\n });\n } else if (event.data.type === 'oauth_tenant_selection') {\n resolve({\n success: true,\n accessToken: event.data.selection_token,\n memberships: (event.data.memberships || []).map((m: any) => this.toMembership(m)),\n });\n } else if (event.data.type === 'oauth_new_identity') {\n resolve({\n success: true,\n accessToken: event.data.access_token,\n refreshToken: event.data.refresh_token,\n isNewIdentity: true,\n authMethod: event.data.auth_method,\n oauthProvider: event.data.oauth_provider,\n identity: event.data.identity,\n });\n } else if (event.data.type === 'oauth_error') {\n resolve({ success: false, message: event.data.message || 'OAuth login failed' });\n }\n };\n\n window.addEventListener('message', messageHandler);\n\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkClosed);\n window.removeEventListener('message', messageHandler);\n resolve({ success: false, message: 'Login cancelled' });\n }\n }, 500);\n });\n }\n\n // -- Internal helpers -----------------------------------------------------\n\n private handleLoginResponse(data: any): AuthResult {\n // New identity — needs onboarding\n if (data.is_new_identity) {\n return {\n success: true,\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n isNewIdentity: true,\n authMethod: data.auth_method,\n oauthProvider: data.oauth_provider,\n user: this.toUser(data.identity),\n };\n }\n\n // Multi-tenant selection required\n if (data.requires_tenant_selection) {\n return {\n success: true,\n accessToken: data.selection_token,\n memberships: (data.memberships || []).map((m: any) => this.toMembership(m)),\n };\n }\n\n // Standard success (single tenant auto-selected or tenant specified)\n return {\n success: true,\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n user: this.toUser(data.identity),\n membership: this.toMembership(data.membership),\n };\n }\n\n private toUser(raw: any): User | undefined {\n if (!raw) return undefined;\n return {\n email: raw.email,\n display_name: raw.display_name ?? raw.email?.split('@')[0] ?? '',\n photo_url: raw.photo_url ?? raw.picture,\n is_email_verified: raw.is_email_verified ?? false\n };\n }\n\n private toMembership(raw: any): TenantMembership {\n return {\n tenant_id: raw.tenant_id,\n slug: raw.tenant_slug ?? raw.slug ?? '',\n name: raw.tenant_name ?? raw.name ?? '',\n role: raw.role ?? '',\n status: raw.status ?? 'active',\n };\n }\n}\n","export class ApiResponse<DataType> {\n public readonly status: string\n public readonly data: DataType | null\n public readonly message: string\n\n get success(): boolean {\n return this.status === 'ok'\n }\n\n get errors(): string[] {\n return this.message ? [this.message] : []\n }\n\n constructor(status: string, data: any = null, message: string = '') {\n this.status = status\n this.data = data || null\n this.message = message\n }\n\n onOk(callback: (data: DataType) => void): ApiResponse<DataType> {\n if (this.status === 'ok') {\n callback(this.data as DataType)\n }\n return this\n }\n\n onNotOk(callback: (message: string, data: DataType) => void): ApiResponse<DataType> {\n if (this.status === 'not ok') {\n callback(this.message, this.data as DataType)\n }\n return this\n }\n\n onError(callback: () => void): ApiResponse<DataType> {\n if (this.status === 'error') {\n callback()\n }\n return this\n }\n\n isSuccess(): boolean {\n return this.status === 'ok'\n }\n\n isError(): boolean {\n return this.status === 'error' || this.status === 'not ok'\n }\n\n getData(): DataType | null {\n return this.data || null\n }\n\n getError(): string {\n return this.message || 'Unknown error'\n }\n\n getStatus(): string {\n return this.status\n }\n\n getMessage(): string {\n return this.message\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TokenService {\n private accessToken = ''\n private refreshToken = ''\n\n private lsAccessTokenKey = 'progalaxyapi_access_token'\n private lsRefreshTokenKey = 'progalaxyapi_refresh_token'\n\n constructor() { }\n\n setTokens(accessToken: string, refreshToken: string) {\n this.accessToken = accessToken\n this.refreshToken = refreshToken\n localStorage.setItem(this.lsAccessTokenKey, accessToken)\n localStorage.setItem(this.lsRefreshTokenKey, refreshToken)\n }\n\n setAccessToken(accessToken: string) {\n this.accessToken = accessToken\n localStorage.setItem(this.lsAccessTokenKey, accessToken)\n }\n\n setRefreshToken(refreshToken: string) {\n this.refreshToken = refreshToken\n localStorage.setItem(this.lsRefreshTokenKey, refreshToken)\n }\n\n getAccessToken() {\n if (this.accessToken) {\n return this.accessToken\n }\n\n const storedAccessToken = localStorage.getItem(this.lsAccessTokenKey)\n if (storedAccessToken) {\n return storedAccessToken\n } else {\n return ''\n }\n }\n\n getRefreshToken() {\n if (this.refreshToken) {\n return this.refreshToken\n }\n\n const storedRefreshToken = localStorage.getItem(this.lsRefreshTokenKey)\n if (storedRefreshToken) {\n return storedRefreshToken\n } else {\n return ''\n }\n }\n\n clear() {\n this.accessToken = ''\n this.refreshToken = ''\n localStorage.removeItem(this.lsAccessTokenKey)\n localStorage.removeItem(this.lsRefreshTokenKey)\n }\n\n /**\n * Check if there is a non-empty access token.\n * Token is treated as opaque — validity is determined by the auth server.\n */\n hasValidAccessToken(): boolean {\n const token = this.getAccessToken()\n return token !== null && token !== ''\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n/**\n * @deprecated Use boolean directly. Kept for backward compatibility.\n */\nexport enum VerifyStatus {\n initialized = 'initialized',\n yes = 'yes',\n no = 'no'\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SigninStatusService {\n public status: BehaviorSubject<boolean | VerifyStatus>\n\n constructor() {\n this.status = new BehaviorSubject<boolean>(false)\n }\n\n signedOut(): void {\n this.status.next(false)\n }\n\n signedIn(): void {\n this.status.next(true)\n }\n\n /**\n * Set signin status\n * @param isSignedIn - True if user is signed in, false otherwise\n */\n setSigninStatus(isSignedIn: boolean): void {\n this.status.next(isSignedIn)\n }\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { TokenService } from './token.service';\nimport { SigninStatusService } from './signin-status.service';\nimport { AUTH_PLUGIN, AuthPlugin, AuthResult, TenantMembership, User } from './auth.plugin';\n\n// Re-export types for backward compatibility\nexport type { AuthResult, TenantMembership, User };\nexport type { AuthPlugin };\n\nexport type BuiltInProvider = 'google' | 'linkedin' | 'apple' | 'microsoft' | 'github' | 'zoho' | 'emailPassword';\n\n/**\n * Authentication provider identifier.\n * Includes all built-in providers plus any custom string identifier.\n * The (string & {}) trick preserves autocomplete for built-in values.\n */\nexport type AuthProvider = BuiltInProvider | (string & {});\n\n/**\n * AuthService — manages auth state and delegates all auth operations to the AuthPlugin.\n *\n * This service holds user state (via BehaviorSubject) and tokens (via TokenService).\n * It does not make any HTTP calls directly — all auth logic lives in the plugin.\n *\n * Provide a plugin via provideNgxStoneScriptPhpClient():\n * - Default: StoneScriptPHPAuth (built-in, matches StoneScriptPHP backend)\n * - External: any class implementing AuthPlugin (Firebase, progalaxyelabs-auth, Okta, etc.)\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthService {\n private readonly USER_STORAGE_KEY = 'progalaxyapi_user';\n\n private userSubject = new BehaviorSubject<User | null>(null);\n public user$: Observable<User | null> = this.userSubject.asObservable();\n\n constructor(\n @Inject(AUTH_PLUGIN) private plugin: AuthPlugin,\n private tokens: TokenService,\n private signinStatus: SigninStatusService\n ) {\n this.restoreUser();\n }\n\n // ── State management ──────────────────────────────────────────────────────\n\n private restoreUser(): void {\n try {\n const userJson = localStorage.getItem(this.USER_STORAGE_KEY);\n if (userJson) this.updateUser(JSON.parse(userJson));\n } catch (error) {\n console.error('Failed to restore user from localStorage:', error);\n }\n }\n\n private saveUser(user: User | null): void {\n try {\n if (user) {\n localStorage.setItem(this.USER_STORAGE_KEY, JSON.stringify(user));\n } else {\n localStorage.removeItem(this.USER_STORAGE_KEY);\n }\n } catch (error) {\n console.error('Failed to save user to localStorage:', error);\n }\n }\n\n private updateUser(user: User | null): void {\n this.userSubject.next(user);\n this.saveUser(user);\n }\n\n private storeAuthResult(result: AuthResult): void {\n if (result.accessToken) this.tokens.setAccessToken(result.accessToken);\n if (result.refreshToken) this.tokens.setRefreshToken(result.refreshToken);\n if (result.user) this.updateUser(result.user);\n this.signinStatus.setSigninStatus(true);\n }\n\n // ── Core auth operations ──────────────────────────────────────────────────\n\n async loginWithEmail(email: string, password: string): Promise<AuthResult> {\n const result = await this.plugin.login(email, password);\n if (result.success) this.storeAuthResult(result);\n return result;\n }\n\n async loginWithGoogle(serverName?: string): Promise<AuthResult> {\n return this.loginWithProvider('google');\n }\n\n async loginWithGitHub(serverName?: string): Promise<AuthResult> {\n return this.loginWithProvider('github');\n }\n\n async loginWithLinkedIn(serverName?: string): Promise<AuthResult> {\n return this.loginWithProvider('linkedin');\n }\n\n async loginWithApple(serverName?: string): Promise<AuthResult> {\n return this.loginWithProvider('apple');\n }\n\n async loginWithMicrosoft(serverName?: string): Promise<AuthResult> {\n return this.loginWithProvider('microsoft');\n }\n\n async loginWithZoho(serverName?: string): Promise<AuthResult> {\n return this.loginWithProvider('zoho');\n }\n\n async loginWithProvider(provider: AuthProvider, serverName?: string): Promise<AuthResult> {\n if (provider === 'emailPassword') {\n throw new Error('Use loginWithEmail() for email/password authentication');\n }\n if (!this.plugin.loginWithProvider) {\n return { success: false, message: 'OAuth not supported by the configured auth plugin' };\n }\n const result = await this.plugin.loginWithProvider(provider);\n if (result.success) this.storeAuthResult(result);\n return result;\n }\n\n async register(\n email: string,\n password: string,\n displayName: string,\n serverName?: string\n ): Promise<AuthResult> {\n const result = await this.plugin.register(email, password, displayName);\n if (result.success) this.storeAuthResult(result);\n return result;\n }\n\n async signout(serverName?: string): Promise<void> {\n const refreshToken = this.tokens.getRefreshToken() || undefined;\n await this.plugin.logout(refreshToken);\n this.tokens.clear();\n this.signinStatus.setSigninStatus(false);\n this.updateUser(null);\n }\n\n async checkSession(serverName?: string): Promise<boolean> {\n if (this.tokens.hasValidAccessToken()) {\n this.signinStatus.setSigninStatus(true);\n return true;\n }\n const result = await this.plugin.checkSession();\n if (result.success && result.accessToken) {\n this.tokens.setAccessToken(result.accessToken);\n if (result.user) this.updateUser(result.user);\n this.signinStatus.setSigninStatus(true);\n return true;\n }\n this.tokens.clear();\n this.updateUser(null);\n this.signinStatus.setSigninStatus(false);\n return false;\n }\n\n /**\n * Refresh the access token. Called by ApiConnectionService on 401.\n * @returns true if token was refreshed, false if refresh failed (user is signed out)\n */\n async refresh(): Promise<boolean> {\n const newToken = await this.plugin.refresh(\n this.tokens.getAccessToken(),\n this.tokens.getRefreshToken() || undefined\n );\n if (newToken) {\n this.tokens.setAccessToken(newToken);\n return true;\n }\n this.tokens.clear();\n this.updateUser(null);\n this.signinStatus.signedOut();\n return false;\n }\n\n isAuthenticated(): boolean {\n return this.tokens.hasValidAccessToken();\n }\n\n getCurrentUser(): User | null {\n return this.userSubject.value;\n }\n\n // ── Multi-tenant operations ───────────────────────────────────────────────\n\n async getTenantMemberships(serverName?: string): Promise<{ memberships: TenantMembership[] }> {\n if (!this.plugin.getTenantMemberships) return { memberships: [] };\n const memberships = await this.plugin.getTenantMemberships(this.tokens.getAccessToken());\n return { memberships };\n }\n\n async selectTenant(tenantId: string, serverName?: string): Promise<{\n success: boolean;\n message?: string;\n access_token?: string;\n }> {\n if (!this.plugin.selectTenant) {\n return { success: false, message: 'selectTenant not supported by the configured auth plugin' };\n }\n const result = await this.plugin.selectTenant(tenantId, this.tokens.getAccessToken());\n if (result.success && result.accessToken) {\n this.tokens.setAccessToken(result.accessToken);\n }\n return { success: result.success, message: result.message, access_token: result.accessToken };\n }\n\n async checkTenantSlugAvailable(slug: string, serverName?: string): Promise<{\n available: boolean;\n suggestion?: string;\n }> {\n if (!this.plugin.checkTenantSlugAvailable) return { available: true };\n return this.plugin.checkTenantSlugAvailable(slug);\n }\n\n async checkOnboardingStatus(identityId: string, serverName?: string): Promise<any> {\n if (!this.plugin.checkOnboardingStatus) throw new Error('checkOnboardingStatus not supported');\n return this.plugin.checkOnboardingStatus(identityId);\n }\n\n // ── Multi-server (delegated to plugin) ────────────────────────────────────\n\n public getAvailableAuthServers(): string[] {\n return this.plugin.getAvailableServers?.() ?? [];\n }\n\n public getActiveAuthServer(): string | null {\n return this.plugin.getActiveServer?.() ?? null;\n }\n\n public switchAuthServer(serverName: string): void {\n if (!this.plugin.switchServer) {\n throw new Error('Multi-server mode not supported by the configured auth plugin');\n }\n this.plugin.switchServer(serverName);\n }\n\n public getAuthServerConfig(serverName?: string): any | null {\n return this.plugin.getServerConfig?.(serverName) ?? null;\n }\n\n public isMultiServerMode(): boolean {\n return (this.plugin.getAvailableServers?.() ?? []).length > 0;\n }\n\n // ── Backward compatibility ────────────────────────────────────────────────\n\n /** @deprecated Use getCurrentUser()?.user_id instead */\n getUserId(): number { return this.userSubject.value?.user_id || 0; }\n\n /** @deprecated Use getCurrentUser()?.display_name instead */\n getUserName(): string { return this.userSubject.value?.display_name || ''; }\n\n /** @deprecated Use getCurrentUser()?.photo_url instead */\n getPhotoUrl(): string { return this.userSubject.value?.photo_url || ''; }\n\n /** @deprecated Use getCurrentUser()?.display_name instead */\n getDisplayName(): string { return this.userSubject.value?.display_name || ''; }\n\n /** @deprecated Use `/profile/${getCurrentUser()?.user_id}` instead */\n getProfileUrl(): string {\n const userId = this.userSubject.value?.user_id;\n return userId ? `/profile/${userId}` : '';\n }\n\n /** @deprecated Use isAuthenticated() instead */\n async signin(): Promise<boolean> { return this.isAuthenticated(); }\n\n /** @deprecated Use loginWithEmail() instead */\n async verifyCredentials(email: string, password: string): Promise<boolean> {\n const result = await this.loginWithEmail(email, password);\n return result.success;\n }\n\n /** @deprecated Check user.is_email_verified from getCurrentUser() instead */\n isSigninEmailValid(): boolean { return this.userSubject.value?.is_email_verified || false; }\n\n /** @deprecated No longer needed */\n onDialogClose(): void { }\n\n /** @deprecated No longer needed */\n closeSocialAuthDialog(): void { }\n\n /** @deprecated Use checkEmail() from the plugin directly */\n async getUserProfile(email: string, serverName?: string): Promise<User | null> {\n if (!this.plugin.checkEmail) return null;\n const result = await this.plugin.checkEmail(email);\n return result.exists ? result.user : null;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { TokenService } from './token.service';\nimport { SigninStatusService } from './signin-status.service';\nimport { ApiResponse } from './api-response.model';\nimport { MyEnvironmentModel } from './my-environment.model';\nimport { AuthService } from './auth.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ApiConnectionService {\n\n private host = '' // base URL without trailing slash\n\n constructor(\n private tokens: TokenService,\n private signinStatus: SigninStatusService,\n private environment: MyEnvironmentModel,\n private authService: AuthService\n ) {\n this.host = environment.apiServer.host\n }\n\n private async request<DataType>(url: string, options: any, data: any | null): Promise<ApiResponse<DataType>> {\n try {\n if (data !== null) {\n const body = JSON.stringify(data)\n options.body = body || {}\n }\n\n const accessTokenIncluded = this.includeAccessToken(options)\n\n let response: Response = await fetch(url, options)\n\n if (response.status === 401 && accessTokenIncluded) {\n response = await this.refreshAndRetry(url, options, response)\n }\n\n if (response.ok) {\n const json = await response.json()\n return new ApiResponse<DataType>(json.status, json.data, json.message)\n }\n\n if (response.status === 401) {\n this.signinStatus.signedOut()\n }\n\n return this.handleError<DataType>(response)\n } catch (error) {\n return this.handleError<DataType>(error)\n }\n }\n\n private handleError<DataType>(error: any): ApiResponse<DataType> {\n console.error(`Backend returned code ${error.status}, full error: `, error)\n return new ApiResponse<DataType>('error')\n }\n\n async get<DataType>(endpoint: string, queryParamsObj?: any): Promise<ApiResponse<DataType>> {\n const url = this.host + endpoint + this.buildQueryString(queryParamsObj)\n const fetchOptions: RequestInit = { mode: 'cors', redirect: 'error' }\n return this.request(url, fetchOptions, null)\n }\n\n async post<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>> {\n const url = this.host + pathWithQueryParams\n const fetchOptions: RequestInit = {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data)\n }\n return this.request(url, fetchOptions, data)\n }\n\n async put<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>> {\n const url = this.host + pathWithQueryParams\n const fetchOptions: RequestInit = {\n method: 'PUT',\n mode: 'cors',\n redirect: 'error',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data)\n }\n return this.request(url, fetchOptions, data)\n }\n\n async patch<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>> {\n const url = this.host + pathWithQueryParams\n const fetchOptions: RequestInit = {\n method: 'PATCH',\n mode: 'cors',\n redirect: 'error',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data)\n }\n return this.request(url, fetchOptions, data)\n }\n\n async delete<DataType>(endpoint: string, queryParamsObj?: any): Promise<ApiResponse<DataType>> {\n const url = this.host + endpoint + this.buildQueryString(queryParamsObj)\n const fetchOptions: RequestInit = { method: 'DELETE', mode: 'cors', redirect: 'error' }\n return this.request(url, fetchOptions, null)\n }\n\n private includeAccessToken(options: any): boolean {\n const accessToken = this.tokens.getAccessToken()\n if (!accessToken) return false\n if (!options.headers) options.headers = {}\n options.headers['Authorization'] = 'Bearer ' + accessToken\n return true\n }\n\n private async refreshAndRetry(url: string, fetchOptions: any, response: Response): Promise<Response> {\n const refreshed = await this.authService.refresh()\n if (!refreshed) return response\n fetchOptions.headers['Authorization'] = 'Bearer ' + this.tokens.getAccessToken()\n return fetch(url, fetchOptions)\n }\n\n /**\n * Refresh the access token (delegates to AuthService → AuthPlugin).\n * Kept public for backward compatibility.\n */\n async refreshAccessToken(): Promise<boolean> {\n return this.authService.refresh()\n }\n\n buildQueryString(options?: any): string {\n if (options === undefined) return ''\n const array = []\n for (const key in options) {\n if (options.hasOwnProperty(key) && options[key] !== null && options[key] !== undefined) {\n array.push(encodeURIComponent(key) + '=' + encodeURIComponent(options[key]))\n }\n }\n const str = array.join('&')\n return str ? '?' + str : ''\n }\n\n /**\n * Upload a drawing (uses upload server if configured, otherwise API server)\n * @deprecated Platform-specific method - consider moving to platform service\n */\n async uploadDrawing<DataType>(formData: FormData): Promise<ApiResponse<DataType>> {\n const uploadHost = (this.environment as any).uploadServer?.host || this.host\n const url = uploadHost + '/upload/drawing'\n const fetchOptions: RequestInit = { method: 'POST', mode: 'cors', redirect: 'error', body: formData }\n return this.request(url, fetchOptions, null)\n }\n\n /**\n * Upload an image (uses upload server if configured, otherwise API server)\n * @deprecated Platform-specific method - consider moving to platform service\n */\n async uploadImage<DataType>(formData: FormData): Promise<ApiResponse<DataType>> {\n const uploadHost = (this.environment as any).uploadServer?.host || this.host\n const url = uploadHost + '/upload/image'\n const fetchOptions: RequestInit = { method: 'POST', mode: 'cors', redirect: 'error', body: formData }\n return this.request(url, fetchOptions, null)\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DbService {\n\n constructor() { }\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * CSRF Token Service\n *\n * Manages CSRF tokens for cookie-based authentication.\n * Reads CSRF token from cookies and provides it for request headers.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class CsrfService {\n\n /**\n * Get CSRF token from cookie\n */\n getCsrfToken(cookieName: string = 'csrf_token'): string | null {\n const cookies = document.cookie.split(';');\n for (const cookie of cookies) {\n const [name, value] = cookie.trim().split('=');\n if (name === cookieName) {\n return decodeURIComponent(value);\n }\n }\n return null;\n }\n\n /**\n * Check if CSRF token exists\n */\n hasCsrfToken(cookieName: string = 'csrf_token'): boolean {\n return this.getCsrfToken(cookieName) !== null;\n }\n\n /**\n * Clear CSRF token (for logout)\n * Note: Client-side deletion is limited for httpOnly cookies\n */\n clearCsrfToken(cookieName: string = 'csrf_token'): void {\n // Can only clear non-httpOnly cookies\n document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { TokenService } from './token.service';\nimport { SigninStatusService } from './signin-status.service';\nimport { MyEnvironmentModel, AuthConfig } from './my-environment.model';\nimport { CsrfService } from './csrf.service';\nimport {\n FileUploadResult,\n FileMetadata,\n FileUploadResponse,\n FileListResponse,\n FileDeleteResponse\n} from './files.model';\n\n/**\n * Service for interacting with the stonescriptphp-files server.\n * Handles file upload, download, list, and delete operations\n * with automatic Bearer token injection and 401 refresh handling.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class FilesService {\n\n private host = '';\n private apiHost = '';\n private authConfig: AuthConfig;\n\n constructor(\n private tokens: TokenService,\n private signinStatus: SigninStatusService,\n private environment: MyEnvironmentModel,\n private csrf: CsrfService\n ) {\n this.host = environment.filesServer?.host || '';\n this.apiHost = environment.apiServer.host;\n\n this.authConfig = {\n mode: environment.auth?.mode || 'cookie',\n refreshEndpoint: environment.auth?.refreshEndpoint,\n useCsrf: environment.auth?.useCsrf,\n refreshTokenCookieName: environment.auth?.refreshTokenCookieName || 'refresh_token',\n csrfTokenCookieName: environment.auth?.csrfTokenCookieName || 'csrf_token',\n csrfHeaderName: environment.auth?.csrfHeaderName || 'X-CSRF-Token'\n };\n\n if (!this.authConfig.refreshEndpoint) {\n this.authConfig.refreshEndpoint = this.authConfig.mode === 'cookie'\n ? '/auth/refresh'\n : '/user/refresh_access';\n }\n\n if (this.authConfig.useCsrf === undefined) {\n this.authConfig.useCsrf = this.authConfig.mode === 'cookie';\n }\n }\n\n /**\n * Check if the files server is configured.\n */\n isConfigured(): boolean {\n return !!this.host;\n }\n\n /**\n * Upload a file to the files service.\n * Uses FormData — does NOT set Content-Type header (browser sets multipart boundary).\n *\n * @param file The File object to upload\n * @param entityType Optional entity type for server-side reference linking\n * @param entityId Optional entity ID for server-side reference linking\n * @returns Promise resolving to the upload result\n */\n async upload(file: File, entityType?: string, entityId?: string): Promise<FileUploadResult> {\n const formData = new FormData();\n formData.append('file', file);\n\n if (entityType) {\n formData.append('entityType', entityType);\n }\n if (entityId) {\n formData.append('entityId', entityId);\n }\n\n const url = this.host + 'upload';\n const options: RequestInit = {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n body: formData\n // No Content-Type header — browser sets multipart boundary automatically\n };\n\n const response = await this.requestWithRetry<FileUploadResponse>(url, options);\n return response.file;\n }\n\n /**\n * Download a file from the files service.\n * Returns a Blob suitable for URL.createObjectURL().\n *\n * @param fileId UUID of the file to download\n * @returns Promise resolving to the file Blob\n */\n async download(fileId: string): Promise<Blob> {\n const url = this.host + 'files/' + fileId;\n const options: RequestInit = {\n method: 'GET',\n mode: 'cors',\n redirect: 'error'\n };\n\n this.includeAccessToken(options);\n\n let response = await fetch(url, options);\n\n if (response.status === 401) {\n const refreshed = await this.refreshAccessToken();\n if (refreshed) {\n this.includeAccessToken(options);\n response = await fetch(url, options);\n }\n }\n\n if (response.status === 401) {\n this.signinStatus.signedOut();\n }\n\n if (!response.ok) {\n throw new Error(`Download failed: ${response.status} ${response.statusText}`);\n }\n\n return response.blob();\n }\n\n /**\n * List all files for the current user.\n *\n * @returns Promise resolving to array of file metadata\n */\n async list(): Promise<FileMetadata[]> {\n const url = this.host + 'files';\n const options: RequestInit = {\n method: 'GET',\n mode: 'cors',\n redirect: 'error'\n };\n\n const response = await this.requestWithRetry<FileListResponse>(url, options);\n return response.files;\n }\n\n /**\n * Delete a file from the files service.\n *\n * @param fileId UUID of the file to delete\n * @returns Promise resolving to true on success\n */\n async delete(fileId: string): Promise<boolean> {\n const url = this.host + 'files/' + fileId;\n const options: RequestInit = {\n method: 'DELETE',\n mode: 'cors',\n redirect: 'error'\n };\n\n const response = await this.requestWithRetry<FileDeleteResponse>(url, options);\n return response.success;\n }\n\n /**\n * Make a request with automatic Bearer token injection and 401 retry.\n */\n private async requestWithRetry<T>(url: string, options: RequestInit): Promise<T> {\n this.includeAccessToken(options);\n\n let response = await fetch(url, options);\n\n if (response.status === 401) {\n const refreshed = await this.refreshAccessToken();\n if (refreshed) {\n this.includeAccessToken(options);\n response = await fetch(url, options);\n }\n }\n\n if (response.status === 401) {\n this.signinStatus.signedOut();\n }\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throw new Error(body.message || `Request failed: ${response.status}`);\n }\n\n return response.json();\n }\n\n private includeAccessToken(options: RequestInit): void {\n const accessToken = this.tokens.getAccessToken();\n if (!accessToken) return;\n\n if (!options.headers) {\n options.headers = {};\n }\n (options.headers as Record<string, string>)['Authorization'] = 'Bearer ' + accessToken;\n }\n\n private async refreshAccessToken(): Promise<boolean> {\n if (this.authConfig.mode === 'none') {\n return false;\n }\n\n if (this.authConfig.mode === 'cookie') {\n return this.refreshAccessTokenCookieMode();\n } else {\n return this.refreshAccessTokenBodyMode();\n }\n }\n\n private async refreshAccessTokenCookieMode(): Promise<boolean> {\n try {\n const refreshTokenUrl = this.apiHost + this.authConfig.refreshEndpoint!.replace(/^\\/+/, '');\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json'\n };\n\n if (this.authConfig.useCsrf) {\n const csrfToken = this.csrf.getCsrfToken(this.authConfig.csrfTokenCookieName!);\n if (!csrfToken) {\n return false;\n }\n headers[this.authConfig.csrfHeaderName!] = csrfToken;\n }\n\n const response = await fetch(refreshTokenUrl, {\n method: 'POST',\n mode: 'cors',\n credentials: 'include',\n redirect: 'error',\n headers\n });\n\n if (!response.ok) {\n this.tokens.clear();\n return false;\n }\n\n const data = await response.json();\n if (!data || data.status !== 'ok') {\n return false;\n }\n\n const newAccessToken = data.data?.access_token || data.access_token;\n if (!newAccessToken) {\n return false;\n }\n\n this.tokens.setAccessToken(newAccessToken);\n return true;\n } catch {\n this.tokens.clear();\n return false;\n }\n }\n\n private async refreshAccessTokenBodyMode(): Promise<boolean> {\n try {\n const refreshToken = this.tokens.getRefreshToken();\n if (!refreshToken) {\n return false;\n }\n\n const accessToken = this.tokens.getAccessToken();\n const refreshTokenUrl = this.apiHost + this.authConfig.refreshEndpoint!.replace(/^\\/+/, '');\n\n const response = await fetch(refreshTokenUrl, {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n access_token: accessToken,\n refresh_token: refreshToken\n })\n });\n\n if (!response.ok) {\n this.tokens.clear();\n return false;\n }\n\n const data = await response.json();\n if (!data) {\n return false;\n }\n\n const newAccessToken = data.data?.access_token || data.access_token;\n if (!newAccessToken) {\n return false;\n }\n\n this.tokens.setTokens(newAccessToken, refreshToken);\n return true;\n } catch {\n this.tokens.clear();\n return false;\n }\n }\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { BuiltInProvider } from './auth.service';\nimport { MyEnvironmentModel, OAuthProviderConfig } from './my-environment.model';\n\n/**\n * Default configurations for built-in OAuth providers.\n * These serve as fallback values when no custom configuration is registered.\n */\nconst BUILT_IN_PROVIDERS: Record<BuiltInProvider, OAuthProviderConfig> = {\n google: {\n label: 'Google',\n cssClass: 'btn-google',\n buttonStyle: { borderColor: '#4285f4' }\n },\n linkedin: {\n label: 'LinkedIn',\n cssClass: 'btn-linkedin',\n buttonStyle: { borderColor: '#0077b5' }\n },\n apple: {\n label: 'Apple',\n cssClass: 'btn-apple',\n buttonStyle: { borderColor: '#000' }\n },\n microsoft: {\n label: 'Microsoft',\n cssClass: 'btn-microsoft',\n buttonStyle: { borderColor: '#00a4ef' }\n },\n github: {\n label: 'GitHub',\n cssClass: 'btn-github',\n buttonStyle: { borderColor: '#333' }\n },\n zoho: {\n label: 'Zoho',\n icon: '🔶',\n cssClass: 'btn-zoho',\n buttonStyle: {\n borderColor: '#d63b32',\n backgroundColor: '#f0483e',\n color: '#ffffff'\n }\n },\n emailPassword: {\n label: 'Email',\n cssClass: 'btn-email'\n }\n};\n\n/**\n * Service for managing OAuth provider configurations.\n *\n * Provides a central registry for both built-in and custom OAuth providers.\n * Custom providers can be registered either through the environment configuration\n * (customProviders field) or programmatically via registerProvider/registerProviders.\n *\n * Custom registrations take precedence over built-in defaults.\n * Unknown providers receive an auto-generated fallback configuration.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ProviderRegistryService {\n private customProviders = new Map<string, OAuthProviderConfig>();\n\n constructor(\n @Inject(MyEnvironmentModel) private environment: MyEnvironmentModel\n ) {\n // Seed from environment customProviders if present\n if (this.environment.customProviders) {\n for (const [id, config] of Object.entries(this.environment.customProviders)) {\n this.customProviders.set(id, config);\n }\n }\n }\n\n /**\n * Register a custom OAuth provider configuration.\n * If a provider with the same id already exists, it will be overwritten.\n * @param id - Provider identifier (e.g., 'okta', 'auth0')\n * @param config - Provider display configuration\n */\n registerProvider(id: string, config: OAuthProviderConfig): void {\n this.customProviders.set(id, config);\n }\n\n /**\n * Register multiple custom OAuth provider configurations at once.\n * @param providers - Record of provider id to configuration\n */\n registerProviders(providers: Record<string, OAuthProviderConfig>): void {\n for (const [id, config] of Object.entries(providers)) {\n this.customProviders.set(id, config);\n }\n }\n\n /**\n * Get the full configuration for a provider.\n * Resolution order: custom registration > built-in default > auto-generated fallback.\n * @param provider - Provider identifier\n */\n getProviderConfig(provider: string): OAuthProviderConfig {\n // 1. Check custom registrations first\n const custom = this.customProviders.get(provider);\n if (custom) {\n return custom;\n }\n\n // 2. Check built-in providers\n const builtIn = BUILT_IN_PROVIDERS[provider as BuiltInProvider];\n if (builtIn) {\n return builtIn;\n }\n\n // 3. Auto-generated fallback for unknown providers\n const displayName = provider.charAt(0).toUpperCase() + provider.slice(1);\n return {\n label: displayName,\n cssClass: `btn-${provider}`\n };\n }\n\n /**\n * Get the display label for a provider, formatted for sign-in context.\n * @param provider - Provider identifier\n * @returns Label like \"Sign in with Google\"\n */\n getLabel(provider: string): string {\n const config = this.getProviderConfig(provider);\n if (provider === 'emailPassword') {\n return `Sign in with ${config.label}`;\n }\n return `Sign in with ${config.label}`;\n }\n\n /**\n * Get the display label for a provider, formatted for sign-up context.\n * @param provider - Provider identifier\n * @returns Label like \"Sign up with Google\"\n */\n getSignupLabel(provider: string): string {\n const config = this.getProviderConfig(provider);\n return `Sign up with ${config.label}`;\n }\n\n /**\n * Get the icon for a provider, if configured.\n * @param provider - Provider identifier\n * @returns Icon string or undefined\n */\n getIcon(provider: string): string | undefined {\n const config = this.getProviderConfig(provider);\n return config.icon;\n }\n\n /**\n * Get the CSS class for a provider button.\n * @param provider - Provider identifier\n * @returns CSS class string (e.g., \"btn-google\")\n */\n getCssClass(provider: string): string {\n const config = this.getProviderConfig(provider);\n return config.cssClass || `btn-${provider}`;\n }\n\n /**\n * Get inline button styles for a provider, if configured.\n * @param provider - Provider identifier\n * @returns Style object for ngStyle binding, or null if no custom styles\n */\n getButtonStyle(provider: string): Record<string, string> | null {\n const config = this.getProviderConfig(provider);\n if (!config.buttonStyle) {\n return null;\n }\n\n const styles: Record<string, string> = {};\n if (config.buttonStyle.borderColor) {\n styles['border-color'] = config.buttonStyle.borderColor;\n }\n if (config.buttonStyle.backgroundColor) {\n styles['background-color'] = config.buttonStyle.backgroundColor;\n }\n if (config.buttonStyle.color) {\n styles['color'] = config.buttonStyle.color;\n }\n return Object.keys(styles).length > 0 ? styles : null;\n }\n}\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { AuthService, AuthProvider, AuthResult } from '../../auth.service';\nimport { ProviderRegistryService } from '../../provider-registry.service';\nimport { TenantMembership } from '../../auth.plugin';\n\nexport type { TenantMembership };\n\nexport interface TenantSelectedEvent {\n tenantId: string;\n tenantSlug: string;\n role: string;\n}\n\nexport interface OnboardingNeededEvent {\n auth_method: string;\n oauth_provider?: string;\n is_new_identity: boolean;\n identity: {\n email: string;\n display_name?: string;\n picture?: string;\n };\n}\n\n@Component({\n selector: 'lib-tenant-login',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"tenant-login-dialog\">\n @if (!showingTenantSelector) {\n <!-- Step 1: Authentication -->\n <h2 class=\"login-title\">{{ title }}</h2>\n\n <!-- Email/Password Form (if enabled) -->\n @if (isProviderEnabled('emailPassword') && !useOAuth) {\n <form (ngSubmit)=\"onEmailLogin()\" class=\"email-form\">\n <div class=\"form-group\">\n <input\n [(ngModel)]=\"email\"\n name=\"email\"\n placeholder=\"Email\"\n type=\"email\"\n required\n class=\"form-control\">\n </div>\n <div class=\"form-group password-group\">\n <input\n [(ngModel)]=\"password\"\n name=\"password\"\n placeholder=\"Password\"\n [type]=\"showPassword ? 'text' : 'password'\"\n required\n class=\"form-control password-input\">\n <button\n type=\"button\"\n class=\"password-toggle\"\n (click)=\"showPassword = !showPassword\"\n [attr.aria-label]=\"showPassword ? 'Hide password' : 'Show password'\">\n {{ showPassword ? '👁️' : '👁️‍🗨️' }}\n </button>\n </div>\n <button\n type=\"submit\"\n [disabled]=\"loading\"\n class=\"btn btn-primary btn-block\">\n {{ loading ? 'Signing in...' : 'Sign in with Email' }}\n </button>\n </form>\n\n <!-- Divider -->\n @if (oauthProviders.length > 0) {\n <div class=\"divider\">\n <span>OR</span>\n </div>\n }\n }\n\n <!-- OAuth Providers -->\n @if (oauthProviders.length > 0 && (useOAuth || !isProviderEnabled('emailPassword'))) {\n <div class=\"oauth-buttons\">\n @for (provider of oauthProviders; track provider) {\n <button\n type=\"button\"\n (click)=\"onOAuthLogin(provider)\"\n [disabled]=\"loading\"\n [class]=\"'btn btn-oauth ' + getProviderCssClass(provider)\"\n [ngStyle]=\"getProviderButtonStyle(provider)\">\n @if (getProviderIcon(provider)) {\n <span class=\"oauth-icon\">\n {{ getProviderIcon(provider) }}\n </span>\n }\n {{ getProviderLabel(provider) }}\n </button>\n }\n </div>\n\n <!-- Switch to Email/Password -->\n @if (isProviderEnabled('emailPassword') && oauthProviders.length > 0) {\n <div class=\"switch-method\">\n <a href=\"#\" (click)=\"toggleAuthMethod($event)\">\n {{ useOAuth ? 'Use email/password instead' : 'Use OAuth instead' }}\n </a>\n </div>\n }\n }\n\n <!-- Error Message -->\n @if (error) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n\n <!-- Register Link -->\n @if (allowTenantCreation) {\n <div class=\"register-link\">\n {{ registerLinkText }}\n <a href=\"#\" (click)=\"onCreateTenantClick($event)\">{{ registerLinkAction }}</a>\n </div>\n }\n } @else {\n <!-- Step 2: Tenant Selection -->\n <h2 class=\"login-title\">{{ tenantSelectorTitle }}</h2>\n\n @if (userName) {\n <div class=\"welcome-message\">\n Welcome back, <strong>{{ userName }}</strong>!\n </div>\n }\n\n <p class=\"selector-description\">{{ tenantSelectorDescription }}</p>\n\n <div class=\"tenant-list\">\n @for (membership of memberships; track membership.tenant_id) {\n <div\n class=\"tenant-item\"\n [class.selected]=\"selectedTenantId === membership.tenant_id\"\n (click)=\"selectTenantItem(membership.tenant_id)\">\n <div class=\"tenant-radio\">\n <input\n type=\"radio\"\n [checked]=\"selectedTenantId === membership.tenant_id\"\n [name]=\"'tenant-' + membership.tenant_id\"\n [id]=\"'tenant-' + membership.tenant_id\">\n </div>\n <div class=\"tenant-info\">\n <div class=\"tenant-name\">{{ membership.name }}</div>\n <div class=\"tenant-meta\">\n <span class=\"tenant-role\">{{ formatRole(membership.role) }}</span>\n @if (membership.last_accessed) {\n <span class=\"tenant-separator\">·</span>\n <span class=\"tenant-last-accessed\">\n Last accessed {{ formatLastAccessed(membership.last_accessed) }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n\n <button\n type=\"button\"\n (click)=\"onContinueWithTenant()\"\n [disabled]=\"!selectedTenantId || loading\"\n class=\"btn btn-primary btn-block\">\n {{ loading ? 'Loading...' : continueButtonText }}\n </button>\n\n <!-- Error Message -->\n @if (error) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n\n <!-- Create New Tenant Link -->\n @if (allowTenantCreation) {\n <div class=\"create-tenant-link\">\n {{ createTenantLinkText }}\n <a href=\"#\" (click)=\"onCreateTenantClick($event)\">{{ createTenantLinkAction }}</a>\n </div>\n }\n }\n\n <!-- Loading Overlay -->\n @if (loading) {\n <div class=\"loading-overlay\">\n <div class=\"spinner\"></div>\n </div>\n }\n </div>\n `,\n styles: [`\n .tenant-login-dialog {\n padding: 24px;\n max-width: 450px;\n position: relative;\n }\n\n .login-title {\n margin: 0 0 24px 0;\n font-size: 24px;\n font-weight: 500;\n text-align: center;\n }\n\n .welcome-message {\n margin-bottom: 16px;\n padding: 12px;\n background: #e8f5e9;\n border-radius: 4px;\n text-align: center;\n font-size: 14px;\n color: #2e7d32;\n }\n\n .selector-description {\n margin-bottom: 20px;\n font-size: 14px;\n color: #666;\n text-align: center;\n }\n\n .email-form {\n margin-bottom: 16px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .password-group {\n position: relative;\n }\n\n .form-control {\n width: 100%;\n padding: 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n box-sizing: border-box;\n }\n\n .password-input {\n padding-right: 45px;\n }\n\n .password-toggle {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n cursor: pointer;\n font-size: 18px;\n padding: 8px;\n line-height: 1;\n opacity: 0.6;\n transition: opacity 0.2s;\n }\n\n .password-toggle:hover {\n opacity: 1;\n }\n\n .password-toggle:focus {\n outline: 2px solid #4285f4;\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n .form-control:focus {\n outline: none;\n border-color: #4285f4;\n }\n\n .btn {\n padding: 12px 24px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s;\n }\n\n .btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-block {\n width: 100%;\n }\n\n .btn-primary {\n background-color: #4285f4;\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background-color: #357ae8;\n }\n\n .divider {\n margin: 16px 0;\n text-align: center;\n position: relative;\n }\n\n .divider::before {\n content: '';\n position: absolute;\n top: 50%;\n left: 0;\n right: 0;\n height: 1px;\n background: #ddd;\n }\n\n .divider span {\n background: white;\n padding: 0 12px;\n position: relative;\n color: #666;\n font-size: 12px;\n }\n\n .oauth-buttons {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .btn-oauth {\n width: 100%;\n background: white;\n color: #333;\n border: 1px solid #ddd;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n\n .btn-oauth:hover:not(:disabled) {\n background: #f8f8f8;\n }\n\n .btn-google {\n border-color: #4285f4;\n }\n\n .btn-linkedin {\n border-color: #0077b5;\n }\n\n .btn-apple {\n border-color: #000;\n }\n\n .btn-microsoft {\n border-color: #00a4ef;\n }\n\n .btn-github {\n border-color: #333;\n }\n\n .btn-zoho {\n background-color: #f0483e;\n color: white;\n border: 1px solid #d63b32;\n }\n\n .btn-zoho:hover {\n background-color: #d63b32;\n }\n\n .oauth-icon {\n font-size: 18px;\n }\n\n .switch-method {\n margin-top: 12px;\n text-align: center;\n font-size: 14px;\n }\n\n .switch-method a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .switch-method a:hover {\n text-decoration: underline;\n }\n\n .tenant-list {\n margin-bottom: 20px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .tenant-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n border: 2px solid #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .tenant-item:hover {\n border-color: #4285f4;\n background: #f8f9ff;\n }\n\n .tenant-item.selected {\n border-color: #4285f4;\n background: #e8f0fe;\n }\n\n .tenant-radio {\n flex-shrink: 0;\n padding-top: 2px;\n }\n\n .tenant-radio input[type=\"radio\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n }\n\n .tenant-info {\n flex: 1;\n }\n\n .tenant-name {\n font-size: 16px;\n font-weight: 500;\n color: #333;\n margin-bottom: 4px;\n }\n\n .tenant-meta {\n font-size: 13px;\n color: #666;\n }\n\n .tenant-role {\n font-weight: 500;\n color: #4285f4;\n }\n\n .tenant-separator {\n margin: 0 6px;\n }\n\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fee;\n color: #c33;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #4285f4;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .register-link {\n margin-top: 16px;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n .register-link a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .register-link a:hover {\n text-decoration: underline;\n }\n\n .create-tenant-link {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid #e0e0e0;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n .create-tenant-link a {\n color: #4285f4;\n text-decoration: none;\n font-weight: 500;\n }\n\n .create-tenant-link a:hover {\n text-decoration: underline;\n }\n `]\n})\nexport class TenantLoginComponent implements OnInit {\n // Component Configuration\n @Input() title: string = 'Sign In';\n @Input() providers: AuthProvider[] = ['google'];\n @Input() showTenantSelector: boolean = true;\n @Input() autoSelectSingleTenant: boolean = true;\n @Input() prefillEmail?: string; // Email to prefill (for account linking flow)\n @Input() allowTenantCreation: boolean = true;\n\n // Tenant Selector Labels\n @Input() tenantSelectorTitle: string = 'Select Organization';\n @Input() tenantSelectorDescription: string = 'Choose which organization you want to access:';\n @Input() continueButtonText: string = 'Continue';\n\n // Link Labels\n @Input() registerLinkText: string = \"Don't have an account?\";\n @Input() registerLinkAction: string = 'Sign up';\n @Input() createTenantLinkText: string = \"Don't see your organization?\";\n @Input() createTenantLinkAction: string = 'Create New Organization';\n\n // Outputs\n @Output() tenantSelected = new EventEmitter<TenantSelectedEvent>();\n @Output() needsOnboarding = new EventEmitter<OnboardingNeededEvent>();\n @Output() createTenant = new EventEmitter<void>();\n\n // Form Fields\n email = '';\n password = '';\n\n // State\n error = '';\n loading = false;\n showPassword = false;\n useOAuth = true;\n oauthProviders: AuthProvider[] = [];\n\n // Tenant Selection State\n showingTenantSelector = false;\n memberships: TenantMembership[] = [];\n selectedTenantId: string | null = null;\n userName: string = '';\n\n constructor(\n private auth: AuthService,\n private providerRegistry: ProviderRegistryService\n ) {}\n\n ngOnInit() {\n if (!this.providers || this.providers.length === 0) {\n this.error = 'Configuration Error: No authentication providers specified.';\n throw new Error('TenantLoginComponent requires providers input.');\n }\n\n this.oauthProviders = this.providers.filter(p => p !== 'emailPassword');\n\n // If only emailPassword is available, use it by default\n if (this.oauthProviders.length === 0 && this.isProviderEnabled('emailPassword')) {\n this.useOAuth = false;\n }\n\n // Prefill email if provided (for account linking flow)\n if (this.prefillEmail) {\n this.email = this.prefillEmail;\n this.useOAuth = false; // Switch to email/password form\n }\n }\n\n isProviderEnabled(provider: AuthProvider): boolean {\n return this.providers.includes(provider);\n }\n\n getProviderLabel(provider: AuthProvider): string {\n return this.providerRegistry.getLabel(provider);\n }\n\n getProviderIcon(provider: AuthProvider): string | undefined {\n return this.providerRegistry.getIcon(provider);\n }\n\n getProviderCssClass(provider: AuthProvider): string {\n return this.providerRegistry.getCssClass(provider);\n }\n\n getProviderButtonStyle(provider: AuthProvider): Record<string, string> | null {\n return this.providerRegistry.getButtonStyle(provider);\n }\n\n toggleAuthMethod(event: Event) {\n event.preventDefault();\n this.useOAuth = !this.useOAuth;\n this.error = '';\n }\n\n async onEmailLogin() {\n if (!this.email || !this.password) {\n this.error = 'Please enter email and password';\n return;\n }\n\n this.loading = true;\n this.error = '';\n\n try {\n const result = await this.auth.loginWithEmail(this.email, this.password);\n\n if (!result.success) {\n this.error = result.message || 'Login failed';\n return;\n }\n\n // Authentication successful — pass result so membership can be reused\n await this.handlePostAuthFlow(result);\n } catch (err: any) {\n this.error = err.message || 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n async onOAuthLogin(provider: AuthProvider) {\n this.loading = true;\n this.error = '';\n\n try {\n const result = await this.auth.loginWithProvider(provider);\n\n if (!result.success) {\n this.error = result.message || 'OAuth login failed';\n return;\n }\n\n // New identity — user exists but has no tenant membership\n if (result.isNewIdentity && result.user) {\n this.needsOnboarding.emit({\n auth_method: result.authMethod || 'oauth',\n oauth_provider: result.oauthProvider,\n is_new_identity: true,\n identity: {\n email: result.user.email,\n display_name: result.user.display_name,\n picture: result.user.photo_url,\n },\n });\n return;\n }\n\n // Multi-tenant selection — user has multiple memberships\n if (result.memberships && result.memberships.length > 0) {\n this.memberships = result.memberships;\n this.showingTenantSelector = true;\n return;\n }\n\n // Standard success — pass result so membership can be reused if present\n await this.handlePostAuthFlow(result);\n } catch (err: any) {\n this.error = err.message || 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n async handlePostAuthFlow(loginResult?: AuthResult) {\n if (!this.showTenantSelector) {\n // Tenant selection is disabled, emit event immediately\n this.tenantSelected.emit({\n tenantId: '',\n tenantSlug: '',\n role: ''\n });\n return;\n }\n\n // Resolve memberships — prefer data from login response to avoid extra API call\n this.loading = true;\n\n try {\n let memberships: TenantMembership[];\n\n if (loginResult?.membership) {\n // Login response already included membership — use it directly\n memberships = [loginResult.membership];\n } else {\n // Fall back to fetching memberships from API (with platform_code param)\n const result = await this.auth.getTenantMemberships();\n memberships = result.memberships;\n }\n\n if (!memberships || memberships.length === 0) {\n // User has no tenants, prompt to create one\n this.error = 'You are not a member of any organization. Please create one.';\n if (this.allowTenantCreation) {\n setTimeout(() => this.createTenant.emit(), 2000);\n }\n return;\n }\n\n this.memberships = memberships;\n\n // Get user name if available\n const currentUser = this.auth.getCurrentUser();\n if (currentUser) {\n this.userName = currentUser.display_name || currentUser.email;\n }\n\n // Auto-select if user has only one tenant\n if (this.memberships.length === 1 && this.autoSelectSingleTenant) {\n const m = this.memberships[0];\n // If login already returned a tenant-scoped token (via membership in response),\n // just emit — no need to call select-tenant again.\n if (loginResult?.membership) {\n this.tenantSelected.emit({ tenantId: m.tenant_id, tenantSlug: m.slug, role: m.role });\n return;\n }\n await this.selectAndContinue(m);\n } else {\n // Show tenant selector\n this.showingTenantSelector = true;\n }\n } catch (err: any) {\n this.error = err.message || 'Failed to load organizations';\n } finally {\n this.loading = false;\n }\n }\n\n selectTenantItem(tenantId: string) {\n this.selectedTenantId = tenantId;\n }\n\n async onContinueWithTenant() {\n if (!this.selectedTenantId) {\n this.error = 'Please select an organization';\n return;\n }\n\n const membership = this.memberships.find(m => m.tenant_id === this.selectedTenantId);\n if (!membership) {\n this.error = 'Selected organization not found';\n return;\n }\n\n await this.selectAndContinue(membership);\n }\n\n async selectAndContinue(membership: TenantMembership) {\n this.loading = true;\n this.error = '';\n\n try {\n const result = await this.auth.selectTenant(membership.tenant_id);\n\n if (!result.success) {\n this.error = result.message || 'Failed to select organization';\n return;\n }\n\n // Emit tenant selected event\n this.tenantSelected.emit({\n tenantId: membership.tenant_id,\n tenantSlug: membership.slug,\n role: membership.role\n });\n } catch (err: any) {\n this.error = err.message || 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n formatRole(role: string): string {\n return role.charAt(0).toUpperCase() + role.slice(1);\n }\n\n formatLastAccessed(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'today';\n if (diffDays === 1) return 'yesterday';\n if (diffDays < 7) return `${diffDays} days ago`;\n if (diffDays < 30) return `${Math.floor(diffDays / 7)} weeks ago`;\n return `${Math.floor(diffDays / 30)} months ago`;\n } catch {\n return dateStr;\n }\n }\n\n onCreateTenantClick(event: Event) {\n event.preventDefault();\n this.createTenant.emit();\n }\n}\n","import { Component, Output, EventEmitter, Inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { AuthService } from '../../auth.service';\nimport { MyEnvironmentModel } from '../../my-environment.model';\n\n@Component({\n selector: 'lib-register',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"register-dialog\">\n <h2 class=\"register-title\">Create Account</h2>\n\n <!-- Account Link Prompt -->\n @if (showAccountLinkPrompt) {\n <div class=\"account-link-prompt\">\n <div class=\"prompt-icon\">🔗</div>\n <h3>Account Already Exists</h3>\n <p>\n You already have an account with <strong>{{ existingEmail }}</strong>,\n used on another ProGalaxy E-Labs platform.\n </p>\n <p>\n Would you like to use the same account to access this platform?\n </p>\n <div class=\"prompt-actions\">\n <button type=\"button\" class=\"btn btn-primary btn-block\" (click)=\"linkExistingAccount()\">\n Yes, Use My Existing Account\n </button>\n <button type=\"button\" class=\"btn btn-secondary btn-block\" (click)=\"cancelLinking()\">\n No, Use Different Email\n </button>\n </div>\n </div>\n }\n\n <form *ngIf=\"!showAccountLinkPrompt\" (ngSubmit)=\"onRegister()\" class=\"register-form\">\n <div class=\"form-group\">\n <label for=\"displayName\">Full Name</label>\n <input\n id=\"displayName\"\n [(ngModel)]=\"displayName\"\n name=\"displayName\"\n placeholder=\"Enter your full name\"\n type=\"text\"\n required\n class=\"form-control\">\n </div>\n\n <div class=\"form-group\">\n <label for=\"email\">Email</label>\n <input\n id=\"email\"\n [(ngModel)]=\"email\"\n name=\"email\"\n placeholder=\"Enter your email\"\n type=\"email\"\n required\n class=\"form-control\">\n </div>\n\n <div class=\"form-group password-group\">\n <label for=\"password\">Password</label>\n <input\n id=\"password\"\n [(ngModel)]=\"password\"\n name=\"password\"\n placeholder=\"Create a password\"\n [type]=\"showPassword ? 'text' : 'password'\"\n required\n minlength=\"8\"\n class=\"form-control password-input\">\n <button\n type=\"button\"\n class=\"password-toggle\"\n (click)=\"showPassword = !showPassword\"\n [attr.aria-label]=\"showPassword ? 'Hide password' : 'Show password'\">\n {{ showPassword ? '👁️' : '👁️‍🗨️' }}\n </button>\n <small class=\"form-hint\">At least 8 characters</small>\n </div>\n\n <div class=\"form-group password-group\">\n <label for=\"confirmPassword\">Confirm Password</label>\n <input\n id=\"confirmPassword\"\n [(ngModel)]=\"confirmPassword\"\n name=\"confirmPassword\"\n placeholder=\"Confirm your password\"\n [type]=\"showConfirmPassword ? 'text' : 'password'\"\n required\n class=\"form-control password-input\">\n <button\n type=\"button\"\n class=\"password-toggle\"\n (click)=\"showConfirmPassword = !showConfirmPassword\"\n [attr.aria-label]=\"showConfirmPassword ? 'Hide password' : 'Show password'\">\n {{ showConfirmPassword ? '👁️' : '👁️‍🗨️' }}\n </button>\n </div>\n\n <button\n type=\"submit\"\n [disabled]=\"loading\"\n class=\"btn btn-primary btn-block\">\n {{ loading ? 'Creating account...' : 'Sign Up' }}\n </button>\n </form>\n\n <!-- Error Message -->\n @if (error && !showAccountLinkPrompt) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n\n <!-- Success Message -->\n @if (success) {\n <div class=\"success-message\">\n {{ success }}\n </div>\n }\n\n <!-- Loading State -->\n @if (loading) {\n <div class=\"loading-overlay\">\n <div class=\"spinner\"></div>\n </div>\n }\n\n <!-- Login Link -->\n <div *ngIf=\"!showAccountLinkPrompt\" class=\"login-link\">\n Already have an account?\n <a href=\"#\" (click)=\"onLoginClick($event)\">Sign in</a>\n </div>\n </div>\n `,\n styles: [`\n .register-dialog {\n padding: 24px;\n max-width: 400px;\n position: relative;\n }\n\n .register-title {\n margin: 0 0 24px 0;\n font-size: 24px;\n font-weight: 500;\n text-align: center;\n }\n\n .register-form {\n margin-bottom: 16px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .password-group {\n position: relative;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #333;\n }\n\n .form-control {\n width: 100%;\n padding: 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n box-sizing: border-box;\n }\n\n .password-input {\n padding-right: 45px;\n }\n\n .password-toggle {\n position: absolute;\n right: 8px;\n top: 38px;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 18px;\n padding: 8px;\n line-height: 1;\n opacity: 0.6;\n transition: opacity 0.2s;\n }\n\n .password-toggle:hover {\n opacity: 1;\n }\n\n .password-toggle:focus {\n outline: 2px solid #4285f4;\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n .form-control:focus {\n outline: none;\n border-color: #4285f4;\n }\n\n .form-hint {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: #666;\n }\n\n .btn {\n padding: 12px 24px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s;\n }\n\n .btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-block {\n width: 100%;\n }\n\n .btn-primary {\n background-color: #4285f4;\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background-color: #357ae8;\n }\n\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fee;\n color: #c33;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .success-message {\n margin-top: 16px;\n padding: 12px;\n background: #efe;\n color: #3a3;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #4285f4;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .login-link {\n margin-top: 16px;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n .login-link a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .login-link a:hover {\n text-decoration: underline;\n }\n\n .account-link-prompt {\n background: #f8f9fa;\n border: 2px solid #4285f4;\n border-radius: 8px;\n padding: 24px;\n margin-bottom: 16px;\n text-align: center;\n }\n\n .prompt-icon {\n font-size: 48px;\n margin-bottom: 12px;\n }\n\n .account-link-prompt h3 {\n margin: 0 0 12px 0;\n color: #333;\n font-size: 20px;\n font-weight: 500;\n }\n\n .account-link-prompt p {\n margin: 8px 0;\n color: #555;\n font-size: 14px;\n line-height: 1.6;\n }\n\n .prompt-actions {\n margin-top: 20px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .btn-secondary {\n background: white;\n color: #333;\n border: 1px solid #ddd;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: #f8f9fa;\n border-color: #ccc;\n }\n `]\n})\nexport class RegisterComponent {\n @Output() navigateToLogin = new EventEmitter<string>();\n\n displayName = '';\n email = '';\n password = '';\n confirmPassword = '';\n error = '';\n success = '';\n loading = false;\n showAccountLinkPrompt = false;\n existingEmail = '';\n showPassword = false;\n showConfirmPassword = false;\n\n constructor(\n private auth: AuthService,\n @Inject(MyEnvironmentModel) private environment: MyEnvironmentModel\n ) {}\n\n async onRegister() {\n // Reset messages\n this.error = '';\n this.success = '';\n\n // Validate fields\n if (!this.displayName || !this.email || !this.password || !this.confirmPassword) {\n this.error = 'Please fill in all fields';\n return;\n }\n\n if (this.password.length < 8) {\n this.error = 'Password must be at least 8 characters';\n return;\n }\n\n if (this.password !== this.confirmPassword) {\n this.error = 'Passwords do not match';\n return;\n }\n\n // Validate email format\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(this.email)) {\n this.error = 'Please enter a valid email address';\n return;\n }\n\n this.loading = true;\n\n try {\n // Direct API call to check for email already registered\n const response = await fetch(`${this.environment.accountsUrl}/api/auth/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n email: this.email,\n password: this.password,\n display_name: this.displayName,\n platform: this.environment.platformCode\n })\n });\n\n const data = await response.json();\n\n if (response.ok && data.identity_id) {\n // Registration successful - now login\n const loginResult = await this.auth.loginWithEmail(this.email, this.password);\n\n if (loginResult.success) {\n this.success = 'Account created successfully!';\n } else {\n this.success = 'Account created! Please sign in.';\n }\n } else {\n // Check if email already registered\n if (data.error === 'Email already registered' || data.details?.includes('Email already registered')) {\n this.existingEmail = this.email;\n this.showAccountLinkPrompt = true;\n this.error = '';\n } else {\n // Other errors\n this.error = data.error || data.details || 'Registration failed';\n }\n }\n } catch (err) {\n this.error = 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n onLoginClick(event: Event) {\n event.preventDefault();\n this.navigateToLogin.emit('');\n }\n\n linkExistingAccount() {\n // User confirmed they want to link their existing account\n this.navigateToLogin.emit(this.existingEmail);\n }\n\n cancelLinking() {\n // User decided not to link - reset form\n this.showAccountLinkPrompt = false;\n this.existingEmail = '';\n this.email = '';\n this.password = '';\n this.confirmPassword = '';\n this.displayName = '';\n }\n}\n","import { Component, OnInit, Output, EventEmitter, Inject, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TenantLoginComponent, TenantSelectedEvent } from './tenant-login.component';\nimport { RegisterComponent } from './register.component';\nimport { MyEnvironmentModel } from '../../my-environment.model';\nimport { AuthProvider } from '../../auth.service';\n\n@Component({\n selector: 'lib-auth-page',\n standalone: true,\n imports: [CommonModule, TenantLoginComponent, RegisterComponent],\n template: `\n <div class=\"auth-container\" [style.background]=\"gradientStyle\">\n <div class=\"auth-card\">\n @if (logo) {\n <img [src]=\"logo\" [alt]=\"appName + ' logo'\" class=\"logo\">\n }\n <h1 class=\"app-name\">{{ appName }}</h1>\n @if (subtitle) {\n <p class=\"subtitle\">{{ subtitle }}</p>\n }\n\n @if (mode === 'login') {\n <lib-tenant-login\n [providers]=\"providers\"\n [allowTenantCreation]=\"false\"\n (tenantSelected)=\"onAuthenticated($event)\"\n (createTenant)=\"mode = 'register'\">\n </lib-tenant-login>\n } @else {\n <lib-register\n (navigateToLogin)=\"mode = 'login'\">\n </lib-register>\n }\n </div>\n </div>\n `,\n styles: [`\n .auth-container {\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n }\n\n .auth-card {\n background: white;\n border-radius: 12px;\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);\n padding: 40px;\n width: 100%;\n max-width: 480px;\n }\n\n .logo {\n display: block;\n max-width: 200px;\n max-height: 80px;\n margin: 0 auto 24px;\n }\n\n .app-name {\n margin: 0 0 12px 0;\n font-size: 28px;\n font-weight: 600;\n text-align: center;\n color: #1a202c;\n }\n\n .subtitle {\n margin: 0 0 32px 0;\n font-size: 16px;\n text-align: center;\n color: #718096;\n }\n\n :host ::ng-deep .tenant-login-dialog,\n :host ::ng-deep .register-dialog {\n padding: 0;\n max-width: none;\n }\n\n :host ::ng-deep .login-title,\n :host ::ng-deep .register-title {\n display: none;\n }\n `]\n})\nexport class AuthPageComponent implements OnInit {\n @Input() providers: AuthProvider[] = ['google', 'emailPassword'];\n @Output() authenticated = new EventEmitter<TenantSelectedEvent>();\n\n mode: 'login' | 'register' = 'login';\n\n appName: string = '';\n logo?: string;\n subtitle?: string;\n gradientStyle: string = 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)';\n\n constructor(@Inject(MyEnvironmentModel) private environment: MyEnvironmentModel) {}\n\n ngOnInit() {\n const branding = this.environment.branding;\n\n if (branding) {\n this.appName = branding.appName || 'Sign In';\n this.logo = branding.logo;\n this.subtitle = branding.subtitle;\n\n if (branding.gradientStart && branding.gradientEnd) {\n this.gradientStyle = `linear-gradient(135deg, ${branding.gradientStart} 0%, ${branding.gradientEnd} 100%)`;\n } else if (branding.primaryColor) {\n const color = branding.primaryColor;\n this.gradientStyle = `linear-gradient(135deg, ${color} 0%, ${this.adjustColor(color, -20)} 100%)`;\n }\n } else {\n this.appName = 'Sign In';\n }\n }\n\n onAuthenticated(event: TenantSelectedEvent) {\n this.authenticated.emit(event);\n }\n\n /**\n * Adjust color brightness (simple implementation)\n * @param color Hex color (e.g., '#667eea')\n * @param percent Percentage to darken (negative) or lighten (positive)\n */\n private adjustColor(color: string, percent: number): string {\n const num = parseInt(color.replace('#', ''), 16);\n const amt = Math.round(2.55 * percent);\n const R = (num >> 16) + amt;\n const G = (num >> 8 & 0x00FF) + amt;\n const B = (num & 0x0000FF) + amt;\n return '#' + (0x1000000 + (R < 255 ? R < 1 ? 0 : R : 255) * 0x10000 +\n (G < 255 ? G < 1 ? 0 : G : 255) * 0x100 +\n (B < 255 ? B < 1 ? 0 : B : 255))\n .toString(16).slice(1);\n }\n}\n","import { Component, OnInit, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { AuthService, AuthProvider } from '../../auth.service';\nimport { ProviderRegistryService } from '../../provider-registry.service';\n\n@Component({\n selector: 'lib-login-dialog',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"login-dialog\">\n <h2 class=\"login-title\">Sign In</h2>\n\n <!-- Email/Password Form (if enabled) -->\n @if (isProviderEnabled('emailPassword')) {\n <form (ngSubmit)=\"onEmailLogin()\" class=\"email-form\">\n <div class=\"form-group\">\n <input\n [(ngModel)]=\"email\"\n name=\"email\"\n placeholder=\"Email\"\n type=\"email\"\n required\n class=\"form-control\">\n </div>\n <div class=\"form-group password-group\">\n <input\n [(ngModel)]=\"password\"\n name=\"password\"\n placeholder=\"Password\"\n [type]=\"showPassword ? 'text' : 'password'\"\n required\n class=\"form-control password-input\">\n <button\n type=\"button\"\n class=\"password-toggle\"\n (click)=\"showPassword = !showPassword\"\n [attr.aria-label]=\"showPassword ? 'Hide password' : 'Show password'\">\n {{ showPassword ? '👁️' : '👁️‍🗨️' }}\n </button>\n </div>\n <button\n type=\"submit\"\n [disabled]=\"loading\"\n class=\"btn btn-primary btn-block\">\n {{ loading ? 'Signing in...' : getProviderLabel('emailPassword') }}\n </button>\n </form>\n }\n\n <!-- Divider if both email and OAuth are present -->\n @if (isProviderEnabled('emailPassword') && oauthProviders.length > 0) {\n <div class=\"divider\">\n <span>OR</span>\n </div>\n }\n\n <!-- OAuth Providers -->\n @if (oauthProviders.length > 0) {\n <div class=\"oauth-buttons\">\n @for (provider of oauthProviders; track provider) {\n <button\n (click)=\"onOAuthLogin(provider)\"\n [disabled]=\"loading\"\n [class]=\"'btn btn-oauth ' + getProviderCssClass(provider)\"\n [ngStyle]=\"getProviderButtonStyle(provider)\">\n @if (getProviderIcon(provider)) {\n <span class=\"oauth-icon\">\n {{ getProviderIcon(provider) }}\n </span>\n }\n {{ getProviderLabel(provider) }}\n </button>\n }\n </div>\n }\n\n <!-- Error Message -->\n @if (error) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n\n <!-- Loading State -->\n @if (loading) {\n <div class=\"loading-overlay\">\n <div class=\"spinner\"></div>\n </div>\n }\n\n <!-- Register Link -->\n <div class=\"register-link\">\n Don't have an account?\n <a href=\"#\" (click)=\"onRegisterClick($event)\">Sign up</a>\n </div>\n </div>\n `,\n styles: [`\n .login-dialog {\n padding: 24px;\n max-width: 400px;\n position: relative;\n }\n\n .login-title {\n margin: 0 0 24px 0;\n font-size: 24px;\n font-weight: 500;\n text-align: center;\n }\n\n .email-form {\n margin-bottom: 16px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .password-group {\n position: relative;\n }\n\n .form-control {\n width: 100%;\n padding: 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n box-sizing: border-box;\n }\n\n .password-input {\n padding-right: 45px;\n }\n\n .password-toggle {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n cursor: pointer;\n font-size: 18px;\n padding: 8px;\n line-height: 1;\n opacity: 0.6;\n transition: opacity 0.2s;\n }\n\n .password-toggle:hover {\n opacity: 1;\n }\n\n .password-toggle:focus {\n outline: 2px solid #4285f4;\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n .form-control:focus {\n outline: none;\n border-color: #4285f4;\n }\n\n .btn {\n padding: 12px 24px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s;\n }\n\n .btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-block {\n width: 100%;\n }\n\n .btn-primary {\n background-color: #4285f4;\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background-color: #357ae8;\n }\n\n .divider {\n margin: 16px 0;\n text-align: center;\n position: relative;\n }\n\n .divider::before {\n content: '';\n position: absolute;\n top: 50%;\n left: 0;\n right: 0;\n height: 1px;\n background: #ddd;\n }\n\n .divider span {\n background: white;\n padding: 0 12px;\n position: relative;\n color: #666;\n font-size: 12px;\n }\n\n .oauth-buttons {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .btn-oauth {\n width: 100%;\n background: white;\n color: #333;\n border: 1px solid #ddd;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n\n .btn-oauth:hover:not(:disabled) {\n background: #f8f8f8;\n }\n\n .btn-google {\n border-color: #4285f4;\n }\n\n .btn-linkedin {\n border-color: #0077b5;\n }\n\n .btn-apple {\n border-color: #000;\n }\n\n .btn-microsoft {\n border-color: #00a4ef;\n }\n\n .btn-github {\n border-color: #333;\n }\n\n .oauth-icon {\n font-size: 18px;\n }\n\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fee;\n color: #c33;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #4285f4;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .register-link {\n margin-top: 16px;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n .register-link a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .register-link a:hover {\n text-decoration: underline;\n }\n `]\n})\nexport class LoginDialogComponent implements OnInit {\n /**\n * REQUIRED: Which authentication providers to show in this dialog\n * @example ['google', 'linkedin', 'emailPassword']\n */\n @Input() providers: AuthProvider[] = [];\n\n email = '';\n password = '';\n error = '';\n loading = false;\n showPassword = false;\n\n oauthProviders: AuthProvider[] = [];\n\n constructor(\n private auth: AuthService,\n private providerRegistry: ProviderRegistryService\n ) {}\n\n ngOnInit() {\n if (!this.providers || this.providers.length === 0) {\n this.error = 'Configuration Error: No authentication providers specified. Please pass providers to LoginDialogComponent.';\n throw new Error('LoginDialogComponent requires providers input. Example: dialogRef.componentInstance.providers = [\\'google\\', \\'emailPassword\\']');\n }\n\n // Get OAuth providers (excluding emailPassword)\n this.oauthProviders = this.providers\n .filter(p => p !== 'emailPassword');\n }\n\n isProviderEnabled(provider: AuthProvider): boolean {\n return this.providers.includes(provider);\n }\n\n getProviderLabel(provider: AuthProvider): string {\n return this.providerRegistry.getLabel(provider);\n }\n\n getProviderIcon(provider: AuthProvider): string | undefined {\n return this.providerRegistry.getIcon(provider);\n }\n\n getProviderCssClass(provider: AuthProvider): string {\n return this.providerRegistry.getCssClass(provider);\n }\n\n getProviderButtonStyle(provider: AuthProvider): Record<string, string> | null {\n return this.providerRegistry.getButtonStyle(provider);\n }\n\n async onEmailLogin() {\n if (!this.email || !this.password) {\n this.error = 'Please enter email and password';\n return;\n }\n\n this.loading = true;\n this.error = '';\n\n try {\n const result = await this.auth.loginWithEmail(this.email, this.password);\n if (!result.success) {\n this.error = result.message || 'Login failed';\n }\n // On success, parent component/dialog should close automatically via user$ subscription\n } catch (err) {\n this.error = 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n async onOAuthLogin(provider: AuthProvider) {\n this.loading = true;\n this.error = '';\n\n try {\n const result = await this.auth.loginWithProvider(provider);\n if (!result.success) {\n this.error = result.message || 'OAuth login failed';\n }\n // On success, parent component/dialog should close automatically via user$ subscription\n } catch (err) {\n this.error = 'An unexpected error occurred';\n } finally {\n this.loading = false;\n }\n }\n\n onRegisterClick(event: Event) {\n event.preventDefault();\n // Platforms can override this or listen for a custom event\n // For now, just emit a console message\n console.log('Register clicked - platform should handle navigation');\n }\n}\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { AuthService, AuthProvider } from '../../auth.service';\nimport { ProviderRegistryService } from '../../provider-registry.service';\n\nexport interface TenantCreatedEvent {\n user: { id?: string; email: string; display_name: string };\n}\n\nexport interface TenantRegisterRequestEvent {\n tenantName: string;\n tenantSlug: string;\n displayName?: string;\n email?: string;\n password?: string;\n provider: string;\n}\n\n@Component({\n selector: 'lib-tenant-register',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"tenant-register-dialog\">\n <h2 class=\"register-title\">{{ title }}</h2>\n\n <!-- Ownership Warning Message -->\n <div class=\"warning-box\">\n <div class=\"warning-icon\">⚠️</div>\n <div class=\"warning-content\">\n <strong>{{ ownershipTitle }}</strong>\n <p>{{ ownershipMessage }}</p>\n </div>\n </div>\n\n <form (ngSubmit)=\"onRegister()\" class=\"register-form\">\n <!-- Tenant Information Section -->\n <div class=\"section-header\">{{ tenantSectionTitle }}</div>\n\n <div class=\"form-group\">\n <label for=\"tenantName\">{{ tenantNameLabel }} *</label>\n <input\n id=\"tenantName\"\n [(ngModel)]=\"tenantName\"\n name=\"tenantName\"\n [placeholder]=\"tenantNamePlaceholder\"\n type=\"text\"\n required\n (input)=\"onTenantNameChange()\"\n class=\"form-control\">\n </div>\n\n <div class=\"form-group\">\n <label for=\"tenantSlug\">{{ tenantSlugLabel }} *</label>\n <input\n id=\"tenantSlug\"\n [(ngModel)]=\"tenantSlug\"\n name=\"tenantSlug\"\n [placeholder]=\"tenantSlugPlaceholder\"\n type=\"text\"\n required\n pattern=\"[a-z0-9-]+\"\n (blur)=\"checkSlugAvailability()\"\n class=\"form-control\"\n [class.input-error]=\"slugError\"\n [class.input-success]=\"slugAvailable && tenantSlug\">\n @if (tenantSlug && urlPreviewEnabled) {\n <small class=\"form-hint\">\n {{ urlPreviewPrefix }}{{ tenantSlug }}\n @if (checkingSlug) {\n <span class=\"checking\">Checking...</span>\n }\n @if (slugAvailable && !checkingSlug) {\n <span class=\"available\">✓ Available</span>\n }\n @if (slugError) {\n <span class=\"error-text\">{{ slugError }}</span>\n }\n </small>\n }\n </div>\n\n <!-- User Information Section -->\n <div class=\"section-header\">{{ userSectionTitle }}</div>\n\n <!-- OAuth Providers (Primary Option) -->\n @if (oauthProviders.length > 0 && !useEmailPassword) {\n <div class=\"oauth-section\">\n <p class=\"oauth-description\">{{ oauthDescription }}</p>\n <div class=\"oauth-buttons\">\n @for (provider of oauthProviders; track provider) {\n <button\n type=\"button\"\n (click)=\"onOAuthRegister(provider)\"\n [disabled]=\"loading || !isFormValid()\"\n [class]=\"'btn btn-oauth ' + getProviderCssClass(provider)\"\n [ngStyle]=\"getProviderButtonStyle(provider)\">\n @if (getProviderIcon(provider)) {\n <span class=\"oauth-icon\">\n {{ getProviderIcon(provider) }}\n </span>\n }\n {{ getProviderLabel(provider) }}\n </button>\n }\n </div>\n </div>\n\n <!-- Switch to Email/Password -->\n @if (isProviderEnabled('emailPassword')) {\n <div class=\"switch-method\">\n <a href=\"#\" (click)=\"toggleAuthMethod($event)\">\n {{ useEmailPassword ? 'Use OAuth instead' : 'Use email/password instead' }}\n </a>\n </div>\n }\n }\n\n <!-- Email/Password Form (Fallback or Manual Entry) -->\n @if (useEmailPassword || oauthProviders.length === 0) {\n <div class=\"form-group\">\n <label for=\"displayName\">Full Name *</label>\n <input\n id=\"displayName\"\n [(ngModel)]=\"displayName\"\n name=\"displayName\"\n placeholder=\"Enter your full name\"\n type=\"text\"\n required\n class=\"form-control\">\n </div>\n\n <div class=\"form-group\">\n <label for=\"email\">Email *</label>\n <input\n id=\"email\"\n [(ngModel)]=\"email\"\n name=\"email\"\n placeholder=\"Enter your email\"\n type=\"email\"\n required\n class=\"form-control\">\n </div>\n\n <div class=\"form-group password-group\">\n <label for=\"password\">Password *</label>\n <input\n id=\"password\"\n [(ngModel)]=\"password\"\n name=\"password\"\n placeholder=\"Create a password\"\n [type]=\"showPassword ? 'text' : 'password'\"\n required\n minlength=\"8\"\n class=\"form-control password-input\">\n <button\n type=\"button\"\n class=\"password-toggle\"\n (click)=\"showPassword = !showPassword\"\n [attr.aria-label]=\"showPassword ? 'Hide password' : 'Show password'\">\n {{ showPassword ? '👁️' : '👁️‍🗨️' }}\n </button>\n <small class=\"form-hint\">At least 8 characters</small>\n </div>\n\n <div class=\"form-group password-group\">\n <label for=\"confirmPassword\">Confirm Password *</label>\n <input\n id=\"confirmPassword\"\n [(ngModel)]=\"confirmPassword\"\n name=\"confirmPassword\"\n placeholder=\"Confirm your password\"\n [type]=\"showConfirmPassword ? 'text' : 'password'\"\n required\n class=\"form-control password-input\">\n <button\n type=\"button\"\n class=\"password-toggle\"\n (click)=\"showConfirmPassword = !showConfirmPassword\"\n [attr.aria-label]=\"showConfirmPassword ? 'Hide password' : 'Show password'\">\n {{ showConfirmPassword ? '👁️' : '👁️‍🗨️' }}\n </button>\n </div>\n\n <button\n type=\"submit\"\n [disabled]=\"loading || !isFormValid()\"\n class=\"btn btn-primary btn-block\">\n {{ loading ? 'Creating...' : submitButtonText }}\n </button>\n\n <!-- Switch to OAuth -->\n @if (oauthProviders.length > 0) {\n <div class=\"switch-method\">\n <a href=\"#\" (click)=\"toggleAuthMethod($event)\">\n Use OAuth instead\n </a>\n </div>\n }\n }\n </form>\n\n <!-- Error Message -->\n @if (error) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n\n <!-- Success Message -->\n @if (success) {\n <div class=\"success-message\">\n {{ success }}\n </div>\n }\n\n <!-- Loading Overlay -->\n @if (loading) {\n <div class=\"loading-overlay\">\n <div class=\"spinner\"></div>\n <p class=\"loading-text\">{{ loadingText }}</p>\n </div>\n }\n\n <!-- Login Link -->\n <div class=\"login-link\">\n {{ loginLinkText }}\n <a href=\"#\" (click)=\"onLoginClick($event)\">{{ loginLinkAction }}</a>\n </div>\n </div>\n `,\n styles: [`\n .tenant-register-dialog {\n padding: 24px;\n max-width: 500px;\n position: relative;\n }\n\n .register-title {\n margin: 0 0 20px 0;\n font-size: 24px;\n font-weight: 500;\n text-align: center;\n }\n\n .warning-box {\n display: flex;\n gap: 12px;\n padding: 16px;\n background: #fff3cd;\n border: 1px solid #ffc107;\n border-radius: 6px;\n margin-bottom: 24px;\n }\n\n .warning-icon {\n font-size: 24px;\n line-height: 1;\n }\n\n .warning-content {\n flex: 1;\n }\n\n .warning-content strong {\n display: block;\n margin-bottom: 4px;\n color: #856404;\n font-size: 14px;\n }\n\n .warning-content p {\n margin: 0;\n color: #856404;\n font-size: 13px;\n line-height: 1.5;\n }\n\n .section-header {\n font-size: 16px;\n font-weight: 600;\n margin: 20px 0 12px 0;\n padding-bottom: 8px;\n border-bottom: 2px solid #e0e0e0;\n color: #333;\n }\n\n .register-form {\n margin-bottom: 16px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .password-group {\n position: relative;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #333;\n }\n\n .form-control {\n width: 100%;\n padding: 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n box-sizing: border-box;\n transition: border-color 0.2s;\n }\n\n .password-input {\n padding-right: 45px;\n }\n\n .password-toggle {\n position: absolute;\n right: 8px;\n top: 38px;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 18px;\n padding: 8px;\n line-height: 1;\n opacity: 0.6;\n transition: opacity 0.2s;\n }\n\n .password-toggle:hover {\n opacity: 1;\n }\n\n .password-toggle:focus {\n outline: 2px solid #4285f4;\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n .form-control:focus {\n outline: none;\n border-color: #4285f4;\n }\n\n .form-control.input-error {\n border-color: #dc3545;\n }\n\n .form-control.input-success {\n border-color: #28a745;\n }\n\n .form-hint {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: #666;\n }\n\n .form-hint .checking {\n color: #666;\n }\n\n .form-hint .available {\n color: #28a745;\n font-weight: 500;\n }\n\n .form-hint .error-text {\n color: #dc3545;\n }\n\n .oauth-section {\n margin: 16px 0;\n }\n\n .oauth-description {\n margin-bottom: 12px;\n font-size: 14px;\n color: #666;\n text-align: center;\n }\n\n .oauth-buttons {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .btn {\n padding: 12px 24px;\n border: none;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 0.2s, opacity 0.2s;\n }\n\n .btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-block {\n width: 100%;\n }\n\n .btn-primary {\n background-color: #4285f4;\n color: white;\n }\n\n .btn-primary:hover:not(:disabled) {\n background-color: #357ae8;\n }\n\n .btn-oauth {\n width: 100%;\n background: white;\n color: #333;\n border: 1px solid #ddd;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n\n .btn-oauth:hover:not(:disabled) {\n background: #f8f8f8;\n }\n\n .btn-google {\n border-color: #4285f4;\n }\n\n .btn-linkedin {\n border-color: #0077b5;\n }\n\n .btn-apple {\n border-color: #000;\n }\n\n .btn-microsoft {\n border-color: #00a4ef;\n }\n\n .btn-github {\n border-color: #333;\n }\n\n .oauth-icon {\n font-size: 18px;\n }\n\n .switch-method {\n margin-top: 12px;\n text-align: center;\n font-size: 14px;\n }\n\n .switch-method a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .switch-method a:hover {\n text-decoration: underline;\n }\n\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fee;\n color: #c33;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .success-message {\n margin-top: 16px;\n padding: 12px;\n background: #efe;\n color: #3a3;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.95);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n }\n\n .spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #4285f4;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .loading-text {\n margin: 0;\n font-size: 14px;\n color: #666;\n }\n\n .login-link {\n margin-top: 16px;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n .login-link a {\n color: #4285f4;\n text-decoration: none;\n }\n\n .login-link a:hover {\n text-decoration: underline;\n }\n `]\n})\nexport class TenantRegisterComponent implements OnInit {\n // Component Configuration\n @Input() title: string = 'Create New Organization';\n @Input() providers: AuthProvider[] = ['google'];\n @Input() requireTenantName: boolean = true;\n\n // Tenant Labels\n @Input() tenantSectionTitle: string = 'Organization Information';\n @Input() tenantNameLabel: string = 'Organization Name';\n @Input() tenantNamePlaceholder: string = 'Enter your organization name';\n @Input() tenantSlugLabel: string = 'Organization URL';\n @Input() tenantSlugPlaceholder: string = 'organization-name';\n @Input() urlPreviewEnabled: boolean = true;\n @Input() urlPreviewPrefix: string = 'yourapp.com/';\n\n // User Labels\n @Input() userSectionTitle: string = 'Your Information';\n @Input() oauthDescription: string = 'Recommended: Sign up with your Google account';\n\n // Warning Message\n @Input() ownershipTitle: string = 'CREATING A NEW ORGANIZATION';\n @Input() ownershipMessage: string = 'You are registering as an organization owner. This will create a new organization that you will manage. If you are an employee, DO NOT use this form. Ask your organization owner to invite you, then use the Login page.';\n\n // Buttons and Links\n @Input() submitButtonText: string = 'Create Organization';\n @Input() loginLinkText: string = 'Already have an account?';\n @Input() loginLinkAction: string = 'Sign in';\n\n // Outputs\n @Output() tenantCreated = new EventEmitter<TenantCreatedEvent>();\n @Output() registerRequested = new EventEmitter<TenantRegisterRequestEvent>();\n @Output() navigateToLogin = new EventEmitter<void>();\n\n // Form Fields\n tenantName = '';\n tenantSlug = '';\n displayName = '';\n email = '';\n password = '';\n confirmPassword = '';\n\n // State\n error = '';\n success = '';\n loading = false;\n loadingText = 'Creating your organization...';\n checkingSlug = false;\n slugAvailable = false;\n slugError = '';\n useEmailPassword = false;\n oauthProviders: AuthProvider[] = [];\n showPassword = false;\n showConfirmPassword = false;\n\n constructor(\n private auth: AuthService,\n private providerRegistry: ProviderRegistryService\n ) {}\n\n ngOnInit() {\n if (!this.providers || this.providers.length === 0) {\n this.error = 'Configuration Error: No authentication providers specified.';\n throw new Error('TenantRegisterComponent requires providers input.');\n }\n\n this.oauthProviders = this.providers.filter(p => p !== 'emailPassword');\n\n // If only emailPassword is available, show it by default\n if (this.oauthProviders.length === 0 && this.isProviderEnabled('emailPassword')) {\n this.useEmailPassword = true;\n }\n }\n\n isProviderEnabled(provider: AuthProvider): boolean {\n return this.providers.includes(provider);\n }\n\n getProviderLabel(provider: AuthProvider): string {\n return this.providerRegistry.getSignupLabel(provider);\n }\n\n getProviderIcon(provider: AuthProvider): string | undefined {\n return this.providerRegistry.getIcon(provider);\n }\n\n getProviderCssClass(provider: AuthProvider): string {\n return this.providerRegistry.getCssClass(provider);\n }\n\n getProviderButtonStyle(provider: AuthProvider): Record<string, string> | null {\n return this.providerRegistry.getButtonStyle(provider);\n }\n\n onTenantNameChange() {\n // Auto-generate slug from tenant name\n if (this.tenantName) {\n const slug = this.tenantName\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n\n this.tenantSlug = slug;\n this.slugError = '';\n this.slugAvailable = false;\n }\n }\n\n async checkSlugAvailability() {\n if (!this.tenantSlug || this.tenantSlug.length < 3) {\n this.slugError = 'Slug must be at least 3 characters';\n return;\n }\n\n if (!/^[a-z0-9-]+$/.test(this.tenantSlug)) {\n this.slugError = 'Only lowercase letters, numbers, and hyphens allowed';\n return;\n }\n\n this.checkingSlug = true;\n this.slugError = '';\n\n try {\n const result = await this.auth.checkTenantSlugAvailable(this.tenantSlug);\n\n if (result.available) {\n this.slugAvailable = true;\n } else {\n this.slugError = 'This URL is already taken';\n if (result.suggestion) {\n this.slugError += `. Try: ${result.suggestion}`;\n }\n }\n } catch (err) {\n // Slug check failed, but don't block registration\n console.warn('Slug availability check failed:', err);\n } finally {\n this.checkingSlug = false;\n }\n }\n\n toggleAuthMethod(event: Event) {\n event.preventDefault();\n this.useEmailPassword = !this.useEmailPassword;\n this.error = '';\n }\n\n isFormValid(): boolean {\n // Tenant information must be valid\n if (!this.tenantName || !this.tenantSlug) {\n return false;\n }\n\n if (this.slugError) {\n return false;\n }\n\n // If using email/password, check those fields\n if (this.useEmailPassword) {\n if (!this.displayName || !this.email || !this.password || !this.confirmPassword) {\n return false;\n }\n\n if (this.password.length < 8) {\n return false;\n }\n\n if (this.password !== this.confirmPassword) {\n return false;\n }\n }\n\n return true;\n }\n\n onOAuthRegister(provider: AuthProvider) {\n if (!this.isFormValid()) {\n this.error = 'Please complete the organization information';\n return;\n }\n\n this.error = '';\n this.registerRequested.emit({\n tenantName: this.tenantName,\n tenantSlug: this.tenantSlug,\n provider: provider\n });\n }\n\n onRegister() {\n if (!this.isFormValid()) {\n this.error = 'Please fill in all required fields correctly';\n return;\n }\n\n this.error = '';\n this.success = '';\n this.registerRequested.emit({\n tenantName: this.tenantName,\n tenantSlug: this.tenantSlug,\n displayName: this.displayName,\n email: this.email,\n password: this.password,\n provider: 'emailPassword'\n });\n }\n\n /** Call from consuming component after handling registerRequested to show loading state */\n setLoading(loading: boolean, text?: string) {\n this.loading = loading;\n if (text) this.loadingText = text;\n }\n\n /** Call from consuming component to show success/error after handling registerRequested */\n setResult(result: { success: boolean; message?: string; user?: any }) {\n this.loading = false;\n if (result.success && result.user) {\n this.success = 'Organization created successfully!';\n this.tenantCreated.emit({ user: result.user });\n } else if (!result.success) {\n this.error = result.message || 'Registration failed';\n }\n }\n\n onLoginClick(event: Event) {\n event.preventDefault();\n this.navigateToLogin.emit();\n }\n}\n","import { Component, Inject, Optional } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TenantLoginComponent, TenantSelectedEvent } from './tenant-login.component';\nimport { AuthProvider } from '../../auth.service';\n\n/**\n * Dialog wrapper for TenantLoginComponent\n *\n * Usage with Angular Material Dialog:\n * ```typescript\n * const dialogRef = this.dialog.open(TenantLoginDialogComponent, {\n * width: '450px',\n * data: {\n * providers: ['google'],\n * showTenantSelector: true\n * }\n * });\n *\n * dialogRef.afterClosed().subscribe(result => {\n * if (result && result.tenantId) {\n * console.log('Logged in to tenant:', result.tenantSlug);\n * // Redirect to dashboard\n * }\n * });\n * ```\n *\n * Usage with custom dialog service:\n * ```typescript\n * const dialog = this.dialogService.open(TenantLoginDialogComponent, {\n * providers: ['google', 'emailPassword'],\n * autoSelectSingleTenant: true\n * });\n * ```\n */\n@Component({\n selector: 'lib-tenant-login-dialog',\n standalone: true,\n imports: [CommonModule, TenantLoginComponent],\n template: `\n <div class=\"dialog-wrapper\">\n <lib-tenant-login\n [title]=\"data?.title || 'Sign In'\"\n [providers]=\"data?.providers || ['google']\"\n [showTenantSelector]=\"data?.showTenantSelector !== false\"\n [autoSelectSingleTenant]=\"data?.autoSelectSingleTenant !== false\"\n [allowTenantCreation]=\"data?.allowTenantCreation !== false\"\n [tenantSelectorTitle]=\"data?.tenantSelectorTitle || 'Select Organization'\"\n [tenantSelectorDescription]=\"data?.tenantSelectorDescription || 'Choose which organization you want to access:'\"\n [continueButtonText]=\"data?.continueButtonText || 'Continue'\"\n [registerLinkText]=\"data?.registerLinkText || 'Don\\\\'t have an account?'\"\n [registerLinkAction]=\"data?.registerLinkAction || 'Sign up'\"\n [createTenantLinkText]=\"data?.createTenantLinkText || 'Don\\\\'t see your organization?'\"\n [createTenantLinkAction]=\"data?.createTenantLinkAction || 'Create New Organization'\"\n (tenantSelected)=\"onTenantSelected($event)\"\n (createTenant)=\"onCreateTenant()\">\n </lib-tenant-login>\n </div>\n `,\n styles: [`\n .dialog-wrapper {\n padding: 0;\n }\n `]\n})\nexport class TenantLoginDialogComponent {\n data: any;\n dialogRef: any;\n\n constructor(\n @Optional() @Inject('DIALOG_DATA') injectedData?: any,\n @Optional() @Inject('DIALOG_REF') injectedDialogRef?: any\n ) {\n // Support both Angular Material Dialog and custom dialog implementations\n this.data = injectedData || {};\n this.dialogRef = injectedDialogRef;\n }\n\n onTenantSelected(event: TenantSelectedEvent) {\n // Close dialog and return the selected tenant\n if (this.dialogRef && this.dialogRef.close) {\n this.dialogRef.close(event);\n }\n }\n\n onCreateTenant() {\n // Close dialog and signal that user wants to create a tenant\n if (this.dialogRef && this.dialogRef.close) {\n this.dialogRef.close({ action: 'create_tenant' });\n }\n }\n}\n","import { Component, Inject, Optional } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TenantRegisterComponent, TenantCreatedEvent } from './tenant-register.component';\nimport { AuthProvider } from '../../auth.service';\n\n/**\n * Dialog wrapper for TenantRegisterComponent\n *\n * Usage with Angular Material Dialog:\n * ```typescript\n * const dialogRef = this.dialog.open(TenantRegisterDialogComponent, {\n * width: '500px',\n * data: {\n * providers: ['google'],\n * tenantNameLabel: 'Store Name'\n * }\n * });\n *\n * dialogRef.afterClosed().subscribe(result => {\n * if (result && result.tenant) {\n * console.log('Tenant created:', result.tenant);\n * }\n * });\n * ```\n *\n * Usage with custom dialog service:\n * ```typescript\n * const dialog = this.dialogService.open(TenantRegisterDialogComponent, {\n * providers: ['google', 'emailPassword']\n * });\n * ```\n */\n@Component({\n selector: 'lib-tenant-register-dialog',\n standalone: true,\n imports: [CommonModule, TenantRegisterComponent],\n template: `\n <div class=\"dialog-wrapper\">\n <lib-tenant-register\n [title]=\"data?.title || 'Create New Organization'\"\n [providers]=\"data?.providers || ['google']\"\n [requireTenantName]=\"data?.requireTenantName !== false\"\n [tenantSectionTitle]=\"data?.tenantSectionTitle || 'Organization Information'\"\n [tenantNameLabel]=\"data?.tenantNameLabel || 'Organization Name'\"\n [tenantNamePlaceholder]=\"data?.tenantNamePlaceholder || 'Enter your organization name'\"\n [tenantSlugLabel]=\"data?.tenantSlugLabel || 'Organization URL'\"\n [tenantSlugPlaceholder]=\"data?.tenantSlugPlaceholder || 'organization-name'\"\n [urlPreviewEnabled]=\"data?.urlPreviewEnabled !== false\"\n [urlPreviewPrefix]=\"data?.urlPreviewPrefix || 'app.example.com/'\"\n [userSectionTitle]=\"data?.userSectionTitle || 'Your Information'\"\n [oauthDescription]=\"data?.oauthDescription || 'Recommended: Sign up with your Google account'\"\n [ownershipTitle]=\"data?.ownershipTitle || 'CREATING A NEW ORGANIZATION'\"\n [ownershipMessage]=\"data?.ownershipMessage || 'You are registering as an organization owner. If you are an employee, use Login instead.'\"\n [submitButtonText]=\"data?.submitButtonText || 'Create Organization'\"\n [loginLinkText]=\"data?.loginLinkText || 'Already have an account?'\"\n [loginLinkAction]=\"data?.loginLinkAction || 'Sign in'\"\n (tenantCreated)=\"onTenantCreated($event)\"\n (navigateToLogin)=\"onNavigateToLogin()\">\n </lib-tenant-register>\n </div>\n `,\n styles: [`\n .dialog-wrapper {\n padding: 0;\n }\n `]\n})\nexport class TenantRegisterDialogComponent {\n data: any;\n dialogRef: any;\n\n constructor(\n @Optional() @Inject('DIALOG_DATA') injectedData?: any,\n @Optional() @Inject('DIALOG_REF') injectedDialogRef?: any\n ) {\n // Support both Angular Material Dialog and custom dialog implementations\n this.data = injectedData || {};\n this.dialogRef = injectedDialogRef;\n }\n\n onTenantCreated(event: TenantCreatedEvent) {\n // Close dialog and return the created tenant\n if (this.dialogRef && this.dialogRef.close) {\n this.dialogRef.close(event);\n }\n }\n\n onNavigateToLogin() {\n // Close dialog without result (user wants to login instead)\n if (this.dialogRef && this.dialogRef.close) {\n this.dialogRef.close({ action: 'navigate_to_login' });\n }\n }\n}\n","/*\n * Public API Surface of ngx-stonescriptphp-client\n */\n\n// ── Core setup ────────────────────────────────────────────────────────────────\nexport * from './provide'; // provideNgxStoneScriptPhpClient()\nexport * from './auth.plugin'; // AuthPlugin, AUTH_PLUGIN, AuthResult, User, ...\n\n// ── Auth plugins ─────────────────────────────────────────────────────────────\nexport * from './plugins/stonescriptphp-auth.plugin'; // StoneScriptPHPAuth, StoneScriptPHPAuthConfig\nexport * from './plugins/progalaxyelabs-auth.plugin'; // ProgalaxyElabsAuth, ProgalaxyElabsAuthConfig\n\n// ── Services ──────────────────────────────────────────────────────────────────\nexport * from './api-connection.service';\nexport * from './auth.service';\nexport * from './db.service';\nexport * from './signin-status.service';\nexport * from './token.service';\nexport * from './csrf.service';\nexport * from './files.service';\nexport * from './provider-registry.service';\n\n// ── Models ────────────────────────────────────────────────────────────────────\nexport * from './api-response.model';\nexport * from './my-environment.model';\nexport * from './files.model';\n\n// ── UI Components - Embeddable (standalone components) ────────────────────────\nexport * from './lib/components/auth-page.component';\nexport * from './lib/components/login-dialog.component';\nexport * from './lib/components/register.component';\nexport * from './lib/components/tenant-login.component';\nexport * from './lib/components/tenant-register.component';\n\n// ── UI Components - Dialog/Modal wrappers ─────────────────────────────────────\nexport * from './lib/components/tenant-login-dialog.component';\nexport * from './lib/components/tenant-register-dialog.component';\n\n// ── Re-export types for convenience ──────────────────────────────────────────\nexport type { OAuthProviderConfig } from './my-environment.model';\nexport { VerifyStatus } from './signin-status.service';\n\n// ── Multi-tenant types ────────────────────────────────────────────────────────\nexport type { TenantSelectedEvent, OnboardingNeededEvent } from './lib/components/tenant-login.component';\nexport type { TenantCreatedEvent, TenantRegisterRequestEvent } from './lib/components/tenant-register.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.TokenService","i2.SigninStatusService","i3.MyEnvironmentModel","i4.AuthService","i4.CsrfService","i1.AuthService","i2.ProviderRegistryService","i3"],"mappings":"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"}