@memberjunction/ng-explorer-core 5.35.0 → 5.36.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.
@@ -15,5 +15,5 @@
15
15
  * Covers all @RegisterClass decorated classes in lazy-loaded packages.
16
16
  */
17
17
  export declare const LAZY_FEATURE_CONFIG: Record<string, () => Promise<void>>;
18
- export declare const LAZY_FEATURE_CONFIG_COUNT = 96;
18
+ export declare const LAZY_FEATURE_CONFIG_COUNT = 98;
19
19
  //# sourceMappingURL=lazy-feature-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lazy-feature-config.d.ts","sourceRoot":"","sources":["../../src/generated/lazy-feature-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAuDH;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAiInE,CAAC;AAEF,eAAO,MAAM,yBAAyB,KAAK,CAAC"}
1
+ {"version":3,"file":"lazy-feature-config.d.ts","sourceRoot":"","sources":["../../src/generated/lazy-feature-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAuDH;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAmInE,CAAC;AAEF,eAAO,MAAM,yBAAyB,KAAK,CAAC"}
@@ -18,7 +18,7 @@ function featureLoader(importFn) {
18
18
  const loadActionsDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/actions-dashboards.module'));
19
19
  // --- @memberjunction/ng-dashboards → ./ai-dashboards.module (15 entries) ---
20
20
  const loadAiDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/ai-dashboards.module'));
21
- // --- @memberjunction/ng-dashboards → ./communication-dashboards.module (6 entries) ---
21
+ // --- @memberjunction/ng-dashboards → ./communication-dashboards.module (7 entries) ---
22
22
  const loadCommunicationDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/communication-dashboards.module'));
23
23
  // --- @memberjunction/ng-dashboards → ./component-studio-dashboards.module (1 entries) ---
24
24
  const loadComponentStudioDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/component-studio-dashboards.module'));
@@ -30,7 +30,7 @@ const loadCredentialsDashboardsModule = featureLoader(() => import('@memberjunct
30
30
  const loadDataExplorerDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/data-explorer-dashboards.module'));
31
31
  // --- @memberjunction/ng-dashboards → ./integration.module (6 entries) ---
32
32
  const loadIntegrationModule = featureLoader(() => import('@memberjunction/ng-dashboards/integration.module'));
33
- // --- @memberjunction/ng-dashboards → ./lists-dashboards.module (4 entries) ---
33
+ // --- @memberjunction/ng-dashboards → ./lists-dashboards.module (5 entries) ---
34
34
  const loadListsDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/lists-dashboards.module'));
35
35
  // --- @memberjunction/ng-dashboards → ./mcp.module (2 entries) ---
36
36
  const loadMcpModule = featureLoader(() => import('@memberjunction/ng-dashboards/mcp.module'));
@@ -81,6 +81,7 @@ export const LAZY_FEATURE_CONFIG = {
81
81
  'BaseResourceComponent::CommunicationMonitorResource': loadCommunicationDashboardsModule,
82
82
  'BaseResourceComponent::CommunicationProvidersResource': loadCommunicationDashboardsModule,
83
83
  'BaseResourceComponent::CommunicationRunsResource': loadCommunicationDashboardsModule,
84
+ 'BaseResourceComponent::CommunicationsNewMessageResource': loadCommunicationDashboardsModule,
84
85
  'BaseResourceComponent::CommunicationTemplatesResource': loadCommunicationDashboardsModule,
85
86
  // @memberjunction/ng-dashboards → ./component-studio-dashboards.module
86
87
  'BaseDashboard::ComponentStudioDashboard': loadComponentStudioDashboardsModule,
@@ -133,6 +134,7 @@ export const LAZY_FEATURE_CONFIG = {
133
134
  'BaseResourceComponent::ListsCategoriesResource': loadListsDashboardsModule,
134
135
  'BaseResourceComponent::ListsMyListsResource': loadListsDashboardsModule,
135
136
  'BaseResourceComponent::ListsOperationsResource': loadListsDashboardsModule,
137
+ 'BaseResourceComponent::ListsSharedWithMeResource': loadListsDashboardsModule,
136
138
  // @memberjunction/ng-dashboards → ./mcp.module
137
139
  'BaseDashboard::MCPDashboard': loadMcpModule,
138
140
  'BaseResourceComponent::MCPResource': loadMcpModule,
@@ -164,5 +166,5 @@ export const LAZY_FEATURE_CONFIG = {
164
166
  // @memberjunction/ng-react → .
165
167
  'RuntimeUtilities::RuntimeUtilities': loadNgReact,
166
168
  };
167
- export const LAZY_FEATURE_CONFIG_COUNT = 96;
169
+ export const LAZY_FEATURE_CONFIG_COUNT = 98;
168
170
  //# sourceMappingURL=lazy-feature-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lazy-feature-config.js","sourceRoot":"","sources":["../../src/generated/lazy-feature-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,qEAAqE;AACrE,SAAS,aAAa,CAAC,QAAgC;IACrD,OAAO,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,kFAAkF;AAClF,MAAM,2BAA2B,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,yDAAyD,CAAC,CAAC,CAAC;AAE3H,8EAA8E;AAC9E,MAAM,sBAAsB,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,oDAAoD,CAAC,CAAC,CAAC;AAEjH,wFAAwF;AACxF,MAAM,iCAAiC,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,+DAA+D,CAAC,CAAC,CAAC;AAEvI,2FAA2F;AAC3F,MAAM,mCAAmC,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,kEAAkE,CAAC,CAAC,CAAC;AAE5I,gFAAgF;AAChF,MAAM,wBAAwB,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,sDAAsD,CAAC,CAAC,CAAC;AAErH,sFAAsF;AACtF,MAAM,+BAA+B,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,6DAA6D,CAAC,CAAC,CAAC;AAEnI,wFAAwF;AACxF,MAAM,gCAAgC,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,+DAA+D,CAAC,CAAC,CAAC;AAEtI,2EAA2E;AAC3E,MAAM,qBAAqB,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,kDAAkD,CAAC,CAAC,CAAC;AAE9G,gFAAgF;AAChF,MAAM,yBAAyB,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,uDAAuD,CAAC,CAAC,CAAC;AAEvH,mEAAmE;AACnE,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC;AAE9F,+DAA+D;AAC/D,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC,CAAC;AAEvF,qFAAqF;AACrF,MAAM,8BAA8B,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,4DAA4D,CAAC,CAAC,CAAC;AAEjI,kFAAkF;AAClF,MAAM,2BAA2B,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,yDAAyD,CAAC,CAAC,CAAC;AAE3H,+EAA+E;AAC/E,MAAM,kBAAkB,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,sDAAsD,CAAC,CAAC,CAAC;AAE/G,8EAA8E;AAC9E,MAAM,qBAAqB,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC,CAAC;AAEjH,mDAAmD;AACnD,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC;AAE5E;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAwC;IACtE,8DAA8D;IAC9D,+CAA+C,EAAE,2BAA2B;IAC5E,4CAA4C,EAAE,2BAA2B;IACzE,gDAAgD,EAAE,2BAA2B;IAC7E,+CAA+C,EAAE,2BAA2B;IAC5E,gDAAgD,EAAE,2BAA2B;IAC7E,gDAAgD,EAAE,2BAA2B;IAC7E,gDAAgD,EAAE,2BAA2B;IAE7E,yDAAyD;IACzD,gDAAgD,EAAE,sBAAsB;IACxE,yCAAyC,EAAE,sBAAsB;IACjE,4CAA4C,EAAE,sBAAsB;IACpE,yCAAyC,EAAE,sBAAsB;IACjE,yCAAyC,EAAE,sBAAsB;IACjE,0CAA0C,EAAE,sBAAsB;IAClE,0CAA0C,EAAE,sBAAsB;IAClE,0CAA0C,EAAE,sBAAsB;IAClE,oDAAoD,EAAE,sBAAsB;IAC5E,qDAAqD,EAAE,sBAAsB;IAC7E,mDAAmD,EAAE,sBAAsB;IAC3E,gDAAgD,EAAE,sBAAsB;IACxE,2CAA2C,EAAE,sBAAsB;IACnE,6BAA6B,EAAE,sBAAsB;IACrD,iDAAiD,EAAE,sBAAsB;IAEzE,oEAAoE;IACpE,uCAAuC,EAAE,iCAAiC;IAC1E,kDAAkD,EAAE,iCAAiC;IACrF,qDAAqD,EAAE,iCAAiC;IACxF,uDAAuD,EAAE,iCAAiC;IAC1F,kDAAkD,EAAE,iCAAiC;IACrF,uDAAuD,EAAE,iCAAiC;IAE1F,uEAAuE;IACvE,yCAAyC,EAAE,mCAAmC;IAE9E,2DAA2D;IAC3D,kCAAkC,EAAE,wBAAwB;IAC5D,4BAA4B,EAAE,wBAAwB;IACtD,wCAAwC,EAAE,wBAAwB;IAClE,4CAA4C,EAAE,wBAAwB;IACtE,4CAA4C,EAAE,wBAAwB;IACtE,wCAAwC,EAAE,wBAAwB;IAClE,wCAAwC,EAAE,wBAAwB;IAClE,iDAAiD,EAAE,wBAAwB;IAC3E,0CAA0C,EAAE,wBAAwB;IACpE,+CAA+C,EAAE,wBAAwB;IACzE,iDAAiD,EAAE,wBAAwB;IAC3E,8CAA8C,EAAE,wBAAwB;IACxE,gDAAgD,EAAE,wBAAwB;IAC1E,sCAAsC,EAAE,wBAAwB;IAChE,wCAAwC,EAAE,wBAAwB;IAClE,kDAAkD,EAAE,wBAAwB;IAC5E,oDAAoD,EAAE,wBAAwB;IAC9E,0DAA0D,EAAE,wBAAwB;IACpF,sDAAsD,EAAE,wBAAwB;IAChF,6CAA6C,EAAE,wBAAwB;IACvE,kDAAkD,EAAE,wBAAwB;IAC5E,kDAAkD,EAAE,wBAAwB;IAC5E,mDAAmD,EAAE,wBAAwB;IAC7E,oDAAoD,EAAE,wBAAwB;IAC9E,qDAAqD,EAAE,wBAAwB;IAC/E,sDAAsD,EAAE,wBAAwB;IAEhF,kEAAkE;IAClE,qCAAqC,EAAE,+BAA+B;IACtE,iDAAiD,EAAE,+BAA+B;IAClF,sDAAsD,EAAE,+BAA+B;IACvF,gDAAgD,EAAE,+BAA+B;IACjF,oDAAoD,EAAE,+BAA+B;IACrF,iDAAiD,EAAE,+BAA+B;IAElF,oEAAoE;IACpE,6BAA6B,EAAE,gCAAgC;IAC/D,6CAA6C,EAAE,gCAAgC;IAE/E,uDAAuD;IACvD,4CAA4C,EAAE,qBAAqB;IACnE,+CAA+C,EAAE,qBAAqB;IACtE,oDAAoD,EAAE,qBAAqB;IAC3E,4CAA4C,EAAE,qBAAqB;IACnE,6CAA6C,EAAE,qBAAqB;IACpE,6CAA6C,EAAE,qBAAqB;IAEpE,4DAA4D;IAC5D,4CAA4C,EAAE,yBAAyB;IACvE,gDAAgD,EAAE,yBAAyB;IAC3E,6CAA6C,EAAE,yBAAyB;IACxE,gDAAgD,EAAE,yBAAyB;IAE3E,+CAA+C;IAC/C,6BAA6B,EAAE,aAAa;IAC5C,oCAAoC,EAAE,aAAa;IAEnD,2CAA2C;IAC3C,8CAA8C,EAAE,UAAU;IAC1D,4CAA4C,EAAE,UAAU;IACxD,kDAAkD,EAAE,UAAU;IAE9D,iEAAiE;IACjE,oCAAoC,EAAE,8BAA8B;IACpE,mDAAmD,EAAE,8BAA8B;IACnF,oDAAoD,EAAE,8BAA8B;IACpF,+CAA+C,EAAE,8BAA8B;IAE/E,8DAA8D;IAC9D,iCAAiC,EAAE,2BAA2B;IAC9D,iDAAiD,EAAE,2BAA2B;IAC9E,oDAAoD,EAAE,2BAA2B;IACjF,gDAAgD,EAAE,2BAA2B;IAC7E,8CAA8C,EAAE,2BAA2B;IAC3E,4CAA4C,EAAE,2BAA2B;IAEzE,2DAA2D;IAC3D,sCAAsC,EAAE,kBAAkB;IAC1D,kCAAkC,EAAE,kBAAkB;IACtD,+BAA+B,EAAE,kBAAkB;IACnD,2BAA2B,EAAE,kBAAkB;IAC/C,+BAA+B,EAAE,kBAAkB;IACnD,mCAAmC,EAAE,kBAAkB;IAEvD,0DAA0D;IAC1D,4CAA4C,EAAE,qBAAqB;IAEnE,+BAA+B;IAC/B,oCAAoC,EAAE,WAAW;CAElD,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC","sourcesContent":["/**\n * AUTO-GENERATED FILE — DO NOT EDIT\n * Generated by: mj codegen manifest --lazy-config\n * Regenerate with: npm run mj:manifest:explorer\n *\n * Maps @RegisterClass entries to their lazy-loading chunks using compound keys.\n * Compound key format: \"BaseClassName::Key\" (e.g., \"BaseResourceComponent::HomeDashboard\").\n *\n * When ClassFactory.GetRegistrationAsync() or CreateInstanceAsync() cannot find a\n * registration synchronously, the registered lazy loader builds the compound key and\n * looks it up here to dynamically import the chunk containing the class.\n */\n\n/** Helper to create a loader that all entries in a feature share. */\nfunction featureLoader(importFn: () => Promise<unknown>): () => Promise<void> {\n return () => importFn().then(() => {});\n}\n\n// --- @memberjunction/ng-dashboards → ./actions-dashboards.module (7 entries) ---\nconst loadActionsDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/actions-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./ai-dashboards.module (15 entries) ---\nconst loadAiDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/ai-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./communication-dashboards.module (6 entries) ---\nconst loadCommunicationDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/communication-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./component-studio-dashboards.module (1 entries) ---\nconst loadComponentStudioDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/component-studio-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./core-dashboards.module (26 entries) ---\nconst loadCoreDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/core-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./credentials-dashboards.module (6 entries) ---\nconst loadCredentialsDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/credentials-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./data-explorer-dashboards.module (2 entries) ---\nconst loadDataExplorerDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/data-explorer-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./integration.module (6 entries) ---\nconst loadIntegrationModule = featureLoader(() => import('@memberjunction/ng-dashboards/integration.module'));\n\n// --- @memberjunction/ng-dashboards → ./lists-dashboards.module (4 entries) ---\nconst loadListsDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/lists-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./mcp.module (2 entries) ---\nconst loadMcpModule = featureLoader(() => import('@memberjunction/ng-dashboards/mcp.module'));\n\n// --- @memberjunction/ng-dashboards → ./module (3 entries) ---\nconst loadModule = featureLoader(() => import('@memberjunction/ng-dashboards/module'));\n\n// --- @memberjunction/ng-dashboards → ./scheduling-dashboards.module (4 entries) ---\nconst loadSchedulingDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/scheduling-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./testing-dashboards.module (6 entries) ---\nconst loadTestingDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/testing-dashboards.module'));\n\n// --- @memberjunction/ng-explorer-settings → ./settings.module (6 entries) ---\nconst loadSettingsModule = featureLoader(() => import('@memberjunction/ng-explorer-settings/settings.module'));\n\n// --- @memberjunction/ng-file-storage → ./file-storage.module (1 entries) ---\nconst loadFileStorageModule = featureLoader(() => import('@memberjunction/ng-file-storage/file-storage.module'));\n\n// --- @memberjunction/ng-react → . (1 entries) ---\nconst loadNgReact = featureLoader(() => import('@memberjunction/ng-react'));\n\n/**\n * Complete mapping of compound keys (BaseClassName::Key) to lazy-loading functions.\n * Covers all @RegisterClass decorated classes in lazy-loaded packages.\n */\nexport const LAZY_FEATURE_CONFIG: Record<string, () => Promise<void>> = {\n // @memberjunction/ng-dashboards → ./actions-dashboards.module\n 'BaseResourceComponent::ActionExplorerResource': loadActionsDashboardsModule,\n 'BaseResourceComponent::ActionsCodeResource': loadActionsDashboardsModule,\n 'BaseResourceComponent::ActionsEntitiesResource': loadActionsDashboardsModule,\n 'BaseResourceComponent::ActionsMonitorResource': loadActionsDashboardsModule,\n 'BaseResourceComponent::ActionsOverviewResource': loadActionsDashboardsModule,\n 'BaseResourceComponent::ActionsScheduleResource': loadActionsDashboardsModule,\n 'BaseResourceComponent::ActionsSecurityResource': loadActionsDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./ai-dashboards.module\n 'BaseResourceComponent::AIAgentRequestsResource': loadAiDashboardsModule,\n 'BaseResourceComponent::AIAgentsResource': loadAiDashboardsModule,\n 'BaseResourceComponent::AIAnalyticsResource': loadAiDashboardsModule,\n 'BaseResourceComponent::AIConfigResource': loadAiDashboardsModule,\n 'BaseResourceComponent::AIModelsResource': loadAiDashboardsModule,\n 'BaseResourceComponent::AIMonitorResource': loadAiDashboardsModule,\n 'BaseResourceComponent::AIPromptsResource': loadAiDashboardsModule,\n 'BaseResourceComponent::AnalyticsResource': loadAiDashboardsModule,\n 'BaseResourceComponent::AutotaggingPipelineResource': loadAiDashboardsModule,\n 'BaseResourceComponent::ClusterVisualizationResource': loadAiDashboardsModule,\n 'BaseResourceComponent::DuplicateDetectionResource': loadAiDashboardsModule,\n 'BaseResourceComponent::KnowledgeConfigResource': loadAiDashboardsModule,\n 'BaseResourceComponent::SchedulingResource': loadAiDashboardsModule,\n 'BaseResourceComponent::Tags': loadAiDashboardsModule,\n 'BaseResourceComponent::VectorManagementResource': loadAiDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./communication-dashboards.module\n 'BaseDashboard::CommunicationDashboard': loadCommunicationDashboardsModule,\n 'BaseResourceComponent::CommunicationLogsResource': loadCommunicationDashboardsModule,\n 'BaseResourceComponent::CommunicationMonitorResource': loadCommunicationDashboardsModule,\n 'BaseResourceComponent::CommunicationProvidersResource': loadCommunicationDashboardsModule,\n 'BaseResourceComponent::CommunicationRunsResource': loadCommunicationDashboardsModule,\n 'BaseResourceComponent::CommunicationTemplatesResource': loadCommunicationDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./component-studio-dashboards.module\n 'BaseDashboard::ComponentStudioDashboard': loadComponentStudioDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./core-dashboards.module\n 'BaseApplication::HomeApplication': loadCoreDashboardsModule,\n 'BaseDashboard::EntityAdmin': loadCoreDashboardsModule,\n 'BaseResourceComponent::AdminDataSchema': loadCoreDashboardsModule,\n 'BaseResourceComponent::AdminDeveloperTools': loadCoreDashboardsModule,\n 'BaseResourceComponent::AdminIdentityAccess': loadCoreDashboardsModule,\n 'BaseResourceComponent::AdminMonitoring': loadCoreDashboardsModule,\n 'BaseResourceComponent::APIKeysResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::ApplicationRolesResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::AppStateInspector': loadCoreDashboardsModule,\n 'BaseResourceComponent::ClassRegistryInspector': loadCoreDashboardsModule,\n 'BaseResourceComponent::DashboardBrowserResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::EventMonitorInspector': loadCoreDashboardsModule,\n 'BaseResourceComponent::GraphQLConsoleInspector': loadCoreDashboardsModule,\n 'BaseResourceComponent::HomeDashboard': loadCoreDashboardsModule,\n 'BaseResourceComponent::LayoutInspector': loadCoreDashboardsModule,\n 'BaseResourceComponent::LazyModuleStatusInspector': loadCoreDashboardsModule,\n 'BaseResourceComponent::PermissionsAuditLogResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::PermissionsResourceAccessResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::PermissionsUserAccessResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::QueryBrowserResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::SettingsExplorerInspector': loadCoreDashboardsModule,\n 'BaseResourceComponent::SystemDiagnosticsResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::VersionHistoryDiffResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::VersionHistoryGraphResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::VersionHistoryLabelsResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::VersionHistoryRestoreResource': loadCoreDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./credentials-dashboards.module\n 'BaseDashboard::CredentialsDashboard': loadCredentialsDashboardsModule,\n 'BaseResourceComponent::CredentialsAuditResource': loadCredentialsDashboardsModule,\n 'BaseResourceComponent::CredentialsCategoriesResource': loadCredentialsDashboardsModule,\n 'BaseResourceComponent::CredentialsListResource': loadCredentialsDashboardsModule,\n 'BaseResourceComponent::CredentialsOverviewResource': loadCredentialsDashboardsModule,\n 'BaseResourceComponent::CredentialsTypesResource': loadCredentialsDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./data-explorer-dashboards.module\n 'BaseDashboard::DataExplorer': loadDataExplorerDashboardsModule,\n 'BaseResourceComponent::DataExplorerResource': loadDataExplorerDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./integration.module\n 'BaseResourceComponent::IntegrationActivity': loadIntegrationModule,\n 'BaseResourceComponent::IntegrationConnections': loadIntegrationModule,\n 'BaseResourceComponent::IntegrationMappingWorkspace': loadIntegrationModule,\n 'BaseResourceComponent::IntegrationOverview': loadIntegrationModule,\n 'BaseResourceComponent::IntegrationPipelines': loadIntegrationModule,\n 'BaseResourceComponent::IntegrationSchedules': loadIntegrationModule,\n\n // @memberjunction/ng-dashboards → ./lists-dashboards.module\n 'BaseResourceComponent::ListsBrowseResource': loadListsDashboardsModule,\n 'BaseResourceComponent::ListsCategoriesResource': loadListsDashboardsModule,\n 'BaseResourceComponent::ListsMyListsResource': loadListsDashboardsModule,\n 'BaseResourceComponent::ListsOperationsResource': loadListsDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./mcp.module\n 'BaseDashboard::MCPDashboard': loadMcpModule,\n 'BaseResourceComponent::MCPResource': loadMcpModule,\n\n // @memberjunction/ng-dashboards → ./module\n 'BaseResourceComponent::ArchiveConfigResource': loadModule,\n 'BaseResourceComponent::ArchiveRunsResource': loadModule,\n 'BaseResourceComponent::DatabaseDesignerDashboard': loadModule,\n\n // @memberjunction/ng-dashboards → ./scheduling-dashboards.module\n 'BaseDashboard::SchedulingDashboard': loadSchedulingDashboardsModule,\n 'BaseResourceComponent::SchedulingActivityResource': loadSchedulingDashboardsModule,\n 'BaseResourceComponent::SchedulingDashboardResource': loadSchedulingDashboardsModule,\n 'BaseResourceComponent::SchedulingJobsResource': loadSchedulingDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./testing-dashboards.module\n 'BaseDashboard::TestingDashboard': loadTestingDashboardsModule,\n 'BaseResourceComponent::TestingAnalyticsResource': loadTestingDashboardsModule,\n 'BaseResourceComponent::TestingDashboardTabResource': loadTestingDashboardsModule,\n 'BaseResourceComponent::TestingExplorerResource': loadTestingDashboardsModule,\n 'BaseResourceComponent::TestingReviewResource': loadTestingDashboardsModule,\n 'BaseResourceComponent::TestingRunsResource': loadTestingDashboardsModule,\n\n // @memberjunction/ng-explorer-settings → ./settings.module\n 'BaseDashboard::ApplicationManagement': loadSettingsModule,\n 'BaseDashboard::EntityPermissions': loadSettingsModule,\n 'BaseDashboard::RoleManagement': loadSettingsModule,\n 'BaseDashboard::SqlLogging': loadSettingsModule,\n 'BaseDashboard::UserManagement': loadSettingsModule,\n 'BaseNavigationComponent::Settings': loadSettingsModule,\n\n // @memberjunction/ng-file-storage → ./file-storage.module\n 'BaseResourceComponent::FileBrowserResource': loadFileStorageModule,\n\n // @memberjunction/ng-react → .\n 'RuntimeUtilities::RuntimeUtilities': loadNgReact,\n\n};\n\nexport const LAZY_FEATURE_CONFIG_COUNT = 96;\n"]}
1
+ {"version":3,"file":"lazy-feature-config.js","sourceRoot":"","sources":["../../src/generated/lazy-feature-config.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AUTO-GENERATED FILE — DO NOT EDIT\n * Generated by: mj codegen manifest --lazy-config\n * Regenerate with: npm run mj:manifest:explorer\n *\n * Maps @RegisterClass entries to their lazy-loading chunks using compound keys.\n * Compound key format: \"BaseClassName::Key\" (e.g., \"BaseResourceComponent::HomeDashboard\").\n *\n * When ClassFactory.GetRegistrationAsync() or CreateInstanceAsync() cannot find a\n * registration synchronously, the registered lazy loader builds the compound key and\n * looks it up here to dynamically import the chunk containing the class.\n */\n\n/** Helper to create a loader that all entries in a feature share. */\nfunction featureLoader(importFn: () => Promise<unknown>): () => Promise<void> {\n return () => importFn().then(() => {});\n}\n\n// --- @memberjunction/ng-dashboards → ./actions-dashboards.module (7 entries) ---\nconst loadActionsDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/actions-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./ai-dashboards.module (15 entries) ---\nconst loadAiDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/ai-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./communication-dashboards.module (7 entries) ---\nconst loadCommunicationDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/communication-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./component-studio-dashboards.module (1 entries) ---\nconst loadComponentStudioDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/component-studio-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./core-dashboards.module (26 entries) ---\nconst loadCoreDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/core-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./credentials-dashboards.module (6 entries) ---\nconst loadCredentialsDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/credentials-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./data-explorer-dashboards.module (2 entries) ---\nconst loadDataExplorerDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/data-explorer-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./integration.module (6 entries) ---\nconst loadIntegrationModule = featureLoader(() => import('@memberjunction/ng-dashboards/integration.module'));\n\n// --- @memberjunction/ng-dashboards → ./lists-dashboards.module (5 entries) ---\nconst loadListsDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/lists-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./mcp.module (2 entries) ---\nconst loadMcpModule = featureLoader(() => import('@memberjunction/ng-dashboards/mcp.module'));\n\n// --- @memberjunction/ng-dashboards → ./module (3 entries) ---\nconst loadModule = featureLoader(() => import('@memberjunction/ng-dashboards/module'));\n\n// --- @memberjunction/ng-dashboards → ./scheduling-dashboards.module (4 entries) ---\nconst loadSchedulingDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/scheduling-dashboards.module'));\n\n// --- @memberjunction/ng-dashboards → ./testing-dashboards.module (6 entries) ---\nconst loadTestingDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/testing-dashboards.module'));\n\n// --- @memberjunction/ng-explorer-settings → ./settings.module (6 entries) ---\nconst loadSettingsModule = featureLoader(() => import('@memberjunction/ng-explorer-settings/settings.module'));\n\n// --- @memberjunction/ng-file-storage → ./file-storage.module (1 entries) ---\nconst loadFileStorageModule = featureLoader(() => import('@memberjunction/ng-file-storage/file-storage.module'));\n\n// --- @memberjunction/ng-react → . (1 entries) ---\nconst loadNgReact = featureLoader(() => import('@memberjunction/ng-react'));\n\n/**\n * Complete mapping of compound keys (BaseClassName::Key) to lazy-loading functions.\n * Covers all @RegisterClass decorated classes in lazy-loaded packages.\n */\nexport const LAZY_FEATURE_CONFIG: Record<string, () => Promise<void>> = {\n // @memberjunction/ng-dashboards → ./actions-dashboards.module\n 'BaseResourceComponent::ActionExplorerResource': loadActionsDashboardsModule,\n 'BaseResourceComponent::ActionsCodeResource': loadActionsDashboardsModule,\n 'BaseResourceComponent::ActionsEntitiesResource': loadActionsDashboardsModule,\n 'BaseResourceComponent::ActionsMonitorResource': loadActionsDashboardsModule,\n 'BaseResourceComponent::ActionsOverviewResource': loadActionsDashboardsModule,\n 'BaseResourceComponent::ActionsScheduleResource': loadActionsDashboardsModule,\n 'BaseResourceComponent::ActionsSecurityResource': loadActionsDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./ai-dashboards.module\n 'BaseResourceComponent::AIAgentRequestsResource': loadAiDashboardsModule,\n 'BaseResourceComponent::AIAgentsResource': loadAiDashboardsModule,\n 'BaseResourceComponent::AIAnalyticsResource': loadAiDashboardsModule,\n 'BaseResourceComponent::AIConfigResource': loadAiDashboardsModule,\n 'BaseResourceComponent::AIModelsResource': loadAiDashboardsModule,\n 'BaseResourceComponent::AIMonitorResource': loadAiDashboardsModule,\n 'BaseResourceComponent::AIPromptsResource': loadAiDashboardsModule,\n 'BaseResourceComponent::AnalyticsResource': loadAiDashboardsModule,\n 'BaseResourceComponent::AutotaggingPipelineResource': loadAiDashboardsModule,\n 'BaseResourceComponent::ClusterVisualizationResource': loadAiDashboardsModule,\n 'BaseResourceComponent::DuplicateDetectionResource': loadAiDashboardsModule,\n 'BaseResourceComponent::KnowledgeConfigResource': loadAiDashboardsModule,\n 'BaseResourceComponent::SchedulingResource': loadAiDashboardsModule,\n 'BaseResourceComponent::Tags': loadAiDashboardsModule,\n 'BaseResourceComponent::VectorManagementResource': loadAiDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./communication-dashboards.module\n 'BaseDashboard::CommunicationDashboard': loadCommunicationDashboardsModule,\n 'BaseResourceComponent::CommunicationLogsResource': loadCommunicationDashboardsModule,\n 'BaseResourceComponent::CommunicationMonitorResource': loadCommunicationDashboardsModule,\n 'BaseResourceComponent::CommunicationProvidersResource': loadCommunicationDashboardsModule,\n 'BaseResourceComponent::CommunicationRunsResource': loadCommunicationDashboardsModule,\n 'BaseResourceComponent::CommunicationsNewMessageResource': loadCommunicationDashboardsModule,\n 'BaseResourceComponent::CommunicationTemplatesResource': loadCommunicationDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./component-studio-dashboards.module\n 'BaseDashboard::ComponentStudioDashboard': loadComponentStudioDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./core-dashboards.module\n 'BaseApplication::HomeApplication': loadCoreDashboardsModule,\n 'BaseDashboard::EntityAdmin': loadCoreDashboardsModule,\n 'BaseResourceComponent::AdminDataSchema': loadCoreDashboardsModule,\n 'BaseResourceComponent::AdminDeveloperTools': loadCoreDashboardsModule,\n 'BaseResourceComponent::AdminIdentityAccess': loadCoreDashboardsModule,\n 'BaseResourceComponent::AdminMonitoring': loadCoreDashboardsModule,\n 'BaseResourceComponent::APIKeysResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::ApplicationRolesResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::AppStateInspector': loadCoreDashboardsModule,\n 'BaseResourceComponent::ClassRegistryInspector': loadCoreDashboardsModule,\n 'BaseResourceComponent::DashboardBrowserResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::EventMonitorInspector': loadCoreDashboardsModule,\n 'BaseResourceComponent::GraphQLConsoleInspector': loadCoreDashboardsModule,\n 'BaseResourceComponent::HomeDashboard': loadCoreDashboardsModule,\n 'BaseResourceComponent::LayoutInspector': loadCoreDashboardsModule,\n 'BaseResourceComponent::LazyModuleStatusInspector': loadCoreDashboardsModule,\n 'BaseResourceComponent::PermissionsAuditLogResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::PermissionsResourceAccessResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::PermissionsUserAccessResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::QueryBrowserResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::SettingsExplorerInspector': loadCoreDashboardsModule,\n 'BaseResourceComponent::SystemDiagnosticsResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::VersionHistoryDiffResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::VersionHistoryGraphResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::VersionHistoryLabelsResource': loadCoreDashboardsModule,\n 'BaseResourceComponent::VersionHistoryRestoreResource': loadCoreDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./credentials-dashboards.module\n 'BaseDashboard::CredentialsDashboard': loadCredentialsDashboardsModule,\n 'BaseResourceComponent::CredentialsAuditResource': loadCredentialsDashboardsModule,\n 'BaseResourceComponent::CredentialsCategoriesResource': loadCredentialsDashboardsModule,\n 'BaseResourceComponent::CredentialsListResource': loadCredentialsDashboardsModule,\n 'BaseResourceComponent::CredentialsOverviewResource': loadCredentialsDashboardsModule,\n 'BaseResourceComponent::CredentialsTypesResource': loadCredentialsDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./data-explorer-dashboards.module\n 'BaseDashboard::DataExplorer': loadDataExplorerDashboardsModule,\n 'BaseResourceComponent::DataExplorerResource': loadDataExplorerDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./integration.module\n 'BaseResourceComponent::IntegrationActivity': loadIntegrationModule,\n 'BaseResourceComponent::IntegrationConnections': loadIntegrationModule,\n 'BaseResourceComponent::IntegrationMappingWorkspace': loadIntegrationModule,\n 'BaseResourceComponent::IntegrationOverview': loadIntegrationModule,\n 'BaseResourceComponent::IntegrationPipelines': loadIntegrationModule,\n 'BaseResourceComponent::IntegrationSchedules': loadIntegrationModule,\n\n // @memberjunction/ng-dashboards → ./lists-dashboards.module\n 'BaseResourceComponent::ListsBrowseResource': loadListsDashboardsModule,\n 'BaseResourceComponent::ListsCategoriesResource': loadListsDashboardsModule,\n 'BaseResourceComponent::ListsMyListsResource': loadListsDashboardsModule,\n 'BaseResourceComponent::ListsOperationsResource': loadListsDashboardsModule,\n 'BaseResourceComponent::ListsSharedWithMeResource': loadListsDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./mcp.module\n 'BaseDashboard::MCPDashboard': loadMcpModule,\n 'BaseResourceComponent::MCPResource': loadMcpModule,\n\n // @memberjunction/ng-dashboards → ./module\n 'BaseResourceComponent::ArchiveConfigResource': loadModule,\n 'BaseResourceComponent::ArchiveRunsResource': loadModule,\n 'BaseResourceComponent::DatabaseDesignerDashboard': loadModule,\n\n // @memberjunction/ng-dashboards → ./scheduling-dashboards.module\n 'BaseDashboard::SchedulingDashboard': loadSchedulingDashboardsModule,\n 'BaseResourceComponent::SchedulingActivityResource': loadSchedulingDashboardsModule,\n 'BaseResourceComponent::SchedulingDashboardResource': loadSchedulingDashboardsModule,\n 'BaseResourceComponent::SchedulingJobsResource': loadSchedulingDashboardsModule,\n\n // @memberjunction/ng-dashboards → ./testing-dashboards.module\n 'BaseDashboard::TestingDashboard': loadTestingDashboardsModule,\n 'BaseResourceComponent::TestingAnalyticsResource': loadTestingDashboardsModule,\n 'BaseResourceComponent::TestingDashboardTabResource': loadTestingDashboardsModule,\n 'BaseResourceComponent::TestingExplorerResource': loadTestingDashboardsModule,\n 'BaseResourceComponent::TestingReviewResource': loadTestingDashboardsModule,\n 'BaseResourceComponent::TestingRunsResource': loadTestingDashboardsModule,\n\n // @memberjunction/ng-explorer-settings → ./settings.module\n 'BaseDashboard::ApplicationManagement': loadSettingsModule,\n 'BaseDashboard::EntityPermissions': loadSettingsModule,\n 'BaseDashboard::RoleManagement': loadSettingsModule,\n 'BaseDashboard::SqlLogging': loadSettingsModule,\n 'BaseDashboard::UserManagement': loadSettingsModule,\n 'BaseNavigationComponent::Settings': loadSettingsModule,\n\n // @memberjunction/ng-file-storage → ./file-storage.module\n 'BaseResourceComponent::FileBrowserResource': loadFileStorageModule,\n\n // @memberjunction/ng-react → .\n 'RuntimeUtilities::RuntimeUtilities': loadNgReact,\n\n};\n\nexport const LAZY_FEATURE_CONFIG_COUNT = 98;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/dashboard-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,gBAAgB,EAA2B,UAAU,EAAE,iBAAiB,EAAU,MAAM,eAAe,CAAC;AAC5H,OAAO,EAAE,qBAAqB,EAAqD,MAAM,2BAA2B,CAAC;AACrH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAmB,0BAA0B,EAAwD,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAI7M,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sDAAsD,CAAC;;AAE9F;;;;GAIG;AACH,qBA4Ya,iBAAkB,SAAQ,qBAAqB;IAgEpD,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,GAAG;IAhEf,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,UAAU,CAAS;IACe,gBAAgB,EAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAExF,4DAA4D;IACrD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC1C,4DAA4D;IACrD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C,4DAA4D;IAC5D,OAAO,CAAC,UAAU,CAAmC;IAErD,gFAAgF;IAChF,OAAO,CAAC,cAAc,CAAyC;IAE/D,yEAAyE;IAClE,eAAe,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAExD,iCAAiC;IAC1B,UAAU,UAAS;IAE1B,qBAAqB;IACd,WAAW,SAAM;IACjB,kBAAkB,SAAM;IAE/B,oDAAoD;IAC7C,oBAAoB,EAAE,wBAAwB,CAQnD;IAEF,0CAA0C;IACnC,eAAe,UAAS;IAE/B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAYhB;;OAEG;IACH,OAAO,CAAC,UAAU;gBAMN,aAAa,EAAE,gBAAgB,EAC/B,GAAG,EAAE,iBAAiB;IAKlC,IAAa,IAAI,CAAC,KAAK,EAAE,YAAY,EAmBpC;IAGD,IAAa,IAAI,IAAI,YAAY,CAEhC;IAED,WAAW,IAAI,IAAI;IAWnB;;OAEG;IACI,cAAc,IAAI,IAAI;IAQ7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;IACI,UAAU,IAAI,IAAI;IAWzB;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB3C;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAOhC;;OAEG;IACI,eAAe,IAAI,IAAI;IAK9B;;OAEG;IACI,gBAAgB,IAAI,IAAI;IAK/B;;OAEG;IACI,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAe3D;;;OAGG;YACW,aAAa;IAiD3B;;;;;OAKG;YACW,gBAAgB;IA6D9B;;OAEG;YACW,sBAAsB;cAwEpB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAiBhG;;OAEG;YACW,wBAAwB;IAuEtC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA4B/B;;;OAGG;IACY,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB1E;;OAEG;IACG,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAjjBtD,iBAAiB;2CAAjB,iBAAiB;CAojB7B"}
1
+ {"version":3,"file":"dashboard-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/dashboard-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,gBAAgB,EAA2B,UAAU,EAAE,iBAAiB,EAAU,MAAM,eAAe,CAAC;AAC5H,OAAO,EAAE,qBAAqB,EAAqD,MAAM,2BAA2B,CAAC;AACrH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAmB,0BAA0B,EAAwD,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAI7M,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sDAAsD,CAAC;;AAE9F;;;;GAIG;AACH,qBA4Ya,iBAAkB,SAAQ,qBAAqB;IAgEpD,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,GAAG;IAhEf,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,UAAU,CAAS;IACe,gBAAgB,EAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAExF,4DAA4D;IACrD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC1C,4DAA4D;IACrD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C,4DAA4D;IAC5D,OAAO,CAAC,UAAU,CAAmC;IAErD,gFAAgF;IAChF,OAAO,CAAC,cAAc,CAAyC;IAE/D,yEAAyE;IAClE,eAAe,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAExD,iCAAiC;IAC1B,UAAU,UAAS;IAE1B,qBAAqB;IACd,WAAW,SAAM;IACjB,kBAAkB,SAAM;IAE/B,oDAAoD;IAC7C,oBAAoB,EAAE,wBAAwB,CAQnD;IAEF,0CAA0C;IACnC,eAAe,UAAS;IAE/B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAYhB;;OAEG;IACH,OAAO,CAAC,UAAU;gBAMN,aAAa,EAAE,gBAAgB,EAC/B,GAAG,EAAE,iBAAiB;IAKlC,IAAa,IAAI,CAAC,KAAK,EAAE,YAAY,EAmBpC;IAGD,IAAa,IAAI,IAAI,YAAY,CAEhC;IAED,WAAW,IAAI,IAAI;IAWnB;;OAEG;IACI,cAAc,IAAI,IAAI;IAQ7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;IACI,UAAU,IAAI,IAAI;IAWzB;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB3C;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAOhC;;OAEG;IACI,eAAe,IAAI,IAAI;IAK9B;;OAEG;IACI,gBAAgB,IAAI,IAAI;IAK/B;;OAEG;IACI,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAe3D;;;OAGG;YACW,aAAa;IAiD3B;;;;;OAKG;YACW,gBAAgB;IA6D9B;;OAEG;YACW,sBAAsB;cAwEpB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAiBhG;;OAEG;YACW,wBAAwB;IAuEtC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAiD/B;;;OAGG;IACY,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB1E;;OAEG;IACG,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAtkBtD,iBAAiB;2CAAjB,iBAAiB;CAykB7B"}
@@ -560,7 +560,29 @@ let DashboardResource = class DashboardResource extends BaseResourceComponent {
560
560
  switch (request.type) {
561
561
  case 'OpenEntityRecord': {
562
562
  const entityRequest = request;
563
- const pkey = new CompositeKey([{ FieldName: 'ID', Value: entityRequest.recordId }]);
563
+ // `recordId` is documented as URL-segment format (see OpenEntityRecordNavRequest in
564
+ // @memberjunction/ng-dashboard-viewer). E.g. a single-PK record is `"ID|11055"`; a
565
+ // composite-PK record is `"Field1|Value1||Field2|Value2"`. Senders in
566
+ // dashboard-viewer (artifact-part, view-part) intentionally call
567
+ // `compositeKey.ToURLSegment()` to produce this shape.
568
+ //
569
+ // Wrapping that string verbatim into `{ FieldName: 'ID', Value: <segment> }` makes
570
+ // ToURLSegment serialize it a second time as `ID|<segment>` and produces a
571
+ // malformed `Field|Field|Value` URL the host parser silently mis-reads (manifesting
572
+ // downstream as `BaseEntity.Load(... Key: ID=ID)` and `Primary Key value is not a
573
+ // valid number`). Parse the segment with `LoadFromURLSegment` against the entity's
574
+ // PK metadata instead, so single-PK and composite-PK both round-trip correctly.
575
+ const md = this.ProviderToUse;
576
+ const entityInfo = md.EntityByName(entityRequest.entityName);
577
+ const pkey = new CompositeKey();
578
+ if (entityInfo) {
579
+ pkey.LoadFromURLSegment(entityInfo, entityRequest.recordId);
580
+ }
581
+ else {
582
+ // Last-resort fallback when entity metadata isn't resolvable — preserves
583
+ // pre-fix behavior so we don't NRE on an unknown entity name.
584
+ pkey.KeyValuePairs = [{ FieldName: 'ID', Value: entityRequest.recordId }];
585
+ }
564
586
  this.navigationService.OpenEntityRecord(entityRequest.entityName, pkey);
565
587
  break;
566
588
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/dashboard-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewContainerRef, ComponentRef, ViewChild, ElementRef, ChangeDetectorRef, inject } from '@angular/core';\nimport { BaseResourceComponent, NavigationService, BaseDashboard, DashboardConfig } from '@memberjunction/ng-shared';\nimport { ResourceData, MJDashboardEntity, DashboardEngine, MJDashboardUserStateEntity, MJDashboardCategoryEntity, MJDashboardPartTypeEntity, DashboardUserPermissions } from '@memberjunction/core-entities';\nimport { RegisterClass, MJGlobal, SafeJSONParse , UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, CompositeKey, RunView, LogError } from '@memberjunction/core';\nimport type { DataExplorerFilter } from '@memberjunction/ng-dashboards/data-explorer-dashboards.module';\nimport type { ShareDialogResult } from '@memberjunction/ng-dashboards/core-dashboards.module';\nimport { DashboardViewerComponent, DashboardNavRequestEvent, PanelInteractionEvent, AddPanelResult, DashboardPanel } from '@memberjunction/ng-dashboard-viewer';\n/**\n * Dashboard Resource Wrapper - displays a single dashboard in a tab\n * Extends BaseResourceComponent to work with the resource type system\n * Dynamically routes between code-based and config-based dashboards based on dashboard type\n */\n@RegisterClass(BaseResourceComponent, 'DashboardResource')\n@Component({\n standalone: false,\n selector: 'mj-dashboard-resource',\n template: `\n <div class=\"dashboard-resource-wrapper\">\n <!-- Error State -->\n @if (errorMessage) {\n <div class=\"error-state\">\n <div class=\"error-icon\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </div>\n <h2 class=\"error-title\">Unable to Load Dashboard</h2>\n <p class=\"error-message\">{{ errorMessage }}</p>\n @if (errorDetails) {\n <details class=\"error-details\">\n <summary>Technical Details</summary>\n <pre>{{ errorDetails }}</pre>\n </details>\n }\n </div>\n }\n\n <!-- View Mode Toolbar -->\n @if (configDashboard && !isEditMode && !errorMessage) {\n <div class=\"viewer-toolbar\">\n <div class=\"toolbar-left\">\n <span class=\"dashboard-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n {{ configDashboard.Name }}\n </span>\n @if (!dashboardPermissions.IsOwner && dashboardPermissions.PermissionSource !== 'none') {\n <span class=\"shared-indicator\" title=\"Shared with you\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n </span>\n }\n </div>\n <div class=\"toolbar-actions\">\n @if (dashboardPermissions.CanShare) {\n <button\n class=\"btn-icon\"\n title=\"Share Dashboard\"\n (click)=\"openShareDialog()\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n </button>\n }\n @if (dashboardPermissions.CanEdit) {\n <button\n class=\"btn-icon\"\n title=\"Edit Dashboard\"\n (click)=\"toggleEditMode()\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Edit Mode Toolbar -->\n @if (configDashboard && isEditMode && !errorMessage) {\n <div class=\"viewer-header editing\">\n <div class=\"header-left\">\n <button class=\"btn-add-part\" (click)=\"openAddPartDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Part\n </button>\n <div class=\"header-separator\"></div>\n <div class=\"dashboard-info-edit\">\n <input\n type=\"text\"\n class=\"dashboard-name-input\"\n [(ngModel)]=\"editingName\"\n placeholder=\"Dashboard name\">\n <input\n type=\"text\"\n class=\"dashboard-description-input\"\n [(ngModel)]=\"editingDescription\"\n placeholder=\"Add a description...\">\n </div>\n </div>\n <div class=\"header-right\">\n <button class=\"btn-primary\" (click)=\"saveDashboard()\">\n <i class=\"fa-solid fa-save\"></i>\n Save\n </button>\n <button class=\"btn-cancel\" (click)=\"cancelEdit()\">\n Cancel\n </button>\n </div>\n </div>\n }\n\n <!-- Dashboard Content Container -->\n <div #container class=\"dashboard-resource-container\"></div>\n\n <!-- Share Dashboard Dialog -->\n @if (configDashboard) {\n <mj-dashboard-share-dialog\n [Visible]=\"showShareDialog\"\n [Dashboard]=\"configDashboard\"\n (Result)=\"onShareDialogResult($event)\">\n </mj-dashboard-share-dialog>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n }\n .dashboard-resource-wrapper {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n }\n .dashboard-resource-container {\n flex: 1;\n overflow: hidden;\n min-height: 0;\n }\n\n /* View Mode Toolbar */\n .viewer-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n gap: 16px;\n }\n .viewer-toolbar .toolbar-left {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n .viewer-toolbar .dashboard-title {\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .viewer-toolbar .dashboard-title i {\n color: var(--mj-brand-primary);\n }\n .shared-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 11px;\n }\n .viewer-toolbar .toolbar-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n /* Edit Mode Header */\n .viewer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.2s, border-color 0.2s;\n }\n .viewer-header.editing {\n background: linear-gradient(135deg, color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)) 0%, color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface)) 100%);\n border-bottom: 2px solid var(--mj-brand-primary);\n }\n .viewer-header .header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n }\n .viewer-header .header-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n /* Add Part button */\n .btn-add-part {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s, transform 0.1s;\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n .btn-add-part:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 3px 6px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n }\n .btn-add-part i { font-size: 12px; }\n\n /* Header separator */\n .header-separator {\n width: 1px;\n height: 28px;\n background: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n margin: 0 4px;\n }\n\n /* Buttons */\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n .btn-primary:hover { background: var(--mj-brand-primary-hover); }\n\n .btn-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n .btn-icon:hover { background: var(--mj-bg-surface-sunken); }\n\n .btn-cancel {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n }\n .btn-cancel:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-default);\n color: var(--mj-text-primary);\n }\n\n /* Dashboard info inputs */\n .dashboard-info-edit {\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n }\n .dashboard-name-input {\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 6px 12px;\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-primary);\n background: rgba(255, 255, 255, 0.7);\n outline: none;\n min-width: 200px;\n max-width: 300px;\n transition: border-color 0.2s, background 0.2s, box-shadow 0.2s;\n }\n .dashboard-name-input:hover { background: rgba(255, 255, 255, 0.9); }\n .dashboard-name-input:focus {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n }\n .dashboard-description-input {\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 6px 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n background: rgba(255, 255, 255, 0.5);\n outline: none;\n flex: 1;\n min-width: 150px;\n max-width: 400px;\n transition: border-color 0.2s, background 0.2s, box-shadow 0.2s;\n }\n .dashboard-description-input:hover { background: rgba(255, 255, 255, 0.8); }\n .dashboard-description-input:focus {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n }\n .dashboard-description-input::placeholder {\n color: var(--mj-text-muted);\n font-style: normal;\n }\n\n /* Error state */\n .error-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 40px;\n text-align: center;\n color: var(--mj-text-secondary);\n }\n .error-icon {\n font-size: 64px;\n color: var(--mj-status-error);\n margin-bottom: 24px;\n opacity: 0.8;\n }\n .error-title {\n font-size: 24px;\n font-weight: 500;\n margin: 0 0 12px 0;\n color: var(--mj-text-primary);\n }\n .error-message {\n font-size: 16px;\n color: var(--mj-text-muted);\n margin: 0 0 24px 0;\n max-width: 500px;\n line-height: 1.5;\n }\n .error-details {\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 12px 16px;\n max-width: 600px;\n text-align: left;\n font-size: 13px;\n }\n .error-details summary {\n cursor: pointer;\n font-weight: 500;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n }\n .error-details pre {\n margin: 0;\n white-space: pre-wrap;\n word-break: break-word;\n color: var(--mj-status-error-text);\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 12px;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .viewer-header {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n .viewer-header .header-left { flex-wrap: wrap; }\n .dashboard-info-edit {\n flex-direction: column;\n align-items: stretch;\n }\n .dashboard-name-input,\n .dashboard-description-input { max-width: none; }\n }\n `]\n})\nexport class DashboardResource extends BaseResourceComponent {\n private componentRef: ComponentRef<unknown> | null = null;\n private dataLoaded = false;\n @ViewChild('container', { static: true }) containerElement!: ElementRef<HTMLDivElement>;\n\n /** Error message to display when dashboard fails to load */\n public errorMessage: string | null = null;\n /** Technical error details (shown in expandable section) */\n public errorDetails: string | null = null;\n\n /** Cached dashboard categories for breadcrumb navigation */\n private categories: MJDashboardCategoryEntity[] = [];\n\n /** Reference to the dashboard viewer component (for config-based dashboards) */\n private viewerInstance: DashboardViewerComponent | null = null;\n\n /** The config-based dashboard entity (null for code-based dashboards) */\n public configDashboard: MJDashboardEntity | null = null;\n\n /** Whether we're in edit mode */\n public isEditMode = false;\n\n /** Editing fields */\n public editingName = '';\n public editingDescription = '';\n\n /** Current user's permissions for this dashboard */\n public dashboardPermissions: DashboardUserPermissions = {\n DashboardID: '',\n CanRead: true,\n CanEdit: true,\n CanDelete: true,\n CanShare: true,\n IsOwner: true,\n PermissionSource: 'owner'\n };\n\n /** Whether the share dialog is visible */\n public showShareDialog = false;\n\n /**\n * Sets the error state with a user-friendly message and optional technical details\n */\n private setError(message: string, error?: unknown): void {\n this.errorMessage = message;\n if (error instanceof Error) {\n this.errorDetails = error.message;\n if (error.stack) {\n this.errorDetails += '\\n\\nStack trace:\\n' + error.stack;\n }\n } else if (error) {\n this.errorDetails = String(error);\n }\n }\n\n /**\n * Clears any previous error state\n */\n private clearError(): void {\n this.errorMessage = null;\n this.errorDetails = null;\n }\n\n constructor(\n private viewContainer: ViewContainerRef,\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n override set Data(value: ResourceData) {\n const previousRecordId = super.Data?.ResourceRecordID;\n super.Data = value;\n\n const newRecordId = value?.ResourceRecordID;\n\n // Load on first set, or when the dashboard has changed\n if (!this.dataLoaded || newRecordId !== previousRecordId) {\n this.dataLoaded = true;\n // Destroy previous component before loading new one\n if (this.componentRef) {\n this.componentRef.destroy();\n this.componentRef = null;\n }\n this.clearError();\n this.configDashboard = null;\n this.viewerInstance = null;\n this.loadDashboard();\n }\n }\n\n // Need to override the getter too in TS otherwise the override to the setter alone above would break things\n override get Data(): ResourceData {\n return super.Data;\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n if (this.componentRef) {\n this.componentRef.destroy();\n }\n }\n\n // ========================================\n // Edit Mode Methods\n // ========================================\n\n /**\n * Toggle between view and edit mode\n */\n public toggleEditMode(): void {\n if (this.isEditMode) {\n this.cancelEdit();\n } else {\n this.enterEditMode();\n }\n }\n\n /**\n * Enter edit mode\n */\n private enterEditMode(): void {\n if (!this.configDashboard) return;\n\n this.isEditMode = true;\n this.editingName = this.configDashboard.Name;\n this.editingDescription = this.configDashboard.Description || '';\n\n // Tell the viewer to enter edit mode\n if (this.viewerInstance) {\n this.viewerInstance.isEditing = true;\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Cancel edit mode and discard changes\n */\n public cancelEdit(): void {\n this.isEditMode = false;\n\n // Tell the viewer to exit edit mode\n if (this.viewerInstance) {\n this.viewerInstance.isEditing = false;\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Save dashboard changes\n */\n public async saveDashboard(): Promise<void> {\n if (!this.configDashboard || !this.viewerInstance) return;\n\n try {\n // Update dashboard name and description\n this.configDashboard.Name = this.editingName;\n this.configDashboard.Description = this.editingDescription;\n\n // Save via the viewer (which handles layout saving)\n await this.viewerInstance.save();\n\n // Exit edit mode\n this.isEditMode = false;\n this.viewerInstance.isEditing = false;\n\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Error saving dashboard:', error);\n }\n }\n\n /**\n * Open the add panel dialog\n */\n public openAddPartDialog(): void {\n if (this.viewerInstance) {\n // Trigger the viewer's add panel flow\n this.viewerInstance.onAddPanelClick();\n }\n }\n\n /**\n * Open the share dialog for this dashboard\n */\n public openShareDialog(): void {\n this.showShareDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Close the share dialog\n */\n public closeShareDialog(): void {\n this.showShareDialog = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle share dialog result\n */\n public onShareDialogResult(result: ShareDialogResult): void {\n this.showShareDialog = false;\n\n if (result.Action === 'save' && this.configDashboard) {\n // Recompute permissions after sharing changes\n const md = this.ProviderToUse;\n this.dashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n this.configDashboard.ID,\n md.CurrentUser.ID\n );\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Load the appropriate dashboard component based on dashboard type\n * Routes between code-based dashboards (registered classes) and config-based dashboards\n */\n private async loadDashboard(): Promise<void> {\n // Clear any previous error state\n this.clearError();\n\n const data = this.Data;\n\n if (!data?.ResourceRecordID) {\n this.NotifyLoadStarted();\n this.NotifyLoadComplete();\n return;\n }\n\n this.NotifyLoadStarted();\n\n try {\n // Check if this is a special dashboard type (not a database record)\n const config = data.Configuration || {};\n\n if (config['dashboardType'] === 'DataExplorer' || data.ResourceRecordID === 'DataExplorer') {\n // Special case: Data Explorer dashboard with optional entity filter\n await this.loadDataExplorer(\n config['entityFilter'],\n config['appName'] as string | undefined,\n config['appIcon'] as string | undefined\n );\n return;\n }\n\n await DashboardEngine.Instance.Config(false); // make sure it is configured, if already configured does nothing\n const dashboard = DashboardEngine.Instance.Dashboards.find(d => UUIDsEqual(d.ID, data.ResourceRecordID));\n if (!dashboard) {\n throw new Error(`Dashboard with ID ${data.ResourceRecordID} not found.`);\n }\n\n // Determine which dashboard component to load based on dashboard type\n if (dashboard.Type === 'Code') {\n // CODE-BASED DASHBOARD: Use registered class via DriverClass\n await this.loadCodeBasedDashboard(dashboard);\n } else {\n // CONFIG-BASED DASHBOARD: Use the generic metadata-driven renderer\n await this.loadConfigBasedDashboard(dashboard);\n }\n } catch (error) {\n console.error('Error loading dashboard:', error);\n this.setError('The dashboard could not be loaded. This may be due to a missing component or configuration issue.', error);\n this.NotifyLoadComplete();\n }\n }\n\n /**\n * Load the Data Explorer dashboard component with optional entity filter and context info\n * @param entityFilter Optional filter to constrain which entities are shown\n * @param contextName Optional name to display in the header (e.g., \"CRM\", \"Association Demo\")\n * @param contextIcon Optional Font Awesome icon class for the header\n */\n private async loadDataExplorer(\n entityFilter?: DataExplorerFilter,\n contextName?: string,\n contextIcon?: string\n ): Promise<void> {\n try {\n // Lazy-load the Data Explorer component to keep it out of the initial bundle\n const { DataExplorerDashboardComponent } = await import('@memberjunction/ng-dashboards/data-explorer-dashboards.module');\n this.containerElement.nativeElement.innerHTML = '';\n const componentRef = this.viewContainer.createComponent(DataExplorerDashboardComponent);\n this.componentRef = componentRef;\n const instance = componentRef.instance;\n\n // Set the entity filter - ngOnInit will use this when it runs\n if (entityFilter) {\n instance.entityFilter = entityFilter;\n }\n\n // Set context name and icon for customized header display\n if (contextName) {\n instance.contextName = contextName;\n }\n if (contextIcon) {\n instance.contextIcon = contextIcon;\n }\n\n // Manually append the component's native element inside the div\n const nativeElement = (componentRef.hostView as any).rootNodes[0];\n nativeElement.style.width = '100%';\n nativeElement.style.height = '100%';\n this.containerElement.nativeElement.appendChild(nativeElement);\n\n // Handle open entity record events\n instance.OpenEntityRecord.subscribe((eventData: { EntityName: string; RecordPKey: CompositeKey }) => {\n if (eventData && eventData.EntityName && eventData.RecordPKey) {\n this.navigationService.OpenEntityRecord(eventData.EntityName, eventData.RecordPKey);\n }\n });\n\n // Setup LoadCompleteEvent to know when the dashboard is ready\n instance.LoadCompleteEvent = () => {\n this.NotifyLoadComplete();\n };\n\n // Initialize dashboard (no database config needed for DataExplorer)\n const config: DashboardConfig = {\n dashboard: null as unknown as MJDashboardEntity, // No database record\n userState: {}\n };\n instance.Config = config;\n instance.Refresh();\n\n // Trigger change detection to ensure the component updates\n componentRef.changeDetectorRef.detectChanges();\n } catch (error) {\n console.error('Error loading Data Explorer:', error);\n this.setError('The Data Explorer could not be loaded.', error);\n this.NotifyLoadComplete();\n }\n }\n\n /**\n * Load a code-based dashboard by looking up the registered class\n */\n private async loadCodeBasedDashboard(dashboard: MJDashboardEntity): Promise<void> {\n try {\n if (!dashboard.DriverClass) {\n throw new Error(`Dashboard '${dashboard.Name}' is marked as Code type but has no DriverClass specified`);\n }\n\n // Look up the registered class using the DriverClass name (with lazy loading fallback via ClassFactory)\n const classReg = await MJGlobal.Instance.ClassFactory.GetRegistrationAsync(\n BaseDashboard,\n dashboard.DriverClass\n );\n\n if (!classReg?.SubClass) {\n throw new Error(`Dashboard class '${dashboard.DriverClass}' is not registered. Please check the class registration.`);\n }\n\n // Create the component instance\n this.containerElement.nativeElement.innerHTML = '';\n this.componentRef = this.viewContainer.createComponent<BaseDashboard>(classReg.SubClass);\n const instance = this.componentRef.instance as BaseDashboard;\n\n // Setup LoadCompleteEvent() to know when the dashboard is ready\n instance.LoadCompleteEvent = () => {\n this.NotifyLoadComplete();\n };\n\n // Initialize with dashboard data\n const userStateEntity = await this.loadDashboardUserState(dashboard.ID);\n const config: DashboardConfig = {\n dashboard,\n userState: userStateEntity.UserState ? SafeJSONParse(userStateEntity.UserState) : {}\n };\n\n instance.Config = config;\n\n // Manually append the component's native element inside the div\n const nativeElement = (this.componentRef.hostView as any).rootNodes[0];\n nativeElement.style.width = '100%';\n nativeElement.style.height = '100%';\n this.containerElement.nativeElement.appendChild(nativeElement);\n\n // handle open entity record events in MJ Explorer with routing\n instance.OpenEntityRecord.subscribe((data: { EntityName: string; RecordPKey: CompositeKey }) => {\n // check to see if the data has entityname/pkey\n if (data && data.EntityName && data.RecordPKey) {\n // Use NavigationService to open entity record in new tab\n this.navigationService.OpenEntityRecord(data.EntityName, data.RecordPKey);\n } else {\n console.warn('DashboardResource - invalid data, missing EntityName or RecordPKey:', data);\n }\n });\n\n instance.UserStateChanged.subscribe(async (userState: any) => {\n if (!userState) {\n // if the user state is null, we need to remove it from the user state\n userState = {};\n }\n // save the user state to the dashboard user state entity\n userStateEntity.UserState = JSON.stringify(userState);\n if (!await userStateEntity.Save()) {\n LogError('Error saving user state', null, userStateEntity.LatestResult?.CompleteMessage);\n }\n });\n\n instance.Refresh();\n } catch (error) {\n console.error('Error loading code-based dashboard:', error);\n this.setError(`The dashboard \"${dashboard.Name}\" could not be loaded. The dashboard class may not be registered or may have failed to initialize.`, error);\n this.NotifyLoadComplete();\n }\n }\n\n protected async loadDashboardUserState(dashboardId: string): Promise<MJDashboardUserStateEntity> {\n // handle user state changes for the dashboard\n const md = this.ProviderToUse;\n const stateResult = DashboardEngine.Instance.DashboardUserStates.filter(dus => UUIDsEqual(dus.DashboardID, dashboardId) && UUIDsEqual(dus.UserID, md.CurrentUser.ID));\n let stateObject: MJDashboardUserStateEntity;\n if (stateResult && stateResult.length > 0) {\n stateObject = stateResult[0];\n }\n else {\n stateObject = await md.GetEntityObject<MJDashboardUserStateEntity>('MJ: Dashboard User States');\n stateObject.DashboardID = dashboardId;\n stateObject.UserID = md.CurrentUser.ID;\n // don't save becuase we don't care about the state until something changes\n }\n return stateObject;\n }\n\n /**\n * Load a config-based dashboard using the new DashboardViewerComponent (Golden Layout)\n */\n private async loadConfigBasedDashboard(dashboard: MJDashboardEntity): Promise<void> {\n try {\n this.containerElement.nativeElement.innerHTML = '';\n const componentRef = this.viewContainer.createComponent(DashboardViewerComponent);\n this.componentRef = componentRef;\n const instance = componentRef.instance;\n\n // Store references for external toolbar control\n this.viewerInstance = instance;\n this.configDashboard = dashboard;\n\n // Compute user permissions for this dashboard\n const md = this.ProviderToUse;\n this.dashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n // Manually append the component's native element inside the div\n const nativeElement = (this.componentRef.hostView as any).rootNodes[0];\n nativeElement.style.width = '100%';\n nativeElement.style.height = '100%';\n this.containerElement.nativeElement.appendChild(nativeElement);\n\n // Load categories for breadcrumb navigation (if not already loaded)\n if (this.categories.length === 0) {\n this.categories = DashboardEngine.Instance.DashboardCategories;\n }\n\n // Set the dashboard entity directly on the viewer\n // We provide our own external toolbar, so disable the viewer's internal toolbar\n instance.dashboard = dashboard;\n instance.showToolbar = false; // We provide external toolbar\n instance.showBreadcrumb = false; // Already in its own tab, no breadcrumb needed\n instance.showOpenInTabButton = false; // Already in its own tab\n instance.showEditButton = false; // External toolbar handles edit\n instance.Categories = this.categories;\n\n // Wire up navigation events - handle navigation requests from the dashboard\n instance.navigationRequested.subscribe((event: DashboardNavRequestEvent) => {\n this.handleNavigationRequest(event);\n });\n\n // Wire up \"Open in Tab\" button click\n instance.openInTab.subscribe((event: { dashboardId: string; dashboardName: string }) => {\n this.navigationService.OpenDashboard(event.dashboardId, event.dashboardName);\n });\n\n // Wire up dashboard saved event\n instance.dashboardSaved.subscribe((savedDashboard: MJDashboardEntity) => {\n this.ResourceRecordSaved(savedDashboard);\n });\n\n // Wire up error events\n instance.error.subscribe((errorEvent: { message: string; error?: Error }) => {\n console.error('Dashboard error:', errorEvent.message, errorEvent.error);\n });\n\n // Notify load complete after a brief delay to let Golden Layout initialize\n setTimeout(() => {\n this.NotifyLoadComplete();\n this.cdr.detectChanges();\n }, 150);\n\n } catch (error) {\n console.error('Error loading config-based dashboard:', error);\n this.setError(`The dashboard \"${dashboard.Name}\" could not be loaded. There may be an issue with the dashboard configuration.`, error);\n this.NotifyLoadComplete();\n }\n }\n\n /**\n * Handle navigation requests from the dashboard viewer\n */\n private handleNavigationRequest(event: DashboardNavRequestEvent): void {\n const request = event.request;\n\n switch (request.type) {\n case 'OpenEntityRecord': {\n const entityRequest = request as { type: 'OpenEntityRecord'; entityName: string; recordId: string };\n const pkey = new CompositeKey([{ FieldName: 'ID', Value: entityRequest.recordId }]);\n this.navigationService.OpenEntityRecord(entityRequest.entityName, pkey);\n break;\n }\n case 'OpenDashboard': {\n const dashRequest = request as { type: 'OpenDashboard'; dashboardId: string };\n // Load dashboard name from engine cache\n const targetDashboard = DashboardEngine.Instance.Dashboards.find(d => UUIDsEqual(d.ID, dashRequest.dashboardId));\n const name = targetDashboard?.Name || 'Dashboard';\n this.navigationService.OpenDashboard(dashRequest.dashboardId, name);\n break;\n }\n case 'OpenQuery': {\n const queryRequest = request as { type: 'OpenQuery'; queryId: string };\n this.navigationService.OpenQuery(queryRequest.queryId, 'Query');\n break;\n }\n default:\n console.warn('Unhandled navigation request type:', request.type);\n }\n }\n\n /**\n * Get the display name for a dashboard resource\n * Loads the actual dashboard name from the database if available\n */\n override async GetResourceDisplayName(data: ResourceData): Promise<string> {\n try {\n // Try to load dashboard metadata if we have the record ID\n if (data.ResourceRecordID && data.ResourceRecordID.length > 0) {\n const md = this.ProviderToUse;\n const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: data.ResourceRecordID }]);\n const name = await md.GetEntityRecordName('Dashboards', compositeKey);\n if (name) {\n return name;\n }\n }\n } catch (error) {\n // Silently fail and use fallback\n }\n\n // Fallback: use provided name or generic label\n return data.Name || 'Dashboard';\n }\n\n /**\n * Get the icon class for dashboard resources\n */\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-table-columns';\n }\n}\n"]}
1
+ {"version":3,"file":"dashboard-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/dashboard-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewContainerRef, ComponentRef, ViewChild, ElementRef, ChangeDetectorRef, inject } from '@angular/core';\nimport { BaseResourceComponent, NavigationService, BaseDashboard, DashboardConfig } from '@memberjunction/ng-shared';\nimport { ResourceData, MJDashboardEntity, DashboardEngine, MJDashboardUserStateEntity, MJDashboardCategoryEntity, MJDashboardPartTypeEntity, DashboardUserPermissions } from '@memberjunction/core-entities';\nimport { RegisterClass, MJGlobal, SafeJSONParse , UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, CompositeKey, RunView, LogError } from '@memberjunction/core';\nimport type { DataExplorerFilter } from '@memberjunction/ng-dashboards/data-explorer-dashboards.module';\nimport type { ShareDialogResult } from '@memberjunction/ng-dashboards/core-dashboards.module';\nimport { DashboardViewerComponent, DashboardNavRequestEvent, PanelInteractionEvent, AddPanelResult, DashboardPanel } from '@memberjunction/ng-dashboard-viewer';\n/**\n * Dashboard Resource Wrapper - displays a single dashboard in a tab\n * Extends BaseResourceComponent to work with the resource type system\n * Dynamically routes between code-based and config-based dashboards based on dashboard type\n */\n@RegisterClass(BaseResourceComponent, 'DashboardResource')\n@Component({\n standalone: false,\n selector: 'mj-dashboard-resource',\n template: `\n <div class=\"dashboard-resource-wrapper\">\n <!-- Error State -->\n @if (errorMessage) {\n <div class=\"error-state\">\n <div class=\"error-icon\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </div>\n <h2 class=\"error-title\">Unable to Load Dashboard</h2>\n <p class=\"error-message\">{{ errorMessage }}</p>\n @if (errorDetails) {\n <details class=\"error-details\">\n <summary>Technical Details</summary>\n <pre>{{ errorDetails }}</pre>\n </details>\n }\n </div>\n }\n\n <!-- View Mode Toolbar -->\n @if (configDashboard && !isEditMode && !errorMessage) {\n <div class=\"viewer-toolbar\">\n <div class=\"toolbar-left\">\n <span class=\"dashboard-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n {{ configDashboard.Name }}\n </span>\n @if (!dashboardPermissions.IsOwner && dashboardPermissions.PermissionSource !== 'none') {\n <span class=\"shared-indicator\" title=\"Shared with you\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n </span>\n }\n </div>\n <div class=\"toolbar-actions\">\n @if (dashboardPermissions.CanShare) {\n <button\n class=\"btn-icon\"\n title=\"Share Dashboard\"\n (click)=\"openShareDialog()\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n </button>\n }\n @if (dashboardPermissions.CanEdit) {\n <button\n class=\"btn-icon\"\n title=\"Edit Dashboard\"\n (click)=\"toggleEditMode()\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Edit Mode Toolbar -->\n @if (configDashboard && isEditMode && !errorMessage) {\n <div class=\"viewer-header editing\">\n <div class=\"header-left\">\n <button class=\"btn-add-part\" (click)=\"openAddPartDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Part\n </button>\n <div class=\"header-separator\"></div>\n <div class=\"dashboard-info-edit\">\n <input\n type=\"text\"\n class=\"dashboard-name-input\"\n [(ngModel)]=\"editingName\"\n placeholder=\"Dashboard name\">\n <input\n type=\"text\"\n class=\"dashboard-description-input\"\n [(ngModel)]=\"editingDescription\"\n placeholder=\"Add a description...\">\n </div>\n </div>\n <div class=\"header-right\">\n <button class=\"btn-primary\" (click)=\"saveDashboard()\">\n <i class=\"fa-solid fa-save\"></i>\n Save\n </button>\n <button class=\"btn-cancel\" (click)=\"cancelEdit()\">\n Cancel\n </button>\n </div>\n </div>\n }\n\n <!-- Dashboard Content Container -->\n <div #container class=\"dashboard-resource-container\"></div>\n\n <!-- Share Dashboard Dialog -->\n @if (configDashboard) {\n <mj-dashboard-share-dialog\n [Visible]=\"showShareDialog\"\n [Dashboard]=\"configDashboard\"\n (Result)=\"onShareDialogResult($event)\">\n </mj-dashboard-share-dialog>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n }\n .dashboard-resource-wrapper {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n }\n .dashboard-resource-container {\n flex: 1;\n overflow: hidden;\n min-height: 0;\n }\n\n /* View Mode Toolbar */\n .viewer-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n gap: 16px;\n }\n .viewer-toolbar .toolbar-left {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n .viewer-toolbar .dashboard-title {\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .viewer-toolbar .dashboard-title i {\n color: var(--mj-brand-primary);\n }\n .shared-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 11px;\n }\n .viewer-toolbar .toolbar-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n /* Edit Mode Header */\n .viewer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.2s, border-color 0.2s;\n }\n .viewer-header.editing {\n background: linear-gradient(135deg, color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)) 0%, color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface)) 100%);\n border-bottom: 2px solid var(--mj-brand-primary);\n }\n .viewer-header .header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n }\n .viewer-header .header-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n /* Add Part button */\n .btn-add-part {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s, transform 0.1s;\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n .btn-add-part:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 3px 6px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n }\n .btn-add-part i { font-size: 12px; }\n\n /* Header separator */\n .header-separator {\n width: 1px;\n height: 28px;\n background: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n margin: 0 4px;\n }\n\n /* Buttons */\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n .btn-primary:hover { background: var(--mj-brand-primary-hover); }\n\n .btn-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n .btn-icon:hover { background: var(--mj-bg-surface-sunken); }\n\n .btn-cancel {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n }\n .btn-cancel:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-default);\n color: var(--mj-text-primary);\n }\n\n /* Dashboard info inputs */\n .dashboard-info-edit {\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n }\n .dashboard-name-input {\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 6px 12px;\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-primary);\n background: rgba(255, 255, 255, 0.7);\n outline: none;\n min-width: 200px;\n max-width: 300px;\n transition: border-color 0.2s, background 0.2s, box-shadow 0.2s;\n }\n .dashboard-name-input:hover { background: rgba(255, 255, 255, 0.9); }\n .dashboard-name-input:focus {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n }\n .dashboard-description-input {\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 6px 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n background: rgba(255, 255, 255, 0.5);\n outline: none;\n flex: 1;\n min-width: 150px;\n max-width: 400px;\n transition: border-color 0.2s, background 0.2s, box-shadow 0.2s;\n }\n .dashboard-description-input:hover { background: rgba(255, 255, 255, 0.8); }\n .dashboard-description-input:focus {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n }\n .dashboard-description-input::placeholder {\n color: var(--mj-text-muted);\n font-style: normal;\n }\n\n /* Error state */\n .error-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 40px;\n text-align: center;\n color: var(--mj-text-secondary);\n }\n .error-icon {\n font-size: 64px;\n color: var(--mj-status-error);\n margin-bottom: 24px;\n opacity: 0.8;\n }\n .error-title {\n font-size: 24px;\n font-weight: 500;\n margin: 0 0 12px 0;\n color: var(--mj-text-primary);\n }\n .error-message {\n font-size: 16px;\n color: var(--mj-text-muted);\n margin: 0 0 24px 0;\n max-width: 500px;\n line-height: 1.5;\n }\n .error-details {\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 12px 16px;\n max-width: 600px;\n text-align: left;\n font-size: 13px;\n }\n .error-details summary {\n cursor: pointer;\n font-weight: 500;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n }\n .error-details pre {\n margin: 0;\n white-space: pre-wrap;\n word-break: break-word;\n color: var(--mj-status-error-text);\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 12px;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .viewer-header {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n .viewer-header .header-left { flex-wrap: wrap; }\n .dashboard-info-edit {\n flex-direction: column;\n align-items: stretch;\n }\n .dashboard-name-input,\n .dashboard-description-input { max-width: none; }\n }\n `]\n})\nexport class DashboardResource extends BaseResourceComponent {\n private componentRef: ComponentRef<unknown> | null = null;\n private dataLoaded = false;\n @ViewChild('container', { static: true }) containerElement!: ElementRef<HTMLDivElement>;\n\n /** Error message to display when dashboard fails to load */\n public errorMessage: string | null = null;\n /** Technical error details (shown in expandable section) */\n public errorDetails: string | null = null;\n\n /** Cached dashboard categories for breadcrumb navigation */\n private categories: MJDashboardCategoryEntity[] = [];\n\n /** Reference to the dashboard viewer component (for config-based dashboards) */\n private viewerInstance: DashboardViewerComponent | null = null;\n\n /** The config-based dashboard entity (null for code-based dashboards) */\n public configDashboard: MJDashboardEntity | null = null;\n\n /** Whether we're in edit mode */\n public isEditMode = false;\n\n /** Editing fields */\n public editingName = '';\n public editingDescription = '';\n\n /** Current user's permissions for this dashboard */\n public dashboardPermissions: DashboardUserPermissions = {\n DashboardID: '',\n CanRead: true,\n CanEdit: true,\n CanDelete: true,\n CanShare: true,\n IsOwner: true,\n PermissionSource: 'owner'\n };\n\n /** Whether the share dialog is visible */\n public showShareDialog = false;\n\n /**\n * Sets the error state with a user-friendly message and optional technical details\n */\n private setError(message: string, error?: unknown): void {\n this.errorMessage = message;\n if (error instanceof Error) {\n this.errorDetails = error.message;\n if (error.stack) {\n this.errorDetails += '\\n\\nStack trace:\\n' + error.stack;\n }\n } else if (error) {\n this.errorDetails = String(error);\n }\n }\n\n /**\n * Clears any previous error state\n */\n private clearError(): void {\n this.errorMessage = null;\n this.errorDetails = null;\n }\n\n constructor(\n private viewContainer: ViewContainerRef,\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n override set Data(value: ResourceData) {\n const previousRecordId = super.Data?.ResourceRecordID;\n super.Data = value;\n\n const newRecordId = value?.ResourceRecordID;\n\n // Load on first set, or when the dashboard has changed\n if (!this.dataLoaded || newRecordId !== previousRecordId) {\n this.dataLoaded = true;\n // Destroy previous component before loading new one\n if (this.componentRef) {\n this.componentRef.destroy();\n this.componentRef = null;\n }\n this.clearError();\n this.configDashboard = null;\n this.viewerInstance = null;\n this.loadDashboard();\n }\n }\n\n // Need to override the getter too in TS otherwise the override to the setter alone above would break things\n override get Data(): ResourceData {\n return super.Data;\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n if (this.componentRef) {\n this.componentRef.destroy();\n }\n }\n\n // ========================================\n // Edit Mode Methods\n // ========================================\n\n /**\n * Toggle between view and edit mode\n */\n public toggleEditMode(): void {\n if (this.isEditMode) {\n this.cancelEdit();\n } else {\n this.enterEditMode();\n }\n }\n\n /**\n * Enter edit mode\n */\n private enterEditMode(): void {\n if (!this.configDashboard) return;\n\n this.isEditMode = true;\n this.editingName = this.configDashboard.Name;\n this.editingDescription = this.configDashboard.Description || '';\n\n // Tell the viewer to enter edit mode\n if (this.viewerInstance) {\n this.viewerInstance.isEditing = true;\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Cancel edit mode and discard changes\n */\n public cancelEdit(): void {\n this.isEditMode = false;\n\n // Tell the viewer to exit edit mode\n if (this.viewerInstance) {\n this.viewerInstance.isEditing = false;\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Save dashboard changes\n */\n public async saveDashboard(): Promise<void> {\n if (!this.configDashboard || !this.viewerInstance) return;\n\n try {\n // Update dashboard name and description\n this.configDashboard.Name = this.editingName;\n this.configDashboard.Description = this.editingDescription;\n\n // Save via the viewer (which handles layout saving)\n await this.viewerInstance.save();\n\n // Exit edit mode\n this.isEditMode = false;\n this.viewerInstance.isEditing = false;\n\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Error saving dashboard:', error);\n }\n }\n\n /**\n * Open the add panel dialog\n */\n public openAddPartDialog(): void {\n if (this.viewerInstance) {\n // Trigger the viewer's add panel flow\n this.viewerInstance.onAddPanelClick();\n }\n }\n\n /**\n * Open the share dialog for this dashboard\n */\n public openShareDialog(): void {\n this.showShareDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Close the share dialog\n */\n public closeShareDialog(): void {\n this.showShareDialog = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle share dialog result\n */\n public onShareDialogResult(result: ShareDialogResult): void {\n this.showShareDialog = false;\n\n if (result.Action === 'save' && this.configDashboard) {\n // Recompute permissions after sharing changes\n const md = this.ProviderToUse;\n this.dashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n this.configDashboard.ID,\n md.CurrentUser.ID\n );\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Load the appropriate dashboard component based on dashboard type\n * Routes between code-based dashboards (registered classes) and config-based dashboards\n */\n private async loadDashboard(): Promise<void> {\n // Clear any previous error state\n this.clearError();\n\n const data = this.Data;\n\n if (!data?.ResourceRecordID) {\n this.NotifyLoadStarted();\n this.NotifyLoadComplete();\n return;\n }\n\n this.NotifyLoadStarted();\n\n try {\n // Check if this is a special dashboard type (not a database record)\n const config = data.Configuration || {};\n\n if (config['dashboardType'] === 'DataExplorer' || data.ResourceRecordID === 'DataExplorer') {\n // Special case: Data Explorer dashboard with optional entity filter\n await this.loadDataExplorer(\n config['entityFilter'],\n config['appName'] as string | undefined,\n config['appIcon'] as string | undefined\n );\n return;\n }\n\n await DashboardEngine.Instance.Config(false); // make sure it is configured, if already configured does nothing\n const dashboard = DashboardEngine.Instance.Dashboards.find(d => UUIDsEqual(d.ID, data.ResourceRecordID));\n if (!dashboard) {\n throw new Error(`Dashboard with ID ${data.ResourceRecordID} not found.`);\n }\n\n // Determine which dashboard component to load based on dashboard type\n if (dashboard.Type === 'Code') {\n // CODE-BASED DASHBOARD: Use registered class via DriverClass\n await this.loadCodeBasedDashboard(dashboard);\n } else {\n // CONFIG-BASED DASHBOARD: Use the generic metadata-driven renderer\n await this.loadConfigBasedDashboard(dashboard);\n }\n } catch (error) {\n console.error('Error loading dashboard:', error);\n this.setError('The dashboard could not be loaded. This may be due to a missing component or configuration issue.', error);\n this.NotifyLoadComplete();\n }\n }\n\n /**\n * Load the Data Explorer dashboard component with optional entity filter and context info\n * @param entityFilter Optional filter to constrain which entities are shown\n * @param contextName Optional name to display in the header (e.g., \"CRM\", \"Association Demo\")\n * @param contextIcon Optional Font Awesome icon class for the header\n */\n private async loadDataExplorer(\n entityFilter?: DataExplorerFilter,\n contextName?: string,\n contextIcon?: string\n ): Promise<void> {\n try {\n // Lazy-load the Data Explorer component to keep it out of the initial bundle\n const { DataExplorerDashboardComponent } = await import('@memberjunction/ng-dashboards/data-explorer-dashboards.module');\n this.containerElement.nativeElement.innerHTML = '';\n const componentRef = this.viewContainer.createComponent(DataExplorerDashboardComponent);\n this.componentRef = componentRef;\n const instance = componentRef.instance;\n\n // Set the entity filter - ngOnInit will use this when it runs\n if (entityFilter) {\n instance.entityFilter = entityFilter;\n }\n\n // Set context name and icon for customized header display\n if (contextName) {\n instance.contextName = contextName;\n }\n if (contextIcon) {\n instance.contextIcon = contextIcon;\n }\n\n // Manually append the component's native element inside the div\n const nativeElement = (componentRef.hostView as any).rootNodes[0];\n nativeElement.style.width = '100%';\n nativeElement.style.height = '100%';\n this.containerElement.nativeElement.appendChild(nativeElement);\n\n // Handle open entity record events\n instance.OpenEntityRecord.subscribe((eventData: { EntityName: string; RecordPKey: CompositeKey }) => {\n if (eventData && eventData.EntityName && eventData.RecordPKey) {\n this.navigationService.OpenEntityRecord(eventData.EntityName, eventData.RecordPKey);\n }\n });\n\n // Setup LoadCompleteEvent to know when the dashboard is ready\n instance.LoadCompleteEvent = () => {\n this.NotifyLoadComplete();\n };\n\n // Initialize dashboard (no database config needed for DataExplorer)\n const config: DashboardConfig = {\n dashboard: null as unknown as MJDashboardEntity, // No database record\n userState: {}\n };\n instance.Config = config;\n instance.Refresh();\n\n // Trigger change detection to ensure the component updates\n componentRef.changeDetectorRef.detectChanges();\n } catch (error) {\n console.error('Error loading Data Explorer:', error);\n this.setError('The Data Explorer could not be loaded.', error);\n this.NotifyLoadComplete();\n }\n }\n\n /**\n * Load a code-based dashboard by looking up the registered class\n */\n private async loadCodeBasedDashboard(dashboard: MJDashboardEntity): Promise<void> {\n try {\n if (!dashboard.DriverClass) {\n throw new Error(`Dashboard '${dashboard.Name}' is marked as Code type but has no DriverClass specified`);\n }\n\n // Look up the registered class using the DriverClass name (with lazy loading fallback via ClassFactory)\n const classReg = await MJGlobal.Instance.ClassFactory.GetRegistrationAsync(\n BaseDashboard,\n dashboard.DriverClass\n );\n\n if (!classReg?.SubClass) {\n throw new Error(`Dashboard class '${dashboard.DriverClass}' is not registered. Please check the class registration.`);\n }\n\n // Create the component instance\n this.containerElement.nativeElement.innerHTML = '';\n this.componentRef = this.viewContainer.createComponent<BaseDashboard>(classReg.SubClass);\n const instance = this.componentRef.instance as BaseDashboard;\n\n // Setup LoadCompleteEvent() to know when the dashboard is ready\n instance.LoadCompleteEvent = () => {\n this.NotifyLoadComplete();\n };\n\n // Initialize with dashboard data\n const userStateEntity = await this.loadDashboardUserState(dashboard.ID);\n const config: DashboardConfig = {\n dashboard,\n userState: userStateEntity.UserState ? SafeJSONParse(userStateEntity.UserState) : {}\n };\n\n instance.Config = config;\n\n // Manually append the component's native element inside the div\n const nativeElement = (this.componentRef.hostView as any).rootNodes[0];\n nativeElement.style.width = '100%';\n nativeElement.style.height = '100%';\n this.containerElement.nativeElement.appendChild(nativeElement);\n\n // handle open entity record events in MJ Explorer with routing\n instance.OpenEntityRecord.subscribe((data: { EntityName: string; RecordPKey: CompositeKey }) => {\n // check to see if the data has entityname/pkey\n if (data && data.EntityName && data.RecordPKey) {\n // Use NavigationService to open entity record in new tab\n this.navigationService.OpenEntityRecord(data.EntityName, data.RecordPKey);\n } else {\n console.warn('DashboardResource - invalid data, missing EntityName or RecordPKey:', data);\n }\n });\n\n instance.UserStateChanged.subscribe(async (userState: any) => {\n if (!userState) {\n // if the user state is null, we need to remove it from the user state\n userState = {};\n }\n // save the user state to the dashboard user state entity\n userStateEntity.UserState = JSON.stringify(userState);\n if (!await userStateEntity.Save()) {\n LogError('Error saving user state', null, userStateEntity.LatestResult?.CompleteMessage);\n }\n });\n\n instance.Refresh();\n } catch (error) {\n console.error('Error loading code-based dashboard:', error);\n this.setError(`The dashboard \"${dashboard.Name}\" could not be loaded. The dashboard class may not be registered or may have failed to initialize.`, error);\n this.NotifyLoadComplete();\n }\n }\n\n protected async loadDashboardUserState(dashboardId: string): Promise<MJDashboardUserStateEntity> {\n // handle user state changes for the dashboard\n const md = this.ProviderToUse;\n const stateResult = DashboardEngine.Instance.DashboardUserStates.filter(dus => UUIDsEqual(dus.DashboardID, dashboardId) && UUIDsEqual(dus.UserID, md.CurrentUser.ID));\n let stateObject: MJDashboardUserStateEntity;\n if (stateResult && stateResult.length > 0) {\n stateObject = stateResult[0];\n }\n else {\n stateObject = await md.GetEntityObject<MJDashboardUserStateEntity>('MJ: Dashboard User States');\n stateObject.DashboardID = dashboardId;\n stateObject.UserID = md.CurrentUser.ID;\n // don't save becuase we don't care about the state until something changes\n }\n return stateObject;\n }\n\n /**\n * Load a config-based dashboard using the new DashboardViewerComponent (Golden Layout)\n */\n private async loadConfigBasedDashboard(dashboard: MJDashboardEntity): Promise<void> {\n try {\n this.containerElement.nativeElement.innerHTML = '';\n const componentRef = this.viewContainer.createComponent(DashboardViewerComponent);\n this.componentRef = componentRef;\n const instance = componentRef.instance;\n\n // Store references for external toolbar control\n this.viewerInstance = instance;\n this.configDashboard = dashboard;\n\n // Compute user permissions for this dashboard\n const md = this.ProviderToUse;\n this.dashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n // Manually append the component's native element inside the div\n const nativeElement = (this.componentRef.hostView as any).rootNodes[0];\n nativeElement.style.width = '100%';\n nativeElement.style.height = '100%';\n this.containerElement.nativeElement.appendChild(nativeElement);\n\n // Load categories for breadcrumb navigation (if not already loaded)\n if (this.categories.length === 0) {\n this.categories = DashboardEngine.Instance.DashboardCategories;\n }\n\n // Set the dashboard entity directly on the viewer\n // We provide our own external toolbar, so disable the viewer's internal toolbar\n instance.dashboard = dashboard;\n instance.showToolbar = false; // We provide external toolbar\n instance.showBreadcrumb = false; // Already in its own tab, no breadcrumb needed\n instance.showOpenInTabButton = false; // Already in its own tab\n instance.showEditButton = false; // External toolbar handles edit\n instance.Categories = this.categories;\n\n // Wire up navigation events - handle navigation requests from the dashboard\n instance.navigationRequested.subscribe((event: DashboardNavRequestEvent) => {\n this.handleNavigationRequest(event);\n });\n\n // Wire up \"Open in Tab\" button click\n instance.openInTab.subscribe((event: { dashboardId: string; dashboardName: string }) => {\n this.navigationService.OpenDashboard(event.dashboardId, event.dashboardName);\n });\n\n // Wire up dashboard saved event\n instance.dashboardSaved.subscribe((savedDashboard: MJDashboardEntity) => {\n this.ResourceRecordSaved(savedDashboard);\n });\n\n // Wire up error events\n instance.error.subscribe((errorEvent: { message: string; error?: Error }) => {\n console.error('Dashboard error:', errorEvent.message, errorEvent.error);\n });\n\n // Notify load complete after a brief delay to let Golden Layout initialize\n setTimeout(() => {\n this.NotifyLoadComplete();\n this.cdr.detectChanges();\n }, 150);\n\n } catch (error) {\n console.error('Error loading config-based dashboard:', error);\n this.setError(`The dashboard \"${dashboard.Name}\" could not be loaded. There may be an issue with the dashboard configuration.`, error);\n this.NotifyLoadComplete();\n }\n }\n\n /**\n * Handle navigation requests from the dashboard viewer\n */\n private handleNavigationRequest(event: DashboardNavRequestEvent): void {\n const request = event.request;\n\n switch (request.type) {\n case 'OpenEntityRecord': {\n const entityRequest = request as { type: 'OpenEntityRecord'; entityName: string; recordId: string };\n // `recordId` is documented as URL-segment format (see OpenEntityRecordNavRequest in\n // @memberjunction/ng-dashboard-viewer). E.g. a single-PK record is `\"ID|11055\"`; a\n // composite-PK record is `\"Field1|Value1||Field2|Value2\"`. Senders in\n // dashboard-viewer (artifact-part, view-part) intentionally call\n // `compositeKey.ToURLSegment()` to produce this shape.\n //\n // Wrapping that string verbatim into `{ FieldName: 'ID', Value: <segment> }` makes\n // ToURLSegment serialize it a second time as `ID|<segment>` and produces a\n // malformed `Field|Field|Value` URL the host parser silently mis-reads (manifesting\n // downstream as `BaseEntity.Load(... Key: ID=ID)` and `Primary Key value is not a\n // valid number`). Parse the segment with `LoadFromURLSegment` against the entity's\n // PK metadata instead, so single-PK and composite-PK both round-trip correctly.\n const md = this.ProviderToUse;\n const entityInfo = md.EntityByName(entityRequest.entityName);\n const pkey = new CompositeKey();\n if (entityInfo) {\n pkey.LoadFromURLSegment(entityInfo, entityRequest.recordId);\n } else {\n // Last-resort fallback when entity metadata isn't resolvable — preserves\n // pre-fix behavior so we don't NRE on an unknown entity name.\n pkey.KeyValuePairs = [{ FieldName: 'ID', Value: entityRequest.recordId }];\n }\n this.navigationService.OpenEntityRecord(entityRequest.entityName, pkey);\n break;\n }\n case 'OpenDashboard': {\n const dashRequest = request as { type: 'OpenDashboard'; dashboardId: string };\n // Load dashboard name from engine cache\n const targetDashboard = DashboardEngine.Instance.Dashboards.find(d => UUIDsEqual(d.ID, dashRequest.dashboardId));\n const name = targetDashboard?.Name || 'Dashboard';\n this.navigationService.OpenDashboard(dashRequest.dashboardId, name);\n break;\n }\n case 'OpenQuery': {\n const queryRequest = request as { type: 'OpenQuery'; queryId: string };\n this.navigationService.OpenQuery(queryRequest.queryId, 'Query');\n break;\n }\n default:\n console.warn('Unhandled navigation request type:', request.type);\n }\n }\n\n /**\n * Get the display name for a dashboard resource\n * Loads the actual dashboard name from the database if available\n */\n override async GetResourceDisplayName(data: ResourceData): Promise<string> {\n try {\n // Try to load dashboard metadata if we have the record ID\n if (data.ResourceRecordID && data.ResourceRecordID.length > 0) {\n const md = this.ProviderToUse;\n const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: data.ResourceRecordID }]);\n const name = await md.GetEntityRecordName('Dashboards', compositeKey);\n if (name) {\n return name;\n }\n }\n } catch (error) {\n // Silently fail and use fallback\n }\n\n // Fallback: use provided name or generic label\n return data.Name || 'Dashboard';\n }\n\n /**\n * Get the icon class for dashboard resources\n */\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-table-columns';\n }\n}\n"]}
@@ -4,6 +4,7 @@ import { ResourceData, MJUserViewEntityExtended } from '@memberjunction/core-ent
4
4
  import { EntityInfo } from '@memberjunction/core';
5
5
  import { RecordOpenedEvent, ViewGridState, EntityViewerComponent, EntityViewMode } from '@memberjunction/ng-entity-viewer';
6
6
  import { ExportService } from '@memberjunction/ng-export-service';
7
+ import type { SaveViewAsListResult } from '@memberjunction/ng-list-management';
7
8
  import * as i0 from "@angular/core";
8
9
  /**
9
10
  * UserViewResource - Resource wrapper for displaying User Views in tabs
@@ -32,6 +33,9 @@ export declare class UserViewResource extends BaseResourceComponent {
32
33
  /** Map render mode from dashboard configuration */
33
34
  configuredMapRenderMode: 'point' | 'choropleth' | 'heatmap';
34
35
  isExporting: boolean;
36
+ saveAsListDialogVisible: boolean;
37
+ saveAsListRecordCount: number | null;
38
+ isSavingAsList: boolean;
35
39
  private dataLoaded;
36
40
  private get metadata();
37
41
  constructor(cdr: ChangeDetectorRef, exportService: ExportService);
@@ -73,6 +77,14 @@ export declare class UserViewResource extends BaseResourceComponent {
73
77
  * Handle export to Excel request
74
78
  */
75
79
  onExport(): Promise<void>;
80
+ /**
81
+ * Open the Save-as-List dialog. Only meaningful for saved views (a
82
+ * ViewID is required to materialize). Dynamic views fall back to a
83
+ * user-visible notification rather than silently doing nothing.
84
+ */
85
+ onSaveAsList(): void;
86
+ onSaveAsListCancelled(): void;
87
+ onSaveAsListSubmit(payload: SaveViewAsListResult): Promise<void>;
76
88
  /**
77
89
  * Load all records for the current view/entity for export
78
90
  */
@@ -1 +1 @@
1
- {"version":3,"file":"view-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/view-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAY,MAAM,+BAA+B,CAAC;AAEjG,OAAO,EAA0B,UAAU,EAAW,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAC3H,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;;AAElE;;;;;;;;;;;GAWG;AACH,qBAmHa,gBAAiB,SAAQ,qBAAqB;IAsBnD,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,aAAa;IAtBiB,gBAAgB,EAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC7D,eAAe,CAAC,EAAE,qBAAqB,CAAC;IAE5D,SAAS,EAAE,OAAO,CAAS;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IACnC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAQ;IACrC,UAAU,EAAE,wBAAwB,GAAG,IAAI,CAAQ;IACnD,SAAS,EAAE,aAAa,GAAG,IAAI,CAAQ;IAE9C,uEAAuE;IAChE,kBAAkB,EAAE,cAAc,GAAG,IAAI,CAAQ;IAExD,mDAAmD;IAC5C,uBAAuB,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAAW;IAGtE,WAAW,EAAE,OAAO,CAAS;IAEpC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,KAAK,QAAQ,GAAiC;gBAEzC,GAAG,EAAE,iBAAiB,EACtB,aAAa,EAAE,aAAa;IAKxC,IAAa,IAAI,CAAC,KAAK,EAAE,YAAY,EAiCpC;IAED,IAAa,IAAI,IAAI,YAAY,CAEhC;IAED;;OAEG;YACW,QAAQ;IA2CtB;;OAEG;YACW,YAAY;IAmC1B;;OAEG;YACW,eAAe;IAiB7B;;OAEG;IACI,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAMrD;;OAEG;IACI,YAAY,IAAI,IAAI;IAI3B;;OAEG;IACY,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAc1E;;OAEG;IACY,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAIzE;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAOhC;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAuCtC;;OAEG;YACW,cAAc;IAyB5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;yCA3Uf,gBAAgB;2CAAhB,gBAAgB;CAuV5B"}
1
+ {"version":3,"file":"view-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/view-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAY,MAAM,+BAA+B,CAAC;AAEjG,OAAO,EAA0B,UAAU,EAAW,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAC3H,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAGlE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;;AAC/E;;;;;;;;;;;GAWG;AACH,qBAmHa,gBAAiB,SAAQ,qBAAqB;IA2BnD,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,aAAa;IA3BiB,gBAAgB,EAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC7D,eAAe,CAAC,EAAE,qBAAqB,CAAC;IAE5D,SAAS,EAAE,OAAO,CAAS;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IACnC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAQ;IACrC,UAAU,EAAE,wBAAwB,GAAG,IAAI,CAAQ;IACnD,SAAS,EAAE,aAAa,GAAG,IAAI,CAAQ;IAE9C,uEAAuE;IAChE,kBAAkB,EAAE,cAAc,GAAG,IAAI,CAAQ;IAExD,mDAAmD;IAC5C,uBAAuB,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAAW;IAGtE,WAAW,EAAE,OAAO,CAAS;IAG7B,uBAAuB,UAAS;IAChC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5C,cAAc,UAAS;IAE9B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,KAAK,QAAQ,GAAiC;gBAEzC,GAAG,EAAE,iBAAiB,EACtB,aAAa,EAAE,aAAa;IAKxC,IAAa,IAAI,CAAC,KAAK,EAAE,YAAY,EAiCpC;IAED,IAAa,IAAI,IAAI,YAAY,CAEhC;IAED;;OAEG;YACW,QAAQ;IA2CtB;;OAEG;YACW,YAAY;IAmC1B;;OAEG;YACW,eAAe;IAiB7B;;OAEG;IACI,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAMrD;;OAEG;IACI,YAAY,IAAI,IAAI;IAI3B;;OAEG;IACY,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAc1E;;OAEG;IACY,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAIzE;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAOhC;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAuCtC;;;;OAIG;IACI,YAAY,IAAI,IAAI;IAapB,qBAAqB,IAAI,IAAI;IAKvB,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoC7E;;OAEG;YACW,cAAc;IAyB5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;yCA3Yf,gBAAgB;2CAAhB,gBAAgB;CAuZ5B"}