@memberjunction/ng-dashboards 5.36.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.
- package/README.md +32 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +14 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +450 -292
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +73 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +512 -127
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-resource.component.d.ts +22 -0
- package/dist/ComponentStudio/component-studio-resource.component.d.ts.map +1 -0
- package/dist/ComponentStudio/component-studio-resource.component.js +55 -0
- package/dist/ComponentStudio/component-studio-resource.component.js.map +1 -0
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +104 -45
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +234 -331
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts +54 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js +339 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts +65 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js +492 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts +88 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js +457 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js.map +1 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.d.ts +106 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.js +478 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.js.map +1 -0
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +54 -0
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +361 -50
- package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts +10 -0
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +114 -45
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
- package/dist/ComponentStudio/services/canvas-to-code.d.ts +32 -0
- package/dist/ComponentStudio/services/canvas-to-code.d.ts.map +1 -0
- package/dist/ComponentStudio/services/canvas-to-code.js +347 -0
- package/dist/ComponentStudio/services/canvas-to-code.js.map +1 -0
- package/dist/ComponentStudio/services/code-to-canvas.d.ts +32 -0
- package/dist/ComponentStudio/services/code-to-canvas.d.ts.map +1 -0
- package/dist/ComponentStudio/services/code-to-canvas.js +92 -0
- package/dist/ComponentStudio/services/code-to-canvas.js.map +1 -0
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts +29 -0
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-studio-state.service.js +76 -0
- package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
- package/dist/ComponentStudio/services/entity-form-override.service.d.ts +86 -0
- package/dist/ComponentStudio/services/entity-form-override.service.d.ts.map +1 -0
- package/dist/ComponentStudio/services/entity-form-override.service.js +246 -0
- package/dist/ComponentStudio/services/entity-form-override.service.js.map +1 -0
- package/dist/ComponentStudio/services/field-binding-scanner.d.ts +29 -0
- package/dist/ComponentStudio/services/field-binding-scanner.d.ts.map +1 -0
- package/dist/ComponentStudio/services/field-binding-scanner.js +110 -0
- package/dist/ComponentStudio/services/field-binding-scanner.js.map +1 -0
- package/dist/ComponentStudio/services/form-canvas-model.d.ts +56 -0
- package/dist/ComponentStudio/services/form-canvas-model.d.ts.map +1 -0
- package/dist/ComponentStudio/services/form-canvas-model.js +35 -0
- package/dist/ComponentStudio/services/form-canvas-model.js.map +1 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.d.ts +10 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.d.ts.map +1 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.js +10 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.js.map +1 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.d.ts +964 -0
- package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -0
- package/dist/FormBuilder/form-builder-resource.component.js +4487 -0
- package/dist/FormBuilder/form-builder-resource.component.js.map +1 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts +55 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts.map +1 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.js +73 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.js.map +1 -0
- package/dist/Home/home-application.d.ts +21 -1
- package/dist/Home/home-application.d.ts.map +1 -1
- package/dist/Home/home-application.js +60 -8
- package/dist/Home/home-application.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +14 -14
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +11 -10
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/component-studio-dashboards.module.d.ts +34 -22
- package/dist/component-studio-dashboards.module.d.ts.map +1 -1
- package/dist/component-studio-dashboards.module.js +65 -9
- package/dist/component-studio-dashboards.module.js.map +1 -1
- package/package.json +54 -53
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-studio-dashboard.component.js","sourceRoot":"","sources":["../../src/ComponentStudio/component-studio-dashboard.component.ts","../../src/ComponentStudio/component-studio-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, AfterViewInit, OnDestroy, ViewChild, ElementRef, ChangeDetectorRef, HostListener } from '@angular/core';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { Metadata, IMetadataProvider } from '@memberjunction/core';\nimport {\n MJComponentEntityExtended,\n MJArtifactVersionEntity,\n ResourceData,\n UserInfoEngine\n} from '@memberjunction/core-entities';\nimport { Subject, takeUntil } from 'rxjs';\nimport { ComponentSpec } from '@memberjunction/interactive-component-types';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { ArtifactSelectionResult } from './components/artifact-selection-dialog.component';\nimport { ArtifactLoadResult } from './components/artifact-load-dialog.component';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { ComponentStudioStateService, FileLoadedComponent, ComponentError } from './services/component-studio-state.service';\nimport { ComponentVersionService } from './services/component-version.service';\nimport { SaveVersionResult } from './components/save-version-dialog/save-version-dialog.component';\nimport { RunView } from '@memberjunction/core';\n\n/**\n * User preferences persisted via UserInfoEngine.\n */\ninterface ComponentStudioPreferences {\n leftPanelWidth: number;\n rightPanelWidth: number;\n previewFlexPercent: number;\n isAIPanelCollapsed: boolean;\n isLeftPanelCollapsed: boolean;\n isEditorPanelCollapsed: boolean;\n}\n\n/**\n * Result from the New Component dialog.\n */\nexport interface NewComponentResult {\n name: string;\n title: string;\n description: string;\n type: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-component-studio-dashboard',\n templateUrl: './component-studio-dashboard.component.html',\n styleUrls: ['./component-studio-dashboard.component.css'],\n providers: [ComponentStudioStateService, ComponentVersionService]\n})\n@RegisterClass(BaseDashboard, 'ComponentStudioDashboard')\nexport class ComponentStudioDashboardComponent extends BaseDashboard implements AfterViewInit, OnDestroy {\n\n private static readonly USER_PREFS_KEY = 'ComponentStudio.UserPreferences';\n\n // --- Panel widths ---\n public leftPanelWidth = 340;\n public rightPanelWidth = 380;\n public previewFlex = '1 1 50%';\n public editorFlex = '1 1 50%';\n private previewFlexPercent = 50;\n\n // --- Dropdown states ---\n public exportDropdownOpen = false;\n\n // --- Resize state ---\n public IsResizing = false;\n private resizeType: 'left' | 'right' | 'center' | null = null;\n private resizeStartX = 0;\n private resizeStartValue = 0;\n\n // --- Collapsible panels ---\n public IsLeftPanelCollapsed = false;\n public IsEditorPanelCollapsed = false;\n\n // --- Dialog states ---\n public ShowNewComponentDialog = false;\n public ShowKeyboardShortcuts = false;\n public ShowSaveVersionDialog = false;\n public ShowTextImportDialog = false;\n public ShowArtifactLoadDialog = false;\n public ShowArtifactSelectionDialog = false;\n\n // --- Status bar ---\n public LastSavedTime: Date | null = null;\n\n // --- Preferences ---\n private prefsLoaded = false;\n\n @ViewChild('fileInput', { static: false }) fileInput?: ElementRef<HTMLInputElement>;\n\n protected override destroy$ = new Subject<void>();\n private get metadata(): IMetadataProvider { return this.ProviderToUse; }\n\n constructor(\n public state: ComponentStudioStateService,\n public versionService: ComponentVersionService,\n private cdr: ChangeDetectorRef,\n private notificationService: MJNotificationService\n ) {\n super();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Component Studio';\n }\n\n async ngAfterViewInit() {\n this.initDashboard();\n\n // Subscribe to state changes for change detection\n this.state.StateChanged.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.cdr.detectChanges();\n });\n\n this.loadUserPreferences();\n await this.state.LoadComponents();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n protected initDashboard(): void {\n // Wire up provider-aware services for multi-provider support\n this.state.Provider = this.ProviderToUse;\n this.versionService.Provider = this.ProviderToUse;\n }\n\n protected loadData(): void {\n this.state.LoadComponents();\n }\n\n // ============================================================\n // USER PREFERENCES\n // ============================================================\n\n private loadUserPreferences(): void {\n try {\n const saved = UserInfoEngine.Instance.GetSetting(ComponentStudioDashboardComponent.USER_PREFS_KEY);\n if (saved) {\n const prefs = JSON.parse(saved) as ComponentStudioPreferences;\n this.applyPreferences(prefs);\n }\n } catch (error) {\n console.warn('[ComponentStudio] Failed to load user preferences:', error);\n } finally {\n this.prefsLoaded = true;\n }\n }\n\n private applyPreferences(prefs: ComponentStudioPreferences): void {\n if (prefs.leftPanelWidth) this.leftPanelWidth = prefs.leftPanelWidth;\n if (prefs.rightPanelWidth) this.rightPanelWidth = prefs.rightPanelWidth;\n if (prefs.previewFlexPercent) {\n this.previewFlexPercent = prefs.previewFlexPercent;\n this.previewFlex = `1 1 ${prefs.previewFlexPercent}%`;\n this.editorFlex = `1 1 ${100 - prefs.previewFlexPercent}%`;\n }\n if (prefs.isAIPanelCollapsed != null) {\n this.state.IsAIPanelCollapsed = prefs.isAIPanelCollapsed;\n }\n if (prefs.isLeftPanelCollapsed != null) {\n this.IsLeftPanelCollapsed = prefs.isLeftPanelCollapsed;\n }\n if (prefs.isEditorPanelCollapsed != null) {\n this.IsEditorPanelCollapsed = prefs.isEditorPanelCollapsed;\n }\n }\n\n private getCurrentPreferences(): ComponentStudioPreferences {\n return {\n leftPanelWidth: this.leftPanelWidth,\n rightPanelWidth: this.rightPanelWidth,\n previewFlexPercent: this.previewFlexPercent,\n isAIPanelCollapsed: this.state.IsAIPanelCollapsed,\n isLeftPanelCollapsed: this.IsLeftPanelCollapsed,\n isEditorPanelCollapsed: this.IsEditorPanelCollapsed\n };\n }\n\n private saveUserPreferences(): void {\n if (!this.prefsLoaded) return;\n try {\n UserInfoEngine.Instance.SetSetting(\n ComponentStudioDashboardComponent.USER_PREFS_KEY,\n JSON.stringify(this.getCurrentPreferences())\n );\n } catch (error) {\n console.warn('[ComponentStudio] Failed to save user preferences:', error);\n }\n }\n\n private saveUserPreferencesDebounced(): void {\n if (!this.prefsLoaded) return;\n try {\n UserInfoEngine.Instance.SetSettingDebounced(\n ComponentStudioDashboardComponent.USER_PREFS_KEY,\n JSON.stringify(this.getCurrentPreferences())\n );\n } catch (error) {\n console.warn('[ComponentStudio] Failed to save user preferences:', error);\n }\n }\n\n // ============================================================\n // KEYBOARD SHORTCUTS\n // ============================================================\n\n @HostListener('document:keydown', ['$event'])\n OnKeyDown(event: KeyboardEvent): void {\n const target = event.target as HTMLElement;\n const isInputFocused = target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable;\n\n // Ctrl+S / Cmd+S = Save Version\n if ((event.ctrlKey || event.metaKey) && event.key === 's') {\n event.preventDefault();\n if (this.state.SelectedComponent) {\n this.SaveVersion();\n }\n }\n\n // Ctrl+N / Cmd+N = New Component\n if ((event.ctrlKey || event.metaKey) && event.key === 'n') {\n event.preventDefault();\n this.OnNewComponent();\n }\n\n // Ctrl+/ or ? = Toggle keyboard shortcuts\n if ((event.ctrlKey || event.metaKey) && event.key === '/') {\n event.preventDefault();\n this.ShowKeyboardShortcuts = !this.ShowKeyboardShortcuts;\n this.cdr.detectChanges();\n } else if (event.key === '?' && !isInputFocused) {\n this.ShowKeyboardShortcuts = !this.ShowKeyboardShortcuts;\n this.cdr.detectChanges();\n }\n\n // Escape = Close overlays\n if (event.key === 'Escape') {\n if (this.ShowKeyboardShortcuts) {\n this.ShowKeyboardShortcuts = false;\n this.cdr.detectChanges();\n }\n }\n }\n\n // ============================================================\n // SAVE VERSION\n // ============================================================\n\n SaveVersion(): void {\n if (!this.state.SelectedComponent) return;\n this.ShowSaveVersionDialog = true;\n this.cdr.detectChanges();\n }\n\n async OnSaveVersionConfirm(result: SaveVersionResult): Promise<void> {\n this.ShowSaveVersionDialog = false;\n\n let success: boolean;\n if (result.Mode === 'update') {\n success = await this.versionService.UpdateCurrentVersion(result.Comment || undefined);\n } else {\n success = await this.versionService.SaveVersion(result.Comment || undefined);\n }\n\n if (success) {\n this.LastSavedTime = new Date();\n this.notificationService.CreateSimpleNotification(\n `Saved as v${this.versionService.CurrentVersionNumber}`,\n 'success',\n 3000\n );\n this.state.HasUnsavedChanges = false;\n } else {\n this.notificationService.CreateSimpleNotification(\n 'Failed to save version',\n 'error'\n );\n }\n this.cdr.detectChanges();\n }\n\n // ============================================================\n // REFRESH COMPONENT\n // ============================================================\n\n RefreshComponent(): void {\n this.state.RefreshComponent.emit();\n }\n\n // ============================================================\n // AI PANEL\n // ============================================================\n\n ToggleAIPanel(): void {\n this.state.IsAIPanelCollapsed = !this.state.IsAIPanelCollapsed;\n this.saveUserPreferences();\n this.cdr.detectChanges();\n }\n\n ToggleLeftPanel(): void {\n this.IsLeftPanelCollapsed = !this.IsLeftPanelCollapsed;\n this.saveUserPreferences();\n this.cdr.detectChanges();\n }\n\n ToggleEditorPanel(): void {\n this.IsEditorPanelCollapsed = !this.IsEditorPanelCollapsed;\n this.saveUserPreferences();\n this.cdr.detectChanges();\n }\n\n OnAskAIToFix(error: ComponentError): void {\n // Open AI panel if collapsed\n if (this.state.IsAIPanelCollapsed) {\n this.state.IsAIPanelCollapsed = false;\n }\n // Send error to AI panel\n this.state.SendErrorToAI.emit(error);\n this.cdr.detectChanges();\n }\n\n // ============================================================\n // NEW COMPONENT\n // ============================================================\n\n OnNewComponent(): void {\n this.ShowNewComponentDialog = true;\n this.cdr.detectChanges();\n }\n\n OnNewComponentDialogClose(result: NewComponentResult | null): void {\n this.ShowNewComponentDialog = false;\n if (!result) {\n this.cdr.detectChanges();\n return;\n }\n this.createComponentFromResult(result);\n this.cdr.detectChanges();\n }\n\n OnQuickStart(type: string): void {\n const typeNames: Record<string, string> = {\n dashboard: 'Dashboard',\n report: 'Report',\n chart: 'Chart',\n form: 'Form'\n };\n const typeName = typeNames[type] || 'Component';\n this.createComponentFromResult({\n name: `New ${typeName}`,\n title: `New ${typeName}`,\n description: '',\n type\n });\n }\n\n private createComponentFromResult(result: NewComponentResult): void {\n const newSpec: ComponentSpec = {\n name: result.name,\n title: result.title,\n description: result.description,\n type: result.type,\n location: 'embedded',\n exampleUsage: '',\n code: this.getTemplateCode(result.name, result.type),\n functionalRequirements: '',\n dataRequirements: { mode: 'views', entities: [], queries: [], description: '' },\n technicalDesign: ''\n } as ComponentSpec;\n\n const fileComponent: FileLoadedComponent = {\n id: this.state.GenerateId(),\n name: result.name,\n description: result.description,\n specification: newSpec,\n filename: 'new-component.json',\n loadedAt: new Date(),\n isFileLoaded: true,\n type: result.type || 'Dashboard',\n status: 'New'\n };\n\n this.state.AddFileLoadedComponent(fileComponent);\n this.state.ExpandedComponent = fileComponent;\n this.state.RunComponent(fileComponent);\n }\n\n private getTemplateCode(name: string, type: string): string {\n return `function Component({ utilities, settings }) {\n const React = utilities.React;\n const { useState } = React;\n\n return React.createElement('div', {\n style: { padding: '24px', fontFamily: 'system-ui' }\n },\n React.createElement('h2', null, '${name}'),\n React.createElement('p', null, 'Start building your ${type || 'component'} here.')\n );\n}`;\n }\n\n // ============================================================\n // IMPORT / EXPORT\n // ============================================================\n\n ToggleExportDropdown(): void {\n this.exportDropdownOpen = !this.exportDropdownOpen;\n }\n\n @HostListener('document:click', ['$event'])\n OnDocumentClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (!target.closest('.header-dropdown')) {\n this.exportDropdownOpen = false;\n }\n }\n\n ImportFromFile(): void {\n this.fileInput?.nativeElement.click();\n }\n\n ImportFromText(): void {\n this.ShowTextImportDialog = true;\n this.cdr.detectChanges();\n }\n\n OnTextImportSpec(spec: ComponentSpec): void {\n this.ShowTextImportDialog = false;\n this.handleSpecImport(spec, 'text-import.json', 'Text');\n this.cdr.detectChanges();\n }\n\n OnTextImportCancel(): void {\n this.ShowTextImportDialog = false;\n this.cdr.detectChanges();\n }\n\n ImportFromArtifact(): void {\n this.ShowArtifactLoadDialog = true;\n this.cdr.detectChanges();\n }\n\n OnArtifactLoadClose(result: ArtifactLoadResult | undefined): void {\n this.ShowArtifactLoadDialog = false;\n if (!result) {\n this.cdr.detectChanges();\n return;\n }\n\n const artifactComponent: FileLoadedComponent = {\n id: this.state.GenerateId(),\n name: result.spec.name,\n description: result.spec.description,\n specification: result.spec,\n filename: `${result.artifactName} (v${result.versionNumber})`,\n loadedAt: new Date(),\n isFileLoaded: true,\n type: result.spec.type || 'Component',\n status: 'Artifact',\n sourceArtifactID: result.artifactID,\n sourceVersionID: result.versionID\n };\n\n this.state.AddFileLoadedComponent(artifactComponent);\n this.state.ExpandedComponent = artifactComponent;\n this.state.RunComponent(artifactComponent);\n\n this.notificationService.CreateSimpleNotification(\n `Loaded \"${result.spec.name}\" from artifact`,\n 'success',\n 3000\n );\n this.cdr.detectChanges();\n }\n\n async HandleFileSelect(event: Event): Promise<void> {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n if (!file || !file.name.endsWith('.json')) return;\n\n try {\n const content = await this.readFile(file);\n const spec = JSON.parse(content) as ComponentSpec;\n if (!spec.name || !spec.code) {\n console.error('Invalid spec: missing name or code');\n return;\n }\n this.handleSpecImport(spec, file.name, 'File');\n input.value = '';\n } catch (error) {\n console.error('Error loading file:', error);\n }\n }\n\n private handleSpecImport(spec: ComponentSpec, filename: string, status: string): void {\n const component: FileLoadedComponent = {\n id: this.state.GenerateId(),\n name: spec.name,\n description: spec.description,\n specification: spec,\n filename,\n loadedAt: new Date(),\n isFileLoaded: true,\n type: spec.type || 'Component',\n status\n };\n\n this.state.AddFileLoadedComponent(component);\n this.state.ExpandedComponent = component;\n this.state.RunComponent(component);\n }\n\n ExportToArtifact(): void {\n this.exportDropdownOpen = false;\n const currentSpec = this.state.GetCurrentSpec();\n if (!currentSpec || !this.state.SelectedComponent) return;\n\n this.ShowArtifactSelectionDialog = true;\n this.cdr.detectChanges();\n }\n\n async OnArtifactSelectionClose(result: ArtifactSelectionResult | undefined): Promise<void> {\n this.ShowArtifactSelectionDialog = false;\n if (!result?.action) {\n this.cdr.detectChanges();\n return;\n }\n\n const currentSpec = this.state.GetCurrentSpec();\n if (!currentSpec) return;\n\n try {\n const artifact = result.artifact;\n let version: MJArtifactVersionEntity;\n\n if (result.action === 'update-version' && result.versionToUpdate) {\n version = result.versionToUpdate;\n } else {\n version = await this.metadata.GetEntityObject<MJArtifactVersionEntity>('MJ: Artifact Versions');\n version.ArtifactID = artifact.ID;\n version.UserID = this.metadata.CurrentUser.ID;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const versionsResult = await rv.RunView<MJArtifactVersionEntity>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ArtifactID = '${artifact.ID}'`,\n OrderBy: 'VersionNumber DESC',\n MaxRows: 1,\n ResultType: 'entity_object'\n });\n\n version.VersionNumber = (versionsResult.Success && versionsResult.Results?.length > 0)\n ? versionsResult.Results[0].VersionNumber + 1\n : 1;\n }\n\n version.Content = JSON.stringify(currentSpec, null, 2);\n version.ContentHash = await this.generateSHA256Hash(version.Content);\n version.Name = currentSpec.name;\n version.Description = currentSpec.description || null;\n const timestamp = new Date().toISOString();\n const actionText = result.action === 'update-version' ? 'Updated' : 'Created';\n version.Comments = `${actionText} from Component Studio at ${timestamp}`;\n\n const saved = await version.Save();\n if (saved) {\n this.notificationService.CreateSimpleNotification(\n `Saved as artifact version ${version.VersionNumber}`,\n 'success',\n 3000\n );\n } else {\n this.notificationService.CreateSimpleNotification('Failed to save artifact version', 'error');\n }\n } catch (error) {\n console.error('Error saving to artifact:', error);\n this.notificationService.CreateSimpleNotification('Error saving to artifact', 'error');\n }\n this.cdr.detectChanges();\n }\n\n ExportToFile(): void {\n this.exportDropdownOpen = false;\n const currentSpec = this.state.GetCurrentSpec();\n if (!currentSpec || !this.state.SelectedComponent) return;\n\n const componentName = this.state.GetComponentName(this.state.SelectedComponent);\n const filename = componentName.replace(/\\s+/g, '-').replace(/[^a-z0-9\\-]/gi, '-').toLowerCase() + '.json';\n const blob = new Blob([JSON.stringify(currentSpec, null, 2)], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n\n async ExportToClipboard(): Promise<void> {\n this.exportDropdownOpen = false;\n const currentSpec = this.state.GetCurrentSpec();\n if (!currentSpec) return;\n\n try {\n await navigator.clipboard.writeText(JSON.stringify(currentSpec, null, 2));\n this.notificationService.CreateSimpleNotification('Copied to clipboard', 'success', 2000);\n } catch (error) {\n this.notificationService.CreateSimpleNotification('Failed to copy to clipboard', 'error');\n }\n }\n\n async RefreshData(): Promise<void> {\n await this.state.LoadComponents();\n }\n\n // ============================================================\n // RESIZE HANDLERS\n // ============================================================\n\n OnLeftResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.resizeType = 'left';\n this.resizeStartX = event.clientX;\n this.resizeStartValue = this.leftPanelWidth;\n this.addResizeListeners();\n }\n\n OnRightResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.resizeType = 'right';\n this.resizeStartX = event.clientX;\n this.resizeStartValue = this.rightPanelWidth;\n this.addResizeListeners();\n }\n\n OnCenterResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.resizeType = 'center';\n this.resizeStartX = event.clientX;\n this.resizeStartValue = this.previewFlexPercent;\n this.addResizeListeners();\n }\n\n private addResizeListeners(): void {\n this.IsResizing = true;\n document.addEventListener('mousemove', this.onResizeMove);\n document.addEventListener('mouseup', this.onResizeEnd);\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n\n private onResizeMove = (event: MouseEvent): void => {\n if (this.resizeType === 'left') {\n const delta = event.clientX - this.resizeStartX;\n this.leftPanelWidth = Math.max(280, Math.min(600, this.resizeStartValue + delta));\n } else if (this.resizeType === 'right') {\n const delta = this.resizeStartX - event.clientX;\n this.rightPanelWidth = Math.max(300, Math.min(600, this.resizeStartValue + delta));\n } else if (this.resizeType === 'center') {\n const centerPanel = document.querySelector('.panel-center') as HTMLElement;\n if (centerPanel) {\n const rect = centerPanel.getBoundingClientRect();\n const relativeX = event.clientX - rect.left;\n const percent = Math.max(20, Math.min(80, (relativeX / rect.width) * 100));\n this.previewFlexPercent = percent;\n this.previewFlex = `1 1 ${percent}%`;\n this.editorFlex = `1 1 ${100 - percent}%`;\n }\n }\n this.cdr.detectChanges();\n };\n\n private onResizeEnd = (): void => {\n this.IsResizing = false;\n this.resizeType = null;\n document.removeEventListener('mousemove', this.onResizeMove);\n document.removeEventListener('mouseup', this.onResizeEnd);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.saveUserPreferencesDebounced();\n };\n\n // ============================================================\n // HELPERS\n // ============================================================\n\n private readFile(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (e) => resolve(e.target?.result as string);\n reader.onerror = reject;\n reader.readAsText(file);\n });\n }\n\n private async generateSHA256Hash(content: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(content);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n }\n}\n","<div class=\"component-studio\" [class.resizing]=\"IsResizing\">\n\n <!-- ============================================================\n TOOLBAR — Unified bar with integrated breadcrumb\n Left: hamburger + breadcrumb context\n Right: Save | Export | divider | AI | Keyboard | Refresh\n ============================================================ -->\n <div class=\"studio-toolbar\">\n <div class=\"toolbar-context\">\n <!-- Toggle left panel -->\n <button class=\"tb-btn icon-only\" title=\"Toggle browser panel\" (click)=\"ToggleLeftPanel()\">\n <i class=\"fa-solid fa-bars\"></i>\n </button>\n\n @if (state.SelectedComponent) {\n <span class=\"breadcrumb-type\">\n <i class=\"fa-solid fa-cube\"></i>\n {{ state.GetComponentType(state.SelectedComponent) || 'Component' }}\n </span>\n <span class=\"breadcrumb-sep\"><i class=\"fa-solid fa-chevron-right\"></i></span>\n <span class=\"component-label\">{{ state.GetComponentName(state.SelectedComponent) }}</span>\n\n @if (state.IsRunning) {\n <span class=\"running-badge\">\n <span class=\"running-dot-small\"></span>\n Running\n </span>\n }\n @if (state.HasUnsavedChanges) {\n <span class=\"unsaved-dot\" title=\"Unsaved changes\"></span>\n }\n }\n </div>\n\n <div class=\"toolbar-spacer\"></div>\n\n <div class=\"toolbar-actions\">\n <!-- Save Version -->\n @if (state.SelectedComponent) {\n <button class=\"tb-btn primary\" (click)=\"SaveVersion()\" title=\"Save version (Ctrl+S)\">\n <i class=\"fa-solid fa-save\"></i> Save\n </button>\n }\n\n <!-- Refresh Component -->\n @if (state.SelectedComponent && state.IsRunning) {\n <button class=\"tb-btn\" (click)=\"RefreshComponent()\" title=\"Refresh component\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n }\n\n <!-- Export -->\n @if (state.SelectedComponent && state.IsRunning) {\n <div class=\"header-dropdown\" [class.open]=\"exportDropdownOpen\">\n <button class=\"tb-btn\" (click)=\"ToggleExportDropdown()\">\n <i class=\"fa-solid fa-file-export\"></i> Export\n <i class=\"fa-solid fa-chevron-down dropdown-icon\"></i>\n </button>\n @if (exportDropdownOpen) {\n <div class=\"dropdown-menu\">\n <button class=\"dropdown-item\" (click)=\"ExportToArtifact()\">\n <i class=\"fa-solid fa-save\"></i> To Artifact\n </button>\n <button class=\"dropdown-item\" (click)=\"ExportToFile()\">\n <i class=\"fa-solid fa-file\"></i> To File\n </button>\n <button class=\"dropdown-item\" (click)=\"ExportToClipboard()\">\n <i class=\"fa-solid fa-clipboard\"></i> To Clipboard\n </button>\n </div>\n }\n </div>\n }\n\n <span class=\"toolbar-divider\"></span>\n\n <!-- AI Panel Toggle -->\n <button class=\"tb-btn icon-only\" [class.active-toggle]=\"!state.IsAIPanelCollapsed\"\n (click)=\"ToggleAIPanel()\"\n [title]=\"state.IsAIPanelCollapsed ? 'Show AI Assistant' : 'Hide AI Assistant'\">\n <i class=\"fa-solid fa-robot\"></i>\n </button>\n\n <!-- Keyboard Shortcuts -->\n <button class=\"tb-btn icon-only\" (click)=\"ShowKeyboardShortcuts = !ShowKeyboardShortcuts\"\n title=\"Keyboard shortcuts (?)\">\n <i class=\"fa-solid fa-keyboard\"></i>\n </button>\n\n <!-- Refresh -->\n <button class=\"tb-btn icon-only\" (click)=\"RefreshData()\" [disabled]=\"state.IsLoading\" title=\"Refresh data\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </button>\n </div>\n\n <!-- Hidden file input -->\n <input #fileInput type=\"file\" accept=\".json\" (change)=\"HandleFileSelect($event)\" style=\"display: none;\" />\n </div>\n\n <!-- ============================================================\n THREE-PANEL BODY\n ============================================================ -->\n <div class=\"studio-body\">\n\n <!-- Left Panel: Component Browser (collapsible) -->\n @if (!IsLeftPanelCollapsed) {\n <div class=\"panel panel-left\" [style.width.px]=\"leftPanelWidth\">\n <mj-component-browser\n (NewComponent)=\"OnNewComponent()\"\n (ImportFromFile)=\"ImportFromFile()\"\n (ImportFromText)=\"ImportFromText()\"\n (ImportFromArtifact)=\"ImportFromArtifact()\">\n </mj-component-browser>\n </div>\n\n <!-- Resize Handle: Left <-> Center -->\n <div class=\"resize-handle\" (mousedown)=\"OnLeftResizeStart($event)\"></div>\n }\n\n <!-- Center Panel: Workspace (side-by-side: Preview LEFT, Editor RIGHT) -->\n <div class=\"panel panel-center\">\n @if (state.SelectedComponent) {\n <!-- Preview (left side) -->\n <div class=\"workspace-preview\" [class.full-width]=\"IsEditorPanelCollapsed\" [style.flex]=\"IsEditorPanelCollapsed ? '1 1 100%' : previewFlex\">\n <div class=\"preview-sub-header\">\n <div class=\"preview-sub-left\">\n <i class=\"fa-solid fa-eye\"></i>\n <span>Preview</span>\n </div>\n <div class=\"preview-sub-right\">\n <!-- Toggle editor panel -->\n <button class=\"toggle-editors-btn\" [class.active]=\"!IsEditorPanelCollapsed\"\n (click)=\"ToggleEditorPanel()\" title=\"Toggle editor panel\">\n <i class=\"fa-solid fa-columns\"></i>\n </button>\n </div>\n </div>\n <div class=\"preview-body\">\n <mj-component-preview\n (AskAIToFix)=\"OnAskAIToFix($event)\">\n </mj-component-preview>\n </div>\n </div>\n\n <!-- Resize Handle: Preview <-> Editor (obvious center divider) -->\n @if (!IsEditorPanelCollapsed) {\n <div class=\"resize-handle center-divider\" (mousedown)=\"OnCenterResizeStart($event)\">\n <div class=\"divider-grip\"></div>\n </div>\n }\n\n <!-- Editor Tabs (right side, collapsible) -->\n @if (!IsEditorPanelCollapsed) {\n <div class=\"workspace-editors\" [style.flex]=\"editorFlex\">\n <mj-editor-tabs></mj-editor-tabs>\n </div>\n }\n } @else {\n <!-- Enhanced Empty State -->\n <div class=\"empty-state\">\n <div class=\"empty-state-content\">\n <div class=\"empty-state-icon\">\n <i class=\"fa-solid fa-rocket\"></i>\n </div>\n <h2>Ready to Build</h2>\n <p>Select a component from the browser or create a new one to get started</p>\n <div class=\"empty-state-actions\">\n <button mjButton variant=\"primary\" (click)=\"OnNewComponent()\">\n <span class=\"fa-solid fa-plus\"></span> New Component\n </button>\n <button mjButton (click)=\"ImportFromFile()\">\n <span class=\"fa-solid fa-file-import\"></span> Import\n </button>\n </div>\n <div class=\"quick-start-templates\">\n <span class=\"quick-start-label\">Quick start:</span>\n <button class=\"quick-start-btn\" (click)=\"OnQuickStart('dashboard')\">\n <i class=\"fa-solid fa-chart-line\"></i> Dashboard\n </button>\n <button class=\"quick-start-btn\" (click)=\"OnQuickStart('report')\">\n <i class=\"fa-solid fa-file-alt\"></i> Report\n </button>\n <button class=\"quick-start-btn\" (click)=\"OnQuickStart('chart')\">\n <i class=\"fa-solid fa-chart-pie\"></i> Chart\n </button>\n <button class=\"quick-start-btn\" (click)=\"OnQuickStart('form')\">\n <i class=\"fa-solid fa-edit\"></i> Form\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Resize Handle: Center <-> Right -->\n @if (!state.IsAIPanelCollapsed) {\n <div class=\"resize-handle\" (mousedown)=\"OnRightResizeStart($event)\"></div>\n }\n\n <!-- Right Panel: AI Assistant -->\n @if (!state.IsAIPanelCollapsed) {\n <div class=\"panel panel-right\" [style.width.px]=\"rightPanelWidth\">\n <mj-ai-assistant-panel></mj-ai-assistant-panel>\n </div>\n }\n </div>\n\n <!-- ============================================================\n STATUS BAR\n ============================================================ -->\n <div class=\"status-bar\">\n <div class=\"status-left\">\n <span class=\"status-item\">\n <i class=\"fa-solid fa-cube\"></i>\n {{ state.FilteredComponents.length }} component{{ state.FilteredComponents.length !== 1 ? 's' : '' }}\n </span>\n </div>\n <div class=\"status-right\">\n @if (LastSavedTime) {\n <span class=\"status-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n Saved {{ LastSavedTime | date:'shortTime' }}\n </span>\n }\n <span class=\"status-item shortcut-hint\">\n <kbd>?</kbd> Shortcuts\n </span>\n </div>\n </div>\n\n <!-- ============================================================\n KEYBOARD SHORTCUTS OVERLAY\n ============================================================ -->\n @if (ShowKeyboardShortcuts) {\n <div class=\"shortcuts-overlay\" (click)=\"ShowKeyboardShortcuts = false\">\n <div class=\"shortcuts-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"shortcuts-header\">\n <h3>Keyboard Shortcuts</h3>\n <button class=\"shortcuts-close\" (click)=\"ShowKeyboardShortcuts = false\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"shortcuts-body\">\n <div class=\"shortcut-group\">\n <h4>General</h4>\n <div class=\"shortcut-row\">\n <span class=\"shortcut-keys\"><kbd>Ctrl</kbd> + <kbd>S</kbd></span>\n <span class=\"shortcut-desc\">Save version</span>\n </div>\n <div class=\"shortcut-row\">\n <span class=\"shortcut-keys\"><kbd>Ctrl</kbd> + <kbd>N</kbd></span>\n <span class=\"shortcut-desc\">New component</span>\n </div>\n <div class=\"shortcut-row\">\n <span class=\"shortcut-keys\"><kbd>?</kbd></span>\n <span class=\"shortcut-desc\">Toggle shortcuts</span>\n </div>\n <div class=\"shortcut-row\">\n <span class=\"shortcut-keys\"><kbd>Esc</kbd></span>\n <span class=\"shortcut-desc\">Close overlay</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- ============================================================\n NEW COMPONENT DIALOG\n ============================================================ -->\n @if (ShowNewComponentDialog) {\n <mj-new-component-dialog\n [Visible]=\"ShowNewComponentDialog\"\n (Close)=\"OnNewComponentDialogClose($event)\">\n </mj-new-component-dialog>\n }\n\n @if (ShowSaveVersionDialog) {\n <mj-save-version-dialog\n [Visible]=\"ShowSaveVersionDialog\"\n [CurrentVersion]=\"versionService.CurrentVersionNumber\"\n (Save)=\"OnSaveVersionConfirm($event)\"\n (Cancel)=\"ShowSaveVersionDialog = false\">\n </mj-save-version-dialog>\n }\n\n <!-- Text Import Dialog -->\n @if (ShowTextImportDialog) {\n <mj-dialog [Visible]=\"true\" Title=\"Import Component from Text\" (Close)=\"OnTextImportCancel()\" [Width]=\"700\" [MinWidth]=\"500\">\n <app-text-import-dialog\n (importSpec)=\"OnTextImportSpec($event)\"\n (cancelDialog)=\"OnTextImportCancel()\">\n </app-text-import-dialog>\n </mj-dialog>\n }\n\n <!-- Artifact Load Dialog -->\n @if (ShowArtifactLoadDialog) {\n <app-artifact-load-dialog\n [Visible]=\"ShowArtifactLoadDialog\"\n (Close)=\"OnArtifactLoadClose($event)\">\n </app-artifact-load-dialog>\n }\n\n <!-- Artifact Selection Dialog -->\n @if (ShowArtifactSelectionDialog) {\n <app-artifact-selection-dialog\n [Visible]=\"ShowArtifactSelectionDialog\"\n (Close)=\"OnArtifactSelectionClose($event)\">\n </app-artifact-selection-dialog>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"component-studio-dashboard.component.js","sourceRoot":"","sources":["../../src/ComponentStudio/component-studio-dashboard.component.ts","../../src/ComponentStudio/component-studio-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, AfterViewInit, OnDestroy, ViewChild, ElementRef, ChangeDetectorRef, HostListener } from '@angular/core';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { Metadata, IMetadataProvider } from '@memberjunction/core';\nimport {\n MJComponentEntityExtended,\n MJArtifactVersionEntity,\n ResourceData,\n UserInfoEngine\n} from '@memberjunction/core-entities';\nimport { Subject, takeUntil } from 'rxjs';\nimport { ComponentSpec } from '@memberjunction/interactive-component-types';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { ArtifactSelectionResult } from './components/artifact-selection-dialog.component';\nimport { ArtifactLoadResult } from './components/artifact-load-dialog.component';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { ComponentStudioStateService, FileLoadedComponent, ComponentError } from './services/component-studio-state.service';\nimport { ComponentVersionService } from './services/component-version.service';\nimport { SaveVersionResult } from './components/save-version-dialog/save-version-dialog.component';\nimport { RunView } from '@memberjunction/core';\nimport { FormOverrideDialogResult } from './components/form-override-dialog.component';\nimport { EntityFormOverrideService } from './services/entity-form-override.service';\nimport {\n generateCanvasId,\n type FormCanvasElement,\n type FormCanvasModel,\n type FormCanvasSection,\n} from './services/form-canvas-model';\nimport { generateCodeFromCanvas } from './services/canvas-to-code';\n\n/**\n * User preferences persisted via UserInfoEngine.\n */\ninterface ComponentStudioPreferences {\n leftPanelWidth: number;\n rightPanelWidth: number;\n previewFlexPercent: number;\n isAIPanelCollapsed: boolean;\n isLeftPanelCollapsed: boolean;\n isEditorPanelCollapsed: boolean;\n}\n\n/**\n * Result from the New Component dialog.\n */\nexport interface NewComponentResult {\n name: string;\n title: string;\n description: string;\n type: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-component-studio-dashboard',\n templateUrl: './component-studio-dashboard.component.html',\n styleUrls: ['./component-studio-dashboard.component.css'],\n providers: [ComponentStudioStateService, ComponentVersionService]\n})\n@RegisterClass(BaseDashboard, 'ComponentStudioDashboard')\nexport class ComponentStudioDashboardComponent extends BaseDashboard implements AfterViewInit, OnDestroy {\n\n private static readonly USER_PREFS_KEY = 'ComponentStudio.UserPreferences';\n\n // --- Panel widths ---\n public leftPanelWidth = 340;\n public rightPanelWidth = 380;\n public previewFlex = '1 1 50%';\n public editorFlex = '1 1 50%';\n private previewFlexPercent = 50;\n\n // --- Dropdown states ---\n public exportDropdownOpen = false;\n\n // --- Resize state ---\n public IsResizing = false;\n private resizeType: 'left' | 'right' | 'center' | null = null;\n private resizeStartX = 0;\n private resizeStartValue = 0;\n\n // --- Collapsible panels ---\n public IsLeftPanelCollapsed = false;\n public IsEditorPanelCollapsed = false;\n\n // --- Dialog states ---\n public ShowNewComponentDialog = false;\n public ShowKeyboardShortcuts = false;\n public ShowSaveVersionDialog = false;\n public ShowTextImportDialog = false;\n public ShowArtifactLoadDialog = false;\n public ShowArtifactSelectionDialog = false;\n /** Toggled after a form-role Component is saved (see OnSaveVersionConfirm). */\n public ShowFormOverrideDialog = false;\n /** ComponentID of the just-saved Component, set when ShowFormOverrideDialog flips on. */\n public PendingOverrideComponentID: string | null = null;\n /** Entity name to seed the override dialog from (mirrors state.FormTargetEntityName). */\n public PendingOverrideEntityName = '';\n /** Component name to seed the override Name field. */\n public PendingOverrideComponentName = '';\n\n // --- Status bar ---\n public LastSavedTime: Date | null = null;\n\n // --- Preferences ---\n private prefsLoaded = false;\n\n @ViewChild('fileInput', { static: false }) fileInput?: ElementRef<HTMLInputElement>;\n\n protected override destroy$ = new Subject<void>();\n private get metadata(): IMetadataProvider { return this.ProviderToUse; }\n\n constructor(\n public state: ComponentStudioStateService,\n public versionService: ComponentVersionService,\n private cdr: ChangeDetectorRef,\n private notificationService: MJNotificationService,\n private entityFormOverrideService: EntityFormOverrideService\n ) {\n super();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Component Studio';\n }\n\n async ngAfterViewInit() {\n this.initDashboard();\n\n // Subscribe to state changes for change detection\n this.state.StateChanged.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.cdr.detectChanges();\n });\n\n // Form Builder tab \"Open in Chat\" — relay to NavigationService.\n this.state.OpenInChatRequested.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.OnOpenFormInChat();\n });\n\n this.loadUserPreferences();\n await this.state.LoadComponents();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n protected initDashboard(): void {\n // Wire up provider-aware services for multi-provider support\n this.state.Provider = this.ProviderToUse;\n this.versionService.Provider = this.ProviderToUse;\n }\n\n protected loadData(): void {\n this.state.LoadComponents();\n }\n\n // ============================================================\n // USER PREFERENCES\n // ============================================================\n\n private loadUserPreferences(): void {\n try {\n const saved = UserInfoEngine.Instance.GetSetting(ComponentStudioDashboardComponent.USER_PREFS_KEY);\n if (saved) {\n const prefs = JSON.parse(saved) as ComponentStudioPreferences;\n this.applyPreferences(prefs);\n }\n } catch (error) {\n console.warn('[ComponentStudio] Failed to load user preferences:', error);\n } finally {\n this.prefsLoaded = true;\n }\n }\n\n private applyPreferences(prefs: ComponentStudioPreferences): void {\n if (prefs.leftPanelWidth) this.leftPanelWidth = prefs.leftPanelWidth;\n if (prefs.rightPanelWidth) this.rightPanelWidth = prefs.rightPanelWidth;\n if (prefs.previewFlexPercent) {\n this.previewFlexPercent = prefs.previewFlexPercent;\n this.previewFlex = `1 1 ${prefs.previewFlexPercent}%`;\n this.editorFlex = `1 1 ${100 - prefs.previewFlexPercent}%`;\n }\n if (prefs.isAIPanelCollapsed != null) {\n this.state.IsAIPanelCollapsed = prefs.isAIPanelCollapsed;\n }\n if (prefs.isLeftPanelCollapsed != null) {\n this.IsLeftPanelCollapsed = prefs.isLeftPanelCollapsed;\n }\n if (prefs.isEditorPanelCollapsed != null) {\n this.IsEditorPanelCollapsed = prefs.isEditorPanelCollapsed;\n }\n }\n\n private getCurrentPreferences(): ComponentStudioPreferences {\n return {\n leftPanelWidth: this.leftPanelWidth,\n rightPanelWidth: this.rightPanelWidth,\n previewFlexPercent: this.previewFlexPercent,\n isAIPanelCollapsed: this.state.IsAIPanelCollapsed,\n isLeftPanelCollapsed: this.IsLeftPanelCollapsed,\n isEditorPanelCollapsed: this.IsEditorPanelCollapsed\n };\n }\n\n private saveUserPreferences(): void {\n if (!this.prefsLoaded) return;\n try {\n UserInfoEngine.Instance.SetSetting(\n ComponentStudioDashboardComponent.USER_PREFS_KEY,\n JSON.stringify(this.getCurrentPreferences())\n );\n } catch (error) {\n console.warn('[ComponentStudio] Failed to save user preferences:', error);\n }\n }\n\n private saveUserPreferencesDebounced(): void {\n if (!this.prefsLoaded) return;\n try {\n UserInfoEngine.Instance.SetSettingDebounced(\n ComponentStudioDashboardComponent.USER_PREFS_KEY,\n JSON.stringify(this.getCurrentPreferences())\n );\n } catch (error) {\n console.warn('[ComponentStudio] Failed to save user preferences:', error);\n }\n }\n\n // ============================================================\n // KEYBOARD SHORTCUTS\n // ============================================================\n\n @HostListener('document:keydown', ['$event'])\n OnKeyDown(event: KeyboardEvent): void {\n const target = event.target as HTMLElement;\n const isInputFocused = target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable;\n\n // Ctrl+S / Cmd+S = Save Version\n if ((event.ctrlKey || event.metaKey) && event.key === 's') {\n event.preventDefault();\n if (this.state.SelectedComponent) {\n this.SaveVersion();\n }\n }\n\n // Ctrl+N / Cmd+N = New Component\n if ((event.ctrlKey || event.metaKey) && event.key === 'n') {\n event.preventDefault();\n this.OnNewComponent();\n }\n\n // Ctrl+/ or ? = Toggle keyboard shortcuts\n if ((event.ctrlKey || event.metaKey) && event.key === '/') {\n event.preventDefault();\n this.ShowKeyboardShortcuts = !this.ShowKeyboardShortcuts;\n this.cdr.detectChanges();\n } else if (event.key === '?' && !isInputFocused) {\n this.ShowKeyboardShortcuts = !this.ShowKeyboardShortcuts;\n this.cdr.detectChanges();\n }\n\n // Escape = Close overlays\n if (event.key === 'Escape') {\n if (this.ShowKeyboardShortcuts) {\n this.ShowKeyboardShortcuts = false;\n this.cdr.detectChanges();\n }\n }\n }\n\n // ============================================================\n // SAVE VERSION\n // ============================================================\n\n SaveVersion(): void {\n if (!this.state.SelectedComponent) return;\n this.ShowSaveVersionDialog = true;\n this.cdr.detectChanges();\n }\n\n async OnSaveVersionConfirm(result: SaveVersionResult): Promise<void> {\n this.ShowSaveVersionDialog = false;\n\n // If the Form Builder tab is the active surface and the canvas has\n // content, serialize it to JSX BEFORE the version save so the canvas\n // edits actually persist. If the user is in the Code tab instead, the\n // EditableCode they hand-edited is already the source of truth.\n if (this.IsFormRoleComponent && this.state.ActiveTab === 5 && this.state.FormCanvas && this.state.FormSchema) {\n const canvas = this.state.FormCanvas;\n const schema = this.state.FormSchema;\n const name = canvas.title?.trim() || schema.displayName;\n this.state.EditableCode = generateCodeFromCanvas(canvas, schema, name);\n }\n\n let success: boolean;\n if (result.Mode === 'update') {\n success = await this.versionService.UpdateCurrentVersion(result.Comment || undefined);\n } else {\n success = await this.versionService.SaveVersion(result.Comment || undefined);\n }\n\n if (success) {\n this.LastSavedTime = new Date();\n this.notificationService.CreateSimpleNotification(\n `Saved as v${this.versionService.CurrentVersionNumber}`,\n 'success',\n 3000\n );\n this.state.HasUnsavedChanges = false;\n\n // For form-role Components, prompt the user to create an\n // EntityFormOverride so the saved Component actually activates for\n // someone. Skip silently if the post-save state didn't yield a\n // ComponentID (loading state, network blip).\n if (this.IsFormRoleComponent && this.state.FormTargetEntityName) {\n const spec = this.state.GetCurrentSpec?.();\n const componentID = (spec as { id?: string } | null)?.id ?? null;\n if (componentID) {\n this.PendingOverrideComponentID = componentID;\n this.PendingOverrideEntityName = this.state.FormTargetEntityName;\n this.PendingOverrideComponentName = spec?.name ?? '';\n this.ShowFormOverrideDialog = true;\n }\n }\n } else {\n this.notificationService.CreateSimpleNotification(\n 'Failed to save version',\n 'error'\n );\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Handle the post-save override dialog. Persists an EntityFormOverride\n * row via {@link EntityFormOverrideService}. Currently surfaces an error\n * because the underlying write is blocked on the generated\n * `EntityFormOverrideEntity` class (Task 15) — the UI is wired so the\n * unblock is one swap of the service stub.\n */\n async OnFormOverrideDialogConfirm(result: FormOverrideDialogResult): Promise<void> {\n this.ShowFormOverrideDialog = false;\n if (!this.PendingOverrideComponentID) {\n this.cdr.detectChanges();\n return;\n }\n\n const overrideService = this.entityFormOverrideService;\n const provider = this.ProviderToUse;\n const user = provider?.CurrentUser;\n if (!user) {\n this.notificationService.CreateSimpleNotification(\n 'No current user — cannot create override.',\n 'error'\n );\n this.cdr.detectChanges();\n return;\n }\n\n const writeResult = await overrideService.CreateOverride(\n this.PendingOverrideComponentID,\n result,\n user,\n provider,\n );\n\n if (writeResult.Success) {\n this.notificationService.CreateSimpleNotification(\n `Override \"${result.Name}\" created. Next time you open a ${result.EntityName} record you'll see this form.`,\n 'success',\n 4000,\n );\n } else {\n this.notificationService.CreateSimpleNotification(\n writeResult.Error || 'Failed to create override.',\n 'warning',\n 6000,\n );\n }\n this.PendingOverrideComponentID = null;\n this.cdr.detectChanges();\n }\n\n OnFormOverrideDialogDismiss(): void {\n this.ShowFormOverrideDialog = false;\n this.PendingOverrideComponentID = null;\n this.cdr.detectChanges();\n }\n\n // ============================================================\n // REFRESH COMPONENT\n // ============================================================\n\n RefreshComponent(): void {\n this.state.RefreshComponent.emit();\n }\n\n // ============================================================\n // AI PANEL\n // ============================================================\n\n ToggleAIPanel(): void {\n this.state.IsAIPanelCollapsed = !this.state.IsAIPanelCollapsed;\n this.saveUserPreferences();\n this.cdr.detectChanges();\n }\n\n ToggleLeftPanel(): void {\n this.IsLeftPanelCollapsed = !this.IsLeftPanelCollapsed;\n this.saveUserPreferences();\n this.cdr.detectChanges();\n }\n\n ToggleEditorPanel(): void {\n this.IsEditorPanelCollapsed = !this.IsEditorPanelCollapsed;\n this.saveUserPreferences();\n this.cdr.detectChanges();\n }\n\n OnAskAIToFix(error: ComponentError): void {\n // Open AI panel if collapsed\n if (this.state.IsAIPanelCollapsed) {\n this.state.IsAIPanelCollapsed = false;\n }\n // Send error to AI panel\n this.state.SendErrorToAI.emit(error);\n this.cdr.detectChanges();\n }\n\n // ============================================================\n // NEW COMPONENT\n // ============================================================\n\n OnNewComponent(): void {\n this.ShowNewComponentDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * True iff the currently-loaded Component declares itself as a form-role\n * component. Controls whether the right rail renders the field-binding\n * inspector or the default AI assistant panel.\n */\n public get IsFormRoleComponent(): boolean {\n const spec = this.state.GetCurrentSpec?.();\n return spec?.componentRole === 'form' || spec?.type === 'form';\n }\n\n /**\n * Forwards a snippet emitted by the field-binding inspector to the code\n * editor. Inserts at the end of the current code with a leading blank\n * line so it lands inside the function body but doesn't clobber the\n * cursor's current position. (Cursor-aware insertion is a follow-up —\n * it requires plumbing EditorView refs from this component through\n * EditorTabs → CodeEditorPanel → mj-code-editor.)\n */\n public OnFieldSnippetRequested(snippet: string): void {\n if (!snippet) return;\n const existing = this.state.EditableCode ?? '';\n const separator = existing.endsWith('\\n') ? '\\n' : '\\n\\n';\n this.state.EditableCode = existing + separator + snippet + '\\n';\n this.cdr.detectChanges();\n }\n\n // ============================================================\n // FORM BUILDER — right-panel event handlers\n // (Mirrors what the Form Builder tab does internally, but routed\n // through here so the right panel works regardless of which editor\n // tab is currently active.)\n // ============================================================\n\n public OnFormBuilderElementChanged(next: FormCanvasElement): void {\n const canvas = this.state.FormCanvas;\n if (!canvas) return;\n const updated: FormCanvasModel = {\n ...canvas,\n sections: canvas.sections.map(s => ({\n ...s,\n elements: s.elements.map(e => e.id === next.id ? next : e),\n })),\n };\n this.applyCanvasUpdate(updated);\n }\n\n public OnFormBuilderSectionChanged(next: FormCanvasSection): void {\n const canvas = this.state.FormCanvas;\n if (!canvas) return;\n const updated: FormCanvasModel = {\n ...canvas,\n sections: canvas.sections.map(s => s.id === next.id ? next : s),\n };\n this.applyCanvasUpdate(updated);\n }\n\n public OnFormBuilderElementDeleted(elementId: string): void {\n const canvas = this.state.FormCanvas;\n if (!canvas) return;\n const updated: FormCanvasModel = {\n ...canvas,\n sections: canvas.sections.map(s => ({\n ...s,\n elements: s.elements.filter(e => e.id !== elementId),\n })),\n };\n this.state.FormSelectedElementId = null;\n this.applyCanvasUpdate(updated);\n }\n\n public OnFormBuilderSectionDeleted(sectionId: string): void {\n const canvas = this.state.FormCanvas;\n if (!canvas) return;\n const updated: FormCanvasModel = {\n ...canvas,\n sections: canvas.sections.filter(s => s.id !== sectionId),\n };\n this.state.FormSelectedSectionId = null;\n this.applyCanvasUpdate(updated);\n }\n\n public OnFormBuilderFieldAdded(payload: { fieldName: string }): void {\n const canvas = this.state.FormCanvas;\n if (!canvas) return;\n const targetId = this.state.FormSelectedSectionId\n ?? canvas.sections.find(s => s.elements.some(e => e.id === this.state.FormSelectedElementId))?.id\n ?? canvas.sections[0]?.id;\n if (!targetId) return;\n const updated: FormCanvasModel = {\n ...canvas,\n sections: canvas.sections.map(s => s.id === targetId\n ? { ...s, elements: [...s.elements, {\n id: generateCanvasId('field'),\n type: 'field',\n fieldName: payload.fieldName,\n span: 1,\n }] }\n : s),\n };\n this.applyCanvasUpdate(updated);\n }\n\n /**\n * Persist the canvas mutation, mirror it into code, mark the dashboard\n * dirty. Centralised so right-panel events and tab events share the same\n * pipeline.\n */\n private applyCanvasUpdate(next: FormCanvasModel): void {\n this.state.FormCanvas = next;\n this.state.HasUnsavedChanges = true;\n this.regenerateFormCodeFromCanvas();\n this.cdr.detectChanges();\n }\n\n /**\n * Serialise the canvas → JSX into state.EditableCode. Quietly no-ops if\n * we don't have both a canvas and a schema (the FormSelected* events\n * shouldn't fire in that case anyway).\n */\n private regenerateFormCodeFromCanvas(): void {\n const canvas = this.state.FormCanvas;\n const schema = this.state.FormSchema;\n if (!canvas || !schema) return;\n const name = canvas.title?.trim() || schema.displayName;\n this.state.EditableCode = generateCodeFromCanvas(canvas, schema, name);\n }\n\n /**\n * Bridge the Form Builder tab's \"Open in Chat\" button to NavigationService.\n * Publishes the active canvas as agent context and registers an UpdateForm\n * tool so Sage can mutate the canvas live. Falls back to clipboard if the\n * navigation service isn't available (e.g. embedded host).\n */\n private async OnOpenFormInChat(): Promise<void> {\n const canvas = this.state.FormCanvas;\n if (!canvas) {\n this.notificationService.CreateSimpleNotification(\n 'No active form to send to chat.', 'warning',\n );\n return;\n }\n try {\n this.navigationService?.SetAgentContext(this, {\n activeForm: {\n entityName: canvas.entityName,\n title: canvas.title,\n sections: canvas.sections,\n },\n });\n this.navigationService?.SetAgentClientTools(this, [{\n Name: 'UpdateForm',\n Description: 'Replace the canvas model of the active form. Accepts a FormCanvasModel JSON object.',\n ParameterSchema: {\n type: 'object',\n properties: { canvas: { type: 'object', description: 'A FormCanvasModel matching the Form Builder shape.' } },\n required: ['canvas'],\n },\n Handler: async (params: Record<string, unknown>) => {\n const next = (params['canvas'] as FormCanvasModel | undefined) ?? null;\n if (next && Array.isArray(next.sections)) {\n this.applyCanvasUpdate(next);\n return { Success: true };\n }\n return { Success: false, Error: 'Missing or malformed canvas payload.' };\n },\n }]);\n this.notificationService.CreateSimpleNotification(\n 'Form context sent to chat. Open the chat panel to continue.',\n 'info', 4000,\n );\n } catch {\n try {\n await navigator.clipboard.writeText(JSON.stringify(canvas, null, 2));\n this.notificationService.CreateSimpleNotification(\n 'Canvas JSON copied to clipboard. Paste it into chat.',\n 'info', 4000,\n );\n } catch {\n this.notificationService.CreateSimpleNotification(\n 'Could not hand off to chat.', 'warning',\n );\n }\n }\n }\n\n OnNewComponentDialogClose(result: NewComponentResult | null): void {\n this.ShowNewComponentDialog = false;\n if (!result) {\n this.cdr.detectChanges();\n return;\n }\n this.createComponentFromResult(result);\n this.cdr.detectChanges();\n }\n\n OnQuickStart(type: string): void {\n const typeNames: Record<string, string> = {\n dashboard: 'Dashboard',\n report: 'Report',\n chart: 'Chart',\n form: 'Form'\n };\n const typeName = typeNames[type] || 'Component';\n this.createComponentFromResult({\n name: `New ${typeName}`,\n title: `New ${typeName}`,\n description: '',\n type\n });\n }\n\n private createComponentFromResult(result: NewComponentResult): void {\n const isForm = result.type === 'form';\n const newSpec: ComponentSpec = {\n name: result.name,\n title: result.title,\n description: result.description,\n type: result.type,\n // Form-role components opt in to the FormHostProps contract so the\n // resolver mounts them via InteractiveFormComponent at runtime and\n // the linter enforces form-specific shape checks.\n componentRole: isForm ? 'form' : undefined,\n location: 'embedded',\n exampleUsage: '',\n code: this.getTemplateCode(result.name, result.type),\n functionalRequirements: isForm\n ? 'Renders a single entity record using FormHostProps. Supports view / edit / create modes. Emits BeforeSave with the dirty-field diff and BeforeDelete; the Angular wrapper owns BaseEntity persistence.'\n : '',\n dataRequirements: { mode: 'views', entities: [], queries: [], description: '' },\n technicalDesign: isForm\n ? 'Form-role component. Local React state holds a draft diff that overlays FormHostProps.record. Save dispatches NotifyEvent(\\'BeforeSave\\', { dirtyFields }) — the host applies the diff to the BaseEntity. Mode flips are requested via EditModeChangeRequested, never set locally.'\n : ''\n } as ComponentSpec;\n\n const fileComponent: FileLoadedComponent = {\n id: this.state.GenerateId(),\n name: result.name,\n description: result.description,\n specification: newSpec,\n filename: 'new-component.json',\n loadedAt: new Date(),\n isFileLoaded: true,\n type: result.type || 'Dashboard',\n status: 'New'\n };\n\n this.state.AddFileLoadedComponent(fileComponent);\n this.state.ExpandedComponent = fileComponent;\n this.state.RunComponent(fileComponent);\n }\n\n private getTemplateCode(name: string, type: string): string {\n if (type === 'form') {\n return this.getFormTemplateCode(name);\n }\n return `function Component({ utilities, settings }) {\n const React = utilities.React;\n const { useState } = React;\n\n return React.createElement('div', {\n style: { padding: '24px', fontFamily: 'system-ui' }\n },\n React.createElement('h2', null, '${name}'),\n React.createElement('p', null, 'Start building your ${type || 'component'} here.')\n );\n}`;\n }\n\n /**\n * JSX skeleton for form-role components. Pre-wires destructured\n * FormHostProps, local `draft` state for the dirty-field diff, and the\n * three canonical lifecycle events (BeforeSave, BeforeDelete,\n * EditModeChangeRequested). Authors fill in the field rendering; the\n * persistence path is already correct.\n */\n private getFormTemplateCode(name: string): string {\n const componentName = this.toIdentifier(name) || 'Form';\n return `function ${componentName}({\n // FormHostProps (from the Angular wrapper)\n entityName,\n primaryKey,\n record,\n entityMetadata,\n mode,\n canEdit,\n canDelete,\n canCreate,\n // Standard interactive-component props\n utilities,\n styles,\n components,\n callbacks,\n savedUserSettings,\n onSaveUserSettings,\n}) {\n const [draft, setDraft] = React.useState({});\n\n // Track latest draft in a ref so the methods we register below always\n // see the current value without re-registering on every keystroke.\n const draftRef = React.useRef({});\n React.useEffect(() => { draftRef.current = draft; }, [draft]);\n\n const isCreate = mode === \"create\";\n const isEdit = mode === \"edit\";\n const isView = mode === \"view\";\n const editing = isEdit || isCreate;\n\n // Reset the draft diff whenever a new record loads or we return to view.\n React.useEffect(() => {\n setDraft({});\n }, [primaryKey && JSON.stringify(primaryKey), isView]);\n\n // Register the host-callable methods exactly once. The wrapper invokes\n // these when the toolbar (above this component) fires Save / Cancel.\n React.useEffect(() => {\n callbacks?.RegisterMethod?.(\"RequestSave\", () => {\n callbacks?.NotifyEvent?.(\"BeforeSave\", {\n dirtyFields: { ...draftRef.current },\n cancel: false,\n timestamp: new Date(),\n });\n });\n callbacks?.RegisterMethod?.(\"RequestCancel\", () => {\n setDraft({});\n });\n }, []);\n\n const value = (f) => (f in draft ? draft[f] : record?.[f] ?? \"\");\n\n const setField = (f, v) => {\n setDraft((d) => ({ ...d, [f]: v }));\n callbacks?.NotifyEvent?.(\"FieldChanged\", {\n fieldName: f,\n oldValue: record?.[f],\n newValue: v,\n timestamp: new Date(),\n });\n };\n\n if (!record && !isCreate) {\n return <div style={{ padding: 24 }}>No record loaded.</div>;\n }\n\n return (\n <div style={{\n padding: 24,\n background: \"var(--mj-bg-surface, #fff)\",\n color: \"var(--mj-text-primary, #1f2937)\",\n borderRadius: 8,\n border: \"1px solid var(--mj-border-default, #e0e0e0)\",\n }}>\n <h2 style={{ margin: 0, marginBottom: 16 }}>\n {isCreate ? \"New \" + (entityMetadata?.displayName || entityName) : value(entityMetadata?.nameField || \"Name\") || \"(unnamed)\"}\n </h2>\n\n {/* TODO: render each entityMetadata.fields entry as an input.\n Use value(fieldName) to read, setField(fieldName, newValue) to write.\n See the form-builder template at metadata/prompts/templates/sage/form-builder.template.md\n for full guidance, or open this component in chat to have the\n Form Builder agent extend it.\n\n DO NOT render Save / Cancel / Edit / Delete buttons here — the\n host toolbar above this component provides all four. Save is\n wired via the RequestSave method registered above. */}\n </div>\n );\n}`;\n }\n\n /** Sanitises a human-readable component name into a JS identifier. */\n private toIdentifier(name: string): string {\n const cleaned = name.replace(/[^A-Za-z0-9]/g, '');\n if (!cleaned) return '';\n return cleaned.charAt(0).toUpperCase() + cleaned.slice(1);\n }\n\n // ============================================================\n // IMPORT / EXPORT\n // ============================================================\n\n ToggleExportDropdown(): void {\n this.exportDropdownOpen = !this.exportDropdownOpen;\n }\n\n @HostListener('document:click', ['$event'])\n OnDocumentClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (!target.closest('.header-dropdown')) {\n this.exportDropdownOpen = false;\n }\n }\n\n ImportFromFile(): void {\n this.fileInput?.nativeElement.click();\n }\n\n ImportFromText(): void {\n this.ShowTextImportDialog = true;\n this.cdr.detectChanges();\n }\n\n OnTextImportSpec(spec: ComponentSpec): void {\n this.ShowTextImportDialog = false;\n this.handleSpecImport(spec, 'text-import.json', 'Text');\n this.cdr.detectChanges();\n }\n\n OnTextImportCancel(): void {\n this.ShowTextImportDialog = false;\n this.cdr.detectChanges();\n }\n\n ImportFromArtifact(): void {\n this.ShowArtifactLoadDialog = true;\n this.cdr.detectChanges();\n }\n\n OnArtifactLoadClose(result: ArtifactLoadResult | undefined): void {\n this.ShowArtifactLoadDialog = false;\n if (!result) {\n this.cdr.detectChanges();\n return;\n }\n\n const artifactComponent: FileLoadedComponent = {\n id: this.state.GenerateId(),\n name: result.spec.name,\n description: result.spec.description,\n specification: result.spec,\n filename: `${result.artifactName} (v${result.versionNumber})`,\n loadedAt: new Date(),\n isFileLoaded: true,\n type: result.spec.type || 'Component',\n status: 'Artifact',\n sourceArtifactID: result.artifactID,\n sourceVersionID: result.versionID\n };\n\n this.state.AddFileLoadedComponent(artifactComponent);\n this.state.ExpandedComponent = artifactComponent;\n this.state.RunComponent(artifactComponent);\n\n this.notificationService.CreateSimpleNotification(\n `Loaded \"${result.spec.name}\" from artifact`,\n 'success',\n 3000\n );\n this.cdr.detectChanges();\n }\n\n async HandleFileSelect(event: Event): Promise<void> {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n if (!file || !file.name.endsWith('.json')) return;\n\n try {\n const content = await this.readFile(file);\n const spec = JSON.parse(content) as ComponentSpec;\n if (!spec.name || !spec.code) {\n console.error('Invalid spec: missing name or code');\n return;\n }\n this.handleSpecImport(spec, file.name, 'File');\n input.value = '';\n } catch (error) {\n console.error('Error loading file:', error);\n }\n }\n\n private handleSpecImport(spec: ComponentSpec, filename: string, status: string): void {\n const component: FileLoadedComponent = {\n id: this.state.GenerateId(),\n name: spec.name,\n description: spec.description,\n specification: spec,\n filename,\n loadedAt: new Date(),\n isFileLoaded: true,\n type: spec.type || 'Component',\n status\n };\n\n this.state.AddFileLoadedComponent(component);\n this.state.ExpandedComponent = component;\n this.state.RunComponent(component);\n }\n\n ExportToArtifact(): void {\n this.exportDropdownOpen = false;\n const currentSpec = this.state.GetCurrentSpec();\n if (!currentSpec || !this.state.SelectedComponent) return;\n\n this.ShowArtifactSelectionDialog = true;\n this.cdr.detectChanges();\n }\n\n async OnArtifactSelectionClose(result: ArtifactSelectionResult | undefined): Promise<void> {\n this.ShowArtifactSelectionDialog = false;\n if (!result?.action) {\n this.cdr.detectChanges();\n return;\n }\n\n const currentSpec = this.state.GetCurrentSpec();\n if (!currentSpec) return;\n\n try {\n const artifact = result.artifact;\n let version: MJArtifactVersionEntity;\n\n if (result.action === 'update-version' && result.versionToUpdate) {\n version = result.versionToUpdate;\n } else {\n version = await this.metadata.GetEntityObject<MJArtifactVersionEntity>('MJ: Artifact Versions');\n version.ArtifactID = artifact.ID;\n version.UserID = this.metadata.CurrentUser.ID;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const versionsResult = await rv.RunView<MJArtifactVersionEntity>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ArtifactID = '${artifact.ID}'`,\n OrderBy: 'VersionNumber DESC',\n MaxRows: 1,\n ResultType: 'entity_object'\n });\n\n version.VersionNumber = (versionsResult.Success && versionsResult.Results?.length > 0)\n ? versionsResult.Results[0].VersionNumber + 1\n : 1;\n }\n\n version.Content = JSON.stringify(currentSpec, null, 2);\n version.ContentHash = await this.generateSHA256Hash(version.Content);\n version.Name = currentSpec.name;\n version.Description = currentSpec.description || null;\n const timestamp = new Date().toISOString();\n const actionText = result.action === 'update-version' ? 'Updated' : 'Created';\n version.Comments = `${actionText} from Component Studio at ${timestamp}`;\n\n const saved = await version.Save();\n if (saved) {\n this.notificationService.CreateSimpleNotification(\n `Saved as artifact version ${version.VersionNumber}`,\n 'success',\n 3000\n );\n } else {\n this.notificationService.CreateSimpleNotification('Failed to save artifact version', 'error');\n }\n } catch (error) {\n console.error('Error saving to artifact:', error);\n this.notificationService.CreateSimpleNotification('Error saving to artifact', 'error');\n }\n this.cdr.detectChanges();\n }\n\n ExportToFile(): void {\n this.exportDropdownOpen = false;\n const currentSpec = this.state.GetCurrentSpec();\n if (!currentSpec || !this.state.SelectedComponent) return;\n\n const componentName = this.state.GetComponentName(this.state.SelectedComponent);\n const filename = componentName.replace(/\\s+/g, '-').replace(/[^a-z0-9\\-]/gi, '-').toLowerCase() + '.json';\n const blob = new Blob([JSON.stringify(currentSpec, null, 2)], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n\n async ExportToClipboard(): Promise<void> {\n this.exportDropdownOpen = false;\n const currentSpec = this.state.GetCurrentSpec();\n if (!currentSpec) return;\n\n try {\n await navigator.clipboard.writeText(JSON.stringify(currentSpec, null, 2));\n this.notificationService.CreateSimpleNotification('Copied to clipboard', 'success', 2000);\n } catch (error) {\n this.notificationService.CreateSimpleNotification('Failed to copy to clipboard', 'error');\n }\n }\n\n async RefreshData(): Promise<void> {\n await this.state.LoadComponents();\n }\n\n // ============================================================\n // RESIZE HANDLERS\n // ============================================================\n\n OnLeftResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.resizeType = 'left';\n this.resizeStartX = event.clientX;\n this.resizeStartValue = this.leftPanelWidth;\n this.addResizeListeners();\n }\n\n OnRightResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.resizeType = 'right';\n this.resizeStartX = event.clientX;\n this.resizeStartValue = this.rightPanelWidth;\n this.addResizeListeners();\n }\n\n OnCenterResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.resizeType = 'center';\n this.resizeStartX = event.clientX;\n this.resizeStartValue = this.previewFlexPercent;\n this.addResizeListeners();\n }\n\n private addResizeListeners(): void {\n this.IsResizing = true;\n document.addEventListener('mousemove', this.onResizeMove);\n document.addEventListener('mouseup', this.onResizeEnd);\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n\n private onResizeMove = (event: MouseEvent): void => {\n if (this.resizeType === 'left') {\n const delta = event.clientX - this.resizeStartX;\n this.leftPanelWidth = Math.max(280, Math.min(600, this.resizeStartValue + delta));\n } else if (this.resizeType === 'right') {\n const delta = this.resizeStartX - event.clientX;\n this.rightPanelWidth = Math.max(300, Math.min(600, this.resizeStartValue + delta));\n } else if (this.resizeType === 'center') {\n const centerPanel = document.querySelector('.panel-center') as HTMLElement;\n if (centerPanel) {\n const rect = centerPanel.getBoundingClientRect();\n const relativeX = event.clientX - rect.left;\n const percent = Math.max(20, Math.min(80, (relativeX / rect.width) * 100));\n this.previewFlexPercent = percent;\n this.previewFlex = `1 1 ${percent}%`;\n this.editorFlex = `1 1 ${100 - percent}%`;\n }\n }\n this.cdr.detectChanges();\n };\n\n private onResizeEnd = (): void => {\n this.IsResizing = false;\n this.resizeType = null;\n document.removeEventListener('mousemove', this.onResizeMove);\n document.removeEventListener('mouseup', this.onResizeEnd);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.saveUserPreferencesDebounced();\n };\n\n // ============================================================\n // HELPERS\n // ============================================================\n\n private readFile(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (e) => resolve(e.target?.result as string);\n reader.onerror = reject;\n reader.readAsText(file);\n });\n }\n\n private async generateSHA256Hash(content: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(content);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n }\n}\n","<div class=\"component-studio\" [class.resizing]=\"IsResizing\">\n\n <!-- ============================================================\n TOOLBAR — Unified bar with integrated breadcrumb\n Left: hamburger + breadcrumb context\n Right: Save | Export | divider | AI | Keyboard | Refresh\n ============================================================ -->\n <div class=\"studio-toolbar\">\n <div class=\"toolbar-context\">\n <!-- Toggle left panel -->\n <button class=\"tb-btn icon-only\" title=\"Toggle browser panel\" (click)=\"ToggleLeftPanel()\">\n <i class=\"fa-solid fa-bars\"></i>\n </button>\n\n @if (state.SelectedComponent) {\n <span class=\"breadcrumb-type\">\n <i class=\"fa-solid fa-cube\"></i>\n {{ state.GetComponentType(state.SelectedComponent) || 'Component' }}\n </span>\n <span class=\"breadcrumb-sep\"><i class=\"fa-solid fa-chevron-right\"></i></span>\n <span class=\"component-label\">{{ state.GetComponentName(state.SelectedComponent) }}</span>\n\n @if (state.IsRunning) {\n <span class=\"running-badge\">\n <span class=\"running-dot-small\"></span>\n Running\n </span>\n }\n @if (state.HasUnsavedChanges) {\n <span class=\"unsaved-dot\" title=\"Unsaved changes\"></span>\n }\n }\n </div>\n\n <div class=\"toolbar-spacer\"></div>\n\n <div class=\"toolbar-actions\">\n <!-- Save Version -->\n @if (state.SelectedComponent) {\n <button class=\"tb-btn primary\" (click)=\"SaveVersion()\" title=\"Save version (Ctrl+S)\">\n <i class=\"fa-solid fa-save\"></i> Save\n </button>\n }\n\n <!-- Refresh Component -->\n @if (state.SelectedComponent && state.IsRunning) {\n <button class=\"tb-btn\" (click)=\"RefreshComponent()\" title=\"Refresh component\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Refresh\n </button>\n }\n\n <!-- Export -->\n @if (state.SelectedComponent && state.IsRunning) {\n <div class=\"header-dropdown\" [class.open]=\"exportDropdownOpen\">\n <button class=\"tb-btn\" (click)=\"ToggleExportDropdown()\">\n <i class=\"fa-solid fa-file-export\"></i> Export\n <i class=\"fa-solid fa-chevron-down dropdown-icon\"></i>\n </button>\n @if (exportDropdownOpen) {\n <div class=\"dropdown-menu\">\n <button class=\"dropdown-item\" (click)=\"ExportToArtifact()\">\n <i class=\"fa-solid fa-save\"></i> To Artifact\n </button>\n <button class=\"dropdown-item\" (click)=\"ExportToFile()\">\n <i class=\"fa-solid fa-file\"></i> To File\n </button>\n <button class=\"dropdown-item\" (click)=\"ExportToClipboard()\">\n <i class=\"fa-solid fa-clipboard\"></i> To Clipboard\n </button>\n </div>\n }\n </div>\n }\n\n <span class=\"toolbar-divider\"></span>\n\n <!-- AI Panel Toggle -->\n <button class=\"tb-btn icon-only\" [class.active-toggle]=\"!state.IsAIPanelCollapsed\"\n (click)=\"ToggleAIPanel()\"\n [title]=\"state.IsAIPanelCollapsed ? 'Show AI Assistant' : 'Hide AI Assistant'\">\n <i class=\"fa-solid fa-robot\"></i>\n </button>\n\n <!-- Keyboard Shortcuts -->\n <button class=\"tb-btn icon-only\" (click)=\"ShowKeyboardShortcuts = !ShowKeyboardShortcuts\"\n title=\"Keyboard shortcuts (?)\">\n <i class=\"fa-solid fa-keyboard\"></i>\n </button>\n\n <!-- Refresh -->\n <button class=\"tb-btn icon-only\" (click)=\"RefreshData()\" [disabled]=\"state.IsLoading\" title=\"Refresh data\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </button>\n </div>\n\n <!-- Hidden file input -->\n <input #fileInput type=\"file\" accept=\".json\" (change)=\"HandleFileSelect($event)\" style=\"display: none;\" />\n </div>\n\n <!-- ============================================================\n THREE-PANEL BODY\n ============================================================ -->\n <div class=\"studio-body\">\n\n <!-- Left Panel: Component Browser (collapsible) -->\n @if (!IsLeftPanelCollapsed) {\n <div class=\"panel panel-left\" [style.width.px]=\"leftPanelWidth\">\n <mj-component-browser\n (NewComponent)=\"OnNewComponent()\"\n (ImportFromFile)=\"ImportFromFile()\"\n (ImportFromText)=\"ImportFromText()\"\n (ImportFromArtifact)=\"ImportFromArtifact()\">\n </mj-component-browser>\n </div>\n\n <!-- Resize Handle: Left <-> Center -->\n <div class=\"resize-handle\" (mousedown)=\"OnLeftResizeStart($event)\"></div>\n }\n\n <!-- Center Panel: Workspace (side-by-side: Preview LEFT, Editor RIGHT) -->\n <div class=\"panel panel-center\">\n @if (state.SelectedComponent) {\n <!-- Preview (left side) -->\n <div class=\"workspace-preview\" [class.full-width]=\"IsEditorPanelCollapsed\" [style.flex]=\"IsEditorPanelCollapsed ? '1 1 100%' : previewFlex\">\n <div class=\"preview-sub-header\">\n <div class=\"preview-sub-left\">\n <i class=\"fa-solid fa-eye\"></i>\n <span>Preview</span>\n </div>\n <div class=\"preview-sub-right\">\n <!-- Toggle editor panel -->\n <button class=\"toggle-editors-btn\" [class.active]=\"!IsEditorPanelCollapsed\"\n (click)=\"ToggleEditorPanel()\" title=\"Toggle editor panel\">\n <i class=\"fa-solid fa-columns\"></i>\n </button>\n </div>\n </div>\n <div class=\"preview-body\">\n <mj-component-preview\n (AskAIToFix)=\"OnAskAIToFix($event)\">\n </mj-component-preview>\n </div>\n </div>\n\n <!-- Resize Handle: Preview <-> Editor (obvious center divider) -->\n @if (!IsEditorPanelCollapsed) {\n <div class=\"resize-handle center-divider\" (mousedown)=\"OnCenterResizeStart($event)\">\n <div class=\"divider-grip\"></div>\n </div>\n }\n\n <!-- Editor Tabs (right side, collapsible) -->\n @if (!IsEditorPanelCollapsed) {\n <div class=\"workspace-editors\" [style.flex]=\"editorFlex\">\n <mj-editor-tabs></mj-editor-tabs>\n </div>\n }\n } @else {\n <!-- Enhanced Empty State -->\n <div class=\"empty-state\">\n <div class=\"empty-state-content\">\n <div class=\"empty-state-icon\">\n <i class=\"fa-solid fa-rocket\"></i>\n </div>\n <h2>Ready to Build</h2>\n <p>Select a component from the browser or create a new one to get started</p>\n <div class=\"empty-state-actions\">\n <button mjButton variant=\"primary\" (click)=\"OnNewComponent()\">\n <span class=\"fa-solid fa-plus\"></span> New Component\n </button>\n <button mjButton (click)=\"ImportFromFile()\">\n <span class=\"fa-solid fa-file-import\"></span> Import\n </button>\n </div>\n <div class=\"quick-start-templates\">\n <span class=\"quick-start-label\">Quick start:</span>\n <button class=\"quick-start-btn\" (click)=\"OnQuickStart('dashboard')\">\n <i class=\"fa-solid fa-chart-line\"></i> Dashboard\n </button>\n <button class=\"quick-start-btn\" (click)=\"OnQuickStart('report')\">\n <i class=\"fa-solid fa-file-alt\"></i> Report\n </button>\n <button class=\"quick-start-btn\" (click)=\"OnQuickStart('chart')\">\n <i class=\"fa-solid fa-chart-pie\"></i> Chart\n </button>\n <button class=\"quick-start-btn\" (click)=\"OnQuickStart('form')\">\n <i class=\"fa-solid fa-edit\"></i> Form\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Right panel — only renders when the user has actively selected a\n component (form palette OR AI assistant). Showing an empty chat\n against no component is more noise than help, so we collapse the\n whole pane in that case. The collapse-button state is still\n honored: user can also explicitly hide. -->\n @if (!state.IsAIPanelCollapsed && state.SelectedComponent) {\n <!-- Resize Handle: Center <-> Right -->\n <div class=\"resize-handle\" (mousedown)=\"OnRightResizeStart($event)\"></div>\n <div class=\"panel panel-right\" [style.width.px]=\"rightPanelWidth\">\n @if (IsFormRoleComponent) {\n <mj-form-builder-right-panel\n [Schema]=\"state.FormSchema\"\n [Canvas]=\"state.FormCanvas\"\n [SelectedElementId]=\"state.FormSelectedElementId\"\n [SelectedSectionId]=\"state.FormSelectedSectionId\"\n (ElementChanged)=\"OnFormBuilderElementChanged($event)\"\n (SectionChanged)=\"OnFormBuilderSectionChanged($event)\"\n (ElementDeleted)=\"OnFormBuilderElementDeleted($event)\"\n (SectionDeleted)=\"OnFormBuilderSectionDeleted($event)\"\n (FieldAdded)=\"OnFormBuilderFieldAdded($event)\">\n </mj-form-builder-right-panel>\n } @else {\n <mj-ai-assistant-panel></mj-ai-assistant-panel>\n }\n </div>\n }\n </div>\n\n <!-- ============================================================\n STATUS BAR\n ============================================================ -->\n <div class=\"status-bar\">\n <div class=\"status-left\">\n <span class=\"status-item\">\n <i class=\"fa-solid fa-cube\"></i>\n {{ state.FilteredComponents.length }} component{{ state.FilteredComponents.length !== 1 ? 's' : '' }}\n </span>\n </div>\n <div class=\"status-right\">\n @if (LastSavedTime) {\n <span class=\"status-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n Saved {{ LastSavedTime | date:'shortTime' }}\n </span>\n }\n <span class=\"status-item shortcut-hint\">\n <kbd>?</kbd> Shortcuts\n </span>\n </div>\n </div>\n\n <!-- ============================================================\n KEYBOARD SHORTCUTS OVERLAY\n ============================================================ -->\n @if (ShowKeyboardShortcuts) {\n <div class=\"shortcuts-overlay\" (click)=\"ShowKeyboardShortcuts = false\">\n <div class=\"shortcuts-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"shortcuts-header\">\n <h3>Keyboard Shortcuts</h3>\n <button class=\"shortcuts-close\" (click)=\"ShowKeyboardShortcuts = false\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"shortcuts-body\">\n <div class=\"shortcut-group\">\n <h4>General</h4>\n <div class=\"shortcut-row\">\n <span class=\"shortcut-keys\"><kbd>Ctrl</kbd> + <kbd>S</kbd></span>\n <span class=\"shortcut-desc\">Save version</span>\n </div>\n <div class=\"shortcut-row\">\n <span class=\"shortcut-keys\"><kbd>Ctrl</kbd> + <kbd>N</kbd></span>\n <span class=\"shortcut-desc\">New component</span>\n </div>\n <div class=\"shortcut-row\">\n <span class=\"shortcut-keys\"><kbd>?</kbd></span>\n <span class=\"shortcut-desc\">Toggle shortcuts</span>\n </div>\n <div class=\"shortcut-row\">\n <span class=\"shortcut-keys\"><kbd>Esc</kbd></span>\n <span class=\"shortcut-desc\">Close overlay</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- ============================================================\n NEW COMPONENT DIALOG\n ============================================================ -->\n @if (ShowNewComponentDialog) {\n <mj-new-component-dialog\n [Visible]=\"ShowNewComponentDialog\"\n (Close)=\"OnNewComponentDialogClose($event)\">\n </mj-new-component-dialog>\n }\n\n @if (ShowSaveVersionDialog) {\n <mj-save-version-dialog\n [Visible]=\"ShowSaveVersionDialog\"\n [CurrentVersion]=\"versionService.CurrentVersionNumber\"\n (Save)=\"OnSaveVersionConfirm($event)\"\n (Cancel)=\"ShowSaveVersionDialog = false\">\n </mj-save-version-dialog>\n }\n\n <!-- Post-save Override dialog for form-role Components. Fires after a\n successful version save when the spec declares componentRole='form'\n and the user has picked a target entity in the Field Binding inspector. -->\n <mj-form-override-dialog\n [Visible]=\"ShowFormOverrideDialog\"\n [ComponentName]=\"PendingOverrideComponentName\"\n [EntityName]=\"PendingOverrideEntityName\"\n (confirmed)=\"OnFormOverrideDialogConfirm($event)\"\n (dismissed)=\"OnFormOverrideDialogDismiss()\">\n </mj-form-override-dialog>\n\n <!-- Text Import Dialog -->\n @if (ShowTextImportDialog) {\n <mj-dialog [Visible]=\"true\" Title=\"Import Component from Text\" (Close)=\"OnTextImportCancel()\" [Width]=\"700\" [MinWidth]=\"500\">\n <app-text-import-dialog\n (importSpec)=\"OnTextImportSpec($event)\"\n (cancelDialog)=\"OnTextImportCancel()\">\n </app-text-import-dialog>\n </mj-dialog>\n }\n\n <!-- Artifact Load Dialog -->\n @if (ShowArtifactLoadDialog) {\n <app-artifact-load-dialog\n [Visible]=\"ShowArtifactLoadDialog\"\n (Close)=\"OnArtifactLoadClose($event)\">\n </app-artifact-load-dialog>\n }\n\n <!-- Artifact Selection Dialog -->\n @if (ShowArtifactSelectionDialog) {\n <app-artifact-selection-dialog\n [Visible]=\"ShowArtifactSelectionDialog\"\n (Close)=\"OnArtifactSelectionClose($event)\">\n </app-artifact-selection-dialog>\n }\n</div>\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { OnInit } from '@angular/core';
|
|
2
|
+
import { ResourceData } from '@memberjunction/core-entities';
|
|
3
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* ComponentStudioResource — BaseResourceComponent wrapper that lets the
|
|
7
|
+
* Component Studio dashboard sit alongside Form Studio as a nav item under
|
|
8
|
+
* the Component Studio application. The inner `<mj-component-studio-dashboard>`
|
|
9
|
+
* owns its own load lifecycle and calls NotifyLoadComplete; this wrapper
|
|
10
|
+
* forwards the same signal so the shell loading screen clears whichever
|
|
11
|
+
* way the user arrives.
|
|
12
|
+
*/
|
|
13
|
+
export declare class ComponentStudioResourceComponent extends BaseResourceComponent implements OnInit {
|
|
14
|
+
ngOnInit(): void;
|
|
15
|
+
GetResourceDisplayName(_data: ResourceData): Promise<string>;
|
|
16
|
+
GetResourceIconClass(_data: ResourceData): Promise<string>;
|
|
17
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ComponentStudioResourceComponent, never>;
|
|
18
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ComponentStudioResourceComponent, "mj-component-studio-resource", never, {}, {}, never, never, false, never>;
|
|
19
|
+
}
|
|
20
|
+
/** Tree-shake protection — referenced from the dashboards module loader. */
|
|
21
|
+
export declare function LoadComponentStudioResourceComponent(): void;
|
|
22
|
+
//# sourceMappingURL=component-studio-resource.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-studio-resource.component.d.ts","sourceRoot":"","sources":["../../src/ComponentStudio/component-studio-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;AAElE;;;;;;;GAOG;AACH,qBAuBa,gCAAiC,SAAQ,qBAAsB,YAAW,MAAM;IAE3F,QAAQ,IAAI,IAAI;IAKV,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5D,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAXrD,gCAAgC;2CAAhC,gCAAgC;CAc5C;AAED,4EAA4E;AAC5E,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Component } from '@angular/core';
|
|
8
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
9
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "./component-studio-dashboard.component";
|
|
12
|
+
/**
|
|
13
|
+
* ComponentStudioResource — BaseResourceComponent wrapper that lets the
|
|
14
|
+
* Component Studio dashboard sit alongside Form Studio as a nav item under
|
|
15
|
+
* the Component Studio application. The inner `<mj-component-studio-dashboard>`
|
|
16
|
+
* owns its own load lifecycle and calls NotifyLoadComplete; this wrapper
|
|
17
|
+
* forwards the same signal so the shell loading screen clears whichever
|
|
18
|
+
* way the user arrives.
|
|
19
|
+
*/
|
|
20
|
+
let ComponentStudioResourceComponent = class ComponentStudioResourceComponent extends BaseResourceComponent {
|
|
21
|
+
ngOnInit() {
|
|
22
|
+
super.ngOnInit();
|
|
23
|
+
this.NotifyLoadComplete();
|
|
24
|
+
}
|
|
25
|
+
async GetResourceDisplayName(_data) {
|
|
26
|
+
return 'Components';
|
|
27
|
+
}
|
|
28
|
+
async GetResourceIconClass(_data) {
|
|
29
|
+
return 'fa-solid fa-puzzle-piece';
|
|
30
|
+
}
|
|
31
|
+
static ɵfac = /*@__PURE__*/ (() => { let ɵComponentStudioResourceComponent_BaseFactory; return function ComponentStudioResourceComponent_Factory(__ngFactoryType__) { return (ɵComponentStudioResourceComponent_BaseFactory || (ɵComponentStudioResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(ComponentStudioResourceComponent)))(__ngFactoryType__ || ComponentStudioResourceComponent); }; })();
|
|
32
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ComponentStudioResourceComponent, selectors: [["mj-component-studio-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 0, consts: [[1, "resource-container"]], template: function ComponentStudioResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
33
|
+
i0.ɵɵelementStart(0, "div", 0);
|
|
34
|
+
i0.ɵɵelement(1, "mj-component-studio-dashboard");
|
|
35
|
+
i0.ɵɵelementEnd();
|
|
36
|
+
} }, dependencies: [i1.ComponentStudioDashboardComponent], styles: [".resource-container[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n overflow: hidden;\n display: flex;\n box-sizing: border-box;\n }\n .resource-container[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n }"] });
|
|
37
|
+
};
|
|
38
|
+
ComponentStudioResourceComponent = __decorate([
|
|
39
|
+
RegisterClass(BaseResourceComponent, 'ComponentStudioResource')
|
|
40
|
+
], ComponentStudioResourceComponent);
|
|
41
|
+
export { ComponentStudioResourceComponent };
|
|
42
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ComponentStudioResourceComponent, [{
|
|
43
|
+
type: Component,
|
|
44
|
+
args: [{ standalone: false, selector: 'mj-component-studio-resource', template: `
|
|
45
|
+
<div class="resource-container">
|
|
46
|
+
<mj-component-studio-dashboard></mj-component-studio-dashboard>
|
|
47
|
+
</div>
|
|
48
|
+
`, styles: ["\n .resource-container {\n width: 100%;\n height: 100%;\n overflow: hidden;\n display: flex;\n box-sizing: border-box;\n }\n .resource-container > * {\n flex: 1;\n min-width: 0;\n }\n "] }]
|
|
49
|
+
}], null, null); })();
|
|
50
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ComponentStudioResourceComponent, { className: "ComponentStudioResourceComponent", filePath: "src/ComponentStudio/component-studio-resource.component.ts", lineNumber: 37 }); })();
|
|
51
|
+
/** Tree-shake protection — referenced from the dashboards module loader. */
|
|
52
|
+
export function LoadComponentStudioResourceComponent() {
|
|
53
|
+
// Intentional no-op. Keeps the @RegisterClass side effect alive.
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=component-studio-resource.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-studio-resource.component.js","sourceRoot":"","sources":["../../src/ComponentStudio/component-studio-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;;AAElE;;;;;;;GAOG;AAwBI,IAAM,gCAAgC,GAAtC,MAAM,gCAAiC,SAAQ,qBAAqB;IAEzE,QAAQ;QACN,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,KAAmB;QAC9C,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,KAAmB;QAC5C,OAAO,0BAA0B,CAAC;IACpC,CAAC;6SAbU,gCAAgC,yBAAhC,gCAAgC;6DAAhC,gCAAgC;YAlBzC,8BAAgC;YAC9B,gDAA+D;YACjE,iBAAM;;;AAgBG,gCAAgC;IAvB5C,aAAa,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;GAuBnD,gCAAgC,CAc5C;;iFAdY,gCAAgC;cAtB5C,SAAS;6BACI,KAAK,YACP,8BAA8B,YAC9B;;;;GAIT;;kFAeU,gCAAgC;AAgB7C,4EAA4E;AAC5E,MAAM,UAAU,oCAAoC;IAClD,iEAAiE;AACnE,CAAC","sourcesContent":["import { Component, OnInit } from '@angular/core';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\n\n/**\n * ComponentStudioResource — BaseResourceComponent wrapper that lets the\n * Component Studio dashboard sit alongside Form Studio as a nav item under\n * the Component Studio application. The inner `<mj-component-studio-dashboard>`\n * owns its own load lifecycle and calls NotifyLoadComplete; this wrapper\n * forwards the same signal so the shell loading screen clears whichever\n * way the user arrives.\n */\n@RegisterClass(BaseResourceComponent, 'ComponentStudioResource')\n@Component({\n standalone: false,\n selector: 'mj-component-studio-resource',\n template: `\n <div class=\"resource-container\">\n <mj-component-studio-dashboard></mj-component-studio-dashboard>\n </div>\n `,\n styles: [`\n .resource-container {\n width: 100%;\n height: 100%;\n overflow: hidden;\n display: flex;\n box-sizing: border-box;\n }\n .resource-container > * {\n flex: 1;\n min-width: 0;\n }\n `]\n})\nexport class ComponentStudioResourceComponent extends BaseResourceComponent implements OnInit {\n\n ngOnInit(): void {\n super.ngOnInit();\n this.NotifyLoadComplete();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Components';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-puzzle-piece';\n }\n}\n\n/** Tree-shake protection — referenced from the dashboards module loader. */\nexport function LoadComponentStudioResourceComponent(): void {\n // Intentional no-op. Keeps the @RegisterClass side effect alive.\n}\n"]}
|