@memberjunction/ng-dashboards 2.120.0 → 2.122.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.
Files changed (203) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +23 -11
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +122 -95
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +88 -90
  6. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  7. package/dist/AI/components/agents/agent-filter-panel.component.js +2 -2
  8. package/dist/AI/components/execution-monitoring.component.d.ts +23 -10
  9. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  10. package/dist/AI/components/execution-monitoring.component.js +143 -124
  11. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  12. package/dist/AI/components/models/model-management-v2.component.d.ts +17 -13
  13. package/dist/AI/components/models/model-management-v2.component.d.ts.map +1 -1
  14. package/dist/AI/components/models/model-management-v2.component.js +248 -266
  15. package/dist/AI/components/models/model-management-v2.component.js.map +1 -1
  16. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +76 -78
  17. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  18. package/dist/AI/components/prompts/prompt-filter-panel.component.js +2 -2
  19. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts +17 -15
  20. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +1 -1
  21. package/dist/AI/components/prompts/prompt-management-v2.component.js +372 -397
  22. package/dist/AI/components/prompts/prompt-management-v2.component.js.map +1 -1
  23. package/dist/AI/components/prompts/prompt-version-control.component.js +100 -102
  24. package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
  25. package/dist/AI/components/system/system-config-filter-panel.component.js +2 -2
  26. package/dist/AI/components/system/system-configuration.component.d.ts +17 -10
  27. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  28. package/dist/AI/components/system/system-configuration.component.js +82 -61
  29. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  30. package/dist/AI/components/widgets/kpi-card.component.d.ts.map +1 -1
  31. package/dist/AI/components/widgets/kpi-card.component.js +11 -7
  32. package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
  33. package/dist/AI/index.d.ts +4 -0
  34. package/dist/AI/index.d.ts.map +1 -1
  35. package/dist/AI/index.js +6 -1
  36. package/dist/AI/index.js.map +1 -1
  37. package/dist/Actions/components/actions-list-view.component.js +9 -9
  38. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  39. package/dist/Actions/components/actions-overview.component.d.ts +16 -13
  40. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  41. package/dist/Actions/components/actions-overview.component.js +62 -48
  42. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  43. package/dist/Actions/components/categories-list-view.component.js +9 -9
  44. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  45. package/dist/Actions/components/code-management.component.d.ts +17 -7
  46. package/dist/Actions/components/code-management.component.d.ts.map +1 -1
  47. package/dist/Actions/components/code-management.component.js +45 -12
  48. package/dist/Actions/components/code-management.component.js.map +1 -1
  49. package/dist/Actions/components/entity-integration.component.d.ts +17 -7
  50. package/dist/Actions/components/entity-integration.component.d.ts.map +1 -1
  51. package/dist/Actions/components/entity-integration.component.js +45 -12
  52. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  53. package/dist/Actions/components/execution-monitoring.component.d.ts +16 -10
  54. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  55. package/dist/Actions/components/execution-monitoring.component.js +56 -30
  56. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  57. package/dist/Actions/components/scheduled-actions.component.d.ts +17 -7
  58. package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -1
  59. package/dist/Actions/components/scheduled-actions.component.js +45 -12
  60. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  61. package/dist/Actions/components/security-permissions.component.d.ts +17 -7
  62. package/dist/Actions/components/security-permissions.component.d.ts.map +1 -1
  63. package/dist/Actions/components/security-permissions.component.js +45 -12
  64. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  65. package/dist/Actions/index.d.ts +6 -1
  66. package/dist/Actions/index.d.ts.map +1 -1
  67. package/dist/Actions/index.js +9 -1
  68. package/dist/Actions/index.js.map +1 -1
  69. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +1 -1
  70. package/dist/ComponentStudio/component-studio-dashboard.component.js +8 -8
  71. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  72. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +52 -57
  73. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  74. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +8 -9
  75. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  76. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +107 -0
  77. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -0
  78. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +553 -0
  79. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -0
  80. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts +179 -0
  81. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts.map +1 -0
  82. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js +814 -0
  83. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js.map +1 -0
  84. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +151 -0
  85. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -0
  86. package/dist/DataExplorer/components/view-selector/view-selector.component.js +480 -0
  87. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -0
  88. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +439 -0
  89. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -0
  90. package/dist/DataExplorer/data-explorer-dashboard.component.js +2129 -0
  91. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -0
  92. package/dist/DataExplorer/index.d.ts +5 -0
  93. package/dist/DataExplorer/index.d.ts.map +1 -0
  94. package/dist/DataExplorer/index.js +10 -0
  95. package/dist/DataExplorer/index.js.map +1 -0
  96. package/dist/DataExplorer/models/explorer-state.interface.d.ts +183 -0
  97. package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -0
  98. package/dist/DataExplorer/models/explorer-state.interface.js +31 -0
  99. package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -0
  100. package/dist/DataExplorer/services/explorer-state.service.d.ts +232 -0
  101. package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -0
  102. package/dist/DataExplorer/services/explorer-state.service.js +912 -0
  103. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -0
  104. package/dist/EntityAdmin/components/entity-details.component.d.ts.map +1 -1
  105. package/dist/EntityAdmin/components/entity-details.component.js +11 -13
  106. package/dist/EntityAdmin/components/entity-details.component.js.map +1 -1
  107. package/dist/EntityAdmin/components/entity-filter-panel.component.js +2 -2
  108. package/dist/EntityAdmin/components/erd-composite.component.js +2 -2
  109. package/dist/EntityAdmin/components/erd-diagram.component.js +2 -2
  110. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +1 -1
  111. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  112. package/dist/EntityAdmin/entity-admin-dashboard.component.js +14 -15
  113. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  114. package/dist/Home/home-dashboard.component.d.ts +122 -0
  115. package/dist/Home/home-dashboard.component.d.ts.map +1 -0
  116. package/dist/Home/home-dashboard.component.js +698 -0
  117. package/dist/Home/home-dashboard.component.js.map +1 -0
  118. package/dist/Scheduling/components/index.d.ts +11 -0
  119. package/dist/Scheduling/components/index.d.ts.map +1 -0
  120. package/dist/Scheduling/components/index.js +13 -0
  121. package/dist/Scheduling/components/index.js.map +1 -0
  122. package/dist/Scheduling/components/scheduling-health-resource.component.d.ts +20 -0
  123. package/dist/Scheduling/components/scheduling-health-resource.component.d.ts.map +1 -0
  124. package/dist/Scheduling/components/scheduling-health-resource.component.js +55 -0
  125. package/dist/Scheduling/components/scheduling-health-resource.component.js.map +1 -0
  126. package/dist/Scheduling/components/scheduling-health.component.js +7 -8
  127. package/dist/Scheduling/components/scheduling-health.component.js.map +1 -1
  128. package/dist/Scheduling/components/scheduling-history-resource.component.d.ts +20 -0
  129. package/dist/Scheduling/components/scheduling-history-resource.component.d.ts.map +1 -0
  130. package/dist/Scheduling/components/scheduling-history-resource.component.js +55 -0
  131. package/dist/Scheduling/components/scheduling-history-resource.component.js.map +1 -0
  132. package/dist/Scheduling/components/scheduling-history.component.js +7 -8
  133. package/dist/Scheduling/components/scheduling-history.component.js.map +1 -1
  134. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +20 -0
  135. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -0
  136. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +55 -0
  137. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -0
  138. package/dist/Scheduling/components/scheduling-jobs.component.js +7 -8
  139. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  140. package/dist/Scheduling/components/scheduling-monitor-resource.component.d.ts +20 -0
  141. package/dist/Scheduling/components/scheduling-monitor-resource.component.d.ts.map +1 -0
  142. package/dist/Scheduling/components/scheduling-monitor-resource.component.js +55 -0
  143. package/dist/Scheduling/components/scheduling-monitor-resource.component.js.map +1 -0
  144. package/dist/Scheduling/components/scheduling-monitoring.component.js +7 -8
  145. package/dist/Scheduling/components/scheduling-monitoring.component.js.map +1 -1
  146. package/dist/Scheduling/components/scheduling-types-resource.component.d.ts +20 -0
  147. package/dist/Scheduling/components/scheduling-types-resource.component.d.ts.map +1 -0
  148. package/dist/Scheduling/components/scheduling-types-resource.component.js +55 -0
  149. package/dist/Scheduling/components/scheduling-types-resource.component.js.map +1 -0
  150. package/dist/Scheduling/components/scheduling-types.component.js +7 -8
  151. package/dist/Scheduling/components/scheduling-types.component.js.map +1 -1
  152. package/dist/Scheduling/scheduling-dashboard.component.d.ts +1 -1
  153. package/dist/Scheduling/scheduling-dashboard.component.js +3 -3
  154. package/dist/Testing/components/index.d.ts +11 -0
  155. package/dist/Testing/components/index.d.ts.map +1 -0
  156. package/dist/Testing/components/index.js +13 -0
  157. package/dist/Testing/components/index.js.map +1 -0
  158. package/dist/Testing/components/testing-analytics-resource.component.d.ts +20 -0
  159. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -0
  160. package/dist/Testing/components/testing-analytics-resource.component.js +55 -0
  161. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -0
  162. package/dist/Testing/components/testing-execution-resource.component.d.ts +20 -0
  163. package/dist/Testing/components/testing-execution-resource.component.d.ts.map +1 -0
  164. package/dist/Testing/components/testing-execution-resource.component.js +55 -0
  165. package/dist/Testing/components/testing-execution-resource.component.js.map +1 -0
  166. package/dist/Testing/components/testing-execution.component.js +3 -3
  167. package/dist/Testing/components/testing-execution.component.js.map +1 -1
  168. package/dist/Testing/components/testing-feedback-resource.component.d.ts +20 -0
  169. package/dist/Testing/components/testing-feedback-resource.component.d.ts.map +1 -0
  170. package/dist/Testing/components/testing-feedback-resource.component.js +55 -0
  171. package/dist/Testing/components/testing-feedback-resource.component.js.map +1 -0
  172. package/dist/Testing/components/testing-overview-resource.component.d.ts +20 -0
  173. package/dist/Testing/components/testing-overview-resource.component.d.ts.map +1 -0
  174. package/dist/Testing/components/testing-overview-resource.component.js +55 -0
  175. package/dist/Testing/components/testing-overview-resource.component.js.map +1 -0
  176. package/dist/Testing/components/testing-version-resource.component.d.ts +20 -0
  177. package/dist/Testing/components/testing-version-resource.component.d.ts.map +1 -0
  178. package/dist/Testing/components/testing-version-resource.component.js +55 -0
  179. package/dist/Testing/components/testing-version-resource.component.js.map +1 -0
  180. package/dist/Testing/testing-dashboard.component.d.ts +1 -1
  181. package/dist/Testing/testing-dashboard.component.js +23 -25
  182. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  183. package/dist/module.d.ts +83 -66
  184. package/dist/module.d.ts.map +1 -1
  185. package/dist/module.js +137 -19
  186. package/dist/module.js.map +1 -1
  187. package/dist/public-api.d.ts +6 -4
  188. package/dist/public-api.d.ts.map +1 -1
  189. package/dist/public-api.js +41 -13
  190. package/dist/public-api.js.map +1 -1
  191. package/package.json +17 -14
  192. package/dist/AI/ai-dashboard.component.d.ts +0 -62
  193. package/dist/AI/ai-dashboard.component.d.ts.map +0 -1
  194. package/dist/AI/ai-dashboard.component.js +0 -338
  195. package/dist/AI/ai-dashboard.component.js.map +0 -1
  196. package/dist/Actions/actions-management-dashboard.component.d.ts +0 -52
  197. package/dist/Actions/actions-management-dashboard.component.d.ts.map +0 -1
  198. package/dist/Actions/actions-management-dashboard.component.js +0 -308
  199. package/dist/Actions/actions-management-dashboard.component.js.map +0 -1
  200. package/dist/generic/base-dashboard.d.ts +0 -65
  201. package/dist/generic/base-dashboard.d.ts.map +0 -1
  202. package/dist/generic/base-dashboard.js +0 -74
  203. package/dist/generic/base-dashboard.js.map +0 -1
@@ -0,0 +1,439 @@
1
+ import { OnInit, OnDestroy, ChangeDetectorRef, OnChanges, SimpleChanges, ElementRef } from '@angular/core';
2
+ import { Router } from '@angular/router';
3
+ import { BaseDashboard } from '@memberjunction/ng-shared';
4
+ import { RecentAccessService } from '@memberjunction/ng-shared-generic';
5
+ import { EntityInfo } from '@memberjunction/core';
6
+ import { BaseEntity } from '@memberjunction/core';
7
+ import { RecordSelectedEvent, RecordOpenedEvent, DataLoadedEvent, FilteredCountChangedEvent, EntityViewerConfig, EntityViewMode, NavigateToRelatedEvent, EntityViewerComponent, ViewGridStateConfig, GridStateChangedEvent } from '@memberjunction/ng-entity-viewer';
8
+ import { ViewSelectedEvent, SaveViewRequestedEvent, ViewSelectorComponent } from './components/view-selector/view-selector.component';
9
+ import { ViewSaveEvent } from './components/view-config-panel/view-config-panel.component';
10
+ import { UserViewEntityExtended } from '@memberjunction/core-entities';
11
+ import { ExplorerStateService } from './services/explorer-state.service';
12
+ import { DataExplorerState, DataExplorerFilter, BreadcrumbItem, DataExplorerDeepLink, RecentRecordAccess, FavoriteRecord } from './models/explorer-state.interface';
13
+ import { OpenRecordEvent, SelectRecordEvent } from './components/navigation-panel/navigation-panel.component';
14
+ import * as i0 from "@angular/core";
15
+ /**
16
+ * Data Explorer Dashboard - Power user interface for exploring data across entities
17
+ * Combines card-based browsing with grid views and relationship visualization
18
+ *
19
+ * Uses mj-entity-viewer composite component for the main content area,
20
+ * which handles data loading, filtering, and view mode switching.
21
+ */
22
+ export declare class DataExplorerDashboardComponent extends BaseDashboard implements OnInit, OnDestroy, OnChanges {
23
+ stateService: ExplorerStateService;
24
+ private cdr;
25
+ private router;
26
+ private recentAccessService;
27
+ private destroy$;
28
+ private metadata;
29
+ /** Reference to the filter input for keyboard shortcuts */
30
+ filterInputRef: ElementRef<HTMLInputElement> | undefined;
31
+ /** Reference to the view selector for refreshing after save */
32
+ viewSelectorRef: ViewSelectorComponent | undefined;
33
+ /** Reference to the entity viewer for refreshing after view save */
34
+ entityViewerRef: EntityViewerComponent | undefined;
35
+ /**
36
+ * Optional filter to constrain which entities are shown in the explorer.
37
+ * Can filter by applicationId, schemaNames, or explicit entityNames.
38
+ */
39
+ entityFilter: DataExplorerFilter | null;
40
+ /**
41
+ * Optional deep link to navigate to a specific entity/record on load.
42
+ * Parsed from URL query parameters (e.g., ?entity=Users&record=123)
43
+ */
44
+ deepLink: DataExplorerDeepLink | null;
45
+ /**
46
+ * Optional context name to display in the header instead of "Data Explorer".
47
+ * Use this to customize the explorer for specific applications (e.g., "CRM", "Association Demo").
48
+ */
49
+ contextName: string | null;
50
+ /**
51
+ * Optional context icon (Font Awesome class) to display in the header.
52
+ * Use this alongside contextName for a fully customized header (e.g., "fa-solid fa-users" for CRM).
53
+ */
54
+ contextIcon: string | null;
55
+ state: DataExplorerState;
56
+ private allEntities;
57
+ entities: EntityInfo[];
58
+ private applicationEntityIds;
59
+ selectedEntity: EntityInfo | null;
60
+ totalRecordCount: number;
61
+ filteredRecordCount: number;
62
+ selectedRecord: BaseEntity | null;
63
+ detailPanelEntity: EntityInfo | null;
64
+ private loadedRecords;
65
+ selectedViewEntity: UserViewEntityExtended | null;
66
+ debouncedFilterText: string;
67
+ private filterInput$;
68
+ entityFilterText: string;
69
+ breadcrumbs: BreadcrumbItem[];
70
+ isLoadingEntities: boolean;
71
+ private skipUrlUpdates;
72
+ private lastNavigatedUrl;
73
+ recentRecords: RecentRecordAccess[];
74
+ favoriteRecords: FavoriteRecord[];
75
+ isLoadingRecentRecords: boolean;
76
+ recentRecordsEntityFilter: string | null;
77
+ /**
78
+ * Filtered entities based on entityFilterText (for home screen)
79
+ * Excludes entities shown in recent or favorites sections
80
+ * Applies Common/All toggle filtering
81
+ */
82
+ get filteredEntities(): EntityInfo[];
83
+ /**
84
+ * Get recent entities for home screen display (max 5)
85
+ */
86
+ get recentEntities(): EntityInfo[];
87
+ /**
88
+ * Get favorite entities for home screen display
89
+ */
90
+ get favoriteEntities(): EntityInfo[];
91
+ /**
92
+ * Check if we should show the Common/All toggle
93
+ * Only show if we have DefaultForNewUser information
94
+ */
95
+ get showCommonAllToggle(): boolean;
96
+ /**
97
+ * Total count of all entities (for display)
98
+ */
99
+ get allEntitiesCount(): number;
100
+ /**
101
+ * Count of common (DefaultForNewUser) entities
102
+ */
103
+ get commonEntitiesCount(): number;
104
+ /**
105
+ * Check if we have any content for the top two-column section
106
+ * (recent/favorite entities OR recent/favorite records)
107
+ */
108
+ get hasTopSectionContent(): boolean;
109
+ /**
110
+ * Get unique entities from recent records for the filter strip.
111
+ * Returns up to 5 entities, sorted by frequency in the recent records.
112
+ */
113
+ get uniqueRecentRecordEntities(): {
114
+ entityId: string;
115
+ entityName: string;
116
+ icon: string;
117
+ count: number;
118
+ }[];
119
+ /**
120
+ * Check if we should show the entity filter strip for recent records.
121
+ * Only show when there are 2+ unique entities.
122
+ */
123
+ get showRecentRecordsEntityFilter(): boolean;
124
+ /**
125
+ * Get filtered recent records based on entity filter.
126
+ */
127
+ get filteredRecentRecords(): RecentRecordAccess[];
128
+ /**
129
+ * Set the entity filter for recent records
130
+ */
131
+ setRecentRecordsEntityFilter(entityId: string | null): void;
132
+ /**
133
+ * Get the display title for the header.
134
+ * Priority: contextName > entityFilter.applicationName > "Data Explorer"
135
+ */
136
+ get displayTitle(): string;
137
+ /**
138
+ * Get the display icon for the header (when at home level).
139
+ * Returns contextIcon if provided, otherwise null.
140
+ */
141
+ get displayIcon(): string | null;
142
+ /**
143
+ * Configuration for mj-entity-viewer composite component
144
+ * Hides the built-in header since we have a custom header in the dashboard
145
+ * Uses server-side pagination with 100 records per page (default)
146
+ */
147
+ viewerConfig: Partial<EntityViewerConfig>;
148
+ /**
149
+ * Current grid state (built from view entity or local state changes)
150
+ * This is passed to mj-entity-viewer to control column display
151
+ */
152
+ currentGridState: ViewGridStateConfig | null;
153
+ constructor(stateService: ExplorerStateService, cdr: ChangeDetectorRef, router: Router, recentAccessService: RecentAccessService);
154
+ ngOnInit(): Promise<void>;
155
+ /**
156
+ * Handle keyboard shortcuts
157
+ * "/" or Cmd+K focuses the filter input
158
+ */
159
+ handleKeyboardShortcut(event: KeyboardEvent): void;
160
+ /**
161
+ * Focus the filter input
162
+ */
163
+ private focusFilterInput;
164
+ ngOnDestroy(): void;
165
+ ngOnChanges(changes: SimpleChanges): Promise<void>;
166
+ protected initDashboard(): void;
167
+ protected loadData(): void;
168
+ /**
169
+ * Load all available entities the user can access, applying any configured filter
170
+ * @param urlState Optional URL state - if provided, skip restoring persisted entity to avoid race conditions
171
+ */
172
+ private loadEntities;
173
+ /**
174
+ * Load entity IDs associated with a specific application
175
+ */
176
+ private loadApplicationEntityIds;
177
+ /**
178
+ * Apply the configured filter to the entity list
179
+ */
180
+ private applyEntityFilter;
181
+ /**
182
+ * Handle entity selection from navigation panel or home screen
183
+ */
184
+ onEntitySelected(entity: EntityInfo): void;
185
+ /**
186
+ * Handle state changes from external sources
187
+ */
188
+ private onStateChanged;
189
+ /**
190
+ * Reset record counts when entity changes.
191
+ * The actual counts will be updated when mj-entity-viewer emits dataLoaded event.
192
+ */
193
+ private resetRecordCounts;
194
+ /**
195
+ * Handle view selection from view selector dropdown
196
+ */
197
+ onViewSelected(event: ViewSelectedEvent): void;
198
+ /**
199
+ * Parse GridState JSON from a UserView entity
200
+ * Returns null if no valid GridState is present
201
+ */
202
+ private parseViewGridState;
203
+ /**
204
+ * Handle grid state changes from entity-viewer (column resize, reorder, etc.)
205
+ * Updates the local currentGridState and marks view as modified
206
+ */
207
+ onGridStateChanged(event: GridStateChangedEvent): void;
208
+ /**
209
+ * Handle save view request from view selector
210
+ */
211
+ onSaveViewRequested(event: SaveViewRequestedEvent): void;
212
+ /**
213
+ * Handle manage views request - opens view browser
214
+ */
215
+ onManageViewsRequested(): void;
216
+ /**
217
+ * Handle open in tab request
218
+ */
219
+ onOpenInTabRequested(viewId: string): void;
220
+ /**
221
+ * Handle configure view request - opens the configuration panel
222
+ */
223
+ onConfigureViewRequested(): void;
224
+ /**
225
+ * Close the view configuration panel
226
+ */
227
+ onCloseViewConfigPanel(): void;
228
+ /**
229
+ * Handle save view from config panel
230
+ */
231
+ onSaveView(event: ViewSaveEvent): Promise<void>;
232
+ /**
233
+ * Build GridState in Kendo-compatible format
234
+ * Format: { columnSettings: [{ID, Name, DisplayName, hidden, width, orderIndex}], sortSettings: [{field, dir}] }
235
+ *
236
+ * Priority for column settings:
237
+ * 1. If event.columns provided (from config panel) - use those
238
+ * 2. If currentGridState exists (from grid interactions) - use that
239
+ * 3. Otherwise return null
240
+ */
241
+ private buildGridState;
242
+ /**
243
+ * Build SortState in Kendo-compatible format
244
+ * Format: [{field, direction}] where direction is 'asc' or 'desc'
245
+ */
246
+ private buildSortState;
247
+ /**
248
+ * Handle delete view from config panel
249
+ */
250
+ onDeleteView(): Promise<void>;
251
+ /**
252
+ * Handle view mode toggle from dashboard header
253
+ */
254
+ onViewModeChanged(mode: EntityViewMode): void;
255
+ /**
256
+ * Handle smart filter change from dashboard header
257
+ */
258
+ onSmartFilterChanged(prompt: string): void;
259
+ /**
260
+ * Handle filter text change from mj-entity-viewer (two-way binding)
261
+ */
262
+ onFilterTextChanged(filterText: string): void;
263
+ /**
264
+ * Handle record selection from mj-entity-viewer
265
+ */
266
+ onViewerRecordSelected(event: RecordSelectedEvent): void;
267
+ /**
268
+ * Handle record opened from mj-entity-viewer (double-click or open button)
269
+ */
270
+ onViewerRecordOpened(event: RecordOpenedEvent): void;
271
+ /**
272
+ * Handle data loaded from mj-entity-viewer
273
+ */
274
+ onDataLoaded(event: DataLoadedEvent): void;
275
+ /**
276
+ * Handle filtered count change from mj-entity-viewer
277
+ */
278
+ onFilteredCountChanged(event: FilteredCountChangedEvent): void;
279
+ /**
280
+ * Handle detail panel close
281
+ */
282
+ onDetailPanelClosed(): void;
283
+ /**
284
+ * Handle opening a record in full view (from detail panel)
285
+ * Uses detailPanelEntity since the panel may be showing a different entity than the grid
286
+ */
287
+ onOpenRecord(record: BaseEntity): void;
288
+ /**
289
+ * Handle navigation to a related entity from detail panel.
290
+ * Navigates within the explorer and applies filter to show related records.
291
+ */
292
+ onNavigateToRelated(event: NavigateToRelatedEvent): void;
293
+ /**
294
+ * Handle opening a related record - display in detail panel (not new tab)
295
+ * The record is already loaded, so just update the detail panel
296
+ */
297
+ onOpenRelatedRecord(event: {
298
+ entityName: string;
299
+ record: BaseEntity;
300
+ }): void;
301
+ /**
302
+ * Handle opening a foreign key record (from FK field link in detail panel)
303
+ * Loads the record and displays it in the detail panel
304
+ */
305
+ onOpenForeignKeyRecord(event: {
306
+ entityName: string;
307
+ recordId: string;
308
+ }): Promise<void>;
309
+ /**
310
+ * Show an already-loaded record in the detail panel
311
+ * Note: This does NOT change selectedEntity (the main grid's entity)
312
+ * It only updates detailPanelEntity which is used by the detail panel
313
+ */
314
+ private showRecordInDetailPanel;
315
+ /**
316
+ * Load a record by ID and show it in the detail panel
317
+ */
318
+ private loadAndShowRecordInDetailPanel;
319
+ /**
320
+ * Handle opening a record from navigation panel (recent/favorites)
321
+ */
322
+ onOpenRecordFromNav(event: OpenRecordEvent): void;
323
+ /**
324
+ * Handle selecting a record from navigation panel (recent/favorites).
325
+ * Navigates to the entity within Data Explorer and selects the record
326
+ * in the detail panel (instead of opening full record view).
327
+ */
328
+ onSelectRecordFromNav(event: SelectRecordEvent): void;
329
+ /**
330
+ * Toggle navigation panel
331
+ */
332
+ toggleNavigationPanel(): void;
333
+ /**
334
+ * Handle expand and focus from collapsed nav icon click
335
+ */
336
+ onExpandAndFocus(section: 'favorites' | 'recent' | 'entities'): void;
337
+ /**
338
+ * Apply a deep link to navigate to a specific entity/record
339
+ */
340
+ private applyDeepLink;
341
+ /** Record ID to select once data loads (from deep link) */
342
+ private pendingRecordSelection;
343
+ /**
344
+ * Handle breadcrumb click - navigate to that level
345
+ */
346
+ onBreadcrumbClick(breadcrumb: BreadcrumbItem, index: number): void;
347
+ /**
348
+ * Get the set of allowed entity names for filtering favorites/recents.
349
+ * Returns null if no filter is active (all entities allowed).
350
+ */
351
+ get allowedEntityNames(): Set<string> | null;
352
+ /**
353
+ * Get display name for a record
354
+ */
355
+ private getRecordDisplayName;
356
+ /**
357
+ * Get the icon class for an entity
358
+ */
359
+ getEntityIcon(entity: EntityInfo): string;
360
+ /**
361
+ * Format entity icon to ensure proper Font Awesome class format
362
+ */
363
+ private formatEntityIcon;
364
+ /**
365
+ * Parse URL query string and return a deep link object.
366
+ * Returns null if no relevant params found.
367
+ *
368
+ * Query params:
369
+ * - entity: Selected entity name
370
+ * - record: Selected record ID (URL segment format via CompositeKey)
371
+ * - filter: Current filter text
372
+ * - view: View mode (grid or cards)
373
+ */
374
+ private parseUrlState;
375
+ /**
376
+ * Apply URL state to the component.
377
+ * Used both during init and for popstate handling.
378
+ */
379
+ private applyUrlState;
380
+ /**
381
+ * Update the URL query string to reflect current navigation state.
382
+ * This enables deep linking - users can bookmark or share URLs to specific views.
383
+ * Called immediately on state changes (not debounced).
384
+ * Uses Angular Router for proper browser history integration.
385
+ */
386
+ private updateUrl;
387
+ /**
388
+ * Handle external navigation (back/forward buttons).
389
+ * Parses the URL and applies the state without triggering a new navigation.
390
+ */
391
+ private onExternalNavigation;
392
+ /**
393
+ * Parse URL state from a URL string (used for external navigation).
394
+ */
395
+ private parseUrlFromString;
396
+ /**
397
+ * Toggle entity favorite status
398
+ */
399
+ toggleEntityFavorite(entity: EntityInfo, event: Event): Promise<void>;
400
+ /**
401
+ * Check if entity is favorited (for template)
402
+ */
403
+ isEntityFavorited(entity: EntityInfo): boolean;
404
+ /**
405
+ * Toggle show all entities vs common entities
406
+ */
407
+ toggleShowAllEntities(): void;
408
+ /**
409
+ * Handle clicking on a recent record from home screen.
410
+ * Navigates to the entity and sets up pending selection to select the record
411
+ * and open the detail panel once data loads.
412
+ */
413
+ onRecentRecordClick(record: RecentRecordAccess): void;
414
+ /**
415
+ * Handle clicking on a favorite record from home screen.
416
+ * Navigates to the entity and sets up pending selection to select the record
417
+ * and open the detail panel once data loads.
418
+ */
419
+ onFavoriteRecordClick(record: FavoriteRecord): void;
420
+ /**
421
+ * Get the icon for an entity by ID (for recent records)
422
+ */
423
+ getEntityIconById(entityId: string): string;
424
+ /**
425
+ * Format relative time for display (e.g., "2 hours ago")
426
+ */
427
+ formatRelativeTime(date: Date): string;
428
+ /**
429
+ * Check if we're at the home level (no entity selected)
430
+ */
431
+ get isAtHomeLevel(): boolean;
432
+ static ɵfac: i0.ɵɵFactoryDeclaration<DataExplorerDashboardComponent, never>;
433
+ static ɵcmp: i0.ɵɵComponentDeclaration<DataExplorerDashboardComponent, "mj-data-explorer-dashboard", never, { "entityFilter": { "alias": "entityFilter"; "required": false; }; "deepLink": { "alias": "deepLink"; "required": false; }; "contextName": { "alias": "contextName"; "required": false; }; "contextIcon": { "alias": "contextIcon"; "required": false; }; }, {}, never, never, false, never>;
434
+ }
435
+ /**
436
+ * Tree-shaking prevention
437
+ */
438
+ export declare function LoadDataExplorerDashboard(): void;
439
+ //# sourceMappingURL=data-explorer-dashboard.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-explorer-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/DataExplorer/data-explorer-dashboard.component.ts"],"names":[],"mappings":"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"}