@memberjunction/ng-dashboards 5.37.0 → 5.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +14 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +450 -292
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +73 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +512 -127
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-resource.component.d.ts +22 -0
- package/dist/ComponentStudio/component-studio-resource.component.d.ts.map +1 -0
- package/dist/ComponentStudio/component-studio-resource.component.js +55 -0
- package/dist/ComponentStudio/component-studio-resource.component.js.map +1 -0
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +104 -45
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +234 -331
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts +54 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js +339 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts +65 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js +492 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts +88 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js +457 -0
- package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js.map +1 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.d.ts +106 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.js +478 -0
- package/dist/ComponentStudio/components/form-override-dialog.component.js.map +1 -0
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +54 -0
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +361 -50
- package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts +10 -0
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +114 -45
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
- package/dist/ComponentStudio/services/canvas-to-code.d.ts +32 -0
- package/dist/ComponentStudio/services/canvas-to-code.d.ts.map +1 -0
- package/dist/ComponentStudio/services/canvas-to-code.js +347 -0
- package/dist/ComponentStudio/services/canvas-to-code.js.map +1 -0
- package/dist/ComponentStudio/services/code-to-canvas.d.ts +32 -0
- package/dist/ComponentStudio/services/code-to-canvas.d.ts.map +1 -0
- package/dist/ComponentStudio/services/code-to-canvas.js +92 -0
- package/dist/ComponentStudio/services/code-to-canvas.js.map +1 -0
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts +29 -0
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-studio-state.service.js +76 -0
- package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
- package/dist/ComponentStudio/services/entity-form-override.service.d.ts +86 -0
- package/dist/ComponentStudio/services/entity-form-override.service.d.ts.map +1 -0
- package/dist/ComponentStudio/services/entity-form-override.service.js +246 -0
- package/dist/ComponentStudio/services/entity-form-override.service.js.map +1 -0
- package/dist/ComponentStudio/services/field-binding-scanner.d.ts +29 -0
- package/dist/ComponentStudio/services/field-binding-scanner.d.ts.map +1 -0
- package/dist/ComponentStudio/services/field-binding-scanner.js +110 -0
- package/dist/ComponentStudio/services/field-binding-scanner.js.map +1 -0
- package/dist/ComponentStudio/services/form-canvas-model.d.ts +56 -0
- package/dist/ComponentStudio/services/form-canvas-model.d.ts.map +1 -0
- package/dist/ComponentStudio/services/form-canvas-model.js +35 -0
- package/dist/ComponentStudio/services/form-canvas-model.js.map +1 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.d.ts +10 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.d.ts.map +1 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.js +10 -0
- package/dist/ComponentStudio/services/form-host-props-fixture.js.map +1 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.d.ts +964 -0
- package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -0
- package/dist/FormBuilder/form-builder-resource.component.js +4487 -0
- package/dist/FormBuilder/form-builder-resource.component.js.map +1 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts +55 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts.map +1 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.js +73 -0
- package/dist/FormBuilder/form-builder-version-rail.helpers.js.map +1 -0
- package/dist/Home/home-application.d.ts +21 -1
- package/dist/Home/home-application.d.ts.map +1 -1
- package/dist/Home/home-application.js +60 -8
- package/dist/Home/home-application.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +14 -14
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +11 -10
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/component-studio-dashboards.module.d.ts +34 -22
- package/dist/component-studio-dashboards.module.d.ts.map +1 -1
- package/dist/component-studio-dashboards.module.js +65 -9
- package/dist/component-studio-dashboards.module.js.map +1 -1
- package/package.json +54 -53
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Injectable, EventEmitter } from '@angular/core';
|
|
2
2
|
import { RunView, CompositeKey, Metadata } from '@memberjunction/core';
|
|
3
3
|
import { ComponentMetadataEngine } from '@memberjunction/core-entities';
|
|
4
|
+
import { buildCuratedFormSchema } from '@memberjunction/interactive-component-types/forms';
|
|
4
5
|
import { ParseJSONRecursive } from '@memberjunction/global';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
/**
|
|
@@ -36,6 +37,78 @@ export class ComponentStudioStateService {
|
|
|
36
37
|
set ComponentSpec(value) { this._componentSpec = value; }
|
|
37
38
|
get IsRunning() { return this._isRunning; }
|
|
38
39
|
set IsRunning(value) { this._isRunning = value; }
|
|
40
|
+
// --- Form-role target entity (shared between Field Binding Inspector
|
|
41
|
+
// and the fixture-record live preview) ---
|
|
42
|
+
// Tracks which entity a form-role Component is being authored against.
|
|
43
|
+
// Inspector writes; Preview reads to build fixture FormHostProps; either
|
|
44
|
+
// can clear by setting to null. Independent of ComponentSpec because the
|
|
45
|
+
// author may want to inspect Customer fields while editing a form for
|
|
46
|
+
// Accounts, or simply hasn't decided yet.
|
|
47
|
+
_formTargetEntityName = null;
|
|
48
|
+
get FormTargetEntityName() { return this._formTargetEntityName; }
|
|
49
|
+
set FormTargetEntityName(value) {
|
|
50
|
+
if (value === this._formTargetEntityName)
|
|
51
|
+
return;
|
|
52
|
+
this._formTargetEntityName = value;
|
|
53
|
+
// Schema is keyed by entity — invalidate when target changes.
|
|
54
|
+
this._formSchema = null;
|
|
55
|
+
this.StateChanged.emit();
|
|
56
|
+
}
|
|
57
|
+
// --- Form Builder canvas state (live inside the Form Builder tab). ---
|
|
58
|
+
// The canvas is the source of truth WHILE the Form Builder tab is active;
|
|
59
|
+
// on save we serialize it back to ComponentSpec.code via canvas-to-code.
|
|
60
|
+
// When the user instead edits Code directly, the canvas is rebuilt via
|
|
61
|
+
// code-to-canvas (lossy) on tab focus. Schema is cached per entity so
|
|
62
|
+
// tab toggles don't pay the build cost repeatedly.
|
|
63
|
+
_formCanvas = null;
|
|
64
|
+
get FormCanvas() { return this._formCanvas; }
|
|
65
|
+
set FormCanvas(value) {
|
|
66
|
+
this._formCanvas = value;
|
|
67
|
+
this.StateChanged.emit();
|
|
68
|
+
}
|
|
69
|
+
_formSchema = null;
|
|
70
|
+
get FormSchema() { return this._formSchema; }
|
|
71
|
+
_formSelectedElementId = null;
|
|
72
|
+
get FormSelectedElementId() { return this._formSelectedElementId; }
|
|
73
|
+
set FormSelectedElementId(value) {
|
|
74
|
+
this._formSelectedElementId = value;
|
|
75
|
+
this.StateChanged.emit();
|
|
76
|
+
}
|
|
77
|
+
_formSelectedSectionId = null;
|
|
78
|
+
get FormSelectedSectionId() { return this._formSelectedSectionId; }
|
|
79
|
+
set FormSelectedSectionId(value) {
|
|
80
|
+
this._formSelectedSectionId = value;
|
|
81
|
+
this.StateChanged.emit();
|
|
82
|
+
}
|
|
83
|
+
/** True when the parser couldn't fully round-trip code → canvas. UI shows a banner. */
|
|
84
|
+
_formCodeOnlySectionsDetected = false;
|
|
85
|
+
get FormCodeOnlySectionsDetected() { return this._formCodeOnlySectionsDetected; }
|
|
86
|
+
set FormCodeOnlySectionsDetected(value) {
|
|
87
|
+
this._formCodeOnlySectionsDetected = value;
|
|
88
|
+
this.StateChanged.emit();
|
|
89
|
+
}
|
|
90
|
+
/** Preview mode for the Form Builder tab — drives the toolbar pills AND the preview pane. */
|
|
91
|
+
_formPreviewMode = 'view';
|
|
92
|
+
get FormPreviewMode() { return this._formPreviewMode; }
|
|
93
|
+
set FormPreviewMode(value) {
|
|
94
|
+
if (this._formPreviewMode === value)
|
|
95
|
+
return;
|
|
96
|
+
this._formPreviewMode = value;
|
|
97
|
+
this.StateChanged.emit();
|
|
98
|
+
}
|
|
99
|
+
/** Build (and cache) the curated schema for the given entity. */
|
|
100
|
+
BuildFormSchema(entityName) {
|
|
101
|
+
if (!entityName) {
|
|
102
|
+
this._formSchema = null;
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
if (this._formSchema && this._formSchema.entityName === entityName) {
|
|
106
|
+
return this._formSchema;
|
|
107
|
+
}
|
|
108
|
+
const schema = buildCuratedFormSchema(entityName, this.Provider);
|
|
109
|
+
this._formSchema = schema;
|
|
110
|
+
return schema;
|
|
111
|
+
}
|
|
39
112
|
// --- Loading ---
|
|
40
113
|
_isLoading = true;
|
|
41
114
|
get IsLoading() { return this._isLoading; }
|
|
@@ -105,6 +178,9 @@ export class ComponentStudioStateService {
|
|
|
105
178
|
SendErrorToAI = new EventEmitter();
|
|
106
179
|
/** Emitted when a component spec is updated (e.g. by AI) */
|
|
107
180
|
SpecUpdated = new EventEmitter();
|
|
181
|
+
/** Emitted when the Form Builder tab's "Open in Chat" button is clicked.
|
|
182
|
+
* The dashboard subscribes and forwards to NavigationService.SetAgentContext. */
|
|
183
|
+
OpenInChatRequested = new EventEmitter();
|
|
108
184
|
_provider = null;
|
|
109
185
|
/** Set the metadata provider this service should use. Components should call this after injection. */
|
|
110
186
|
set Provider(value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-studio-state.service.js","sourceRoot":"","sources":["../../../src/ComponentStudio/services/component-studio-state.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, EventEmitter } from '@angular/core';\nimport { RunView, CompositeKey, Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { ComponentMetadataEngine } from '@memberjunction/core-entities';\nimport { ComponentSpec } from '@memberjunction/interactive-component-types';\nimport { ParseJSONRecursive, ParseJSONOptions } from '@memberjunction/global';\nimport { BehaviorSubject, Subject } from 'rxjs';\n\n/**\n * Lightweight summary of a database component for the browser list.\n * Only contains fields needed for display — Specification and other heavy\n * columns are fetched on demand when a component is selected.\n */\nexport interface DbComponentSummary {\n ID: string;\n Name: string;\n Namespace: string | null;\n Version: string | null;\n Type: string | null;\n Status: string | null;\n Description: string | null;\n HasRequiredCustomProps: boolean;\n __mj_UpdatedAt: Date | null;\n isFileLoaded?: false;\n}\n\n/**\n * Interface for components loaded from files, text, or artifacts (not from database)\n */\nexport interface FileLoadedComponent {\n id: string;\n name: string;\n description?: string;\n specification: ComponentSpec;\n filename: string;\n loadedAt: Date;\n isFileLoaded: true;\n type?: string;\n status?: string;\n sourceArtifactID?: string;\n sourceVersionID?: string;\n}\n\n/**\n * Union type for both database and file-loaded components\n */\nexport type DisplayComponent = DbComponentSummary | FileLoadedComponent;\n\n/**\n * Category for filtering\n */\nexport interface Category {\n name: string;\n count: number;\n color: string;\n}\n\n/**\n * Component error info\n */\nexport interface ComponentError {\n type: string;\n message: string;\n technicalDetails?: Record<string, unknown> | string;\n}\n\n/**\n * Code section for the code editor tabbed panel\n */\nexport interface CodeSection {\n title: string;\n code: string;\n originalCode: string;\n isDependency: boolean;\n index?: number;\n}\n\n/**\n * Central state management service for Component Studio.\n * Decouples state from components so sub-components can share state.\n */\n@Injectable()\nexport class ComponentStudioStateService {\n\n // --- Component Data ---\n private _dbComponents: DbComponentSummary[] = [];\n private _fileLoadedComponents: FileLoadedComponent[] = [];\n\n get DbComponents(): DbComponentSummary[] { return this._dbComponents; }\n get FileLoadedComponents(): FileLoadedComponent[] { return this._fileLoadedComponents; }\n\n /** Combined list of all components (file-loaded first, then DB) */\n get AllComponents(): DisplayComponent[] {\n return [\n ...this._fileLoadedComponents,\n ...this._dbComponents\n ] as DisplayComponent[];\n }\n\n // --- Filtered Components ---\n private _filteredComponents: DisplayComponent[] = [];\n get FilteredComponents(): DisplayComponent[] { return this._filteredComponents; }\n\n // --- Selection & Running ---\n private _selectedComponent: DisplayComponent | null = null;\n private _expandedComponent: DisplayComponent | null = null;\n private _componentSpec: ComponentSpec | null = null;\n private _isRunning = false;\n\n get SelectedComponent(): DisplayComponent | null { return this._selectedComponent; }\n set SelectedComponent(value: DisplayComponent | null) { this._selectedComponent = value; }\n\n get ExpandedComponent(): DisplayComponent | null { return this._expandedComponent; }\n set ExpandedComponent(value: DisplayComponent | null) { this._expandedComponent = value; }\n\n get ComponentSpec(): ComponentSpec | null { return this._componentSpec; }\n set ComponentSpec(value: ComponentSpec | null) { this._componentSpec = value; }\n\n get IsRunning(): boolean { return this._isRunning; }\n set IsRunning(value: boolean) { this._isRunning = value; }\n\n // --- Loading ---\n private _isLoading = true;\n get IsLoading(): boolean { return this._isLoading; }\n\n // --- Error ---\n private _currentError: ComponentError | null = null;\n get CurrentError(): ComponentError | null { return this._currentError; }\n set CurrentError(value: ComponentError | null) { this._currentError = value; }\n\n // --- Filters ---\n private _searchQuery = '';\n private _selectedCategories: Set<string> = new Set();\n private _showOnlyFavorites = false;\n private _showDeprecatedComponents = false;\n private _showAllCategories = false;\n private _isFilterPanelExpanded = false;\n\n get SearchQuery(): string { return this._searchQuery; }\n set SearchQuery(value: string) {\n this._searchQuery = value;\n this.ApplyFilters();\n }\n\n get SelectedCategories(): Set<string> { return this._selectedCategories; }\n get ShowOnlyFavorites(): boolean { return this._showOnlyFavorites; }\n get ShowDeprecatedComponents(): boolean { return this._showDeprecatedComponents; }\n get ShowAllCategories(): boolean { return this._showAllCategories; }\n get IsFilterPanelExpanded(): boolean { return this._isFilterPanelExpanded; }\n\n // --- Favorites ---\n private _favoriteComponents: Set<string> = new Set();\n get FavoriteComponents(): Set<string> { return this._favoriteComponents; }\n\n // --- Categories ---\n private _availableCategories: Category[] = [];\n get AvailableCategories(): Category[] { return this._availableCategories; }\n\n // --- Editor State ---\n private _editableSpec = '';\n private _editableCode = '';\n private _codeSections: CodeSection[] = [];\n private _isEditingSpec = false;\n private _isEditingCode = false;\n private _activeTab = 0;\n private _isDetailsPaneCollapsed = true;\n\n get EditableSpec(): string { return this._editableSpec; }\n set EditableSpec(value: string) { this._editableSpec = value; }\n\n get EditableCode(): string { return this._editableCode; }\n set EditableCode(value: string) { this._editableCode = value; }\n\n get CodeSections(): CodeSection[] { return this._codeSections; }\n\n get IsEditingSpec(): boolean { return this._isEditingSpec; }\n set IsEditingSpec(value: boolean) { this._isEditingSpec = value; }\n\n get IsEditingCode(): boolean { return this._isEditingCode; }\n set IsEditingCode(value: boolean) { this._isEditingCode = value; }\n\n get ActiveTab(): number { return this._activeTab; }\n set ActiveTab(value: number) { this._activeTab = value; }\n\n get IsDetailsPaneCollapsed(): boolean { return this._isDetailsPaneCollapsed; }\n set IsDetailsPaneCollapsed(value: boolean) { this._isDetailsPaneCollapsed = value; }\n\n // --- Unsaved changes tracking ---\n private _hasUnsavedChanges = false;\n private _hasResolvedSpec = false;\n get HasUnsavedChanges(): boolean { return this._hasUnsavedChanges; }\n set HasUnsavedChanges(value: boolean) { this._hasUnsavedChanges = value; }\n\n // --- AI Panel ---\n private _isAIPanelCollapsed = false;\n get IsAIPanelCollapsed(): boolean { return this._isAIPanelCollapsed; }\n set IsAIPanelCollapsed(value: boolean) { this._isAIPanelCollapsed = value; }\n\n // --- Events ---\n /** Emitted when state changes require UI update */\n StateChanged = new EventEmitter<void>();\n\n /** Emitted when the running component needs to refresh */\n RefreshComponent = new EventEmitter<void>();\n\n /** Emitted when an error should be sent to AI for diagnosis */\n SendErrorToAI = new EventEmitter<ComponentError>();\n\n /** Emitted when a component spec is updated (e.g. by AI) */\n SpecUpdated = new EventEmitter<ComponentSpec>();\n\n private _provider: IMetadataProvider | null = null;\n\n /** Set the metadata provider this service should use. Components should call this after injection. */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n private get metadata(): IMetadataProvider {\n return this.Provider;\n }\n\n // ============================================================\n // DATA LOADING\n // ============================================================\n\n async LoadComponents(): Promise<void> {\n this._isLoading = true;\n this.StateChanged.emit();\n\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<DbComponentSummary>({\n EntityName: 'MJ: Components',\n ExtraFilter: 'HasRequiredCustomProps = 0',\n OrderBy: 'Name',\n Fields: ['ID', 'Name', 'Namespace', 'Version', 'Type', 'Status', 'Description', 'HasRequiredCustomProps', '__mj_UpdatedAt'],\n MaxRows: 1000,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this._dbComponents = result.Results || [];\n this.ApplyFilters();\n this._isLoading = false;\n this.StateChanged.emit();\n\n // Load favorites in background\n this.loadFavorites();\n } else {\n console.error('Failed to load components:', result.ErrorMessage);\n this._isLoading = false;\n this.StateChanged.emit();\n }\n } catch (error) {\n console.error('Error loading components:', error);\n this._isLoading = false;\n this.StateChanged.emit();\n }\n }\n\n private async loadFavorites(): Promise<void> {\n const currentUserId = this.metadata.CurrentUser?.ID;\n if (!currentUserId) return;\n\n this._favoriteComponents.clear();\n\n try {\n // Batch-load all favorites for this user + entity in a single query\n // instead of one GetRecordFavoriteStatus call per component.\n const rv = RunView.FromMetadataProvider(this.Provider);\n const safeUserId = currentUserId.replace(/'/g, \"''\");\n const result = await rv.RunView<{RecordID: string}>({\n EntityName: 'MJ: User Favorites',\n ExtraFilter: `UserID='${safeUserId}' AND Entity='MJ: Components'`,\n Fields: ['RecordID'],\n ResultType: 'simple'\n });\n\n if (result.Success) {\n for (const row of result.Results) {\n this._favoriteComponents.add(row.RecordID);\n }\n }\n } catch (error) {\n console.error('Error loading favorites:', error);\n }\n\n this.StateChanged.emit();\n }\n\n // ============================================================\n // FILTERING\n // ============================================================\n\n ApplyFilters(): void {\n this.buildCategories();\n\n let filtered = [...this.AllComponents];\n\n // Filter out deprecated\n if (!this._showDeprecatedComponents) {\n filtered = filtered.filter(c => this.GetComponentStatus(c) !== 'Deprecated');\n }\n\n // Favorites filter\n if (this._showOnlyFavorites) {\n filtered = filtered.filter(c => this.IsFavorite(c));\n }\n\n // Category filter\n if (this._selectedCategories.size > 0) {\n filtered = filtered.filter(c => {\n const namespace = this.GetComponentNamespace(c) || 'Uncategorized';\n const category = this.extractCategoryFromNamespace(namespace);\n return this._selectedCategories.has(category);\n });\n }\n\n // Search filter\n if (this._searchQuery) {\n const query = this._searchQuery.toLowerCase();\n filtered = filtered.filter(c => {\n const name = this.GetComponentName(c)?.toLowerCase() || '';\n const description = this.GetComponentDescription(c)?.toLowerCase() || '';\n const type = this.GetComponentType(c)?.toLowerCase() || '';\n const namespace = this.GetComponentNamespace(c)?.toLowerCase() || '';\n return name.includes(query) || description.includes(query) || type.includes(query) || namespace.includes(query);\n });\n }\n\n this._filteredComponents = filtered;\n }\n\n private buildCategories(): void {\n const categoryMap = new Map<string, number>();\n for (const component of this.AllComponents) {\n const namespace = this.GetComponentNamespace(component) || 'Uncategorized';\n const category = this.extractCategoryFromNamespace(namespace);\n categoryMap.set(category, (categoryMap.get(category) || 0) + 1);\n }\n\n this._availableCategories = Array.from(categoryMap.entries())\n .map(([name, count]) => ({\n name,\n count,\n color: this.getCategoryColor(name)\n }))\n .sort((a, b) => b.count - a.count);\n }\n\n private extractCategoryFromNamespace(namespace: string): string {\n if (!namespace || namespace === 'Uncategorized') return 'Uncategorized';\n const parts = namespace.split('/').filter(p => p.length > 0);\n return parts[0] || 'Uncategorized';\n }\n\n private getCategoryColor(category: string): string {\n const colors = [\n '#3B82F6', '#8B5CF6', '#10B981', '#F97316', '#06B6D4',\n '#EC4899', '#6366F1', '#14B8A6', '#EAB308', '#EF4444',\n ];\n let hash = 0;\n for (let i = 0; i < category.length; i++) {\n hash = category.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n }\n\n ToggleFilterPanel(): void {\n this._isFilterPanelExpanded = !this._isFilterPanelExpanded;\n this.StateChanged.emit();\n }\n\n ToggleCategory(category: string): void {\n if (this._selectedCategories.has(category)) {\n this._selectedCategories.delete(category);\n } else {\n this._selectedCategories.add(category);\n }\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n ToggleShowOnlyFavorites(): void {\n this._showOnlyFavorites = !this._showOnlyFavorites;\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n ToggleShowDeprecatedComponents(): void {\n this._showDeprecatedComponents = !this._showDeprecatedComponents;\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n ToggleShowAllCategories(): void {\n this._showAllCategories = !this._showAllCategories;\n this.StateChanged.emit();\n }\n\n ClearAllFilters(): void {\n this._selectedCategories.clear();\n this._showOnlyFavorites = false;\n this._showDeprecatedComponents = false;\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n GetActiveFilterCount(): number {\n let count = 0;\n if (this._showOnlyFavorites) count++;\n if (this._showDeprecatedComponents) count++;\n count += this._selectedCategories.size;\n return count;\n }\n\n GetDeprecatedCount(): number {\n return this.AllComponents.filter(c => this.GetComponentStatus(c) === 'Deprecated').length;\n }\n\n GetVisibleCategories(): Category[] {\n return this._showAllCategories ? this._availableCategories : this._availableCategories.slice(0, 5);\n }\n\n IsCategorySelected(category: string): boolean {\n return this._selectedCategories.has(category);\n }\n\n // ============================================================\n // FAVORITES\n // ============================================================\n\n IsFavorite(component: DisplayComponent): boolean {\n if (this.IsFileLoadedComponent(component)) return false;\n return this._favoriteComponents.has(this.GetComponentId(component));\n }\n\n async ToggleFavorite(component: DisplayComponent): Promise<void> {\n if (this.IsFileLoadedComponent(component)) return;\n\n const currentUserId = this.metadata.CurrentUser?.ID;\n if (!currentUserId) return;\n\n const componentId = this.GetComponentId(component);\n const isFavorite = this._favoriteComponents.has(componentId);\n\n try {\n await this.metadata.SetRecordFavoriteStatus(\n currentUserId,\n 'MJ: Components',\n CompositeKey.FromID(componentId),\n !isFavorite,\n this.metadata.CurrentUser\n );\n\n if (isFavorite) {\n this._favoriteComponents.delete(componentId);\n } else {\n this._favoriteComponents.add(componentId);\n }\n this.StateChanged.emit();\n } catch (error) {\n console.error('Error toggling favorite status:', error);\n }\n }\n\n // ============================================================\n // COMPONENT ACCESSORS (for union type)\n // ============================================================\n\n IsFileLoadedComponent(component: DisplayComponent): component is FileLoadedComponent {\n return component.isFileLoaded === true;\n }\n\n GetComponentName(component: DisplayComponent): string {\n return component.isFileLoaded ? component.name : component.Name;\n }\n\n GetComponentDescription(component: DisplayComponent): string | undefined {\n return component.isFileLoaded ? component.description : (component.Description || undefined);\n }\n\n GetComponentType(component: DisplayComponent): string | undefined {\n return component.isFileLoaded ? component.type : (component.Type || undefined);\n }\n\n GetComponentStatus(component: DisplayComponent): string | undefined {\n return component.isFileLoaded ? component.status : (component.Status || undefined);\n }\n\n GetComponentVersion(component: DisplayComponent): string {\n return component.isFileLoaded ? '1.0.0' : (component.Version || '1.0.0');\n }\n\n /**\n * Fetches the full component specification. For file-loaded components, returns\n * the in-memory spec. For database components, loads the full entity record\n * on demand via ComponentMetadataEngine.FindComponentByID() — the lightweight\n * summary loaded at startup does not include the Specification column.\n */\n async GetComponentSpec(component: DisplayComponent): Promise<ComponentSpec> {\n if (component.isFileLoaded) {\n return component.specification;\n }\n const fullEntity = await ComponentMetadataEngine.Instance.FindComponentByID(component.ID);\n if (!fullEntity || !fullEntity.Specification) {\n throw new Error(`Component specification not found for: ${component.Name}`);\n }\n return JSON.parse(fullEntity.Specification);\n }\n\n GetComponentId(component: DisplayComponent): string {\n return component.isFileLoaded ? component.id : component.ID;\n }\n\n GetComponentNamespace(component: DisplayComponent): string | undefined {\n if (component.isFileLoaded) {\n return component.specification.namespace;\n }\n return component.Namespace || undefined;\n }\n\n GetComponentFilename(component: DisplayComponent): string | undefined {\n return component.isFileLoaded ? component.filename : undefined;\n }\n\n GetComponentLoadedAt(component: DisplayComponent): Date | undefined {\n return component.isFileLoaded ? component.loadedAt : undefined;\n }\n\n GetComponentUpdatedAt(component: DisplayComponent): Date | undefined {\n return !component.isFileLoaded && component.__mj_UpdatedAt ? component.__mj_UpdatedAt : undefined;\n }\n\n // ============================================================\n // COMPONENT RUNNING\n // ============================================================\n\n async StartComponent(component: DisplayComponent): Promise<void> {\n this._selectedComponent = component;\n this._componentSpec = await this.GetComponentSpec(component);\n this._isRunning = true;\n this._currentError = null;\n this._isDetailsPaneCollapsed = false;\n this._hasUnsavedChanges = false;\n this._hasResolvedSpec = false;\n this.InitializeEditors();\n this.StateChanged.emit();\n }\n\n StopComponent(): void {\n this._isRunning = false;\n this._selectedComponent = null;\n this._componentSpec = null;\n this._currentError = null;\n this._hasUnsavedChanges = false;\n this._hasResolvedSpec = false;\n this.StateChanged.emit();\n }\n\n async RunComponent(component: DisplayComponent): Promise<void> {\n const componentId = this.GetComponentId(component);\n const selectedId = this._selectedComponent ? this.GetComponentId(this._selectedComponent) : null;\n\n if (this._isRunning && selectedId !== componentId) {\n this.StopComponent();\n }\n await this.StartComponent(component);\n }\n\n // ============================================================\n // EDITORS\n // ============================================================\n\n InitializeEditors(): void {\n if (!this._selectedComponent || !this._componentSpec) return;\n\n const spec = this._componentSpec;\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsed = ParseJSONRecursive(spec, parseOptions);\n this._editableSpec = JSON.stringify(parsed, null, 2);\n this._editableCode = spec.code || '// No code available';\n this.BuildCodeSections();\n this._isEditingSpec = false;\n this._isEditingCode = false;\n this._hasUnsavedChanges = false;\n }\n\n BuildCodeSections(): void {\n if (!this._selectedComponent) {\n this._codeSections = [];\n return;\n }\n\n // Use the in-memory spec (which may be the resolved version from the React bridge)\n if (!this._componentSpec) return;\n const spec = this._componentSpec;\n const sections: CodeSection[] = [];\n\n const mainCode = spec.code || '// No code available';\n sections.push({\n title: spec.name || 'Main Component',\n code: mainCode,\n originalCode: mainCode,\n isDependency: false\n });\n\n if (spec.dependencies && Array.isArray(spec.dependencies)) {\n spec.dependencies.forEach((dep: ComponentSpec, index: number) => {\n const depCode = dep.code || '// No code available';\n sections.push({\n title: dep.name || `Dependency ${index + 1}`,\n code: depCode,\n originalCode: depCode,\n isDependency: true,\n index\n });\n });\n }\n\n this._codeSections = sections;\n }\n\n /**\n * Apply spec changes from the JSON editor back to the component\n */\n ApplySpecChanges(): boolean {\n try {\n const parsed = JSON.parse(this._editableSpec);\n\n if (this._selectedComponent) {\n if (this.IsFileLoadedComponent(this._selectedComponent)) {\n this._selectedComponent.specification = parsed;\n }\n\n this._componentSpec = parsed;\n this._editableCode = parsed.code || '// No code available';\n this.BuildCodeSections();\n this._isEditingSpec = false;\n this._hasUnsavedChanges = true;\n this.RefreshComponent.emit();\n this.StateChanged.emit();\n return true;\n }\n } catch (error) {\n console.error('Invalid JSON in spec editor:', error);\n }\n return false;\n }\n\n /**\n * Apply code changes from the code editor back to the spec\n */\n ApplyCodeChanges(): boolean {\n if (!this._selectedComponent) return false;\n\n try {\n const spec = JSON.parse(this._editableSpec);\n\n if (this._codeSections.length > 0) {\n spec.code = this._codeSections[0].code;\n\n if (this._codeSections.length > 1 && spec.dependencies) {\n for (let i = 1; i < this._codeSections.length; i++) {\n const section = this._codeSections[i];\n if (section.index !== undefined && spec.dependencies[section.index]) {\n spec.dependencies[section.index].code = section.code;\n }\n }\n }\n }\n\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsed = ParseJSONRecursive(spec, parseOptions);\n this._editableSpec = JSON.stringify(parsed, null, 2);\n\n if (this.IsFileLoadedComponent(this._selectedComponent)) {\n this._selectedComponent.specification = spec;\n }\n\n this._componentSpec = spec;\n this._isEditingCode = false;\n this._hasUnsavedChanges = true;\n this.RefreshComponent.emit();\n this.StateChanged.emit();\n return true;\n } catch (error) {\n console.error('Error applying code changes:', error);\n }\n return false;\n }\n\n /**\n * Update the internal spec with the fully resolved version returned by the\n * React bridge after it loads the component hierarchy. This replaces\n * registry-reference stubs with real code so code sections show actual source.\n * Does NOT mark the component as having unsaved changes or trigger a re-render.\n *\n * Runs at most once per component load. The bridge re-resolves from the registry\n * on every refresh (including the refresh triggered by Apply Changes), and we\n * must not let that round-trip clobber edits the user has already applied.\n */\n UpdateWithResolvedSpec(resolvedSpec: ComponentSpec): void {\n if (!this._selectedComponent) return;\n if (this._hasResolvedSpec) return;\n\n // Only update if the resolved spec actually differs (has real code)\n const current = this._componentSpec;\n if (!current || current === resolvedSpec) return;\n\n this._hasResolvedSpec = true;\n this._componentSpec = resolvedSpec;\n\n // Update editable spec JSON so Spec/Requirements/Design/Data tabs reflect resolved data\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsed = ParseJSONRecursive(resolvedSpec, parseOptions);\n this._editableSpec = JSON.stringify(parsed, null, 2);\n\n // Update editable code with the resolved main code\n this._editableCode = resolvedSpec.code || '// No code available';\n\n // Rebuild code sections so the editor shows resolved dependency code\n this.BuildCodeSections();\n this.StateChanged.emit();\n }\n\n /**\n * Update the component spec directly (e.g., from AI)\n */\n UpdateSpec(newSpec: ComponentSpec): void {\n if (!this._selectedComponent) return;\n\n if (this.IsFileLoadedComponent(this._selectedComponent)) {\n this._selectedComponent.specification = newSpec;\n }\n\n this._componentSpec = newSpec;\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsed = ParseJSONRecursive(newSpec, parseOptions);\n this._editableSpec = JSON.stringify(parsed, null, 2);\n this._editableCode = newSpec.code || '// No code available';\n this.BuildCodeSections();\n this._isEditingSpec = false;\n this._isEditingCode = false;\n this._hasUnsavedChanges = true;\n this.SpecUpdated.emit(newSpec);\n this.RefreshComponent.emit();\n this.StateChanged.emit();\n }\n\n // ============================================================\n // FILE-LOADED COMPONENT MANAGEMENT\n // ============================================================\n\n AddFileLoadedComponent(component: FileLoadedComponent): void {\n this._fileLoadedComponents.push(component);\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n RemoveFileLoadedComponent(component: FileLoadedComponent): void {\n const index = this._fileLoadedComponents.indexOf(component);\n if (index > -1) {\n this._fileLoadedComponents.splice(index, 1);\n if (this._selectedComponent === component) {\n this.StopComponent();\n }\n if (this._expandedComponent === component) {\n this._expandedComponent = null;\n }\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n }\n\n GenerateId(): string {\n return 'file-' + Date.now() + '-' + Math.random().toString(36).substr(2, 9);\n }\n\n // ============================================================\n // UI HELPERS\n // ============================================================\n\n GetComponentTypeIcon(type: string | null | undefined): string {\n const icons: Record<string, string> = {\n 'Report': 'fa-file-alt',\n 'Dashboard': 'fa-tachometer-alt',\n 'Form': 'fa-edit',\n 'Chart': 'fa-chart-bar',\n 'Table': 'fa-table',\n 'Widget': 'fa-cube',\n 'Navigation': 'fa-compass',\n 'Search': 'fa-search',\n 'Utility': 'fa-cog'\n };\n return icons[type || ''] || 'fa-puzzle-piece';\n }\n\n GetComponentTypeColor(type: string | null | undefined): string {\n const colors: Record<string, string> = {\n 'Report': '#3B82F6',\n 'Dashboard': '#8B5CF6',\n 'Form': '#10B981',\n 'Chart': '#F97316',\n 'Table': '#06B6D4',\n 'Widget': '#EC4899',\n 'Navigation': '#6366F1',\n 'Search': '#14B8A6',\n 'Utility': '#64748B'\n };\n return colors[type || ''] || '#9CA3AF';\n }\n\n GetNamespaceColor(namespace: string | undefined): string {\n if (!namespace || namespace === 'Uncategorized') return '#6C757D';\n const category = this.extractCategoryFromNamespace(namespace);\n return this.getCategoryColor(category);\n }\n\n FormatNamespace(namespace: string | undefined): string {\n if (!namespace || namespace === 'Uncategorized') return 'Uncategorized';\n const parts = namespace.split('/').filter(p => p.length > 0);\n if (parts.length > 3) {\n return `${parts[0]} / ... / ${parts[parts.length - 1]}`;\n }\n return parts.join(' / ');\n }\n\n /**\n * Get the current spec, preferring edited version if available\n */\n GetCurrentSpec(): ComponentSpec | null {\n if (!this._selectedComponent || !this._componentSpec) return null;\n\n if (this._isEditingSpec || this._isEditingCode) {\n try {\n return JSON.parse(this._editableSpec);\n } catch {\n return this._componentSpec;\n }\n }\n return this._componentSpec;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"component-studio-state.service.js","sourceRoot":"","sources":["../../../src/ComponentStudio/services/component-studio-state.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, EventEmitter } from '@angular/core';\nimport { RunView, CompositeKey, Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { ComponentMetadataEngine } from '@memberjunction/core-entities';\nimport { ComponentSpec } from '@memberjunction/interactive-component-types';\nimport { buildCuratedFormSchema, CuratedFormSchema, FormMode } from '@memberjunction/interactive-component-types/forms';\nimport { ParseJSONRecursive, ParseJSONOptions } from '@memberjunction/global';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { FormCanvasModel } from './form-canvas-model';\n\n/**\n * Lightweight summary of a database component for the browser list.\n * Only contains fields needed for display — Specification and other heavy\n * columns are fetched on demand when a component is selected.\n */\nexport interface DbComponentSummary {\n ID: string;\n Name: string;\n Namespace: string | null;\n Version: string | null;\n Type: string | null;\n Status: string | null;\n Description: string | null;\n HasRequiredCustomProps: boolean;\n __mj_UpdatedAt: Date | null;\n isFileLoaded?: false;\n}\n\n/**\n * Interface for components loaded from files, text, or artifacts (not from database)\n */\nexport interface FileLoadedComponent {\n id: string;\n name: string;\n description?: string;\n specification: ComponentSpec;\n filename: string;\n loadedAt: Date;\n isFileLoaded: true;\n type?: string;\n status?: string;\n sourceArtifactID?: string;\n sourceVersionID?: string;\n}\n\n/**\n * Union type for both database and file-loaded components\n */\nexport type DisplayComponent = DbComponentSummary | FileLoadedComponent;\n\n/**\n * Category for filtering\n */\nexport interface Category {\n name: string;\n count: number;\n color: string;\n}\n\n/**\n * Component error info\n */\nexport interface ComponentError {\n type: string;\n message: string;\n technicalDetails?: Record<string, unknown> | string;\n}\n\n/**\n * Code section for the code editor tabbed panel\n */\nexport interface CodeSection {\n title: string;\n code: string;\n originalCode: string;\n isDependency: boolean;\n index?: number;\n}\n\n/**\n * Central state management service for Component Studio.\n * Decouples state from components so sub-components can share state.\n */\n@Injectable()\nexport class ComponentStudioStateService {\n\n // --- Component Data ---\n private _dbComponents: DbComponentSummary[] = [];\n private _fileLoadedComponents: FileLoadedComponent[] = [];\n\n get DbComponents(): DbComponentSummary[] { return this._dbComponents; }\n get FileLoadedComponents(): FileLoadedComponent[] { return this._fileLoadedComponents; }\n\n /** Combined list of all components (file-loaded first, then DB) */\n get AllComponents(): DisplayComponent[] {\n return [\n ...this._fileLoadedComponents,\n ...this._dbComponents\n ] as DisplayComponent[];\n }\n\n // --- Filtered Components ---\n private _filteredComponents: DisplayComponent[] = [];\n get FilteredComponents(): DisplayComponent[] { return this._filteredComponents; }\n\n // --- Selection & Running ---\n private _selectedComponent: DisplayComponent | null = null;\n private _expandedComponent: DisplayComponent | null = null;\n private _componentSpec: ComponentSpec | null = null;\n private _isRunning = false;\n\n get SelectedComponent(): DisplayComponent | null { return this._selectedComponent; }\n set SelectedComponent(value: DisplayComponent | null) { this._selectedComponent = value; }\n\n get ExpandedComponent(): DisplayComponent | null { return this._expandedComponent; }\n set ExpandedComponent(value: DisplayComponent | null) { this._expandedComponent = value; }\n\n get ComponentSpec(): ComponentSpec | null { return this._componentSpec; }\n set ComponentSpec(value: ComponentSpec | null) { this._componentSpec = value; }\n\n get IsRunning(): boolean { return this._isRunning; }\n set IsRunning(value: boolean) { this._isRunning = value; }\n\n // --- Form-role target entity (shared between Field Binding Inspector\n // and the fixture-record live preview) ---\n // Tracks which entity a form-role Component is being authored against.\n // Inspector writes; Preview reads to build fixture FormHostProps; either\n // can clear by setting to null. Independent of ComponentSpec because the\n // author may want to inspect Customer fields while editing a form for\n // Accounts, or simply hasn't decided yet.\n private _formTargetEntityName: string | null = null;\n get FormTargetEntityName(): string | null { return this._formTargetEntityName; }\n set FormTargetEntityName(value: string | null) {\n if (value === this._formTargetEntityName) return;\n this._formTargetEntityName = value;\n // Schema is keyed by entity — invalidate when target changes.\n this._formSchema = null;\n this.StateChanged.emit();\n }\n\n // --- Form Builder canvas state (live inside the Form Builder tab). ---\n // The canvas is the source of truth WHILE the Form Builder tab is active;\n // on save we serialize it back to ComponentSpec.code via canvas-to-code.\n // When the user instead edits Code directly, the canvas is rebuilt via\n // code-to-canvas (lossy) on tab focus. Schema is cached per entity so\n // tab toggles don't pay the build cost repeatedly.\n private _formCanvas: FormCanvasModel | null = null;\n get FormCanvas(): FormCanvasModel | null { return this._formCanvas; }\n set FormCanvas(value: FormCanvasModel | null) {\n this._formCanvas = value;\n this.StateChanged.emit();\n }\n\n private _formSchema: CuratedFormSchema | null = null;\n get FormSchema(): CuratedFormSchema | null { return this._formSchema; }\n\n private _formSelectedElementId: string | null = null;\n get FormSelectedElementId(): string | null { return this._formSelectedElementId; }\n set FormSelectedElementId(value: string | null) {\n this._formSelectedElementId = value;\n this.StateChanged.emit();\n }\n\n private _formSelectedSectionId: string | null = null;\n get FormSelectedSectionId(): string | null { return this._formSelectedSectionId; }\n set FormSelectedSectionId(value: string | null) {\n this._formSelectedSectionId = value;\n this.StateChanged.emit();\n }\n\n /** True when the parser couldn't fully round-trip code → canvas. UI shows a banner. */\n private _formCodeOnlySectionsDetected = false;\n get FormCodeOnlySectionsDetected(): boolean { return this._formCodeOnlySectionsDetected; }\n set FormCodeOnlySectionsDetected(value: boolean) {\n this._formCodeOnlySectionsDetected = value;\n this.StateChanged.emit();\n }\n\n /** Preview mode for the Form Builder tab — drives the toolbar pills AND the preview pane. */\n private _formPreviewMode: FormMode = 'view';\n get FormPreviewMode(): FormMode { return this._formPreviewMode; }\n set FormPreviewMode(value: FormMode) {\n if (this._formPreviewMode === value) return;\n this._formPreviewMode = value;\n this.StateChanged.emit();\n }\n\n /** Build (and cache) the curated schema for the given entity. */\n BuildFormSchema(entityName: string | null): CuratedFormSchema | null {\n if (!entityName) {\n this._formSchema = null;\n return null;\n }\n if (this._formSchema && this._formSchema.entityName === entityName) {\n return this._formSchema;\n }\n const schema = buildCuratedFormSchema(entityName, this.Provider);\n this._formSchema = schema;\n return schema;\n }\n\n // --- Loading ---\n private _isLoading = true;\n get IsLoading(): boolean { return this._isLoading; }\n\n // --- Error ---\n private _currentError: ComponentError | null = null;\n get CurrentError(): ComponentError | null { return this._currentError; }\n set CurrentError(value: ComponentError | null) { this._currentError = value; }\n\n // --- Filters ---\n private _searchQuery = '';\n private _selectedCategories: Set<string> = new Set();\n private _showOnlyFavorites = false;\n private _showDeprecatedComponents = false;\n private _showAllCategories = false;\n private _isFilterPanelExpanded = false;\n\n get SearchQuery(): string { return this._searchQuery; }\n set SearchQuery(value: string) {\n this._searchQuery = value;\n this.ApplyFilters();\n }\n\n get SelectedCategories(): Set<string> { return this._selectedCategories; }\n get ShowOnlyFavorites(): boolean { return this._showOnlyFavorites; }\n get ShowDeprecatedComponents(): boolean { return this._showDeprecatedComponents; }\n get ShowAllCategories(): boolean { return this._showAllCategories; }\n get IsFilterPanelExpanded(): boolean { return this._isFilterPanelExpanded; }\n\n // --- Favorites ---\n private _favoriteComponents: Set<string> = new Set();\n get FavoriteComponents(): Set<string> { return this._favoriteComponents; }\n\n // --- Categories ---\n private _availableCategories: Category[] = [];\n get AvailableCategories(): Category[] { return this._availableCategories; }\n\n // --- Editor State ---\n private _editableSpec = '';\n private _editableCode = '';\n private _codeSections: CodeSection[] = [];\n private _isEditingSpec = false;\n private _isEditingCode = false;\n private _activeTab = 0;\n private _isDetailsPaneCollapsed = true;\n\n get EditableSpec(): string { return this._editableSpec; }\n set EditableSpec(value: string) { this._editableSpec = value; }\n\n get EditableCode(): string { return this._editableCode; }\n set EditableCode(value: string) { this._editableCode = value; }\n\n get CodeSections(): CodeSection[] { return this._codeSections; }\n\n get IsEditingSpec(): boolean { return this._isEditingSpec; }\n set IsEditingSpec(value: boolean) { this._isEditingSpec = value; }\n\n get IsEditingCode(): boolean { return this._isEditingCode; }\n set IsEditingCode(value: boolean) { this._isEditingCode = value; }\n\n get ActiveTab(): number { return this._activeTab; }\n set ActiveTab(value: number) { this._activeTab = value; }\n\n get IsDetailsPaneCollapsed(): boolean { return this._isDetailsPaneCollapsed; }\n set IsDetailsPaneCollapsed(value: boolean) { this._isDetailsPaneCollapsed = value; }\n\n // --- Unsaved changes tracking ---\n private _hasUnsavedChanges = false;\n private _hasResolvedSpec = false;\n get HasUnsavedChanges(): boolean { return this._hasUnsavedChanges; }\n set HasUnsavedChanges(value: boolean) { this._hasUnsavedChanges = value; }\n\n // --- AI Panel ---\n private _isAIPanelCollapsed = false;\n get IsAIPanelCollapsed(): boolean { return this._isAIPanelCollapsed; }\n set IsAIPanelCollapsed(value: boolean) { this._isAIPanelCollapsed = value; }\n\n // --- Events ---\n /** Emitted when state changes require UI update */\n StateChanged = new EventEmitter<void>();\n\n /** Emitted when the running component needs to refresh */\n RefreshComponent = new EventEmitter<void>();\n\n /** Emitted when an error should be sent to AI for diagnosis */\n SendErrorToAI = new EventEmitter<ComponentError>();\n\n /** Emitted when a component spec is updated (e.g. by AI) */\n SpecUpdated = new EventEmitter<ComponentSpec>();\n\n /** Emitted when the Form Builder tab's \"Open in Chat\" button is clicked.\n * The dashboard subscribes and forwards to NavigationService.SetAgentContext. */\n OpenInChatRequested = new EventEmitter<void>();\n\n private _provider: IMetadataProvider | null = null;\n\n /** Set the metadata provider this service should use. Components should call this after injection. */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n private get metadata(): IMetadataProvider {\n return this.Provider;\n }\n\n // ============================================================\n // DATA LOADING\n // ============================================================\n\n async LoadComponents(): Promise<void> {\n this._isLoading = true;\n this.StateChanged.emit();\n\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<DbComponentSummary>({\n EntityName: 'MJ: Components',\n ExtraFilter: 'HasRequiredCustomProps = 0',\n OrderBy: 'Name',\n Fields: ['ID', 'Name', 'Namespace', 'Version', 'Type', 'Status', 'Description', 'HasRequiredCustomProps', '__mj_UpdatedAt'],\n MaxRows: 1000,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this._dbComponents = result.Results || [];\n this.ApplyFilters();\n this._isLoading = false;\n this.StateChanged.emit();\n\n // Load favorites in background\n this.loadFavorites();\n } else {\n console.error('Failed to load components:', result.ErrorMessage);\n this._isLoading = false;\n this.StateChanged.emit();\n }\n } catch (error) {\n console.error('Error loading components:', error);\n this._isLoading = false;\n this.StateChanged.emit();\n }\n }\n\n private async loadFavorites(): Promise<void> {\n const currentUserId = this.metadata.CurrentUser?.ID;\n if (!currentUserId) return;\n\n this._favoriteComponents.clear();\n\n try {\n // Batch-load all favorites for this user + entity in a single query\n // instead of one GetRecordFavoriteStatus call per component.\n const rv = RunView.FromMetadataProvider(this.Provider);\n const safeUserId = currentUserId.replace(/'/g, \"''\");\n const result = await rv.RunView<{RecordID: string}>({\n EntityName: 'MJ: User Favorites',\n ExtraFilter: `UserID='${safeUserId}' AND Entity='MJ: Components'`,\n Fields: ['RecordID'],\n ResultType: 'simple'\n });\n\n if (result.Success) {\n for (const row of result.Results) {\n this._favoriteComponents.add(row.RecordID);\n }\n }\n } catch (error) {\n console.error('Error loading favorites:', error);\n }\n\n this.StateChanged.emit();\n }\n\n // ============================================================\n // FILTERING\n // ============================================================\n\n ApplyFilters(): void {\n this.buildCategories();\n\n let filtered = [...this.AllComponents];\n\n // Filter out deprecated\n if (!this._showDeprecatedComponents) {\n filtered = filtered.filter(c => this.GetComponentStatus(c) !== 'Deprecated');\n }\n\n // Favorites filter\n if (this._showOnlyFavorites) {\n filtered = filtered.filter(c => this.IsFavorite(c));\n }\n\n // Category filter\n if (this._selectedCategories.size > 0) {\n filtered = filtered.filter(c => {\n const namespace = this.GetComponentNamespace(c) || 'Uncategorized';\n const category = this.extractCategoryFromNamespace(namespace);\n return this._selectedCategories.has(category);\n });\n }\n\n // Search filter\n if (this._searchQuery) {\n const query = this._searchQuery.toLowerCase();\n filtered = filtered.filter(c => {\n const name = this.GetComponentName(c)?.toLowerCase() || '';\n const description = this.GetComponentDescription(c)?.toLowerCase() || '';\n const type = this.GetComponentType(c)?.toLowerCase() || '';\n const namespace = this.GetComponentNamespace(c)?.toLowerCase() || '';\n return name.includes(query) || description.includes(query) || type.includes(query) || namespace.includes(query);\n });\n }\n\n this._filteredComponents = filtered;\n }\n\n private buildCategories(): void {\n const categoryMap = new Map<string, number>();\n for (const component of this.AllComponents) {\n const namespace = this.GetComponentNamespace(component) || 'Uncategorized';\n const category = this.extractCategoryFromNamespace(namespace);\n categoryMap.set(category, (categoryMap.get(category) || 0) + 1);\n }\n\n this._availableCategories = Array.from(categoryMap.entries())\n .map(([name, count]) => ({\n name,\n count,\n color: this.getCategoryColor(name)\n }))\n .sort((a, b) => b.count - a.count);\n }\n\n private extractCategoryFromNamespace(namespace: string): string {\n if (!namespace || namespace === 'Uncategorized') return 'Uncategorized';\n const parts = namespace.split('/').filter(p => p.length > 0);\n return parts[0] || 'Uncategorized';\n }\n\n private getCategoryColor(category: string): string {\n const colors = [\n '#3B82F6', '#8B5CF6', '#10B981', '#F97316', '#06B6D4',\n '#EC4899', '#6366F1', '#14B8A6', '#EAB308', '#EF4444',\n ];\n let hash = 0;\n for (let i = 0; i < category.length; i++) {\n hash = category.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n }\n\n ToggleFilterPanel(): void {\n this._isFilterPanelExpanded = !this._isFilterPanelExpanded;\n this.StateChanged.emit();\n }\n\n ToggleCategory(category: string): void {\n if (this._selectedCategories.has(category)) {\n this._selectedCategories.delete(category);\n } else {\n this._selectedCategories.add(category);\n }\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n ToggleShowOnlyFavorites(): void {\n this._showOnlyFavorites = !this._showOnlyFavorites;\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n ToggleShowDeprecatedComponents(): void {\n this._showDeprecatedComponents = !this._showDeprecatedComponents;\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n ToggleShowAllCategories(): void {\n this._showAllCategories = !this._showAllCategories;\n this.StateChanged.emit();\n }\n\n ClearAllFilters(): void {\n this._selectedCategories.clear();\n this._showOnlyFavorites = false;\n this._showDeprecatedComponents = false;\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n GetActiveFilterCount(): number {\n let count = 0;\n if (this._showOnlyFavorites) count++;\n if (this._showDeprecatedComponents) count++;\n count += this._selectedCategories.size;\n return count;\n }\n\n GetDeprecatedCount(): number {\n return this.AllComponents.filter(c => this.GetComponentStatus(c) === 'Deprecated').length;\n }\n\n GetVisibleCategories(): Category[] {\n return this._showAllCategories ? this._availableCategories : this._availableCategories.slice(0, 5);\n }\n\n IsCategorySelected(category: string): boolean {\n return this._selectedCategories.has(category);\n }\n\n // ============================================================\n // FAVORITES\n // ============================================================\n\n IsFavorite(component: DisplayComponent): boolean {\n if (this.IsFileLoadedComponent(component)) return false;\n return this._favoriteComponents.has(this.GetComponentId(component));\n }\n\n async ToggleFavorite(component: DisplayComponent): Promise<void> {\n if (this.IsFileLoadedComponent(component)) return;\n\n const currentUserId = this.metadata.CurrentUser?.ID;\n if (!currentUserId) return;\n\n const componentId = this.GetComponentId(component);\n const isFavorite = this._favoriteComponents.has(componentId);\n\n try {\n await this.metadata.SetRecordFavoriteStatus(\n currentUserId,\n 'MJ: Components',\n CompositeKey.FromID(componentId),\n !isFavorite,\n this.metadata.CurrentUser\n );\n\n if (isFavorite) {\n this._favoriteComponents.delete(componentId);\n } else {\n this._favoriteComponents.add(componentId);\n }\n this.StateChanged.emit();\n } catch (error) {\n console.error('Error toggling favorite status:', error);\n }\n }\n\n // ============================================================\n // COMPONENT ACCESSORS (for union type)\n // ============================================================\n\n IsFileLoadedComponent(component: DisplayComponent): component is FileLoadedComponent {\n return component.isFileLoaded === true;\n }\n\n GetComponentName(component: DisplayComponent): string {\n return component.isFileLoaded ? component.name : component.Name;\n }\n\n GetComponentDescription(component: DisplayComponent): string | undefined {\n return component.isFileLoaded ? component.description : (component.Description || undefined);\n }\n\n GetComponentType(component: DisplayComponent): string | undefined {\n return component.isFileLoaded ? component.type : (component.Type || undefined);\n }\n\n GetComponentStatus(component: DisplayComponent): string | undefined {\n return component.isFileLoaded ? component.status : (component.Status || undefined);\n }\n\n GetComponentVersion(component: DisplayComponent): string {\n return component.isFileLoaded ? '1.0.0' : (component.Version || '1.0.0');\n }\n\n /**\n * Fetches the full component specification. For file-loaded components, returns\n * the in-memory spec. For database components, loads the full entity record\n * on demand via ComponentMetadataEngine.FindComponentByID() — the lightweight\n * summary loaded at startup does not include the Specification column.\n */\n async GetComponentSpec(component: DisplayComponent): Promise<ComponentSpec> {\n if (component.isFileLoaded) {\n return component.specification;\n }\n const fullEntity = await ComponentMetadataEngine.Instance.FindComponentByID(component.ID);\n if (!fullEntity || !fullEntity.Specification) {\n throw new Error(`Component specification not found for: ${component.Name}`);\n }\n return JSON.parse(fullEntity.Specification);\n }\n\n GetComponentId(component: DisplayComponent): string {\n return component.isFileLoaded ? component.id : component.ID;\n }\n\n GetComponentNamespace(component: DisplayComponent): string | undefined {\n if (component.isFileLoaded) {\n return component.specification.namespace;\n }\n return component.Namespace || undefined;\n }\n\n GetComponentFilename(component: DisplayComponent): string | undefined {\n return component.isFileLoaded ? component.filename : undefined;\n }\n\n GetComponentLoadedAt(component: DisplayComponent): Date | undefined {\n return component.isFileLoaded ? component.loadedAt : undefined;\n }\n\n GetComponentUpdatedAt(component: DisplayComponent): Date | undefined {\n return !component.isFileLoaded && component.__mj_UpdatedAt ? component.__mj_UpdatedAt : undefined;\n }\n\n // ============================================================\n // COMPONENT RUNNING\n // ============================================================\n\n async StartComponent(component: DisplayComponent): Promise<void> {\n this._selectedComponent = component;\n this._componentSpec = await this.GetComponentSpec(component);\n this._isRunning = true;\n this._currentError = null;\n this._isDetailsPaneCollapsed = false;\n this._hasUnsavedChanges = false;\n this._hasResolvedSpec = false;\n this.InitializeEditors();\n this.StateChanged.emit();\n }\n\n StopComponent(): void {\n this._isRunning = false;\n this._selectedComponent = null;\n this._componentSpec = null;\n this._currentError = null;\n this._hasUnsavedChanges = false;\n this._hasResolvedSpec = false;\n this.StateChanged.emit();\n }\n\n async RunComponent(component: DisplayComponent): Promise<void> {\n const componentId = this.GetComponentId(component);\n const selectedId = this._selectedComponent ? this.GetComponentId(this._selectedComponent) : null;\n\n if (this._isRunning && selectedId !== componentId) {\n this.StopComponent();\n }\n await this.StartComponent(component);\n }\n\n // ============================================================\n // EDITORS\n // ============================================================\n\n InitializeEditors(): void {\n if (!this._selectedComponent || !this._componentSpec) return;\n\n const spec = this._componentSpec;\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsed = ParseJSONRecursive(spec, parseOptions);\n this._editableSpec = JSON.stringify(parsed, null, 2);\n this._editableCode = spec.code || '// No code available';\n this.BuildCodeSections();\n this._isEditingSpec = false;\n this._isEditingCode = false;\n this._hasUnsavedChanges = false;\n }\n\n BuildCodeSections(): void {\n if (!this._selectedComponent) {\n this._codeSections = [];\n return;\n }\n\n // Use the in-memory spec (which may be the resolved version from the React bridge)\n if (!this._componentSpec) return;\n const spec = this._componentSpec;\n const sections: CodeSection[] = [];\n\n const mainCode = spec.code || '// No code available';\n sections.push({\n title: spec.name || 'Main Component',\n code: mainCode,\n originalCode: mainCode,\n isDependency: false\n });\n\n if (spec.dependencies && Array.isArray(spec.dependencies)) {\n spec.dependencies.forEach((dep: ComponentSpec, index: number) => {\n const depCode = dep.code || '// No code available';\n sections.push({\n title: dep.name || `Dependency ${index + 1}`,\n code: depCode,\n originalCode: depCode,\n isDependency: true,\n index\n });\n });\n }\n\n this._codeSections = sections;\n }\n\n /**\n * Apply spec changes from the JSON editor back to the component\n */\n ApplySpecChanges(): boolean {\n try {\n const parsed = JSON.parse(this._editableSpec);\n\n if (this._selectedComponent) {\n if (this.IsFileLoadedComponent(this._selectedComponent)) {\n this._selectedComponent.specification = parsed;\n }\n\n this._componentSpec = parsed;\n this._editableCode = parsed.code || '// No code available';\n this.BuildCodeSections();\n this._isEditingSpec = false;\n this._hasUnsavedChanges = true;\n this.RefreshComponent.emit();\n this.StateChanged.emit();\n return true;\n }\n } catch (error) {\n console.error('Invalid JSON in spec editor:', error);\n }\n return false;\n }\n\n /**\n * Apply code changes from the code editor back to the spec\n */\n ApplyCodeChanges(): boolean {\n if (!this._selectedComponent) return false;\n\n try {\n const spec = JSON.parse(this._editableSpec);\n\n if (this._codeSections.length > 0) {\n spec.code = this._codeSections[0].code;\n\n if (this._codeSections.length > 1 && spec.dependencies) {\n for (let i = 1; i < this._codeSections.length; i++) {\n const section = this._codeSections[i];\n if (section.index !== undefined && spec.dependencies[section.index]) {\n spec.dependencies[section.index].code = section.code;\n }\n }\n }\n }\n\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsed = ParseJSONRecursive(spec, parseOptions);\n this._editableSpec = JSON.stringify(parsed, null, 2);\n\n if (this.IsFileLoadedComponent(this._selectedComponent)) {\n this._selectedComponent.specification = spec;\n }\n\n this._componentSpec = spec;\n this._isEditingCode = false;\n this._hasUnsavedChanges = true;\n this.RefreshComponent.emit();\n this.StateChanged.emit();\n return true;\n } catch (error) {\n console.error('Error applying code changes:', error);\n }\n return false;\n }\n\n /**\n * Update the internal spec with the fully resolved version returned by the\n * React bridge after it loads the component hierarchy. This replaces\n * registry-reference stubs with real code so code sections show actual source.\n * Does NOT mark the component as having unsaved changes or trigger a re-render.\n *\n * Runs at most once per component load. The bridge re-resolves from the registry\n * on every refresh (including the refresh triggered by Apply Changes), and we\n * must not let that round-trip clobber edits the user has already applied.\n */\n UpdateWithResolvedSpec(resolvedSpec: ComponentSpec): void {\n if (!this._selectedComponent) return;\n if (this._hasResolvedSpec) return;\n\n // Only update if the resolved spec actually differs (has real code)\n const current = this._componentSpec;\n if (!current || current === resolvedSpec) return;\n\n this._hasResolvedSpec = true;\n this._componentSpec = resolvedSpec;\n\n // Update editable spec JSON so Spec/Requirements/Design/Data tabs reflect resolved data\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsed = ParseJSONRecursive(resolvedSpec, parseOptions);\n this._editableSpec = JSON.stringify(parsed, null, 2);\n\n // Update editable code with the resolved main code\n this._editableCode = resolvedSpec.code || '// No code available';\n\n // Rebuild code sections so the editor shows resolved dependency code\n this.BuildCodeSections();\n this.StateChanged.emit();\n }\n\n /**\n * Update the component spec directly (e.g., from AI)\n */\n UpdateSpec(newSpec: ComponentSpec): void {\n if (!this._selectedComponent) return;\n\n if (this.IsFileLoadedComponent(this._selectedComponent)) {\n this._selectedComponent.specification = newSpec;\n }\n\n this._componentSpec = newSpec;\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsed = ParseJSONRecursive(newSpec, parseOptions);\n this._editableSpec = JSON.stringify(parsed, null, 2);\n this._editableCode = newSpec.code || '// No code available';\n this.BuildCodeSections();\n this._isEditingSpec = false;\n this._isEditingCode = false;\n this._hasUnsavedChanges = true;\n this.SpecUpdated.emit(newSpec);\n this.RefreshComponent.emit();\n this.StateChanged.emit();\n }\n\n // ============================================================\n // FILE-LOADED COMPONENT MANAGEMENT\n // ============================================================\n\n AddFileLoadedComponent(component: FileLoadedComponent): void {\n this._fileLoadedComponents.push(component);\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n\n RemoveFileLoadedComponent(component: FileLoadedComponent): void {\n const index = this._fileLoadedComponents.indexOf(component);\n if (index > -1) {\n this._fileLoadedComponents.splice(index, 1);\n if (this._selectedComponent === component) {\n this.StopComponent();\n }\n if (this._expandedComponent === component) {\n this._expandedComponent = null;\n }\n this.ApplyFilters();\n this.StateChanged.emit();\n }\n }\n\n GenerateId(): string {\n return 'file-' + Date.now() + '-' + Math.random().toString(36).substr(2, 9);\n }\n\n // ============================================================\n // UI HELPERS\n // ============================================================\n\n GetComponentTypeIcon(type: string | null | undefined): string {\n const icons: Record<string, string> = {\n 'Report': 'fa-file-alt',\n 'Dashboard': 'fa-tachometer-alt',\n 'Form': 'fa-edit',\n 'Chart': 'fa-chart-bar',\n 'Table': 'fa-table',\n 'Widget': 'fa-cube',\n 'Navigation': 'fa-compass',\n 'Search': 'fa-search',\n 'Utility': 'fa-cog'\n };\n return icons[type || ''] || 'fa-puzzle-piece';\n }\n\n GetComponentTypeColor(type: string | null | undefined): string {\n const colors: Record<string, string> = {\n 'Report': '#3B82F6',\n 'Dashboard': '#8B5CF6',\n 'Form': '#10B981',\n 'Chart': '#F97316',\n 'Table': '#06B6D4',\n 'Widget': '#EC4899',\n 'Navigation': '#6366F1',\n 'Search': '#14B8A6',\n 'Utility': '#64748B'\n };\n return colors[type || ''] || '#9CA3AF';\n }\n\n GetNamespaceColor(namespace: string | undefined): string {\n if (!namespace || namespace === 'Uncategorized') return '#6C757D';\n const category = this.extractCategoryFromNamespace(namespace);\n return this.getCategoryColor(category);\n }\n\n FormatNamespace(namespace: string | undefined): string {\n if (!namespace || namespace === 'Uncategorized') return 'Uncategorized';\n const parts = namespace.split('/').filter(p => p.length > 0);\n if (parts.length > 3) {\n return `${parts[0]} / ... / ${parts[parts.length - 1]}`;\n }\n return parts.join(' / ');\n }\n\n /**\n * Get the current spec, preferring edited version if available\n */\n GetCurrentSpec(): ComponentSpec | null {\n if (!this._selectedComponent || !this._componentSpec) return null;\n\n if (this._isEditingSpec || this._isEditingCode) {\n try {\n return JSON.parse(this._editableSpec);\n } catch {\n return this._componentSpec;\n }\n }\n return this._componentSpec;\n }\n}\n"]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { IMetadataProvider, UserInfo } from '@memberjunction/core';
|
|
2
|
+
import type { FormOverrideDialogResult } from '../components/form-override-dialog.component';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/** Slim row shape for listing existing overrides — matches FormResolverService. */
|
|
5
|
+
export interface EntityFormOverrideRow {
|
|
6
|
+
ID: string;
|
|
7
|
+
EntityID: string;
|
|
8
|
+
ComponentID: string;
|
|
9
|
+
Name: string;
|
|
10
|
+
Description: string | null;
|
|
11
|
+
Scope: 'User' | 'Role' | 'Global';
|
|
12
|
+
UserID: string | null;
|
|
13
|
+
RoleID: string | null;
|
|
14
|
+
Priority: number;
|
|
15
|
+
Status: 'Active' | 'Inactive' | 'Pending';
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Studio-side service for managing `EntityFormOverride` rows from Component
|
|
19
|
+
* Studio (post-save dialog + sub-list of existing overrides).
|
|
20
|
+
*
|
|
21
|
+
* Reads use `RunView` with `ResultType: 'simple'` for the list view —
|
|
22
|
+
* cheaper than loading entity objects when we just want to render rows.
|
|
23
|
+
* Writes (`CreateOverride`, `DeactivateOverride`) load the strongly-typed
|
|
24
|
+
* `MJEntityFormOverrideEntity` and call `Save()`. Per the project
|
|
25
|
+
* "NO WEAK TYPING" rule we never use `.Set('FieldName', ...)`.
|
|
26
|
+
*
|
|
27
|
+
* Unlike the Form Builder agent's action (`__CreateInteractiveForm`),
|
|
28
|
+
* which clamps Scope='User' as a security boundary, the Studio service
|
|
29
|
+
* **honors the dialog's Scope/Role/Priority choices** — Studio is the
|
|
30
|
+
* deliberate human-authoring path where promotion to Role / Global is a
|
|
31
|
+
* core feature. The dialog already enforces that Scope='Role' requires a
|
|
32
|
+
* RoleID.
|
|
33
|
+
*/
|
|
34
|
+
export declare class EntityFormOverrideService {
|
|
35
|
+
/**
|
|
36
|
+
* Fetch existing overrides for an entity, scoped to the calling user's
|
|
37
|
+
* visibility (User, their roles, Global). Used by the Studio sub-list
|
|
38
|
+
* showing "what overrides already exist for this entity."
|
|
39
|
+
*/
|
|
40
|
+
ListOverridesForEntity(entityName: string, user: UserInfo, provider?: IMetadataProvider): Promise<EntityFormOverrideRow[]>;
|
|
41
|
+
/**
|
|
42
|
+
* Create an `EntityFormOverride` row pointing the just-saved Component
|
|
43
|
+
* at an entity. Honors the dialog's Scope/Role/Priority/Status choices
|
|
44
|
+
* (unlike the Form Builder action which clamps to User scope).
|
|
45
|
+
*/
|
|
46
|
+
CreateOverride(componentID: string, result: FormOverrideDialogResult, user: UserInfo, provider?: IMetadataProvider): Promise<{
|
|
47
|
+
Success: boolean;
|
|
48
|
+
ID?: string;
|
|
49
|
+
Error?: string;
|
|
50
|
+
}>;
|
|
51
|
+
/**
|
|
52
|
+
* Promote a Pending override to Active. Mirrors the server-side
|
|
53
|
+
* `Activate Interactive Form Version` action's intent without round-
|
|
54
|
+
* tripping through the Action layer — for cockpit-internal usage where
|
|
55
|
+
* the user is explicitly clicking "Make Active".
|
|
56
|
+
*
|
|
57
|
+
* Atomically flips the target Override to Active AND demotes any sibling
|
|
58
|
+
* Active override at the same scope target to Inactive. Components
|
|
59
|
+
* mirror the override status (Published / Draft / Deprecated).
|
|
60
|
+
*/
|
|
61
|
+
activateVersion(id: string, user?: UserInfo, provider?: IMetadataProvider): Promise<{
|
|
62
|
+
Success: boolean;
|
|
63
|
+
Error?: string;
|
|
64
|
+
}>;
|
|
65
|
+
/**
|
|
66
|
+
* Re-point an Active override at an older Component row in the same Name
|
|
67
|
+
* lineage. Pure UPDATE on the override; no new rows created. Mirrors the
|
|
68
|
+
* server-side `Revert Interactive Form` action.
|
|
69
|
+
*/
|
|
70
|
+
revertToComponent(activeOverrideID: string, targetComponentID: string, user?: UserInfo, provider?: IMetadataProvider): Promise<{
|
|
71
|
+
Success: boolean;
|
|
72
|
+
Error?: string;
|
|
73
|
+
}>;
|
|
74
|
+
/**
|
|
75
|
+
* Flip an override's Status to `Inactive`. Preserves the row so it can
|
|
76
|
+
* be re-activated later (vs. deleting outright, which would lose the
|
|
77
|
+
* Component link and require re-authoring).
|
|
78
|
+
*/
|
|
79
|
+
DeactivateOverride(id: string, user: UserInfo, provider?: IMetadataProvider): Promise<{
|
|
80
|
+
Success: boolean;
|
|
81
|
+
Error?: string;
|
|
82
|
+
}>;
|
|
83
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<EntityFormOverrideService, never>;
|
|
84
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<EntityFormOverrideService>;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=entity-form-override.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-form-override.service.d.ts","sourceRoot":"","sources":["../../../src/ComponentStudio/services/entity-form-override.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,iBAAiB,EAAE,QAAQ,EAAY,MAAM,sBAAsB,CAAC;AAEhG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,8CAA8C,CAAC;;AAE7F,mFAAmF;AACnF,MAAM,WAAW,qBAAqB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;CAC7C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBACa,yBAAyB;IAElC;;;;OAIG;IACU,sBAAsB,CAC/B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,QAAQ,EACd,QAAQ,CAAC,EAAE,iBAAiB,GAC7B,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAqCnC;;;;OAIG;IACU,cAAc,CACvB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,wBAAwB,EAChC,IAAI,EAAE,QAAQ,EACd,QAAQ,CAAC,EAAE,iBAAiB,GAC7B,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA4C7D;;;;;;;;;OASG;IACU,eAAe,CACxB,EAAE,EAAE,MAAM,EACV,IAAI,CAAC,EAAE,QAAQ,EACf,QAAQ,CAAC,EAAE,iBAAiB,GAC7B,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAoDhD;;;;OAIG;IACU,iBAAiB,CAC1B,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM,EACzB,IAAI,CAAC,EAAE,QAAQ,EACf,QAAQ,CAAC,EAAE,iBAAiB,GAC7B,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAkChD;;;;OAIG;IACU,kBAAkB,CAC3B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,QAAQ,EACd,QAAQ,CAAC,EAAE,iBAAiB,GAC7B,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;yCA7NvC,yBAAyB;6CAAzB,yBAAyB;CAwPrC"}
|