@memberjunction/ng-artifacts 5.30.1 → 5.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/lib/components/artifact-message-card.component.d.ts +2 -1
  2. package/dist/lib/components/artifact-message-card.component.d.ts.map +1 -1
  3. package/dist/lib/components/artifact-message-card.component.js +7 -5
  4. package/dist/lib/components/artifact-message-card.component.js.map +1 -1
  5. package/dist/lib/components/artifact-type-plugin-viewer.component.d.ts +2 -1
  6. package/dist/lib/components/artifact-type-plugin-viewer.component.d.ts.map +1 -1
  7. package/dist/lib/components/artifact-type-plugin-viewer.component.js +7 -6
  8. package/dist/lib/components/artifact-type-plugin-viewer.component.js.map +1 -1
  9. package/dist/lib/components/artifact-version-history.component.d.ts +2 -1
  10. package/dist/lib/components/artifact-version-history.component.d.ts.map +1 -1
  11. package/dist/lib/components/artifact-version-history.component.js +6 -5
  12. package/dist/lib/components/artifact-version-history.component.js.map +1 -1
  13. package/dist/lib/components/artifact-viewer-panel.component.d.ts +2 -1
  14. package/dist/lib/components/artifact-viewer-panel.component.d.ts.map +1 -1
  15. package/dist/lib/components/artifact-viewer-panel.component.js +18 -16
  16. package/dist/lib/components/artifact-viewer-panel.component.js.map +1 -1
  17. package/dist/lib/components/base-artifact-viewer.component.d.ts +2 -1
  18. package/dist/lib/components/base-artifact-viewer.component.d.ts.map +1 -1
  19. package/dist/lib/components/base-artifact-viewer.component.js +5 -4
  20. package/dist/lib/components/base-artifact-viewer.component.js.map +1 -1
  21. package/dist/lib/components/plugins/component-artifact-viewer.component.d.ts +5 -0
  22. package/dist/lib/components/plugins/component-artifact-viewer.component.d.ts.map +1 -1
  23. package/dist/lib/components/plugins/component-artifact-viewer.component.js +5 -0
  24. package/dist/lib/components/plugins/component-artifact-viewer.component.js.map +1 -1
  25. package/dist/lib/components/plugins/component-feedback-panel/component-feedback-panel.component.d.ts +2 -1
  26. package/dist/lib/components/plugins/component-feedback-panel/component-feedback-panel.component.d.ts.map +1 -1
  27. package/dist/lib/components/plugins/component-feedback-panel/component-feedback-panel.component.js +7 -7
  28. package/dist/lib/components/plugins/component-feedback-panel/component-feedback-panel.component.js.map +1 -1
  29. package/dist/lib/components/plugins/data-artifact-viewer.component.d.ts.map +1 -1
  30. package/dist/lib/components/plugins/data-artifact-viewer.component.js +6 -6
  31. package/dist/lib/components/plugins/data-artifact-viewer.component.js.map +1 -1
  32. package/dist/lib/components/plugins/json-artifact-viewer.component.d.ts.map +1 -1
  33. package/dist/lib/components/plugins/json-artifact-viewer.component.js +2 -2
  34. package/dist/lib/components/plugins/json-artifact-viewer.component.js.map +1 -1
  35. package/dist/lib/components/plugins/save-query-dialog.component.d.ts +2 -1
  36. package/dist/lib/components/plugins/save-query-dialog.component.d.ts.map +1 -1
  37. package/dist/lib/components/plugins/save-query-dialog.component.js +8 -6
  38. package/dist/lib/components/plugins/save-query-dialog.component.js.map +1 -1
  39. package/dist/lib/services/analyze-artifact.service.d.ts +7 -1
  40. package/dist/lib/services/analyze-artifact.service.d.ts.map +1 -1
  41. package/dist/lib/services/analyze-artifact.service.js +12 -2
  42. package/dist/lib/services/analyze-artifact.service.js.map +1 -1
  43. package/package.json +16 -16
@@ -1 +1 @@
1
- {"version":3,"file":"data-artifact-viewer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/plugins/data-artifact-viewer.component.ts","../../../../src/lib/components/plugins/data-artifact-viewer.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, ChangeDetectorRef, Output, EventEmitter } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { DataSnapshot, DataTable, DataComputation, MJColumnDescriptor, NormalizeToTables, Metadata, RunQuery, CompositeKey, KeyValuePair } from '@memberjunction/core';\nimport { QueryEngine, ArtifactMetadataEngine } from '@memberjunction/core-entities';\nimport { QueryGridColumnConfig, QueryEntityLinkClickEvent, resolveTargetEntity } from '@memberjunction/ng-query-viewer';\nimport { PageChangeEvent } from '@memberjunction/ng-pagination';\nimport { BaseArtifactViewerPluginComponent, ArtifactViewerTab, NavigationRequest } from '../base-artifact-viewer.component';\nimport { SaveQueryResult } from './save-query-dialog.component';\nimport { createDataSnapshot, buildMultiTableSql } from '../../snapshot-helpers';\n\n/**\n * Data artifact content shape as parsed from JSON.\n *\n * Core tabular data fields (source, columns, rows, tables, metadata, etc.)\n * are handled by NormalizeToTables() from @memberjunction/core.\n * This interface adds viewer-specific fields for query sync and display.\n *\n * Columns may use either `displayName` (new) or `headerName` (legacy).\n * BuildColumnConfigsForTable handles both.\n */\ninterface DataArtifactSpec {\n source?: 'query' | 'view';\n title?: string;\n queryId?: string;\n parameters?: Record<string, string | number | boolean>;\n entityName?: string;\n extraFilter?: string;\n columns?: Array<MJColumnDescriptor & { headerName?: string }>;\n rows?: Record<string, unknown>[];\n tables?: DataTable[];\n plan?: string;\n interpretation?: string;\n computations?: DataComputation[];\n metadata?: { sql?: string; rowCount?: number; executionTimeMs?: number };\n savedQueryId?: string;\n savedQueryName?: string;\n savedAtVersionNumber?: number;\n}\n\n/**\n * Describes the relationship between the current artifact version's SQL\n * and the saved query record. Drives the toolbar UI.\n */\ntype QuerySyncState =\n | 'no-query-latest' // No saved query, viewing latest version → show \"Save Query\"\n | 'no-query-older' // No saved query, viewing older version → no actions\n | 'synced' // SQL matches saved query → green badge + \"Open Query\"\n | 'outdated-latest' // SQL differs, viewing latest → amber badge + dropdown\n | 'query-ahead' // Viewing older version, query was updated at a newer version\n | 'query-behind'; // Viewing middle version, saved at older, not latest → muted\n\n/**\n * Viewer component for Data artifacts.\n *\n * Displays tabular data using AG Grid via mj-query-data-grid. Supports two modes:\n * 1. **Live data**: When metadata.sql is present, executes the query dynamically via RunQuery({ SQL })\n * to fetch fresh data on each view. Falls back to inline rows on error.\n * 2. **Inline data**: Rows embedded directly in the artifact JSON (backward compat with older artifacts)\n *\n * The Query Builder agent emits artifacts with metadata.sql for live execution.\n */\n@Component({\n standalone: false,\n selector: 'mj-data-artifact-viewer',\n templateUrl: './data-artifact-viewer.component.html',\n styleUrls: ['./data-artifact-viewer.component.css']\n})\n@RegisterClass(BaseArtifactViewerPluginComponent, 'DataArtifactViewerPlugin')\nexport class DataArtifactViewerComponent extends BaseArtifactViewerPluginComponent implements OnInit {\n @Output() openEntityRecord = new EventEmitter<{entityName: string; compositeKey: CompositeKey}>();\n @Output() override navigationRequest = new EventEmitter<NavigationRequest>();\n public override tabsChanged = new EventEmitter<void>();\n\n public spec: DataArtifactSpec | null = null;\n public GridData: Record<string, unknown>[] = [];\n public GridColumnConfigs: QueryGridColumnConfig[] | null = null;\n public IsLoading = false;\n public IsLive = false;\n public HasError = false;\n public ErrorMessage = '';\n public ShowSaveDialog = false;\n public ShowUpdateDropdown = false;\n public IsSaving = false;\n public SavingMessage = '';\n\n /** Paging state — passed through to mj-query-data-grid's embedded pager */\n public PagerTotalRowCount = 0;\n public PagerPageNumber = 1;\n public PagerPageSize = 100;\n\n // ─── Multi-Table State ───\n\n /** All resolved tables (from multi-table or wrapped single-table) */\n public ResolvedTables: DataTable[] = [];\n\n /** Index of the currently active table tab */\n public ActiveTableIndex = 0;\n\n /** Per-table paging state */\n private tablePageState: Map<number, { pageNumber: number; pageSize: number; totalRowCount: number }> = new Map();\n\n /** Per-table live data cache (loaded lazily on tab switch) */\n private tableDataCache: Map<number, Record<string, unknown>[]> = new Map();\n\n /** Per-table column configs cache */\n private tableColumnConfigsCache: Map<number, QueryGridColumnConfig[]> = new Map();\n\n /** Whether we're in multi-table mode */\n public get IsMultiTable(): boolean {\n return this.ResolvedTables.length > 1;\n }\n\n /** The currently active table */\n public get ActiveTable(): DataTable | null {\n return this.ResolvedTables[this.ActiveTableIndex] ?? null;\n }\n\n /** Query sync state — drives the toolbar UI for saved query actions */\n public QuerySyncState: QuerySyncState = 'no-query-latest';\n\n /** Latest version number for this artifact (from cache) */\n public LatestVersionNumber = 0;\n\n /** Metadata from live execution (overrides spec.metadata when live) */\n private liveRowCount: number | null = null;\n private liveExecutionTime: number | null = null;\n\n /** SQL from the saved query record (for comparison) */\n private savedQuerySql: string | null = null;\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public override get hasDisplayContent(): boolean {\n return this.spec != null && (this.HasData || this.IsLoading || this.ResolvedTables.length > 0);\n }\n\n public override get parentShouldShowRawContent(): boolean {\n return true;\n }\n\n public get HasData(): boolean {\n return this.GridData.length > 0;\n }\n\n public get HasInlineData(): boolean {\n // Check root-level rows (legacy single-table) or any resolved table with rows\n return !!(this.spec?.rows && this.spec.rows.length > 0) ||\n this.ResolvedTables.some(t => t.rows && t.rows.length > 0);\n }\n\n public get DisplayRowCount(): number | null {\n return this.liveRowCount ?? this.spec?.metadata?.rowCount ?? null;\n }\n\n public get DisplayExecutionTime(): number | null {\n return this.liveExecutionTime ?? this.spec?.metadata?.executionTimeMs ?? null;\n }\n\n /** Current artifact version number */\n public get CurrentVersionNumber(): number {\n return this.artifactVersion?.VersionNumber || 1;\n }\n\n /** Whether this is the latest version of the artifact */\n public get IsLatestVersion(): boolean {\n return this.CurrentVersionNumber === this.LatestVersionNumber;\n }\n\n /**\n * The effective version number at which the query was last saved/updated.\n * When viewing an older version, this looks ahead through newer versions\n * to find the most recent savedAtVersionNumber for the same query,\n * giving the user accurate context (e.g., \"Query updated at v3\" instead\n * of the stale \"Saved at v1\" from this version's snapshot).\n */\n public EffectiveSavedAtVersion: number | null = null;\n\n /** Alias used by the template */\n public get SavedAtVersion(): number | null {\n return this.EffectiveSavedAtVersion;\n }\n\n /** Display name for the saved query */\n public get SavedQueryDisplayName(): string {\n return this.spec?.savedQueryName || 'Saved Query';\n }\n\n async ngOnInit(): Promise<void> {\n try {\n this.spec = this.parseJsonContent<DataArtifactSpec>();\n if (!this.spec) {\n this.HasError = true;\n this.ErrorMessage = 'Failed to parse data artifact content';\n return;\n }\n\n // Resolve to tables array (handles both single and multi-table)\n this.ResolvedTables = NormalizeToTables(\n this.spec as unknown as Record<string, unknown>,\n this.spec.title || 'Results'\n );\n\n if (this.ResolvedTables.length === 0 && !this.spec.plan) {\n return;\n }\n\n // Build enriched column configs for the first table\n if (this.ResolvedTables.length > 0) {\n this.GridColumnConfigs = this.BuildColumnConfigsForTable(this.ResolvedTables[0]);\n }\n\n // Initialize paging state for all tables\n for (let i = 0; i < this.ResolvedTables.length; i++) {\n this.tablePageState.set(i, { pageNumber: 1, pageSize: 100, totalRowCount: 0 });\n }\n\n // Set loading early (synchronously) so hasDisplayContent is true immediately\n if (this.ResolvedTables.some(t => t.metadata?.sql) || this.HasInlineData) {\n this.IsLoading = true;\n }\n\n // Load cached metadata and resolve query sync state\n await this.InitQuerySyncState();\n\n // Load data for the first (active) table\n if (this.ResolvedTables.length > 0) {\n await this.LoadTableData(0);\n }\n\n // Signal parent that tabs/display content may have changed after async load\n this.tabsChanged.emit();\n } catch (error) {\n this.HasError = true;\n this.ErrorMessage = error instanceof Error ? error.message : 'Failed to load data';\n }\n }\n\n /**\n * Re-execute the live SQL query for the active table\n */\n public async OnRefresh(): Promise<void> {\n this.tableDataCache.delete(this.ActiveTableIndex);\n await this.LoadTableData(this.ActiveTableIndex);\n }\n\n /**\n * Handle entity link click from the grid and bubble up as openEntityRecord.\n * Converts the grid's recordId string into a CompositeKey for the artifact viewer pipeline.\n */\n public OnEntityLinkClick(event: QueryEntityLinkClickEvent): void {\n const md = new Metadata();\n const entity = md.Entities.find(e => e.Name === event.entityName);\n const pkFieldName = entity?.FirstPrimaryKey?.Name ?? 'ID';\n\n const compositeKey = new CompositeKey([\n new KeyValuePair(pkFieldName, event.recordId)\n ]);\n this.openEntityRecord.emit({\n entityName: event.entityName,\n compositeKey\n });\n }\n\n /**\n * Handle page change from the data grid's embedded pager.\n * Re-executes the query for the active table with new page parameters.\n */\n public async OnPageChange(event: PageChangeEvent): Promise<void> {\n const pageState = this.tablePageState.get(this.ActiveTableIndex);\n if (!pageState) return;\n\n pageState.pageNumber = event.PageNumber;\n pageState.pageSize = event.PageSize;\n\n // Clear cache so it reloads\n this.tableDataCache.delete(this.ActiveTableIndex);\n await this.LoadTableData(this.ActiveTableIndex);\n }\n\n /**\n * Switch to a different table tab.\n * Loads data lazily if not already cached.\n */\n public async OnTableTabClick(index: number): Promise<void> {\n if (index === this.ActiveTableIndex) return;\n this.ActiveTableIndex = index;\n\n const table = this.ResolvedTables[index];\n if (!table) return;\n\n // Use cached column configs or build new\n if (!this.tableColumnConfigsCache.has(index)) {\n const configs = this.BuildColumnConfigsForTable(table);\n if (configs) this.tableColumnConfigsCache.set(index, configs);\n }\n this.GridColumnConfigs = this.tableColumnConfigsCache.get(index) ?? null;\n\n // Use cached data or load fresh\n if (this.tableDataCache.has(index)) {\n this.GridData = this.tableDataCache.get(index)!;\n const pageState = this.tablePageState.get(index)!;\n this.PagerPageNumber = pageState.pageNumber;\n this.PagerPageSize = pageState.pageSize;\n this.PagerTotalRowCount = pageState.totalRowCount;\n } else {\n await this.LoadTableData(index);\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Load data for a specific table.\n * Handles live SQL execution, inline rows, and caching.\n */\n private async LoadTableData(tableIndex: number): Promise<void> {\n const table = this.ResolvedTables[tableIndex];\n if (!table) return;\n\n this.IsLoading = true;\n this.HasError = false;\n this.cdr.detectChanges();\n\n try {\n if (table.metadata?.sql) {\n // Live SQL execution\n const pageState = this.tablePageState.get(tableIndex)!;\n const rq = new RunQuery();\n const startRow = (pageState.pageNumber - 1) * pageState.pageSize;\n const result = await rq.RunQuery({\n SQL: table.metadata.sql,\n StartRow: startRow,\n MaxRows: pageState.pageSize\n });\n\n if (result.Success) {\n this.tableDataCache.set(tableIndex, result.Results);\n this.GridData = result.Results;\n this.IsLive = true;\n\n pageState.totalRowCount = result.TotalRowCount ?? result.RowCount ?? 0;\n this.PagerTotalRowCount = pageState.totalRowCount;\n this.PagerPageNumber = pageState.pageNumber;\n this.PagerPageSize = pageState.pageSize;\n\n this.liveRowCount = result.RowCount;\n this.liveExecutionTime = result.ExecutionTime;\n } else {\n this.HandleTableError(tableIndex, result.ErrorMessage || 'Query failed');\n }\n } else if (table.rows && table.rows.length > 0) {\n // Inline data\n this.tableDataCache.set(tableIndex, table.rows);\n this.GridData = table.rows;\n this.liveRowCount = table.rows.length;\n } else {\n this.GridData = [];\n }\n } catch (error) {\n this.HandleTableError(tableIndex, error instanceof Error ? error.message : 'Load failed');\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Build QueryGridColumnConfig[] from a DataTable's column metadata.\n * Returns null if columns have no entity metadata (grid falls back to auto-inference).\n */\n private BuildColumnConfigsForTable(table: DataTable): QueryGridColumnConfig[] | null {\n const columns = table.columns;\n if (!columns?.length) return null;\n\n // Only build if at least one column has entity metadata or type info\n const hasMetadata = columns.some(c => c.sourceEntity || c.sqlBaseType);\n if (!hasMetadata) return null;\n\n const md = new Metadata();\n return columns.map((col, index) => {\n const target = resolveTargetEntity(col.sourceEntity, col.sourceFieldName, md);\n const isEntityLink = !!(target.targetEntityName && (target.isPrimaryKey || target.isForeignKey));\n const baseType = (col.sqlBaseType || 'nvarchar').toLowerCase();\n\n let align: 'left' | 'center' | 'right' = 'left';\n if (['int', 'bigint', 'decimal', 'numeric', 'float', 'money', 'smallmoney', 'real'].includes(baseType)) {\n align = 'right';\n } else if (baseType === 'bit') {\n align = 'center';\n }\n\n // Support both displayName (new) and headerName (legacy) for backward compat\n const colAny = col as unknown as Record<string, unknown>;\n const title = col.displayName || (colAny['headerName'] as string) || col.field;\n\n return {\n field: col.field,\n title,\n visible: true,\n sortable: true,\n resizable: true,\n reorderable: true,\n sqlBaseType: col.sqlBaseType || 'nvarchar',\n sqlFullType: col.sqlFullType || col.sqlBaseType || 'nvarchar',\n align,\n order: index,\n sourceEntityName: col.sourceEntity,\n sourceFieldName: col.sourceFieldName,\n isEntityLink,\n targetEntityName: target.targetEntityName,\n targetEntityId: target.targetEntityId,\n targetEntityIcon: target.targetEntityIcon,\n isPrimaryKey: target.isPrimaryKey,\n isForeignKey: target.isForeignKey,\n pinned: null,\n } as QueryGridColumnConfig;\n });\n }\n\n /**\n * Handle a table load error by setting error state and falling back to inline data\n */\n private HandleTableError(tableIndex: number, message: string): void {\n this.HasError = true;\n this.ErrorMessage = message;\n const table = this.ResolvedTables[tableIndex];\n if (table?.rows && table.rows.length > 0) {\n this.GridData = table.rows;\n }\n }\n\n // ─── Query Sync State ────────────────────────────────────────────\n\n /**\n * Initialize query sync state by loading cached metadata.\n * Resolves the latest version number and compares saved query SQL.\n */\n private async InitQuerySyncState(): Promise<void> {\n // Ensure artifact cache is loaded (not registered for startup)\n await ArtifactMetadataEngine.Instance.Config(false);\n\n this.LatestVersionNumber = this.resolveLatestVersionNumber();\n\n // If cache is stale (doesn't know about the version we're viewing),\n // force-refresh and re-resolve. This happens when new versions are\n // created during a conversation after the cache was first loaded.\n if (this.LatestVersionNumber < this.CurrentVersionNumber) {\n await ArtifactMetadataEngine.Instance.Config(true);\n this.LatestVersionNumber = this.resolveLatestVersionNumber();\n }\n\n this.EffectiveSavedAtVersion = this.resolveEffectiveSavedAtVersion();\n await this.resolveSavedQuerySql();\n this.QuerySyncState = this.computeQuerySyncState();\n }\n\n /**\n * Determine the latest version number for this artifact from cache.\n * Falls back to current version if cache miss.\n */\n private resolveLatestVersionNumber(): number {\n if (!this.artifactVersion?.ArtifactID) {\n return this.CurrentVersionNumber;\n }\n\n const versions = ArtifactMetadataEngine.Instance.GetVersionsForArtifact(this.artifactVersion.ArtifactID);\n if (versions.length > 0) {\n // GetVersionsForArtifact returns DESC sorted\n return versions[0].VersionNumber || 1;\n }\n\n // Cache miss — current version is our best guess\n return this.CurrentVersionNumber;\n }\n\n /**\n * Scan all versions of this artifact to find the most recent savedAtVersionNumber\n * for the same savedQueryId. When viewing an older version, this tells the user\n * where the query was *actually* last updated, not just what this version's\n * snapshot recorded at the time.\n */\n private resolveEffectiveSavedAtVersion(): number | null {\n const queryId = this.spec?.savedQueryId;\n if (!queryId) return null;\n\n // Start with this version's own value\n let effective = this.spec?.savedAtVersionNumber ?? null;\n\n if (!this.artifactVersion?.ArtifactID) return effective;\n\n // GetVersionsForArtifact returns DESC sorted — scan all versions\n const versions = ArtifactMetadataEngine.Instance.GetVersionsForArtifact(this.artifactVersion.ArtifactID);\n for (const v of versions) {\n try {\n if (!v.Content) continue;\n const content = typeof v.Content === 'string' ? JSON.parse(v.Content) : v.Content;\n if (content.savedQueryId === queryId && content.savedAtVersionNumber != null) {\n const vSavedAt = content.savedAtVersionNumber as number;\n if (effective == null || vSavedAt > effective) {\n effective = vSavedAt;\n }\n }\n } catch {\n // Skip versions with unparseable content\n }\n }\n\n return effective;\n }\n\n /**\n * Look up the saved query's SQL from QueryEngine cache for comparison.\n * Only fetches if savedQueryId is present.\n */\n private async resolveSavedQuerySql(): Promise<void> {\n if (!this.spec?.savedQueryId) {\n this.savedQuerySql = null;\n return;\n }\n\n // QueryEngine is registered for startup, should already be loaded\n let query = QueryEngine.Instance.FindQueryByID(this.spec.savedQueryId);\n\n if (!query) {\n // Cache miss — force refresh and retry\n await QueryEngine.Instance.Config(true);\n query = QueryEngine.Instance.FindQueryByID(this.spec.savedQueryId);\n }\n\n this.savedQuerySql = query?.SQL ?? null;\n }\n\n /**\n * Compute the query sync state from current spec, version, and saved query SQL.\n * Implements the decision tree from the UX design.\n */\n private computeQuerySyncState(): QuerySyncState {\n const hasSavedQuery = !!this.spec?.savedQueryId;\n const isLatest = this.IsLatestVersion;\n\n if (!hasSavedQuery) {\n return isLatest ? 'no-query-latest' : 'no-query-older';\n }\n\n // Compare SQL (normalize whitespace for reliable comparison)\n const specSql = this.normalizeSql(this.spec?.metadata?.sql);\n const querySql = this.normalizeSql(this.savedQuerySql);\n const sqlMatches = specSql != null && querySql != null && specSql === querySql;\n\n // Only truly synced if SQL matches AND this is the version it was saved at.\n // Even with identical SQL, a newer version should show the dropdown so the\n // user can update the version association (re-save at current version).\n const savedAtCurrent = this.EffectiveSavedAtVersion === this.CurrentVersionNumber;\n if (sqlMatches && savedAtCurrent) {\n return 'synced';\n }\n\n // SQL differs — determine position relative to saved version\n if (isLatest) {\n return 'outdated-latest';\n }\n\n // Use effective saved-at (looks ahead through newer versions)\n const savedAt = this.EffectiveSavedAtVersion;\n if (savedAt != null && this.CurrentVersionNumber < savedAt) {\n return 'query-ahead'; // query was updated at a newer version\n }\n\n return 'query-behind'; // ahead of saved but not latest\n }\n\n /** Normalize SQL for comparison: trim and collapse whitespace */\n private normalizeSql(sql: string | null | undefined): string | null {\n if (sql == null) return null;\n return sql.trim().replace(/\\s+/g, ' ');\n }\n\n // ─── Actions ────────────────────────────────────────────────────\n\n /** Navigate to the saved query in the Data Explorer's Queries browser */\n public OnOpenSavedQuery(): void {\n if (!this.spec?.savedQueryId) return;\n this.navigationRequest.emit({\n appName: 'Data Explorer',\n navItemName: 'Queries',\n queryParams: { queryId: this.spec.savedQueryId }\n });\n }\n\n /** Show the save panel for creating a brand-new query */\n public OnShowSaveDialog(): void {\n this.ShowSaveDialog = true;\n this.ShowUpdateDropdown = false;\n }\n\n /** Toggle the update query dropdown */\n public OnToggleUpdateDropdown(): void {\n this.ShowUpdateDropdown = !this.ShowUpdateDropdown;\n }\n\n /** Close the dropdown (e.g., on outside click) */\n public OnCloseDropdown(): void {\n this.ShowUpdateDropdown = false;\n }\n\n /**\n * Update the existing saved query's SQL to match this version.\n * Only available from the latest version (Scenario 3).\n */\n public async OnUpdateExistingQuery(): Promise<void> {\n this.ShowUpdateDropdown = false;\n if (!this.spec?.savedQueryId || !this.spec.metadata?.sql) return;\n\n this.IsSaving = true;\n this.SavingMessage = `Updating \"${this.SavedQueryDisplayName}\"...`;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const query = await md.GetEntityObject<import('@memberjunction/core-entities').MJQueryEntity>('MJ: Queries');\n const loaded = await query.Load(this.spec.savedQueryId);\n\n if (!loaded) {\n console.error('Failed to load saved query for update');\n return;\n }\n\n query.SQL = this.spec.metadata.sql;\n if (this.spec.plan?.trim()) {\n query.TechnicalDescription = this.spec.plan.trim();\n }\n const saved = await query.Save();\n\n if (saved) {\n // Update spec with new version tracking\n this.spec.savedAtVersionNumber = this.CurrentVersionNumber;\n await this.PersistArtifactContent();\n\n // Refresh caches so future lookups see the updated data\n await QueryEngine.Instance.Config(true);\n await ArtifactMetadataEngine.Instance.Config(true);\n await md.Refresh();\n\n this.savedQuerySql = this.spec.metadata.sql;\n this.EffectiveSavedAtVersion = this.CurrentVersionNumber;\n this.QuerySyncState = 'synced';\n }\n } catch (error) {\n console.error('Failed to update saved query:', error);\n } finally {\n this.IsSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Save as a new query (from the dropdown).\n * Opens the save dialog which creates a fresh query record.\n */\n public OnSaveAsNewQuery(): void {\n this.ShowUpdateDropdown = false;\n this.ShowSaveDialog = true;\n }\n\n /** Handle successful save from the dialog (both initial save and \"save as new\") */\n public async OnQuerySaved(event: SaveQueryResult): Promise<void> {\n this.ShowSaveDialog = false;\n this.IsSaving = true;\n this.SavingMessage = 'Saving query...';\n this.cdr.detectChanges();\n\n try {\n // Update spec with saved query info and version tracking\n this.spec!.savedQueryId = event.queryId;\n this.spec!.savedQueryName = event.queryName;\n this.spec!.savedAtVersionNumber = this.CurrentVersionNumber;\n\n // Persist and refresh caches\n await this.PersistArtifactContent();\n await QueryEngine.Instance.Config(true);\n await ArtifactMetadataEngine.Instance.Config(true);\n await new Metadata().Refresh();\n\n this.savedQuerySql = this.spec!.metadata?.sql ?? null;\n this.EffectiveSavedAtVersion = this.CurrentVersionNumber;\n this.QuerySyncState = 'synced';\n } catch (error) {\n console.error('Failed to save query:', error);\n } finally {\n this.IsSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Persist updated spec back to the artifact version entity */\n private async PersistArtifactContent(): Promise<void> {\n if (!this.artifactVersion || !this.spec) return;\n this.artifactVersion.Content = JSON.stringify(this.spec);\n await this.artifactVersion.Save();\n }\n\n /**\n * Returns a DataSnapshot with live grid data, current page state,\n * and query sync state.\n */\n public override GetCurrentStateSnapshot(): DataSnapshot | null {\n if (!this.spec) return null;\n\n const tables = NormalizeToTables(\n this.spec as unknown as Record<string, unknown>,\n this.spec.title || 'Results'\n );\n const activeTable = tables[this.ActiveTableIndex];\n\n if (activeTable) {\n // Override with live data for the active table\n if (this.IsLive) activeTable.rows = this.GridData;\n activeTable.pageNumber = this.PagerPageNumber;\n activeTable.metadata = {\n ...activeTable.metadata,\n ...(this.liveRowCount != null ? { rowCount: this.liveRowCount } : {}),\n ...(this.liveExecutionTime != null\n ? { executionTimeMs: this.liveExecutionTime } : {}),\n ...(this.PagerTotalRowCount > 0\n ? { totalAvailableRows: this.PagerTotalRowCount } : {}),\n pageSize: this.PagerPageSize\n };\n }\n\n return DataSnapshot.FromTables(tables, this.spec.title);\n }\n\n // ─── Tabs ───────────────────────────────────────────────────────\n\n /**\n * Provide Plan tab (markdown), SQL tab (code), and Interpretation tab when available\n */\n public GetAdditionalTabs(): ArtifactViewerTab[] {\n const tabs: ArtifactViewerTab[] = [];\n\n if (this.spec?.plan) {\n tabs.push({\n label: 'Plan',\n icon: 'fa-diagram-project',\n contentType: 'markdown',\n content: this.spec.plan\n });\n }\n\n // SQL tab — multi-table shows all queries with headers\n if (this.IsMultiTable) {\n const multiSql = buildMultiTableSql(this.ResolvedTables);\n if (multiSql) {\n tabs.push({\n label: 'SQL',\n icon: 'fa-database',\n contentType: 'code',\n language: 'sql',\n content: multiSql\n });\n }\n } else if (this.spec?.metadata?.sql) {\n tabs.push({\n label: 'SQL',\n icon: 'fa-database',\n contentType: 'code',\n language: 'sql',\n content: this.spec.metadata.sql\n });\n }\n\n // Interpretation tab\n if (this.spec?.interpretation) {\n tabs.push({\n label: 'Interpretation',\n icon: 'fa-lightbulb',\n contentType: 'markdown',\n content: this.spec.interpretation\n });\n }\n\n return tabs;\n }\n}\n","<div class=\"data-artifact-viewer\" [ngClass]=\"cssClass\">\n @if (spec) {\n @if (HasData || IsLoading || ResolvedTables.length > 0) {\n <!-- Toolbar -->\n <div class=\"data-toolbar\">\n <div class=\"data-title\">\n <i class=\"fas fa-table\"></i>\n <span>{{ spec.title || \"Data Results\" }}</span>\n @if (IsLive) {\n <span class=\"live-badge\">Live</span>\n }\n @if (DisplayRowCount != null) {\n <span class=\"row-count\">{{ DisplayRowCount }} rows</span>\n }\n @if (DisplayExecutionTime != null) {\n <span class=\"exec-time\">{{ DisplayExecutionTime }}ms</span>\n }\n </div>\n <div class=\"data-actions\">\n @if (IsLive) {\n <button class=\"btn-icon\" title=\"Refresh data\" (click)=\"OnRefresh()\" [disabled]=\"IsLoading\">\n <i class=\"fas fa-sync-alt\" [class.fa-spin]=\"IsLoading\"></i> Refresh\n </button>\n }\n\n @switch (QuerySyncState) {\n <!-- S1: No saved query, latest version → Save Query -->\n @case (\"no-query-latest\") {\n <button class=\"btn-icon btn-save\" title=\"Save as reusable query\" (click)=\"OnShowSaveDialog()\"><i class=\"fas fa-save\"></i> Save Query</button>\n }\n\n <!-- S2: SQL matches → green badge + Open -->\n @case (\"synced\") {\n <span class=\"query-badge query-badge-synced\"> <i class=\"fas fa-check\"></i> Saved at v{{ SavedAtVersion }} </span>\n <button class=\"btn-icon btn-open\" title=\"Open saved query record\" (click)=\"OnOpenSavedQuery()\">\n <i class=\"fas fa-external-link-alt\"></i> Open Query\n </button>\n }\n\n <!-- S3: SQL differs, latest version → amber badge + dropdown -->\n @case (\"outdated-latest\") {\n <span class=\"query-badge query-badge-outdated\"> <i class=\"fas fa-circle-exclamation\"></i> Saved at v{{ SavedAtVersion }} </span>\n <div class=\"dropdown-wrapper\">\n <button class=\"btn-icon btn-warning\" title=\"Update or save query\" (click)=\"OnToggleUpdateDropdown()\">\n <i class=\"fas fa-save\"></i> Update Query <i class=\"fas fa-caret-down\"></i>\n </button>\n @if (ShowUpdateDropdown) {\n <div class=\"query-dropdown\" (click)=\"$event.stopPropagation()\">\n <div class=\"query-dropdown-item\" (click)=\"OnUpdateExistingQuery()\">\n <i class=\"fas fa-arrow-up-from-bracket\" style=\"color: #d97706\"></i>\n <div>\n <div class=\"dropdown-label\">Update \"{{ SavedQueryDisplayName }}\"</div>\n <div class=\"dropdown-desc\">Replace saved query SQL with this version's SQL</div>\n </div>\n </div>\n <div class=\"query-dropdown-item\" (click)=\"OnSaveAsNewQuery()\">\n <i class=\"fas fa-plus\" style=\"color: #16a34a\"></i>\n <div>\n <div class=\"dropdown-label\">Save as New Query</div>\n <div class=\"dropdown-desc\">Create a new query, keep the original unchanged</div>\n </div>\n </div>\n <div class=\"query-dropdown-item\" (click)=\"OnOpenSavedQuery(); OnCloseDropdown()\">\n <i class=\"fas fa-external-link-alt\" style=\"color: var(--mj-text-muted)\"></i>\n <div>\n <div class=\"dropdown-label\">Open Saved Query</div>\n <div class=\"dropdown-desc\">View \"{{ SavedQueryDisplayName }}\" (saved at v{{ SavedAtVersion }})</div>\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- S4: Older version, query was updated ahead -->\n @case (\"query-ahead\") {\n <span class=\"query-badge query-badge-muted\"> <i class=\"fas fa-clock-rotate-left\"></i> Query updated at v{{ SavedAtVersion }} </span>\n <button class=\"btn-icon btn-muted\" title=\"Open saved query record\" (click)=\"OnOpenSavedQuery()\">\n <i class=\"fas fa-external-link-alt\"></i> Open Query\n </button>\n }\n\n <!-- S5: Middle version, saved at older, not latest -->\n @case (\"query-behind\") {\n <span class=\"query-badge query-badge-muted\"> <i class=\"fas fa-clock-rotate-left\"></i> Saved at v{{ SavedAtVersion }} </span>\n <button class=\"btn-icon btn-muted\" title=\"Open saved query record\" (click)=\"OnOpenSavedQuery()\">\n <i class=\"fas fa-external-link-alt\"></i> Open Query\n </button>\n }\n\n <!-- S6: No saved query, older version → no actions -->\n @case (\"no-query-older\") {\n <!-- No query actions available on older versions -->\n }\n }\n </div>\n </div>\n\n <!-- Multi-table tab strip -->\n @if (IsMultiTable) {\n <div class=\"table-tabs\">\n @for (table of ResolvedTables; track table.name; let i = $index) {\n <button class=\"table-tab\" [class.active]=\"i === ActiveTableIndex\" [title]=\"table.description || table.name\" (click)=\"OnTableTabClick(i)\">\n <span class=\"table-tab-name\">{{ table.name }}</span>\n @if (table.metadata?.rowCount != null || table.rows.length) {\n <span class=\"table-tab-count\"> ({{ table.metadata?.rowCount ?? table.rows.length }} rows) </span>\n }\n </button>\n }\n </div>\n }\n\n <!-- Computations summary bar -->\n @if (spec.computations?.length) {\n <div class=\"computations-bar\">\n @for (comp of spec.computations; track comp.name) {\n @if (!IsMultiTable || !comp.table || comp.table === ActiveTable?.name) {\n <div class=\"computation-chip\" [title]=\"comp.description || comp.name\">\n <span class=\"computation-label\">{{ comp.name }}</span>\n <span class=\"computation-value\">\n {{ comp.formattedValue || comp.value }}\n </span>\n </div>\n }\n }\n </div>\n }\n\n <!-- Grid -->\n <div class=\"grid-container\">\n <!-- Saving overlay -->\n @if (IsSaving) {\n <div class=\"saving-overlay\">\n <mj-loading [text]=\"SavingMessage\"></mj-loading>\n </div>\n }\n @if (IsLoading) {\n <mj-loading text=\"Loading data...\"></mj-loading>\n } @else if (HasError && HasData) {\n <div class=\"error-banner\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n <span>{{ ErrorMessage }}</span>\n <span class=\"fallback-note\">(Showing cached data)</span>\n </div>\n <mj-query-data-grid\n [ColumnConfigs]=\"GridColumnConfigs\"\n [Data]=\"GridData\"\n [TotalRowCount]=\"PagerTotalRowCount\"\n [PageNumber]=\"PagerPageNumber\"\n [PageSize]=\"PagerPageSize\"\n [ShowToolbar]=\"false\"\n [ShowRefresh]=\"false\"\n [PersistState]=\"false\"\n [SelectionMode]=\"'none'\"\n (EntityLinkClick)=\"OnEntityLinkClick($event)\"\n (PageChange)=\"OnPageChange($event)\"\n Height=\"100%\"\n >\n </mj-query-data-grid>\n } @else if (HasError) {\n <div class=\"error-state\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n <p>{{ ErrorMessage }}</p>\n </div>\n } @else {\n <mj-query-data-grid\n [ColumnConfigs]=\"GridColumnConfigs\"\n [Data]=\"GridData\"\n [TotalRowCount]=\"PagerTotalRowCount\"\n [PageNumber]=\"PagerPageNumber\"\n [PageSize]=\"PagerPageSize\"\n [ShowToolbar]=\"false\"\n [ShowRefresh]=\"false\"\n [PersistState]=\"false\"\n [SelectionMode]=\"'none'\"\n (EntityLinkClick)=\"OnEntityLinkClick($event)\"\n (PageChange)=\"OnPageChange($event)\"\n Height=\"100%\"\n >\n </mj-query-data-grid>\n }\n </div>\n } @else if (spec.plan) {\n <!-- Plan-only view (no results yet) -->\n <div class=\"data-toolbar\">\n <div class=\"data-title\">\n <i class=\"fas fa-diagram-project\"></i>\n <span>{{ spec.title || \"Query Plan\" }}</span>\n </div>\n </div>\n <div class=\"plan-content\">\n <mj-markdown [data]=\"spec.plan\" [enableMermaid]=\"true\" [enableHighlight]=\"true\" [enableCollapsibleHeadings]=\"false\" [enableSmartypants]=\"true\">\n </mj-markdown>\n </div>\n } @else {\n <!-- No data and no plan -->\n <div class=\"empty-state\">\n <i class=\"fas fa-inbox\"></i>\n <p>No data to display</p>\n </div>\n }\n } @else if (HasError) {\n <div class=\"error-state\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n <p>{{ ErrorMessage }}</p>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fas fa-inbox\"></i>\n <p>No data to display</p>\n </div>\n }\n\n <!-- Save Query Panel (slide-in) -->\n @if (ShowSaveDialog) {\n <mj-save-query-panel\n [QueryName]=\"spec?.title || 'Untitled Query'\"\n [QueryDescription]=\"''\"\n [SQL]=\"spec?.metadata?.sql || ''\"\n [Plan]=\"spec?.plan || ''\"\n (Saved)=\"OnQuerySaved($event)\"\n (Cancelled)=\"ShowSaveDialog = false\"\n >\n </mj-save-query-panel>\n }\n</div>\n"]}
1
+ {"version":3,"file":"data-artifact-viewer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/plugins/data-artifact-viewer.component.ts","../../../../src/lib/components/plugins/data-artifact-viewer.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, ChangeDetectorRef, Output, EventEmitter } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { RegisterClass } from '@memberjunction/global';\nimport { DataSnapshot, DataTable, DataComputation, MJColumnDescriptor, NormalizeToTables, Metadata, RunQuery, CompositeKey, KeyValuePair } from '@memberjunction/core';\nimport { QueryEngine, ArtifactMetadataEngine } from '@memberjunction/core-entities';\nimport { QueryGridColumnConfig, QueryEntityLinkClickEvent, resolveTargetEntity } from '@memberjunction/ng-query-viewer';\nimport { PageChangeEvent } from '@memberjunction/ng-pagination';\nimport { BaseArtifactViewerPluginComponent, ArtifactViewerTab, NavigationRequest } from '../base-artifact-viewer.component';\nimport { SaveQueryResult } from './save-query-dialog.component';\nimport { createDataSnapshot, buildMultiTableSql } from '../../snapshot-helpers';\n\n/**\n * Data artifact content shape as parsed from JSON.\n *\n * Core tabular data fields (source, columns, rows, tables, metadata, etc.)\n * are handled by NormalizeToTables() from @memberjunction/core.\n * This interface adds viewer-specific fields for query sync and display.\n *\n * Columns may use either `displayName` (new) or `headerName` (legacy).\n * BuildColumnConfigsForTable handles both.\n */\ninterface DataArtifactSpec {\n source?: 'query' | 'view';\n title?: string;\n queryId?: string;\n parameters?: Record<string, string | number | boolean>;\n entityName?: string;\n extraFilter?: string;\n columns?: Array<MJColumnDescriptor & { headerName?: string }>;\n rows?: Record<string, unknown>[];\n tables?: DataTable[];\n plan?: string;\n interpretation?: string;\n computations?: DataComputation[];\n metadata?: { sql?: string; rowCount?: number; executionTimeMs?: number };\n savedQueryId?: string;\n savedQueryName?: string;\n savedAtVersionNumber?: number;\n}\n\n/**\n * Describes the relationship between the current artifact version's SQL\n * and the saved query record. Drives the toolbar UI.\n */\ntype QuerySyncState =\n | 'no-query-latest' // No saved query, viewing latest version → show \"Save Query\"\n | 'no-query-older' // No saved query, viewing older version → no actions\n | 'synced' // SQL matches saved query → green badge + \"Open Query\"\n | 'outdated-latest' // SQL differs, viewing latest → amber badge + dropdown\n | 'query-ahead' // Viewing older version, query was updated at a newer version\n | 'query-behind'; // Viewing middle version, saved at older, not latest → muted\n\n/**\n * Viewer component for Data artifacts.\n *\n * Displays tabular data using AG Grid via mj-query-data-grid. Supports two modes:\n * 1. **Live data**: When metadata.sql is present, executes the query dynamically via RunQuery({ SQL })\n * to fetch fresh data on each view. Falls back to inline rows on error.\n * 2. **Inline data**: Rows embedded directly in the artifact JSON (backward compat with older artifacts)\n *\n * The Query Builder agent emits artifacts with metadata.sql for live execution.\n */\n@Component({\n standalone: false,\n selector: 'mj-data-artifact-viewer',\n templateUrl: './data-artifact-viewer.component.html',\n styleUrls: ['./data-artifact-viewer.component.css']\n})\n@RegisterClass(BaseArtifactViewerPluginComponent, 'DataArtifactViewerPlugin')\nexport class DataArtifactViewerComponent extends BaseArtifactViewerPluginComponent implements OnInit {\n @Output() openEntityRecord = new EventEmitter<{entityName: string; compositeKey: CompositeKey}>();\n @Output() override navigationRequest = new EventEmitter<NavigationRequest>();\n public override tabsChanged = new EventEmitter<void>();\n\n public spec: DataArtifactSpec | null = null;\n public GridData: Record<string, unknown>[] = [];\n public GridColumnConfigs: QueryGridColumnConfig[] | null = null;\n public IsLoading = false;\n public IsLive = false;\n public HasError = false;\n public ErrorMessage = '';\n public ShowSaveDialog = false;\n public ShowUpdateDropdown = false;\n public IsSaving = false;\n public SavingMessage = '';\n\n /** Paging state — passed through to mj-query-data-grid's embedded pager */\n public PagerTotalRowCount = 0;\n public PagerPageNumber = 1;\n public PagerPageSize = 100;\n\n // ─── Multi-Table State ───\n\n /** All resolved tables (from multi-table or wrapped single-table) */\n public ResolvedTables: DataTable[] = [];\n\n /** Index of the currently active table tab */\n public ActiveTableIndex = 0;\n\n /** Per-table paging state */\n private tablePageState: Map<number, { pageNumber: number; pageSize: number; totalRowCount: number }> = new Map();\n\n /** Per-table live data cache (loaded lazily on tab switch) */\n private tableDataCache: Map<number, Record<string, unknown>[]> = new Map();\n\n /** Per-table column configs cache */\n private tableColumnConfigsCache: Map<number, QueryGridColumnConfig[]> = new Map();\n\n /** Whether we're in multi-table mode */\n public get IsMultiTable(): boolean {\n return this.ResolvedTables.length > 1;\n }\n\n /** The currently active table */\n public get ActiveTable(): DataTable | null {\n return this.ResolvedTables[this.ActiveTableIndex] ?? null;\n }\n\n /** Query sync state — drives the toolbar UI for saved query actions */\n public QuerySyncState: QuerySyncState = 'no-query-latest';\n\n /** Latest version number for this artifact (from cache) */\n public LatestVersionNumber = 0;\n\n /** Metadata from live execution (overrides spec.metadata when live) */\n private liveRowCount: number | null = null;\n private liveExecutionTime: number | null = null;\n\n /** SQL from the saved query record (for comparison) */\n private savedQuerySql: string | null = null;\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public override get hasDisplayContent(): boolean {\n return this.spec != null && (this.HasData || this.IsLoading || this.ResolvedTables.length > 0);\n }\n\n public override get parentShouldShowRawContent(): boolean {\n return true;\n }\n\n public get HasData(): boolean {\n return this.GridData.length > 0;\n }\n\n public get HasInlineData(): boolean {\n // Check root-level rows (legacy single-table) or any resolved table with rows\n return !!(this.spec?.rows && this.spec.rows.length > 0) ||\n this.ResolvedTables.some(t => t.rows && t.rows.length > 0);\n }\n\n public get DisplayRowCount(): number | null {\n return this.liveRowCount ?? this.spec?.metadata?.rowCount ?? null;\n }\n\n public get DisplayExecutionTime(): number | null {\n return this.liveExecutionTime ?? this.spec?.metadata?.executionTimeMs ?? null;\n }\n\n /** Current artifact version number */\n public get CurrentVersionNumber(): number {\n return this.artifactVersion?.VersionNumber || 1;\n }\n\n /** Whether this is the latest version of the artifact */\n public get IsLatestVersion(): boolean {\n return this.CurrentVersionNumber === this.LatestVersionNumber;\n }\n\n /**\n * The effective version number at which the query was last saved/updated.\n * When viewing an older version, this looks ahead through newer versions\n * to find the most recent savedAtVersionNumber for the same query,\n * giving the user accurate context (e.g., \"Query updated at v3\" instead\n * of the stale \"Saved at v1\" from this version's snapshot).\n */\n public EffectiveSavedAtVersion: number | null = null;\n\n /** Alias used by the template */\n public get SavedAtVersion(): number | null {\n return this.EffectiveSavedAtVersion;\n }\n\n /** Display name for the saved query */\n public get SavedQueryDisplayName(): string {\n return this.spec?.savedQueryName || 'Saved Query';\n }\n\n async ngOnInit(): Promise<void> {\n try {\n this.spec = this.parseJsonContent<DataArtifactSpec>();\n if (!this.spec) {\n this.HasError = true;\n this.ErrorMessage = 'Failed to parse data artifact content';\n return;\n }\n\n // Resolve to tables array (handles both single and multi-table)\n this.ResolvedTables = NormalizeToTables(\n this.spec as unknown as Record<string, unknown>,\n this.spec.title || 'Results'\n );\n\n if (this.ResolvedTables.length === 0 && !this.spec.plan) {\n return;\n }\n\n // Build enriched column configs for the first table\n if (this.ResolvedTables.length > 0) {\n this.GridColumnConfigs = this.BuildColumnConfigsForTable(this.ResolvedTables[0]);\n }\n\n // Initialize paging state for all tables\n for (let i = 0; i < this.ResolvedTables.length; i++) {\n this.tablePageState.set(i, { pageNumber: 1, pageSize: 100, totalRowCount: 0 });\n }\n\n // Set loading early (synchronously) so hasDisplayContent is true immediately\n if (this.ResolvedTables.some(t => t.metadata?.sql) || this.HasInlineData) {\n this.IsLoading = true;\n }\n\n // Load cached metadata and resolve query sync state\n await this.InitQuerySyncState();\n\n // Load data for the first (active) table\n if (this.ResolvedTables.length > 0) {\n await this.LoadTableData(0);\n }\n\n // Signal parent that tabs/display content may have changed after async load\n this.tabsChanged.emit();\n } catch (error) {\n this.HasError = true;\n this.ErrorMessage = error instanceof Error ? error.message : 'Failed to load data';\n }\n }\n\n /**\n * Re-execute the live SQL query for the active table\n */\n public async OnRefresh(): Promise<void> {\n this.tableDataCache.delete(this.ActiveTableIndex);\n await this.LoadTableData(this.ActiveTableIndex);\n }\n\n /**\n * Handle entity link click from the grid and bubble up as openEntityRecord.\n * Converts the grid's recordId string into a CompositeKey for the artifact viewer pipeline.\n */\n public OnEntityLinkClick(event: QueryEntityLinkClickEvent): void {\n const md = this.ProviderToUse;\n const entity = md.Entities.find(e => e.Name === event.entityName);\n const pkFieldName = entity?.FirstPrimaryKey?.Name ?? 'ID';\n\n const compositeKey = new CompositeKey([\n new KeyValuePair(pkFieldName, event.recordId)\n ]);\n this.openEntityRecord.emit({\n entityName: event.entityName,\n compositeKey\n });\n }\n\n /**\n * Handle page change from the data grid's embedded pager.\n * Re-executes the query for the active table with new page parameters.\n */\n public async OnPageChange(event: PageChangeEvent): Promise<void> {\n const pageState = this.tablePageState.get(this.ActiveTableIndex);\n if (!pageState) return;\n\n pageState.pageNumber = event.PageNumber;\n pageState.pageSize = event.PageSize;\n\n // Clear cache so it reloads\n this.tableDataCache.delete(this.ActiveTableIndex);\n await this.LoadTableData(this.ActiveTableIndex);\n }\n\n /**\n * Switch to a different table tab.\n * Loads data lazily if not already cached.\n */\n public async OnTableTabClick(index: number): Promise<void> {\n if (index === this.ActiveTableIndex) return;\n this.ActiveTableIndex = index;\n\n const table = this.ResolvedTables[index];\n if (!table) return;\n\n // Use cached column configs or build new\n if (!this.tableColumnConfigsCache.has(index)) {\n const configs = this.BuildColumnConfigsForTable(table);\n if (configs) this.tableColumnConfigsCache.set(index, configs);\n }\n this.GridColumnConfigs = this.tableColumnConfigsCache.get(index) ?? null;\n\n // Use cached data or load fresh\n if (this.tableDataCache.has(index)) {\n this.GridData = this.tableDataCache.get(index)!;\n const pageState = this.tablePageState.get(index)!;\n this.PagerPageNumber = pageState.pageNumber;\n this.PagerPageSize = pageState.pageSize;\n this.PagerTotalRowCount = pageState.totalRowCount;\n } else {\n await this.LoadTableData(index);\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Load data for a specific table.\n * Handles live SQL execution, inline rows, and caching.\n */\n private async LoadTableData(tableIndex: number): Promise<void> {\n const table = this.ResolvedTables[tableIndex];\n if (!table) return;\n\n this.IsLoading = true;\n this.HasError = false;\n this.cdr.detectChanges();\n\n try {\n if (table.metadata?.sql) {\n // Live SQL execution\n const pageState = this.tablePageState.get(tableIndex)!;\n const rq = new RunQuery();\n const startRow = (pageState.pageNumber - 1) * pageState.pageSize;\n const result = await rq.RunQuery({\n SQL: table.metadata.sql,\n StartRow: startRow,\n MaxRows: pageState.pageSize\n });\n\n if (result.Success) {\n this.tableDataCache.set(tableIndex, result.Results);\n this.GridData = result.Results;\n this.IsLive = true;\n\n pageState.totalRowCount = result.TotalRowCount ?? result.RowCount ?? 0;\n this.PagerTotalRowCount = pageState.totalRowCount;\n this.PagerPageNumber = pageState.pageNumber;\n this.PagerPageSize = pageState.pageSize;\n\n this.liveRowCount = result.RowCount;\n this.liveExecutionTime = result.ExecutionTime;\n } else {\n this.HandleTableError(tableIndex, result.ErrorMessage || 'Query failed');\n }\n } else if (table.rows && table.rows.length > 0) {\n // Inline data\n this.tableDataCache.set(tableIndex, table.rows);\n this.GridData = table.rows;\n this.liveRowCount = table.rows.length;\n } else {\n this.GridData = [];\n }\n } catch (error) {\n this.HandleTableError(tableIndex, error instanceof Error ? error.message : 'Load failed');\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Build QueryGridColumnConfig[] from a DataTable's column metadata.\n * Returns null if columns have no entity metadata (grid falls back to auto-inference).\n */\n private BuildColumnConfigsForTable(table: DataTable): QueryGridColumnConfig[] | null {\n const columns = table.columns;\n if (!columns?.length) return null;\n\n // Only build if at least one column has entity metadata or type info\n const hasMetadata = columns.some(c => c.sourceEntity || c.sqlBaseType);\n if (!hasMetadata) return null;\n\n const md = this.ProviderToUse;\n return columns.map((col, index) => {\n const target = resolveTargetEntity(col.sourceEntity, col.sourceFieldName, md);\n const isEntityLink = !!(target.targetEntityName && (target.isPrimaryKey || target.isForeignKey));\n const baseType = (col.sqlBaseType || 'nvarchar').toLowerCase();\n\n let align: 'left' | 'center' | 'right' = 'left';\n if (['int', 'bigint', 'decimal', 'numeric', 'float', 'money', 'smallmoney', 'real'].includes(baseType)) {\n align = 'right';\n } else if (baseType === 'bit') {\n align = 'center';\n }\n\n // Support both displayName (new) and headerName (legacy) for backward compat\n const colAny = col as unknown as Record<string, unknown>;\n const title = col.displayName || (colAny['headerName'] as string) || col.field;\n\n return {\n field: col.field,\n title,\n visible: true,\n sortable: true,\n resizable: true,\n reorderable: true,\n sqlBaseType: col.sqlBaseType || 'nvarchar',\n sqlFullType: col.sqlFullType || col.sqlBaseType || 'nvarchar',\n align,\n order: index,\n sourceEntityName: col.sourceEntity,\n sourceFieldName: col.sourceFieldName,\n isEntityLink,\n targetEntityName: target.targetEntityName,\n targetEntityId: target.targetEntityId,\n targetEntityIcon: target.targetEntityIcon,\n isPrimaryKey: target.isPrimaryKey,\n isForeignKey: target.isForeignKey,\n pinned: null,\n } as QueryGridColumnConfig;\n });\n }\n\n /**\n * Handle a table load error by setting error state and falling back to inline data\n */\n private HandleTableError(tableIndex: number, message: string): void {\n this.HasError = true;\n this.ErrorMessage = message;\n const table = this.ResolvedTables[tableIndex];\n if (table?.rows && table.rows.length > 0) {\n this.GridData = table.rows;\n }\n }\n\n // ─── Query Sync State ────────────────────────────────────────────\n\n /**\n * Initialize query sync state by loading cached metadata.\n * Resolves the latest version number and compares saved query SQL.\n */\n private async InitQuerySyncState(): Promise<void> {\n // Ensure artifact cache is loaded (not registered for startup)\n await ArtifactMetadataEngine.Instance.Config(false);\n\n this.LatestVersionNumber = this.resolveLatestVersionNumber();\n\n // If cache is stale (doesn't know about the version we're viewing),\n // force-refresh and re-resolve. This happens when new versions are\n // created during a conversation after the cache was first loaded.\n if (this.LatestVersionNumber < this.CurrentVersionNumber) {\n await ArtifactMetadataEngine.Instance.Config(true);\n this.LatestVersionNumber = this.resolveLatestVersionNumber();\n }\n\n this.EffectiveSavedAtVersion = this.resolveEffectiveSavedAtVersion();\n await this.resolveSavedQuerySql();\n this.QuerySyncState = this.computeQuerySyncState();\n }\n\n /**\n * Determine the latest version number for this artifact from cache.\n * Falls back to current version if cache miss.\n */\n private resolveLatestVersionNumber(): number {\n if (!this.artifactVersion?.ArtifactID) {\n return this.CurrentVersionNumber;\n }\n\n const versions = ArtifactMetadataEngine.Instance.GetVersionsForArtifact(this.artifactVersion.ArtifactID);\n if (versions.length > 0) {\n // GetVersionsForArtifact returns DESC sorted\n return versions[0].VersionNumber || 1;\n }\n\n // Cache miss — current version is our best guess\n return this.CurrentVersionNumber;\n }\n\n /**\n * Scan all versions of this artifact to find the most recent savedAtVersionNumber\n * for the same savedQueryId. When viewing an older version, this tells the user\n * where the query was *actually* last updated, not just what this version's\n * snapshot recorded at the time.\n */\n private resolveEffectiveSavedAtVersion(): number | null {\n const queryId = this.spec?.savedQueryId;\n if (!queryId) return null;\n\n // Start with this version's own value\n let effective = this.spec?.savedAtVersionNumber ?? null;\n\n if (!this.artifactVersion?.ArtifactID) return effective;\n\n // GetVersionsForArtifact returns DESC sorted — scan all versions\n const versions = ArtifactMetadataEngine.Instance.GetVersionsForArtifact(this.artifactVersion.ArtifactID);\n for (const v of versions) {\n try {\n if (!v.Content) continue;\n const content = typeof v.Content === 'string' ? JSON.parse(v.Content) : v.Content;\n if (content.savedQueryId === queryId && content.savedAtVersionNumber != null) {\n const vSavedAt = content.savedAtVersionNumber as number;\n if (effective == null || vSavedAt > effective) {\n effective = vSavedAt;\n }\n }\n } catch {\n // Skip versions with unparseable content\n }\n }\n\n return effective;\n }\n\n /**\n * Look up the saved query's SQL from QueryEngine cache for comparison.\n * Only fetches if savedQueryId is present.\n */\n private async resolveSavedQuerySql(): Promise<void> {\n if (!this.spec?.savedQueryId) {\n this.savedQuerySql = null;\n return;\n }\n\n // QueryEngine is registered for startup, should already be loaded\n let query = QueryEngine.Instance.FindQueryByID(this.spec.savedQueryId);\n\n if (!query) {\n // Cache miss — force refresh and retry\n await QueryEngine.Instance.Config(true);\n query = QueryEngine.Instance.FindQueryByID(this.spec.savedQueryId);\n }\n\n this.savedQuerySql = query?.SQL ?? null;\n }\n\n /**\n * Compute the query sync state from current spec, version, and saved query SQL.\n * Implements the decision tree from the UX design.\n */\n private computeQuerySyncState(): QuerySyncState {\n const hasSavedQuery = !!this.spec?.savedQueryId;\n const isLatest = this.IsLatestVersion;\n\n if (!hasSavedQuery) {\n return isLatest ? 'no-query-latest' : 'no-query-older';\n }\n\n // Compare SQL (normalize whitespace for reliable comparison)\n const specSql = this.normalizeSql(this.spec?.metadata?.sql);\n const querySql = this.normalizeSql(this.savedQuerySql);\n const sqlMatches = specSql != null && querySql != null && specSql === querySql;\n\n // Only truly synced if SQL matches AND this is the version it was saved at.\n // Even with identical SQL, a newer version should show the dropdown so the\n // user can update the version association (re-save at current version).\n const savedAtCurrent = this.EffectiveSavedAtVersion === this.CurrentVersionNumber;\n if (sqlMatches && savedAtCurrent) {\n return 'synced';\n }\n\n // SQL differs — determine position relative to saved version\n if (isLatest) {\n return 'outdated-latest';\n }\n\n // Use effective saved-at (looks ahead through newer versions)\n const savedAt = this.EffectiveSavedAtVersion;\n if (savedAt != null && this.CurrentVersionNumber < savedAt) {\n return 'query-ahead'; // query was updated at a newer version\n }\n\n return 'query-behind'; // ahead of saved but not latest\n }\n\n /** Normalize SQL for comparison: trim and collapse whitespace */\n private normalizeSql(sql: string | null | undefined): string | null {\n if (sql == null) return null;\n return sql.trim().replace(/\\s+/g, ' ');\n }\n\n // ─── Actions ────────────────────────────────────────────────────\n\n /** Navigate to the saved query in the Data Explorer's Queries browser */\n public OnOpenSavedQuery(): void {\n if (!this.spec?.savedQueryId) return;\n this.navigationRequest.emit({\n appName: 'Data Explorer',\n navItemName: 'Queries',\n queryParams: { queryId: this.spec.savedQueryId }\n });\n }\n\n /** Show the save panel for creating a brand-new query */\n public OnShowSaveDialog(): void {\n this.ShowSaveDialog = true;\n this.ShowUpdateDropdown = false;\n }\n\n /** Toggle the update query dropdown */\n public OnToggleUpdateDropdown(): void {\n this.ShowUpdateDropdown = !this.ShowUpdateDropdown;\n }\n\n /** Close the dropdown (e.g., on outside click) */\n public OnCloseDropdown(): void {\n this.ShowUpdateDropdown = false;\n }\n\n /**\n * Update the existing saved query's SQL to match this version.\n * Only available from the latest version (Scenario 3).\n */\n public async OnUpdateExistingQuery(): Promise<void> {\n this.ShowUpdateDropdown = false;\n if (!this.spec?.savedQueryId || !this.spec.metadata?.sql) return;\n\n this.IsSaving = true;\n this.SavingMessage = `Updating \"${this.SavedQueryDisplayName}\"...`;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const query = await md.GetEntityObject<import('@memberjunction/core-entities').MJQueryEntity>('MJ: Queries');\n const loaded = await query.Load(this.spec.savedQueryId);\n\n if (!loaded) {\n console.error('Failed to load saved query for update');\n return;\n }\n\n query.SQL = this.spec.metadata.sql;\n if (this.spec.plan?.trim()) {\n query.TechnicalDescription = this.spec.plan.trim();\n }\n const saved = await query.Save();\n\n if (saved) {\n // Update spec with new version tracking\n this.spec.savedAtVersionNumber = this.CurrentVersionNumber;\n await this.PersistArtifactContent();\n\n // Refresh caches so future lookups see the updated data\n await QueryEngine.Instance.Config(true);\n await ArtifactMetadataEngine.Instance.Config(true);\n await md.Refresh();\n\n this.savedQuerySql = this.spec.metadata.sql;\n this.EffectiveSavedAtVersion = this.CurrentVersionNumber;\n this.QuerySyncState = 'synced';\n }\n } catch (error) {\n console.error('Failed to update saved query:', error);\n } finally {\n this.IsSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Save as a new query (from the dropdown).\n * Opens the save dialog which creates a fresh query record.\n */\n public OnSaveAsNewQuery(): void {\n this.ShowUpdateDropdown = false;\n this.ShowSaveDialog = true;\n }\n\n /** Handle successful save from the dialog (both initial save and \"save as new\") */\n public async OnQuerySaved(event: SaveQueryResult): Promise<void> {\n this.ShowSaveDialog = false;\n this.IsSaving = true;\n this.SavingMessage = 'Saving query...';\n this.cdr.detectChanges();\n\n try {\n // Update spec with saved query info and version tracking\n this.spec!.savedQueryId = event.queryId;\n this.spec!.savedQueryName = event.queryName;\n this.spec!.savedAtVersionNumber = this.CurrentVersionNumber;\n\n // Persist and refresh caches\n await this.PersistArtifactContent();\n await QueryEngine.Instance.Config(true);\n await ArtifactMetadataEngine.Instance.Config(true);\n await this.ProviderToUse.Refresh();\n\n this.savedQuerySql = this.spec!.metadata?.sql ?? null;\n this.EffectiveSavedAtVersion = this.CurrentVersionNumber;\n this.QuerySyncState = 'synced';\n } catch (error) {\n console.error('Failed to save query:', error);\n } finally {\n this.IsSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Persist updated spec back to the artifact version entity */\n private async PersistArtifactContent(): Promise<void> {\n if (!this.artifactVersion || !this.spec) return;\n this.artifactVersion.Content = JSON.stringify(this.spec);\n await this.artifactVersion.Save();\n }\n\n /**\n * Returns a DataSnapshot with live grid data, current page state,\n * and query sync state.\n */\n public override GetCurrentStateSnapshot(): DataSnapshot | null {\n if (!this.spec) return null;\n\n const tables = NormalizeToTables(\n this.spec as unknown as Record<string, unknown>,\n this.spec.title || 'Results'\n );\n const activeTable = tables[this.ActiveTableIndex];\n\n if (activeTable) {\n // Override with live data for the active table\n if (this.IsLive) activeTable.rows = this.GridData;\n activeTable.pageNumber = this.PagerPageNumber;\n activeTable.metadata = {\n ...activeTable.metadata,\n ...(this.liveRowCount != null ? { rowCount: this.liveRowCount } : {}),\n ...(this.liveExecutionTime != null\n ? { executionTimeMs: this.liveExecutionTime } : {}),\n ...(this.PagerTotalRowCount > 0\n ? { totalAvailableRows: this.PagerTotalRowCount } : {}),\n pageSize: this.PagerPageSize\n };\n }\n\n return DataSnapshot.FromTables(tables, this.spec.title);\n }\n\n // ─── Tabs ───────────────────────────────────────────────────────\n\n /**\n * Provide Plan tab (markdown), SQL tab (code), and Interpretation tab when available\n */\n public GetAdditionalTabs(): ArtifactViewerTab[] {\n const tabs: ArtifactViewerTab[] = [];\n\n if (this.spec?.plan) {\n tabs.push({\n label: 'Plan',\n icon: 'fa-diagram-project',\n contentType: 'markdown',\n content: this.spec.plan\n });\n }\n\n // SQL tab — multi-table shows all queries with headers\n if (this.IsMultiTable) {\n const multiSql = buildMultiTableSql(this.ResolvedTables);\n if (multiSql) {\n tabs.push({\n label: 'SQL',\n icon: 'fa-database',\n contentType: 'code',\n language: 'sql',\n content: multiSql\n });\n }\n } else if (this.spec?.metadata?.sql) {\n tabs.push({\n label: 'SQL',\n icon: 'fa-database',\n contentType: 'code',\n language: 'sql',\n content: this.spec.metadata.sql\n });\n }\n\n // Interpretation tab\n if (this.spec?.interpretation) {\n tabs.push({\n label: 'Interpretation',\n icon: 'fa-lightbulb',\n contentType: 'markdown',\n content: this.spec.interpretation\n });\n }\n\n return tabs;\n }\n}\n","<div class=\"data-artifact-viewer\" [ngClass]=\"cssClass\">\n @if (spec) {\n @if (HasData || IsLoading || ResolvedTables.length > 0) {\n <!-- Toolbar -->\n <div class=\"data-toolbar\">\n <div class=\"data-title\">\n <i class=\"fas fa-table\"></i>\n <span>{{ spec.title || \"Data Results\" }}</span>\n @if (IsLive) {\n <span class=\"live-badge\">Live</span>\n }\n @if (DisplayRowCount != null) {\n <span class=\"row-count\">{{ DisplayRowCount }} rows</span>\n }\n @if (DisplayExecutionTime != null) {\n <span class=\"exec-time\">{{ DisplayExecutionTime }}ms</span>\n }\n </div>\n <div class=\"data-actions\">\n @if (IsLive) {\n <button class=\"btn-icon\" title=\"Refresh data\" (click)=\"OnRefresh()\" [disabled]=\"IsLoading\">\n <i class=\"fas fa-sync-alt\" [class.fa-spin]=\"IsLoading\"></i> Refresh\n </button>\n }\n\n @switch (QuerySyncState) {\n <!-- S1: No saved query, latest version → Save Query -->\n @case (\"no-query-latest\") {\n <button class=\"btn-icon btn-save\" title=\"Save as reusable query\" (click)=\"OnShowSaveDialog()\"><i class=\"fas fa-save\"></i> Save Query</button>\n }\n\n <!-- S2: SQL matches → green badge + Open -->\n @case (\"synced\") {\n <span class=\"query-badge query-badge-synced\"> <i class=\"fas fa-check\"></i> Saved at v{{ SavedAtVersion }} </span>\n <button class=\"btn-icon btn-open\" title=\"Open saved query record\" (click)=\"OnOpenSavedQuery()\">\n <i class=\"fas fa-external-link-alt\"></i> Open Query\n </button>\n }\n\n <!-- S3: SQL differs, latest version → amber badge + dropdown -->\n @case (\"outdated-latest\") {\n <span class=\"query-badge query-badge-outdated\"> <i class=\"fas fa-circle-exclamation\"></i> Saved at v{{ SavedAtVersion }} </span>\n <div class=\"dropdown-wrapper\">\n <button class=\"btn-icon btn-warning\" title=\"Update or save query\" (click)=\"OnToggleUpdateDropdown()\">\n <i class=\"fas fa-save\"></i> Update Query <i class=\"fas fa-caret-down\"></i>\n </button>\n @if (ShowUpdateDropdown) {\n <div class=\"query-dropdown\" (click)=\"$event.stopPropagation()\">\n <div class=\"query-dropdown-item\" (click)=\"OnUpdateExistingQuery()\">\n <i class=\"fas fa-arrow-up-from-bracket\" style=\"color: #d97706\"></i>\n <div>\n <div class=\"dropdown-label\">Update \"{{ SavedQueryDisplayName }}\"</div>\n <div class=\"dropdown-desc\">Replace saved query SQL with this version's SQL</div>\n </div>\n </div>\n <div class=\"query-dropdown-item\" (click)=\"OnSaveAsNewQuery()\">\n <i class=\"fas fa-plus\" style=\"color: #16a34a\"></i>\n <div>\n <div class=\"dropdown-label\">Save as New Query</div>\n <div class=\"dropdown-desc\">Create a new query, keep the original unchanged</div>\n </div>\n </div>\n <div class=\"query-dropdown-item\" (click)=\"OnOpenSavedQuery(); OnCloseDropdown()\">\n <i class=\"fas fa-external-link-alt\" style=\"color: var(--mj-text-muted)\"></i>\n <div>\n <div class=\"dropdown-label\">Open Saved Query</div>\n <div class=\"dropdown-desc\">View \"{{ SavedQueryDisplayName }}\" (saved at v{{ SavedAtVersion }})</div>\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- S4: Older version, query was updated ahead -->\n @case (\"query-ahead\") {\n <span class=\"query-badge query-badge-muted\"> <i class=\"fas fa-clock-rotate-left\"></i> Query updated at v{{ SavedAtVersion }} </span>\n <button class=\"btn-icon btn-muted\" title=\"Open saved query record\" (click)=\"OnOpenSavedQuery()\">\n <i class=\"fas fa-external-link-alt\"></i> Open Query\n </button>\n }\n\n <!-- S5: Middle version, saved at older, not latest -->\n @case (\"query-behind\") {\n <span class=\"query-badge query-badge-muted\"> <i class=\"fas fa-clock-rotate-left\"></i> Saved at v{{ SavedAtVersion }} </span>\n <button class=\"btn-icon btn-muted\" title=\"Open saved query record\" (click)=\"OnOpenSavedQuery()\">\n <i class=\"fas fa-external-link-alt\"></i> Open Query\n </button>\n }\n\n <!-- S6: No saved query, older version → no actions -->\n @case (\"no-query-older\") {\n <!-- No query actions available on older versions -->\n }\n }\n </div>\n </div>\n\n <!-- Multi-table tab strip -->\n @if (IsMultiTable) {\n <div class=\"table-tabs\">\n @for (table of ResolvedTables; track table.name; let i = $index) {\n <button class=\"table-tab\" [class.active]=\"i === ActiveTableIndex\" [title]=\"table.description || table.name\" (click)=\"OnTableTabClick(i)\">\n <span class=\"table-tab-name\">{{ table.name }}</span>\n @if (table.metadata?.rowCount != null || table.rows.length) {\n <span class=\"table-tab-count\"> ({{ table.metadata?.rowCount ?? table.rows.length }} rows) </span>\n }\n </button>\n }\n </div>\n }\n\n <!-- Computations summary bar -->\n @if (spec.computations?.length) {\n <div class=\"computations-bar\">\n @for (comp of spec.computations; track comp.name) {\n @if (!IsMultiTable || !comp.table || comp.table === ActiveTable?.name) {\n <div class=\"computation-chip\" [title]=\"comp.description || comp.name\">\n <span class=\"computation-label\">{{ comp.name }}</span>\n <span class=\"computation-value\">\n {{ comp.formattedValue || comp.value }}\n </span>\n </div>\n }\n }\n </div>\n }\n\n <!-- Grid -->\n <div class=\"grid-container\">\n <!-- Saving overlay -->\n @if (IsSaving) {\n <div class=\"saving-overlay\">\n <mj-loading [text]=\"SavingMessage\"></mj-loading>\n </div>\n }\n @if (IsLoading) {\n <mj-loading text=\"Loading data...\"></mj-loading>\n } @else if (HasError && HasData) {\n <div class=\"error-banner\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n <span>{{ ErrorMessage }}</span>\n <span class=\"fallback-note\">(Showing cached data)</span>\n </div>\n <mj-query-data-grid\n [ColumnConfigs]=\"GridColumnConfigs\"\n [Data]=\"GridData\"\n [TotalRowCount]=\"PagerTotalRowCount\"\n [PageNumber]=\"PagerPageNumber\"\n [PageSize]=\"PagerPageSize\"\n [ShowToolbar]=\"false\"\n [ShowRefresh]=\"false\"\n [PersistState]=\"false\"\n [SelectionMode]=\"'none'\"\n (EntityLinkClick)=\"OnEntityLinkClick($event)\"\n (PageChange)=\"OnPageChange($event)\"\n Height=\"100%\"\n >\n </mj-query-data-grid>\n } @else if (HasError) {\n <div class=\"error-state\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n <p>{{ ErrorMessage }}</p>\n </div>\n } @else {\n <mj-query-data-grid\n [ColumnConfigs]=\"GridColumnConfigs\"\n [Data]=\"GridData\"\n [TotalRowCount]=\"PagerTotalRowCount\"\n [PageNumber]=\"PagerPageNumber\"\n [PageSize]=\"PagerPageSize\"\n [ShowToolbar]=\"false\"\n [ShowRefresh]=\"false\"\n [PersistState]=\"false\"\n [SelectionMode]=\"'none'\"\n (EntityLinkClick)=\"OnEntityLinkClick($event)\"\n (PageChange)=\"OnPageChange($event)\"\n Height=\"100%\"\n >\n </mj-query-data-grid>\n }\n </div>\n } @else if (spec.plan) {\n <!-- Plan-only view (no results yet) -->\n <div class=\"data-toolbar\">\n <div class=\"data-title\">\n <i class=\"fas fa-diagram-project\"></i>\n <span>{{ spec.title || \"Query Plan\" }}</span>\n </div>\n </div>\n <div class=\"plan-content\">\n <mj-markdown [data]=\"spec.plan\" [enableMermaid]=\"true\" [enableHighlight]=\"true\" [enableCollapsibleHeadings]=\"false\" [enableSmartypants]=\"true\">\n </mj-markdown>\n </div>\n } @else {\n <!-- No data and no plan -->\n <div class=\"empty-state\">\n <i class=\"fas fa-inbox\"></i>\n <p>No data to display</p>\n </div>\n }\n } @else if (HasError) {\n <div class=\"error-state\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n <p>{{ ErrorMessage }}</p>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fas fa-inbox\"></i>\n <p>No data to display</p>\n </div>\n }\n\n <!-- Save Query Panel (slide-in) -->\n @if (ShowSaveDialog) {\n <mj-save-query-panel\n [QueryName]=\"spec?.title || 'Untitled Query'\"\n [QueryDescription]=\"''\"\n [SQL]=\"spec?.metadata?.sql || ''\"\n [Plan]=\"spec?.plan || ''\"\n (Saved)=\"OnQuerySaved($event)\"\n (Cancelled)=\"ShowSaveDialog = false\"\n >\n </mj-save-query-panel>\n }\n</div>\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"json-artifact-viewer.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/plugins/json-artifact-viewer.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAa,UAAU,EAAE,MAAM,eAAe,CAAC;AACvG,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE1E,OAAO,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAE,YAAY,EAAW,MAAM,sBAAsB,CAAC;;AAI7D;;;;GAIG;AACH,qBAsHa,2BAA4B,SAAQ,iCAAkC,YAAW,MAAM,EAAE,SAAS;IAkB3G,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,SAAS;IAlBK,SAAS,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAE3D,WAAW,SAAM;IACjB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IACtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAClC,WAAW,EAAE,eAAe,GAAG,IAAI,CAAQ;IAClD,OAAO,CAAC,iBAAiB,CAA0C;IACnE,OAAO,CAAC,aAAa,CAAuB;IAE5C;;OAEG;IACH,IAAoB,iBAAiB,IAAI,OAAO,CAE/C;gBAGS,GAAG,EAAE,iBAAiB,EACtB,SAAS,EAAE,YAAY;IAKjC,WAAW,IAAI,IAAI;IASb,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAU/B;;;OAGG;IACH,IAAoB,wBAAwB,IAAI,OAAO,CAEtD;IAED;;;;OAIG;IACH,IAAoB,0BAA0B,IAAI,OAAO,CAExD;YAEa,qBAAqB;IA6DnC,OAAO,CAAC,mBAAmB;IAyB3B,YAAY,IAAI,IAAI;IA2DpB,OAAO,CAAC,qBAAqB;IAsB7B,eAAe,IAAI,IAAI;IAUvB,SAAS,IAAI,IAAI;IAWjB,MAAM,IAAI,IAAI;IAYE,uBAAuB,IAAI,YAAY,GAAG,IAAI;IAI9D;;;OAGG;IACH,OAAO,CAAC,sBAAsB;yCA5QnB,2BAA2B;2CAA3B,2BAA2B;CA+RvC"}
1
+ {"version":3,"file":"json-artifact-viewer.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/plugins/json-artifact-viewer.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAa,UAAU,EAAE,MAAM,eAAe,CAAC;AAEvG,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE1E,OAAO,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAE,YAAY,EAAW,MAAM,sBAAsB,CAAC;;AAI7D;;;;GAIG;AACH,qBAsHa,2BAA4B,SAAQ,iCAAkC,YAAW,MAAM,EAAE,SAAS;IAkB3G,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,SAAS;IAlBK,SAAS,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAE3D,WAAW,SAAM;IACjB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IACtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAClC,WAAW,EAAE,eAAe,GAAG,IAAI,CAAQ;IAClD,OAAO,CAAC,iBAAiB,CAA0C;IACnE,OAAO,CAAC,aAAa,CAAuB;IAE5C;;OAEG;IACH,IAAoB,iBAAiB,IAAI,OAAO,CAE/C;gBAGS,GAAG,EAAE,iBAAiB,EACtB,SAAS,EAAE,YAAY;IAKjC,WAAW,IAAI,IAAI;IASb,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAU/B;;;OAGG;IACH,IAAoB,wBAAwB,IAAI,OAAO,CAEtD;IAED;;;;OAIG;IACH,IAAoB,0BAA0B,IAAI,OAAO,CAExD;YAEa,qBAAqB;IA6DnC,OAAO,CAAC,mBAAmB;IAyB3B,YAAY,IAAI,IAAI;IA2DpB,OAAO,CAAC,qBAAqB;IAsB7B,eAAe,IAAI,IAAI;IAUvB,SAAS,IAAI,IAAI;IAWjB,MAAM,IAAI,IAAI;IAYE,uBAAuB,IAAI,YAAY,GAAG,IAAI;IAI9D;;;OAGG;IACH,OAAO,CAAC,sBAAsB;yCA5QnB,2BAA2B;2CAA3B,2BAA2B;CA+RvC"}
@@ -121,7 +121,7 @@ let JsonArtifactViewerComponent = class JsonArtifactViewerComponent extends Base
121
121
  }
122
122
  console.log(`📦 JSON Plugin: Loading attributes for version ID: ${this.artifactVersion.ID}`);
123
123
  try {
124
- const rv = new RunView();
124
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
125
125
  const result = await rv.RunView({
126
126
  EntityName: 'MJ: Artifact Version Attributes',
127
127
  ExtraFilter: `ArtifactVersionID='${this.artifactVersion.ID}'`,
@@ -389,5 +389,5 @@ export { JsonArtifactViewerComponent };
389
389
  type: ViewChild,
390
390
  args: ['htmlFrame']
391
391
  }] }); })();
392
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(JsonArtifactViewerComponent, { className: "JsonArtifactViewerComponent", filePath: "src/lib/components/plugins/json-artifact-viewer.component.ts", lineNumber: 132 }); })();
392
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(JsonArtifactViewerComponent, { className: "JsonArtifactViewerComponent", filePath: "src/lib/components/plugins/json-artifact-viewer.component.ts", lineNumber: 133 }); })();
393
393
  //# sourceMappingURL=json-artifact-viewer.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-artifact-viewer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/plugins/json-artifact-viewer.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ViewChild, ElementRef } from '@angular/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseArtifactViewerPluginComponent } from '../base-artifact-viewer.component';\nimport { DataSnapshot, RunView } from '@memberjunction/core';\nimport { MJArtifactVersionAttributeEntity } from '@memberjunction/core-entities';\nimport { createJsonSnapshot } from '../../snapshot-helpers';\n\n/**\n * Viewer component for JSON artifacts.\n * Supports extract rules - shows displayMarkdown, displayHtml, or raw JSON editor (in that priority order).\n * All content is displayed in the parent's Display tab.\n */\n@Component({\n standalone: false,\n selector: 'mj-json-artifact-viewer',\n template: `\n <div class=\"json-artifact-viewer\" [ngClass]=\"cssClass\">\n <!-- Display toolbar -->\n <div class=\"display-toolbar\">\n <button class=\"btn-icon\" title=\"Copy Content\" (click)=\"onCopy()\">\n <i class=\"fas fa-copy\"></i> Copy\n </button>\n @if (displayHtml) {\n <button class=\"btn-icon\" title=\"Open in New Window\" (click)=\"openInNewWindow()\">\n <i class=\"fas fa-external-link-alt\"></i> New Window\n </button>\n <button class=\"btn-icon\" title=\"Print\" (click)=\"printHtml()\">\n <i class=\"fas fa-print\"></i> Print\n </button>\n }\n </div>\n\n <!-- Display content: priority order = displayHtml > displayMarkdown > JSON editor -->\n <div class=\"display-content\">\n @if (displayHtml && htmlBlobUrl) {\n <!-- Sandboxed iframe for rich HTML using blob URL -->\n <iframe\n #htmlFrame\n [src]=\"htmlBlobUrl\"\n sandbox=\"allow-same-origin allow-scripts allow-popups allow-popups-to-escape-sandbox allow-modals\"\n class=\"html-iframe\"\n (load)=\"onIframeLoad()\">\n </iframe>\n } @else if (displayMarkdown) {\n <div class=\"markdown-content\">\n <mj-markdown [data]=\"displayMarkdown\"\n [enableCollapsibleHeadings]=\"true\"\n [enableLineNumbers]=\"true\"\n [enableSmartypants]=\"true\"\n [enableHtml]=\"true\"></mj-markdown>\n </div>\n } @else {\n <div class=\"json-editor-container\">\n <mj-code-editor\n [(ngModel)]=\"jsonContent\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"width: 100%; height: 100%;\">\n </mj-code-editor>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n .json-artifact-viewer {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .display-toolbar {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .btn-icon {\n padding: 6px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 4px;\n cursor: pointer;\n font-size: 12px;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n }\n\n .btn-icon:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-text-disabled);\n }\n\n .display-content {\n flex: 1;\n overflow: auto;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .html-iframe {\n width: 100%;\n border: none;\n background: var(--mj-bg-surface);\n display: block;\n }\n\n .markdown-content {\n flex: 1;\n padding: 20px;\n overflow: auto;\n min-height: 0;\n background: var(--mj-bg-surface);\n }\n\n .json-editor-container {\n flex: 1;\n overflow: auto;\n min-height: 0;\n }\n `]\n})\n@RegisterClass(BaseArtifactViewerPluginComponent, 'JsonArtifactViewerPlugin')\nexport class JsonArtifactViewerComponent extends BaseArtifactViewerPluginComponent implements OnInit, OnDestroy {\n @ViewChild('htmlFrame') htmlFrame?: ElementRef<HTMLIFrameElement>;\n\n public jsonContent = '';\n public displayMarkdown: string | null = null;\n public displayHtml: string | null = null;\n public htmlBlobUrl: SafeResourceUrl | null = null;\n private versionAttributes: MJArtifactVersionAttributeEntity[] = [];\n private unsafeBlobUrl: string | null = null; // Keep unsafe URL for cleanup\n\n /**\n * JSON artifacts always have content to display (JSON editor, displayHtml, or displayMarkdown)\n */\n public override get hasDisplayContent(): boolean {\n return true;\n }\n\n constructor(\n private cdr: ChangeDetectorRef,\n private sanitizer: DomSanitizer\n ) {\n super();\n }\n\n ngOnDestroy(): void {\n // Clean up blob URL to prevent memory leaks\n if (this.unsafeBlobUrl) {\n URL.revokeObjectURL(this.unsafeBlobUrl);\n this.unsafeBlobUrl = null;\n this.htmlBlobUrl = null;\n }\n }\n\n async ngOnInit(): Promise<void> {\n this.jsonContent = this.getContent();\n\n // Load version attributes to check for extract rules\n await this.loadVersionAttributes();\n\n // Trigger change detection after async load\n this.cdr.detectChanges();\n }\n\n /**\n * Override to return true when showing extracted displayHtml or displayMarkdown.\n * Returns false when showing raw JSON editor (no extract rules available).\n */\n public override get isShowingElevatedDisplay(): boolean {\n return !!(this.displayHtml || this.displayMarkdown);\n }\n\n /**\n * Override to tell parent whether to show raw JSON tab.\n * When showing elevated display (markdown/HTML), return true so parent shows JSON tab.\n * When showing raw JSON editor, return false (no need for duplicate JSON tab).\n */\n public override get parentShouldShowRawContent(): boolean {\n return this.isShowingElevatedDisplay;\n }\n\n private async loadVersionAttributes(): Promise<void> {\n if (!this.artifactVersion?.ID) {\n console.log('📦 JSON Plugin: No artifactVersion.ID, skipping attribute load');\n return;\n }\n\n console.log(`📦 JSON Plugin: Loading attributes for version ID: ${this.artifactVersion.ID}`);\n\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJArtifactVersionAttributeEntity>({\n EntityName: 'MJ: Artifact Version Attributes',\n ExtraFilter: `ArtifactVersionID='${this.artifactVersion.ID}'`,\n ResultType: 'entity_object'\n });\n\n console.log(`📦 JSON Plugin: RunView completed. Success=${result.Success}, Results count=${result.Results?.length || 0}`);\n\n if (result.Success && result.Results) {\n this.versionAttributes = result.Results;\n\n console.log(`📦 JSON Plugin: Loaded ${this.versionAttributes.length} attributes for version ${this.artifactVersion.ID}`);\n console.log(`📦 Attributes:`, this.versionAttributes.map(a => ({ name: a.Name, hasValue: !!a.Value })));\n\n // Check for displayHtml and displayMarkdown attributes (from extract rules)\n // Priority: displayHtml > displayMarkdown\n const displayHtmlAttr = this.versionAttributes.find(a => a.Name?.toLowerCase() === 'displayhtml');\n const displayMarkdownAttr = this.versionAttributes.find(a => a.Name?.toLowerCase() === 'displaymarkdown');\n\n console.log(`📦 displayHtmlAttr:`, displayHtmlAttr ? { name: displayHtmlAttr.Name, valueLength: displayHtmlAttr.Value?.length } : 'not found');\n console.log(`📦 displayMarkdownAttr:`, displayMarkdownAttr ? { name: displayMarkdownAttr.Name, valueLength: displayMarkdownAttr.Value?.length } : 'not found');\n\n // Parse attribute values - fix \"null\" string bug\n this.displayHtml = this.parseAttributeValue(displayHtmlAttr?.Value);\n this.displayMarkdown = this.parseAttributeValue(displayMarkdownAttr?.Value);\n\n // Clean up double-escaped characters in HTML (from LLM generation)\n if (this.displayHtml) {\n this.displayHtml = this.cleanEscapedCharacters(this.displayHtml);\n }\n\n // Create blob URL for HTML to avoid srcdoc sanitization issues\n if (this.displayHtml) {\n const blob = new Blob([this.displayHtml], { type: 'text/html' });\n this.unsafeBlobUrl = URL.createObjectURL(blob);\n // Sanitize the blob URL so Angular trusts it in the iframe\n this.htmlBlobUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.unsafeBlobUrl);\n }\n\n // Note: Markdown rendering is now handled by <mj-markdown> component in template\n\n console.log(`📦 JSON Plugin: displayHtml=${!!this.displayHtml} (${this.displayHtml?.length || 0} chars), displayMarkdown=${!!this.displayMarkdown} (${this.displayMarkdown?.length || 0} chars)`);\n console.log(`📦 isShowingElevatedDisplay=${this.isShowingElevatedDisplay}`);\n } else {\n console.log(`📦 JSON Plugin: No attributes found or query failed. Success=${result.Success}, ResultsLength=${result.Results?.length}`);\n }\n } catch (err) {\n console.error('📦 JSON Plugin: Error loading version attributes:', err);\n }\n }\n\n private parseAttributeValue(value: string | null | undefined): string | null {\n if (!value) return null;\n\n // Fix bug: Some extractors return string \"null\" instead of actual null\n if (value === 'null' || value.trim() === '') {\n return null;\n }\n\n try {\n // Try to parse as JSON first\n const parsed = JSON.parse(value);\n if (typeof parsed === 'string') {\n // Check if parsed string is also \"null\"\n if (parsed === 'null' || parsed.trim() === '') {\n return null;\n }\n return parsed;\n }\n return JSON.stringify(parsed, null, 2);\n } catch {\n // If not valid JSON, return as-is (unless it's \"null\")\n return value === 'null' ? null : value;\n }\n }\n\n onIframeLoad(): void {\n // Inject base styles if HTML doesn't have them\n if (this.htmlFrame) {\n const iframe = this.htmlFrame.nativeElement;\n const iframeDoc = iframe.contentDocument || iframe.contentWindow?.document;\n\n if (iframeDoc) {\n // Check if HTML already has styles\n const hasStyles = iframeDoc.querySelector('style') || iframeDoc.querySelector('link[rel=\"stylesheet\"]');\n\n if (!hasStyles) {\n // Inject minimal base styles for better defaults\n const style = iframeDoc.createElement('style');\n style.textContent = `\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n line-height: 1.6;\n color: #333;\n margin: 20px;\n padding: 0;\n }\n h1, h2, h3 { color: #2c3e50; margin-top: 1.5em; margin-bottom: 0.5em; }\n h1 { font-size: 2em; border-bottom: 2px solid #3498db; padding-bottom: 0.3em; }\n h2 { font-size: 1.5em; }\n table { border-collapse: collapse; width: 100%; margin: 1em 0; }\n th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }\n th { background-color: #f8f9fa; font-weight: 600; }\n pre { background: #f6f8fa; padding: 16px; border-radius: 6px; overflow-x: auto; }\n code { background: #f6f8fa; padding: 2px 6px; border-radius: 3px; font-family: monospace; }\n `;\n iframeDoc.head.appendChild(style);\n }\n\n // Inject width guardrails to prevent iframe content from causing horizontal overflow\n const widthOverride = iframeDoc.createElement('style');\n widthOverride.textContent = `\n html, body {\n max-width: 100% !important;\n overflow-x: hidden !important;\n }\n body {\n margin: 20px 10px 5px 20px !important; /* top right bottom left */\n padding: 0 !important;\n box-sizing: border-box !important;\n }\n img, svg, table, pre {\n max-width: 100% !important;\n }\n `;\n iframeDoc.head.appendChild(widthOverride);\n\n console.log('📦 Iframe loaded, hasStyles:', !!hasStyles);\n\n // Auto-resize iframe to fit content\n this.resizeIframeToContent();\n }\n }\n }\n\n private resizeIframeToContent(): void {\n if (this.htmlFrame) {\n const iframe = this.htmlFrame.nativeElement;\n const iframeDoc = iframe.contentDocument || iframe.contentWindow?.document;\n\n if (iframeDoc && iframeDoc.body) {\n // Get the actual content height\n const contentHeight = Math.max(\n iframeDoc.body.scrollHeight,\n iframeDoc.body.offsetHeight,\n iframeDoc.documentElement.scrollHeight,\n iframeDoc.documentElement.offsetHeight\n );\n\n // Set iframe height to match content (with a bit of padding)\n iframe.style.height = `${contentHeight + 20}px`;\n\n console.log('📦 Iframe resized - Height:', contentHeight + 20, 'px');\n }\n }\n }\n\n openInNewWindow(): void {\n if (this.displayHtml) {\n const newWindow = window.open('', '_blank');\n if (newWindow) {\n newWindow.document.write(this.displayHtml);\n newWindow.document.close();\n }\n }\n }\n\n printHtml(): void {\n if (this.htmlFrame) {\n const iframe = this.htmlFrame.nativeElement;\n const iframeWindow = iframe.contentWindow;\n if (iframeWindow) {\n iframeWindow.focus();\n iframeWindow.print();\n }\n }\n }\n\n onCopy(): void {\n // Copy based on what's being displayed - prioritize displayHtml\n const content = this.displayHtml || this.displayMarkdown || this.jsonContent;\n if (content) {\n navigator.clipboard.writeText(content).then(() => {\n console.log('✅ Copied content to clipboard');\n }).catch(err => {\n console.error('Failed to copy to clipboard:', err);\n });\n }\n }\n\n public override GetCurrentStateSnapshot(): DataSnapshot | null {\n return createJsonSnapshot(this.getRawContent(), this.getDisplayTitle());\n }\n\n /**\n * Clean up double-escaped characters that appear in LLM-generated HTML\n * Removes literal \"\\\\n\", \"\\\\t\", and \"\\\\\\\"\" which cause rendering issues\n */\n private cleanEscapedCharacters(html: string): string {\n // Remove escaped quotes (\\\" becomes \")\n let cleaned = html.replace(/\\\\\"/g, '\"');\n\n // Remove escaped newlines (\\\\n becomes nothing)\n // HTML doesn't need whitespace for formatting, and these cause display issues\n cleaned = cleaned.replace(/\\\\n/g, '');\n\n // Remove escaped tabs\n cleaned = cleaned.replace(/\\\\t/g, '');\n\n // Remove double-escaped tabs\n cleaned = cleaned.replace(/\\\\\\\\t/g, '');\n\n // Remove double-escaped newlines\n cleaned = cleaned.replace(/\\\\\\\\n/g, '');\n\n return cleaned;\n }\n}\n"]}
1
+ {"version":3,"file":"json-artifact-viewer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/plugins/json-artifact-viewer.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ViewChild, ElementRef } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseArtifactViewerPluginComponent } from '../base-artifact-viewer.component';\nimport { DataSnapshot, RunView } from '@memberjunction/core';\nimport { MJArtifactVersionAttributeEntity } from '@memberjunction/core-entities';\nimport { createJsonSnapshot } from '../../snapshot-helpers';\n\n/**\n * Viewer component for JSON artifacts.\n * Supports extract rules - shows displayMarkdown, displayHtml, or raw JSON editor (in that priority order).\n * All content is displayed in the parent's Display tab.\n */\n@Component({\n standalone: false,\n selector: 'mj-json-artifact-viewer',\n template: `\n <div class=\"json-artifact-viewer\" [ngClass]=\"cssClass\">\n <!-- Display toolbar -->\n <div class=\"display-toolbar\">\n <button class=\"btn-icon\" title=\"Copy Content\" (click)=\"onCopy()\">\n <i class=\"fas fa-copy\"></i> Copy\n </button>\n @if (displayHtml) {\n <button class=\"btn-icon\" title=\"Open in New Window\" (click)=\"openInNewWindow()\">\n <i class=\"fas fa-external-link-alt\"></i> New Window\n </button>\n <button class=\"btn-icon\" title=\"Print\" (click)=\"printHtml()\">\n <i class=\"fas fa-print\"></i> Print\n </button>\n }\n </div>\n\n <!-- Display content: priority order = displayHtml > displayMarkdown > JSON editor -->\n <div class=\"display-content\">\n @if (displayHtml && htmlBlobUrl) {\n <!-- Sandboxed iframe for rich HTML using blob URL -->\n <iframe\n #htmlFrame\n [src]=\"htmlBlobUrl\"\n sandbox=\"allow-same-origin allow-scripts allow-popups allow-popups-to-escape-sandbox allow-modals\"\n class=\"html-iframe\"\n (load)=\"onIframeLoad()\">\n </iframe>\n } @else if (displayMarkdown) {\n <div class=\"markdown-content\">\n <mj-markdown [data]=\"displayMarkdown\"\n [enableCollapsibleHeadings]=\"true\"\n [enableLineNumbers]=\"true\"\n [enableSmartypants]=\"true\"\n [enableHtml]=\"true\"></mj-markdown>\n </div>\n } @else {\n <div class=\"json-editor-container\">\n <mj-code-editor\n [(ngModel)]=\"jsonContent\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"width: 100%; height: 100%;\">\n </mj-code-editor>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n .json-artifact-viewer {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .display-toolbar {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .btn-icon {\n padding: 6px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 4px;\n cursor: pointer;\n font-size: 12px;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n }\n\n .btn-icon:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-text-disabled);\n }\n\n .display-content {\n flex: 1;\n overflow: auto;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .html-iframe {\n width: 100%;\n border: none;\n background: var(--mj-bg-surface);\n display: block;\n }\n\n .markdown-content {\n flex: 1;\n padding: 20px;\n overflow: auto;\n min-height: 0;\n background: var(--mj-bg-surface);\n }\n\n .json-editor-container {\n flex: 1;\n overflow: auto;\n min-height: 0;\n }\n `]\n})\n@RegisterClass(BaseArtifactViewerPluginComponent, 'JsonArtifactViewerPlugin')\nexport class JsonArtifactViewerComponent extends BaseArtifactViewerPluginComponent implements OnInit, OnDestroy {\n @ViewChild('htmlFrame') htmlFrame?: ElementRef<HTMLIFrameElement>;\n\n public jsonContent = '';\n public displayMarkdown: string | null = null;\n public displayHtml: string | null = null;\n public htmlBlobUrl: SafeResourceUrl | null = null;\n private versionAttributes: MJArtifactVersionAttributeEntity[] = [];\n private unsafeBlobUrl: string | null = null; // Keep unsafe URL for cleanup\n\n /**\n * JSON artifacts always have content to display (JSON editor, displayHtml, or displayMarkdown)\n */\n public override get hasDisplayContent(): boolean {\n return true;\n }\n\n constructor(\n private cdr: ChangeDetectorRef,\n private sanitizer: DomSanitizer\n ) {\n super();\n }\n\n ngOnDestroy(): void {\n // Clean up blob URL to prevent memory leaks\n if (this.unsafeBlobUrl) {\n URL.revokeObjectURL(this.unsafeBlobUrl);\n this.unsafeBlobUrl = null;\n this.htmlBlobUrl = null;\n }\n }\n\n async ngOnInit(): Promise<void> {\n this.jsonContent = this.getContent();\n\n // Load version attributes to check for extract rules\n await this.loadVersionAttributes();\n\n // Trigger change detection after async load\n this.cdr.detectChanges();\n }\n\n /**\n * Override to return true when showing extracted displayHtml or displayMarkdown.\n * Returns false when showing raw JSON editor (no extract rules available).\n */\n public override get isShowingElevatedDisplay(): boolean {\n return !!(this.displayHtml || this.displayMarkdown);\n }\n\n /**\n * Override to tell parent whether to show raw JSON tab.\n * When showing elevated display (markdown/HTML), return true so parent shows JSON tab.\n * When showing raw JSON editor, return false (no need for duplicate JSON tab).\n */\n public override get parentShouldShowRawContent(): boolean {\n return this.isShowingElevatedDisplay;\n }\n\n private async loadVersionAttributes(): Promise<void> {\n if (!this.artifactVersion?.ID) {\n console.log('📦 JSON Plugin: No artifactVersion.ID, skipping attribute load');\n return;\n }\n\n console.log(`📦 JSON Plugin: Loading attributes for version ID: ${this.artifactVersion.ID}`);\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJArtifactVersionAttributeEntity>({\n EntityName: 'MJ: Artifact Version Attributes',\n ExtraFilter: `ArtifactVersionID='${this.artifactVersion.ID}'`,\n ResultType: 'entity_object'\n });\n\n console.log(`📦 JSON Plugin: RunView completed. Success=${result.Success}, Results count=${result.Results?.length || 0}`);\n\n if (result.Success && result.Results) {\n this.versionAttributes = result.Results;\n\n console.log(`📦 JSON Plugin: Loaded ${this.versionAttributes.length} attributes for version ${this.artifactVersion.ID}`);\n console.log(`📦 Attributes:`, this.versionAttributes.map(a => ({ name: a.Name, hasValue: !!a.Value })));\n\n // Check for displayHtml and displayMarkdown attributes (from extract rules)\n // Priority: displayHtml > displayMarkdown\n const displayHtmlAttr = this.versionAttributes.find(a => a.Name?.toLowerCase() === 'displayhtml');\n const displayMarkdownAttr = this.versionAttributes.find(a => a.Name?.toLowerCase() === 'displaymarkdown');\n\n console.log(`📦 displayHtmlAttr:`, displayHtmlAttr ? { name: displayHtmlAttr.Name, valueLength: displayHtmlAttr.Value?.length } : 'not found');\n console.log(`📦 displayMarkdownAttr:`, displayMarkdownAttr ? { name: displayMarkdownAttr.Name, valueLength: displayMarkdownAttr.Value?.length } : 'not found');\n\n // Parse attribute values - fix \"null\" string bug\n this.displayHtml = this.parseAttributeValue(displayHtmlAttr?.Value);\n this.displayMarkdown = this.parseAttributeValue(displayMarkdownAttr?.Value);\n\n // Clean up double-escaped characters in HTML (from LLM generation)\n if (this.displayHtml) {\n this.displayHtml = this.cleanEscapedCharacters(this.displayHtml);\n }\n\n // Create blob URL for HTML to avoid srcdoc sanitization issues\n if (this.displayHtml) {\n const blob = new Blob([this.displayHtml], { type: 'text/html' });\n this.unsafeBlobUrl = URL.createObjectURL(blob);\n // Sanitize the blob URL so Angular trusts it in the iframe\n this.htmlBlobUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.unsafeBlobUrl);\n }\n\n // Note: Markdown rendering is now handled by <mj-markdown> component in template\n\n console.log(`📦 JSON Plugin: displayHtml=${!!this.displayHtml} (${this.displayHtml?.length || 0} chars), displayMarkdown=${!!this.displayMarkdown} (${this.displayMarkdown?.length || 0} chars)`);\n console.log(`📦 isShowingElevatedDisplay=${this.isShowingElevatedDisplay}`);\n } else {\n console.log(`📦 JSON Plugin: No attributes found or query failed. Success=${result.Success}, ResultsLength=${result.Results?.length}`);\n }\n } catch (err) {\n console.error('📦 JSON Plugin: Error loading version attributes:', err);\n }\n }\n\n private parseAttributeValue(value: string | null | undefined): string | null {\n if (!value) return null;\n\n // Fix bug: Some extractors return string \"null\" instead of actual null\n if (value === 'null' || value.trim() === '') {\n return null;\n }\n\n try {\n // Try to parse as JSON first\n const parsed = JSON.parse(value);\n if (typeof parsed === 'string') {\n // Check if parsed string is also \"null\"\n if (parsed === 'null' || parsed.trim() === '') {\n return null;\n }\n return parsed;\n }\n return JSON.stringify(parsed, null, 2);\n } catch {\n // If not valid JSON, return as-is (unless it's \"null\")\n return value === 'null' ? null : value;\n }\n }\n\n onIframeLoad(): void {\n // Inject base styles if HTML doesn't have them\n if (this.htmlFrame) {\n const iframe = this.htmlFrame.nativeElement;\n const iframeDoc = iframe.contentDocument || iframe.contentWindow?.document;\n\n if (iframeDoc) {\n // Check if HTML already has styles\n const hasStyles = iframeDoc.querySelector('style') || iframeDoc.querySelector('link[rel=\"stylesheet\"]');\n\n if (!hasStyles) {\n // Inject minimal base styles for better defaults\n const style = iframeDoc.createElement('style');\n style.textContent = `\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n line-height: 1.6;\n color: #333;\n margin: 20px;\n padding: 0;\n }\n h1, h2, h3 { color: #2c3e50; margin-top: 1.5em; margin-bottom: 0.5em; }\n h1 { font-size: 2em; border-bottom: 2px solid #3498db; padding-bottom: 0.3em; }\n h2 { font-size: 1.5em; }\n table { border-collapse: collapse; width: 100%; margin: 1em 0; }\n th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }\n th { background-color: #f8f9fa; font-weight: 600; }\n pre { background: #f6f8fa; padding: 16px; border-radius: 6px; overflow-x: auto; }\n code { background: #f6f8fa; padding: 2px 6px; border-radius: 3px; font-family: monospace; }\n `;\n iframeDoc.head.appendChild(style);\n }\n\n // Inject width guardrails to prevent iframe content from causing horizontal overflow\n const widthOverride = iframeDoc.createElement('style');\n widthOverride.textContent = `\n html, body {\n max-width: 100% !important;\n overflow-x: hidden !important;\n }\n body {\n margin: 20px 10px 5px 20px !important; /* top right bottom left */\n padding: 0 !important;\n box-sizing: border-box !important;\n }\n img, svg, table, pre {\n max-width: 100% !important;\n }\n `;\n iframeDoc.head.appendChild(widthOverride);\n\n console.log('📦 Iframe loaded, hasStyles:', !!hasStyles);\n\n // Auto-resize iframe to fit content\n this.resizeIframeToContent();\n }\n }\n }\n\n private resizeIframeToContent(): void {\n if (this.htmlFrame) {\n const iframe = this.htmlFrame.nativeElement;\n const iframeDoc = iframe.contentDocument || iframe.contentWindow?.document;\n\n if (iframeDoc && iframeDoc.body) {\n // Get the actual content height\n const contentHeight = Math.max(\n iframeDoc.body.scrollHeight,\n iframeDoc.body.offsetHeight,\n iframeDoc.documentElement.scrollHeight,\n iframeDoc.documentElement.offsetHeight\n );\n\n // Set iframe height to match content (with a bit of padding)\n iframe.style.height = `${contentHeight + 20}px`;\n\n console.log('📦 Iframe resized - Height:', contentHeight + 20, 'px');\n }\n }\n }\n\n openInNewWindow(): void {\n if (this.displayHtml) {\n const newWindow = window.open('', '_blank');\n if (newWindow) {\n newWindow.document.write(this.displayHtml);\n newWindow.document.close();\n }\n }\n }\n\n printHtml(): void {\n if (this.htmlFrame) {\n const iframe = this.htmlFrame.nativeElement;\n const iframeWindow = iframe.contentWindow;\n if (iframeWindow) {\n iframeWindow.focus();\n iframeWindow.print();\n }\n }\n }\n\n onCopy(): void {\n // Copy based on what's being displayed - prioritize displayHtml\n const content = this.displayHtml || this.displayMarkdown || this.jsonContent;\n if (content) {\n navigator.clipboard.writeText(content).then(() => {\n console.log('✅ Copied content to clipboard');\n }).catch(err => {\n console.error('Failed to copy to clipboard:', err);\n });\n }\n }\n\n public override GetCurrentStateSnapshot(): DataSnapshot | null {\n return createJsonSnapshot(this.getRawContent(), this.getDisplayTitle());\n }\n\n /**\n * Clean up double-escaped characters that appear in LLM-generated HTML\n * Removes literal \"\\\\n\", \"\\\\t\", and \"\\\\\\\"\" which cause rendering issues\n */\n private cleanEscapedCharacters(html: string): string {\n // Remove escaped quotes (\\\" becomes \")\n let cleaned = html.replace(/\\\\\"/g, '\"');\n\n // Remove escaped newlines (\\\\n becomes nothing)\n // HTML doesn't need whitespace for formatting, and these cause display issues\n cleaned = cleaned.replace(/\\\\n/g, '');\n\n // Remove escaped tabs\n cleaned = cleaned.replace(/\\\\t/g, '');\n\n // Remove double-escaped tabs\n cleaned = cleaned.replace(/\\\\\\\\t/g, '');\n\n // Remove double-escaped newlines\n cleaned = cleaned.replace(/\\\\\\\\n/g, '');\n\n return cleaned;\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import { EventEmitter, ChangeDetectorRef } from '@angular/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
2
3
  import { CompositeKey } from '@memberjunction/core';
3
4
  import { TreeBranchConfig, TreeNode } from '@memberjunction/ng-trees';
4
5
  import { TreeDropdownComponent } from '@memberjunction/ng-trees';
@@ -17,7 +18,7 @@ export interface SaveQueryResult {
17
18
  *
18
19
  * Follows the CreateAgentSlideInComponent pattern for slide-in UX.
19
20
  */
20
- export declare class SaveQueryPanelComponent {
21
+ export declare class SaveQueryPanelComponent extends BaseAngularComponent {
21
22
  private cdr;
22
23
  QueryName: string;
23
24
  QueryDescription: string;
@@ -1 +1 @@
1
- {"version":3,"file":"save-query-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/plugins/save-query-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAsC,iBAAiB,EAAgB,MAAM,eAAe,CAAC;AAC5I,OAAO,EAAY,YAAY,EAA4B,MAAM,sBAAsB,CAAC;AAGxF,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;;AAEjE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBAwca,uBAAuB;IAuCtB,OAAO,CAAC,GAAG;IAtCd,SAAS,SAAM;IACf,gBAAgB,SAAM;IACtB,GAAG,SAAM;IACT,IAAI,SAAM;IAET,KAAK,gCAAuC;IAC5C,SAAS,qBAA4B;IAEpB,YAAY,EAAG,qBAAqB,CAAC;IAGzD,IAAI,SAAM;IACV,WAAW,SAAM;IACjB,QAAQ,UAAS;IACjB,YAAY,SAAM;IAClB,SAAS,UAAS;IAGzB,OAAO,CAAC,kBAAkB,CAAuB;IAC1C,mBAAmB,EAAE,YAAY,GAAG,IAAI,CAAQ;IAGhD,kBAAkB,UAAS;IAC3B,wBAAwB,UAAS;IACjC,eAAe,SAAM;IACrB,mBAAmB,SAAM;IAChC,OAAO,CAAC,mBAAmB,CAAuB;IAElD,+CAA+C;IACxC,oBAAoB,EAAE,gBAAgB,CAO3C;gBAEkB,GAAG,EAAE,iBAAiB;IAE1C,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED,QAAQ,IAAI,IAAI;IAaT,WAAW,IAAI,IAAI;IAYnB,iBAAiB,CAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG,IAAI,GAAG,IAAI;IAchE,mBAAmB,IAAI,IAAI;IAQ3B,oBAAoB,IAAI,IAAI;IAQ5B,0BAA0B,CAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG,IAAI,GAAG,IAAI;IAUnE,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IA6D/B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAuD7B,QAAQ,IAAI,IAAI;IAWvB,OAAO,CAAC,qBAAqB;yCA7OlB,uBAAuB;2CAAvB,uBAAuB;CAoPnC"}
1
+ {"version":3,"file":"save-query-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/plugins/save-query-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAsC,iBAAiB,EAAgB,MAAM,eAAe,CAAC;AAC5I,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAY,YAAY,EAA4B,MAAM,sBAAsB,CAAC;AAGxF,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;;AAEjE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBAwca,uBAAwB,SAAQ,oBAAoB;IAuCnD,OAAO,CAAC,GAAG;IAtCd,SAAS,SAAM;IACf,gBAAgB,SAAM;IACtB,GAAG,SAAM;IACT,IAAI,SAAM;IAET,KAAK,gCAAuC;IAC5C,SAAS,qBAA4B;IAEpB,YAAY,EAAG,qBAAqB,CAAC;IAGzD,IAAI,SAAM;IACV,WAAW,SAAM;IACjB,QAAQ,UAAS;IACjB,YAAY,SAAM;IAClB,SAAS,UAAS;IAGzB,OAAO,CAAC,kBAAkB,CAAuB;IAC1C,mBAAmB,EAAE,YAAY,GAAG,IAAI,CAAQ;IAGhD,kBAAkB,UAAS;IAC3B,wBAAwB,UAAS;IACjC,eAAe,SAAM;IACrB,mBAAmB,SAAM;IAChC,OAAO,CAAC,mBAAmB,CAAuB;IAElD,+CAA+C;IACxC,oBAAoB,EAAE,gBAAgB,CAO3C;gBAEkB,GAAG,EAAE,iBAAiB;IAG1C,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED,QAAQ,IAAI,IAAI;IAaT,WAAW,IAAI,IAAI;IAYnB,iBAAiB,CAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG,IAAI,GAAG,IAAI;IAchE,mBAAmB,IAAI,IAAI;IAQ3B,oBAAoB,IAAI,IAAI;IAQ5B,0BAA0B,CAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG,IAAI,GAAG,IAAI;IAUnE,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IA6D/B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAuD7B,QAAQ,IAAI,IAAI;IAWvB,OAAO,CAAC,qBAAqB;yCA9OlB,uBAAuB;2CAAvB,uBAAuB;CAqPnC"}
@@ -1,5 +1,6 @@
1
1
  import { Component, Input, Output, EventEmitter, ViewChild, ChangeDetectionStrategy, HostListener } from '@angular/core';
2
- import { Metadata, CompositeKey, KeyValuePair } from '@memberjunction/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
+ import { CompositeKey, KeyValuePair } from '@memberjunction/core';
3
4
  import { MJNotificationService } from '@memberjunction/ng-notifications';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "@angular/forms";
@@ -98,7 +99,7 @@ function SaveQueryPanelComponent_Conditional_33_Template(rf, ctx) { if (rf & 1)
98
99
  *
99
100
  * Follows the CreateAgentSlideInComponent pattern for slide-in UX.
100
101
  */
101
- export class SaveQueryPanelComponent {
102
+ export class SaveQueryPanelComponent extends BaseAngularComponent {
102
103
  cdr;
103
104
  QueryName = '';
104
105
  QueryDescription = '';
@@ -132,6 +133,7 @@ export class SaveQueryPanelComponent {
132
133
  OrderBy: 'Name ASC'
133
134
  };
134
135
  constructor(cdr) {
136
+ super();
135
137
  this.cdr = cdr;
136
138
  }
137
139
  get CanSave() {
@@ -205,7 +207,7 @@ export class SaveQueryPanelComponent {
205
207
  this.CreateCategoryError = '';
206
208
  this.cdr.markForCheck();
207
209
  try {
208
- const md = new Metadata();
210
+ const md = this.ProviderToUse;
209
211
  const category = await md.GetEntityObject('MJ: Query Categories');
210
212
  category.Name = name;
211
213
  category.UserID = md.CurrentUser.ID;
@@ -259,7 +261,7 @@ export class SaveQueryPanelComponent {
259
261
  this.ErrorMessage = '';
260
262
  this.cdr.markForCheck();
261
263
  try {
262
- const md = new Metadata();
264
+ const md = this.ProviderToUse;
263
265
  const query = await md.GetEntityObject('MJ: Queries');
264
266
  query.Name = this.Name.trim();
265
267
  query.SQL = this.SQL;
@@ -329,7 +331,7 @@ export class SaveQueryPanelComponent {
329
331
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.categoryTree = _t.first);
330
332
  } }, hostBindings: function SaveQueryPanelComponent_HostBindings(rf, ctx) { if (rf & 1) {
331
333
  i0.ɵɵlistener("keydown.escape", function SaveQueryPanelComponent_keydown_escape_HostBindingHandler() { return ctx.OnEscapeKey(); }, i0.ɵɵresolveDocument);
332
- } }, inputs: { QueryName: "QueryName", QueryDescription: "QueryDescription", SQL: "SQL", Plan: "Plan" }, outputs: { Saved: "Saved", Cancelled: "Cancelled" }, standalone: false, decls: 36, vars: 17, consts: [["categoryTree", ""], [1, "sqp-backdrop", 3, "click"], [1, "sqp-panel"], [1, "sqp-header"], [1, "sqp-title-group"], [1, "fa-solid", "fa-save", "sqp-title-icon"], [1, "sqp-title"], [1, "sqp-close-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "sqp-body"], [1, "sqp-field"], [1, "sqp-label"], [1, "sqp-required"], ["type", "text", "placeholder", "Query name", 1, "sqp-input", 3, "ngModelChange", "keydown.enter", "ngModel"], [1, "sqp-label-row"], ["title", "Create new category", 1, "sqp-add-btn"], [3, "SelectionChange", "BranchConfig", "SelectionMode", "SelectableTypes", "Placeholder", "Value"], [1, "sqp-create-category"], ["placeholder", "Optional description", "rows", "3", 1, "sqp-textarea", 3, "ngModelChange", "ngModel"], [1, "sqp-error"], [1, "sqp-footer"], [1, "sqp-btn", "sqp-btn-save", 3, "click", "disabled"], [1, "sqp-btn", "sqp-btn-cancel", 3, "click", "disabled"], ["title", "Create new category", 1, "sqp-add-btn", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "sqp-create-header"], [1, "fa-solid", "fa-folder-plus"], [1, "sqp-create-fields"], ["type", "text", "placeholder", "Category name", 1, "sqp-input", 3, "ngModelChange", "keydown.enter", "keydown.escape", "ngModel"], [1, "sqp-create-parent"], [1, "sqp-sublabel"], [3, "SelectionChange", "BranchConfig", "SelectionMode", "SelectableTypes", "Placeholder"], [1, "sqp-create-actions"], [1, "sqp-btn", "sqp-btn-create", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-check"], [1, "sqp-btn", "sqp-btn-cancel-create", 3, "click", "disabled"], [1, "sqp-inline-error"], [1, "fa-solid", "fa-exclamation-circle"], [1, "fa-solid", "fa-save"]], template: function SaveQueryPanelComponent_Template(rf, ctx) { if (rf & 1) {
334
+ } }, inputs: { QueryName: "QueryName", QueryDescription: "QueryDescription", SQL: "SQL", Plan: "Plan" }, outputs: { Saved: "Saved", Cancelled: "Cancelled" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 36, vars: 17, consts: [["categoryTree", ""], [1, "sqp-backdrop", 3, "click"], [1, "sqp-panel"], [1, "sqp-header"], [1, "sqp-title-group"], [1, "fa-solid", "fa-save", "sqp-title-icon"], [1, "sqp-title"], [1, "sqp-close-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "sqp-body"], [1, "sqp-field"], [1, "sqp-label"], [1, "sqp-required"], ["type", "text", "placeholder", "Query name", 1, "sqp-input", 3, "ngModelChange", "keydown.enter", "ngModel"], [1, "sqp-label-row"], ["title", "Create new category", 1, "sqp-add-btn"], [3, "SelectionChange", "BranchConfig", "SelectionMode", "SelectableTypes", "Placeholder", "Value"], [1, "sqp-create-category"], ["placeholder", "Optional description", "rows", "3", 1, "sqp-textarea", 3, "ngModelChange", "ngModel"], [1, "sqp-error"], [1, "sqp-footer"], [1, "sqp-btn", "sqp-btn-save", 3, "click", "disabled"], [1, "sqp-btn", "sqp-btn-cancel", 3, "click", "disabled"], ["title", "Create new category", 1, "sqp-add-btn", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "sqp-create-header"], [1, "fa-solid", "fa-folder-plus"], [1, "sqp-create-fields"], ["type", "text", "placeholder", "Category name", 1, "sqp-input", 3, "ngModelChange", "keydown.enter", "keydown.escape", "ngModel"], [1, "sqp-create-parent"], [1, "sqp-sublabel"], [3, "SelectionChange", "BranchConfig", "SelectionMode", "SelectableTypes", "Placeholder"], [1, "sqp-create-actions"], [1, "sqp-btn", "sqp-btn-create", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-check"], [1, "sqp-btn", "sqp-btn-cancel-create", 3, "click", "disabled"], [1, "sqp-inline-error"], [1, "fa-solid", "fa-exclamation-circle"], [1, "fa-solid", "fa-save"]], template: function SaveQueryPanelComponent_Template(rf, ctx) { if (rf & 1) {
333
335
  const _r1 = i0.ɵɵgetCurrentView();
334
336
  i0.ɵɵelementStart(0, "div", 1);
335
337
  i0.ɵɵlistener("click", function SaveQueryPanelComponent_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.OnCancel()); });
@@ -565,5 +567,5 @@ export class SaveQueryPanelComponent {
565
567
  type: HostListener,
566
568
  args: ['document:keydown.escape']
567
569
  }] }); })();
568
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SaveQueryPanelComponent, { className: "SaveQueryPanelComponent", filePath: "src/lib/components/plugins/save-query-dialog.component.ts", lineNumber: 479 }); })();
570
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SaveQueryPanelComponent, { className: "SaveQueryPanelComponent", filePath: "src/lib/components/plugins/save-query-dialog.component.ts", lineNumber: 480 }); })();
569
571
  //# sourceMappingURL=save-query-dialog.component.js.map