Protected_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).
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").
Optional deep link to navigate to a specific entity/record on load. Parsed from URL query parameters (e.g., ?entity=Users&record=123)
Protecteddestroy$Emitted when the display title should change (entity selected, record opened, etc.)
Optional filter to constrain which entities are shown in the explorer. Can filter by applicationId, schemaNames, or explicit entityNames.
Subclasses can emit anytime an error occurs.
Reference to the filter input for keyboard shortcuts
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.
Subclasses can emit this event anytime they want to communicate with the container to let it know that something has happened of significance.
ProtectednavigationSubclasses 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.
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.
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.
Subclasses should emit this event anytime their internal state changes in a way that they'd like to persist.
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)
Reference to the view workspace (owns view CRUD + the inner data renderer)
StaticɵdirStaticɵfacGet the set of allowed entity names for filtering favorites/recents. Returns null if no filter is active (all entities allowed).
Count of applications that have at least one visible entity
Set or change the dashboard configuration. Changing this property will NOT cause the dashboard to reload. Call Refresh() to do that.
Get the display icon for the header (when at home level). Returns contextIcon if provided, otherwise null.
Get the display title for the header. Priority: contextName > entityFilter.applicationName > "Data Explorer"
Get favorite entities for home screen display
Get app entity groups filtered by current entityFilterText and homeViewMode. When searching, auto-expands groups that contain matches.
Total count of entities matching current filters (across all groups or flat list)
Get filtered recent records based on entity filter.
Get a flat filtered entity list for single-application mode. Used when entityFilter.applicationId is set, bypassing app grouping.
Check if we're at the home level (no entity selected)
No-results message for the entity list (echoes the filter text).
Returns either the default Metadata provider or the one specified in the Provider property, if it was specified
Favorite records limited to 3 for the quick access panel
Recent entities limited to 3 for the quick access panel
Recent records limited to 3 for the quick access panel
Get recent entities for home screen display (max 5)
Returns either the default RunQuery provider or the one specified in the Provider property, if it was specified
Returns either the default RunReport provider or the one specified in the Provider property, if it was specified
Returns either the default RunView provider or the one specified in the Provider property, if it was specified
Check if we should show the entity filter strip for recent records. Only show when there are 2+ unique entities.
Get unique entities from recent records for the filter strip. Returns up to 5 entities, sorted by frequency in the recent records.
Clear the record filter (called by the X button).
Get the icon for an entity by ID (for recent records)
ProtectedGetRead current query params from tab configuration. Use in initDashboard() / ngOnInit() to get initial URL state.
Sub-classes can override this to provide a custom icon class
Get this component's tab ID. Checks ParentTabId input first (set by resource wrappers for child dashboards), then falls back to Data.Configuration.tabId.
Handle keyboard shortcuts "/" or Cmd+K focuses the filter input
Public entry point for the resource wrapper to forward query param changes. The wrapper receives OnQueryParamsChanged from the framework and delegates here.
ProtectedinitSubclasses can override this method to perform any initialization they need. This method only runs once when the dashboard is created.
Check if a quick access section is expanded
ProtectedloadSubclasses should override this method to load their data. This method is called when the dashboard is created and when Refresh() is called.
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.
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.
The changed properties.
A callback method that performs custom clean-up, invoked immediately before a directive, pipe, or service instance is destroyed.
A callback method that is invoked immediately after the default change detector has checked the directive's data-bound properties for the first time, and before any of the view or content children have been checked. It is invoked only once when the directive is instantiated.
ProtectedNotifyAsk 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.
ProtectedNotifyCall 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.
ProtectedNotifyProtectedNotifyHandle breadcrumb click - navigate to that level
Handle creating a new record for the current entity
Handle the workspace's "create new record" request — route via NavigationService.
Handle detail panel close
Handle entity selection from navigation panel or home screen
Handle expand and focus from collapsed nav icon click
Handle clicking on a favorite record from home screen. Navigates to the entity and sets up pending selection to select the record and open the detail panel once data loads.
Handle filtered count change from mj-entity-viewer
Handle direct keyboard input in the filter text box. Only updates the live display text and pushes to the debounce subject. Does NOT trigger state changes or URL updates — those happen after the debounce.
Handle filter text change from mj-entity-viewer (two-way binding)
Handle navigation to a related entity from detail panel. Navigates within the explorer and applies filter to show related records.
Handle opening a foreign key record (from FK field link in detail panel) Loads the record and displays it in the detail panel
Handle the workspace's "open view in tab" request — route via NavigationService.
Handle opening a record in full view (from detail panel) Uses detailPanelEntity since the panel may be showing a different entity than the grid
Handle opening a record from navigation panel (recent/favorites)
Handle opening a related record - display in detail panel (not new tab) The record is already loaded, so just update the detail panel
NAVIGATION handler: open a related record on a (possibly different) entity, bubbled up from a plug-in renderer through the workspace (e.g. a grid foreign-key drill-through). Resolves the target entity and shows the record in the detail panel, mirroring the FK navigation path used by onOpenForeignKeyRecord.
the related-record navigation payload: the target entity name and the record's key.
ProtectedOnReact to back/forward navigation or deep-link entry. The base class calls this when query params change via popstate or deeplink.
Handle clicking on a recent record from home screen. Navigates to the entity and sets up pending selection to select the record and open the detail panel once data loads.
Handle selecting a record from navigation panel (recent/favorites). Navigates to the entity within Data Explorer and selects the record in the detail panel (instead of opening full record view).
Handle smart filter change from dashboard header
Handle record opened from mj-entity-viewer (double-click or open button)
Handle the workspace's OpenRecordRequested (record open from the inner viewer). Builds the composite key from the record and routes to the full record view via the OpenEntityRecord output.
Clear the Explorer "view modified" flag after the workspace persists/reverts a view.
Handle a view selection emitted by the workspace. Tracks the selected view for routing/export and syncs the selected-view-id + smart-filter into the Explorer state service for URL sync. Grid-state application is owned by the workspace.
This method will result in the dashboard being reloaded.
ProtectedRefreshMarks 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.
ProtectedResourceSet the home view mode (all vs favorites)
Set the entity filter for recent records
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.
Toggle an application group's expanded/collapsed state
Toggle navigation panel
Toggle the quick access (right) panel
Toggle a section in the quick access panel
Toggle show all entities vs common entities
ProtectedUpdatePush query param changes to the URL. Creates a browser history entry. Safe to call during OnQueryParamsChanged — auto-suppressed to prevent loops.
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.