Whether the panel is animating closed
Dependencies per record, keyed by composite key string
Precomputed field rows for the comparison grid
The group being compared (null = panel closed)
Whether the comparison panel is loading entity records
Parsed match info for comparison columns
Whether to show all fields or only differences
Current page (0-based)
Computed range bounds from actual data — used as min/max/placeholder for filter inputs
Which column indices have expanded dependency details
Protecteddestroy$View mode: 'kanban' (card board) or 'table' (paged grid)
The group currently being dragged
Which column is being dragged over (for highlight)
LLM reasoning gate — working copies synced from the selected entity document. Unlike the run-threshold sliders (per-run overrides), these are per-entity config the engine reads from the Entity Document, so editing them persists back to that record (see persistReasoningConfig).
When true, renders only the body content (no chrome). Set by parent shells that embed this resource. See plans/explorer-chrome-conventions.md Section 5.
Whether the results area (runs/details/matches) is still loading
Whether the merge is currently executing
True once the LLM proposed survivor/field-map has been applied to the selection state
Whether the current entity allows record merging (controls merge button availability)
ProtectednavigationPage size for table view
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.
Floating LLM-reasoning popover state. Rendered as a fixed-position card over the comparison grid so the full reasoning prose no longer lives inline in the column header (which made headers tall, uneven, and visually cluttered). Null when closed.
Runtime threshold overrides — initialized from entity doc, adjustable via sliders
Selected entity filter
Currently selected group for merge panel
Whether the merge confirmation panel is visible
Whether the merge panel is visible
Whether merge-not-available inline banner should be shown in the results area
Index of the surviving record column (0 = source, 1+ = match index)
StaticɵdirStaticɵfacWhether any filters are active
True when ANY match in the current comparison carries LLM reasoning data
Whether there are any non-skipped matches available for merging
Whether a card is currently being dragged
Returns either the default Metadata provider or the one specified in the Provider property, if it was specified
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
Get selected entity document threshold info
Get total page count
Check if all fields are selected from a given column
Approve an individual match
Approves all matches within a duplicate group by updating each match's ApprovalStatus.
Case-insensitive, trimmed comparison of two field values
Count how many fields are cherry-picked from non-survivor columns
Clear all filters
Close the comparison panel with slide-out animation
Close the merge confirmation panel
Close the merge panel
Close the floating reasoning popover
Execute the merge operation
Filter by entity name
Get the list of cherry-picked field overrides (fields picked from non-survivor columns).
Value is the DISPLAY string (with an (empty) sentinel for null) for the confirm panel;
RawValue is the actual value to write at merge time — never the sentinel, so the merge
never corrupts a field with the literal text "(empty)".
Get the name for a column index
Get cached dependent records for an entity group (empty until expanded and loaded)
Get dependencies for a column (0 = source, 1+ = match index)
Get deps grouped by related entity for a column
CSS class for an LLM recommendation badge
Font Awesome icon class for an LLM recommendation
Human-readable label for an LLM recommendation
Get the column index with the most dependencies
Get non-surviving columns excluding skipped (Rejected) matches for merge confirmation display
Get paged groups for table view
ProtectedGetRead current query params from tab configuration. Use in initDashboard() / ngOnInit() to get initial URL state.
Returns the CSS class for a match score indicator
Returns a human-readable label for a match score
Get this component's tab ID. Checks ParentTabId input first (set by resource wrappers for child dashboards), then falls back to Data.Configuration.tabId.
Get total dependency count for a column
Get visible fields based on the toggle state
Check if a specific entity group is expanded
Check if dep records are loading for an entity group
Check if dependency details are expanded for a column
Whether the reasoning popover is currently open for a given match column
Loads all duplicate run data and builds the Kanban groups. Split into two phases so that controls become interactive immediately: Phase 1 - entity docs from KH engine cache (instant) Phase 2 - runs/details/matches via RunViews (heavy)
Navigate to next page
A callback method that is invoked immediately after Angular has completed initialization of a component's view. It is invoked only once when the view is instantiated.
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 absolute threshold slider change
Toggle the LLM reasoning layer for the selected entity document and persist immediately.
Close the reasoning popover first (if open), otherwise the comparison panel, on Escape
Handle filter changes with debounce
Handle potential threshold slider change
ProtectedOnCalled by the framework when query params change from an external source (browser back/forward, deep link navigation). Override in subclasses to react to query param changes.
The new query params from the URL
'popstate' for back/forward, 'deeplink' for external URL entry
Live-update the reasoning-threshold display as the slider moves (persisted on release).
Persist the reasoning threshold when the slider is released.
Open the comparison slide-in panel for a group — loads real entity records
Navigate to a dependent record
Open the merge confirmation panel
Open the merge panel for a duplicate group
Open (or toggle) the floating reasoning popover for a match column, anchored under the "Why?" trigger that was clicked. Rendering the prose in a fixed-position card keeps the column headers short and uniform instead of letting reasoning text balloon the header inline.
Navigate to previous page
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.
Reject an individual match (skip it from merge)
Rejects all matches within a duplicate group by updating each match's ApprovalStatus.
ProtectedResourceTrigger a new duplicate detection run by creating a DuplicateRun entity. The server hook auto-triggers detection when a run is saved with EndedAt === null.
Select a specific field value from a column
Set the surviving record column index
Get the primary key display string for the surviving record
Get the name of the surviving record
Toggle expanded state for a specific entity group — lazy-loads records on first expand
Toggle expanded state for dependency details in a column
Toggle display mode
Undo a rejected individual match (restore to Pending)
ProtectedUpdatePush query param changes to the URL. Creates a browser history entry. Safe to call during OnQueryParamsChanged — auto-suppressed to prevent loops.
Select all field values from a specific column
Base class for all MJ Explorer navigation components - a navigation component is any component that can be displayed from a route