@memberjunction/ng-explorer-core 5.49.0 → 5.50.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/dist/lib/omnibar/omnibar-palette.component.js +98 -96
- package/dist/lib/omnibar/omnibar-palette.component.js.map +1 -1
- package/dist/lib/resource-wrappers/view-resource.component.d.ts +19 -16
- package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/view-resource.component.js +127 -121
- package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
- package/dist/lib/shell/components/header/app-nav.component.d.ts +84 -9
- package/dist/lib/shell/components/header/app-nav.component.d.ts.map +1 -1
- package/dist/lib/shell/components/header/app-nav.component.js +380 -41
- package/dist/lib/shell/components/header/app-nav.component.js.map +1 -1
- package/dist/lib/shell/components/header/app-switcher.component.d.ts +159 -29
- package/dist/lib/shell/components/header/app-switcher.component.d.ts.map +1 -1
- package/dist/lib/shell/components/header/app-switcher.component.js +822 -116
- package/dist/lib/shell/components/header/app-switcher.component.js.map +1 -1
- package/dist/lib/shell/services/sharing-center-dialog-host.component.d.ts +10 -1
- package/dist/lib/shell/services/sharing-center-dialog-host.component.d.ts.map +1 -1
- package/dist/lib/shell/services/sharing-center-dialog-host.component.js +30 -4
- package/dist/lib/shell/services/sharing-center-dialog-host.component.js.map +1 -1
- package/dist/lib/shell/shell.component.d.ts +3 -0
- package/dist/lib/shell/shell.component.d.ts.map +1 -1
- package/dist/lib/shell/shell.component.js +22 -12
- package/dist/lib/shell/shell.component.js.map +1 -1
- package/dist/lib/shell/shell.module.d.ts +1 -1
- package/dist/lib/shell/shell.module.d.ts.map +1 -1
- package/dist/lib/shell/shell.module.js +3 -1
- package/dist/lib/shell/shell.module.js.map +1 -1
- package/package.json +51 -51
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-switcher.component.js","sourceRoot":"","sources":["../../../../../src/lib/shell/components/header/app-switcher.component.ts","../../../../../src/lib/shell/components/header/app-switcher.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, HostListener, ViewChild } from '@angular/core';\nimport { ApplicationManager, BaseApplication } from '@memberjunction/ng-base-application';\nimport { UserAppConfigComponent } from '@memberjunction/ng-explorer-settings';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * App switcher dropdown in the header.\n * Displays current app and allows switching between apps.\n */\n@Component({\n standalone: false,\n selector: 'mj-app-switcher',\n templateUrl: './app-switcher.component.html',\n styleUrls: ['./app-switcher.component.css']\n})\nexport class AppSwitcherComponent {\n @Input() activeApp: BaseApplication | null = null;\n @Input() isViewingSystemTab = false;\n /** ID of the app currently being loaded (shows loading indicator) */\n @Input() loadingAppId: string | null = null;\n @Output() appSelected = new EventEmitter<string>();\n\n @ViewChild('appConfigDialog') appConfigDialog!: UserAppConfigComponent;\n\n showDropdown = false;\n showConfigDialog = false;\n\n constructor(private appManager: ApplicationManager) {}\n\n /**\n * Check if the app switcher should show loading state\n */\n get isLoading(): boolean {\n return this.loadingAppId !== null;\n }\n\n /**\n * Get applications that should appear in the app switcher dropdown\n * (NavigationStyle = 'App Switcher' or 'Both')\n */\n get apps(): BaseApplication[] {\n return this.appManager.GetAppSwitcherApps();\n }\n\n /**\n * Toggle dropdown visibility\n */\n toggleDropdown(): void {\n this.showDropdown = !this.showDropdown;\n }\n\n /**\n * Select an application\n * When viewing a system tab, always emit to allow returning to the app\n */\n selectApp(app: BaseApplication): void {\n this.showDropdown = false;\n if (!UUIDsEqual(app.ID, this.activeApp?.ID) || this.isViewingSystemTab) {\n this.appSelected.emit(app.ID);\n }\n }\n\n /** Case-insensitive UUID check whether an app is the currently active app. */\n IsActiveApp(app: BaseApplication): boolean {\n return UUIDsEqual(app.ID, this.activeApp?.ID);\n }\n\n /** Case-insensitive UUID check whether an app is the one currently loading. */\n IsLoadingApp(app: BaseApplication): boolean {\n return UUIDsEqual(app.ID, this.loadingAppId);\n }\n\n /**\n * Close dropdown when clicking outside\n */\n @HostListener('document:click', ['$event'])\n onClickOutside(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (!target.closest('.app-switcher-container') && this.showDropdown) {\n this.showDropdown = false;\n }\n }\n\n /**\n * Open the app configuration dialog\n */\n openConfigDialog(): void {\n this.showDropdown = false;\n this.showConfigDialog = true;\n // Use setTimeout to ensure ViewChild is available\n setTimeout(() => {\n if (this.appConfigDialog) {\n this.appConfigDialog.Open();\n }\n }, 0);\n }\n\n /**\n * Handle when config is saved — close the dialog.\n * The app list refreshes reactively: each UserApplication save fires a BaseEntity\n * event, UserInfoEngine's debounced refresh (short DebounceTime on the\n * 'MJ: User Applications' config) emits DataChange$, and\n * ApplicationManager.syncFromEngine() pushes the new list to applications$,\n * which the `apps` getter reads. No explicit reload needed here.\n */\n onConfigSaved(): void {\n this.showConfigDialog = false;\n }\n}\n","<div class=\"app-switcher-container\" [class.loading]=\"isLoading\">\n <div class=\"app-switcher-button\"\n mjClickable=\"Switch application\"\n testId=\"app-switcher-trigger\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"showDropdown\"\n (click)=\"toggleDropdown()\">\n <!-- Show spinner when loading, otherwise show app icon -->\n @if (isLoading) {\n <i class=\"app-icon loading-spinner fa-solid fa-spinner fa-spin\"></i>\n }\n @if (!isLoading) {\n <i class=\"app-icon\" [class]=\"activeApp?.Icon || 'fa-solid fa-cube'\"\n [style.color]=\"activeApp?.GetColor()\"\n [style.--active-color]=\"activeApp?.GetColor()\"></i>\n }\n <i class=\"dropdown-arrow fa-solid fa-chevron-down\"></i>\n </div>\n\n @if (showDropdown) {\n <div class=\"app-switcher-dropdown\">\n <div class=\"app-switcher-list\">\n @for (app of apps; track app) {\n <div\n class=\"app-switcher-item\"\n [mjClickable]=\"app.Name\"\n [testId]=\"'app-switcher-item-' + app.Name\"\n [attr.aria-current]=\"IsActiveApp(app) ? 'true' : null\"\n [class.active]=\"IsActiveApp(app)\"\n [class.loading]=\"IsLoadingApp(app)\"\n [style.--item-color]=\"app.GetColor()\"\n (click)=\"selectApp(app)\">\n @if (IsLoadingApp(app)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n @if (!IsLoadingApp(app)) {\n <i [class]=\"app.Icon || 'fa-solid fa-cube'\"></i>\n }\n <span>{{ app.Name }}</span>\n </div>\n }\n </div>\n <!-- Divider + Configure pinned at bottom -->\n <div class=\"app-switcher-divider\"></div>\n <div class=\"app-switcher-item configure-item\" mjClickable=\"Configure applications\" testId=\"app-switcher-configure\" (click)=\"openConfigDialog()\">\n <i class=\"fa-solid fa-gear\"></i>\n <span>Configure...</span>\n </div>\n </div>\n }\n</div>\n\n<!-- App Configuration Dialog -->\n<mj-user-app-config\n #appConfigDialog\n [(ShowDialog)]=\"showConfigDialog\"\n (ConfigSaved)=\"onConfigSaved()\">\n</mj-user-app-config>\n"]}
|
|
1
|
+
{"version":3,"file":"app-switcher.component.js","sourceRoot":"","sources":["../../../../../src/lib/shell/components/header/app-switcher.component.ts","../../../../../src/lib/shell/components/header/app-switcher.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { ApplicationManager, BaseApplication } from '@memberjunction/ng-base-application';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UserAppConfigContentComponent } from '@memberjunction/ng-explorer-settings';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { Subject, takeUntil } from 'rxjs';\n\n/** UserInfoEngine setting key holding the recently-switched-to apps */\nconst RECENT_APPS_KEY = 'mj.shell.recentApps.v1';\n/** UserInfoEngine setting key for the launcher's All-apps sort preference */\nconst LAUNCHER_SORT_KEY = 'mj.shell.launcherSort.v1';\n/** How many recent entries to persist (display shows fewer) */\nconst RECENT_STORE_MAX = 8;\n/** How many recent cards to display */\nconst RECENT_DISPLAY_MAX = 3;\n/** 'auto' style: below this many apps the compact anchored panel is used */\nconst COMPACT_AUTO_THRESHOLD = 8;\n/** Compact mode: the filter input appears only at or above this many apps */\nconst COMPACT_FILTER_THRESHOLD = 10;\n\n/**\n * Presentation style for the app switcher, resolved from the\n * `Shell.AppSwitcher.Style` instance-config key:\n * - 'launcher': always the centered card launcher\n * - 'compact': always the anchored compact panel (dropdown-like)\n * - 'auto' (default): compact below {@link COMPACT_AUTO_THRESHOLD} apps\n */\nexport type AppSwitcherStyle = 'launcher' | 'compact' | 'auto';\n\ninterface RecentAppEntry {\n id: string;\n ts: number;\n}\n\n/**\n * App switcher in the header: the trigger shows the active app's identity\n * glyph; activating it opens a centered launcher overlay — a filterable grid\n * of app cards (identity glyph + name + Description summary), with the user's\n * most recently used apps surfaced first.\n *\n * Rendering model: the panel is a native <dialog> opened with showModal(),\n * so it lives in the browser's TOP LAYER — above every stacking context in\n * the app (the shell header's z-index:500 context, chat FAB, toasts). The\n * modal state also makes the rest of the document inert (focus cannot\n * escape) and the browser restores focus to the trigger on close.\n *\n * Accessibility model: every app card is a real focusable control (via\n * mjClickable), so Tab walks filter → close → cards → Configure, and\n * Enter/Space activate the focused card. Arrow keys are the fast path:\n * ArrowDown from the filter focuses the first card; arrows move between\n * cards; ArrowUp from the first card returns to the filter. Escape layers:\n * discard-bar → config view → filter → close. Exiting the config view with\n * unsaved changes shows an inline discard bar (a body-appended confirm\n * dialog would be inert/beneath the top layer).\n */\n@Component({\n standalone: false,\n selector: 'mj-app-switcher',\n templateUrl: './app-switcher.component.html',\n styleUrls: ['./app-switcher.component.css']\n})\nexport class AppSwitcherComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n private destroy$ = new Subject<void>();\n @Input() activeApp: BaseApplication | null = null;\n @Input() isViewingSystemTab = false;\n /** ID of the app currently being loaded (shows loading indicator) */\n @Input() loadingAppId: string | null = null;\n /** Presentation style (from Shell.AppSwitcher.Style instance config) */\n @Input() SwitcherStyle: AppSwitcherStyle = 'auto';\n @Output() appSelected = new EventEmitter<string>();\n\n @ViewChild('filterInput') private filterInputRef?: ElementRef<HTMLInputElement>;\n @ViewChild('trigger') private triggerRef?: ElementRef<HTMLElement>;\n @ViewChild('panel') private panelRef?: ElementRef<HTMLDialogElement>;\n @ViewChild(UserAppConfigContentComponent) private configContent?: UserAppConfigContentComponent;\n\n showDropdown = false;\n /** When true, the launcher body shows the app-configuration view instead of the card grid */\n public ConfigMode = false;\n /** Pending action awaiting the inline unsaved-changes discard bar ('exit' = back to grid, 'close' = close launcher) */\n public PendingDiscard: 'exit' | 'close' | null = null;\n /** True when the panel renders as the compact anchored dropdown (few apps) */\n public CompactMode = false;\n /** All-apps sort: the user's configured order ('custom') or A–Z ('alpha').\n * Per-user preference, persisted via UserInfoEngine. */\n public SortMode: 'custom' | 'alpha' = 'custom';\n /** Anchor position for the compact panel (px, from the trigger's rect) */\n public AnchorLeft = 0;\n public AnchorTop = 0;\n\n /** Live filter text — matches app names AND Description summaries */\n public FilterText = '';\n\n private recentEntries: RecentAppEntry[] = [];\n\n constructor(private appManager: ApplicationManager, private cdr: ChangeDetectorRef) {\n super();\n }\n\n /**\n * UserInfoEngine scoped to this component's provider (multi-provider rule:\n * never reach for the global singleton in per-provider code paths). For the\n * default single-provider shell this resolves to the already-loaded engine\n * registered under the default connection. When no provider is available at\n * all (test environments), fall back to the global singleton rather than\n * letting GetProviderInstance construct a fresh unloaded engine.\n */\n private get userInfoEngine(): UserInfoEngine {\n const provider = this.ProviderToUse;\n return provider\n ? UserInfoEngine.GetProviderInstance<UserInfoEngine>(provider, UserInfoEngine) as UserInfoEngine\n : UserInfoEngine.Instance;\n }\n\n ngOnInit(): void {\n // The launcher's presentation (compact vs full, filter visibility) is\n // resolved from the app COUNT — which can change while the panel is open\n // (the user saves config changes that cross the auto threshold). React to\n // the same stream the app list uses so the presentation can't go stale.\n // Optional-chained: lightweight test stubs may not provide the observable.\n this.appManager.Applications?.pipe(takeUntil(this.destroy$)).subscribe(() => {\n if (this.showDropdown) {\n this.RefreshPresentation();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Re-resolve the presentation for the CURRENT app count. No-op while the\n * config view is open (the panel is promoted to full size there anyway);\n * called when the app stream emits and when the config view exits.\n */\n RefreshPresentation(): void {\n if (this.ConfigMode) {\n return;\n }\n const wasCompact = this.CompactMode;\n this.CompactMode = this.resolveCompactMode();\n if (this.CompactMode && !wasCompact) {\n this.computeCompactAnchor();\n }\n // Mode flips can add/remove the filter input — if the focused element got\n // torn out of the DOM, focus would drop into the inert background. Re-home\n // it after the view settles.\n // Zoneless: an RxJS-driven mutation needs an explicit CD kick (same\n // pattern as AppNavComponent's workspace subscription).\n this.cdr.markForCheck();\n try {\n this.cdr.detectChanges();\n } catch {\n // Re-entrant CD — harmless.\n }\n if (wasCompact !== this.CompactMode) {\n requestAnimationFrame(() => {\n const panel = this.panelRef?.nativeElement;\n if (panel && !panel.contains(document.activeElement)) {\n if (this.ShowFilter) {\n this.filterInputRef?.nativeElement?.focus();\n } else {\n panel.querySelector<HTMLElement>('.app-card')?.focus();\n }\n }\n });\n }\n }\n\n /** Template handler for the filter input's input event */\n OnFilterInput(event: Event): void {\n this.FilterText = (event.target as HTMLInputElement).value;\n this.OnFilterChange();\n }\n\n /**\n * Check if the app switcher should show loading state\n */\n get isLoading(): boolean {\n return this.loadingAppId !== null;\n }\n\n /**\n * Visible trigger label: the current app's name, or \"Apps\" when there's no\n * app context (system tabs, nothing active yet).\n */\n get TriggerLabel(): string {\n return this.activeApp && !this.isViewingSystemTab ? this.activeApp.Name : 'Apps';\n }\n\n /** Accessible name for the trigger — names the control AND the current app */\n get TriggerAriaLabel(): string {\n return this.activeApp && !this.isViewingSystemTab\n ? `Switch application — current: ${this.activeApp.Name}`\n : 'Switch application';\n }\n\n /**\n * Get applications that should appear in the app switcher\n * (NavigationStyle = 'App Switcher' or 'Both')\n */\n get apps(): BaseApplication[] {\n return this.appManager.GetAppSwitcherApps();\n }\n\n /** Recently-used apps (persisted per user), newest first, capped for display.\n * Compact mode skips the Recent section — with a handful of apps it's noise. */\n get RecentApps(): BaseApplication[] {\n if (this.CompactMode) {\n return [];\n }\n const byId = new Map(this.apps.map(a => [NormalizeUUID(a.ID), a]));\n const result: BaseApplication[] = [];\n for (const entry of this.recentEntries) {\n const app = byId.get(NormalizeUUID(entry.id));\n if (app) {\n result.push(app);\n if (result.length >= RECENT_DISPLAY_MAX) {\n break;\n }\n }\n }\n return this.applyFilter(result);\n }\n\n /** All switcher apps in the user's chosen sort (custom Sequence order or A–Z) */\n private get sortedApps(): BaseApplication[] {\n return this.SortMode === 'alpha'\n ? [...this.apps].sort((a, b) => a.Name.localeCompare(b.Name))\n : this.apps;\n }\n\n /** The complete \"All apps\" section, in the user's chosen sort. Apps shown in\n * Recent appear here TOO — being recently used must not make an app vanish\n * from its expected place in the full list. */\n get OtherApps(): BaseApplication[] {\n return this.applyFilter(this.sortedApps);\n }\n\n /** Flat visible list in RENDERED card order — the keyboard-navigation index\n * space. Filtering collapses the sections into one deduplicated list;\n * otherwise it's Recent followed by the full All-apps list (a recent app\n * intentionally appears twice, matching the two cards on screen). */\n get VisibleApps(): BaseApplication[] {\n if (this.IsFiltering) {\n return this.applyFilter(this.sortedApps);\n }\n return [...this.RecentApps, ...this.OtherApps];\n }\n\n /** Distinct app count for the screen-reader status (VisibleApps can contain\n * the same app twice when it's in both Recent and All apps) */\n get AnnouncedAppCount(): number {\n return this.IsFiltering ? this.VisibleApps.length : this.applyFilter(this.apps).length;\n }\n\n /** True when a filter is active (sections collapse into one result list) */\n get IsFiltering(): boolean {\n return this.FilterText.trim().length > 0;\n }\n\n /** Compact mode hides the filter under a handful of apps — it's noise there */\n get ShowFilter(): boolean {\n return !this.CompactMode || this.apps.length >= COMPACT_FILTER_THRESHOLD;\n }\n\n private applyFilter(apps: BaseApplication[]): BaseApplication[] {\n const q = this.FilterText.trim().toLowerCase();\n if (!q) {\n return apps;\n }\n return apps.filter(a =>\n a.Name.toLowerCase().includes(q) || (a.Description || '').toLowerCase().includes(q));\n }\n\n /** Stable DOM id for a card (arrow-key focus target) */\n OptionId(index: number): string {\n return `mj-launcher-opt-${index}`;\n }\n\n /** Trigger handler: open the launcher panel, or close it if already open */\n ToggleLauncher(): void {\n if (this.showDropdown) {\n this.closeLauncher();\n } else {\n this.openLauncher();\n }\n }\n\n /** Flip the All-apps sort and persist it (fail-silent, like recents) */\n ToggleSortMode(): void {\n this.SortMode = this.SortMode === 'alpha' ? 'custom' : 'alpha';\n try {\n this.userInfoEngine.SetSettingDebounced(LAUNCHER_SORT_KEY, this.SortMode);\n } catch {\n // Preference persistence must never break the launcher\n }\n }\n\n private loadSortMode(): void {\n try {\n this.SortMode = this.userInfoEngine.GetSetting(LAUNCHER_SORT_KEY) === 'alpha' ? 'alpha' : 'custom';\n } catch {\n this.SortMode = 'custom';\n }\n }\n\n private openLauncher(): void {\n this.loadRecents();\n this.loadSortMode();\n this.FilterText = '';\n this.ConfigMode = false;\n this.PendingDiscard = null;\n this.CompactMode = this.resolveCompactMode();\n if (this.CompactMode) {\n this.computeCompactAnchor();\n }\n this.showDropdown = true;\n // The dialog element renders under @if next frame: put it in the top\n // layer via showModal() (jsdom fallback: plain open attribute), then\n // focus the filter (or the first card when compact mode hides it).\n requestAnimationFrame(() => {\n const dialog = this.panelRef?.nativeElement;\n if (dialog && !dialog.open) {\n if (typeof dialog.showModal === 'function') {\n dialog.showModal();\n } else {\n dialog.setAttribute('open', '');\n }\n }\n if (this.ShowFilter) {\n this.filterInputRef?.nativeElement?.focus();\n } else {\n dialog?.querySelector<HTMLElement>('.app-card')?.focus();\n }\n });\n }\n\n /** Resolve the presentation for this open (auto = compact under the threshold) */\n private resolveCompactMode(): boolean {\n if (this.SwitcherStyle === 'compact') {\n return true;\n }\n if (this.SwitcherStyle === 'launcher') {\n return false;\n }\n return this.apps.length < COMPACT_AUTO_THRESHOLD;\n }\n\n /** Anchor the compact panel under the trigger, clamped to the viewport */\n private computeCompactAnchor(): void {\n const rect = this.triggerRef?.nativeElement?.getBoundingClientRect();\n if (!rect) {\n return;\n }\n const panelWidth = 320; // Keep in sync with .launcher-panel--compact width\n const margin = 8;\n this.AnchorLeft = Math.max(margin, Math.min(rect.left, window.innerWidth - panelWidth - margin));\n this.AnchorTop = rect.bottom + margin;\n }\n\n private closeLauncher(restoreFocus = true): void {\n const dialog = this.panelRef?.nativeElement;\n if (dialog?.open && typeof dialog.close === 'function') {\n dialog.close(); // Browser restores focus to the trigger automatically\n }\n this.showDropdown = false;\n this.FilterText = '';\n this.ConfigMode = false;\n this.PendingDiscard = null;\n if (restoreFocus) {\n requestAnimationFrame(() => {\n this.triggerRef?.nativeElement?.focus();\n });\n }\n }\n\n /** Guarded close for template paths (backdrop / close button): unsaved\n * config changes surface the inline discard bar instead of closing. */\n CloseLauncher(): void {\n if (this.ConfigMode && this.configContent?.HasChanges()) {\n this.PendingDiscard = 'close';\n return;\n }\n this.closeLauncher();\n }\n\n /** Backdrop clicks arrive as clicks on the <dialog> element itself */\n OnDialogClick(event: MouseEvent): void {\n if (event.target === this.panelRef?.nativeElement) {\n this.CloseLauncher();\n }\n }\n\n /** Native cancel (Esc while the browser owns the dialog) — route through\n * our layered Escape handling instead of closing unconditionally. */\n OnDialogCancel(event: Event): void {\n event.preventDefault();\n this.handleEscape();\n }\n\n /** Inline discard bar: confirm — perform the pending action, dropping changes */\n ConfirmDiscard(): void {\n const action = this.PendingDiscard;\n this.PendingDiscard = null;\n if (action === 'close') {\n this.closeLauncher();\n } else if (action === 'exit') {\n this.ExitConfigMode();\n }\n }\n\n /** Inline discard bar: keep editing */\n CancelDiscard(): void {\n this.PendingDiscard = null;\n }\n\n OnFilterChange(): void {\n // Filtering re-renders the card set; nothing else to sync — focus stays\n // in the input and Tab/arrows reach the new result set naturally.\n }\n\n /** Keyboard model on the filter input */\n OnFilterKeydown(event: KeyboardEvent): void {\n const visible = this.VisibleApps;\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.focusCard(0);\n break;\n case 'Enter':\n event.preventDefault();\n // While filtering, Enter opens the top result (omnibar semantics —\n // the footer advertises \"↵ open\"); unfiltered it needs an unambiguous\n // single app.\n if (this.IsFiltering && visible.length > 0) {\n this.selectApp(visible[0]);\n } else if (visible.length === 1) {\n this.selectApp(visible[0]);\n }\n break;\n case 'Escape':\n event.preventDefault();\n // Stop the bubble: the panel's own Escape handler would otherwise\n // re-evaluate AFTER we've mutated state and double-handle the key.\n event.stopPropagation();\n this.handleEscape();\n break;\n }\n }\n\n /** Arrow-key navigation between focused cards */\n OnCardKeydown(index: number, event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowRight':\n event.preventDefault();\n this.focusCard(index + 1);\n break;\n case 'ArrowUp':\n case 'ArrowLeft':\n event.preventDefault();\n if (index === 0) {\n this.filterInputRef?.nativeElement?.focus();\n } else {\n this.focusCard(index - 1);\n }\n break;\n case 'Home':\n event.preventDefault();\n this.focusCard(0);\n break;\n case 'End':\n event.preventDefault();\n this.focusCard(this.VisibleApps.length - 1);\n break;\n }\n }\n\n /** Move DOM focus to the card at the given VisibleApps index (clamped) */\n private focusCard(index: number): void {\n const count = this.VisibleApps.length;\n if (count === 0) {\n return;\n }\n const clamped = Math.min(count - 1, Math.max(0, index));\n const el = document.getElementById(this.OptionId(clamped));\n if (el) {\n el.focus();\n // jsdom (unit tests) doesn't implement scrollIntoView — guard it.\n if (typeof el.scrollIntoView === 'function') {\n el.scrollIntoView({ block: 'nearest' });\n }\n }\n }\n\n /** Keep Tab cycling within the launcher's real focusables (filter, close, Configure) */\n /** Escape layering: discard bar → config view (guarded) → filter → close.\n * Tab is NOT manually trapped — showModal() makes the background inert,\n * which is a real trap (no leak when focus sits on a non-focusable). */\n OnPanelKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.handleEscape();\n }\n }\n\n private handleEscape(): void {\n if (this.PendingDiscard) {\n this.CancelDiscard();\n } else if (this.ConfigMode) {\n this.RequestExitConfigMode();\n } else if (this.IsFiltering) {\n this.FilterText = '';\n this.filterInputRef?.nativeElement?.focus();\n } else {\n this.closeLauncher();\n }\n }\n\n /**\n * Select an application.\n * When viewing a system tab, always emit to allow returning to the app.\n */\n selectApp(app: BaseApplication): void {\n this.recordRecent(app);\n this.closeLauncher(false); // Focus moves into the app, not back to the trigger\n if (!UUIDsEqual(app.ID, this.activeApp?.ID) || this.isViewingSystemTab) {\n this.appSelected.emit(app.ID);\n }\n }\n\n /** Case-insensitive UUID check whether an app is the currently active app. */\n IsActiveApp(app: BaseApplication): boolean {\n return UUIDsEqual(app.ID, this.activeApp?.ID);\n }\n\n /** Case-insensitive UUID check whether an app is the one currently loading. */\n IsLoadingApp(app: BaseApplication): boolean {\n return UUIDsEqual(app.ID, this.loadingAppId);\n }\n\n // ---- Recents persistence (MJ: User Settings via UserInfoEngine) ----\n\n private loadRecents(): void {\n try {\n const raw = this.userInfoEngine.GetSetting(RECENT_APPS_KEY);\n const parsed = raw ? JSON.parse(raw) : [];\n this.recentEntries = Array.isArray(parsed)\n ? parsed.filter((e: RecentAppEntry) => e && typeof e.id === 'string' && typeof e.ts === 'number')\n : [];\n } catch {\n this.recentEntries = [];\n }\n }\n\n private recordRecent(app: BaseApplication): void {\n const id = NormalizeUUID(app.ID);\n this.recentEntries = [\n { id, ts: Date.now() },\n ...this.recentEntries.filter(e => NormalizeUUID(e.id) !== id)\n ].slice(0, RECENT_STORE_MAX);\n try {\n this.userInfoEngine.SetSettingDebounced(RECENT_APPS_KEY, JSON.stringify(this.recentEntries));\n } catch {\n // Settings persistence must never block app switching (e.g. engine not\n // configured in tests or permission-constrained sessions).\n }\n }\n\n /**\n * Swap the launcher body to the app-configuration view (in-panel, seamless —\n * no separate dialog). The embedded mj-user-app-config-content loads on\n * creation.\n */\n EnterConfigMode(): void {\n this.ConfigMode = true;\n this.FilterText = '';\n this.PendingDiscard = null;\n // Move focus into the config view (the back button is its first focusable)\n requestAnimationFrame(() => {\n this.panelRef?.nativeElement\n ?.querySelector<HTMLElement>('.launcher-back')?.focus();\n });\n }\n\n /** Guarded exit from the config view: unsaved changes surface the inline\n * discard bar instead of silently dropping the user's edits. */\n RequestExitConfigMode(): void {\n if (this.configContent?.HasChanges()) {\n this.PendingDiscard = 'exit';\n return;\n }\n this.ExitConfigMode();\n }\n\n /**\n * Return from the configuration view to the app grid.\n * The app list refreshes reactively after a save: each UserApplication save\n * fires a BaseEntity event, UserInfoEngine's debounced refresh emits\n * DataChange$, and ApplicationManager.syncFromEngine() pushes the new list\n * to applications$, which the `apps` getter reads. No explicit reload needed.\n */\n ExitConfigMode(): void {\n this.ConfigMode = false;\n // The config session may have changed the app count across the compact\n // threshold — re-resolve the presentation for the view we're returning to.\n // (The Applications stream also triggers this when the post-save engine\n // refresh lands, whichever comes last wins with the freshest count.)\n this.RefreshPresentation();\n requestAnimationFrame(() => {\n if (this.ShowFilter) {\n this.filterInputRef?.nativeElement?.focus();\n } else {\n this.panelRef?.nativeElement?.querySelector<HTMLElement>('.app-card')?.focus();\n }\n });\n }\n}\n","<div class=\"app-switcher-container\" [class.loading]=\"isLoading\">\n <div class=\"app-switcher-button\"\n #trigger\n [mjClickable]=\"TriggerAriaLabel\"\n testId=\"app-switcher-trigger\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"showDropdown\"\n (click)=\"ToggleLauncher()\">\n <!-- Show spinner when loading, otherwise show app icon -->\n @if (isLoading) {\n <i class=\"app-icon loading-spinner fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n }\n @if (!isLoading) {\n <i class=\"app-icon\" [class]=\"activeApp?.Icon || 'fa-solid fa-cube'\"\n [style.color]=\"activeApp?.GetColor()\" aria-hidden=\"true\"></i>\n }\n <!-- Current app name; hidden at the mobile breakpoint (icon-only trigger) -->\n <span class=\"app-label\">{{ TriggerLabel }}</span>\n <i class=\"dropdown-arrow fa-solid fa-chevron-down\" aria-hidden=\"true\"></i>\n </div>\n\n @if (showDropdown) {\n <!-- Native <dialog> + showModal(): lives in the browser TOP LAYER (above\n every app stacking context — chat FAB, toasts), background is inert\n (real focus trap), and focus restores to the trigger on close. The\n backdrop is ::backdrop; clicks on it arrive as clicks on the dialog\n element itself (OnDialogClick). -->\n <dialog class=\"launcher-panel\"\n #panel\n role=\"dialog\"\n aria-modal=\"true\"\n [class.launcher-panel--compact]=\"CompactMode && !ConfigMode\"\n [style.--anchor-left]=\"AnchorLeft + 'px'\"\n [style.--anchor-top]=\"AnchorTop + 'px'\"\n [attr.aria-label]=\"ConfigMode ? null : 'Application launcher'\"\n [attr.aria-labelledby]=\"ConfigMode ? 'mj-launcher-config-title' : null\"\n (click)=\"OnDialogClick($event)\"\n (cancel)=\"OnDialogCancel($event)\"\n (keydown)=\"OnPanelKeydown($event)\">\n\n @if (ConfigMode) {\n <!-- Configuration view: same panel, body swapped -->\n <div class=\"launcher-head launcher-head--config\">\n <button class=\"launcher-back\" type=\"button\" aria-label=\"Back to apps\" (click)=\"RequestExitConfigMode()\">\n <i class=\"fa-solid fa-arrow-left\" aria-hidden=\"true\"></i>\n </button>\n <h2 class=\"launcher-title\" id=\"mj-launcher-config-title\">Configure apps</h2>\n <button class=\"launcher-close\" type=\"button\" aria-label=\"Close application launcher\" (click)=\"CloseLauncher()\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </div>\n @if (PendingDiscard) {\n <div class=\"launcher-discard-bar\" role=\"alert\">\n <i class=\"fa-solid fa-triangle-exclamation\" aria-hidden=\"true\"></i>\n <span class=\"discard-msg\">You have unsaved changes.</span>\n <button mjButton variant=\"danger\" size=\"sm\" (click)=\"ConfirmDiscard()\">Discard</button>\n <button mjButton size=\"sm\" (click)=\"CancelDiscard()\">Keep editing</button>\n </div>\n }\n <mj-user-app-config-content\n class=\"launcher-config-body\"\n [Provider]=\"Provider\"\n (Saved)=\"ExitConfigMode()\"\n (Cancelled)=\"RequestExitConfigMode()\">\n </mj-user-app-config-content>\n } @else {\n @if (ShowFilter) {\n <div class=\"launcher-head\">\n <div class=\"launcher-filter\">\n <i class=\"fa-solid fa-magnifying-glass\" aria-hidden=\"true\"></i>\n <input\n #filterInput\n type=\"text\"\n placeholder=\"Find an app…\"\n aria-label=\"Find an app\"\n [value]=\"FilterText\"\n (input)=\"OnFilterInput($event)\"\n (keydown)=\"OnFilterKeydown($event)\"\n autocomplete=\"off\"\n spellcheck=\"false\" />\n </div>\n <button class=\"launcher-close\" type=\"button\" aria-label=\"Close application launcher\" (click)=\"CloseLauncher()\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n <div class=\"launcher-scroll\">\n @if (IsFiltering) {\n <div class=\"launcher-grid\">\n @for (app of VisibleApps; track app.ID; let i = $index) {\n <ng-container *ngTemplateOutlet=\"appCard; context: { $implicit: app, idx: i }\"></ng-container>\n }\n </div>\n @if (VisibleApps.length === 0) {\n <div class=\"launcher-empty\">No apps match \"{{ FilterText }}\"</div>\n }\n } @else {\n @if (RecentApps.length > 0) {\n <div class=\"launcher-sect\">Recent</div>\n <div class=\"launcher-grid\" role=\"group\" aria-label=\"Recent applications\">\n @for (app of RecentApps; track app.ID; let i = $index) {\n <ng-container *ngTemplateOutlet=\"appCard; context: { $implicit: app, idx: i }\"></ng-container>\n }\n </div>\n }\n <div class=\"launcher-sect launcher-sect--row\">\n <span>All apps</span>\n <button class=\"launcher-sort-toggle\" type=\"button\"\n [attr.aria-pressed]=\"SortMode === 'alpha'\"\n [attr.aria-label]=\"SortMode === 'alpha' ? 'Sorted alphabetically — switch to your custom order' : 'Sorted by your custom order — switch to alphabetical'\"\n [title]=\"SortMode === 'alpha' ? 'Sorted A–Z — click for your custom order' : 'Custom order — click for A–Z'\"\n (click)=\"ToggleSortMode()\">\n <i [class]=\"SortMode === 'alpha' ? 'fa-solid fa-arrow-down-a-z' : 'fa-solid fa-bars-staggered'\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"launcher-grid\" role=\"group\" aria-label=\"All applications\">\n @for (app of OtherApps; track app.ID; let i = $index) {\n <ng-container *ngTemplateOutlet=\"appCard; context: { $implicit: app, idx: i + RecentApps.length }\"></ng-container>\n }\n </div>\n @if (VisibleApps.length === 0) {\n <div class=\"launcher-empty\">\n No applications are enabled for you yet — use Configure… below to add some.\n </div>\n }\n }\n </div>\n\n <div class=\"launcher-foot\">\n <span class=\"launcher-kbd-hints\" aria-hidden=\"true\">\n <span><kbd>↑</kbd><kbd>↓</kbd> navigate</span>\n <span><kbd>↵</kbd> open</span>\n <span><kbd>esc</kbd> close</span>\n </span>\n <button class=\"launcher-configure\" type=\"button\" testId=\"app-switcher-configure\" (click)=\"EnterConfigMode()\">\n <i class=\"fa-solid fa-gear\" aria-hidden=\"true\"></i>\n <span>Configure…</span>\n </button>\n </div>\n\n <span class=\"sr-only\" role=\"status\">{{ AnnouncedAppCount }} applications available</span>\n }\n </dialog>\n }\n</div>\n\n<!-- Shared app-card template: each card is a real focusable control (mjClickable\n adds role, tabindex 0, aria-label, and Enter/Space activation), so Tab walks\n the cards and arrow keys are the fast path. -->\n<ng-template #appCard let-app let-idx=\"idx\">\n <div class=\"app-card\"\n [id]=\"OptionId(idx)\"\n [mjClickable]=\"app.Name\"\n role=\"link\"\n [testId]=\"'app-switcher-item-' + app.Name\"\n [attr.aria-current]=\"IsActiveApp(app) ? 'true' : null\"\n [attr.aria-describedby]=\"app.Description ? OptionId(idx) + '-desc' : null\"\n [class.active]=\"IsActiveApp(app)\"\n [class.loading]=\"IsLoadingApp(app)\"\n [style.--app-color]=\"app.GetColor()\"\n (click)=\"selectApp(app)\"\n (keydown)=\"OnCardKeydown(idx, $event)\">\n <div class=\"app-card-glyph\">\n @if (IsLoadingApp(app)) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n } @else {\n <i [class]=\"app.Icon || 'fa-solid fa-cube'\" aria-hidden=\"true\"></i>\n }\n </div>\n <div class=\"app-card-text\">\n <div class=\"app-card-name\">\n <span class=\"app-card-name-label\">{{ app.Name }}</span>\n </div>\n @if (app.Description) {\n <div class=\"app-card-desc\" [id]=\"OptionId(idx) + '-desc'\">{{ app.Description }}</div>\n }\n </div>\n </div>\n</ng-template>\n\n"]}
|
|
@@ -13,9 +13,18 @@ import * as i0 from "@angular/core";
|
|
|
13
13
|
export declare class SharingCenterDialogHostComponent {
|
|
14
14
|
private readonly dialogRef;
|
|
15
15
|
private readonly navigationService;
|
|
16
|
-
|
|
16
|
+
private readonly appManager;
|
|
17
|
+
OnResourceClicked(row: NormalizedPermission): Promise<void>;
|
|
17
18
|
OnCloseRequested(): void;
|
|
18
19
|
private openResourceForExplorer;
|
|
20
|
+
/**
|
|
21
|
+
* Collections have no NavigationService.Open* helper — they live behind the
|
|
22
|
+
* 'Collections' nav item of the Chat app. Find whichever app exposes that nav
|
|
23
|
+
* item (the Sharing Center can be opened from any app, so the ACTIVE app can't
|
|
24
|
+
* be assumed) and switch to it with the collectionId as query params, which
|
|
25
|
+
* drives both fresh tabs (initial param read) and cached ones (OnQueryParamsChanged).
|
|
26
|
+
*/
|
|
27
|
+
private openCollection;
|
|
19
28
|
static ɵfac: i0.ɵɵFactoryDeclaration<SharingCenterDialogHostComponent, never>;
|
|
20
29
|
static ɵcmp: i0.ɵɵComponentDeclaration<SharingCenterDialogHostComponent, "mj-explorer-sharing-center-dialog-host", never, {}, {}, never, never, true, never>;
|
|
21
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharing-center-dialog-host.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/shell/services/sharing-center-dialog-host.component.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sharing-center-dialog-host.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/shell/services/sharing-center-dialog-host.component.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;;AAM1E;;;;;;;;;GASG;AACH,qBAaa,gCAAgC;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2C;IACrE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA6B;IAC/D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;IAEnD,iBAAiB,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjE,gBAAgB,IAAI,IAAI;YAIV,uBAAuB;IAgCrC;;;;;;OAMG;YACW,cAAc;yCAxDnB,gCAAgC;2CAAhC,gCAAgC;CAwE5C"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
|
|
2
|
+
import { firstValueFrom } from 'rxjs';
|
|
2
3
|
import { CompositeKey } from '@memberjunction/core';
|
|
3
4
|
import { MJDialogRef } from '@memberjunction/ng-ui-components';
|
|
4
5
|
import { UserSharingCenterComponent } from '@memberjunction/ng-resource-permissions';
|
|
5
6
|
import { NavigationService } from '@memberjunction/ng-shared';
|
|
7
|
+
import { ApplicationManager } from '@memberjunction/ng-base-application';
|
|
6
8
|
import * as i0 from "@angular/core";
|
|
7
9
|
/**
|
|
8
10
|
* Thin Explorer-side wrapper around the Generic {@link UserSharingCenterComponent}.
|
|
@@ -17,10 +19,11 @@ import * as i0 from "@angular/core";
|
|
|
17
19
|
export class SharingCenterDialogHostComponent {
|
|
18
20
|
dialogRef = inject(MJDialogRef, { optional: true });
|
|
19
21
|
navigationService = inject(NavigationService);
|
|
20
|
-
|
|
22
|
+
appManager = inject(ApplicationManager);
|
|
23
|
+
async OnResourceClicked(row) {
|
|
21
24
|
if (!row.ResourceID)
|
|
22
25
|
return;
|
|
23
|
-
const opened = this.openResourceForExplorer(row);
|
|
26
|
+
const opened = await this.openResourceForExplorer(row);
|
|
24
27
|
if (opened) {
|
|
25
28
|
this.dialogRef?.Close();
|
|
26
29
|
}
|
|
@@ -28,7 +31,7 @@ export class SharingCenterDialogHostComponent {
|
|
|
28
31
|
OnCloseRequested() {
|
|
29
32
|
this.dialogRef?.Close();
|
|
30
33
|
}
|
|
31
|
-
openResourceForExplorer(row) {
|
|
34
|
+
async openResourceForExplorer(row) {
|
|
32
35
|
switch (row.DomainName) {
|
|
33
36
|
case 'Dashboard Permissions':
|
|
34
37
|
this.navigationService.OpenDashboard(row.ResourceID, row.ResourceName ?? 'Dashboard');
|
|
@@ -36,6 +39,8 @@ export class SharingCenterDialogHostComponent {
|
|
|
36
39
|
case 'Artifact Permissions':
|
|
37
40
|
this.navigationService.OpenArtifact(row.ResourceID, row.ResourceName);
|
|
38
41
|
return true;
|
|
42
|
+
case 'Collection Permissions':
|
|
43
|
+
return this.openCollection(row.ResourceID);
|
|
39
44
|
case 'Query Permissions':
|
|
40
45
|
this.navigationService.OpenQuery(row.ResourceID, row.ResourceName ?? 'Query');
|
|
41
46
|
return true;
|
|
@@ -52,6 +57,27 @@ export class SharingCenterDialogHostComponent {
|
|
|
52
57
|
return false;
|
|
53
58
|
}
|
|
54
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Collections have no NavigationService.Open* helper — they live behind the
|
|
62
|
+
* 'Collections' nav item of the Chat app. Find whichever app exposes that nav
|
|
63
|
+
* item (the Sharing Center can be opened from any app, so the ACTIVE app can't
|
|
64
|
+
* be assumed) and switch to it with the collectionId as query params, which
|
|
65
|
+
* drives both fresh tabs (initial param read) and cached ones (OnQueryParamsChanged).
|
|
66
|
+
*/
|
|
67
|
+
async openCollection(collectionId) {
|
|
68
|
+
const apps = await firstValueFrom(this.appManager.Applications).catch(() => []);
|
|
69
|
+
for (const app of apps) {
|
|
70
|
+
const navItems = await app.GetNavItems();
|
|
71
|
+
// Match on DriverClass (stable identity — survives label renames/localization)
|
|
72
|
+
// and only consider Active items (Status defaults to Active when unset).
|
|
73
|
+
const collectionsNav = navItems.find((item) => item.DriverClass === 'ChatCollectionsResource' && (item.Status ?? 'Active') === 'Active');
|
|
74
|
+
if (collectionsNav) {
|
|
75
|
+
await this.navigationService.SwitchToApp(app.ID, collectionsNav.Label, { collectionId });
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
55
81
|
static ɵfac = function SharingCenterDialogHostComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SharingCenterDialogHostComponent)(); };
|
|
56
82
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SharingCenterDialogHostComponent, selectors: [["mj-explorer-sharing-center-dialog-host"]], decls: 1, vars: 1, consts: [[3, "ResourceClicked", "CloseRequested", "ShowCloseButton"]], template: function SharingCenterDialogHostComponent_Template(rf, ctx) { if (rf & 1) {
|
|
57
83
|
i0.ɵɵelementStart(0, "mj-user-sharing-center", 0);
|
|
@@ -77,5 +103,5 @@ export class SharingCenterDialogHostComponent {
|
|
|
77
103
|
`,
|
|
78
104
|
}]
|
|
79
105
|
}], null, null); })();
|
|
80
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SharingCenterDialogHostComponent, { className: "SharingCenterDialogHostComponent", filePath: "src/lib/shell/services/sharing-center-dialog-host.component.ts", lineNumber:
|
|
106
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SharingCenterDialogHostComponent, { className: "SharingCenterDialogHostComponent", filePath: "src/lib/shell/services/sharing-center-dialog-host.component.ts", lineNumber: 32 }); })();
|
|
81
107
|
//# sourceMappingURL=sharing-center-dialog-host.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharing-center-dialog-host.component.js","sourceRoot":"","sources":["../../../../src/lib/shell/services/sharing-center-dialog-host.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAwB,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;;
|
|
1
|
+
{"version":3,"file":"sharing-center-dialog-host.component.js","sourceRoot":"","sources":["../../../../src/lib/shell/services/sharing-center-dialog-host.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { CompositeKey, NormalizedPermission } from '@memberjunction/core';\nimport { MJDialogRef } from '@memberjunction/ng-ui-components';\nimport { UserSharingCenterComponent } from '@memberjunction/ng-resource-permissions';\nimport { NavigationService } from '@memberjunction/ng-shared';\nimport { ApplicationManager, BaseApplication } from '@memberjunction/ng-base-application';\n\n/**\n * Thin Explorer-side wrapper around the Generic {@link UserSharingCenterComponent}.\n *\n * The Generic component is intentionally Router-free; this host translates its\n * `ResourceClicked` and `CloseRequested` events into calls against `NavigationService`\n * (Explorer's wrapper around Angular Router) and `MJDialogRef` (its host dialog).\n *\n * Apps that don't use NavigationService can instantiate the Generic component\n * directly and provide their own routing strategy.\n */\n@Component({\n standalone: true,\n selector: 'mj-explorer-sharing-center-dialog-host',\n imports: [UserSharingCenterComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <mj-user-sharing-center\n [ShowCloseButton]=\"false\"\n (ResourceClicked)=\"OnResourceClicked($event)\"\n (CloseRequested)=\"OnCloseRequested()\">\n </mj-user-sharing-center>\n `,\n})\nexport class SharingCenterDialogHostComponent {\n private readonly dialogRef = inject(MJDialogRef, { optional: true });\n private readonly navigationService = inject(NavigationService);\n private readonly appManager = inject(ApplicationManager);\n\n async OnResourceClicked(row: NormalizedPermission): Promise<void> {\n if (!row.ResourceID) return;\n const opened = await this.openResourceForExplorer(row);\n if (opened) {\n this.dialogRef?.Close();\n }\n }\n\n OnCloseRequested(): void {\n this.dialogRef?.Close();\n }\n\n private async openResourceForExplorer(row: NormalizedPermission): Promise<boolean> {\n switch (row.DomainName) {\n case 'Dashboard Permissions':\n this.navigationService.OpenDashboard(row.ResourceID!, row.ResourceName ?? 'Dashboard');\n return true;\n\n case 'Artifact Permissions':\n this.navigationService.OpenArtifact(row.ResourceID!, row.ResourceName);\n return true;\n\n case 'Collection Permissions':\n return this.openCollection(row.ResourceID!);\n\n case 'Query Permissions':\n this.navigationService.OpenQuery(row.ResourceID!, row.ResourceName ?? 'Query');\n return true;\n\n case 'Resource Permissions':\n case 'Access Control Rules':\n if (row.ResourceType) {\n const key = new CompositeKey();\n key.KeyValuePairs.push({ FieldName: 'ID', Value: row.ResourceID! });\n this.navigationService.OpenEntityRecord(row.ResourceType, key);\n return true;\n }\n return false;\n\n default:\n return false;\n }\n }\n\n /**\n * Collections have no NavigationService.Open* helper — they live behind the\n * 'Collections' nav item of the Chat app. Find whichever app exposes that nav\n * item (the Sharing Center can be opened from any app, so the ACTIVE app can't\n * be assumed) and switch to it with the collectionId as query params, which\n * drives both fresh tabs (initial param read) and cached ones (OnQueryParamsChanged).\n */\n private async openCollection(collectionId: string): Promise<boolean> {\n const apps: BaseApplication[] = await firstValueFrom(this.appManager.Applications).catch(() => []);\n for (const app of apps) {\n const navItems = await app.GetNavItems();\n // Match on DriverClass (stable identity — survives label renames/localization)\n // and only consider Active items (Status defaults to Active when unset).\n const collectionsNav = navItems.find(\n (item) => item.DriverClass === 'ChatCollectionsResource' && (item.Status ?? 'Active') === 'Active'\n );\n if (collectionsNav) {\n await this.navigationService.SwitchToApp(app.ID, collectionsNav.Label, { collectionId });\n return true;\n }\n }\n return false;\n }\n}\n"]}
|
|
@@ -18,6 +18,7 @@ import { CommandPaletteService } from '../command-palette/command-palette.servic
|
|
|
18
18
|
import { FileOpenService } from '@memberjunction/ng-file-storage';
|
|
19
19
|
import { FeedbackDialogService, FeedbackService } from '@memberjunction/ng-feedback';
|
|
20
20
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
21
|
+
import { AppSwitcherStyle } from './components/header/app-switcher.component';
|
|
21
22
|
import * as i0 from "@angular/core";
|
|
22
23
|
export declare class ShellComponent extends BaseAngularComponent implements OnInit, OnDestroy, AfterViewInit {
|
|
23
24
|
private appManager;
|
|
@@ -110,6 +111,8 @@ export declare class ShellComponent extends BaseAngularComponent implements OnIn
|
|
|
110
111
|
get ShowNotifications(): boolean;
|
|
111
112
|
/** Instance Config gate for the app switcher (also the add/configure-apps entry point). */
|
|
112
113
|
get ShowAppSwitcher(): boolean;
|
|
114
|
+
/** Instance Config presentation style for the app switcher (launcher/compact/auto). */
|
|
115
|
+
get AppSwitcherStyle(): AppSwitcherStyle;
|
|
113
116
|
/** Instance Config gate for the app navigation strip (desktop and the mobile drawer). */
|
|
114
117
|
get ShowAppNav(): boolean;
|
|
115
118
|
get ShowSearchPreview(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.component.d.ts","sourceRoot":"","sources":["../../../src/lib/shell/shell.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAa,UAAU,EAAgB,MAAM,eAAe,CAAC;AACtJ,OAAO,EAAE,cAAc,EAAE,MAAM,EAAiB,MAAM,iBAAiB,CAAC;AAGxE,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,UAAU,EAIV,OAAO,EACR,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAY,UAAU,EAAqD,MAAM,sBAAsB,CAAC;AAE/G,OAAO,EAAc,iBAAiB,EAAgC,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC5M,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,+CAA+C,CAAC;AAC/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAIzE,OAAO,EAAE,wBAAwB,EAAyB,qBAAqB,EAAE,MAAM,kDAAkD,CAAC;AAC1I,OAAO,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAgB,eAAe,EAAE,YAAY,EAA0D,MAAM,cAAc,CAAC;AAEnI,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAGrF,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;
|
|
1
|
+
{"version":3,"file":"shell.component.d.ts","sourceRoot":"","sources":["../../../src/lib/shell/shell.component.ts"],"names":[],"mappings":"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"}
|