@mohamedatia/fly-design-system 1.5.0 → 1.9.0
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.
- package/fesm2022/mohamedatia-fly-design-system.mjs +705 -16
- package/fesm2022/mohamedatia-fly-design-system.mjs.map +1 -1
- package/package.json +6 -5
- package/scss/_fly-theme.scss +2 -2
- package/scss/_theme-auto.scss +4 -3
- package/scss/_theme-dark.scss +77 -4
- package/scss/_theme-light.scss +11 -3
- package/scss/_theme-spatial-vars.scss +66 -0
- package/scss/_theme-spatial.scss +22 -0
- package/types/mohamedatia-fly-design-system.d.ts +201 -8
- package/types/mohamedatia-fly-design-system.d.ts.map +1 -1
- package/scss/_theme-dark-vars.scss +0 -57
- package/scss/_theme-transparent.scss +0 -41
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mohamedatia-fly-design-system.mjs","sources":["../../../projects/design-system/src/lib/models/window.model.ts","../../../projects/design-system/src/lib/services/auth.service.ts","../../../projects/design-system/src/lib/services/i18n.service.ts","../../../projects/design-system/src/lib/services/fly-theme.service.ts","../../../projects/design-system/src/lib/services/window-manager.service.ts","../../../projects/design-system/src/lib/pipes/translate.pipe.ts","../../../projects/design-system/src/lib/services/auth.service.mock.ts","../../../projects/design-system/src/lib/components/context-menu/context-menu.component.ts","../../../projects/design-system/src/lib/components/context-menu/context-menu.component.html","../../../projects/design-system/src/lib/components/message-box/message-box.service.ts","../../../projects/design-system/src/lib/components/message-box/message-box.component.ts","../../../projects/design-system/src/lib/components/message-box/message-box.component.html","../../../projects/design-system/src/lib/components/share-panel/share-panel.component.ts","../../../projects/design-system/src/lib/components/share-panel/share-panel.component.html","../../../projects/design-system/src/public-api.ts","../../../projects/design-system/src/mohamedatia-fly-design-system.ts"],"sourcesContent":["import { InjectionToken, Type } from '@angular/core';\r\n\r\nexport type WindowState = 'normal' | 'minimized' | 'maximized';\r\n\r\nexport interface ChildWindowData {\r\n childComponent: Type<unknown>;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface WindowInstance {\r\n id: string;\r\n appId: string;\r\n title: string;\r\n icon: string;\r\n iconBg: string;\r\n state: WindowState;\r\n position: { x: number; y: number };\r\n size: { width: number; height: number };\r\n zIndex: number;\r\n isFocused: boolean;\r\n isClosing?: boolean;\r\n isMinimizing?: boolean;\r\n isRestoring?: boolean;\r\n isMaximizing?: boolean;\r\n isUnmaximizing?: boolean;\r\n parentWindowId?: string;\r\n childData?: ChildWindowData;\r\n /** Populated when remote `loadComponent()` fails (e.g. federation). */\r\n remoteLoadError?: string;\r\n}\r\n\r\nexport const WINDOW_DATA = new InjectionToken<WindowInstance>('WINDOW_DATA');\r\n","import { Injectable, computed, signal } from '@angular/core';\nimport { User } from '../models/user.model';\n\ninterface AuthSession {\n user: User;\n accessToken: string;\n expiresAt: number;\n}\n\n/**\n * Shared AuthService for Business Apps.\n *\n * This is a **read-only signal store** — Business Apps inject it to read the\n * current user and access token. The FlyOS shell populates it after PKCE login\n * and silent refresh. Business Apps must never call setSession() directly.\n *\n * When running as a Module Federation remote, the shell and the Business App\n * share this singleton via the `@mohamedatia/fly-design-system` shared mapping\n * in federation.config.js — so the shell's populated instance is the same\n * object the Business App reads.\n *\n * When running standalone (without the shell), call initFromToken() with a\n * JWT stored in localStorage to hydrate the user.\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthService {\n private _session = signal<AuthSession | null>(null);\n\n readonly currentUser = computed(() => this._session()?.user ?? null);\n readonly accessToken = computed(() => this._session()?.accessToken ?? null);\n readonly isAuthenticated = computed(() => {\n const s = this._session();\n return s !== null && s.expiresAt > Date.now();\n });\n\n /**\n * No-op when running as a Module Federation remote — the shell has already\n * initialised the session before the remote bootstraps. Business Apps call\n * this in their APP_INITIALIZER so the same code works in both standalone\n * and embedded modes without branching.\n */\n async init(): Promise<void> {}\n\n /**\n * Called by the shell after a successful login or silent refresh.\n * Business Apps should not call this directly.\n */\n setSession(user: User, accessToken: string, expiresAt: number): void {\n this._session.set({ user, accessToken, expiresAt });\n }\n\n /** Clears the in-memory session (called by the shell on logout). */\n clearSession(): void {\n this._session.set(null);\n }\n\n /**\n * Standalone mode: parse a JWT from localStorage and hydrate the user.\n * Pass the storage key your app uses; embedded remotes typically set this in `APP_INITIALIZER`.\n */\n initFromToken(storageKey = 'circles_token'): void {\n const token = localStorage.getItem(storageKey);\n if (!token) return;\n try {\n const base64 = token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/');\n const payload = JSON.parse(decodeURIComponent(\n atob(base64).split('').map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join('')\n )) as Record<string, unknown>;\n\n const rawRole = payload['role'];\n const roles = Array.isArray(rawRole) ? rawRole as string[] : rawRole ? [rawRole as string] : [];\n const rawApps = payload['apps'];\n const apps = Array.isArray(rawApps) ? rawApps as string[] : rawApps ? [rawApps as string] : [];\n const name = (payload['name'] as string) ?? '';\n const nameParts = name.split(' ');\n\n const user: User = {\n id: (payload['sub'] as string) ?? '',\n tenantId: (payload['tenant_id'] as string) ?? (payload['tid'] as string) ?? null,\n email: (payload['email'] as string) ?? '',\n fullName: name,\n firstName: nameParts[0] ?? '',\n lastName: nameParts.slice(1).join(' '),\n preferredLocale: (payload['locale'] as string) ?? 'en',\n roles,\n apps,\n ou: payload['ou'] as string | undefined,\n };\n\n const expiresAt = ((payload['exp'] as number) ?? 0) * 1000;\n this.setSession(user, token, expiresAt);\n } catch {\n // Invalid token — stay unauthenticated\n }\n }\n}\n","import { Injectable, computed, signal, inject, ErrorHandler } from '@angular/core';\n\n/** Locales that use RTL layout for `dir` and DS `isRtl` / `direction`. */\nexport const RTL_LOCALE_SET: ReadonlySet<string> = new Set(['ar', 'ur']);\n\nexport function isRtlLocale(lang: string): boolean {\n return RTL_LOCALE_SET.has(lang);\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/** Accepts flat or nested JSON objects; nested keys become dot paths. Rejects arrays and non-string leaves. */\nfunction normalizeLocaleJson(raw: unknown): Record<string, string> {\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n throw new Error('Locale bundle must be a JSON object');\n }\n const out: Record<string, string> = {};\n const walk = (obj: Record<string, unknown>, prefix: string): void => {\n for (const [k, v] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${k}` : k;\n if (typeof v === 'string') {\n out[path] = v;\n } else if (v !== null && typeof v === 'object' && !Array.isArray(v)) {\n walk(v as Record<string, unknown>, path);\n } else {\n throw new Error(`Locale bundle invalid value at \"${path}\" (expected string or nested object)`);\n }\n }\n };\n walk(raw as Record<string, unknown>, '');\n return out;\n}\n\n/** Options for loading a remote or standalone locale JSON bundle. */\nexport interface LoadBundleOptions {\n /** Stable id (e.g. app id from manifest); later loads replace this bundle only. */\n id: string;\n /** Base URL ending with `/`, e.g. `https://app.example.com/locale/` or `/my-remote/locale/` */\n baseUrl: string;\n lang: string;\n /** When aborted, failures are ignored (e.g. superseded language load). */\n signal?: AbortSignal;\n /**\n * When true, fetch/parse failures are not reported via Angular `ErrorHandler`.\n * Use for optional remote locale bundles (e.g. federated apps that may be offline).\n */\n silent?: boolean;\n}\n\n/**\n * Shared I18nService for the shell and Business Apps.\n *\n * **Merge order** (later keys win): shell layer → remote bundles in registration order.\n *\n * - Shell: `setShellTranslations()` after loading `locale/{lang}.json` and API overrides.\n * - Remotes: `loadBundle()` per manifest `localeBaseUrl`.\n */\n@Injectable({ providedIn: 'root' })\nexport class I18nService {\n private readonly errorHandler = inject(ErrorHandler, { optional: true });\n\n private readonly _shell = signal<Record<string, string>>({});\n private readonly _bundles = signal<Record<string, Record<string, string>>>({});\n private readonly _bundleOrder = signal<string[]>([]);\n private readonly _locale = signal<string>('en');\n private readonly _version = signal(0);\n\n private readonly _merged = computed(() => {\n const shell = this._shell();\n const order = this._bundleOrder();\n const bundles = this._bundles();\n let out: Record<string, string> = { ...shell };\n for (const id of order) {\n const b = bundles[id];\n if (b) out = { ...out, ...b };\n }\n return out;\n });\n\n readonly locale = this._locale.asReadonly();\n readonly version = this._version.asReadonly();\n readonly isRtl = computed(() => isRtlLocale(this._locale()));\n readonly direction = computed(() => (isRtlLocale(this._locale()) ? 'rtl' : 'ltr'));\n\n private bump(): void {\n this._version.update((v) => v + 1);\n }\n\n /** Replace shell strings (desktop `locale/*.json` + `/api/i18n/desktop-shell/{lang}` merged by the shell). */\n setShellTranslations(data: Record<string, string>, lang: string): void {\n this._shell.set(data);\n this._locale.set(lang);\n this.bump();\n }\n\n setLanguage(lang: string): void {\n this._locale.set(lang);\n this.bump();\n }\n\n /**\n * Fetch `{baseUrl}{lang}.json` and store under `id`. New ids are appended to the merge order.\n * @returns whether the bundle was loaded successfully.\n */\n async loadBundle(opts: LoadBundleOptions): Promise<boolean> {\n const { id, baseUrl, lang, signal: abortSignal, silent } = opts;\n try {\n const base = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;\n const url = `${base}${lang}.json`;\n const resp = await fetch(url, { signal: abortSignal });\n if (!resp.ok) throw new Error(`HTTP ${resp.status}`);\n const data = normalizeLocaleJson(await resp.json());\n if (abortSignal?.aborted) return false;\n this._bundles.update((b) => ({ ...b, [id]: data }));\n this._bundleOrder.update((order) => (order.includes(id) ? order : [...order, id]));\n this._locale.set(lang);\n this.bump();\n return true;\n } catch (e) {\n if (abortSignal?.aborted) return false;\n if (!silent) this.errorHandler?.handleError(e);\n return false;\n }\n }\n\n removeBundle(id: string): void {\n this._bundles.update((b) => {\n const next = { ...b };\n delete next[id];\n return next;\n });\n this._bundleOrder.update((order) => order.filter((x) => x !== id));\n this.bump();\n }\n\n clearRemoteBundles(): void {\n this._bundles.set({});\n this._bundleOrder.set([]);\n this.bump();\n }\n\n t(key: string, params?: Record<string, string | number>): string {\n const val = this._merged()[key] ?? key;\n if (!params) return val;\n return Object.entries(params).reduce((result, [k, v]) => {\n const safe = escapeRegExp(k);\n return result.replace(new RegExp(`{{\\\\s*${safe}\\\\s*}}`, 'g'), String(v));\n }, val);\n }\n}\n","import { Injectable, signal } from '@angular/core';\n\nexport type FlyThemeMode = 'light' | 'dark' | 'transparent';\n\n/**\n * Applies `html.light-theme` / `html.dark-theme` / `html.transparent-theme` for DS SCSS.\n * Shell and standalone Business Apps use the same service (federation singleton when shared).\n */\n@Injectable({ providedIn: 'root' })\nexport class FlyThemeService {\n readonly theme = signal<FlyThemeMode>('light');\n\n applyTheme(mode: FlyThemeMode): void {\n this.theme.set(mode);\n const html = document.documentElement;\n html.classList.remove('dark-theme', 'light-theme', 'transparent-theme');\n if (mode === 'dark') {\n html.classList.add('dark-theme');\n } else if (mode === 'transparent') {\n html.classList.add('transparent-theme');\n } else {\n html.classList.add('light-theme');\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\n/** Options for opening a child window. */\nexport interface OpenWindowOptions {\n /** Unique identifier for the window instance. */\n windowId: string;\n /** Display title shown in the window chrome. */\n title: string;\n /** Route path or URL to load inside the window. */\n route: string;\n /** Initial width in pixels. Defaults to 900. */\n width?: number;\n /** Initial height in pixels. Defaults to 600. */\n height?: number;\n /** Whether the window can be resized. Defaults to true. */\n resizable?: boolean;\n /** Whether the window can be maximised. Defaults to true. */\n maximizable?: boolean;\n /** Arbitrary data passed to the child window via WINDOW_DATA. */\n data?: unknown;\n}\n\n/**\n * Abstract interface for the WindowManager.\n * The FlyOS shell provides the concrete implementation; Business Apps\n * inject this token to open, close, and focus windows without depending\n * on the shell's internal implementation.\n */\nexport abstract class WindowManagerService {\n abstract openChildWindow(options: OpenWindowOptions): void;\n abstract closeWindow(windowId: string): void;\n abstract focusWindow(windowId: string): void;\n}\n\n/**\n * No-op fallback implementation used when running a Business App in\n * standalone mode (outside the FlyOS shell). Logs a warning instead of\n * throwing so standalone dev/test flows are not broken.\n */\n@Injectable()\nexport class StandaloneWindowManagerService extends WindowManagerService {\n openChildWindow(options: OpenWindowOptions): void {\n console.warn('[WindowManagerService] openChildWindow called in standalone mode — no shell available.', options);\n }\n\n closeWindow(windowId: string): void {\n console.warn('[WindowManagerService] closeWindow called in standalone mode — no shell available.', windowId);\n }\n\n focusWindow(windowId: string): void {\n console.warn('[WindowManagerService] focusWindow called in standalone mode — no shell available.', windowId);\n }\n}\n\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { I18nService } from '../services/i18n.service';\n\n/**\n * Translates a key using the shared I18nService.\n *\n * @example\n * {{ 'myApp.section.title' | translate }}\n * {{ 'myApp.items_count' | translate:{ n: count() } }}\n */\n@Pipe({\n name: 'translate',\n standalone: true,\n pure: false,\n})\nexport class TranslatePipe implements PipeTransform {\n private readonly i18n = inject(I18nService);\n\n transform(key: string, params?: Record<string, string | number>): string {\n // Read version so template CD re-runs when bundles load (merged translations updated).\n void this.i18n.version();\n return this.i18n.t(key, params);\n }\n}\n","import { Injectable, Signal, computed, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Observable, of } from 'rxjs';\nimport { User } from '../models/user.model';\n\nexport interface MockAuthConfig {\n user: User;\n token?: string;\n loginRedirect?: string[];\n logoutRedirect?: string[];\n}\n\ninterface MockSession {\n accessToken: string;\n user: User;\n expiresAt: number;\n}\n\n/**\n * Shared mock AuthService base class for Business App developers.\n *\n * Extend this class in your app's `auth.service.mock.ts` and override\n * `getConfig()` to supply app-specific mock user data and navigation paths.\n * The subclass must be decorated with `@Injectable({ providedIn: 'root' })`\n * and exported as `AuthService` so Angular's `fileReplacements` swap works.\n *\n * @example\n * ```typescript\n * // src/app/core/services/auth.service.mock.ts\n * import { Injectable } from '@angular/core';\n * import { MockAuthService, type MockAuthConfig } from '@mohamedatia/fly-design-system';\n *\n * @Injectable({ providedIn: 'root' })\n * export class AuthService extends MockAuthService {\n * protected override getConfig(): MockAuthConfig {\n * return {\n * user: { id: 'dev-001', tenantId: 'dev-tenant', email: 'dev@example.com',\n * firstName: 'Dev', lastName: 'User', fullName: 'Dev User',\n * preferredLocale: 'en', roles: ['admin'], apps: ['my-app'] },\n * token: 'my-mock-token',\n * loginRedirect: ['/app'],\n * };\n * }\n * }\n * ```\n */\n@Injectable()\nexport class MockAuthService {\n private readonly router = inject(Router);\n\n protected readonly _session: ReturnType<typeof signal<MockSession | null>>;\n\n private readonly _config: MockAuthConfig;\n\n readonly isAuthenticated: Signal<boolean>;\n readonly currentUser: Signal<User | null>;\n readonly accessToken: Signal<string | null>;\n /** Always false in mock mode — 2FA is handled entirely by the STS. */\n readonly hasPendingTwoFactor: Signal<boolean>;\n /** Always false in mock mode — auth is pre-populated synchronously. */\n readonly initializing: Signal<boolean>;\n\n constructor() {\n // All signal/computed calls are inside the constructor body so Angular's\n // injection context and ngDevMode are fully set up before they execute.\n this._config = this.getConfig();\n\n this._session = signal<MockSession | null>({\n accessToken: this._config.token ?? 'mock-token',\n user: this._config.user,\n expiresAt: Date.now() + 24 * 60 * 60 * 1000,\n });\n\n this.isAuthenticated = computed(() => {\n const s = this._session();\n return s !== null && s.expiresAt > Date.now();\n });\n\n this.currentUser = computed(() => this._session()?.user ?? null);\n this.accessToken = computed(() => this._session()?.accessToken ?? null);\n this.hasPendingTwoFactor = computed(() => false);\n this.initializing = signal(false).asReadonly();\n }\n\n /** Override in subclass to supply app-specific mock data. */\n protected getConfig(): MockAuthConfig {\n return {\n user: {\n id: 'mock-user-001',\n tenantId: 'mock-tenant-001',\n email: 'developer@fly.local',\n firstName: 'UI',\n lastName: 'Developer',\n fullName: 'UI Developer',\n preferredLocale: 'en',\n roles: ['admin'],\n apps: [],\n },\n };\n }\n\n async init(): Promise<void> {\n // Mock mode: already authenticated, nothing to initialize.\n }\n\n startLogin(): void {\n this.router.navigate(this._config.loginRedirect ?? ['/']);\n }\n\n handleCallback(_code: string, _state?: string): Observable<User> {\n return of(this._config.user);\n }\n\n async forceRefresh(): Promise<void> {\n // No-op in mock mode — token never expires.\n }\n\n patchSessionPreferredLocale(locale: string): void {\n const session = this._session();\n if (!session?.user) return;\n this._session.set({ ...session, user: { ...session.user, preferredLocale: locale } });\n }\n\n /** Parameter order matches the real AuthService: (user, accessToken, expiresAt). */\n setSession(_user: User, _accessToken: string, _expiresAt: number): void {\n // No-op in mock mode — session is hardcoded.\n }\n\n logout(): void {\n this._session.set(null);\n this.router.navigate(this._config.logoutRedirect ?? ['/']);\n }\n}\n","import {\n Component, input, output, HostListener, ViewChild, ElementRef,\n computed, signal, AfterViewInit, OnDestroy, ChangeDetectionStrategy, inject, DOCUMENT,\n} from '@angular/core';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\n\nexport interface ContextMenuItem {\n id: string;\n label: string;\n icon: string;\n}\n\nexport interface ContextMenuSection {\n label?: string;\n items: ContextMenuItem[];\n}\n\n@Component({\n selector: 'fly-context-menu',\n standalone: true,\n imports: [TranslatePipe],\n templateUrl: './context-menu.component.html',\n styleUrl: './context-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ContextMenuComponent implements AfterViewInit, OnDestroy {\n @ViewChild('contextMenu') private menuEl?: ElementRef<HTMLElement>;\n\n private readonly doc = inject(DOCUMENT);\n private readonly hostEl = inject(ElementRef<HTMLElement>);\n\n x = input.required<number>();\n y = input.required<number>();\n sections = input.required<ContextMenuSection[]>();\n action = output<string>();\n closed = output<void>();\n\n private menuWidth = signal(0);\n private menuHeight = signal(0);\n\n private previouslyFocused: Element | null = null;\n\n // Resolved position: clamp to viewport so the menu never overflows an edge.\n // menuWidth/Height start at 0 so the first render places the menu at (x,y)\n // with no clamping; ngAfterViewInit measures the real size and updates the\n // signals, which re-evaluates this computed and repositions correctly.\n clampedPos = computed(() => {\n const vw = this.doc.defaultView?.innerWidth ?? 0;\n const vh = this.doc.defaultView?.innerHeight ?? 0;\n const w = this.menuWidth();\n const h = this.menuHeight();\n const x = this.x();\n const y = this.y();\n return {\n left: w > 0 ? Math.min(x, vw - w - 8) : x,\n top: h > 0 ? Math.min(y, vh - h - 8) : y,\n };\n });\n\n ngAfterViewInit(): void {\n // Portal: move host to <body> so position:fixed resolves against the true\n // viewport, not against any transformed/backdrop-filtered ancestor window.\n this.doc.body.appendChild(this.hostEl.nativeElement);\n\n // Measure after portal move so offsetWidth/Height are accurate.\n const el = this.menuEl?.nativeElement;\n if (el) {\n this.menuWidth.set(el.offsetWidth);\n this.menuHeight.set(el.offsetHeight);\n }\n\n this.previouslyFocused = document.activeElement;\n this.focusItem(0);\n }\n\n ngOnDestroy(): void {\n const el = this.hostEl.nativeElement;\n if (el.parentNode === this.doc.body) {\n this.doc.body.removeChild(el);\n }\n }\n\n onAction(id: string): void {\n this.action.emit(id);\n this.close();\n }\n\n @HostListener('document:mousedown', ['$event'])\n onClickOutside(event: MouseEvent): void {\n if (!this.menuEl?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n this.close();\n }\n\n @HostListener('document:contextmenu', ['$event'])\n onContextMenu(event: MouseEvent): void {\n if (!this.menuEl?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n @HostListener('keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n const items = this.getMenuItems();\n if (!items.length) return;\n const focused = document.activeElement as HTMLElement;\n const idx = items.indexOf(focused);\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.focusItem(idx < items.length - 1 ? idx + 1 : 0);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.focusItem(idx > 0 ? idx - 1 : items.length - 1);\n } else if (event.key === 'Home') {\n event.preventDefault();\n this.focusItem(0);\n } else if (event.key === 'End') {\n event.preventDefault();\n this.focusItem(items.length - 1);\n }\n }\n\n private close(): void {\n this.restoreFocus();\n this.closed.emit();\n }\n\n private getMenuItems(): HTMLElement[] {\n return Array.from(\n this.menuEl?.nativeElement.querySelectorAll<HTMLElement>('[role=\"menuitem\"]') ?? [],\n );\n }\n\n private focusItem(index: number): void {\n const items = this.getMenuItems();\n items[index]?.focus();\n }\n\n private restoreFocus(): void {\n if (this.previouslyFocused instanceof HTMLElement) {\n this.previouslyFocused.focus();\n }\n this.previouslyFocused = null;\n }\n}\n","<div\n #contextMenu\n class=\"context-menu\"\n [style.left.px]=\"clampedPos().left\"\n [style.top.px]=\"clampedPos().top\"\n role=\"menu\"\n [attr.aria-label]=\"'shell.context_menu' | translate\">\n\n @for (section of sections(); track $index) {\n @if ($index > 0) {\n <div class=\"menu-divider\"></div>\n }\n @if (section.label) {\n <div class=\"menu-section-label\">{{ section.label }}</div>\n }\n @for (item of section.items; track item.id) {\n <button\n type=\"button\"\n class=\"vos-btn sm rect menu-item\"\n role=\"menuitem\"\n (click)=\"onAction(item.id)\">\n <i [class]=\"'pi ' + item.icon\" aria-hidden=\"true\"></i>\n <span>{{ item.label }}</span>\n </button>\n }\n }\n</div>\n","import { Injectable, inject, signal } from '@angular/core';\nimport { I18nService } from '../../services/i18n.service';\n\nexport enum MessageBoxButtons {\n OK,\n OKCancel,\n YesNo,\n YesNoCancel,\n RetryCancel,\n AbortRetryIgnore,\n}\n\nexport enum MessageBoxIcon {\n None,\n Information,\n Warning,\n Error,\n Question,\n}\n\nexport enum DialogResult {\n None,\n OK,\n Cancel,\n Yes,\n No,\n Retry,\n Abort,\n Ignore,\n}\n\nexport interface MessageBoxOptions {\n title: string;\n message: string;\n buttons?: MessageBoxButtons;\n icon?: MessageBoxIcon;\n}\n\nexport interface MessageBoxButton {\n label: string;\n result: DialogResult;\n variant?: 'primary' | 'danger' | 'default';\n}\n\n@Injectable({ providedIn: 'root' })\nexport class MessageBoxService {\n private readonly i18n = inject(I18nService);\n\n readonly visible = signal(false);\n readonly title = signal('');\n readonly message = signal('');\n readonly icon = signal<MessageBoxIcon>(MessageBoxIcon.None);\n readonly buttons = signal<MessageBoxButton[]>([]);\n\n private resolver: ((value: DialogResult) => void) | null = null;\n\n show(options: MessageBoxOptions): Promise<DialogResult> {\n // Dismiss any pending dialog so its Promise resolves rather than leaking\n if (this.resolver) {\n this.resolver(DialogResult.None);\n this.resolver = null;\n }\n\n this.title.set(options.title);\n this.message.set(options.message);\n this.icon.set(options.icon ?? MessageBoxIcon.None);\n this.buttons.set(this.resolveButtons(options.buttons ?? MessageBoxButtons.OK));\n this.visible.set(true);\n\n return new Promise<DialogResult>((resolve) => {\n this.resolver = resolve;\n });\n }\n\n resolve(result: DialogResult): void {\n this.visible.set(false);\n if (this.resolver) {\n this.resolver(result);\n this.resolver = null;\n }\n }\n\n private resolveButtons(buttons: MessageBoxButtons): MessageBoxButton[] {\n const t = (key: string) => this.i18n.t(key);\n switch (buttons) {\n case MessageBoxButtons.OK:\n return [{ label: t('common.ok'), result: DialogResult.OK, variant: 'primary' }];\n\n case MessageBoxButtons.OKCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.ok'), result: DialogResult.OK, variant: 'primary' },\n ];\n\n case MessageBoxButtons.YesNo:\n return [\n { label: t('common.no'), result: DialogResult.No, variant: 'default' },\n { label: t('common.yes'), result: DialogResult.Yes, variant: 'primary' },\n ];\n\n case MessageBoxButtons.YesNoCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.no'), result: DialogResult.No, variant: 'default' },\n { label: t('common.yes'), result: DialogResult.Yes, variant: 'primary' },\n ];\n\n case MessageBoxButtons.RetryCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.retry'), result: DialogResult.Retry, variant: 'primary' },\n ];\n\n case MessageBoxButtons.AbortRetryIgnore:\n return [\n { label: t('common.abort'), result: DialogResult.Abort, variant: 'danger' },\n { label: t('common.retry'), result: DialogResult.Retry, variant: 'default' },\n { label: t('common.ignore'), result: DialogResult.Ignore, variant: 'default' },\n ];\n }\n }\n}\n","import {\n Component, inject, ChangeDetectionStrategy,\n HostListener, ElementRef, AfterViewInit,\n} from '@angular/core';\nimport { MessageBoxService, MessageBoxIcon, DialogResult } from './message-box.service';\n\n@Component({\n selector: 'fly-message-box',\n standalone: true,\n templateUrl: './message-box.component.html',\n styleUrl: './message-box.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MessageBoxComponent implements AfterViewInit {\n service = inject(MessageBoxService);\n private elRef = inject(ElementRef);\n\n readonly MessageBoxIcon = MessageBoxIcon;\n readonly DialogResult = DialogResult;\n\n private previouslyFocused: Element | null = null;\n\n ngAfterViewInit(): void {\n // Store focus origin so we can restore it on close\n this.previouslyFocused = document.activeElement;\n this.focusPrimaryButton();\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.service.visible()) {\n this.service.resolve(DialogResult.Cancel);\n this.restoreFocus();\n }\n }\n\n onBackdropClick(): void {\n this.service.resolve(DialogResult.Cancel);\n this.restoreFocus();\n }\n\n onButtonClick(result: DialogResult): void {\n this.service.resolve(result);\n this.restoreFocus();\n }\n\n iconClass(): string {\n switch (this.service.icon()) {\n case MessageBoxIcon.Information: return 'pi pi-info-circle';\n case MessageBoxIcon.Warning: return 'pi pi-exclamation-triangle';\n case MessageBoxIcon.Error: return 'pi pi-times-circle';\n case MessageBoxIcon.Question: return 'pi pi-question-circle';\n default: return '';\n }\n }\n\n private focusPrimaryButton(): void {\n // Focus the primary (last) button, which is the default action\n const buttons = this.elRef.nativeElement.querySelectorAll('.mb-btn') as NodeListOf<HTMLButtonElement>;\n const last = buttons[buttons.length - 1];\n last?.focus();\n }\n\n private restoreFocus(): void {\n if (this.previouslyFocused instanceof HTMLElement) {\n this.previouslyFocused.focus();\n }\n this.previouslyFocused = null;\n }\n}\n","@if (service.visible()) {\n <div\n class=\"mb-backdrop\"\n (click)=\"onBackdropClick()\"\n role=\"presentation\">\n <div\n class=\"mb-dialog\"\n [class.mb-info]=\"service.icon() === MessageBoxIcon.Information\"\n [class.mb-warning]=\"service.icon() === MessageBoxIcon.Warning\"\n [class.mb-danger]=\"service.icon() === MessageBoxIcon.Error\"\n [class.mb-question]=\"service.icon() === MessageBoxIcon.Question\"\n (click)=\"$event.stopPropagation()\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"mb-title\"\n aria-describedby=\"mb-message\">\n\n @if (iconClass()) {\n <div class=\"mb-icon-wrap\">\n <i [class]=\"iconClass() + ' mb-icon'\" aria-hidden=\"true\"></i>\n </div>\n }\n\n <div class=\"mb-title\" id=\"mb-title\">{{ service.title() }}</div>\n <div class=\"mb-message\" id=\"mb-message\">{{ service.message() }}</div>\n\n <div class=\"mb-actions\">\n @for (btn of service.buttons(); track btn.result) {\n <button\n type=\"button\"\n class=\"vos-btn sm mb-btn\"\n [class.mb-btn--primary]=\"btn.variant === 'primary'\"\n [class.mb-btn--danger]=\"btn.variant === 'danger'\"\n (click)=\"onButtonClick(btn.result)\">\n {{ btn.label }}\n </button>\n }\n </div>\n\n </div>\n </div>\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n signal,\n inject,\n OnInit,\n DestroyRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Observable } from 'rxjs';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport { I18nService } from '../../services/i18n.service';\nimport type {\n ShareOuNode,\n SharePanelLevelOption,\n SharePermissionEntry,\n ShareUserResult,\n} from '../../models/share-panel.model';\n\n/** Default permission levels (file-style ACL). Hosts can override via `permissionLevels`. */\nexport const SHARE_PANEL_DEFAULT_FILE_LEVELS: SharePanelLevelOption[] = [\n { value: 'View', labelKey: 'files.share.level_view' },\n { value: 'Download', labelKey: 'files.share.level_download' },\n { value: 'Edit', labelKey: 'files.share.level_edit' },\n { value: 'FullControl', labelKey: 'files.share.level_full' },\n];\n\n@Component({\n selector: 'fly-share-panel',\n standalone: true,\n imports: [CommonModule, FormsModule, TranslatePipe],\n templateUrl: './share-panel.component.html',\n styleUrl: './share-panel.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SharePanelComponent implements OnInit {\n /** Resource title shown in the header */\n @Input() targetName = '';\n\n /** i18n key for panel title */\n @Input() titleKey = 'files.share.title';\n\n /** Load current shares / permissions (host resolves display names when possible). */\n @Input({ required: true }) loadPermissions!: () => Observable<SharePermissionEntry[]>;\n\n @Input({ required: true }) searchUsers!: (query: string) => Observable<ShareUserResult[]>;\n\n @Input({ required: true }) loadOuTree!: () => Observable<ShareOuNode[]>;\n\n @Input({ required: true })\n grantToUser!: (userId: string, level: string, applyToChildren: boolean) => Observable<void>;\n\n @Input({ required: true })\n grantToOu!: (ouId: string, level: string, applyToChildren: boolean) => Observable<void>;\n\n @Input({ required: true }) updatePermission!: (id: string, level: string) => Observable<void>;\n\n @Input({ required: true }) revokePermission!: (id: string) => Observable<void>;\n\n /** When true, show “apply to children” (e.g. folders). */\n @Input() showApplyToChildren = false;\n\n /** Override level dropdown options (e.g. notes: View / Edit only). */\n @Input() permissionLevels?: SharePanelLevelOption[];\n\n /** i18n key for wildcard app grant label */\n @Input() everyoneLabelKey = 'files.share.everyone';\n\n @Output() close = new EventEmitter<void>();\n\n private destroyRef = inject(DestroyRef);\n private i18n = inject(I18nService);\n\n permissions = signal<SharePermissionEntry[]>([]);\n loading = signal(true);\n searchQuery = '';\n newLevel = '';\n applyToChildren = false;\n searchResults = signal<ShareUserResult[]>([]);\n ouTree = signal<ShareOuNode[]>([]);\n showOuPicker = signal(false);\n\n private searchTimeout: ReturnType<typeof setTimeout> | null = null;\n\n ngOnInit(): void {\n const levels = this.levelOptions;\n this.newLevel = levels[0]?.value ?? 'View';\n this.refreshPermissions();\n this.loadOuTree()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (tree) => this.ouTree.set(tree),\n error: () => this.ouTree.set([]),\n });\n }\n\n get levelOptions(): SharePanelLevelOption[] {\n const p = this.permissionLevels;\n return p && p.length > 0 ? p : SHARE_PANEL_DEFAULT_FILE_LEVELS;\n }\n\n refreshPermissions(): void {\n this.loading.set(true);\n this.loadPermissions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (perms) => {\n this.permissions.set(perms);\n this.loading.set(false);\n },\n error: () => {\n this.permissions.set([]);\n this.loading.set(false);\n },\n });\n }\n\n onSearchInput(): void {\n if (this.searchTimeout) clearTimeout(this.searchTimeout);\n const query = this.searchQuery.trim();\n if (query.length < 2) {\n this.searchResults.set([]);\n return;\n }\n\n this.searchTimeout = setTimeout(() => {\n this.searchUsers(query)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (items) => this.searchResults.set(items),\n error: () => this.searchResults.set([]),\n });\n }, 300);\n }\n\n onGrantToUser(user: ShareUserResult): void {\n this.searchResults.set([]);\n this.searchQuery = '';\n this.grantToUser(user.id, this.newLevel, this.applyToChildren)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n onGrantToOu(ou: ShareOuNode): void {\n this.grantToOu(ou.id, this.newLevel, this.applyToChildren)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n onUpdateLevel(perm: SharePermissionEntry, level: string): void {\n this.updatePermission(perm.id, level)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n onRevokePermission(perm: SharePermissionEntry): void {\n this.revokePermission(perm.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n getPermIcon(perm: SharePermissionEntry): string {\n if (perm.grantedToUserId) return 'pi pi-user';\n if (perm.grantedToOuId) return 'pi pi-sitemap';\n if (perm.grantedToAppId) return 'pi pi-globe';\n return 'pi pi-question';\n }\n\n getPermLabel(perm: SharePermissionEntry): string {\n if (perm.displayName?.trim()) return perm.displayName.trim();\n if (perm.grantedToUserId) {\n return `${perm.grantedToUserId.substring(0, 8)}…`;\n }\n if (perm.grantedToOuId) {\n const ou = this.ouTree().find((o) => o.id === perm.grantedToOuId);\n if (ou) return ou.displayName;\n return `${perm.grantedToOuId.substring(0, 8)}…`;\n }\n if (perm.grantedToAppId === '*') return this.i18n.t(this.everyoneLabelKey);\n return perm.grantedToAppId ?? '';\n }\n\n}\n","<div class=\"fac-overlay\" (click)=\"close.emit()\">\n <div class=\"fac-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"fac-header\">\n <h3>{{ titleKey | translate }}</h3>\n <span class=\"fac-target-name\">{{ targetName }}</span>\n <button type=\"button\" class=\"fac-close\" (click)=\"close.emit()\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <div class=\"fac-add-section\">\n <div class=\"fac-search-row\">\n <input\n type=\"text\"\n class=\"fac-input\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchInput()\"\n [placeholder]=\"'files.share.search_placeholder' | translate\"\n />\n <select class=\"fac-select\" [(ngModel)]=\"newLevel\">\n @for (opt of levelOptions; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.labelKey | translate }}</option>\n }\n </select>\n </div>\n\n @if (searchResults().length > 0) {\n <div class=\"fac-search-results\">\n @for (result of searchResults(); track result.id) {\n <div class=\"fac-search-item\" (click)=\"onGrantToUser(result)\">\n <i class=\"pi pi-user\" aria-hidden=\"true\"></i>\n <span>{{ result.firstName }} {{ result.lastName }}</span>\n <span class=\"fac-email\">{{ result.email }}</span>\n </div>\n }\n </div>\n }\n\n @if (showOuPicker()) {\n <div class=\"fac-ou-section\">\n <div class=\"fac-section-label\">{{ 'files.share.share_with_ou' | translate }}</div>\n @for (ou of ouTree(); track ou.id) {\n <div class=\"fac-ou-item\" (click)=\"onGrantToOu(ou)\">\n <i class=\"pi pi-sitemap\" aria-hidden=\"true\"></i>\n <span>{{ ou.displayName }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"fac-toggle-row\">\n <button type=\"button\" class=\"fac-link\" (click)=\"showOuPicker.set(!showOuPicker())\">\n {{ showOuPicker() ? ('files.share.hide_ous' | translate) : ('files.share.show_ous' | translate) }}\n </button>\n @if (showApplyToChildren) {\n <label class=\"fac-checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"applyToChildren\" />\n {{ 'files.share.apply_children' | translate }}\n </label>\n }\n </div>\n </div>\n\n <div class=\"fac-perms-section\">\n <div class=\"fac-section-label\">{{ 'files.share.current_permissions' | translate }}</div>\n @if (loading()) {\n <div class=\"fac-loading\"><i class=\"pi pi-spin pi-spinner\" aria-hidden=\"true\"></i></div>\n } @else if (permissions().length === 0) {\n <div class=\"fac-empty\">{{ 'files.share.no_permissions' | translate }}</div>\n } @else {\n @for (perm of permissions(); track perm.id) {\n <div class=\"fac-perm-row\">\n <div class=\"fac-perm-info\">\n <i [class]=\"getPermIcon(perm)\" aria-hidden=\"true\"></i>\n <span class=\"fac-perm-name\">{{ getPermLabel(perm) }}</span>\n @if (perm.isInherited) {\n <span class=\"fac-badge inherited\">{{ 'files.share.inherited' | translate }}</span>\n }\n </div>\n <div class=\"fac-perm-actions\">\n <select\n class=\"fac-select sm\"\n [ngModel]=\"perm.level\"\n (ngModelChange)=\"onUpdateLevel(perm, $event)\"\n [disabled]=\"perm.isInherited === true\"\n >\n @for (opt of levelOptions; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.labelKey | translate }}</option>\n }\n </select>\n <button\n type=\"button\"\n class=\"fac-icon-btn danger\"\n (click)=\"onRevokePermission(perm)\"\n [disabled]=\"perm.isInherited === true\"\n [title]=\"'files.share.revoke' | translate\"\n >\n <i class=\"pi pi-trash\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n</div>\n","/*\r\n * @mohamedatia/fly-design-system — Public API\r\n * https://www.npmjs.com/package/@mohamedatia/fly-design-system\r\n *\r\n * This is the single entry point for Business / Supporting App developers.\r\n * Import everything from '@mohamedatia/fly-design-system' — never from relative shell paths.\r\n *\r\n * NOTE: This package is published under @mohamedatia/fly-design-system until the @fly\r\n * npm org is created. It will be republished as @fly/design-system once available.\r\n *\r\n * v1.3.0: FlyThemeService (html theme classes), hardened I18nService (AbortSignal, ErrorHandler, RTL helpers).\r\n * v1.3.1: loadBundle normalizes locale JSON (flat or nested objects; rejects invalid leaves).\r\n * v1.3.2: loadBundle returns boolean; LoadBundleOptions.silent skips ErrorHandler on failure.\r\n * v1.3.7: MockAuthService base class + MockAuthConfig for Business App mock auth via fileReplacements.\r\n * User model extended with optional avatar, source, twoFactorEnabled, createdAt fields.\r\n * v1.3.8: AuthService.init() no-op added so Business Apps can call init() in APP_INITIALIZER\r\n * without branching between standalone and embedded modes.\r\n * v1.3.9: MockAuthService field initializers moved into constructor to fix ngDevMode ReferenceError\r\n * when the package is loaded in a production-mode bundle (no ngDevMode global defined).\r\n * v1.4.0: ContextMenuComponent (positioned menu, keyboard nav, focus management) moved from desktop\r\n * shell to design system. MessageBoxService + MessageBoxComponent added (Windows Forms-style\r\n * modal dialogs with localized button labels, focus management, and Escape key support).\r\n * MessageBoxButtons, MessageBoxIcon, DialogResult, MessageBoxOptions, MessageBoxButton exported.\r\n * v1.5.0: SharePanelComponent — generic share/ACL overlay; host supplies API callbacks and optional\r\n * permission level options (file ACL vs note-style View/Edit).\r\n * See docs/ExternalAppsGuide/03-frontend-app.md.\r\n */\r\n\r\n// ─── Models ──────────────────────────────────────────────────────────────────\r\nexport type { DesktopApp, DesktopAppKind } from './lib/models/app.model';\r\nexport type {\r\n WindowInstance,\r\n WindowState,\r\n ChildWindowData,\r\n} from './lib/models/window.model';\r\nexport { WINDOW_DATA } from './lib/models/window.model';\r\nexport type { User } from './lib/models/user.model';\r\n\r\nexport type {\r\n SharePermissionEntry,\r\n ShareUserResult,\r\n ShareOuNode,\r\n SharePanelLevelOption,\r\n} from './lib/models/share-panel.model';\r\n\r\n// ─── Remote App Registration ─────────────────────────────────────────────────\r\nexport type { RemoteAppDef } from './lib/models/remote-app.model';\r\n\r\n// ─── Services ────────────────────────────────────────────────────────────────\r\nexport { AuthService } from './lib/services/auth.service';\r\nexport type { LoadBundleOptions } from './lib/services/i18n.service';\r\nexport { I18nService, RTL_LOCALE_SET, isRtlLocale } from './lib/services/i18n.service';\r\nexport { FlyThemeService, type FlyThemeMode } from './lib/services/fly-theme.service';\r\nexport {\r\n WindowManagerService,\r\n StandaloneWindowManagerService,\r\n type OpenWindowOptions,\r\n} from './lib/services/window-manager.service';\r\n\r\n// ─── Pipes ───────────────────────────────────────────────────────────────────\r\nexport { TranslatePipe } from './lib/pipes/translate.pipe';\r\n\r\n// ─── Mock Auth (for fileReplacements in dev/mock builds) ─────────────────────\r\nexport { MockAuthService, type MockAuthConfig } from './lib/services/auth.service.mock';\r\n\r\n// ─── Components ──────────────────────────────────────────────────────────────\r\nexport {\r\n ContextMenuComponent,\r\n type ContextMenuItem,\r\n type ContextMenuSection,\r\n} from './lib/components/context-menu/context-menu.component';\r\n\r\nexport {\r\n MessageBoxComponent,\r\n} from './lib/components/message-box/message-box.component';\r\n\r\nexport {\r\n MessageBoxService,\r\n MessageBoxButtons,\r\n MessageBoxIcon,\r\n DialogResult,\r\n type MessageBoxOptions,\r\n type MessageBoxButton,\r\n} from './lib/components/message-box/message-box.service';\r\n\r\nexport {\r\n SharePanelComponent,\r\n SHARE_PANEL_DEFAULT_FILE_LEVELS,\r\n} from './lib/components/share-panel/share-panel.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mohamedatia-fly-design-system.mjs","sources":["../../../projects/design-system/src/lib/models/window.model.ts","../../../projects/design-system/src/lib/services/auth.service.ts","../../../projects/design-system/src/lib/services/i18n.service.ts","../../../projects/design-system/src/lib/services/fly-theme.service.ts","../../../projects/design-system/src/lib/services/window-manager.service.ts","../../../projects/design-system/src/lib/pipes/translate.pipe.ts","../../../projects/design-system/src/lib/services/auth.service.mock.ts","../../../projects/design-system/src/lib/components/context-menu/context-menu.component.ts","../../../projects/design-system/src/lib/components/context-menu/context-menu.component.html","../../../projects/design-system/src/lib/components/message-box/message-box.service.ts","../../../projects/design-system/src/lib/components/message-box/message-box.component.ts","../../../projects/design-system/src/lib/components/message-box/message-box.component.html","../../../projects/design-system/src/lib/components/share-panel/share-panel.component.ts","../../../projects/design-system/src/lib/components/share-panel/share-panel.component.html","../../../projects/design-system/src/lib/components/block-ui/block-ui.component.ts","../../../projects/design-system/src/lib/components/block-ui/block-ui.component.html","../../../projects/design-system/src/lib/components/image-upload/fly-image-upload.component.ts","../../../projects/design-system/src/lib/components/file-upload/fly-file-upload.component.ts","../../../projects/design-system/src/public-api.ts","../../../projects/design-system/src/mohamedatia-fly-design-system.ts"],"sourcesContent":["import { InjectionToken, Type } from '@angular/core';\r\n\r\nexport type WindowState = 'normal' | 'minimized' | 'maximized';\r\n\r\nexport interface ChildWindowData {\r\n childComponent: Type<unknown>;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface WindowInstance {\r\n id: string;\r\n appId: string;\r\n title: string;\r\n icon: string;\r\n iconBg: string;\r\n state: WindowState;\r\n position: { x: number; y: number };\r\n size: { width: number; height: number };\r\n zIndex: number;\r\n isFocused: boolean;\r\n isClosing?: boolean;\r\n isMinimizing?: boolean;\r\n isRestoring?: boolean;\r\n isMaximizing?: boolean;\r\n isUnmaximizing?: boolean;\r\n parentWindowId?: string;\r\n childData?: ChildWindowData;\r\n /** Populated when remote `loadComponent()` fails (e.g. federation). */\r\n remoteLoadError?: string;\r\n /** When true, the shell draws a block overlay over `.window-content` (see `FlyBlockUiComponent`). */\r\n contentUiBlocked?: boolean;\r\n /** i18n key for block overlay label; shell defaults to `common.loading` when unset. */\r\n contentUiBlockMessageKey?: string;\r\n}\r\n\r\nexport const WINDOW_DATA = new InjectionToken<WindowInstance>('WINDOW_DATA');\r\n","import { Injectable, computed, signal } from '@angular/core';\nimport { User } from '../models/user.model';\n\ninterface AuthSession {\n user: User;\n accessToken: string;\n expiresAt: number;\n}\n\n/**\n * Shared AuthService for Business Apps.\n *\n * This is a **read-only signal store** — Business Apps inject it to read the\n * current user and access token. The FlyOS shell populates it after PKCE login\n * and silent refresh. Business Apps must never call setSession() directly.\n *\n * When running as a Module Federation remote, the shell and the Business App\n * share this singleton via the `@mohamedatia/fly-design-system` shared mapping\n * in federation.config.js — so the shell's populated instance is the same\n * object the Business App reads.\n *\n * When running standalone (without the shell), call initFromToken() with a\n * JWT stored in localStorage to hydrate the user.\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthService {\n private _session = signal<AuthSession | null>(null);\n\n readonly currentUser = computed(() => this._session()?.user ?? null);\n readonly accessToken = computed(() => this._session()?.accessToken ?? null);\n readonly isAuthenticated = computed(() => {\n const s = this._session();\n return s !== null && s.expiresAt > Date.now();\n });\n\n /**\n * No-op when running as a Module Federation remote — the shell has already\n * initialised the session before the remote bootstraps. Business Apps call\n * this in their APP_INITIALIZER so the same code works in both standalone\n * and embedded modes without branching.\n */\n async init(): Promise<void> {}\n\n /**\n * Called by the shell after a successful login or silent refresh.\n * Business Apps should not call this directly.\n */\n setSession(user: User, accessToken: string, expiresAt: number): void {\n this._session.set({ user, accessToken, expiresAt });\n }\n\n /** Clears the in-memory session (called by the shell on logout). */\n clearSession(): void {\n this._session.set(null);\n }\n\n /**\n * Standalone mode: parse a JWT from localStorage and hydrate the user.\n * Pass the storage key your app uses; embedded remotes typically set this in `APP_INITIALIZER`.\n */\n initFromToken(storageKey = 'circles_token'): void {\n const token = localStorage.getItem(storageKey);\n if (!token) return;\n try {\n const base64 = token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/');\n const payload = JSON.parse(decodeURIComponent(\n atob(base64).split('').map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join('')\n )) as Record<string, unknown>;\n\n const rawRole = payload['role'];\n const roles = Array.isArray(rawRole) ? rawRole as string[] : rawRole ? [rawRole as string] : [];\n const rawApps = payload['apps'];\n const apps = Array.isArray(rawApps) ? rawApps as string[] : rawApps ? [rawApps as string] : [];\n const name = (payload['name'] as string) ?? '';\n const nameParts = name.split(' ');\n\n const user: User = {\n id: (payload['sub'] as string) ?? '',\n tenantId: (payload['tenant_id'] as string) ?? (payload['tid'] as string) ?? null,\n email: (payload['email'] as string) ?? '',\n fullName: name,\n firstName: nameParts[0] ?? '',\n lastName: nameParts.slice(1).join(' '),\n preferredLocale: (payload['locale'] as string) ?? 'en',\n roles,\n apps,\n ou: payload['ou'] as string | undefined,\n };\n\n const expiresAt = ((payload['exp'] as number) ?? 0) * 1000;\n this.setSession(user, token, expiresAt);\n } catch {\n // Invalid token — stay unauthenticated\n }\n }\n}\n","import { Injectable, computed, signal, inject, ErrorHandler } from '@angular/core';\n\n/** Locales that use RTL layout for `dir` and DS `isRtl` / `direction`. */\nexport const RTL_LOCALE_SET: ReadonlySet<string> = new Set(['ar', 'ur']);\n\nexport function isRtlLocale(lang: string): boolean {\n return RTL_LOCALE_SET.has(lang);\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/** Accepts flat or nested JSON objects; nested keys become dot paths. Rejects arrays and non-string leaves. */\nfunction normalizeLocaleJson(raw: unknown): Record<string, string> {\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n throw new Error('Locale bundle must be a JSON object');\n }\n const out: Record<string, string> = {};\n const walk = (obj: Record<string, unknown>, prefix: string): void => {\n for (const [k, v] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${k}` : k;\n if (typeof v === 'string') {\n out[path] = v;\n } else if (v !== null && typeof v === 'object' && !Array.isArray(v)) {\n walk(v as Record<string, unknown>, path);\n } else {\n throw new Error(`Locale bundle invalid value at \"${path}\" (expected string or nested object)`);\n }\n }\n };\n walk(raw as Record<string, unknown>, '');\n return out;\n}\n\n/** Options for loading a remote or standalone locale JSON bundle. */\nexport interface LoadBundleOptions {\n /** Stable id (e.g. app id from manifest); later loads replace this bundle only. */\n id: string;\n /** Base URL ending with `/`, e.g. `https://app.example.com/locale/` or `/my-remote/locale/` */\n baseUrl: string;\n lang: string;\n /** When aborted, failures are ignored (e.g. superseded language load). */\n signal?: AbortSignal;\n /**\n * When true, fetch/parse failures are not reported via Angular `ErrorHandler`.\n * Use for optional remote locale bundles (e.g. federated apps that may be offline).\n */\n silent?: boolean;\n}\n\n/**\n * Shared I18nService for the shell and Business Apps.\n *\n * **Merge order** (later keys win): shell layer → remote bundles in registration order.\n *\n * - Shell: `setShellTranslations()` after loading `locale/{lang}.json` and API overrides.\n * - Remotes: `loadBundle()` per manifest `localeBaseUrl`.\n */\n@Injectable({ providedIn: 'root' })\nexport class I18nService {\n private readonly errorHandler = inject(ErrorHandler, { optional: true });\n\n private readonly _shell = signal<Record<string, string>>({});\n private readonly _bundles = signal<Record<string, Record<string, string>>>({});\n private readonly _bundleOrder = signal<string[]>([]);\n private readonly _locale = signal<string>('en');\n private readonly _version = signal(0);\n\n private readonly _merged = computed(() => {\n const shell = this._shell();\n const order = this._bundleOrder();\n const bundles = this._bundles();\n let out: Record<string, string> = { ...shell };\n for (const id of order) {\n const b = bundles[id];\n if (b) out = { ...out, ...b };\n }\n return out;\n });\n\n readonly locale = this._locale.asReadonly();\n readonly version = this._version.asReadonly();\n readonly isRtl = computed(() => isRtlLocale(this._locale()));\n readonly direction = computed(() => (isRtlLocale(this._locale()) ? 'rtl' : 'ltr'));\n\n private bump(): void {\n this._version.update((v) => v + 1);\n }\n\n /** Replace shell strings (desktop `locale/*.json` + `/api/i18n/desktop-shell/{lang}` merged by the shell). */\n setShellTranslations(data: Record<string, string>, lang: string): void {\n this._shell.set(data);\n this._locale.set(lang);\n this.bump();\n }\n\n setLanguage(lang: string): void {\n this._locale.set(lang);\n this.bump();\n }\n\n /**\n * Fetch `{baseUrl}{lang}.json` and store under `id`. New ids are appended to the merge order.\n * @returns whether the bundle was loaded successfully.\n */\n async loadBundle(opts: LoadBundleOptions): Promise<boolean> {\n const { id, baseUrl, lang, signal: abortSignal, silent } = opts;\n try {\n const base = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;\n const url = `${base}${lang}.json`;\n const resp = await fetch(url, { signal: abortSignal });\n if (!resp.ok) throw new Error(`HTTP ${resp.status}`);\n const data = normalizeLocaleJson(await resp.json());\n if (abortSignal?.aborted) return false;\n this._bundles.update((b) => ({ ...b, [id]: data }));\n this._bundleOrder.update((order) => (order.includes(id) ? order : [...order, id]));\n this._locale.set(lang);\n this.bump();\n return true;\n } catch (e) {\n if (abortSignal?.aborted) return false;\n if (!silent) this.errorHandler?.handleError(e);\n return false;\n }\n }\n\n removeBundle(id: string): void {\n this._bundles.update((b) => {\n const next = { ...b };\n delete next[id];\n return next;\n });\n this._bundleOrder.update((order) => order.filter((x) => x !== id));\n this.bump();\n }\n\n clearRemoteBundles(): void {\n this._bundles.set({});\n this._bundleOrder.set([]);\n this.bump();\n }\n\n t(key: string, params?: Record<string, string | number>): string {\n const val = this._merged()[key] ?? key;\n if (!params) return val;\n return Object.entries(params).reduce((result, [k, v]) => {\n const safe = escapeRegExp(k);\n return result.replace(new RegExp(`{{\\\\s*${safe}\\\\s*}}`, 'g'), String(v));\n }, val);\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { Injectable, inject, PLATFORM_ID, signal } from '@angular/core';\n\n/** Single source of truth for persisted / API theme strings. */\nexport const FLY_THEME_MODE_IDS = ['light', 'spatial', 'dark'] as const;\n\nexport type FlyThemeMode = (typeof FLY_THEME_MODE_IDS)[number];\n\n/** Factory default: `dark` (opaque dark / `html.dark-theme`); shell i18n `settings.theme.dark`. Keep in sync with `UserSettings` defaults. */\nexport const DEFAULT_FLY_THEME_MODE: FlyThemeMode = 'dark';\n\n/** Coerce unknown values (localStorage, API) to a valid theme mode. */\nexport function normalizeFlyTheme(value: unknown): FlyThemeMode {\n if (typeof value === 'string' && (FLY_THEME_MODE_IDS as readonly string[]).includes(value)) {\n return value as FlyThemeMode;\n }\n return DEFAULT_FLY_THEME_MODE;\n}\n\n/**\n * Applies `html.light-theme` / `html.spatial-theme` / `html.dark-theme` for DS SCSS.\n * Shell and standalone Business Apps use the same service (federation singleton when shared).\n */\n@Injectable({ providedIn: 'root' })\nexport class FlyThemeService {\n private readonly platformId = inject(PLATFORM_ID);\n\n readonly theme = signal<FlyThemeMode>(DEFAULT_FLY_THEME_MODE);\n\n applyTheme(mode: FlyThemeMode): void {\n this.theme.set(mode);\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n const html = document.documentElement;\n html.classList.remove('light-theme', 'spatial-theme', 'dark-theme');\n if (mode === 'spatial') {\n html.classList.add('spatial-theme');\n } else if (mode === 'dark') {\n html.classList.add('dark-theme');\n } else {\n html.classList.add('light-theme');\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\n/** Options for opening a child window. */\nexport interface OpenWindowOptions {\n /** Unique identifier for the window instance. */\n windowId: string;\n /** Display title shown in the window chrome. */\n title: string;\n /** Route path or URL to load inside the window. */\n route: string;\n /** Initial width in pixels. Defaults to 900. */\n width?: number;\n /** Initial height in pixels. Defaults to 600. */\n height?: number;\n /** Whether the window can be resized. Defaults to true. */\n resizable?: boolean;\n /** Whether the window can be maximised. Defaults to true. */\n maximizable?: boolean;\n /** Arbitrary data passed to the child window via WINDOW_DATA. */\n data?: unknown;\n}\n\n/**\n * Abstract interface for the WindowManager.\n * The FlyOS shell provides the concrete implementation; Business Apps\n * inject this token to open, close, and focus windows without depending\n * on the shell's internal implementation.\n */\nexport abstract class WindowManagerService {\n abstract openChildWindow(options: OpenWindowOptions): void;\n abstract closeWindow(windowId: string): void;\n abstract focusWindow(windowId: string): void;\n\n /**\n * Shell: increments per-window depth and shows content block UI.\n * Standalone / no host: no-op.\n */\n beginContentUiBlock(_windowId: string, _messageKey?: string): void {}\n\n /** Shell: decrements depth; clears block when depth reaches 0. Standalone: no-op. */\n endContentUiBlock(_windowId: string): void {}\n}\n\n/**\n * No-op fallback implementation used when running a Business App in\n * standalone mode (outside the FlyOS shell). Logs a warning instead of\n * throwing so standalone dev/test flows are not broken.\n */\n@Injectable()\nexport class StandaloneWindowManagerService extends WindowManagerService {\n openChildWindow(options: OpenWindowOptions): void {\n console.warn('[WindowManagerService] openChildWindow called in standalone mode — no shell available.', options);\n }\n\n closeWindow(windowId: string): void {\n console.warn('[WindowManagerService] closeWindow called in standalone mode — no shell available.', windowId);\n }\n\n focusWindow(windowId: string): void {\n console.warn('[WindowManagerService] focusWindow called in standalone mode — no shell available.', windowId);\n }\n}\n\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { I18nService } from '../services/i18n.service';\n\n/**\n * Translates a key using the shared I18nService.\n *\n * @example\n * {{ 'myApp.section.title' | translate }}\n * {{ 'myApp.items_count' | translate:{ n: count() } }}\n */\n@Pipe({\n name: 'translate',\n standalone: true,\n pure: false,\n})\nexport class TranslatePipe implements PipeTransform {\n private readonly i18n = inject(I18nService);\n\n transform(key: string, params?: Record<string, string | number>): string {\n // Read version so template CD re-runs when bundles load (merged translations updated).\n void this.i18n.version();\n return this.i18n.t(key, params);\n }\n}\n","import { Injectable, Signal, computed, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Observable, of } from 'rxjs';\nimport { User } from '../models/user.model';\n\nexport interface MockAuthConfig {\n user: User;\n token?: string;\n loginRedirect?: string[];\n logoutRedirect?: string[];\n}\n\ninterface MockSession {\n accessToken: string;\n user: User;\n expiresAt: number;\n}\n\n/**\n * Shared mock AuthService base class for Business App developers.\n *\n * Extend this class in your app's `auth.service.mock.ts` and override\n * `getConfig()` to supply app-specific mock user data and navigation paths.\n * The subclass must be decorated with `@Injectable({ providedIn: 'root' })`\n * and exported as `AuthService` so Angular's `fileReplacements` swap works.\n *\n * @example\n * ```typescript\n * // src/app/core/services/auth.service.mock.ts\n * import { Injectable } from '@angular/core';\n * import { MockAuthService, type MockAuthConfig } from '@mohamedatia/fly-design-system';\n *\n * @Injectable({ providedIn: 'root' })\n * export class AuthService extends MockAuthService {\n * protected override getConfig(): MockAuthConfig {\n * return {\n * user: { id: 'dev-001', tenantId: 'dev-tenant', email: 'dev@example.com',\n * firstName: 'Dev', lastName: 'User', fullName: 'Dev User',\n * preferredLocale: 'en', roles: ['admin'], apps: ['my-app'] },\n * token: 'my-mock-token',\n * loginRedirect: ['/app'],\n * };\n * }\n * }\n * ```\n */\n@Injectable()\nexport class MockAuthService {\n private readonly router = inject(Router);\n\n protected readonly _session: ReturnType<typeof signal<MockSession | null>>;\n\n private readonly _config: MockAuthConfig;\n\n readonly isAuthenticated: Signal<boolean>;\n readonly currentUser: Signal<User | null>;\n readonly accessToken: Signal<string | null>;\n /** Always false in mock mode — 2FA is handled entirely by the STS. */\n readonly hasPendingTwoFactor: Signal<boolean>;\n /** Always false in mock mode — auth is pre-populated synchronously. */\n readonly initializing: Signal<boolean>;\n\n /**\n * Shell and guards may read this flag; real auth uses `localStorage` `fly_had_session`.\n * Default false — override in the app’s `auth.service.mock.ts` if needed.\n */\n get hadPriorSession(): boolean {\n return false;\n }\n\n constructor() {\n // All signal/computed calls are inside the constructor body so Angular's\n // injection context and ngDevMode are fully set up before they execute.\n this._config = this.getConfig();\n\n this._session = signal<MockSession | null>({\n accessToken: this._config.token ?? 'mock-token',\n user: this._config.user,\n expiresAt: Date.now() + 24 * 60 * 60 * 1000,\n });\n\n this.isAuthenticated = computed(() => {\n const s = this._session();\n return s !== null && s.expiresAt > Date.now();\n });\n\n this.currentUser = computed(() => this._session()?.user ?? null);\n this.accessToken = computed(() => this._session()?.accessToken ?? null);\n this.hasPendingTwoFactor = computed(() => false);\n this.initializing = signal(false).asReadonly();\n }\n\n /** Override in subclass to supply app-specific mock data. */\n protected getConfig(): MockAuthConfig {\n return {\n user: {\n id: 'mock-user-001',\n tenantId: 'mock-tenant-001',\n email: 'developer@fly.local',\n firstName: 'UI',\n lastName: 'Developer',\n fullName: 'UI Developer',\n preferredLocale: 'en',\n roles: ['admin'],\n apps: [],\n },\n };\n }\n\n async init(): Promise<void> {\n // Mock mode: already authenticated, nothing to initialize.\n }\n\n startLogin(): void {\n this.router.navigate(this._config.loginRedirect ?? ['/']);\n }\n\n handleCallback(_code: string, _state?: string): Observable<User> {\n return of(this._config.user);\n }\n\n async forceRefresh(): Promise<void> {\n // No-op in mock mode — token never expires.\n }\n\n patchSessionPreferredLocale(locale: string): void {\n const session = this._session();\n if (!session?.user) return;\n this._session.set({ ...session, user: { ...session.user, preferredLocale: locale } });\n }\n\n /** Parameter order matches the real AuthService: (user, accessToken, expiresAt). */\n setSession(_user: User, _accessToken: string, _expiresAt: number): void {\n // No-op in mock mode — session is hardcoded.\n }\n\n logout(): void {\n this._session.set(null);\n this.router.navigate(this._config.logoutRedirect ?? ['/']);\n }\n}\n","import {\n Component, input, output, HostListener, ViewChild, ElementRef,\n computed, signal, AfterViewInit, OnDestroy, ChangeDetectionStrategy, inject, DOCUMENT,\n} from '@angular/core';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\n\nexport interface ContextMenuItem {\n id: string;\n label: string;\n icon: string;\n}\n\nexport interface ContextMenuSection {\n label?: string;\n items: ContextMenuItem[];\n}\n\n@Component({\n selector: 'fly-context-menu',\n standalone: true,\n imports: [TranslatePipe],\n templateUrl: './context-menu.component.html',\n styleUrl: './context-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ContextMenuComponent implements AfterViewInit, OnDestroy {\n @ViewChild('contextMenu') private menuEl?: ElementRef<HTMLElement>;\n\n private readonly doc = inject(DOCUMENT);\n private readonly hostEl = inject(ElementRef<HTMLElement>);\n\n x = input.required<number>();\n y = input.required<number>();\n sections = input.required<ContextMenuSection[]>();\n action = output<string>();\n closed = output<void>();\n\n private menuWidth = signal(0);\n private menuHeight = signal(0);\n\n private previouslyFocused: Element | null = null;\n\n // Resolved position: clamp to viewport so the menu never overflows an edge.\n // menuWidth/Height start at 0 so the first render places the menu at (x,y)\n // with no clamping; ngAfterViewInit measures the real size and updates the\n // signals, which re-evaluates this computed and repositions correctly.\n clampedPos = computed(() => {\n const vw = this.doc.defaultView?.innerWidth ?? 0;\n const vh = this.doc.defaultView?.innerHeight ?? 0;\n const w = this.menuWidth();\n const h = this.menuHeight();\n const x = this.x();\n const y = this.y();\n return {\n left: w > 0 ? Math.min(x, vw - w - 8) : x,\n top: h > 0 ? Math.min(y, vh - h - 8) : y,\n };\n });\n\n ngAfterViewInit(): void {\n // Portal: move host to <body> so position:fixed resolves against the true\n // viewport, not against any transformed/backdrop-filtered ancestor window.\n this.doc.body.appendChild(this.hostEl.nativeElement);\n\n // Measure after portal move so offsetWidth/Height are accurate.\n const el = this.menuEl?.nativeElement;\n if (el) {\n this.menuWidth.set(el.offsetWidth);\n this.menuHeight.set(el.offsetHeight);\n }\n\n this.previouslyFocused = document.activeElement;\n this.focusItem(0);\n }\n\n ngOnDestroy(): void {\n const el = this.hostEl.nativeElement;\n if (el.parentNode === this.doc.body) {\n this.doc.body.removeChild(el);\n }\n }\n\n onAction(id: string): void {\n this.action.emit(id);\n this.close();\n }\n\n @HostListener('document:mousedown', ['$event'])\n onClickOutside(event: MouseEvent): void {\n if (!this.menuEl?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n this.close();\n }\n\n @HostListener('document:contextmenu', ['$event'])\n onContextMenu(event: MouseEvent): void {\n if (!this.menuEl?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n @HostListener('keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n const items = this.getMenuItems();\n if (!items.length) return;\n const focused = document.activeElement as HTMLElement;\n const idx = items.indexOf(focused);\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.focusItem(idx < items.length - 1 ? idx + 1 : 0);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.focusItem(idx > 0 ? idx - 1 : items.length - 1);\n } else if (event.key === 'Home') {\n event.preventDefault();\n this.focusItem(0);\n } else if (event.key === 'End') {\n event.preventDefault();\n this.focusItem(items.length - 1);\n }\n }\n\n private close(): void {\n this.restoreFocus();\n this.closed.emit();\n }\n\n private getMenuItems(): HTMLElement[] {\n return Array.from(\n this.menuEl?.nativeElement.querySelectorAll<HTMLElement>('[role=\"menuitem\"]') ?? [],\n );\n }\n\n private focusItem(index: number): void {\n const items = this.getMenuItems();\n items[index]?.focus();\n }\n\n private restoreFocus(): void {\n if (this.previouslyFocused instanceof HTMLElement) {\n this.previouslyFocused.focus();\n }\n this.previouslyFocused = null;\n }\n}\n","<div\n #contextMenu\n class=\"context-menu\"\n [style.left.px]=\"clampedPos().left\"\n [style.top.px]=\"clampedPos().top\"\n role=\"menu\"\n [attr.aria-label]=\"'shell.context_menu' | translate\">\n\n @for (section of sections(); track $index) {\n @if ($index > 0) {\n <div class=\"menu-divider\"></div>\n }\n @if (section.label) {\n <div class=\"menu-section-label\">{{ section.label }}</div>\n }\n @for (item of section.items; track item.id) {\n <button\n type=\"button\"\n class=\"vos-btn sm rect menu-item\"\n role=\"menuitem\"\n (click)=\"onAction(item.id)\">\n <i [class]=\"'pi ' + item.icon\" aria-hidden=\"true\"></i>\n <span>{{ item.label }}</span>\n </button>\n }\n }\n</div>\n","import { Injectable, inject, signal } from '@angular/core';\nimport { I18nService } from '../../services/i18n.service';\n\nexport enum MessageBoxButtons {\n OK,\n OKCancel,\n YesNo,\n YesNoCancel,\n RetryCancel,\n AbortRetryIgnore,\n}\n\nexport enum MessageBoxIcon {\n None,\n Information,\n Warning,\n Error,\n Question,\n}\n\nexport enum DialogResult {\n None,\n OK,\n Cancel,\n Yes,\n No,\n Retry,\n Abort,\n Ignore,\n}\n\nexport interface MessageBoxOptions {\n title: string;\n message: string;\n buttons?: MessageBoxButtons;\n icon?: MessageBoxIcon;\n}\n\nexport interface MessageBoxButton {\n label: string;\n result: DialogResult;\n variant?: 'primary' | 'danger' | 'default';\n}\n\n@Injectable({ providedIn: 'root' })\nexport class MessageBoxService {\n private readonly i18n = inject(I18nService);\n\n readonly visible = signal(false);\n readonly title = signal('');\n readonly message = signal('');\n readonly icon = signal<MessageBoxIcon>(MessageBoxIcon.None);\n readonly buttons = signal<MessageBoxButton[]>([]);\n\n private resolver: ((value: DialogResult) => void) | null = null;\n\n show(options: MessageBoxOptions): Promise<DialogResult> {\n // Dismiss any pending dialog so its Promise resolves rather than leaking\n if (this.resolver) {\n this.resolver(DialogResult.None);\n this.resolver = null;\n }\n\n this.title.set(options.title);\n this.message.set(options.message);\n this.icon.set(options.icon ?? MessageBoxIcon.None);\n this.buttons.set(this.resolveButtons(options.buttons ?? MessageBoxButtons.OK));\n this.visible.set(true);\n\n return new Promise<DialogResult>((resolve) => {\n this.resolver = resolve;\n });\n }\n\n resolve(result: DialogResult): void {\n this.visible.set(false);\n if (this.resolver) {\n this.resolver(result);\n this.resolver = null;\n }\n }\n\n private resolveButtons(buttons: MessageBoxButtons): MessageBoxButton[] {\n const t = (key: string) => this.i18n.t(key);\n switch (buttons) {\n case MessageBoxButtons.OK:\n return [{ label: t('common.ok'), result: DialogResult.OK, variant: 'primary' }];\n\n case MessageBoxButtons.OKCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.ok'), result: DialogResult.OK, variant: 'primary' },\n ];\n\n case MessageBoxButtons.YesNo:\n return [\n { label: t('common.no'), result: DialogResult.No, variant: 'default' },\n { label: t('common.yes'), result: DialogResult.Yes, variant: 'primary' },\n ];\n\n case MessageBoxButtons.YesNoCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.no'), result: DialogResult.No, variant: 'default' },\n { label: t('common.yes'), result: DialogResult.Yes, variant: 'primary' },\n ];\n\n case MessageBoxButtons.RetryCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.retry'), result: DialogResult.Retry, variant: 'primary' },\n ];\n\n case MessageBoxButtons.AbortRetryIgnore:\n return [\n { label: t('common.abort'), result: DialogResult.Abort, variant: 'danger' },\n { label: t('common.retry'), result: DialogResult.Retry, variant: 'default' },\n { label: t('common.ignore'), result: DialogResult.Ignore, variant: 'default' },\n ];\n }\n }\n}\n","import {\n Component, inject, ChangeDetectionStrategy,\n HostListener, ElementRef, AfterViewInit,\n} from '@angular/core';\nimport { MessageBoxService, MessageBoxIcon, DialogResult } from './message-box.service';\n\n@Component({\n selector: 'fly-message-box',\n standalone: true,\n templateUrl: './message-box.component.html',\n styleUrl: './message-box.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MessageBoxComponent implements AfterViewInit {\n service = inject(MessageBoxService);\n private elRef = inject(ElementRef);\n\n readonly MessageBoxIcon = MessageBoxIcon;\n readonly DialogResult = DialogResult;\n\n private previouslyFocused: Element | null = null;\n\n ngAfterViewInit(): void {\n // Store focus origin so we can restore it on close\n this.previouslyFocused = document.activeElement;\n this.focusPrimaryButton();\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.service.visible()) {\n this.service.resolve(DialogResult.Cancel);\n this.restoreFocus();\n }\n }\n\n onBackdropClick(): void {\n this.service.resolve(DialogResult.Cancel);\n this.restoreFocus();\n }\n\n onButtonClick(result: DialogResult): void {\n this.service.resolve(result);\n this.restoreFocus();\n }\n\n iconClass(): string {\n switch (this.service.icon()) {\n case MessageBoxIcon.Information: return 'pi pi-info-circle';\n case MessageBoxIcon.Warning: return 'pi pi-exclamation-triangle';\n case MessageBoxIcon.Error: return 'pi pi-times-circle';\n case MessageBoxIcon.Question: return 'pi pi-question-circle';\n default: return '';\n }\n }\n\n private focusPrimaryButton(): void {\n // Focus the primary (last) button, which is the default action\n const buttons = this.elRef.nativeElement.querySelectorAll('.mb-btn') as NodeListOf<HTMLButtonElement>;\n const last = buttons[buttons.length - 1];\n last?.focus();\n }\n\n private restoreFocus(): void {\n if (this.previouslyFocused instanceof HTMLElement) {\n this.previouslyFocused.focus();\n }\n this.previouslyFocused = null;\n }\n}\n","@if (service.visible()) {\n <div\n class=\"mb-backdrop\"\n (click)=\"onBackdropClick()\"\n role=\"presentation\">\n <div\n class=\"mb-dialog\"\n [class.mb-info]=\"service.icon() === MessageBoxIcon.Information\"\n [class.mb-warning]=\"service.icon() === MessageBoxIcon.Warning\"\n [class.mb-danger]=\"service.icon() === MessageBoxIcon.Error\"\n [class.mb-question]=\"service.icon() === MessageBoxIcon.Question\"\n (click)=\"$event.stopPropagation()\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"mb-title\"\n aria-describedby=\"mb-message\">\n\n @if (iconClass()) {\n <div class=\"mb-icon-wrap\">\n <i [class]=\"iconClass() + ' mb-icon'\" aria-hidden=\"true\"></i>\n </div>\n }\n\n <div class=\"mb-title\" id=\"mb-title\">{{ service.title() }}</div>\n <div class=\"mb-message\" id=\"mb-message\">{{ service.message() }}</div>\n\n <div class=\"mb-actions\">\n @for (btn of service.buttons(); track btn.result) {\n <button\n type=\"button\"\n class=\"vos-btn sm mb-btn\"\n [class.mb-btn--primary]=\"btn.variant === 'primary'\"\n [class.mb-btn--danger]=\"btn.variant === 'danger'\"\n (click)=\"onButtonClick(btn.result)\">\n {{ btn.label }}\n </button>\n }\n </div>\n\n </div>\n </div>\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n signal,\n inject,\n OnInit,\n DestroyRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Observable, ReplaySubject } from 'rxjs';\nimport { switchMap } from 'rxjs/operators';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport { I18nService } from '../../services/i18n.service';\nimport type {\n ShareOrgChartOption,\n ShareOuNode,\n SharePanelLevelOption,\n SharePermissionEntry,\n ShareUserResult,\n} from '../../models/share-panel.model';\n\n/** Default permission levels (file-style ACL). Hosts can override via `permissionLevels`. */\nexport const SHARE_PANEL_DEFAULT_FILE_LEVELS: SharePanelLevelOption[] = [\n { value: 'View', labelKey: 'files.share.level_view' },\n { value: 'Download', labelKey: 'files.share.level_download' },\n { value: 'Edit', labelKey: 'files.share.level_edit' },\n { value: 'FullControl', labelKey: 'files.share.level_full' },\n];\n\n@Component({\n selector: 'fly-share-panel',\n standalone: true,\n imports: [CommonModule, FormsModule, TranslatePipe],\n templateUrl: './share-panel.component.html',\n styleUrl: './share-panel.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SharePanelComponent implements OnInit {\n /** Resource title shown in the header */\n @Input() targetName = '';\n\n /** i18n key for panel title */\n @Input() titleKey = 'files.share.title';\n\n /** Load current shares / permissions (host resolves display names when possible). */\n @Input({ required: true }) loadPermissions!: () => Observable<SharePermissionEntry[]>;\n\n @Input({ required: true }) searchUsers!: (query: string) => Observable<ShareUserResult[]>;\n\n /**\n * Load OU hierarchy for sharing. `chartId` is null for the default/official tree;\n * non-null for an alternative chart.\n */\n @Input({ required: true })\n loadOuTree!: (chartId: string | null) => Observable<ShareOuNode[]>;\n\n /** Chart selector options; first entry should be the default chart (`id: null`). */\n @Input({ required: true }) loadChartOptions!: () => Observable<ShareOrgChartOption[]>;\n\n /**\n * Labels from the default (official) OU tree for stable display names on OU grants\n * when the picker shows an alternative chart.\n */\n @Input({ required: true }) loadOuLabelMap!: () => Observable<Record<string, string>>;\n\n @Input({ required: true })\n grantToUser!: (userId: string, level: string, applyToChildren: boolean) => Observable<void>;\n\n @Input({ required: true })\n grantToOu!: (ouId: string, level: string, applyToChildren: boolean) => Observable<void>;\n\n @Input({ required: true }) updatePermission!: (id: string, level: string) => Observable<void>;\n\n @Input({ required: true }) revokePermission!: (id: string) => Observable<void>;\n\n /** When true, show “apply to children” (e.g. folders). */\n @Input() showApplyToChildren = false;\n\n /** Override level dropdown options (e.g. notes: View / Edit only). */\n @Input() permissionLevels?: SharePanelLevelOption[];\n\n /** i18n key for wildcard app grant label */\n @Input() everyoneLabelKey = 'files.share.everyone';\n\n @Output() close = new EventEmitter<void>();\n\n private destroyRef = inject(DestroyRef);\n private i18n = inject(I18nService);\n\n permissions = signal<SharePermissionEntry[]>([]);\n loading = signal(true);\n searchQuery = '';\n newLevel = '';\n applyToChildren = false;\n searchResults = signal<ShareUserResult[]>([]);\n ouTree = signal<ShareOuNode[]>([]);\n showOuPicker = signal(false);\n chartOptions = signal<ShareOrgChartOption[]>([]);\n selectedOrgChartId = signal<string | null>(null);\n /** Default-tree id → display name for permission rows (OU grants). */\n private readonly ouLabelById = signal<Record<string, string>>({});\n\n private searchTimeout: ReturnType<typeof setTimeout> | null = null;\n /** Emits after chart options load; further emissions on user chart changes (no initial null). */\n private readonly selectedChartId$ = new ReplaySubject<string | null>(1);\n\n ngOnInit(): void {\n const levels = this.levelOptions;\n this.newLevel = levels[0]?.value ?? 'View';\n this.refreshPermissions();\n\n this.loadOuLabelMap()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (m) => this.ouLabelById.set(m),\n error: () => this.ouLabelById.set({}),\n });\n\n this.selectedChartId$\n .pipe(\n switchMap((id) => this.loadOuTree(id)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe({\n next: (tree) => this.ouTree.set(tree),\n error: () => this.ouTree.set([]),\n });\n\n this.loadChartOptions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (opts) => {\n this.chartOptions.set(opts);\n const first = opts[0];\n const initial = first ? first.id : null;\n this.selectedOrgChartId.set(initial);\n this.selectedChartId$.next(initial);\n },\n error: () => {\n this.chartOptions.set([]);\n this.selectedOrgChartId.set(null);\n this.selectedChartId$.next(null);\n },\n });\n }\n\n onOrgChartSelectChange(chartId: string | null): void {\n this.selectedOrgChartId.set(chartId);\n this.selectedChartId$.next(chartId);\n }\n\n get levelOptions(): SharePanelLevelOption[] {\n const p = this.permissionLevels;\n return p && p.length > 0 ? p : SHARE_PANEL_DEFAULT_FILE_LEVELS;\n }\n\n refreshPermissions(): void {\n this.loading.set(true);\n this.loadPermissions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (perms) => {\n this.permissions.set(perms);\n this.loading.set(false);\n },\n error: () => {\n this.permissions.set([]);\n this.loading.set(false);\n },\n });\n }\n\n onSearchInput(): void {\n if (this.searchTimeout) clearTimeout(this.searchTimeout);\n const query = this.searchQuery.trim();\n if (query.length < 2) {\n this.searchResults.set([]);\n return;\n }\n\n this.searchTimeout = setTimeout(() => {\n this.searchUsers(query)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (items) => this.searchResults.set(items),\n error: () => this.searchResults.set([]),\n });\n }, 300);\n }\n\n onGrantToUser(user: ShareUserResult): void {\n this.searchResults.set([]);\n this.searchQuery = '';\n this.grantToUser(user.id, this.newLevel, this.applyToChildren)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n onGrantToOu(ou: ShareOuNode): void {\n this.grantToOu(ou.id, this.newLevel, this.applyToChildren)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n onUpdateLevel(perm: SharePermissionEntry, level: string): void {\n this.updatePermission(perm.id, level)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n onRevokePermission(perm: SharePermissionEntry): void {\n this.revokePermission(perm.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n getPermIcon(perm: SharePermissionEntry): string {\n if (perm.grantedToUserId) return 'pi pi-user';\n if (perm.grantedToOuId) return 'pi pi-sitemap';\n if (perm.grantedToAppId) return 'pi pi-globe';\n return 'pi pi-question';\n }\n\n /** Logical start padding for OU hierarchy (roots align with section padding). */\n ouIndentStartPx(ou: ShareOuNode): number {\n const d = ou.depth ?? 0;\n return 12 + d * 18;\n }\n\n getPermLabel(perm: SharePermissionEntry): string {\n if (perm.displayName?.trim()) return perm.displayName.trim();\n if (perm.grantedToUserId) {\n return `${perm.grantedToUserId.substring(0, 8)}…`;\n }\n if (perm.grantedToOuId) {\n const id = perm.grantedToOuId;\n const fromDefault = this.ouLabelById()[id];\n if (fromDefault) return fromDefault;\n const ou = this.ouTree().find((o) => o.id === id);\n if (ou) return ou.displayName;\n return `${id.substring(0, 8)}…`;\n }\n if (perm.grantedToAppId === '*') return this.i18n.t(this.everyoneLabelKey);\n return perm.grantedToAppId ?? '';\n }\n\n}\n","<div class=\"fac-overlay\" (click)=\"close.emit()\">\n <div class=\"fac-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"fac-header\">\n <h3>{{ titleKey | translate }}</h3>\n <span class=\"fac-target-name\">{{ targetName }}</span>\n <button type=\"button\" class=\"fac-close\" (click)=\"close.emit()\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <div class=\"fac-add-section\">\n <div class=\"fac-search-row\">\n <input\n type=\"text\"\n class=\"fac-input\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchInput()\"\n [placeholder]=\"'files.share.search_placeholder' | translate\"\n />\n <select class=\"fac-select\" [(ngModel)]=\"newLevel\">\n @for (opt of levelOptions; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.labelKey | translate }}</option>\n }\n </select>\n </div>\n\n @if (searchResults().length > 0) {\n <div class=\"fac-search-results\">\n @for (result of searchResults(); track result.id) {\n <div class=\"fac-search-item\" (click)=\"onGrantToUser(result)\">\n <i class=\"pi pi-user\" aria-hidden=\"true\"></i>\n <span>{{ result.firstName }} {{ result.lastName }}</span>\n <span class=\"fac-email\">{{ result.email }}</span>\n </div>\n }\n </div>\n }\n\n @if (chartOptions().length > 0) {\n <div class=\"fac-chart-row\">\n <label for=\"fac-org-chart-select\" class=\"fac-section-label\">{{\n 'files.share.org_chart' | translate\n }}</label>\n <select\n id=\"fac-org-chart-select\"\n class=\"fac-select\"\n [ngModel]=\"selectedOrgChartId()\"\n (ngModelChange)=\"onOrgChartSelectChange($event)\">\n @for (opt of chartOptions(); track $index) {\n <option [ngValue]=\"opt.id\">{{ opt.name }}</option>\n }\n </select>\n </div>\n }\n\n @if (showOuPicker()) {\n <div class=\"fac-ou-section\">\n <div class=\"fac-section-label\">{{ 'files.share.share_with_ou' | translate }}</div>\n @for (ou of ouTree(); track ou.id) {\n <div\n class=\"fac-ou-item\"\n [style.padding-inline-start.px]=\"ouIndentStartPx(ou)\"\n (click)=\"onGrantToOu(ou)\"\n >\n <i class=\"pi pi-sitemap\" aria-hidden=\"true\"></i>\n <span>{{ ou.displayName }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"fac-toggle-row\">\n <button type=\"button\" class=\"fac-link\" (click)=\"showOuPicker.set(!showOuPicker())\">\n {{ showOuPicker() ? ('files.share.hide_ous' | translate) : ('files.share.show_ous' | translate) }}\n </button>\n @if (showApplyToChildren) {\n <label class=\"fac-checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"applyToChildren\" />\n {{ 'files.share.apply_children' | translate }}\n </label>\n }\n </div>\n </div>\n\n <div class=\"fac-perms-section\">\n <div class=\"fac-section-label\">{{ 'files.share.current_permissions' | translate }}</div>\n @if (loading()) {\n <div class=\"fac-loading\"><i class=\"pi pi-spin pi-spinner\" aria-hidden=\"true\"></i></div>\n } @else if (permissions().length === 0) {\n <div class=\"fac-empty\">{{ 'files.share.no_permissions' | translate }}</div>\n } @else {\n @for (perm of permissions(); track perm.id) {\n <div class=\"fac-perm-row\">\n <div class=\"fac-perm-info\">\n <i [class]=\"getPermIcon(perm)\" aria-hidden=\"true\"></i>\n <span class=\"fac-perm-name\">{{ getPermLabel(perm) }}</span>\n @if (perm.isInherited) {\n <span class=\"fac-badge inherited\">{{ 'files.share.inherited' | translate }}</span>\n }\n </div>\n <div class=\"fac-perm-actions\">\n <select\n class=\"fac-select sm\"\n [ngModel]=\"perm.level\"\n (ngModelChange)=\"onUpdateLevel(perm, $event)\"\n [disabled]=\"perm.isInherited === true\"\n >\n @for (opt of levelOptions; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.labelKey | translate }}</option>\n }\n </select>\n <button\n type=\"button\"\n class=\"fac-icon-btn danger\"\n (click)=\"onRevokePermission(perm)\"\n [disabled]=\"perm.isInherited === true\"\n [title]=\"'files.share.revoke' | translate\"\n >\n <i class=\"pi pi-trash\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n</div>\n","import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\n\n/** Full-bleed loading overlay for window content (shell) or embedded hosts. */\n@Component({\n selector: 'fly-block-ui',\n standalone: true,\n imports: [TranslatePipe],\n templateUrl: './block-ui.component.html',\n styleUrl: './block-ui.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FlyBlockUiComponent {\n /** When false, the overlay is not rendered (host may use @if instead). */\n active = input.required<boolean>();\n\n /** i18n key for status text; empty uses `common.loading`. */\n messageKey = input('');\n\n readonly resolvedMessageKey = computed(() => {\n const k = this.messageKey()?.trim();\n return k && k.length > 0 ? k : 'common.loading';\n });\n}\n","@if (active()) {\n <div\n class=\"fly-block-ui\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n [attr.aria-label]=\"resolvedMessageKey() | translate\">\n <div class=\"fly-block-ui__card\">\n <i class=\"pi pi-spin pi-spinner fly-block-ui__spinner\" aria-hidden=\"true\"></i>\n <span class=\"fly-block-ui__text\">{{ resolvedMessageKey() | translate }}</span>\n </div>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport type { FlyFileInfo } from '../../models/file.model';\nimport Cropper from 'cropperjs';\n\n/**\n * Image upload component with built-in cropperjs cropping modal.\n *\n * Usage:\n * ```html\n * <fly-image-upload\n * [aspectRatio]=\"16/9\"\n * [currentImageId]=\"trend.coverImageId\"\n * sourceApp=\"circles\"\n * sourceEntityType=\"trend\"\n * (uploaded)=\"onImageUploaded($event)\"\n * (removed)=\"onImageRemoved()\"\n * />\n * ```\n */\n@Component({\n selector: 'fly-image-upload',\n standalone: true,\n imports: [TranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div class=\"fly-image-upload\">\n @if (previewUrl()) {\n <div class=\"fly-image-upload__preview\">\n <img [src]=\"previewUrl()\" alt=\"\" class=\"fly-image-upload__img\" />\n <div class=\"fly-image-upload__overlay\">\n <button type=\"button\" class=\"fly-image-upload__action-btn\" (click)=\"triggerFileInput()\" [title]=\"'files.imageUpload.change' | translate\">\n <span class=\"pi pi-pencil\" aria-hidden=\"true\"></span>\n </button>\n <button type=\"button\" class=\"fly-image-upload__action-btn fly-image-upload__action-btn--danger\" (click)=\"removeImage()\" [title]=\"'files.imageUpload.remove' | translate\">\n <span class=\"pi pi-trash\" aria-hidden=\"true\"></span>\n </button>\n </div>\n </div>\n } @else {\n <button type=\"button\" class=\"fly-image-upload__dropzone\" (click)=\"triggerFileInput()\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event)\">\n @if (uploading()) {\n <span class=\"pi pi-spin pi-spinner fly-image-upload__icon\" aria-hidden=\"true\"></span>\n <span class=\"fly-image-upload__label\">{{ 'files.imageUpload.uploading' | translate }}</span>\n } @else {\n <span class=\"pi pi-image fly-image-upload__icon\" aria-hidden=\"true\"></span>\n <span class=\"fly-image-upload__label\">{{ 'files.imageUpload.placeholder' | translate }}</span>\n <span class=\"fly-image-upload__hint\">{{ sizeHint() }}</span>\n }\n </button>\n }\n\n @if (error()) {\n <div class=\"fly-image-upload__error\">{{ error() }}</div>\n }\n\n <input #fileInput type=\"file\" accept=\"image/*\" class=\"fly-image-upload__hidden\" (change)=\"onFileSelected($event)\" />\n\n @if (showCropper()) {\n <div class=\"fly-image-upload__crop-backdrop\" (click)=\"cancelCrop()\">\n <div class=\"fly-image-upload__crop-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"fly-image-upload__crop-header\">\n <h3>{{ 'files.imageUpload.crop' | translate }}</h3>\n </div>\n <div class=\"fly-image-upload__crop-body\">\n <img #cropImage [src]=\"rawImageUrl()\" alt=\"\" />\n </div>\n <div class=\"fly-image-upload__crop-footer\">\n <button type=\"button\" class=\"vos-btn sm platter\" (click)=\"cancelCrop()\">{{ 'common.cancel' | translate }}</button>\n <button type=\"button\" class=\"vos-btn sm primary\" (click)=\"applyCrop()\">{{ 'files.imageUpload.apply' | translate }}</button>\n </div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [\n /* cropperjs v1 styles (MIT — Chen Fengyuan) */\n `.cropper-container{-webkit-touch-callout:none;direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;user-select:none}.cropper-container img{backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:rgba(51,153,255,.75);overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:\" \";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC\")}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}`,\n `\n .fly-image-upload { display: flex; flex-direction: column; gap: 6px; }\n .fly-image-upload__hidden { display: none; }\n\n .fly-image-upload__dropzone {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 8px; padding: 24px; border: 2px dashed var(--separator-primary, #e5e7eb);\n border-radius: 12px; background: var(--fill-quaternary, #f9fafb); cursor: pointer;\n transition: border-color 0.15s, background 0.15s; min-height: 120px;\n }\n .fly-image-upload__dropzone:hover { border-color: var(--accent-primary, #0071e3); background: var(--fill-tertiary, #f3f4f6); }\n .fly-image-upload__icon { font-size: 28px; color: var(--label-tertiary, #9ca3af); }\n .fly-image-upload__label { font-size: 13px; color: var(--label-secondary, #6b7280); }\n .fly-image-upload__hint { font-size: 11px; color: var(--label-tertiary, #9ca3af); }\n\n .fly-image-upload__preview { position: relative; border-radius: 12px; overflow: hidden; }\n .fly-image-upload__img { display: block; width: 100%; max-height: 280px; object-fit: cover; border-radius: 12px; }\n .fly-image-upload__overlay {\n position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;\n gap: 12px; background: rgba(0,0,0,0.35); opacity: 0; transition: opacity 0.15s;\n }\n .fly-image-upload__preview:hover .fly-image-upload__overlay { opacity: 1; }\n .fly-image-upload__action-btn {\n width: 36px; height: 36px; border-radius: 50%; border: none; cursor: pointer;\n display: flex; align-items: center; justify-content: center;\n background: rgba(255,255,255,0.9); color: var(--label-primary, #1f2937); font-size: 14px;\n transition: background 0.15s;\n }\n .fly-image-upload__action-btn:hover { background: #fff; }\n .fly-image-upload__action-btn--danger:hover { background: #fee2e2; color: #dc2626; }\n\n .fly-image-upload__error { font-size: 12px; color: var(--system-red, #ef4444); }\n\n .fly-image-upload__crop-backdrop {\n position: fixed; inset: 0; z-index: 10000; display: flex; align-items: center; justify-content: center;\n background: rgba(0,0,0,0.6); backdrop-filter: blur(4px);\n }\n .fly-image-upload__crop-modal {\n background: var(--bg-primary, #fff); border-radius: 16px; overflow: hidden;\n max-width: 700px; width: 90vw; box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n }\n .fly-image-upload__crop-header { padding: 16px 20px; border-bottom: 1px solid var(--separator-primary, #e5e7eb); }\n .fly-image-upload__crop-header h3 { margin: 0; font-size: 16px; font-weight: 600; }\n .fly-image-upload__crop-body { max-height: 60vh; overflow: hidden; }\n .fly-image-upload__crop-body img { display: block; max-width: 100%; }\n .fly-image-upload__crop-footer { display: flex; justify-content: flex-end; gap: 10px; padding: 14px 20px; border-top: 1px solid var(--separator-primary, #e5e7eb); }\n `],\n})\nexport class FlyImageUploadComponent {\n private http = inject(HttpClient);\n\n // ── Inputs ──\n aspectRatio = input(16 / 9);\n maxSizeBytes = input(5 * 1024 * 1024);\n currentImageId = input<string | null>(null);\n sourceApp = input('unknown');\n sourceEntityType = input<string | null>(null);\n sourceEntityId = input<string | null>(null);\n\n // ── Outputs ──\n uploaded = output<FlyFileInfo>();\n removed = output<void>();\n\n // ── State ──\n uploading = signal(false);\n error = signal<string | null>(null);\n showCropper = signal(false);\n rawImageUrl = signal<string>('');\n localBlob = signal<string | null>(null);\n\n fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n cropImage = viewChild<ElementRef<HTMLImageElement>>('cropImage');\n\n private cropper: Cropper | null = null;\n private selectedFile: File | null = null;\n\n previewUrl = computed(() => {\n if (this.localBlob()) return this.localBlob();\n const id = this.currentImageId();\n return id ? `/api/files/${id}/download` : null;\n });\n\n sizeHint = computed(() => {\n const mb = this.maxSizeBytes() / (1024 * 1024);\n return `Max ${mb}MB`;\n });\n\n triggerFileInput(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n onDragOver(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n }\n\n onDrop(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n const file = e.dataTransfer?.files?.[0];\n if (file) this.processFile(file);\n }\n\n onFileSelected(e: Event): void {\n const input = e.target as HTMLInputElement;\n const file = input.files?.[0];\n if (file) this.processFile(file);\n input.value = '';\n }\n\n removeImage(): void {\n this.localBlob.set(null);\n this.error.set(null);\n this.removed.emit();\n }\n\n cancelCrop(): void {\n this.showCropper.set(false);\n this.destroyCropper();\n if (this.rawImageUrl()) URL.revokeObjectURL(this.rawImageUrl());\n this.rawImageUrl.set('');\n }\n\n applyCrop(): void {\n if (!this.cropper) return;\n const canvas = this.cropper.getCroppedCanvas({ maxWidth: 1920, maxHeight: 1080 });\n this.showCropper.set(false);\n this.destroyCropper();\n if (this.rawImageUrl()) URL.revokeObjectURL(this.rawImageUrl());\n this.rawImageUrl.set('');\n\n canvas.toBlob((blob) => {\n if (!blob) return;\n const fileName = this.selectedFile?.name ?? 'cropped-image.jpg';\n const file = new File([blob], fileName, { type: blob.type || 'image/jpeg' });\n this.uploadFile(file);\n }, 'image/jpeg', 0.9);\n }\n\n private processFile(file: File): void {\n this.error.set(null);\n\n if (!file.type.startsWith('image/')) {\n this.error.set('Only image files are allowed');\n return;\n }\n if (file.size > this.maxSizeBytes()) {\n const mb = this.maxSizeBytes() / (1024 * 1024);\n this.error.set(`File exceeds ${mb}MB limit`);\n return;\n }\n\n this.selectedFile = file;\n const url = URL.createObjectURL(file);\n this.rawImageUrl.set(url);\n this.showCropper.set(true);\n\n // Wait for next tick so cropImage element is in DOM\n setTimeout(() => this.initCropper(), 0);\n }\n\n private initCropper(): void {\n this.destroyCropper();\n const imgEl = this.cropImage()?.nativeElement;\n if (!imgEl) return;\n this.cropper = new Cropper(imgEl, {\n aspectRatio: this.aspectRatio(),\n viewMode: 1,\n autoCropArea: 0.9,\n responsive: true,\n background: false,\n });\n }\n\n private destroyCropper(): void {\n this.cropper?.destroy();\n this.cropper = null;\n }\n\n private uploadFile(file: File): void {\n this.uploading.set(true);\n this.error.set(null);\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n formData.append('sourceApp', this.sourceApp());\n if (this.sourceEntityType()) formData.append('sourceEntityType', this.sourceEntityType()!);\n if (this.sourceEntityId()) formData.append('sourceEntityId', this.sourceEntityId()!);\n\n this.http.post<{ data: FlyFileInfo }>('/api/files/upload', formData).subscribe({\n next: (res) => {\n this.uploading.set(false);\n const info = res.data ?? (res as any);\n this.localBlob.set(URL.createObjectURL(file));\n this.uploaded.emit(info);\n },\n error: (err) => {\n this.uploading.set(false);\n this.error.set(err?.error?.message ?? 'Upload failed');\n },\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { HttpClient, HttpEventType } from '@angular/common/http';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport type { FlyFileInfo } from '../../models/file.model';\n\ninterface UploadSlot {\n file: File;\n progress: number; // 0–100\n status: 'uploading' | 'done' | 'error';\n info?: FlyFileInfo;\n error?: string;\n}\n\nconst FILE_ICONS: Record<string, string> = {\n 'application/pdf': 'pi-file-pdf',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'pi-file-word',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'pi-file-excel',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'pi-file',\n 'image/': 'pi-image',\n 'video/': 'pi-video',\n 'audio/': 'pi-volume-up',\n};\n\nfunction iconForType(contentType: string): string {\n for (const [prefix, icon] of Object.entries(FILE_ICONS)) {\n if (contentType.startsWith(prefix)) return icon;\n }\n return 'pi-file';\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Multi-file upload with drag-drop, progress, and validation.\n *\n * Usage:\n * ```html\n * <fly-file-upload\n * [maxFiles]=\"5\"\n * [maxFileSizeBytes]=\"5242880\"\n * accept=\".pdf,.docx,.xlsx\"\n * [(files)]=\"trend.attachments\"\n * sourceApp=\"circles\"\n * sourceEntityType=\"trend\"\n * (filesChanged)=\"onAttachmentsChanged($event)\"\n * />\n * ```\n */\n@Component({\n selector: 'fly-file-upload',\n standalone: true,\n imports: [TranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"fly-file-upload\">\n @if (canAddMore()) {\n <div class=\"fly-file-upload__dropzone\"\n [class.fly-file-upload__dropzone--drag]=\"dragging()\"\n (click)=\"triggerFileInput()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n <span class=\"pi pi-cloud-upload fly-file-upload__icon\" aria-hidden=\"true\"></span>\n <span class=\"fly-file-upload__label\">{{ 'files.fileUpload.dropOrClick' | translate }}</span>\n <span class=\"fly-file-upload__hint\">{{ limitHint() }}</span>\n </div>\n }\n\n @if (error()) {\n <div class=\"fly-file-upload__error\">{{ error() }}</div>\n }\n\n @if (allSlots().length) {\n <ul class=\"fly-file-upload__list\">\n @for (slot of allSlots(); track slot.file.name + slot.file.size) {\n <li class=\"fly-file-upload__item\">\n <span class=\"pi {{ iconFor(slot) }} fly-file-upload__file-icon\" aria-hidden=\"true\"></span>\n <div class=\"fly-file-upload__file-info\">\n <span class=\"fly-file-upload__file-name\">{{ slot.file.name }}</span>\n <span class=\"fly-file-upload__file-size\">{{ formatFileSize(slot.file.size) }}</span>\n </div>\n @if (slot.status === 'uploading') {\n <div class=\"fly-file-upload__progress-track\">\n <div class=\"fly-file-upload__progress-fill\" [style.width.%]=\"slot.progress\"></div>\n </div>\n }\n @if (slot.status === 'error') {\n <span class=\"fly-file-upload__file-error\" [title]=\"slot.error ?? ''\">\n <span class=\"pi pi-exclamation-triangle\" aria-hidden=\"true\"></span>\n </span>\n }\n @if (slot.status === 'done') {\n <span class=\"pi pi-check-circle fly-file-upload__file-ok\" aria-hidden=\"true\"></span>\n }\n <button type=\"button\" class=\"fly-file-upload__remove-btn\" (click)=\"removeSlot(slot)\" [title]=\"'common.remove' | translate\">\n <span class=\"pi pi-times\" aria-hidden=\"true\"></span>\n </button>\n </li>\n }\n </ul>\n }\n\n @if (existingFiles().length && !allSlots().length) {\n <ul class=\"fly-file-upload__list\">\n @for (f of existingFiles(); track f.id) {\n <li class=\"fly-file-upload__item\">\n <span class=\"pi {{ iconForInfo(f) }} fly-file-upload__file-icon\" aria-hidden=\"true\"></span>\n <div class=\"fly-file-upload__file-info\">\n <span class=\"fly-file-upload__file-name\">{{ f.fileName }}</span>\n <span class=\"fly-file-upload__file-size\">{{ formatFileSize(f.sizeBytes) }}</span>\n </div>\n <span class=\"pi pi-check-circle fly-file-upload__file-ok\" aria-hidden=\"true\"></span>\n <button type=\"button\" class=\"fly-file-upload__remove-btn\" (click)=\"removeExisting(f)\" [title]=\"'common.remove' | translate\">\n <span class=\"pi pi-times\" aria-hidden=\"true\"></span>\n </button>\n </li>\n }\n </ul>\n }\n\n <input #fileInput type=\"file\" [accept]=\"accept()\" multiple class=\"fly-file-upload__hidden\" (change)=\"onFilesSelected($event)\" />\n </div>\n `,\n styles: [`\n .fly-file-upload { display: flex; flex-direction: column; gap: 8px; }\n .fly-file-upload__hidden { display: none; }\n\n .fly-file-upload__dropzone {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 6px; padding: 20px; border: 2px dashed var(--separator-primary, #e5e7eb);\n border-radius: 10px; background: var(--fill-quaternary, #f9fafb); cursor: pointer;\n transition: border-color 0.15s, background 0.15s;\n }\n .fly-file-upload__dropzone:hover,\n .fly-file-upload__dropzone--drag { border-color: var(--accent-primary, #0071e3); background: var(--fill-tertiary, #f3f4f6); }\n .fly-file-upload__icon { font-size: 24px; color: var(--label-tertiary, #9ca3af); }\n .fly-file-upload__label { font-size: 13px; color: var(--label-secondary, #6b7280); }\n .fly-file-upload__hint { font-size: 11px; color: var(--label-tertiary, #9ca3af); }\n\n .fly-file-upload__error { font-size: 12px; color: var(--system-red, #ef4444); padding: 4px 0; }\n\n .fly-file-upload__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }\n .fly-file-upload__item {\n display: flex; align-items: center; gap: 10px; padding: 8px 12px;\n border: 1px solid var(--separator-primary, #e5e7eb); border-radius: 8px;\n background: var(--fill-quaternary, #f9fafb); font-size: 13px;\n }\n .fly-file-upload__file-icon { font-size: 18px; color: var(--label-tertiary, #9ca3af); flex-shrink: 0; }\n .fly-file-upload__file-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }\n .fly-file-upload__file-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--label-primary, #1f2937); }\n .fly-file-upload__file-size { font-size: 11px; color: var(--label-tertiary, #9ca3af); }\n\n .fly-file-upload__progress-track { width: 60px; height: 4px; border-radius: 2px; background: var(--fill-tertiary, #e5e7eb); overflow: hidden; }\n .fly-file-upload__progress-fill { height: 100%; background: var(--accent-primary, #0071e3); border-radius: 2px; transition: width 0.2s; }\n\n .fly-file-upload__file-ok { color: var(--system-green, #22c55e); font-size: 14px; }\n .fly-file-upload__file-error { color: var(--system-red, #ef4444); font-size: 14px; }\n\n .fly-file-upload__remove-btn {\n background: none; border: none; cursor: pointer; color: var(--label-tertiary, #9ca3af);\n width: 24px; height: 24px; display: flex; align-items: center; justify-content: center;\n border-radius: 4px; transition: color 0.15s, background 0.15s; flex-shrink: 0;\n }\n .fly-file-upload__remove-btn:hover { color: var(--system-red, #ef4444); background: var(--fill-tertiary, #f3f4f6); }\n `],\n})\nexport class FlyFileUploadComponent {\n private http = inject(HttpClient);\n\n // ── Inputs ──\n maxFiles = input(5);\n maxFileSizeBytes = input(5 * 1024 * 1024);\n accept = input('');\n sourceApp = input('unknown');\n sourceEntityType = input<string | null>(null);\n sourceEntityId = input<string | null>(null);\n\n /** Two-way model for completed file metadata. */\n files = model<FlyFileInfo[]>([]);\n\n // ── Outputs ──\n filesChanged = output<FlyFileInfo[]>();\n\n // ── State ──\n error = signal<string | null>(null);\n dragging = signal(false);\n slots = signal<UploadSlot[]>([]);\n\n /** Pre-existing files loaded from the entity (before any new uploads this session). */\n existingFiles = signal<FlyFileInfo[]>([]);\n\n fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n\n allSlots = computed(() => this.slots());\n\n canAddMore = computed(() => {\n const current = this.files().length + this.slots().filter(s => s.status === 'uploading').length;\n return current < this.maxFiles();\n });\n\n limitHint = computed(() => {\n const mb = this.maxFileSizeBytes() / (1024 * 1024);\n return `Max ${this.maxFiles()} files, ${mb}MB each`;\n });\n\n triggerFileInput(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n onDragOver(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n this.dragging.set(true);\n }\n\n onDragLeave(e: DragEvent): void {\n e.preventDefault();\n this.dragging.set(false);\n }\n\n onDrop(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n this.dragging.set(false);\n const fileList = e.dataTransfer?.files;\n if (fileList) this.processFiles(Array.from(fileList));\n }\n\n onFilesSelected(e: Event): void {\n const input = e.target as HTMLInputElement;\n if (input.files) this.processFiles(Array.from(input.files));\n input.value = '';\n }\n\n removeSlot(slot: UploadSlot): void {\n this.slots.update(s => s.filter(x => x !== slot));\n if (slot.info) {\n this.files.update(f => f.filter(x => x.id !== slot.info!.id));\n this.filesChanged.emit(this.files());\n }\n }\n\n removeExisting(f: FlyFileInfo): void {\n this.existingFiles.update(list => list.filter(x => x.id !== f.id));\n this.files.update(list => list.filter(x => x.id !== f.id));\n this.filesChanged.emit(this.files());\n }\n\n iconFor(slot: UploadSlot): string { return iconForType(slot.file.type); }\n iconForInfo(f: FlyFileInfo): string { return iconForType(f.contentType); }\n formatFileSize(bytes: number): string { return formatSize(bytes); }\n\n private processFiles(newFiles: File[]): void {\n this.error.set(null);\n const currentCount = this.files().length + this.slots().filter(s => s.status === 'uploading').length;\n const remaining = this.maxFiles() - currentCount;\n\n if (remaining <= 0) {\n this.error.set(`Maximum ${this.maxFiles()} files allowed`);\n return;\n }\n\n const toUpload = newFiles.slice(0, remaining);\n if (newFiles.length > remaining) {\n this.error.set(`Only ${remaining} more file(s) can be added`);\n }\n\n for (const file of toUpload) {\n if (file.size > this.maxFileSizeBytes()) {\n const mb = this.maxFileSizeBytes() / (1024 * 1024);\n this.error.set(`\"${file.name}\" exceeds ${mb}MB limit`);\n continue;\n }\n this.uploadFile(file);\n }\n }\n\n private uploadFile(file: File): void {\n const slot: UploadSlot = { file, progress: 0, status: 'uploading' };\n this.slots.update(s => [...s, slot]);\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n formData.append('sourceApp', this.sourceApp());\n if (this.sourceEntityType()) formData.append('sourceEntityType', this.sourceEntityType()!);\n if (this.sourceEntityId()) formData.append('sourceEntityId', this.sourceEntityId()!);\n\n this.http.post<{ data: FlyFileInfo }>('/api/files/upload', formData, {\n reportProgress: true,\n observe: 'events',\n }).subscribe({\n next: (event) => {\n if (event.type === HttpEventType.UploadProgress && event.total) {\n slot.progress = Math.round((event.loaded / event.total) * 100);\n this.slots.update(s => [...s]); // trigger signal change\n } else if (event.type === HttpEventType.Response) {\n const info = (event.body as any)?.data ?? event.body;\n slot.status = 'done';\n slot.progress = 100;\n slot.info = info;\n this.slots.update(s => [...s]);\n this.files.update(f => [...f, info]);\n this.filesChanged.emit(this.files());\n }\n },\n error: (err) => {\n slot.status = 'error';\n slot.error = err?.error?.message ?? 'Upload failed';\n this.slots.update(s => [...s]);\n },\n });\n }\n}\n","/*\r\n * @mohamedatia/fly-design-system — Public API\r\n * https://www.npmjs.com/package/@mohamedatia/fly-design-system\r\n *\r\n * This is the single entry point for Business / Supporting App developers.\r\n * Import everything from '@mohamedatia/fly-design-system' — never from relative shell paths.\r\n *\r\n * NOTE: This package is published under @mohamedatia/fly-design-system until the @fly\r\n * npm org is created. It will be republished as @fly/design-system once available.\r\n *\r\n * v1.3.0: FlyThemeService (html theme classes), hardened I18nService (AbortSignal, ErrorHandler, RTL helpers).\r\n * v1.3.1: loadBundle normalizes locale JSON (flat or nested objects; rejects invalid leaves).\r\n * v1.3.2: loadBundle returns boolean; LoadBundleOptions.silent skips ErrorHandler on failure.\r\n * v1.3.7: MockAuthService base class + MockAuthConfig for Business App mock auth via fileReplacements.\r\n * User model extended with optional avatar, source, twoFactorEnabled, createdAt fields.\r\n * v1.3.8: AuthService.init() no-op added so Business Apps can call init() in APP_INITIALIZER\r\n * without branching between standalone and embedded modes.\r\n * v1.3.9: MockAuthService field initializers moved into constructor to fix ngDevMode ReferenceError\r\n * when the package is loaded in a production-mode bundle (no ngDevMode global defined).\r\n * v1.4.0: ContextMenuComponent (positioned menu, keyboard nav, focus management) moved from desktop\r\n * shell to design system. MessageBoxService + MessageBoxComponent added (Windows Forms-style\r\n * modal dialogs with localized button labels, focus management, and Escape key support).\r\n * MessageBoxButtons, MessageBoxIcon, DialogResult, MessageBoxOptions, MessageBoxButton exported.\r\n * v1.5.0: SharePanelComponent — generic share/ACL overlay; host supplies API callbacks and optional\r\n * permission level options (file ACL vs note-style View/Edit).\r\n * v1.6.0: SharePanelComponent — `loadOuTree(chartId: string | null)`; optional `loadChartOptions` for\r\n * default vs alternative org charts (OU grants still use real OU ids). `ShareOrgChartOption` exported.\r\n * v1.7.0: SharePanelComponent — `loadChartOptions` and `loadOuLabelMap` are required; chart tree loads after\r\n * options resolve (no spurious null fetch). `loadOuLabelMap` supplies default-tree labels for OU rows.\r\n * v1.8.0: `WindowInstance` optional `contentUiBlocked` / `contentUiBlockMessageKey`; `WindowManagerService`\r\n * `beginContentUiBlock` / `endContentUiBlock` default no-ops; `FlyBlockUiComponent` for shell window overlay.\r\n * See docs/ExternalAppsGuide/03-frontend-app.md.\r\n */\r\n\r\n// ─── Models ──────────────────────────────────────────────────────────────────\r\nexport type { DesktopApp, DesktopAppKind } from './lib/models/app.model';\r\nexport type {\r\n WindowInstance,\r\n WindowState,\r\n ChildWindowData,\r\n} from './lib/models/window.model';\r\nexport { WINDOW_DATA } from './lib/models/window.model';\r\nexport type { User } from './lib/models/user.model';\r\n\r\nexport type {\r\n SharePermissionEntry,\r\n ShareUserResult,\r\n ShareOuNode,\r\n ShareOrgChartOption,\r\n SharePanelLevelOption,\r\n} from './lib/models/share-panel.model';\r\n\r\n// ─── Remote App Registration ─────────────────────────────────────────────────\r\nexport type { RemoteAppDef } from './lib/models/remote-app.model';\r\n\r\n// ─── Services ────────────────────────────────────────────────────────────────\r\nexport { AuthService } from './lib/services/auth.service';\r\nexport type { LoadBundleOptions } from './lib/services/i18n.service';\r\nexport { I18nService, RTL_LOCALE_SET, isRtlLocale } from './lib/services/i18n.service';\r\nexport {\r\n FlyThemeService,\r\n type FlyThemeMode,\r\n DEFAULT_FLY_THEME_MODE,\r\n FLY_THEME_MODE_IDS,\r\n normalizeFlyTheme,\r\n} from './lib/services/fly-theme.service';\r\nexport {\r\n WindowManagerService,\r\n StandaloneWindowManagerService,\r\n type OpenWindowOptions,\r\n} from './lib/services/window-manager.service';\r\n\r\n// ─── Pipes ───────────────────────────────────────────────────────────────────\r\nexport { TranslatePipe } from './lib/pipes/translate.pipe';\r\n\r\n// ─── Mock Auth (for fileReplacements in dev/mock builds) ─────────────────────\r\nexport { MockAuthService, type MockAuthConfig } from './lib/services/auth.service.mock';\r\n\r\n// ─── Components ──────────────────────────────────────────────────────────────\r\nexport {\r\n ContextMenuComponent,\r\n type ContextMenuItem,\r\n type ContextMenuSection,\r\n} from './lib/components/context-menu/context-menu.component';\r\n\r\nexport {\r\n MessageBoxComponent,\r\n} from './lib/components/message-box/message-box.component';\r\n\r\nexport {\r\n MessageBoxService,\r\n MessageBoxButtons,\r\n MessageBoxIcon,\r\n DialogResult,\r\n type MessageBoxOptions,\r\n type MessageBoxButton,\r\n} from './lib/components/message-box/message-box.service';\r\n\r\nexport {\r\n SharePanelComponent,\r\n SHARE_PANEL_DEFAULT_FILE_LEVELS,\r\n} from './lib/components/share-panel/share-panel.component';\r\n\r\nexport { FlyBlockUiComponent } from './lib/components/block-ui/block-ui.component';\r\n\r\n// ─── File Upload Components ─────────────────────────────────────────────────\r\nexport type { FlyFileInfo } from './lib/models/file.model';\r\n\r\nexport { FlyImageUploadComponent } from './lib/components/image-upload/fly-image-upload.component';\r\n\r\nexport { FlyFileUploadComponent } from './lib/components/file-upload/fly-file-upload.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mohamedatia/fly-design-system",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"description": "FlyOS design system — shared components, directives, pipes, services, and models for Business App developers.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"flyos",
|
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
"angular"
|
|
9
9
|
],
|
|
10
10
|
"license": "MIT",
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"cropperjs": "^1.6.2",
|
|
13
|
+
"tslib": "^2.3.0"
|
|
14
|
+
},
|
|
11
15
|
"peerDependencies": {
|
|
12
16
|
"@angular/animations": "^21.0.0",
|
|
13
17
|
"@angular/cdk": "^21.0.0",
|
|
@@ -33,8 +37,5 @@
|
|
|
33
37
|
}
|
|
34
38
|
},
|
|
35
39
|
"sideEffects": false,
|
|
36
|
-
"type": "module"
|
|
37
|
-
"dependencies": {
|
|
38
|
-
"tslib": "^2.3.0"
|
|
39
|
-
}
|
|
40
|
+
"type": "module"
|
|
40
41
|
}
|
package/scss/_fly-theme.scss
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
// Entry: tokens + html.light-theme / .
|
|
1
|
+
// Entry: tokens + html.light-theme / .spatial-theme / .dark-theme + OS auto dark.
|
|
2
2
|
// Use from shell or Business Apps:
|
|
3
3
|
// stylePreprocessorOptions.includePaths → design-system src folder
|
|
4
4
|
// @use 'scss/fly-theme' or @use 'fly-theme' when scss is on the path.
|
|
5
5
|
@use 'tokens';
|
|
6
6
|
@use 'theme-light';
|
|
7
|
+
@use 'theme-spatial';
|
|
7
8
|
@use 'theme-dark';
|
|
8
|
-
@use 'theme-transparent';
|
|
9
9
|
@use 'theme-auto';
|
package/scss/_theme-auto.scss
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
@use 'theme-
|
|
1
|
+
@use 'theme-spatial-vars' as *;
|
|
2
2
|
|
|
3
3
|
// ─── Automatic dark mode via OS preference (when user hasn't chosen) ─────────
|
|
4
4
|
@media (prefers-color-scheme: dark) {
|
|
5
|
-
html:not(.light-theme):not(.
|
|
6
|
-
|
|
5
|
+
html:not(.light-theme):not(.spatial-theme):not(.dark-theme) {
|
|
6
|
+
color-scheme: dark;
|
|
7
|
+
@include spatial-theme-vars;
|
|
7
8
|
}
|
|
8
9
|
}
|