Observable of the currently active application
Observable of ALL applications in the system (unfiltered)
Observable of user's active applications (filtered and ordered by UserApplication)
Observable of loading state
Observable of user's application configurations (includes sequence, isActive)
Determine why a user cannot access an app by its URL path. Uses UserInfoEngine for core access checking logic. Returns detailed access information for error handling.
Disable an application for the current user. Delegates to UserInfoEngine for the actual disabling. Sync happens automatically via DataChange$ subscription.
Enable an existing but disabled UserApplication record. Delegates to UserInfoEngine for the actual enabling. Sync happens automatically via DataChange$ subscription.
Get active application synchronously
Get user's active applications synchronously (filtered and ordered)
Get ALL applications synchronously (unfiltered)
Get application by URL path slug. Matches case-insensitively against the app's Path property. Falls back to Name match if Path is not found (for backwards compatibility).
Get applications that should appear in the App Switcher (NavigationStyle = 'App Switcher' or 'Both')
Canonical /app/:slug URL for an application. Uses the app's Path
(what GetAppByPath matches on), falling back to Name, and
url-encodes the segment. This is the single source of truth for app URLs —
never hand-roll a slug from Name (e.g. spaces→hyphens), because a custom
Path would then diverge from the URL and GetAppByPath would fail to
resolve it (broken navigation / redirect loops).
Get all applications the current user's roles grant access to. Filters out apps where ApplicationRole records exist but the user's roles lack CanAccess.
Get applications that should appear in the Nav Bar (NavigationStyle = 'Nav Bar' or 'Both') filtered by TopNavLocation.
Check if an app exists in the system by path or name (case-insensitive). Returns the app from allApplications$ if found, regardless of user access.
Get user's application configurations synchronously
Initialize the application manager by subscribing to the LoggedIn event. Applications are loaded when the event fires, ensuring metadata is ready. Also subscribes to UserInfoEngine data changes to auto-sync when user apps change.
Install an application for the current user by creating a UserApplication record. Delegates to UserInfoEngine for the actual installation. Returns the newly created UserApplication entity.
Check if a system app is inactive (Status !== 'Active'). Delegates to UserInfoEngine for the metadata lookup.
Reload the user's application configuration. Call this after changes to UserApplication records to refresh the app list.
Reads engine.UserApplications and rebuilds our derived observables. The engine's
own event-driven refresh (via subscribeToEngineChanges + the UserApplications
config's short DebounceTime) keeps the underlying data fresh — we no longer need
a synchronous force-refresh here, which previously triggered NG0100 in callers
with @if/@for bindings whose values mutate during their save loop.
Set the active application by ID
Uninstall an application for the current user. Delegates to UserInfoEngine for the actual uninstallation. Sync happens automatically via DataChange$ subscription.
Returns a promise that resolves when applications have been loaded and the manager is ready. Safe to call multiple times — returns the same promise.
Manages application instances and active application state.
Loads applications filtered by the user's UserApplication records. If user has no UserApplication records, auto-creates them from DefaultForNewUser apps. Orders applications by UserApplication.Sequence.