@memberjunction/ng-dashboards 6.2.0-edge.3 → 6.2.0-edge.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts +4 -3
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js +8 -5
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js.map +1 -1
- package/dist/AI/components/duplicates/compare-value.component.d.ts +67 -0
- package/dist/AI/components/duplicates/compare-value.component.d.ts.map +1 -0
- package/dist/AI/components/duplicates/compare-value.component.js +168 -0
- package/dist/AI/components/duplicates/compare-value.component.js.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +49 -3
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +287 -169
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts +77 -0
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.js +116 -0
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.js.map +1 -0
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +1 -0
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +16 -4
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +2 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +12 -6
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-index-auto.d.ts +29 -0
- package/dist/AI/components/vectors/vector-index-auto.d.ts.map +1 -0
- package/dist/AI/components/vectors/vector-index-auto.js +59 -0
- package/dist/AI/components/vectors/vector-index-auto.js.map +1 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +9 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +65 -20
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +7 -3
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +3 -2
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +0 -3
- 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 +5 -14
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +1 -0
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +1 -0
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +2 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +12 -10
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-agent-context.d.ts +14 -43
- package/dist/DashboardBrowser/dashboard-browser-agent-context.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-agent-context.js +6 -29
- package/dist/DashboardBrowser/dashboard-browser-agent-context.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +174 -321
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +522 -1195
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-library-filter.d.ts +116 -0
- package/dist/DashboardBrowser/dashboard-library-filter.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboard-library-filter.js +277 -0
- package/dist/DashboardBrowser/dashboard-library-filter.js.map +1 -0
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboards-agent-tools.d.ts +26 -0
- package/dist/DashboardBrowser/dashboards-agent-tools.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboards-agent-tools.js +32 -0
- package/dist/DashboardBrowser/dashboards-agent-tools.js.map +1 -0
- package/dist/DashboardBrowser/dashboards-categories-resource.component.d.ts +58 -0
- package/dist/DashboardBrowser/dashboards-categories-resource.component.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboards-categories-resource.component.js +391 -0
- package/dist/DashboardBrowser/dashboards-categories-resource.component.js.map +1 -0
- package/dist/DashboardBrowser/dashboards-categories.helpers.d.ts +37 -0
- package/dist/DashboardBrowser/dashboards-categories.helpers.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboards-categories.helpers.js +68 -0
- package/dist/DashboardBrowser/dashboards-categories.helpers.js.map +1 -0
- package/dist/DashboardEditor/dashboard-editor.component.d.ts +295 -0
- package/dist/DashboardEditor/dashboard-editor.component.d.ts.map +1 -0
- package/dist/DashboardEditor/dashboard-editor.component.js +1022 -0
- package/dist/DashboardEditor/dashboard-editor.component.js.map +1 -0
- package/dist/DashboardEditor/dashboard-editor.types.d.ts +23 -0
- package/dist/DashboardEditor/dashboard-editor.types.d.ts.map +1 -0
- package/dist/DashboardEditor/dashboard-editor.types.js +3 -0
- package/dist/DashboardEditor/dashboard-editor.types.js.map +1 -0
- package/dist/DashboardEditor/dashboard-viewer-factory.d.ts +11 -0
- package/dist/DashboardEditor/dashboard-viewer-factory.d.ts.map +1 -0
- package/dist/DashboardEditor/dashboard-viewer-factory.js +17 -0
- package/dist/DashboardEditor/dashboard-viewer-factory.js.map +1 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +26 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +302 -219
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts +1 -1
- package/dist/DataExplorer/services/explorer-state.service.js +2 -5
- package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.d.ts +0 -14
- package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.js +7 -29
- package/dist/FormBuilder/form-builder-resource.component.js.map +1 -1
- package/dist/Home/home-agent-context.d.ts +29 -10
- package/dist/Home/home-agent-context.d.ts.map +1 -1
- package/dist/Home/home-agent-context.js +50 -24
- package/dist/Home/home-agent-context.js.map +1 -1
- package/dist/Home/home-dashboard-switcher.component.d.ts +95 -0
- package/dist/Home/home-dashboard-switcher.component.d.ts.map +1 -0
- package/dist/Home/home-dashboard-switcher.component.js +442 -0
- package/dist/Home/home-dashboard-switcher.component.js.map +1 -0
- package/dist/Home/home-dashboard.component.d.ts +330 -17
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +1702 -1014
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Home/home-menus.d.ts +38 -0
- package/dist/Home/home-menus.d.ts.map +1 -0
- package/dist/Home/home-menus.js +53 -0
- package/dist/Home/home-menus.js.map +1 -0
- package/dist/Home/home-pinned-dashboards.d.ts +33 -0
- package/dist/Home/home-pinned-dashboards.d.ts.map +1 -0
- package/dist/Home/home-pinned-dashboards.js +76 -0
- package/dist/Home/home-pinned-dashboards.js.map +1 -0
- package/dist/PredictiveStudio/components/ps-production.component.d.ts +5 -1
- package/dist/PredictiveStudio/components/ps-production.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-production.component.js +64 -41
- package/dist/PredictiveStudio/components/ps-production.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +3 -2
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/RealtimeRecordings/realtime-recordings-dashboard.component.js +2 -2
- package/dist/RealtimeRecordings/realtime-recordings-dashboard.component.js.map +1 -1
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.d.ts +1 -0
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.d.ts.map +1 -1
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.js +7 -0
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +7 -7
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +21 -20
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +4 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +69 -62
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +22 -2
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +1 -1
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +3 -1
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +2 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -0
- package/dist/public-api.js.map +1 -1
- package/dist/shared/dashboard-library-changes.d.ts +23 -0
- package/dist/shared/dashboard-library-changes.d.ts.map +1 -0
- package/dist/shared/dashboard-library-changes.js +26 -0
- package/dist/shared/dashboard-library-changes.js.map +1 -0
- package/dist/shared/dashboard-owner-names.d.ts +17 -0
- package/dist/shared/dashboard-owner-names.d.ts.map +1 -0
- package/dist/shared/dashboard-owner-names.js +65 -0
- package/dist/shared/dashboard-owner-names.js.map +1 -0
- package/dist/shared/dashboard-recents.d.ts +34 -0
- package/dist/shared/dashboard-recents.d.ts.map +1 -0
- package/dist/shared/dashboard-recents.js +87 -0
- package/dist/shared/dashboard-recents.js.map +1 -0
- package/dist/shared/dashboards-app-install.d.ts +59 -0
- package/dist/shared/dashboards-app-install.d.ts.map +1 -0
- package/dist/shared/dashboards-app-install.js +97 -0
- package/dist/shared/dashboards-app-install.js.map +1 -0
- package/dist/shared/dashboards-app.helpers.d.ts +42 -0
- package/dist/shared/dashboards-app.helpers.d.ts.map +1 -0
- package/dist/shared/dashboards-app.helpers.js +143 -0
- package/dist/shared/dashboards-app.helpers.js.map +1 -0
- package/package.json +69 -68
|
@@ -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';\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';\nimport {\n BuildCanvasEditClientTools,\n BuildCanvasStateSummary,\n type CanvasEditHost,\n} from './services/canvas-edit-transforms';\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\n /** @deprecated Use {@link LeftPanelWidth}. */\n public get leftPanelWidth() {\n return this.LeftPanelWidth;\n }\n /** @deprecated Use {@link LeftPanelWidth}. */\n public set leftPanelWidth(value) {\n this.LeftPanelWidth = value;\n }\n public RightPanelWidth = 380;\n\n /** @deprecated Use {@link RightPanelWidth}. */\n public get rightPanelWidth() {\n return this.RightPanelWidth;\n }\n /** @deprecated Use {@link RightPanelWidth}. */\n public set rightPanelWidth(value) {\n this.RightPanelWidth = value;\n }\n public PreviewFlex = '1 1 50%';\n\n /** @deprecated Use {@link PreviewFlex}. */\n public get previewFlex() {\n return this.PreviewFlex;\n }\n /** @deprecated Use {@link PreviewFlex}. */\n public set previewFlex(value) {\n this.PreviewFlex = value;\n }\n public EditorFlex = '1 1 50%';\n\n /** @deprecated Use {@link EditorFlex}. */\n public get editorFlex() {\n return this.EditorFlex;\n }\n /** @deprecated Use {@link EditorFlex}. */\n public set editorFlex(value) {\n this.EditorFlex = value;\n }\n private previewFlexPercent = 50;\n\n // --- Dropdown states ---\n public ExportDropdownOpen = false;\n\n /** @deprecated Use {@link ExportDropdownOpen}. */\n public get exportDropdownOpen() {\n return this.ExportDropdownOpen;\n }\n /** @deprecated Use {@link ExportDropdownOpen}. */\n public set exportDropdownOpen(value) {\n this.ExportDropdownOpen = value;\n }\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 /**\n * True once the user has invoked \"Open in Chat\" and the form agent\n * context + tools are wired. Gates {@link reemitFormAgentContext} so canvas\n * edits made before the agent is involved don't register context/tools.\n */\n private formAgentContextActive = false;\n\n @ViewChild('fileInput', { static: false }) FileInput?: ElementRef<HTMLInputElement>;\n\n /** @deprecated Use {@link FileInput}. */\n get fileInput(): ElementRef<HTMLInputElement> | undefined {\n return this.FileInput;\n }\n /** @deprecated Use {@link FileInput}. */\n set fileInput(value: ElementRef<HTMLInputElement> | undefined) {\n this.FileInput = value;\n }\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 /** @deprecated Use {@link State}. */\n public get state(): ComponentStudioStateService {\n return this.State;\n }\n /** @deprecated Use {@link State}. */\n public set state(value: ComponentStudioStateService) {\n this.State = value;\n }\n\n /** @deprecated Use {@link VersionService}. */\n public get versionService(): ComponentVersionService {\n return this.VersionService;\n }\n /** @deprecated Use {@link VersionService}. */\n public set versionService(value: ComponentVersionService) {\n this.VersionService = value;\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 // ? = Toggle keyboard shortcuts (Ctrl/Cmd+/ belongs to the shell's command palette)\n 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.reemitFormAgentContext();\n this.cdr.detectChanges();\n }\n\n /**\n * {@link CanvasEditHost} adapter for the shared granular canvas-edit tool\n * suite. `ApplyCanvas` routes through `applyCanvasUpdate` so agent edits go\n * through the same dirty-track + code-regen + change-detection path as the\n * right-panel/tab events. Pane-navigation actions are intentionally omitted\n * (Component Studio uses its tab system), so the factory drops those tools.\n */\n private buildCanvasEditHost(): CanvasEditHost {\n return {\n GetCanvas: () => this.State.FormCanvas,\n ApplyCanvas: (next: FormCanvasModel) => this.applyCanvasUpdate(next),\n NewElementId: () => GenerateCanvasId('field'),\n NewSectionId: () => GenerateCanvasId('section'),\n };\n }\n\n /**\n * Build the deep, bounded agent-context slice for the active form canvas.\n * Mirrors the Form Builder cockpit's depth: a section/element summary the\n * agent can target by id OR label, the curated entity field names not yet\n * placed (AddField candidates), the resolved selected element/section names,\n * the dirty flag, and the active tab. All lists are capped inside\n * {@link buildCanvasStateSummary}.\n */\n private buildFormAgentContext(canvas: FormCanvasModel): Record<string, unknown> {\n const schema = this.State.FormSchema;\n return {\n activeForm: {\n entityName: canvas.entityName,\n title: canvas.title,\n sections: canvas.sections,\n // Deep canvas-state summary (bounded) — same shape Form Builder\n // publishes, so a co-agent driving either surface sees one model.\n CanvasSummary: BuildCanvasStateSummary(\n canvas,\n schema?.fields.map(f => f.name) ?? [],\n this.State.FormSelectedElementId,\n this.State.FormSelectedSectionId,\n ),\n IsDirty: this.State.HasUnsavedChanges,\n ActiveTab: this.State.ActiveTab,\n SelectedElementId: this.State.FormSelectedElementId,\n SelectedSectionId: this.State.FormSelectedSectionId,\n },\n };\n }\n\n /**\n * Re-publish the form agent context after a canvas mutation, but ONLY when\n * the agent tools were already wired (the user invoked \"Open in Chat\"). We\n * track that with {@link formAgentContextActive} so a canvas edit before the\n * agent is involved doesn't spuriously register context/tools.\n */\n private reemitFormAgentContext(): void {\n if (!this.formAgentContextActive) return;\n const canvas = this.State.FormCanvas;\n if (!canvas || !this.navigationService) return;\n this.navigationService.SetAgentContext(this, this.buildFormAgentContext(canvas));\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, this.buildFormAgentContext(canvas));\n // 🔒 SAFETY BOUNDARY: the granular suite below exposes ONLY reversible\n // canvas-DEFINITION edits (no Save / Publish / override-activation /\n // delete-the-whole-form). Component Studio omits the center-pane\n // navigation tools (PreviewForm/ViewFormCode/ViewFormLayout) because it\n // navigates via its tab system, not a SetCenterPaneMode — the shared\n // factory drops them automatically when the host doesn't provide them.\n this.navigationService?.SetAgentClientTools(this, [\n {\n Name: 'UpdateForm',\n Description: 'Replace the canvas model of the active form. Accepts a FormCanvasModel JSON object. Prefer the granular AddField/RemoveField/etc. tools for small edits.',\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 ...BuildCanvasEditClientTools(this.buildCanvasEditHost()),\n ]);\n // From now on, canvas edits re-publish context so the agent's view of\n // the form stays live (mirrors the Form Builder cockpit's re-emit).\n this.formAgentContextActive = true;\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 <mj-empty-state Size=\"large\" Icon=\"fa-solid fa-rocket\"\n Title=\"Ready to Build\"\n Message=\"Select a component from the browser or create a new one to get started\">\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 </mj-empty-state>\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"]}
|
|
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';\nimport {\n BuildCanvasEditClientTools,\n BuildCanvasStateSummary,\n type CanvasEditHost,\n} from './services/canvas-edit-transforms';\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\n /** @deprecated Use {@link LeftPanelWidth}. */\n public get leftPanelWidth() {\n return this.LeftPanelWidth;\n }\n /** @deprecated Use {@link LeftPanelWidth}. */\n public set leftPanelWidth(value) {\n this.LeftPanelWidth = value;\n }\n public RightPanelWidth = 380;\n\n /** @deprecated Use {@link RightPanelWidth}. */\n public get rightPanelWidth() {\n return this.RightPanelWidth;\n }\n /** @deprecated Use {@link RightPanelWidth}. */\n public set rightPanelWidth(value) {\n this.RightPanelWidth = value;\n }\n public PreviewFlex = '1 1 50%';\n\n /** @deprecated Use {@link PreviewFlex}. */\n public get previewFlex() {\n return this.PreviewFlex;\n }\n /** @deprecated Use {@link PreviewFlex}. */\n public set previewFlex(value) {\n this.PreviewFlex = value;\n }\n public EditorFlex = '1 1 50%';\n\n /** @deprecated Use {@link EditorFlex}. */\n public get editorFlex() {\n return this.EditorFlex;\n }\n /** @deprecated Use {@link EditorFlex}. */\n public set editorFlex(value) {\n this.EditorFlex = value;\n }\n private previewFlexPercent = 50;\n\n // --- Dropdown states ---\n public ExportDropdownOpen = false;\n\n /** @deprecated Use {@link ExportDropdownOpen}. */\n public get exportDropdownOpen() {\n return this.ExportDropdownOpen;\n }\n /** @deprecated Use {@link ExportDropdownOpen}. */\n public set exportDropdownOpen(value) {\n this.ExportDropdownOpen = value;\n }\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 /**\n * True once the user has invoked \"Open in Chat\" and the form agent\n * context + tools are wired. Gates {@link reemitFormAgentContext} so canvas\n * edits made before the agent is involved don't register context/tools.\n */\n private formAgentContextActive = false;\n\n @ViewChild('fileInput', { static: false }) FileInput?: ElementRef<HTMLInputElement>;\n\n /** @deprecated Use {@link FileInput}. */\n get fileInput(): ElementRef<HTMLInputElement> | undefined {\n return this.FileInput;\n }\n /** @deprecated Use {@link FileInput}. */\n set fileInput(value: ElementRef<HTMLInputElement> | undefined) {\n this.FileInput = value;\n }\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 /** @deprecated Use {@link State}. */\n public get state(): ComponentStudioStateService {\n return this.State;\n }\n /** @deprecated Use {@link State}. */\n public set state(value: ComponentStudioStateService) {\n this.State = value;\n }\n\n /** @deprecated Use {@link VersionService}. */\n public get versionService(): ComponentVersionService {\n return this.VersionService;\n }\n /** @deprecated Use {@link VersionService}. */\n public set versionService(value: ComponentVersionService) {\n this.VersionService = value;\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 // ? = Toggle keyboard shortcuts (Ctrl/Cmd+/ belongs to the shell's command palette)\n 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.reemitFormAgentContext();\n this.cdr.detectChanges();\n }\n\n /**\n * {@link CanvasEditHost} adapter for the shared granular canvas-edit tool\n * suite. `ApplyCanvas` routes through `applyCanvasUpdate` so agent edits go\n * through the same dirty-track + code-regen + change-detection path as the\n * right-panel/tab events. Pane-navigation actions are intentionally omitted\n * (Component Studio uses its tab system), so the factory drops those tools.\n */\n private buildCanvasEditHost(): CanvasEditHost {\n return {\n GetCanvas: () => this.State.FormCanvas,\n ApplyCanvas: (next: FormCanvasModel) => this.applyCanvasUpdate(next),\n NewElementId: () => GenerateCanvasId('field'),\n NewSectionId: () => GenerateCanvasId('section'),\n };\n }\n\n /**\n * Build the deep, bounded agent-context slice for the active form canvas.\n * Mirrors the Form Builder cockpit's depth: a section/element summary the\n * agent can target by id OR label, the curated entity field names not yet\n * placed (AddField candidates), the resolved selected element/section names,\n * the dirty flag, and the active tab. All lists are capped inside\n * {@link buildCanvasStateSummary}.\n */\n private buildFormAgentContext(canvas: FormCanvasModel): Record<string, unknown> {\n const schema = this.State.FormSchema;\n return {\n activeForm: {\n entityName: canvas.entityName,\n title: canvas.title,\n sections: canvas.sections,\n // Deep canvas-state summary (bounded) — same shape Form Builder\n // publishes, so a co-agent driving either surface sees one model.\n CanvasSummary: BuildCanvasStateSummary(\n canvas,\n schema?.fields.map(f => f.name) ?? [],\n this.State.FormSelectedElementId,\n this.State.FormSelectedSectionId,\n ),\n IsDirty: this.State.HasUnsavedChanges,\n ActiveTab: this.State.ActiveTab,\n SelectedElementId: this.State.FormSelectedElementId,\n SelectedSectionId: this.State.FormSelectedSectionId,\n },\n };\n }\n\n /**\n * Re-publish the form agent context after a canvas mutation, but ONLY when\n * the agent tools were already wired (the user invoked \"Open in Chat\"). We\n * track that with {@link formAgentContextActive} so a canvas edit before the\n * agent is involved doesn't spuriously register context/tools.\n */\n private reemitFormAgentContext(): void {\n if (!this.formAgentContextActive) return;\n const canvas = this.State.FormCanvas;\n if (!canvas || !this.navigationService) return;\n this.navigationService.SetAgentContext(this, this.buildFormAgentContext(canvas));\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, this.buildFormAgentContext(canvas));\n // 🔒 SAFETY BOUNDARY: the granular suite below exposes ONLY reversible\n // canvas-DEFINITION edits (no Save / Publish / override-activation /\n // delete-the-whole-form). Component Studio omits the center-pane\n // navigation tools (PreviewForm/ViewFormCode/ViewFormLayout) because it\n // navigates via its tab system, not a SetCenterPaneMode — the shared\n // factory drops them automatically when the host doesn't provide them.\n this.navigationService?.SetAgentClientTools(this, [\n {\n Name: 'UpdateForm',\n Description: 'Replace the canvas model of the active form. Accepts a FormCanvasModel JSON object. Prefer the granular AddField/RemoveField/etc. tools for small edits.',\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 ...BuildCanvasEditClientTools(this.buildCanvasEditHost()),\n ]);\n // From now on, canvas edits re-publish context so the agent's view of\n // the form stays live (mirrors the Form Builder cockpit's re-emit).\n this.formAgentContextActive = true;\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 // conversation-scope: artifact-wide read, no conversation path applies\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 <mj-empty-state Size=\"large\" Icon=\"fa-solid fa-rocket\"\n Title=\"Ready to Build\"\n Message=\"Select a component from the browser or create a new one to get started\">\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 </mj-empty-state>\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"]}
|
|
@@ -56,7 +56,6 @@ export declare class AIAssistantPanelComponent extends BaseAngularComponent impl
|
|
|
56
56
|
ChatIsNewConversation: boolean;
|
|
57
57
|
PendingMessage: string | null;
|
|
58
58
|
PendingAttachments: PendingAttachment[] | null;
|
|
59
|
-
ChatThreadId: string | null;
|
|
60
59
|
ChatPendingArtifactId: string | null;
|
|
61
60
|
ChatPendingArtifactVersionNumber: number | null;
|
|
62
61
|
/** Snapshot from NavigationService — drives the agent's app context. */
|
|
@@ -119,8 +118,6 @@ export declare class AIAssistantPanelComponent extends BaseAngularComponent impl
|
|
|
119
118
|
name: string;
|
|
120
119
|
description: string;
|
|
121
120
|
}): void;
|
|
122
|
-
OnThreadOpened(threadId: string): void;
|
|
123
|
-
OnThreadClosed(): void;
|
|
124
121
|
OnPendingArtifactConsumed(): void;
|
|
125
122
|
static ɵfac: i0.ɵɵFactoryDeclaration<AIAssistantPanelComponent, never>;
|
|
126
123
|
static ɵcmp: i0.ɵɵComponentDeclaration<AIAssistantPanelComponent, "mj-ai-assistant-panel", never, {}, {}, never, never, false, never>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-assistant-panel.component.d.ts","sourceRoot":"","sources":["../../../../src/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,SAAS,EACT,MAAM,EAET,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAY,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,KAAK,EACR,oBAAoB,EACpB,YAAY,EACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAkB,MAAM,+CAA+C,CAAC;;AAE5G;;;;GAIG;AACH,UAAU,WAAW;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,aAAa,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAOa,yBAA0B,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"ai-assistant-panel.component.d.ts","sourceRoot":"","sources":["../../../../src/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.ts"],"names":[],"mappings":"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"}
|