@memberjunction/ng-dashboards 5.35.0 → 5.37.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.
- package/dist/AI/components/agents/agent-configuration.component.js +3 -3
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +22 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +157 -137
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +28 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2075 -2068
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +4 -4
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +3 -3
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +15 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +1411 -1424
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts +12 -8
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +329 -371
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +137 -142
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +111 -116
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +13 -65
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +13 -65
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +13 -65
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +13 -65
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/Admin/base-admin-container.component.d.ts +9 -7
- package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
- package/dist/Admin/base-admin-container.component.js +26 -17
- package/dist/Admin/base-admin-container.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +74 -67
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-new-message-resource.component.d.ts +93 -0
- package/dist/Communication/communication-new-message-resource.component.d.ts.map +1 -0
- package/dist/Communication/communication-new-message-resource.component.js +661 -0
- package/dist/Communication/communication-new-message-resource.component.js.map +1 -0
- package/dist/Credentials/components/credentials-categories-resource.component.js +152 -159
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +151 -155
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +20 -21
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts +2 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +131 -125
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +7 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.d.ts +5 -0
- package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +46 -72
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.js +88 -100
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.js +158 -168
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +257 -264
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.d.ts +5 -0
- package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +46 -64
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/DevTools/lazy-module-status.component.js +75 -84
- package/dist/DevTools/lazy-module-status.component.js.map +1 -1
- package/dist/DevTools/settings-explorer.component.js +76 -85
- package/dist/DevTools/settings-explorer.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +2 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +7 -3
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +97 -99
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +842 -855
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +502 -517
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +78 -89
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +5 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1120 -1128
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +11 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +606 -661
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +102 -0
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +1179 -504
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts +133 -3
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +1527 -327
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts +29 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts.map +1 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.js +77 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.js.map +1 -0
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts +6 -0
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js +35 -7
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
- package/dist/Lists/index.d.ts +1 -0
- package/dist/Lists/index.d.ts.map +1 -1
- package/dist/Lists/index.js +1 -0
- package/dist/Lists/index.js.map +1 -1
- package/dist/Lists/services/list-set-operations.service.d.ts +93 -2
- package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
- package/dist/Lists/services/list-set-operations.service.js +236 -10
- package/dist/Lists/services/list-set-operations.service.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +19 -19
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +58 -60
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +13 -3
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +1007 -1252
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +31 -6
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +543 -629
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +50 -49
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +1 -1
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +16 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +9 -7
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +13 -4
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +16 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +10 -9
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +13 -2
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +1 -1
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +13 -1
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +53 -52
|
@@ -56,6 +56,10 @@ let EntityAdminDashboardComponent = class EntityAdminDashboardComponent extends
|
|
|
56
56
|
filterPanelVisible = true;
|
|
57
57
|
selectedEntity = null;
|
|
58
58
|
filteredEntities = [];
|
|
59
|
+
/** Total unfiltered entity count — feeds the chrome's X-of-Y badge. */
|
|
60
|
+
get TotalEntityCount() {
|
|
61
|
+
return this.erdComposite?.entities?.length ?? 0;
|
|
62
|
+
}
|
|
59
63
|
// State management
|
|
60
64
|
userStateChangeSubject = new Subject();
|
|
61
65
|
hasLoadedUserState = false;
|
|
@@ -186,7 +190,7 @@ let EntityAdminDashboardComponent = class EntityAdminDashboardComponent extends
|
|
|
186
190
|
} if (rf & 2) {
|
|
187
191
|
let _t;
|
|
188
192
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.erdComposite = _t.first);
|
|
189
|
-
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 12, vars:
|
|
193
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 12, vars: 8, consts: [["erdComposite", ""], ["Title", "Entity Admin", "Icon", "fa-solid fa-database", "Subtitle", "Browse and configure entity definitions"], ["meta", ""], ["Label", "entities", 3, "Count", "Total"], ["actions", ""], ["mjButton", "", "size", "sm", "title", "Toggle Filters", 3, "click", "variant"], [1, "fa-solid", "fa-filter"], [3, "Flex", "Padding"], [1, "loading-container"], [1, "error-container"], [1, "dashboard-content"], ["size", "large", 3, "text"], [1, "error-message"], [3, "stateChange", "userStateChange", "entityOpened", "openRecord", "isRefreshingERD"]], template: function EntityAdminDashboardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
190
194
|
i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 1)(2, "div", 2);
|
|
191
195
|
i0.ɵɵelement(3, "mj-stat-badge", 3);
|
|
192
196
|
i0.ɵɵelementEnd();
|
|
@@ -202,7 +206,7 @@ let EntityAdminDashboardComponent = class EntityAdminDashboardComponent extends
|
|
|
202
206
|
i0.ɵɵelementEnd()();
|
|
203
207
|
} if (rf & 2) {
|
|
204
208
|
i0.ɵɵadvance(3);
|
|
205
|
-
i0.ɵɵproperty("Count", ctx.filteredEntities.length);
|
|
209
|
+
i0.ɵɵproperty("Count", ctx.filteredEntities.length)("Total", ctx.TotalEntityCount);
|
|
206
210
|
i0.ɵɵadvance(2);
|
|
207
211
|
i0.ɵɵproperty("variant", ctx.filterPanelVisible ? "primary" : "secondary");
|
|
208
212
|
i0.ɵɵadvance(3);
|
|
@@ -221,7 +225,7 @@ EntityAdminDashboardComponent = __decorate([
|
|
|
221
225
|
export { EntityAdminDashboardComponent };
|
|
222
226
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(EntityAdminDashboardComponent, [{
|
|
223
227
|
type: Component,
|
|
224
|
-
args: [{ standalone: false, selector: 'mj-entity-admin-dashboard', template: "<mj-page-layout>\n <mj-page-header\n Title=\"Entity Admin\"\n Icon=\"fa-solid fa-database\"\n Subtitle=\"Browse and configure entity definitions\">\n <div meta>\n <mj-stat-badge
|
|
228
|
+
args: [{ standalone: false, selector: 'mj-entity-admin-dashboard', template: "<mj-page-layout>\n <mj-page-header\n Title=\"Entity Admin\"\n Icon=\"fa-solid fa-database\"\n Subtitle=\"Browse and configure entity definitions\">\n <!-- X-of-Y filtered count earns its meta spot per chrome conventions \u00A72. -->\n <div meta>\n <mj-stat-badge\n [Count]=\"filteredEntities.length\"\n [Total]=\"TotalEntityCount\"\n Label=\"entities\">\n </mj-stat-badge>\n </div>\n <div actions>\n <button\n mjButton\n [variant]=\"filterPanelVisible ? 'primary' : 'secondary'\"\n size=\"sm\"\n (click)=\"toggleFilterPanel()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i> Filters\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\">\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading [text]=\"loadingMessage\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (error) {\n <div class=\"error-container\">\n <p class=\"error-message\">{{ error }}</p>\n </div>\n }\n\n @if (!isLoading && !error) {\n <div class=\"dashboard-content\">\n <mj-erd-composite\n #erdComposite\n [isRefreshingERD]=\"isRefreshingERD\"\n (stateChange)=\"onStateChange($event)\"\n (userStateChange)=\"onUserStateChange($event)\"\n (entityOpened)=\"onEntityOpened($event)\"\n (openRecord)=\"onOpenRecord($event)\"\n >\n </mj-erd-composite>\n </div>\n }\n </mj-page-body>\n</mj-page-layout>", styles: ["/**\n * Entity Admin Dashboard Component - MJ Design Token Styled\n * Reference implementation for MJ design token usage\n */\n\n/* Loading and Error Containers */\n.loading-container,\n.error-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n flex: 1;\n border-radius: var(--mj-radius-lg);\n}\n\n.loading-container p,\n.error-container p {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-normal);\n color: var(--mj-text-secondary);\n}\n\n/* Error Message */\n.error-message {\n color: var(--mj-status-error-text);\n font-weight: var(--mj-font-medium);\n}\n\n/* Dashboard Content */\n.dashboard-content {\n overflow: hidden;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n/* Loading Spinner */\n.loading-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--mj-space-4);\n}\n\n.loading-spinner {\n position: relative;\n width: 60px;\n height: 60px;\n}\n\n.spinner-ring {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-radius: 50%;\n animation: spin 1.5s linear infinite;\n}\n\n.spinner-ring:nth-child(1) {\n border-top-color: var(--mj-brand-primary);\n animation-delay: 0s;\n}\n\n.spinner-ring:nth-child(2) {\n border-top-color: var(--mj-brand-tertiary);\n animation-delay: 0.3s;\n transform: scale(0.8);\n}\n\n.spinner-ring:nth-child(3) {\n border-top-color: var(--mj-brand-accent);\n animation-delay: 0.6s;\n transform: scale(0.6);\n}\n\n.loading-text {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-secondary);\n text-align: center;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n"] }]
|
|
225
229
|
}], null, { erdComposite: [{
|
|
226
230
|
type: ViewChild,
|
|
227
231
|
args: ['erdComposite', { static: false }]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-admin-dashboard.component.js","sourceRoot":"","sources":["../../src/EntityAdmin/entity-admin-dashboard.component.ts","../../src/EntityAdmin/entity-admin-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewChild, AfterViewInit, OnDestroy } from '@angular/core';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { EntityInfo, CompositeKey, Metadata } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\nimport { ERDCompositeComponent, ERDCompositeState } from '@memberjunction/ng-entity-relationship-diagram';\nimport { ResourceData, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\n\n/** Settings key for ERD state persistence */\nconst ERD_SETTINGS_KEY = 'MJ.Admin.Entity.ERD';\n\n@Component({\n standalone: false,\n selector: 'mj-entity-admin-dashboard',\n templateUrl: './entity-admin-dashboard.component.html',\n styleUrls: ['./entity-admin-dashboard.component.css']\n})\n@RegisterClass(BaseDashboard, 'EntityAdmin')\nexport class EntityAdminDashboardComponent extends BaseDashboard implements AfterViewInit, OnDestroy {\n @ViewChild('erdComposite', { static: false }) erdComposite!: ERDCompositeComponent;\n\n public isLoading = false;\n public isRefreshingERD = false;\n public loadingMessage = '';\n public error: string | null = null;\n\n // Filter panel visibility for header controls\n public filterPanelVisible = true;\n public selectedEntity: EntityInfo | null = null;\n public filteredEntities: EntityInfo[] = [];\n\n // State management\n private userStateChangeSubject = new Subject<ERDCompositeState>();\n private hasLoadedUserState = false;\n private metadata = this.ProviderToUse;\n private userSettingEntity: MJUserSettingEntity | null = null;\n\n ngAfterViewInit(): void {\n // Setup debounced state persistence to MJ: User Settings\n this.userStateChangeSubject.pipe(\n debounceTime(1000)\n ).subscribe(state => {\n this.saveStateToUserSettings(state);\n });\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return \"Entity Administration\"\n }\n\n override ngOnDestroy(): void {\n this.userStateChangeSubject.complete();\n super.ngOnDestroy();\n }\n\n protected initDashboard(): void {\n // Initialize dashboard - called by BaseDashboard\n }\n\n protected loadData(): void {\n // Data loading is handled by ERDCompositeComponent\n }\n\n public toggleFilterPanel(): void {\n this.filterPanelVisible = !this.filterPanelVisible;\n if (this.erdComposite) {\n this.erdComposite.onToggleFilterPanel();\n }\n }\n\n public onStateChange(state: ERDCompositeState): void {\n // Update local state to keep header controls in sync\n this.filterPanelVisible = state.filterPanelVisible;\n this.filteredEntities = this.erdComposite?.filteredEntities || [];\n\n if (state.selectedEntityId && this.erdComposite) {\n this.selectedEntity = this.erdComposite.entities.find(e => UUIDsEqual(e.ID, state.selectedEntityId)) || null;\n } else {\n this.selectedEntity = null;\n }\n\n // Load user state when data becomes available for the first time\n if (this.erdComposite?.isDataLoaded && !this.hasLoadedUserState) {\n this.hasLoadedUserState = true;\n this.loadStateFromUserSettings();\n }\n }\n\n public onUserStateChange(state: ERDCompositeState): void {\n // Queue state for debounced persistence\n this.userStateChangeSubject.next(state);\n }\n\n public onEntityOpened(entity: EntityInfo): void {\n this.openEntity(entity);\n }\n\n public onOpenRecord(event: {EntityName: string, RecordID: string}): void {\n this.OpenEntityRecord.emit({\n EntityName: event.EntityName,\n RecordPKey: new CompositeKey([{FieldName: 'ID', Value: event.RecordID}])\n });\n }\n\n public openEntity(entity: EntityInfo): void {\n this.Interaction.emit({\n type: 'openEntity',\n entity: entity,\n data: { entityId: entity.ID, entityName: entity.Name }\n });\n }\n\n /**\n * Load ERD state from MJ: User Settings entity using UserInfoEngine for cached access\n */\n private async loadStateFromUserSettings(): Promise<void> {\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) {\n this.NotifyLoadComplete();\n return;\n }\n\n const engine = UserInfoEngine.Instance;\n\n // Find setting from cached user settings\n const setting = engine.UserSettings.find(s => s.Setting === ERD_SETTINGS_KEY);\n\n if (setting) {\n this.userSettingEntity = setting;\n if (this.userSettingEntity.Value) {\n const savedState = JSON.parse(this.userSettingEntity.Value) as Partial<ERDCompositeState>;\n if (this.erdComposite) {\n this.erdComposite.loadUserState(savedState);\n }\n }\n }\n\n this.NotifyLoadComplete();\n } catch (error) {\n console.warn('Failed to load ERD state from User Settings:', error);\n this.NotifyLoadComplete();\n }\n }\n\n /**\n * Save ERD state to MJ: User Settings entity using UserInfoEngine for cached lookup\n */\n private async saveStateToUserSettings(state: ERDCompositeState): Promise<void> {\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) return;\n\n // Find existing setting from cached user settings if not already loaded\n if (!this.userSettingEntity) {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === ERD_SETTINGS_KEY);\n\n if (setting) {\n this.userSettingEntity = setting;\n } else {\n this.userSettingEntity = await this.metadata.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n this.userSettingEntity.UserID = userId;\n this.userSettingEntity.Setting = ERD_SETTINGS_KEY;\n }\n }\n\n // Save the state as JSON\n this.userSettingEntity.Value = JSON.stringify(state);\n await this.userSettingEntity.Save();\n } catch (error) {\n console.warn('Failed to save ERD state to User Settings:', error);\n }\n }\n}\n","<mj-page-layout>\n <mj-page-header\n Title=\"Entity Admin\"\n Icon=\"fa-solid fa-database\"\n Subtitle=\"Browse and configure entity definitions\">\n <div meta>\n <mj-stat-badge [Count]=\"filteredEntities.length\" Label=\"visible entities\"></mj-stat-badge>\n </div>\n <div actions>\n <button\n mjButton\n [variant]=\"filterPanelVisible ? 'primary' : 'secondary'\"\n size=\"sm\"\n (click)=\"toggleFilterPanel()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i> Filters\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\">\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading [text]=\"loadingMessage\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (error) {\n <div class=\"error-container\">\n <p class=\"error-message\">{{ error }}</p>\n </div>\n }\n\n @if (!isLoading && !error) {\n <div class=\"dashboard-content\">\n <mj-erd-composite\n #erdComposite\n [isRefreshingERD]=\"isRefreshingERD\"\n (stateChange)=\"onStateChange($event)\"\n (userStateChange)=\"onUserStateChange($event)\"\n (entityOpened)=\"onEntityOpened($event)\"\n (openRecord)=\"onOpenRecord($event)\"\n >\n </mj-erd-composite>\n </div>\n }\n </mj-page-body>\n</mj-page-layout>"]}
|
|
1
|
+
{"version":3,"file":"entity-admin-dashboard.component.js","sourceRoot":"","sources":["../../src/EntityAdmin/entity-admin-dashboard.component.ts","../../src/EntityAdmin/entity-admin-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewChild, AfterViewInit, OnDestroy } from '@angular/core';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { EntityInfo, CompositeKey, Metadata } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\nimport { ERDCompositeComponent, ERDCompositeState } from '@memberjunction/ng-entity-relationship-diagram';\nimport { ResourceData, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\n\n/** Settings key for ERD state persistence */\nconst ERD_SETTINGS_KEY = 'MJ.Admin.Entity.ERD';\n\n@Component({\n standalone: false,\n selector: 'mj-entity-admin-dashboard',\n templateUrl: './entity-admin-dashboard.component.html',\n styleUrls: ['./entity-admin-dashboard.component.css']\n})\n@RegisterClass(BaseDashboard, 'EntityAdmin')\nexport class EntityAdminDashboardComponent extends BaseDashboard implements AfterViewInit, OnDestroy {\n @ViewChild('erdComposite', { static: false }) erdComposite!: ERDCompositeComponent;\n\n public isLoading = false;\n public isRefreshingERD = false;\n public loadingMessage = '';\n public error: string | null = null;\n\n // Filter panel visibility for header controls\n public filterPanelVisible = true;\n public selectedEntity: EntityInfo | null = null;\n public filteredEntities: EntityInfo[] = [];\n\n /** Total unfiltered entity count — feeds the chrome's X-of-Y badge. */\n public get TotalEntityCount(): number {\n return this.erdComposite?.entities?.length ?? 0;\n }\n\n // State management\n private userStateChangeSubject = new Subject<ERDCompositeState>();\n private hasLoadedUserState = false;\n private metadata = this.ProviderToUse;\n private userSettingEntity: MJUserSettingEntity | null = null;\n\n ngAfterViewInit(): void {\n // Setup debounced state persistence to MJ: User Settings\n this.userStateChangeSubject.pipe(\n debounceTime(1000)\n ).subscribe(state => {\n this.saveStateToUserSettings(state);\n });\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return \"Entity Administration\"\n }\n\n override ngOnDestroy(): void {\n this.userStateChangeSubject.complete();\n super.ngOnDestroy();\n }\n\n protected initDashboard(): void {\n // Initialize dashboard - called by BaseDashboard\n }\n\n protected loadData(): void {\n // Data loading is handled by ERDCompositeComponent\n }\n\n public toggleFilterPanel(): void {\n this.filterPanelVisible = !this.filterPanelVisible;\n if (this.erdComposite) {\n this.erdComposite.onToggleFilterPanel();\n }\n }\n\n public onStateChange(state: ERDCompositeState): void {\n // Update local state to keep header controls in sync\n this.filterPanelVisible = state.filterPanelVisible;\n this.filteredEntities = this.erdComposite?.filteredEntities || [];\n\n if (state.selectedEntityId && this.erdComposite) {\n this.selectedEntity = this.erdComposite.entities.find(e => UUIDsEqual(e.ID, state.selectedEntityId)) || null;\n } else {\n this.selectedEntity = null;\n }\n\n // Load user state when data becomes available for the first time\n if (this.erdComposite?.isDataLoaded && !this.hasLoadedUserState) {\n this.hasLoadedUserState = true;\n this.loadStateFromUserSettings();\n }\n }\n\n public onUserStateChange(state: ERDCompositeState): void {\n // Queue state for debounced persistence\n this.userStateChangeSubject.next(state);\n }\n\n public onEntityOpened(entity: EntityInfo): void {\n this.openEntity(entity);\n }\n\n public onOpenRecord(event: {EntityName: string, RecordID: string}): void {\n this.OpenEntityRecord.emit({\n EntityName: event.EntityName,\n RecordPKey: new CompositeKey([{FieldName: 'ID', Value: event.RecordID}])\n });\n }\n\n public openEntity(entity: EntityInfo): void {\n this.Interaction.emit({\n type: 'openEntity',\n entity: entity,\n data: { entityId: entity.ID, entityName: entity.Name }\n });\n }\n\n /**\n * Load ERD state from MJ: User Settings entity using UserInfoEngine for cached access\n */\n private async loadStateFromUserSettings(): Promise<void> {\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) {\n this.NotifyLoadComplete();\n return;\n }\n\n const engine = UserInfoEngine.Instance;\n\n // Find setting from cached user settings\n const setting = engine.UserSettings.find(s => s.Setting === ERD_SETTINGS_KEY);\n\n if (setting) {\n this.userSettingEntity = setting;\n if (this.userSettingEntity.Value) {\n const savedState = JSON.parse(this.userSettingEntity.Value) as Partial<ERDCompositeState>;\n if (this.erdComposite) {\n this.erdComposite.loadUserState(savedState);\n }\n }\n }\n\n this.NotifyLoadComplete();\n } catch (error) {\n console.warn('Failed to load ERD state from User Settings:', error);\n this.NotifyLoadComplete();\n }\n }\n\n /**\n * Save ERD state to MJ: User Settings entity using UserInfoEngine for cached lookup\n */\n private async saveStateToUserSettings(state: ERDCompositeState): Promise<void> {\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) return;\n\n // Find existing setting from cached user settings if not already loaded\n if (!this.userSettingEntity) {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === ERD_SETTINGS_KEY);\n\n if (setting) {\n this.userSettingEntity = setting;\n } else {\n this.userSettingEntity = await this.metadata.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n this.userSettingEntity.UserID = userId;\n this.userSettingEntity.Setting = ERD_SETTINGS_KEY;\n }\n }\n\n // Save the state as JSON\n this.userSettingEntity.Value = JSON.stringify(state);\n await this.userSettingEntity.Save();\n } catch (error) {\n console.warn('Failed to save ERD state to User Settings:', error);\n }\n }\n}\n","<mj-page-layout>\n <mj-page-header\n Title=\"Entity Admin\"\n Icon=\"fa-solid fa-database\"\n Subtitle=\"Browse and configure entity definitions\">\n <!-- X-of-Y filtered count earns its meta spot per chrome conventions §2. -->\n <div meta>\n <mj-stat-badge\n [Count]=\"filteredEntities.length\"\n [Total]=\"TotalEntityCount\"\n Label=\"entities\">\n </mj-stat-badge>\n </div>\n <div actions>\n <button\n mjButton\n [variant]=\"filterPanelVisible ? 'primary' : 'secondary'\"\n size=\"sm\"\n (click)=\"toggleFilterPanel()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i> Filters\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\">\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading [text]=\"loadingMessage\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (error) {\n <div class=\"error-container\">\n <p class=\"error-message\">{{ error }}</p>\n </div>\n }\n\n @if (!isLoading && !error) {\n <div class=\"dashboard-content\">\n <mj-erd-composite\n #erdComposite\n [isRefreshingERD]=\"isRefreshingERD\"\n (stateChange)=\"onStateChange($event)\"\n (userStateChange)=\"onUserStateChange($event)\"\n (entityOpened)=\"onEntityOpened($event)\"\n (openRecord)=\"onOpenRecord($event)\"\n >\n </mj-erd-composite>\n </div>\n }\n </mj-page-body>\n</mj-page-layout>"]}
|