@memberjunction/ng-explorer-core 5.37.0 → 5.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/generated/lazy-feature-config.d.ts +1 -1
  2. package/dist/generated/lazy-feature-config.d.ts.map +1 -1
  3. package/dist/generated/lazy-feature-config.js +4 -2
  4. package/dist/generated/lazy-feature-config.js.map +1 -1
  5. package/dist/lib/__tests__/form-resolver.service.test.d.ts +2 -0
  6. package/dist/lib/__tests__/form-resolver.service.test.d.ts.map +1 -0
  7. package/dist/lib/__tests__/form-resolver.service.test.js +258 -0
  8. package/dist/lib/__tests__/form-resolver.service.test.js.map +1 -0
  9. package/dist/lib/resource-wrappers/artifact-resource.component.d.ts +10 -0
  10. package/dist/lib/resource-wrappers/artifact-resource.component.d.ts.map +1 -1
  11. package/dist/lib/resource-wrappers/artifact-resource.component.js +15 -5
  12. package/dist/lib/resource-wrappers/artifact-resource.component.js.map +1 -1
  13. package/dist/lib/resource-wrappers/record-resource.component.d.ts.map +1 -1
  14. package/dist/lib/resource-wrappers/record-resource.component.js +22 -6
  15. package/dist/lib/resource-wrappers/record-resource.component.js.map +1 -1
  16. package/dist/lib/services/form-resolver.service.d.ts +139 -0
  17. package/dist/lib/services/form-resolver.service.d.ts.map +1 -0
  18. package/dist/lib/services/form-resolver.service.js +235 -0
  19. package/dist/lib/services/form-resolver.service.js.map +1 -0
  20. package/dist/lib/shell/components/header/app-nav.component.d.ts.map +1 -1
  21. package/dist/lib/shell/components/header/app-nav.component.js +12 -0
  22. package/dist/lib/shell/components/header/app-nav.component.js.map +1 -1
  23. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts +24 -5
  24. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts.map +1 -1
  25. package/dist/lib/shell/components/tabs/component-cache-manager.js +58 -14
  26. package/dist/lib/shell/components/tabs/component-cache-manager.js.map +1 -1
  27. package/dist/lib/shell/components/tabs/tab-container.component.d.ts +42 -0
  28. package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
  29. package/dist/lib/shell/components/tabs/tab-container.component.js +186 -12
  30. package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
  31. package/dist/lib/single-record/single-record.component.d.ts +41 -3
  32. package/dist/lib/single-record/single-record.component.d.ts.map +1 -1
  33. package/dist/lib/single-record/single-record.component.js +192 -23
  34. package/dist/lib/single-record/single-record.component.js.map +1 -1
  35. package/package.json +46 -45
@@ -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 = 98;
18
+ export declare const LAZY_FEATURE_CONFIG_COUNT = 100;
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,CAmInE,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,CAqInE,CAAC;AAEF,eAAO,MAAM,yBAAyB,MAAM,CAAC"}
@@ -20,7 +20,7 @@ const loadActionsDashboardsModule = featureLoader(() => import('@memberjunction/
20
20
  const loadAiDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/ai-dashboards.module'));
21
21
  // --- @memberjunction/ng-dashboards → ./communication-dashboards.module (7 entries) ---
22
22
  const loadCommunicationDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/communication-dashboards.module'));
23
- // --- @memberjunction/ng-dashboards → ./component-studio-dashboards.module (1 entries) ---
23
+ // --- @memberjunction/ng-dashboards → ./component-studio-dashboards.module (3 entries) ---
24
24
  const loadComponentStudioDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/component-studio-dashboards.module'));
25
25
  // --- @memberjunction/ng-dashboards → ./core-dashboards.module (26 entries) ---
26
26
  const loadCoreDashboardsModule = featureLoader(() => import('@memberjunction/ng-dashboards/core-dashboards.module'));
@@ -85,6 +85,8 @@ export const LAZY_FEATURE_CONFIG = {
85
85
  'BaseResourceComponent::CommunicationTemplatesResource': loadCommunicationDashboardsModule,
86
86
  // @memberjunction/ng-dashboards → ./component-studio-dashboards.module
87
87
  'BaseDashboard::ComponentStudioDashboard': loadComponentStudioDashboardsModule,
88
+ 'BaseResourceComponent::ComponentStudioResource': loadComponentStudioDashboardsModule,
89
+ 'BaseResourceComponent::FormBuilderResource': loadComponentStudioDashboardsModule,
88
90
  // @memberjunction/ng-dashboards → ./core-dashboards.module
89
91
  'BaseApplication::HomeApplication': loadCoreDashboardsModule,
90
92
  'BaseDashboard::EntityAdmin': loadCoreDashboardsModule,
@@ -166,5 +168,5 @@ export const LAZY_FEATURE_CONFIG = {
166
168
  // @memberjunction/ng-react → .
167
169
  'RuntimeUtilities::RuntimeUtilities': loadNgReact,
168
170
  };
169
- export const LAZY_FEATURE_CONFIG_COUNT = 98;
171
+ export const LAZY_FEATURE_CONFIG_COUNT = 100;
170
172
  //# 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":"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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
+ {"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 (3 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 'BaseResourceComponent::ComponentStudioResource': loadComponentStudioDashboardsModule,\n 'BaseResourceComponent::FormBuilderResource': 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 = 100;\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=form-resolver.service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-resolver.service.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/form-resolver.service.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,258 @@
1
+ /**
2
+ * Tests for FormResolverService.
3
+ *
4
+ * The service builds a SQL filter + ORDER BY against `EntityFormOverride`,
5
+ * runs it via RunView, and falls back to ClassFactory when no override matches.
6
+ * These tests capture the RunView call args (to validate filter shape) and
7
+ * stub responses to verify each resolution branch.
8
+ */
9
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
10
+ // ----- Module mocks -------------------------------------------------------
11
+ // Mock UserInfoEngine — the resolver's variant preferences now persist via
12
+ // the user-settings table (cross-device, cross-browser) instead of
13
+ // localStorage. In-memory map mirrors the engine's cache behavior.
14
+ const settingsBacking = {};
15
+ vi.mock('@memberjunction/core-entities', () => ({
16
+ UserInfoEngine: {
17
+ Instance: {
18
+ GetSetting: (key) => settingsBacking[key],
19
+ SetSettingDebounced: (key, value) => {
20
+ settingsBacking[key] = value;
21
+ },
22
+ DeleteSetting: async (key) => {
23
+ delete settingsBacking[key];
24
+ return true;
25
+ },
26
+ },
27
+ },
28
+ }));
29
+ vi.mock('@angular/core', () => ({
30
+ Injectable: () => (target) => target,
31
+ }));
32
+ // RunView mock — we capture every call's params so tests can assert on them.
33
+ const runViewCalls = [];
34
+ let runViewResponse = { Success: true, Results: [] };
35
+ vi.mock('@memberjunction/core', () => ({
36
+ LogError: vi.fn(),
37
+ RunView: class {
38
+ static FromMetadataProvider(_provider) {
39
+ return new (class {
40
+ async RunView(params, user) {
41
+ runViewCalls.push({ params, user });
42
+ return runViewResponse;
43
+ }
44
+ })();
45
+ }
46
+ },
47
+ }));
48
+ // ClassFactory mock — controls what the fallback branch returns.
49
+ let classFactoryReg = null;
50
+ vi.mock('@memberjunction/global', () => ({
51
+ MJGlobal: {
52
+ Instance: {
53
+ ClassFactory: {
54
+ GetRegistration: vi.fn(() => classFactoryReg),
55
+ },
56
+ },
57
+ },
58
+ // The post-refactor resolver uses UUIDsEqual to match a user-selected
59
+ // variant ID; stub it with a case-insensitive string compare.
60
+ UUIDsEqual: (a, b) => (a ?? '').toLowerCase() === (b ?? '').toLowerCase(),
61
+ }));
62
+ vi.mock('@memberjunction/ng-base-forms', () => ({
63
+ BaseFormComponent: class FakeBaseFormComponent {
64
+ },
65
+ }));
66
+ const entity = { ID: 'entity-1', Name: 'Customer' };
67
+ const user = (overrides) => ({ ID: 'user-1', UserRoles: [], ...overrides });
68
+ const provider = {};
69
+ const overrideRow = (overrides) => ({
70
+ ID: 'row-1', EntityID: 'entity-1', ComponentID: 'comp-1',
71
+ Scope: 'Global', UserID: null, RoleID: null,
72
+ Priority: 0, Status: 'Active', ...overrides,
73
+ });
74
+ let service;
75
+ beforeEach(async () => {
76
+ runViewCalls.length = 0;
77
+ runViewResponse = { Success: true, Results: [] };
78
+ classFactoryReg = null;
79
+ for (const k of Object.keys(settingsBacking))
80
+ delete settingsBacking[k];
81
+ vi.clearAllMocks();
82
+ const mod = await import('../services/form-resolver.service');
83
+ service = new mod.FormResolverService();
84
+ });
85
+ // ----- Tests --------------------------------------------------------------
86
+ describe('FormResolverService.ResolveFormForEntity', () => {
87
+ it('returns kind=interactive when an override matches', async () => {
88
+ runViewResponse = { Success: true, Results: [overrideRow({})] };
89
+ const result = await service.ResolveFormForEntity(entity, user({}), provider);
90
+ expect(result.kind).toBe('interactive');
91
+ if (result.kind === 'interactive') {
92
+ expect(result.override.ComponentID).toBe('comp-1');
93
+ }
94
+ });
95
+ it('passes only "MJ: Entity Form Overrides" to RunView', async () => {
96
+ await service.ResolveFormForEntity(entity, user({}), provider);
97
+ expect(runViewCalls[0].params.EntityName).toBe('MJ: Entity Form Overrides');
98
+ });
99
+ it('filters by the entity ID and does NOT filter by Status (returns full variant list)', async () => {
100
+ // Post-refactor: the resolver lists ALL applicable variants (any
101
+ // Status) so the variant switcher can show Pending / Inactive
102
+ // alongside Active. The Active pick happens in-memory via pickActive.
103
+ await service.ResolveFormForEntity(entity, user({}), provider);
104
+ const filter = runViewCalls[0].params.ExtraFilter;
105
+ expect(filter).toContain(`EntityID='entity-1'`);
106
+ expect(filter).not.toContain(`Status='Active'`);
107
+ });
108
+ it('orders by User > Role > Global scope, then Priority DESC, then CreatedAt DESC', async () => {
109
+ await service.ResolveFormForEntity(entity, user({}), provider);
110
+ const orderBy = runViewCalls[0].params.OrderBy;
111
+ expect(orderBy).toContain(`WHEN 'User' THEN 1`);
112
+ expect(orderBy).toContain(`WHEN 'Role' THEN 2`);
113
+ expect(orderBy).toContain('Priority DESC');
114
+ expect(orderBy).toContain('__mj_CreatedAt DESC');
115
+ });
116
+ it('includes UserID match in the filter', async () => {
117
+ await service.ResolveFormForEntity(entity, user({ ID: 'me' }), provider);
118
+ const filter = runViewCalls[0].params.ExtraFilter;
119
+ expect(filter).toContain(`Scope='User' AND UserID='me'`);
120
+ });
121
+ it('includes role-membership clause for each role the user has', async () => {
122
+ const u = user({ UserRoles: [{ RoleID: 'r1' }, { RoleID: 'r2' }] });
123
+ await service.ResolveFormForEntity(entity, u, provider);
124
+ const filter = runViewCalls[0].params.ExtraFilter;
125
+ expect(filter).toContain(`Scope='Role' AND RoleID IN ('r1','r2')`);
126
+ });
127
+ it('emits an always-false role clause when the user has no roles', async () => {
128
+ await service.ResolveFormForEntity(entity, user({ UserRoles: [] }), provider);
129
+ const filter = runViewCalls[0].params.ExtraFilter;
130
+ // No roles = the user can never match a Role-scoped row. We encode that
131
+ // as (1=0) rather than producing `IN ()` which is invalid SQL.
132
+ expect(filter).toContain('(1=0)');
133
+ expect(filter).not.toContain('IN ()');
134
+ });
135
+ it('does NOT cap the query at MaxRows=1 — needs the full variant list', async () => {
136
+ // Post-refactor: the resolver returns variants for the picker, so it
137
+ // can't limit to one row. The pickActive() in-memory still selects
138
+ // the top match for the default-rendered form.
139
+ await service.ResolveFormForEntity(entity, user({}), provider);
140
+ expect(runViewCalls[0].params.MaxRows).toBeUndefined();
141
+ });
142
+ it('returns variants list alongside the resolved override', async () => {
143
+ const variants = [
144
+ overrideRow({ ID: 'v-active', Status: 'Active', Scope: 'User', UserID: 'user-1' }),
145
+ overrideRow({ ID: 'v-pending', Status: 'Pending', Scope: 'User', UserID: 'user-1' }),
146
+ overrideRow({ ID: 'v-inactive', Status: 'Inactive', Scope: 'Global' }),
147
+ ];
148
+ runViewResponse = { Success: true, Results: variants };
149
+ const result = await service.ResolveFormForEntity(entity, user({}), provider);
150
+ expect(result.variants?.length).toBe(3);
151
+ expect(result.variants?.map(v => v.ID).sort()).toEqual(['v-active', 'v-inactive', 'v-pending']);
152
+ });
153
+ });
154
+ describe('FormResolverService.ListVariantsForEntity', () => {
155
+ it('returns the full applicable list (any status)', async () => {
156
+ runViewResponse = {
157
+ Success: true,
158
+ Results: [
159
+ overrideRow({ ID: 'v1', Status: 'Active' }),
160
+ overrideRow({ ID: 'v2', Status: 'Pending' }),
161
+ ],
162
+ };
163
+ const variants = await service.ListVariantsForEntity(entity, user({}), provider);
164
+ expect(variants.length).toBe(2);
165
+ });
166
+ });
167
+ describe('FormResolverService session-local variant selection', () => {
168
+ beforeEach(() => {
169
+ // The resolver writes to localStorage; reset before each test.
170
+ if (typeof window !== 'undefined' && window.localStorage) {
171
+ window.localStorage.clear();
172
+ }
173
+ });
174
+ it('honours a saved variant ID over the default Active pick', async () => {
175
+ runViewResponse = {
176
+ Success: true,
177
+ Results: [
178
+ overrideRow({ ID: 'v-default-active', Status: 'Active', Scope: 'Global', Priority: 0 }),
179
+ overrideRow({ ID: 'v-user-selected', Status: 'Active', Scope: 'User', UserID: 'user-1', Priority: 0 }),
180
+ ],
181
+ };
182
+ // Save the user's choice
183
+ service.SetSelectedVariant(entity.Name, 'v-user-selected');
184
+ const result = await service.ResolveFormForEntity(entity, user({}), provider);
185
+ expect(result.kind).toBe('interactive');
186
+ if (result.kind === 'interactive') {
187
+ expect(result.override.ID).toBe('v-user-selected');
188
+ }
189
+ });
190
+ it('clears a saved variant ID that no longer matches an Active row', async () => {
191
+ runViewResponse = {
192
+ Success: true,
193
+ Results: [overrideRow({ ID: 'v-active', Status: 'Active' })],
194
+ };
195
+ service.SetSelectedVariant(entity.Name, 'v-stale');
196
+ const result = await service.ResolveFormForEntity(entity, user({}), provider);
197
+ expect(result.kind).toBe('interactive');
198
+ if (result.kind === 'interactive') {
199
+ expect(result.override.ID).toBe('v-active');
200
+ }
201
+ // Stale selection should have been cleared
202
+ expect(service.GetSelectedVariant(entity.Name)).toBeNull();
203
+ });
204
+ it('ClearSelectedVariant wipes the stored choice', () => {
205
+ service.SetSelectedVariant(entity.Name, 'v1');
206
+ expect(service.GetSelectedVariant(entity.Name)).toBe('v1');
207
+ service.ClearSelectedVariant(entity.Name);
208
+ expect(service.GetSelectedVariant(entity.Name)).toBeNull();
209
+ });
210
+ it('SetExplicitDefault stores the sentinel so pickActive returns null even when Active overrides exist', async () => {
211
+ // Hardcoded — matches FormResolverService.EXPLICIT_DEFAULT_SENTINEL.
212
+ const SENTINEL = '__codegen-default__';
213
+ service.SetExplicitDefault(entity.Name);
214
+ expect(service.GetSelectedVariant(entity.Name)).toBe(SENTINEL);
215
+ runViewResponse = { Success: true, Results: [overrideRow({ ID: 'v-active', Scope: 'Global', Status: 'Active' })] };
216
+ const result = await service.ResolveFormForEntity(entity, user({}), provider);
217
+ // Even with an Active override in the variants list, the sentinel
218
+ // forces a fall-through to the CodeGen / Angular fallback.
219
+ expect(result.kind).not.toBe('interactive');
220
+ });
221
+ it('is case-insensitive on the entity name', () => {
222
+ service.SetSelectedVariant('Customer', 'v1');
223
+ expect(service.GetSelectedVariant('customer')).toBe('v1');
224
+ expect(service.GetSelectedVariant('CUSTOMER')).toBe('v1');
225
+ });
226
+ });
227
+ describe('FormResolverService.ResolveFormForEntity — fallback behaviour', () => {
228
+ it('uses ResultType=simple to skip BaseEntity hydration on the hot path', async () => {
229
+ await service.ResolveFormForEntity(entity, user({}), provider);
230
+ expect(runViewCalls[0].params.ResultType).toBe('simple');
231
+ });
232
+ it('falls back to ClassFactory when no override matches', async () => {
233
+ runViewResponse = { Success: true, Results: [] };
234
+ classFactoryReg = { SubClass: class FakeForm {
235
+ } };
236
+ const result = await service.ResolveFormForEntity(entity, user({}), provider);
237
+ expect(result.kind).toBe('class');
238
+ if (result.kind === 'class') {
239
+ expect(result.subClass).toBe(classFactoryReg.SubClass);
240
+ }
241
+ });
242
+ it('returns kind=none when neither override nor ClassFactory has a form', async () => {
243
+ runViewResponse = { Success: true, Results: [] };
244
+ classFactoryReg = null;
245
+ const result = await service.ResolveFormForEntity(entity, user({}), provider);
246
+ expect(result.kind).toBe('none');
247
+ });
248
+ it('falls through when the RunView fails (treats lookup failure as "no override")', async () => {
249
+ runViewResponse = { Success: false, ErrorMessage: 'db down' };
250
+ classFactoryReg = { SubClass: class FakeForm {
251
+ } };
252
+ const result = await service.ResolveFormForEntity(entity, user({}), provider);
253
+ // Lookup failure should NOT block the user from seeing the class-based form
254
+ // — better to show *something* than to fail closed on every entity load.
255
+ expect(result.kind).toBe('class');
256
+ });
257
+ });
258
+ //# sourceMappingURL=form-resolver.service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-resolver.service.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/form-resolver.service.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tests for FormResolverService.\n *\n * The service builds a SQL filter + ORDER BY against `EntityFormOverride`,\n * runs it via RunView, and falls back to ClassFactory when no override matches.\n * These tests capture the RunView call args (to validate filter shape) and\n * stub responses to verify each resolution branch.\n */\nimport { describe, it, expect, vi, beforeEach } from 'vitest';\n\n// ----- Module mocks -------------------------------------------------------\n\n// Mock UserInfoEngine — the resolver's variant preferences now persist via\n// the user-settings table (cross-device, cross-browser) instead of\n// localStorage. In-memory map mirrors the engine's cache behavior.\nconst settingsBacking: Record<string, string> = {};\nvi.mock('@memberjunction/core-entities', () => ({\n UserInfoEngine: {\n Instance: {\n GetSetting: (key: string) => settingsBacking[key],\n SetSettingDebounced: (key: string, value: string) => {\n settingsBacking[key] = value;\n },\n DeleteSetting: async (key: string) => {\n delete settingsBacking[key];\n return true;\n },\n },\n },\n}));\n\nvi.mock('@angular/core', () => ({\n Injectable: () => (target: Function) => target,\n}));\n\n// RunView mock — we capture every call's params so tests can assert on them.\nconst runViewCalls: Array<{ params: any; user: any }> = [];\nlet runViewResponse: { Success: boolean; Results?: any[]; ErrorMessage?: string } = { Success: true, Results: [] };\n\nvi.mock('@memberjunction/core', () => ({\n LogError: vi.fn(),\n RunView: class {\n static FromMetadataProvider(_provider: any) {\n return new (class {\n async RunView(params: any, user: any) {\n runViewCalls.push({ params, user });\n return runViewResponse;\n }\n })();\n }\n },\n}));\n\n// ClassFactory mock — controls what the fallback branch returns.\nlet classFactoryReg: { SubClass: any } | null = null;\nvi.mock('@memberjunction/global', () => ({\n MJGlobal: {\n Instance: {\n ClassFactory: {\n GetRegistration: vi.fn(() => classFactoryReg),\n },\n },\n },\n // The post-refactor resolver uses UUIDsEqual to match a user-selected\n // variant ID; stub it with a case-insensitive string compare.\n UUIDsEqual: (a: string, b: string) => (a ?? '').toLowerCase() === (b ?? '').toLowerCase(),\n}));\n\nvi.mock('@memberjunction/ng-base-forms', () => ({\n BaseFormComponent: class FakeBaseFormComponent {},\n}));\n\n// ----- Test setup ---------------------------------------------------------\n\nimport type { FormResolverService } from '../services/form-resolver.service';\n\nconst entity = { ID: 'entity-1', Name: 'Customer' } as any;\nconst user = (overrides: Partial<{ ID: string; UserRoles: Array<{ RoleID: string }> }>) =>\n ({ ID: 'user-1', UserRoles: [], ...overrides } as any);\nconst provider = {} as any;\n\nconst overrideRow = (overrides: Partial<{\n ID: string; EntityID: string; ComponentID: string;\n Scope: 'User' | 'Role' | 'Global';\n UserID: string | null; RoleID: string | null;\n Priority: number; Status: 'Active' | 'Inactive' | 'Pending';\n}>) => ({\n ID: 'row-1', EntityID: 'entity-1', ComponentID: 'comp-1',\n Scope: 'Global' as const, UserID: null, RoleID: null,\n Priority: 0, Status: 'Active' as const, ...overrides,\n});\n\nlet service: FormResolverService;\n\nbeforeEach(async () => {\n runViewCalls.length = 0;\n runViewResponse = { Success: true, Results: [] };\n classFactoryReg = null;\n for (const k of Object.keys(settingsBacking)) delete settingsBacking[k];\n vi.clearAllMocks();\n const mod = await import('../services/form-resolver.service');\n service = new mod.FormResolverService();\n});\n\n// ----- Tests --------------------------------------------------------------\n\ndescribe('FormResolverService.ResolveFormForEntity', () => {\n\n it('returns kind=interactive when an override matches', async () => {\n runViewResponse = { Success: true, Results: [overrideRow({})] };\n\n const result = await service.ResolveFormForEntity(entity, user({}), provider);\n\n expect(result.kind).toBe('interactive');\n if (result.kind === 'interactive') {\n expect(result.override.ComponentID).toBe('comp-1');\n }\n });\n\n it('passes only \"MJ: Entity Form Overrides\" to RunView', async () => {\n await service.ResolveFormForEntity(entity, user({}), provider);\n expect(runViewCalls[0].params.EntityName).toBe('MJ: Entity Form Overrides');\n });\n\n it('filters by the entity ID and does NOT filter by Status (returns full variant list)', async () => {\n // Post-refactor: the resolver lists ALL applicable variants (any\n // Status) so the variant switcher can show Pending / Inactive\n // alongside Active. The Active pick happens in-memory via pickActive.\n await service.ResolveFormForEntity(entity, user({}), provider);\n const filter = runViewCalls[0].params.ExtraFilter;\n expect(filter).toContain(`EntityID='entity-1'`);\n expect(filter).not.toContain(`Status='Active'`);\n });\n\n it('orders by User > Role > Global scope, then Priority DESC, then CreatedAt DESC', async () => {\n await service.ResolveFormForEntity(entity, user({}), provider);\n const orderBy = runViewCalls[0].params.OrderBy;\n expect(orderBy).toContain(`WHEN 'User' THEN 1`);\n expect(orderBy).toContain(`WHEN 'Role' THEN 2`);\n expect(orderBy).toContain('Priority DESC');\n expect(orderBy).toContain('__mj_CreatedAt DESC');\n });\n\n it('includes UserID match in the filter', async () => {\n await service.ResolveFormForEntity(entity, user({ ID: 'me' }), provider);\n const filter = runViewCalls[0].params.ExtraFilter;\n expect(filter).toContain(`Scope='User' AND UserID='me'`);\n });\n\n it('includes role-membership clause for each role the user has', async () => {\n const u = user({ UserRoles: [{ RoleID: 'r1' }, { RoleID: 'r2' }] });\n await service.ResolveFormForEntity(entity, u, provider);\n const filter = runViewCalls[0].params.ExtraFilter;\n expect(filter).toContain(`Scope='Role' AND RoleID IN ('r1','r2')`);\n });\n\n it('emits an always-false role clause when the user has no roles', async () => {\n await service.ResolveFormForEntity(entity, user({ UserRoles: [] }), provider);\n const filter = runViewCalls[0].params.ExtraFilter;\n // No roles = the user can never match a Role-scoped row. We encode that\n // as (1=0) rather than producing `IN ()` which is invalid SQL.\n expect(filter).toContain('(1=0)');\n expect(filter).not.toContain('IN ()');\n });\n\n it('does NOT cap the query at MaxRows=1 — needs the full variant list', async () => {\n // Post-refactor: the resolver returns variants for the picker, so it\n // can't limit to one row. The pickActive() in-memory still selects\n // the top match for the default-rendered form.\n await service.ResolveFormForEntity(entity, user({}), provider);\n expect(runViewCalls[0].params.MaxRows).toBeUndefined();\n });\n\n it('returns variants list alongside the resolved override', async () => {\n const variants = [\n overrideRow({ ID: 'v-active', Status: 'Active', Scope: 'User', UserID: 'user-1' }),\n overrideRow({ ID: 'v-pending', Status: 'Pending', Scope: 'User', UserID: 'user-1' }),\n overrideRow({ ID: 'v-inactive', Status: 'Inactive', Scope: 'Global' }),\n ];\n runViewResponse = { Success: true, Results: variants };\n const result = await service.ResolveFormForEntity(entity, user({}), provider);\n expect(result.variants?.length).toBe(3);\n expect(result.variants?.map(v => v.ID).sort()).toEqual(['v-active', 'v-inactive', 'v-pending']);\n });\n});\n\ndescribe('FormResolverService.ListVariantsForEntity', () => {\n\n it('returns the full applicable list (any status)', async () => {\n runViewResponse = {\n Success: true,\n Results: [\n overrideRow({ ID: 'v1', Status: 'Active' }),\n overrideRow({ ID: 'v2', Status: 'Pending' }),\n ],\n };\n const variants = await service.ListVariantsForEntity(entity, user({}), provider);\n expect(variants.length).toBe(2);\n });\n});\n\ndescribe('FormResolverService session-local variant selection', () => {\n\n beforeEach(() => {\n // The resolver writes to localStorage; reset before each test.\n if (typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.clear();\n }\n });\n\n it('honours a saved variant ID over the default Active pick', async () => {\n runViewResponse = {\n Success: true,\n Results: [\n overrideRow({ ID: 'v-default-active', Status: 'Active', Scope: 'Global', Priority: 0 }),\n overrideRow({ ID: 'v-user-selected', Status: 'Active', Scope: 'User', UserID: 'user-1', Priority: 0 }),\n ],\n };\n // Save the user's choice\n service.SetSelectedVariant(entity.Name, 'v-user-selected');\n const result = await service.ResolveFormForEntity(entity, user({}), provider);\n expect(result.kind).toBe('interactive');\n if (result.kind === 'interactive') {\n expect(result.override.ID).toBe('v-user-selected');\n }\n });\n\n it('clears a saved variant ID that no longer matches an Active row', async () => {\n runViewResponse = {\n Success: true,\n Results: [ overrideRow({ ID: 'v-active', Status: 'Active' }) ],\n };\n service.SetSelectedVariant(entity.Name, 'v-stale');\n const result = await service.ResolveFormForEntity(entity, user({}), provider);\n expect(result.kind).toBe('interactive');\n if (result.kind === 'interactive') {\n expect(result.override.ID).toBe('v-active');\n }\n // Stale selection should have been cleared\n expect(service.GetSelectedVariant(entity.Name)).toBeNull();\n });\n\n it('ClearSelectedVariant wipes the stored choice', () => {\n service.SetSelectedVariant(entity.Name, 'v1');\n expect(service.GetSelectedVariant(entity.Name)).toBe('v1');\n service.ClearSelectedVariant(entity.Name);\n expect(service.GetSelectedVariant(entity.Name)).toBeNull();\n });\n\n it('SetExplicitDefault stores the sentinel so pickActive returns null even when Active overrides exist', async () => {\n // Hardcoded — matches FormResolverService.EXPLICIT_DEFAULT_SENTINEL.\n const SENTINEL = '__codegen-default__';\n service.SetExplicitDefault(entity.Name);\n expect(service.GetSelectedVariant(entity.Name)).toBe(SENTINEL);\n runViewResponse = { Success: true, Results: [overrideRow({ ID: 'v-active', Scope: 'Global', Status: 'Active' })] };\n const result = await service.ResolveFormForEntity(entity, user({}), provider);\n // Even with an Active override in the variants list, the sentinel\n // forces a fall-through to the CodeGen / Angular fallback.\n expect(result.kind).not.toBe('interactive');\n });\n\n it('is case-insensitive on the entity name', () => {\n service.SetSelectedVariant('Customer', 'v1');\n expect(service.GetSelectedVariant('customer')).toBe('v1');\n expect(service.GetSelectedVariant('CUSTOMER')).toBe('v1');\n });\n});\n\ndescribe('FormResolverService.ResolveFormForEntity — fallback behaviour', () => {\n\n it('uses ResultType=simple to skip BaseEntity hydration on the hot path', async () => {\n await service.ResolveFormForEntity(entity, user({}), provider);\n expect(runViewCalls[0].params.ResultType).toBe('simple');\n });\n\n it('falls back to ClassFactory when no override matches', async () => {\n runViewResponse = { Success: true, Results: [] };\n classFactoryReg = { SubClass: class FakeForm {} };\n\n const result = await service.ResolveFormForEntity(entity, user({}), provider);\n\n expect(result.kind).toBe('class');\n if (result.kind === 'class') {\n expect(result.subClass).toBe(classFactoryReg.SubClass);\n }\n });\n\n it('returns kind=none when neither override nor ClassFactory has a form', async () => {\n runViewResponse = { Success: true, Results: [] };\n classFactoryReg = null;\n\n const result = await service.ResolveFormForEntity(entity, user({}), provider);\n\n expect(result.kind).toBe('none');\n });\n\n it('falls through when the RunView fails (treats lookup failure as \"no override\")', async () => {\n runViewResponse = { Success: false, ErrorMessage: 'db down' };\n classFactoryReg = { SubClass: class FakeForm {} };\n\n const result = await service.ResolveFormForEntity(entity, user({}), provider);\n\n // Lookup failure should NOT block the user from seeing the class-based form\n // — better to show *something* than to fail closed on every entity load.\n expect(result.kind).toBe('class');\n });\n});\n"]}
@@ -9,6 +9,16 @@ import * as i0 from "@angular/core";
9
9
  */
10
10
  export declare class ArtifactResource extends BaseResourceComponent {
11
11
  private readonly analyzeService;
12
+ private readonly applyService;
13
+ /**
14
+ * Apply-to-my-form handler — see InteractiveFormApplyService.
15
+ * Confirms with the user, then routes to Create or Modify depending on
16
+ * whether an Active override already exists for this entity+user.
17
+ */
18
+ onApplyFormRequested(event: {
19
+ spec: unknown;
20
+ entityName: string;
21
+ }): Promise<void>;
12
22
  currentUser: UserInfo | null;
13
23
  artifactId: string;
14
24
  environmentId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/artifact-resource.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAY,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAExE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAA+B,MAAM,+BAA+B,CAAC;;AAI1F;;;;GAIG;AACH,qBA6Ba,gBAAiB,SAAQ,qBAAqB;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkC;IAE1D,WAAW,EAAE,QAAQ,GAAG,IAAI,CAAQ;IACpC,UAAU,EAAE,MAAM,CAAM;IACxB,aAAa,EAAE,MAAM,CAAM;IAElC,QAAQ;IAoBR;;;;OAIG;IACG,kBAAkB,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBxF,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAe3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAnEpD,gBAAgB;2CAAhB,gBAAgB;CAsE5B"}
1
+ {"version":3,"file":"artifact-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/artifact-resource.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAY,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAExE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAA+B,MAAM,+BAA+B,CAAC;;AAK1F;;;;GAIG;AACH,qBA8Ba,gBAAiB,SAAQ,qBAAqB;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkC;IACjE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuC;IAEpE;;;;OAIG;IACG,oBAAoB,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhF,WAAW,EAAE,QAAQ,GAAG,IAAI,CAAQ;IACpC,UAAU,EAAE,MAAM,CAAM;IACxB,aAAa,EAAE,MAAM,CAAM;IAElC,QAAQ;IAoBR;;;;OAIG;IACG,kBAAkB,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBxF,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAe3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAjFpD,gBAAgB;2CAAhB,gBAAgB;CAoF5B"}
@@ -8,14 +8,14 @@ import { Component, ViewEncapsulation, inject } from '@angular/core';
8
8
  import { RegisterClass } from '@memberjunction/global';
9
9
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
10
10
  import { MJEnvironmentEntityExtended } from '@memberjunction/core-entities';
11
- import { AnalyzeArtifactService } from '@memberjunction/ng-artifacts';
11
+ import { AnalyzeArtifactService, InteractiveFormApplyService } from '@memberjunction/ng-artifacts';
12
12
  import { MJNotificationService } from '@memberjunction/ng-notifications';
13
13
  import * as i0 from "@angular/core";
14
14
  import * as i1 from "@memberjunction/ng-artifacts";
15
15
  function ArtifactResource_Conditional_1_Template(rf, ctx) { if (rf & 1) {
16
16
  const _r1 = i0.ɵɵgetCurrentView();
17
17
  i0.ɵɵelementStart(0, "mj-artifact-viewer-panel", 2);
18
- i0.ɵɵlistener("analyzeRequested", function ArtifactResource_Conditional_1_Template_mj_artifact_viewer_panel_analyzeRequested_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onAnalyzeRequested($event)); });
18
+ i0.ɵɵlistener("analyzeRequested", function ArtifactResource_Conditional_1_Template_mj_artifact_viewer_panel_analyzeRequested_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onAnalyzeRequested($event)); })("applyFormRequested", function ArtifactResource_Conditional_1_Template_mj_artifact_viewer_panel_applyFormRequested_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onApplyFormRequested($event)); });
19
19
  i0.ɵɵelementEnd();
20
20
  } if (rf & 2) {
21
21
  const ctx_r1 = i0.ɵɵnextContext();
@@ -28,6 +28,15 @@ function ArtifactResource_Conditional_1_Template(rf, ctx) { if (rf & 1) {
28
28
  */
29
29
  let ArtifactResource = class ArtifactResource extends BaseResourceComponent {
30
30
  analyzeService = inject(AnalyzeArtifactService);
31
+ applyService = inject(InteractiveFormApplyService);
32
+ /**
33
+ * Apply-to-my-form handler — see InteractiveFormApplyService.
34
+ * Confirms with the user, then routes to Create or Modify depending on
35
+ * whether an Active override already exists for this entity+user.
36
+ */
37
+ async onApplyFormRequested(event) {
38
+ await this.applyService.ConfirmAndApply(event.spec, event.entityName, this.ProviderToUse);
39
+ }
31
40
  currentUser = null;
32
41
  artifactId = '';
33
42
  environmentId = '';
@@ -90,7 +99,7 @@ let ArtifactResource = class ArtifactResource extends BaseResourceComponent {
90
99
  return 'fa-solid fa-file-code';
91
100
  }
92
101
  static ɵfac = /*@__PURE__*/ (() => { let ɵArtifactResource_BaseFactory; return function ArtifactResource_Factory(__ngFactoryType__) { return (ɵArtifactResource_BaseFactory || (ɵArtifactResource_BaseFactory = i0.ɵɵgetInheritedFactory(ArtifactResource)))(__ngFactoryType__ || ArtifactResource); }; })();
93
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactResource, selectors: [["mj-artifact-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "artifact-container"], [3, "artifactId", "currentUser", "environmentId", "showSaveToCollection", "canShare", "canEdit"], [3, "analyzeRequested", "artifactId", "currentUser", "environmentId", "showSaveToCollection", "canShare", "canEdit"]], template: function ArtifactResource_Template(rf, ctx) { if (rf & 1) {
102
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactResource, selectors: [["mj-artifact-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "artifact-container"], [3, "artifactId", "currentUser", "environmentId", "showSaveToCollection", "canShare", "canEdit"], [3, "analyzeRequested", "applyFormRequested", "artifactId", "currentUser", "environmentId", "showSaveToCollection", "canShare", "canEdit"]], template: function ArtifactResource_Template(rf, ctx) { if (rf & 1) {
94
103
  i0.ɵɵelementStart(0, "div", 0);
95
104
  i0.ɵɵconditionalCreate(1, ArtifactResource_Conditional_1_Template, 1, 6, "mj-artifact-viewer-panel", 1);
96
105
  i0.ɵɵelementEnd();
@@ -115,11 +124,12 @@ export { ArtifactResource };
115
124
  [showSaveToCollection]="true"
116
125
  [canShare]="true"
117
126
  [canEdit]="true"
118
- (analyzeRequested)="onAnalyzeRequested($event)">
127
+ (analyzeRequested)="onAnalyzeRequested($event)"
128
+ (applyFormRequested)="onApplyFormRequested($event)">
119
129
  </mj-artifact-viewer-panel>
120
130
  }
121
131
  </div>
122
132
  `, encapsulation: ViewEncapsulation.None, styles: ["\n .artifact-container {\n display: flex;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n "] }]
123
133
  }], null, null); })();
124
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactResource, { className: "ArtifactResource", filePath: "src/lib/resource-wrappers/artifact-resource.component.ts", lineNumber: 43 }); })();
134
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactResource, { className: "ArtifactResource", filePath: "src/lib/resource-wrappers/artifact-resource.component.ts", lineNumber: 45 }); })();
125
135
  //# sourceMappingURL=artifact-resource.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/artifact-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, inject } from '@angular/core';\nimport { DataSnapshot, Metadata, UserInfo } from '@memberjunction/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJEnvironmentEntityExtended } from '@memberjunction/core-entities';\nimport { AnalyzeArtifactService } from '@memberjunction/ng-artifacts';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\n/**\n * Artifact Resource - displays versioned content artifacts\n * Wraps the artifact-viewer-panel component for tab-based display\n * Supports reports, dashboards, forms, and other artifact types\n */\n@RegisterClass(BaseResourceComponent, 'ArtifactResource')\n@Component({\n standalone: false,\n selector: 'mj-artifact-resource',\n template: `\n <div class=\"artifact-container\">\n @if (currentUser && artifactId) {\n <mj-artifact-viewer-panel\n [artifactId]=\"artifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [showSaveToCollection]=\"true\"\n [canShare]=\"true\"\n [canEdit]=\"true\"\n (analyzeRequested)=\"onAnalyzeRequested($event)\">\n </mj-artifact-viewer-panel>\n }\n </div>\n `,\n styles: [`\n .artifact-container {\n display: flex;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ArtifactResource extends BaseResourceComponent {\n private readonly analyzeService = inject(AnalyzeArtifactService);\n\n public currentUser: UserInfo | null = null;\n public artifactId: string = '';\n public environmentId: string = '';\n\n ngOnInit() {\n super.ngOnInit();\n const md = this.ProviderToUse;\n this.currentUser = md.CurrentUser;\n\n // Get artifact ID from resource data\n if (this.Data && this.Data.ResourceRecordID) {\n this.artifactId = this.Data.ResourceRecordID;\n }\n\n // Environment ID — use the configured environment if present, otherwise\n // fall back to the default environment. Must be a valid UUID since\n // downstream saves (e.g. AnalyzeArtifactService creating artifacts)\n // require a non-empty EnvironmentID.\n this.environmentId = (this.Data?.Configuration?.['environmentId'] as string | undefined)\n || MJEnvironmentEntityExtended.DefaultEnvironmentID;\n\n setTimeout(() => this.NotifyLoadComplete(), 100);\n }\n\n /**\n * Handler for the Analyze button on the artifact viewer panel.\n * Creates a Data Snapshot artifact from the live viewer state, opens a\n * new conversation with it attached as input, and routes the user there.\n */\n async onAnalyzeRequested(event: { artifactId: string; snapshot: DataSnapshot }): Promise<void> {\n if (!this.currentUser) return;\n\n try {\n const result = await this.analyzeService.StartAnalysisConversation({\n snapshot: event.snapshot,\n currentUser: this.currentUser,\n environmentId: this.environmentId,\n });\n\n // Route to the new conversation in the Conversations nav item\n await this.navigationService.OpenNavItemByName('Conversations', {\n conversationId: result.conversationId,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to start analysis conversation';\n MJNotificationService.Instance.CreateSimpleNotification(message, 'error', 5000);\n }\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n // Try to load artifact name from database\n if (data.ResourceRecordID) {\n try {\n const md = this.ProviderToUse;\n const artifact = await md.GetEntityObject<any>('MJ: Conversation Artifacts');\n await artifact.Load(data.ResourceRecordID);\n return artifact.Name || `Artifact - ${data.ResourceRecordID}`;\n } catch (error) {\n console.error('Error loading artifact name:', error);\n }\n }\n return 'Artifact';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-file-code';\n }\n}\n"]}
1
+ {"version":3,"file":"artifact-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/artifact-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAgB,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC1F,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAEnG,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;;;;;IAcjE,mDAQsD;IAApD,AADA,kOAAoB,iCAA0B,KAAC,yNACzB,mCAA4B,KAAC;IACrD,iBAA2B;;;IAHzB,AADA,AADA,AADA,AADA,AADA,8CAAyB,mCACE,uCACI,8BACF,kBACZ,iBACD;;AAlB1B;;;;GAIG;AA+BI,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,qBAAqB;IACxC,cAAc,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAChD,YAAY,GAAG,MAAM,CAAC,2BAA2B,CAAC,CAAC;IAEpE;;;;OAIG;IACH,KAAK,CAAC,oBAAoB,CAAC,KAA4C;QACrE,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CACrC,KAAK,CAAC,IAAqB,EAC3B,KAAK,CAAC,UAAU,EAChB,IAAI,CAAC,aAAa,CACnB,CAAC;IACJ,CAAC;IAEM,WAAW,GAAoB,IAAI,CAAC;IACpC,UAAU,GAAW,EAAE,CAAC;IACxB,aAAa,GAAW,EAAE,CAAC;IAElC,QAAQ;QACN,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC;QAElC,qCAAqC;QACrC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAC/C,CAAC;QAED,wEAAwE;QACxE,mEAAmE;QACnE,oEAAoE;QACpE,qCAAqC;QACrC,IAAI,CAAC,aAAa,GAAI,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,eAAe,CAAwB;eACjF,2BAA2B,CAAC,oBAAoB,CAAC;QAExD,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,kBAAkB,CAAC,KAAqD;QAC5E,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAE9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,yBAAyB,CAAC;gBACjE,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;aAClC,CAAC,CAAC;YAEH,8DAA8D;YAC9D,MAAM,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,eAAe,EAAE;gBAC9D,cAAc,EAAE,MAAM,CAAC,cAAc;aACtC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uCAAuC,CAAC;YACjG,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC7C,0CAA0C;QAC1C,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;gBAC9B,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,eAAe,CAAM,4BAA4B,CAAC,CAAC;gBAC7E,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAC3C,OAAO,QAAQ,CAAC,IAAI,IAAI,cAAc,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAChE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QAC3C,OAAO,uBAAuB,CAAC;IACjC,CAAC;6OAnFU,gBAAgB,yBAAhB,gBAAgB;6DAAhB,gBAAgB;YAzBzB,8BAAgC;YAC9B,uGAAiC;YAYnC,iBAAM;;YAZJ,cAWC;YAXD,4DAWC;;;AAaM,gBAAgB;IA9B5B,aAAa,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;GA8B5C,gBAAgB,CAoF5B;;iFApFY,gBAAgB;cA7B5B,SAAS;6BACI,KAAK,YACP,sBAAsB,YACtB;;;;;;;;;;;;;;;KAeP,iBASY,iBAAiB,CAAC,IAAI;;kFAE1B,gBAAgB","sourcesContent":["import { Component, ViewEncapsulation, inject } from '@angular/core';\nimport { DataSnapshot, Metadata, UserInfo } from '@memberjunction/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJEnvironmentEntityExtended } from '@memberjunction/core-entities';\nimport { AnalyzeArtifactService, InteractiveFormApplyService } from '@memberjunction/ng-artifacts';\nimport type { ComponentSpec } from '@memberjunction/interactive-component-types';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\n/**\n * Artifact Resource - displays versioned content artifacts\n * Wraps the artifact-viewer-panel component for tab-based display\n * Supports reports, dashboards, forms, and other artifact types\n */\n@RegisterClass(BaseResourceComponent, 'ArtifactResource')\n@Component({\n standalone: false,\n selector: 'mj-artifact-resource',\n template: `\n <div class=\"artifact-container\">\n @if (currentUser && artifactId) {\n <mj-artifact-viewer-panel\n [artifactId]=\"artifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [showSaveToCollection]=\"true\"\n [canShare]=\"true\"\n [canEdit]=\"true\"\n (analyzeRequested)=\"onAnalyzeRequested($event)\"\n (applyFormRequested)=\"onApplyFormRequested($event)\">\n </mj-artifact-viewer-panel>\n }\n </div>\n `,\n styles: [`\n .artifact-container {\n display: flex;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ArtifactResource extends BaseResourceComponent {\n private readonly analyzeService = inject(AnalyzeArtifactService);\n private readonly applyService = inject(InteractiveFormApplyService);\n\n /**\n * Apply-to-my-form handler — see InteractiveFormApplyService.\n * Confirms with the user, then routes to Create or Modify depending on\n * whether an Active override already exists for this entity+user.\n */\n async onApplyFormRequested(event: { spec: unknown; entityName: string }): Promise<void> {\n await this.applyService.ConfirmAndApply(\n event.spec as ComponentSpec,\n event.entityName,\n this.ProviderToUse,\n );\n }\n\n public currentUser: UserInfo | null = null;\n public artifactId: string = '';\n public environmentId: string = '';\n\n ngOnInit() {\n super.ngOnInit();\n const md = this.ProviderToUse;\n this.currentUser = md.CurrentUser;\n\n // Get artifact ID from resource data\n if (this.Data && this.Data.ResourceRecordID) {\n this.artifactId = this.Data.ResourceRecordID;\n }\n\n // Environment ID — use the configured environment if present, otherwise\n // fall back to the default environment. Must be a valid UUID since\n // downstream saves (e.g. AnalyzeArtifactService creating artifacts)\n // require a non-empty EnvironmentID.\n this.environmentId = (this.Data?.Configuration?.['environmentId'] as string | undefined)\n || MJEnvironmentEntityExtended.DefaultEnvironmentID;\n\n setTimeout(() => this.NotifyLoadComplete(), 100);\n }\n\n /**\n * Handler for the Analyze button on the artifact viewer panel.\n * Creates a Data Snapshot artifact from the live viewer state, opens a\n * new conversation with it attached as input, and routes the user there.\n */\n async onAnalyzeRequested(event: { artifactId: string; snapshot: DataSnapshot }): Promise<void> {\n if (!this.currentUser) return;\n\n try {\n const result = await this.analyzeService.StartAnalysisConversation({\n snapshot: event.snapshot,\n currentUser: this.currentUser,\n environmentId: this.environmentId,\n });\n\n // Route to the new conversation in the Conversations nav item\n await this.navigationService.OpenNavItemByName('Conversations', {\n conversationId: result.conversationId,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to start analysis conversation';\n MJNotificationService.Instance.CreateSimpleNotification(message, 'error', 5000);\n }\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n // Try to load artifact name from database\n if (data.ResourceRecordID) {\n try {\n const md = this.ProviderToUse;\n const artifact = await md.GetEntityObject<any>('MJ: Conversation Artifacts');\n await artifact.Load(data.ResourceRecordID);\n return artifact.Name || `Artifact - ${data.ResourceRecordID}`;\n } catch (error) {\n console.error('Error loading artifact name:', error);\n }\n }\n return 'Artifact';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-file-code';\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"record-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/record-resource.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAY,YAAY,EAAc,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;;AAC7F,qBAOa,oBAAqB,SAAQ,qBAAqB;IAC3D,IAAW,UAAU,IAAI,YAAY,CAEpC;WAEa,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,YAAY;IAarF,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAoB3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAtCtD,oBAAoB;2CAApB,oBAAoB;CAmDhC"}
1
+ {"version":3,"file":"record-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/record-resource.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAY,YAAY,EAAc,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;;AAC7F,qBAOa,oBAAqB,SAAQ,qBAAqB;IAC3D,IAAW,UAAU,IAAI,YAAY,CAEpC;WAEa,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,YAAY;IAwBrF,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IA2B3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAxDtD,oBAAoB;2CAApB,oBAAoB;CAqEhC"}