Member Junction
    Preparing search index...

    Data Explorer Dashboard - Power user interface for exploring data across entities Combines card-based browsing with grid views and relationship visualization

    Uses mj-entity-viewer composite component for the main content area, which handles data loading, filtering, and view mode switching.

    Hierarchy (View Summary)

    Implements

    • OnInit
    • OnDestroy
    • OnChanges
    • AfterViewInit
    Index

    Constructors

    Properties

    Accessors

    Methods

    Constructors

    Properties

    _config: DashboardConfig | null
    appEntityGroups: AppEntityGroup[] = []
    breadcrumbs: BreadcrumbItem[] = []
    contextIcon: string | null = null

    Optional context icon (Font Awesome class) to display in the header. Use this alongside contextName for a fully customized header (e.g., "fa-solid fa-users" for CRM).

    contextName: string | null = null

    Optional context name to display in the header instead of "Data Explorer". Use this to customize the explorer for specific applications (e.g., "CRM", "Association Demo").

    debouncedFilterText: string = ''
    deepLink: DataExplorerDeepLink | null = null

    Optional deep link to navigate to a specific entity/record on load. Parsed from URL query parameters (e.g., ?entity=Users&record=123)

    destroy$: Subject<void> = ...
    detailPanelEntity: EntityInfo | null = null
    DisplayNameChanged: EventEmitter<string> = ...

    Emitted when the display title should change (entity selected, record opened, etc.)

    entities: EntityInfo[] = []
    entityFilter: DataExplorerFilter | null = null

    Optional filter to constrain which entities are shown in the explorer. Can filter by applicationId, schemaNames, or explicit entityNames.

    entityFilterText: string = ''
    Error: EventEmitter<Error>

    Subclasses can emit anytime an error occurs.

    favoriteRecords: FavoriteRecord[] = []
    filteredRecordCount: number = 0
    filterInputRef: ElementRef<HTMLInputElement> | undefined

    Reference to the filter input for keyboard shortcuts

    initialQueryParams: Record<string, string> = {}

    Initial query params forwarded from the resource wrapper. On hard refresh, the shell delivers params to the wrapper (which has Data.Configuration.queryParams), not to this inner dashboard component. This input bridges that gap.

    Interaction: EventEmitter<any>

    Subclasses can emit this event anytime they want to communicate with the container to let it know that something has happened of significance.

    isLoadingEntities: boolean = true
    isLoadingRecentRecords: boolean = true
    liveFilterText: string = ''
    navigationService: NavigationService
    OpenEntityRecord: EventEmitter<{ EntityName: string; RecordPKey: CompositeKey }>

    Subclasses can emit this event anytime they want to open a record within a particular entity. The container should handle this event and open the record.

    ParentTabId: string | null

    Tab ID for query param notification scoping. Set by resource wrappers that render child dashboards, so the child knows which tab it belongs to. If not set, falls back to Data.Configuration.tabId.

    Provider: IMetadataProvider | null

    If specified, this provider will be used for communication and for all metadata purposes. By default, if not provided, the Metadata and RunView classes are used for this and the default GraphQLDataProvider is used which is connected to the same back-end MJAPI instance as the Metadata and RunView classes. If you want to have this component connect to a different MJAPI back-end, create an instance of a ProviderBase sub-class like GraphQLDataProvider/etc, and configure it as appropriate to connect to the MJAPI back-end you want to use, and then pass it in here.

    recentRecords: RecentRecordAccess[] = []
    recentRecordsEntityFilter: string | null = null
    selectedEntity: EntityInfo | null = null
    selectedRecord: Record<string, unknown> | null = null
    selectedViewEntity: MJUserViewEntityExtended | null = null
    stateService: ExplorerStateService
    totalRecordCount: number = 0
    UserStateChanged: EventEmitter<any>

    Subclasses should emit this event anytime their internal state changes in a way that they'd like to persist.

    viewerConfig: Partial<EntityViewerConfig> = ...

    Configuration for mj-entity-viewer composite component Hides the built-in header since we have a custom header in the dashboard Uses server-side pagination with 100 records per page (default)

    viewWorkspaceRef: ViewWorkspaceComponent | undefined

    Reference to the view workspace (owns view CRUD + the inner data renderer)

    "ɵdir": unknown
    "ɵfac": unknown

    Accessors

    • get Config(): DashboardConfig | null

      Returns DashboardConfig | null

    • set Config(value: DashboardConfig): void

      Set or change the dashboard configuration. Changing this property will NOT cause the dashboard to reload. Call Refresh() to do that.

      Parameters

      Returns void

    • get Data(): ResourceData

      Returns ResourceData

    • set Data(value: ResourceData): void

      Parameters

      Returns void

    • get DisplayNameChangedEvent(): ((newName: string) => void) | null

      Returns ((newName: string) => void) | null

    • set DisplayNameChangedEvent(value: ((newName: string) => void) | null): void

      Parameters

      • value: ((newName: string) => void) | null

      Returns void

    • get LoadComplete(): boolean

      Returns boolean

    • get LoadCompleteEvent(): any

      Returns any

    • set LoadCompleteEvent(value: any): void

      Parameters

      • value: any

      Returns void

    • get LoadStarted(): boolean

      Returns boolean

    • get LoadStartedEvent(): any

      Returns any

    • set LoadStartedEvent(value: any): void

      Parameters

      • value: any

      Returns void

    • get ProviderToUse(): IMetadataProvider

      Returns either the default Metadata provider or the one specified in the Provider property, if it was specified

      Returns IMetadataProvider

    • get ResourceCloseRequestedEvent(): (() => void) | null

      Returns (() => void) | null

    • set ResourceCloseRequestedEvent(value: (() => void) | null): void

      Parameters

      • value: (() => void) | null

      Returns void

    • get ResourceRecordSavedEvent(): any

      Returns any

    • set ResourceRecordSavedEvent(value: any): void

      Parameters

      • value: any

      Returns void

    • get RunQueryToUse(): IRunQueryProvider

      Returns either the default RunQuery provider or the one specified in the Provider property, if it was specified

      Returns IRunQueryProvider

    • get RunReportToUse(): IRunReportProvider

      Returns either the default RunReport provider or the one specified in the Provider property, if it was specified

      Returns IRunReportProvider

    • get RunViewToUse(): IRunViewProvider

      Returns either the default RunView provider or the one specified in the Provider property, if it was specified

      Returns IRunViewProvider

    • get uniqueRecentRecordEntities(): {
          count: number;
          entityId: string;
          entityName: string;
          icon: string;
      }[]

      Get unique entities from recent records for the filter strip. Returns up to 5 entities, sorted by frequency in the recent records.

      Returns { count: number; entityId: string; entityName: string; icon: string }[]

    Methods

    • Read current query params from tab configuration. Use in initDashboard() / ngOnInit() to get initial URL state.

      Returns Record<string, string>

    • Get this component's tab ID. Checks ParentTabId input first (set by resource wrappers for child dashboards), then falls back to Data.Configuration.tabId.

      Returns string

    • Public entry point for the resource wrapper to forward query param changes. The wrapper receives OnQueryParamsChanged from the framework and delegates here.

      Parameters

      • params: Record<string, string>
      • _source: "popstate" | "deeplink"

      Returns void

    • After the view initializes, publish the initial agent context and register the mode-scoped client tools the AI agent can invoke against this surface (the initial mode is 'home' until an entity is selected). The ongoing context re-emit and tool re-scoping both happen in the state subscription set up in ngOnInit.

      Returns void

    • A callback method that is invoked immediately after the default change detector has checked data-bound properties if at least one has changed, and before the view and content children are checked.

      Parameters

      • changes: { [propName: string]: SimpleChange<any> }

        The changed properties.

      Returns Promise<void>

    • Ask the host shell to close/dismiss this resource (typically: close the tab). Called by subclasses that hosted a form that emitted a 'dismiss' navigation event — most often, a brand-new record where the user clicked Discard. The record was never saved, the form is empty, and leaving it open serves no purpose. The tab-container listens for this and closes the workspace tab.

      Returns void

    • Call this to notify the tab system that the resource's display name has changed. The tab container will update the tab title and browser title accordingly.

      Parameters

      • newName: string

      Returns void

    • Returns void

    • Returns void

    • This method will result in the dashboard being reloaded.

      Returns Promise<void>

    • Marks this component's view (and its ancestors) as needing change detection and schedules a tick — the reliable way for a resource component to re-render after updating state from async work (RunView/RunQuery continuations, timers, websocket pushes, RxJS subscriptions).

      WHY THIS EXISTS: the Explorer shell hosts resource components dynamically — createComponent()

      • ApplicationRef.attachView() — because tab content mounts into Golden Layout / cached DOM containers, not into an Angular template. Since Angular 18's change-detection scheduler rework (Explorer is on Angular 21), ApplicationRef.tick() only refreshes attached views that are FLAGGED dirty; a root-level attached view whose component mutates plain fields from an async continuation is never flagged, so the view silently never re-renders — even though the component uses default (non-OnPush) change detection (issue #3106).

      The framework calls this automatically from NotifyLoadStarted() / NotifyLoadComplete(), so the standard load lifecycle re-renders without any subclass action. Call it yourself after any LATER async state change that must reach the DOM outside those signals.

      Returns void

    • This method can be used by a container to let the dashboard know that it is being opened/closed. Base class just sets a flag.

      Parameters

      • visible: boolean

      Returns void

    • Push query param changes to the URL. Creates a browser history entry. Safe to call during OnQueryParamsChanged — auto-suppressed to prevent loops.

      Parameters

      • params: Record<string, string | null>

      Returns void