@memberjunction/ng-dashboards 5.31.0 → 5.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Admin/admin-data-schema.component.d.ts +16 -0
- package/dist/Admin/admin-data-schema.component.d.ts.map +1 -0
- package/dist/Admin/admin-data-schema.component.js +136 -0
- package/dist/Admin/admin-data-schema.component.js.map +1 -0
- package/dist/Admin/admin-dev-tools-resource.component.d.ts +14 -0
- package/dist/Admin/admin-dev-tools-resource.component.d.ts.map +1 -0
- package/dist/Admin/admin-dev-tools-resource.component.js +162 -0
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -0
- package/dist/Admin/admin-identity-access.component.d.ts +15 -0
- package/dist/Admin/admin-identity-access.component.d.ts.map +1 -0
- package/dist/Admin/admin-identity-access.component.js +156 -0
- package/dist/Admin/admin-identity-access.component.js.map +1 -0
- package/dist/Admin/admin-monitoring.component.d.ts +15 -0
- package/dist/Admin/admin-monitoring.component.d.ts.map +1 -0
- package/dist/Admin/admin-monitoring.component.js +130 -0
- package/dist/Admin/admin-monitoring.component.js.map +1 -0
- package/dist/Admin/base-admin-container.component.d.ts +80 -0
- package/dist/Admin/base-admin-container.component.d.ts.map +1 -0
- package/dist/Admin/base-admin-container.component.js +198 -0
- package/dist/Admin/base-admin-container.component.js.map +1 -0
- package/dist/Admin/index.d.ts +6 -0
- package/dist/Admin/index.d.ts.map +1 -0
- package/dist/Admin/index.js +6 -0
- package/dist/Admin/index.js.map +1 -0
- package/dist/DevTools/app-state-inspector.component.d.ts +53 -0
- package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -0
- package/dist/DevTools/app-state-inspector.component.js +301 -0
- package/dist/DevTools/app-state-inspector.component.js.map +1 -0
- package/dist/DevTools/class-registry.component.d.ts +64 -0
- package/dist/DevTools/class-registry.component.d.ts.map +1 -0
- package/dist/DevTools/class-registry.component.js +423 -0
- package/dist/DevTools/class-registry.component.js.map +1 -0
- package/dist/DevTools/dev-tools-prefs.d.ts +21 -0
- package/dist/DevTools/dev-tools-prefs.d.ts.map +1 -0
- package/dist/DevTools/dev-tools-prefs.js +48 -0
- package/dist/DevTools/dev-tools-prefs.js.map +1 -0
- package/dist/DevTools/event-monitor.component.d.ts +78 -0
- package/dist/DevTools/event-monitor.component.d.ts.map +1 -0
- package/dist/DevTools/event-monitor.component.js +659 -0
- package/dist/DevTools/event-monitor.component.js.map +1 -0
- package/dist/DevTools/graphql-console.component.d.ts +153 -0
- package/dist/DevTools/graphql-console.component.d.ts.map +1 -0
- package/dist/DevTools/graphql-console.component.js +1463 -0
- package/dist/DevTools/graphql-console.component.js.map +1 -0
- package/dist/DevTools/index.d.ts +8 -0
- package/dist/DevTools/index.d.ts.map +1 -0
- package/dist/DevTools/index.js +8 -0
- package/dist/DevTools/index.js.map +1 -0
- package/dist/DevTools/layout-inspector.component.d.ts +42 -0
- package/dist/DevTools/layout-inspector.component.d.ts.map +1 -0
- package/dist/DevTools/layout-inspector.component.js +208 -0
- package/dist/DevTools/layout-inspector.component.js.map +1 -0
- package/dist/DevTools/lazy-module-status.component.d.ts +65 -0
- package/dist/DevTools/lazy-module-status.component.d.ts.map +1 -0
- package/dist/DevTools/lazy-module-status.component.js +388 -0
- package/dist/DevTools/lazy-module-status.component.js.map +1 -0
- package/dist/DevTools/settings-explorer.component.d.ts +55 -0
- package/dist/DevTools/settings-explorer.component.d.ts.map +1 -0
- package/dist/DevTools/settings-explorer.component.js +394 -0
- package/dist/DevTools/settings-explorer.component.js.map +1 -0
- package/dist/core-dashboards.module.d.ts +45 -34
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +57 -0
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +2 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +2 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +52 -52
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql-console.component.js","sourceRoot":"","sources":["../../src/DevTools/graphql-console.component.ts","../../src/DevTools/graphql-console.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ElementRef, ViewChild, HostListener, inject } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { EntityInfo, EntityFieldInfo, getGraphQLTypeNameBase } from '@memberjunction/core';\nimport { GraphQLDataProvider, FieldMapper } from '@memberjunction/graphql-dataprovider';\nimport { DevToolsPrefs } from './dev-tools-prefs';\n\ninterface HistoryEntry {\n id: string;\n query: string;\n variables: string;\n timestamp: Date;\n durationMs?: number;\n status: 'ok' | 'error' | 'pending';\n favorite: boolean;\n label?: string;\n}\n\n/** GraphQL introspection — minimal subset sufficient for the explorer. */\ninterface IntrospectedTypeRef {\n kind: 'NON_NULL' | 'LIST' | 'SCALAR' | 'OBJECT' | 'ENUM' | 'INPUT_OBJECT' | 'INTERFACE' | 'UNION' | string;\n name: string | null;\n ofType?: IntrospectedTypeRef | null;\n}\ninterface IntrospectedArg {\n name: string;\n description?: string | null;\n type: IntrospectedTypeRef;\n defaultValue?: string | null;\n}\ninterface IntrospectedField {\n name: string;\n description?: string | null;\n args: IntrospectedArg[];\n type: IntrospectedTypeRef;\n}\ninterface IntrospectedType {\n kind: string;\n name: string;\n description?: string | null;\n fields?: IntrospectedField[] | null;\n}\ninterface SchemaOperation {\n name: string;\n kind: 'query' | 'mutation';\n description: string;\n argSummary: string;\n returnSummary: string;\n field: IntrospectedField;\n}\n\ntype SidebarTab = 'history' | 'schema' | 'entities';\ntype EntityOpKind = 'view' | 'byId' | 'create' | 'update' | 'delete';\n\ninterface EntityListItem {\n info: EntityInfo;\n typeName: string;\n schema: string;\n /** True when this entity is currently expanded showing operation buttons. */\n expanded: boolean;\n}\n\nconst PREFS_KEY = 'graphqlConsole';\nconst HISTORY_LIMIT = 30;\n\nconst SAMPLE_QUERY = `# Welcome to the GraphQL Console\n# Press Cmd/Ctrl+Enter to run.\n# Authentication is handled by the active GraphQL provider.\n\nquery GetCurrentUser {\n CurrentUser {\n ID\n Name\n Email\n }\n}\n`;\n\n/**\n * GraphQL Console — write and run arbitrary GraphQL queries against the\n * connected MJ API. Re-uses the active GraphQLDataProvider client (auth +\n * session intact). Local history with copy / favorite / replay; copy-as-curl;\n * keyboard shortcut (Cmd/Ctrl+Enter) to run.\n */\n@RegisterClass(BaseResourceComponent, 'GraphQLConsoleInspector')\n@Component({\n standalone: false,\n selector: 'mj-graphql-console',\n templateUrl: './graphql-console.component.html',\n styleUrls: ['./inspector-shared.css', './graphql-console.component.css']\n})\nexport class GraphQLConsoleComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n @ViewChild('queryEditor') queryEditor?: ElementRef<HTMLTextAreaElement>;\n\n public Query = SAMPLE_QUERY;\n public Variables = '{}';\n public ShowVariables = false;\n\n public Running = false;\n public ResponseJson = '';\n public ResponseStatus: 'ok' | 'error' | 'idle' = 'idle';\n public ResponseDurationMs: number | null = null;\n public ResponseSizeBytes: number | null = null;\n public ErrorMessage: string | null = null;\n\n public History: HistoryEntry[] = [];\n public ShowHistory = true;\n public CopyConfirmed = false;\n\n public ApiUrl = '';\n\n // Schema explorer state\n public SidebarTab: SidebarTab = 'history';\n public SchemaLoading = false;\n public SchemaError: string | null = null;\n public SchemaIntrospectionDisabled = false;\n public SchemaSearch = '';\n public SchemaKindFilter: 'all' | 'query' | 'mutation' = 'all';\n public Operations: SchemaOperation[] = [];\n private schemaLoaded = false;\n\n // Entities tab state\n public EntitiesSearch = '';\n public Entities: EntityListItem[] = [];\n public EntitySchemaFilter = ''; // '' = all\n public KnownSchemas: string[] = [];\n\n // Pane sizing (resizable splitters)\n public SidebarWidthPx = 280;\n public EditorHeightPct = 50; // % of main pane height for editor (50/50 split default)\n private resizing: 'sidebar' | 'editor' | null = null;\n private elementRef = inject(ElementRef);\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public ngOnInit(): void {\n this.loadFromStorage();\n try {\n this.ApiUrl = GraphQLDataProvider.Instance.ConfigData?.URL ?? '';\n } catch { /* not configured */ }\n this.loadEntities();\n this.NotifyLoadComplete();\n }\n\n public ngOnDestroy(): void {\n this.saveToStorage();\n this.detachResizeListeners();\n }\n\n private loadEntities(): void {\n try {\n const md = this.ProviderToUse;\n if (!md) return;\n const items: EntityListItem[] = (md.Entities ?? []).map(e => ({\n info: e,\n typeName: getGraphQLTypeNameBase(e),\n schema: e.SchemaName ?? '(unknown)',\n expanded: false\n })).sort((a, b) => a.info.Name.localeCompare(b.info.Name));\n this.Entities = items;\n const schemas = new Set<string>();\n for (const i of items) schemas.add(i.schema);\n this.KnownSchemas = Array.from(schemas).sort();\n } catch { /* metadata not ready */ }\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'GraphQL Console'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-code'; }\n\n @HostListener('keydown', ['$event'])\n public OnHostKeydown(event: KeyboardEvent): void {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault();\n void this.OnRun();\n }\n }\n\n public async OnRun(): Promise<void> {\n const trimmedQuery = this.Query.trim();\n if (!trimmedQuery) {\n this.ErrorMessage = 'Query is empty.';\n return;\n }\n let parsedVars: Record<string, unknown> | null = null;\n if (this.Variables.trim()) {\n try {\n parsedVars = JSON.parse(this.Variables);\n } catch (err) {\n this.ResponseStatus = 'error';\n this.ErrorMessage = 'Variables must be valid JSON: ' + (err instanceof Error ? err.message : String(err));\n this.ResponseJson = '';\n this.cdr.markForCheck();\n return;\n }\n }\n\n this.Running = true;\n this.ErrorMessage = null;\n this.ResponseStatus = 'idle';\n this.ResponseJson = '';\n this.cdr.markForCheck();\n\n const start = performance.now();\n try {\n const data = await GraphQLDataProvider.ExecuteGQL(trimmedQuery, parsedVars);\n const elapsed = performance.now() - start;\n const text = JSON.stringify(data, null, 2);\n this.ResponseJson = text;\n this.ResponseStatus = 'ok';\n this.ResponseDurationMs = Math.round(elapsed);\n this.ResponseSizeBytes = new Blob([text]).size;\n this.recordHistory(trimmedQuery, this.Variables, 'ok', this.ResponseDurationMs);\n } catch (err: unknown) {\n const elapsed = performance.now() - start;\n this.ResponseStatus = 'error';\n this.ResponseDurationMs = Math.round(elapsed);\n const formatted = this.formatError(err);\n this.ResponseJson = formatted;\n this.ResponseSizeBytes = new Blob([formatted]).size;\n this.ErrorMessage = this.extractErrorSummary(err);\n this.recordHistory(trimmedQuery, this.Variables, 'error', this.ResponseDurationMs);\n } finally {\n this.Running = false;\n this.cdr.markForCheck();\n }\n }\n\n public OnRestoreHistory(entry: HistoryEntry): void {\n this.Query = entry.query;\n this.Variables = entry.variables;\n if (entry.variables.trim() && entry.variables.trim() !== '{}') {\n this.ShowVariables = true;\n }\n this.cdr.markForCheck();\n }\n\n public OnToggleFavorite(entry: HistoryEntry, event: Event): void {\n event.stopPropagation();\n entry.favorite = !entry.favorite;\n this.saveToStorage();\n this.cdr.markForCheck();\n }\n\n public OnDeleteHistory(entry: HistoryEntry, event: Event): void {\n event.stopPropagation();\n this.History = this.History.filter(h => h.id !== entry.id);\n this.saveToStorage();\n this.cdr.markForCheck();\n }\n\n public OnClearHistory(): void {\n // Keep favorites\n this.History = this.History.filter(h => h.favorite);\n this.saveToStorage();\n this.cdr.markForCheck();\n }\n\n public async OnCopyResponse(): Promise<void> {\n if (!this.ResponseJson) return;\n try {\n await navigator.clipboard.writeText(this.ResponseJson);\n this.CopyConfirmed = true;\n setTimeout(() => { this.CopyConfirmed = false; this.cdr.markForCheck(); }, 1800);\n this.cdr.markForCheck();\n } catch { /* unavailable */ }\n }\n\n public async OnCopyAsCurl(): Promise<void> {\n const url = this.ApiUrl || '<API_URL>';\n const body = JSON.stringify({\n query: this.Query.trim(),\n variables: this.Variables.trim() ? JSON.parse(this.Variables) : null\n });\n const escaped = body.replace(/'/g, `'\\\\''`);\n const curl = [\n `curl -X POST '${url}'`,\n ` -H 'Content-Type: application/json'`,\n ` -H 'Authorization: Bearer <YOUR_TOKEN>'`,\n ` -d '${escaped}'`\n ].join(' \\\\\\n');\n try { await navigator.clipboard.writeText(curl); } catch { /* unavailable */ }\n }\n\n public OnFormatQuery(): void {\n // Tiny pretty-printer: collapse multiple blank lines + trim trailing whitespace\n this.Query = this.Query\n .split('\\n')\n .map(line => line.replace(/\\s+$/, ''))\n .join('\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim() + '\\n';\n }\n\n public ToggleHistoryPanel(): void {\n this.ShowHistory = !this.ShowHistory;\n }\n\n public ToggleVariables(): void {\n this.ShowVariables = !this.ShowVariables;\n }\n\n public OnSidebarTabChange(tab: SidebarTab): void {\n this.SidebarTab = tab;\n this.saveToStorage();\n if (tab === 'schema' && !this.schemaLoaded && !this.SchemaLoading) {\n void this.loadSchema();\n }\n }\n\n public async OnReloadSchema(): Promise<void> {\n this.schemaLoaded = false;\n await this.loadSchema();\n }\n\n public OnInsertOperation(op: SchemaOperation, event?: MouseEvent): void {\n const template = this.buildOperationTemplate(op);\n this.insertTemplate(template, !!event?.shiftKey);\n }\n\n public OnClearQuery(): void {\n this.Query = '';\n this.saveToStorage();\n this.cdr.markForCheck();\n }\n\n public get FilteredOperations(): SchemaOperation[] {\n const q = this.SchemaSearch.trim().toLowerCase();\n return this.Operations.filter(op => {\n if (this.SchemaKindFilter !== 'all' && op.kind !== this.SchemaKindFilter) return false;\n if (!q) return true;\n return op.name.toLowerCase().includes(q)\n || op.returnSummary.toLowerCase().includes(q)\n || op.description.toLowerCase().includes(q);\n });\n }\n\n public get OperationCounts(): { all: number; query: number; mutation: number } {\n const q = this.Operations.filter(o => o.kind === 'query').length;\n const m = this.Operations.filter(o => o.kind === 'mutation').length;\n return { all: this.Operations.length, query: q, mutation: m };\n }\n\n public TrackByOp = (_i: number, o: SchemaOperation) => o.kind + ':' + o.name;\n\n // ---------- Entities tab ----------\n\n public TrackByEntity = (_i: number, e: EntityListItem) => e.info.ID;\n\n public get FilteredEntities(): EntityListItem[] {\n const q = this.EntitiesSearch.trim().toLowerCase();\n return this.Entities.filter(e => {\n if (this.EntitySchemaFilter && e.schema !== this.EntitySchemaFilter) return false;\n if (!q) return true;\n return e.info.Name.toLowerCase().includes(q)\n || e.typeName.toLowerCase().includes(q)\n || e.schema.toLowerCase().includes(q)\n || (e.info.Description ?? '').toLowerCase().includes(q);\n });\n }\n\n public ToggleEntity(e: EntityListItem): void {\n e.expanded = !e.expanded;\n }\n\n public OnEntityOp(item: EntityListItem, op: EntityOpKind, event: MouseEvent): void {\n event.stopPropagation();\n const template = this.buildEntityOpTemplate(item, op);\n this.insertTemplate(template, !!event.shiftKey);\n }\n\n /**\n * Default: replace the editor contents with the new template.\n * Shift-click: append to the end (with a blank-line separator) so the\n * user can stage multiple operations in one document.\n */\n private insertTemplate(template: string, append: boolean): void {\n const trimmed = this.Query.trimEnd();\n const isFresh = trimmed.length === 0 || trimmed === SAMPLE_QUERY.trimEnd();\n if (append && !isFresh) {\n this.Query = trimmed + '\\n\\n' + template;\n } else {\n this.Query = template;\n }\n this.saveToStorage();\n this.cdr.markForCheck();\n }\n\n private buildEntityOpTemplate(item: EntityListItem, op: EntityOpKind): string {\n const e = item.info;\n const typeName = item.typeName;\n const mapper = new FieldMapper();\n const fieldList = this.pickRepresentativeFields(e).map(name => {\n const mapped = mapper.MapFieldName(name);\n // Annotate any remapped fields so users see why the GraphQL field\n // name differs from the database column. (`__` is reserved by the\n // GraphQL spec, so MJ rewrites `__mj_*` columns to `_mj__*` over\n // the wire.)\n return mapped === name ? mapped : `${mapped} # from ${name}`;\n });\n const fieldSelection = fieldList.join('\\n ');\n const pkField = mapper.MapFieldName(e.PrimaryKeys?.[0]?.Name ?? 'ID');\n\n switch (op) {\n case 'view':\n return `# Run a dynamic view over ${e.Name}\nquery Run${typeName}DynamicView {\n Run${typeName}DynamicView(input: {\n EntityName: \"${e.Name}\"\n ExtraFilter: \"\"\n OrderBy: \"\"\n UserSearchString: \"\"\n Fields: null\n MaxRows: 100\n StartRow: 0\n IgnoreMaxRows: false\n ForceAuditLog: false\n ResultType: \"simple\"\n }) {\n Success\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n Results {\n ${fieldSelection}\n }\n }\n}\n`;\n case 'byId':\n return `# Fetch a single ${e.Name} record by primary key\nquery Run${typeName}ByID($id: String!) {\n Run${typeName}DynamicView(input: {\n EntityName: \"${e.Name}\"\n ExtraFilter: \"${pkField}='\" + $id + \"'\"\n Fields: null\n MaxRows: 1\n StartRow: 0\n IgnoreMaxRows: false\n ForceAuditLog: false\n ResultType: \"simple\"\n OrderBy: \"\"\n UserSearchString: \"\"\n }) {\n Success\n Results {\n ${fieldSelection}\n }\n }\n}\n\n# Variables (paste into the Variables panel):\n# { \"id\": \"<your-id-here>\" }\n`;\n case 'create':\n return `# Create a new ${e.Name}\nmutation Create${typeName}($input: Create${typeName}Input!) {\n Create${typeName}(input: $input) {\n ${fieldSelection}\n }\n}\n\n# Variables — populate the writable fields, then Run\n# {\n# \"input\": {\n# # required + writable fields go here\n# }\n# }\n`;\n case 'update':\n return `# Update an existing ${e.Name}\nmutation Update${typeName}($input: Update${typeName}Input!) {\n Update${typeName}(input: $input) {\n ${fieldSelection}\n }\n}\n\n# Variables — must include the primary key (${pkField})\n# {\n# \"input\": {\n# \"${pkField}\": \"<id-here>\"\n# # ...changed fields\n# }\n# }\n`;\n case 'delete':\n return `# Delete a ${e.Name}\nmutation Delete${typeName}($input: Delete${typeName}Input!) {\n Delete${typeName}(input: $input) {\n ${pkField}\n }\n}\n\n# Variables:\n# { \"input\": { \"${pkField}\": \"<id-here>\" } }\n`;\n }\n }\n\n /** Pick the first ~10 displayable fields, prioritizing primary key and common fields. */\n private pickRepresentativeFields(e: EntityInfo): string[] {\n const fields = e.Fields ?? [];\n if (fields.length === 0) return ['ID'];\n const out: string[] = [];\n const seen = new Set<string>();\n const push = (n: string) => { if (n && !seen.has(n)) { seen.add(n); out.push(n); } };\n\n for (const f of fields) {\n if (f.IsPrimaryKey) push(f.Name);\n }\n // Prefer common, lightweight fields\n for (const f of fields) {\n if (out.length >= 10) break;\n if (f.IsBinaryFieldType) continue;\n const lower = f.Name.toLowerCase();\n if (lower === 'name' || lower === 'description' || lower === 'status' || lower === 'type') {\n push(f.Name);\n }\n }\n // Fill with the rest, skipping huge / private fields\n for (const f of fields) {\n if (out.length >= 10) break;\n if (f.IsBinaryFieldType) continue;\n if (this.isExpensiveField(f)) continue;\n push(f.Name);\n }\n return out;\n }\n\n private isExpensiveField(f: EntityFieldInfo): boolean {\n const t = (f.Type ?? '').toLowerCase();\n if (t === 'nvarchar(max)' || t === 'varchar(max)' || t === 'text' || t === 'ntext') return true;\n if (t.includes('blob') || t.includes('binary') || t === 'image' || t === 'varbinary') return true;\n return false;\n }\n\n public ClearEntityFilters(): void {\n this.EntitiesSearch = '';\n this.EntitySchemaFilter = '';\n }\n\n // ---------- Resizable splitters ----------\n\n public OnSplitterDown(event: MouseEvent, kind: 'sidebar' | 'editor'): void {\n event.preventDefault();\n this.resizing = kind;\n document.addEventListener('mousemove', this.onMouseMove);\n document.addEventListener('mouseup', this.onMouseUp);\n document.body.style.cursor = kind === 'sidebar' ? 'col-resize' : 'row-resize';\n document.body.style.userSelect = 'none';\n }\n\n private onMouseMove = (e: MouseEvent): void => {\n if (!this.resizing) return;\n const host = this.elementRef.nativeElement as HTMLElement;\n if (this.resizing === 'sidebar') {\n const bodyRect = host.querySelector('.gc-body')?.getBoundingClientRect();\n if (!bodyRect) return;\n const x = e.clientX - bodyRect.left;\n this.SidebarWidthPx = Math.max(200, Math.min(560, x));\n } else if (this.resizing === 'editor') {\n const mainRect = host.querySelector('.gc-main')?.getBoundingClientRect();\n if (!mainRect) return;\n const yPct = ((e.clientY - mainRect.top) / mainRect.height) * 100;\n this.EditorHeightPct = Math.max(20, Math.min(80, yPct));\n }\n this.cdr.markForCheck();\n };\n\n private onMouseUp = (): void => {\n if (!this.resizing) return;\n this.resizing = null;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.detachResizeListeners();\n this.saveToStorage();\n };\n\n private detachResizeListeners(): void {\n document.removeEventListener('mousemove', this.onMouseMove);\n document.removeEventListener('mouseup', this.onMouseUp);\n }\n\n public get FormattedSize(): string {\n if (this.ResponseSizeBytes == null) return '';\n const b = this.ResponseSizeBytes;\n if (b < 1024) return `${b} B`;\n if (b < 1024 * 1024) return `${(b / 1024).toFixed(1)} KB`;\n return `${(b / 1024 / 1024).toFixed(2)} MB`;\n }\n\n public TrackByHistory = (_i: number, h: HistoryEntry) => h.id;\n\n // ---------- private ----------\n\n private recordHistory(query: string, variables: string, status: 'ok' | 'error', durationMs: number): void {\n const entry: HistoryEntry = {\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n query,\n variables,\n timestamp: new Date(),\n durationMs,\n status,\n favorite: false,\n label: this.deriveLabel(query)\n };\n // De-dupe: if last non-favorite entry has the same query+vars, replace it instead of stacking\n const last = this.History[0];\n if (last && !last.favorite && last.query === query && last.variables === variables) {\n this.History[0] = entry;\n } else {\n this.History = [entry, ...this.History];\n }\n // Trim history (preserve favorites)\n if (this.History.length > HISTORY_LIMIT) {\n const favorites = this.History.filter(h => h.favorite);\n const nonFavorites = this.History.filter(h => !h.favorite).slice(0, HISTORY_LIMIT - favorites.length);\n this.History = [...favorites, ...nonFavorites].sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n }\n this.saveToStorage();\n }\n\n private deriveLabel(query: string): string {\n const m = query.match(/(query|mutation|subscription)\\s+(\\w+)/);\n if (m) return `${m[1]} ${m[2]}`;\n const firstField = query.match(/[\\{\\s](\\w+)\\s*[\\(\\{]/);\n if (firstField) return firstField[1];\n return 'unnamed';\n }\n\n private formatError(err: unknown): string {\n if (err && typeof err === 'object') {\n const e = err as { response?: { errors?: unknown[] }; message?: string };\n if (e.response?.errors) {\n return JSON.stringify({ errors: e.response.errors }, null, 2);\n }\n if (e.message) {\n return JSON.stringify({ error: e.message }, null, 2);\n }\n }\n return JSON.stringify({ error: String(err) }, null, 2);\n }\n\n private extractErrorSummary(err: unknown): string {\n if (err && typeof err === 'object') {\n const e = err as { response?: { errors?: Array<{ message?: string }> }; message?: string };\n if (e.response?.errors?.[0]?.message) return e.response.errors[0].message!;\n if (e.message) return e.message;\n }\n return String(err);\n }\n\n private loadFromStorage(): void {\n const parsed = DevToolsPrefs.Get<{\n history?: HistoryEntry[];\n query?: string;\n variables?: string;\n sidebarTab?: SidebarTab;\n schemaKindFilter?: 'all' | 'query' | 'mutation';\n entitiesSearch?: string;\n entitySchemaFilter?: string;\n sidebarWidthPx?: number;\n editorHeightPct?: number;\n }>(PREFS_KEY);\n if (!parsed) return;\n if (parsed.history) {\n this.History = parsed.history.map(h => ({ ...h, timestamp: new Date(h.timestamp) }));\n }\n if (parsed.query) this.Query = parsed.query;\n if (parsed.variables) this.Variables = parsed.variables;\n if (parsed.sidebarTab) this.SidebarTab = parsed.sidebarTab;\n if (parsed.schemaKindFilter) this.SchemaKindFilter = parsed.schemaKindFilter;\n if (parsed.entitiesSearch) this.EntitiesSearch = parsed.entitiesSearch;\n if (parsed.entitySchemaFilter) this.EntitySchemaFilter = parsed.entitySchemaFilter;\n if (typeof parsed.sidebarWidthPx === 'number') this.SidebarWidthPx = parsed.sidebarWidthPx;\n if (typeof parsed.editorHeightPct === 'number') this.EditorHeightPct = parsed.editorHeightPct;\n }\n\n private saveToStorage(): void {\n DevToolsPrefs.Save(PREFS_KEY, {\n history: this.History,\n query: this.Query,\n variables: this.Variables,\n sidebarTab: this.SidebarTab,\n schemaKindFilter: this.SchemaKindFilter,\n entitiesSearch: this.EntitiesSearch,\n entitySchemaFilter: this.EntitySchemaFilter,\n sidebarWidthPx: this.SidebarWidthPx,\n editorHeightPct: this.EditorHeightPct\n });\n }\n\n // ---------- schema introspection ----------\n\n private async loadSchema(): Promise<void> {\n this.SchemaLoading = true;\n this.SchemaError = null;\n this.SchemaIntrospectionDisabled = false;\n this.cdr.markForCheck();\n try {\n const data = await GraphQLDataProvider.ExecuteGQL(INTROSPECTION_QUERY, null);\n const schema = (data as { __schema?: { queryType?: { name: string }; mutationType?: { name: string } | null; types: IntrospectedType[] } }).__schema;\n if (!schema) throw new Error('No __schema in introspection response');\n\n const queryTypeName = schema.queryType?.name;\n const mutationTypeName = schema.mutationType?.name;\n const ops: SchemaOperation[] = [];\n\n for (const type of schema.types) {\n if (type.name === queryTypeName) {\n for (const f of type.fields ?? []) ops.push(this.toOperation(f, 'query'));\n } else if (type.name === mutationTypeName) {\n for (const f of type.fields ?? []) ops.push(this.toOperation(f, 'mutation'));\n }\n }\n\n ops.sort((a, b) => {\n if (a.kind !== b.kind) return a.kind === 'query' ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n this.Operations = ops;\n this.schemaLoaded = true;\n } catch (err: unknown) {\n // Detect introspection-disabled (Apollo + most servers in production)\n const errStr = this.extractErrorSummary(err);\n const code = this.extractErrorCode(err);\n const looksDisabled =\n code === 'INTROSPECTION_DISABLED' ||\n code === 'GRAPHQL_VALIDATION_FAILED' ||\n /__schema|__type|introspection/i.test(errStr);\n\n if (looksDisabled) {\n this.SchemaIntrospectionDisabled = true;\n this.SchemaError = null;\n } else {\n // Trim huge stack-laden messages — show first 240 chars\n this.SchemaError = errStr.length > 240 ? errStr.slice(0, 240) + '…' : errStr;\n }\n } finally {\n this.SchemaLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n private extractErrorCode(err: unknown): string | undefined {\n if (err && typeof err === 'object') {\n const e = err as { response?: { errors?: Array<{ extensions?: { code?: string } }> } };\n return e.response?.errors?.[0]?.extensions?.code;\n }\n return undefined;\n }\n\n private toOperation(field: IntrospectedField, kind: 'query' | 'mutation'): SchemaOperation {\n const argSummary = field.args.length === 0\n ? ''\n : field.args.map(a => `${a.name}: ${this.typeRefToString(a.type)}`).join(', ');\n return {\n name: field.name,\n kind,\n description: field.description ?? '',\n argSummary,\n returnSummary: this.typeRefToString(field.type),\n field\n };\n }\n\n private typeRefToString(t: IntrospectedTypeRef | null | undefined): string {\n if (!t) return '?';\n if (t.kind === 'NON_NULL') return this.typeRefToString(t.ofType) + '!';\n if (t.kind === 'LIST') return '[' + this.typeRefToString(t.ofType) + ']';\n return t.name ?? '?';\n }\n\n private isObjectReturn(t: IntrospectedTypeRef): boolean {\n let cur: IntrospectedTypeRef | null | undefined = t;\n while (cur && (cur.kind === 'NON_NULL' || cur.kind === 'LIST')) cur = cur.ofType;\n return !!cur && (cur.kind === 'OBJECT' || cur.kind === 'INTERFACE' || cur.kind === 'UNION');\n }\n\n private buildOperationTemplate(op: SchemaOperation): string {\n const opNameUpper = op.name.charAt(0).toUpperCase() + op.name.slice(1);\n const f = op.field;\n\n // Variable declarations + arg passing\n let varDecls = '';\n let argPass = '';\n if (f.args.length > 0) {\n varDecls = '(' + f.args.map(a => `$${a.name}: ${this.typeRefToString(a.type)}`).join(', ') + ')';\n argPass = '(' + f.args.map(a => `${a.name}: $${a.name}`).join(', ') + ')';\n }\n\n const isObject = this.isObjectReturn(f.type);\n const selection = isObject\n ? ' {\\n # TODO: select fields from ' + this.typeRefToString(f.type) + '\\n }'\n : '';\n\n return `${op.kind} ${opNameUpper}${varDecls} {\\n ${op.name}${argPass}${selection}\\n}\\n`;\n }\n}\n\nconst INTROSPECTION_QUERY = `\nquery MJDevToolsIntrospection {\n __schema {\n queryType { name }\n mutationType { name }\n types {\n kind\n name\n description\n fields(includeDeprecated: false) {\n name\n description\n args {\n name\n description\n type { ...TypeRef }\n defaultValue\n }\n type { ...TypeRef }\n }\n }\n }\n}\nfragment TypeRef on __Type {\n kind\n name\n ofType { kind name ofType { kind name ofType { kind name ofType { kind name } } } }\n}\n`;\n","<div class=\"mj-inspector mj-inspector--solo\">\n <div class=\"mj-inspector__header\">\n <div class=\"mj-inspector__header-icon\"><i class=\"fa-solid fa-code\"></i></div>\n <div>\n <h3 class=\"mj-inspector__header-title\">GraphQL Console</h3>\n <div class=\"mj-inspector__header-sub\">\n @if (ApiUrl) {\n Connected to <code class=\"gc-endpoint\">{{ ApiUrl }}</code>\n } @else {\n Run queries against the connected MJ API\n }\n </div>\n </div>\n <span class=\"mj-inspector__header-spacer\"></span>\n <div class=\"mj-inspector__header-actions\">\n <button class=\"mj-inspector__btn\"\n [class.gc-toggle--active]=\"ShowHistory\"\n type=\"button\" (click)=\"ToggleHistoryPanel()\"\n title=\"Toggle history sidebar\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i> History\n </button>\n <button class=\"mj-inspector__btn\" type=\"button\" (click)=\"OnCopyAsCurl()\" title=\"Copy as cURL command\">\n <i class=\"fa-solid fa-terminal\"></i> Copy cURL\n </button>\n </div>\n </div>\n\n <div class=\"gc-body\">\n @if (ShowHistory) {\n <aside class=\"gc-sidebar\" [style.width.px]=\"SidebarWidthPx\">\n <div class=\"gc-sidebar-tabs\">\n <button type=\"button\"\n class=\"gc-sidebar-tab\"\n [class.gc-sidebar-tab--active]=\"SidebarTab === 'history'\"\n (click)=\"OnSidebarTabChange('history')\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i> History\n </button>\n <button type=\"button\"\n class=\"gc-sidebar-tab\"\n [class.gc-sidebar-tab--active]=\"SidebarTab === 'entities'\"\n (click)=\"OnSidebarTabChange('entities')\">\n <i class=\"fa-solid fa-table-list\"></i> Entities\n </button>\n <button type=\"button\"\n class=\"gc-sidebar-tab\"\n [class.gc-sidebar-tab--active]=\"SidebarTab === 'schema'\"\n (click)=\"OnSidebarTabChange('schema')\">\n <i class=\"fa-solid fa-sitemap\"></i> Schema\n </button>\n </div>\n\n @if (SidebarTab === 'history') {\n <div class=\"gc-history-head\">\n <span>{{ History.length }} {{ History.length === 1 ? 'entry' : 'entries' }}</span>\n <button class=\"gc-history-clear\"\n type=\"button\"\n (click)=\"OnClearHistory()\"\n title=\"Clear non-favorite history\">\n <i class=\"fa-solid fa-broom\"></i>\n </button>\n </div>\n @if (History.length === 0) {\n <div class=\"gc-history-empty\">\n <i class=\"fa-regular fa-circle-question\"></i>\n Run a query to see it here. Star <i class=\"fa-solid fa-star\"></i> to keep it.\n </div>\n } @else {\n <div class=\"gc-history-list\">\n @for (h of History; track TrackByHistory($index, h)) {\n <button type=\"button\"\n class=\"gc-history-item\"\n [class.gc-history-item--error]=\"h.status === 'error'\"\n [class.gc-history-item--fav]=\"h.favorite\"\n (click)=\"OnRestoreHistory(h)\">\n <div class=\"gc-history-item-head\">\n <i class=\"gc-history-status\"\n [class.fa-solid]=\"true\"\n [class.fa-circle-check]=\"h.status === 'ok'\"\n [class.fa-circle-xmark]=\"h.status === 'error'\"\n [class.gc-status--ok]=\"h.status === 'ok'\"\n [class.gc-status--err]=\"h.status === 'error'\"></i>\n <span class=\"gc-history-label\">{{ h.label || 'unnamed' }}</span>\n <button class=\"gc-history-fav\"\n type=\"button\"\n (click)=\"OnToggleFavorite(h, $event)\"\n [title]=\"h.favorite ? 'Unfavorite' : 'Favorite'\">\n <i [class]=\"h.favorite ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n <button class=\"gc-history-del\"\n type=\"button\"\n (click)=\"OnDeleteHistory(h, $event)\"\n title=\"Remove from history\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"gc-history-meta\">\n <span>{{ h.timestamp | date:'HH:mm:ss' }}</span>\n @if (h.durationMs != null) {\n <span>·</span>\n <span>{{ h.durationMs }}ms</span>\n }\n </div>\n </button>\n }\n </div>\n }\n } @else if (SidebarTab === 'entities') {\n <div class=\"gc-ent-toolbar\">\n <div class=\"gc-ent-search-wrap\">\n <i class=\"fa-solid fa-search gc-ent-search-icon\"></i>\n <input type=\"search\"\n class=\"gc-ent-search\"\n placeholder=\"Search entities…\"\n [(ngModel)]=\"EntitiesSearch\" />\n </div>\n @if (KnownSchemas.length > 1) {\n <select class=\"gc-ent-schema\" [(ngModel)]=\"EntitySchemaFilter\">\n <option value=\"\">All schemas ({{ KnownSchemas.length }})</option>\n @for (s of KnownSchemas; track s) {\n <option [value]=\"s\">{{ s }}</option>\n }\n </select>\n }\n </div>\n <div class=\"gc-ent-meta\">\n <span>{{ FilteredEntities.length }} of {{ Entities.length }}</span>\n <span class=\"gc-ent-hint\">Click an entity to see operations</span>\n </div>\n <div class=\"gc-ent-list\">\n @for (item of FilteredEntities; track TrackByEntity($index, item)) {\n <div class=\"gc-ent-card\" [class.gc-ent-card--expanded]=\"item.expanded\">\n <button type=\"button\"\n class=\"gc-ent-row\"\n (click)=\"ToggleEntity(item)\">\n <i class=\"fa-solid fa-chevron-right gc-ent-chev\"\n [class.gc-ent-chev--down]=\"item.expanded\"></i>\n <div class=\"gc-ent-info\">\n <div class=\"gc-ent-name\">{{ item.info.Name }}</div>\n <div class=\"gc-ent-meta-row\">\n <code class=\"gc-ent-typename\">{{ item.typeName }}</code>\n <span class=\"gc-ent-schema-badge\">{{ item.schema }}</span>\n </div>\n </div>\n </button>\n @if (item.expanded) {\n <div class=\"gc-ent-actions\">\n <button type=\"button\" class=\"gc-ent-op gc-ent-op--read\"\n (click)=\"OnEntityOp(item, 'view', $event)\"\n title=\"Insert a Run View template (Shift-click to append)\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n Run view\n </button>\n <button type=\"button\" class=\"gc-ent-op gc-ent-op--read\"\n (click)=\"OnEntityOp(item, 'byId', $event)\"\n title=\"Fetch a single record by ID (Shift-click to append)\">\n <i class=\"fa-solid fa-fingerprint\"></i>\n Get by ID\n </button>\n @if (item.info.AllowCreateAPI) {\n <button type=\"button\" class=\"gc-ent-op gc-ent-op--write\"\n (click)=\"OnEntityOp(item, 'create', $event)\"\n title=\"Create a new record (Shift-click to append)\">\n <i class=\"fa-solid fa-plus\"></i>\n Create\n </button>\n }\n @if (item.info.AllowUpdateAPI) {\n <button type=\"button\" class=\"gc-ent-op gc-ent-op--write\"\n (click)=\"OnEntityOp(item, 'update', $event)\"\n title=\"Update an existing record (Shift-click to append)\">\n <i class=\"fa-solid fa-pen\"></i>\n Update\n </button>\n }\n @if (item.info.AllowDeleteAPI) {\n <button type=\"button\" class=\"gc-ent-op gc-ent-op--danger\"\n (click)=\"OnEntityOp(item, 'delete', $event)\"\n title=\"Delete a record (Shift-click to append)\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </button>\n }\n </div>\n @if (item.info.Description) {\n <div class=\"gc-ent-desc\">{{ item.info.Description }}</div>\n }\n }\n </div>\n }\n @if (FilteredEntities.length === 0) {\n <div class=\"gc-ent-empty\">\n <i class=\"fa-solid fa-search\"></i>\n <span>No entities match.</span>\n @if (EntitiesSearch || EntitySchemaFilter) {\n <button class=\"gc-ent-clear\" type=\"button\" (click)=\"ClearEntityFilters()\">\n Clear filters\n </button>\n }\n </div>\n }\n </div>\n } @else {\n <div class=\"gc-schema-toolbar\">\n <div class=\"gc-schema-search-wrap\">\n <i class=\"fa-solid fa-search gc-schema-search-icon\"></i>\n <input type=\"search\"\n class=\"gc-schema-search\"\n placeholder=\"Search operations…\"\n [(ngModel)]=\"SchemaSearch\" />\n </div>\n <button class=\"gc-schema-reload\"\n type=\"button\"\n (click)=\"OnReloadSchema()\"\n [disabled]=\"SchemaLoading\"\n title=\"Reload schema\">\n <i class=\"fa-solid\" [class.fa-rotate]=\"!SchemaLoading\" [class.fa-spinner]=\"SchemaLoading\" [class.fa-spin]=\"SchemaLoading\"></i>\n </button>\n </div>\n\n @if (Operations.length > 0) {\n <div class=\"gc-schema-kinds\">\n <button type=\"button\"\n class=\"gc-schema-kind\"\n [class.gc-schema-kind--active]=\"SchemaKindFilter === 'all'\"\n (click)=\"SchemaKindFilter = 'all'\">\n All <span>{{ OperationCounts.all }}</span>\n </button>\n <button type=\"button\"\n class=\"gc-schema-kind gc-schema-kind--query\"\n [class.gc-schema-kind--active]=\"SchemaKindFilter === 'query'\"\n (click)=\"SchemaKindFilter = 'query'\">\n <i class=\"fa-solid fa-magnifying-glass\"></i> Query <span>{{ OperationCounts.query }}</span>\n </button>\n <button type=\"button\"\n class=\"gc-schema-kind gc-schema-kind--mutation\"\n [class.gc-schema-kind--active]=\"SchemaKindFilter === 'mutation'\"\n (click)=\"SchemaKindFilter = 'mutation'\">\n <i class=\"fa-solid fa-pen\"></i> Mutation <span>{{ OperationCounts.mutation }}</span>\n </button>\n </div>\n }\n\n @if (SchemaLoading) {\n <div class=\"gc-schema-state\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Introspecting schema…</span>\n </div>\n } @else if (SchemaIntrospectionDisabled) {\n <div class=\"gc-schema-state gc-schema-disabled\">\n <i class=\"fa-solid fa-lock\"></i>\n <div class=\"gc-schema-disabled-title\">Introspection disabled</div>\n <div class=\"gc-schema-disabled-body\">\n This server has GraphQL introspection turned off (typical in production). Schema browsing isn't available — write queries directly in the editor, or use the History tab to revisit previous queries.\n </div>\n </div>\n } @else if (SchemaError) {\n <div class=\"gc-schema-state gc-schema-state--err\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <div class=\"gc-schema-err-title\">Couldn't load schema</div>\n <div class=\"gc-schema-err-body\">{{ SchemaError }}</div>\n </div>\n } @else if (FilteredOperations.length === 0) {\n <div class=\"gc-schema-state\">\n <i class=\"fa-solid fa-search\"></i>\n <span>No operations match.</span>\n </div>\n } @else {\n <div class=\"gc-schema-list\">\n @for (op of FilteredOperations; track TrackByOp($index, op)) {\n <button type=\"button\"\n class=\"gc-schema-op\"\n [class.gc-schema-op--mutation]=\"op.kind === 'mutation'\"\n (click)=\"OnInsertOperation(op, $event)\"\n [title]=\"(op.description || ('Insert ' + op.kind + ' template')) + ' · Shift-click to append'\">\n <div class=\"gc-schema-op-head\">\n <span class=\"gc-schema-op-kind\">{{ op.kind }}</span>\n <span class=\"gc-schema-op-name\">{{ op.name }}</span>\n </div>\n @if (op.argSummary) {\n <div class=\"gc-schema-op-args\">({{ op.argSummary }})</div>\n }\n <div class=\"gc-schema-op-return\">\n <i class=\"fa-solid fa-arrow-right\"></i> {{ op.returnSummary }}\n </div>\n @if (op.description) {\n <div class=\"gc-schema-op-desc\">{{ op.description }}</div>\n }\n </button>\n }\n </div>\n }\n }\n </aside>\n <div class=\"gc-splitter gc-splitter--vert\"\n (mousedown)=\"OnSplitterDown($event, 'sidebar')\"\n title=\"Drag to resize sidebar\"></div>\n }\n\n <div class=\"gc-main\">\n <div class=\"gc-editor-wrap\" [style.flex]=\"'0 0 ' + EditorHeightPct + '%'\">\n <div class=\"gc-editor-head\">\n <span class=\"gc-editor-label\">Query</span>\n <span class=\"gc-editor-hint\">⌘/Ctrl+Enter to run · Shift+click an entity/op to append</span>\n <button class=\"gc-mini-btn\" type=\"button\" (click)=\"OnFormatQuery()\" title=\"Tidy whitespace\">\n <i class=\"fa-solid fa-broom\"></i> Tidy\n </button>\n <button class=\"gc-mini-btn gc-mini-btn--danger\" type=\"button\" (click)=\"OnClearQuery()\" title=\"Clear editor\">\n <i class=\"fa-solid fa-eraser\"></i> Clear\n </button>\n </div>\n <mj-code-editor\n class=\"gc-editor\"\n [(ngModel)]=\"Query\"\n [language]=\"'graphql'\"\n [lineWrapping]=\"true\"\n placeholder=\"Enter your GraphQL query…\">\n </mj-code-editor>\n </div>\n\n <div class=\"gc-splitter gc-splitter--horiz\"\n (mousedown)=\"OnSplitterDown($event, 'editor')\"\n title=\"Drag to resize editor / response\"></div>\n\n <div class=\"gc-vars-wrap\">\n <button class=\"gc-vars-toggle\" type=\"button\" (click)=\"ToggleVariables()\">\n <i class=\"fa-solid fa-chevron-right gc-vars-chev\" [class.gc-vars-chev--down]=\"ShowVariables\"></i>\n Variables\n @if (Variables && Variables.trim() !== '{}' && Variables.trim() !== '') {\n <span class=\"gc-vars-pill\">configured</span>\n }\n </button>\n @if (ShowVariables) {\n <mj-code-editor\n class=\"gc-editor gc-editor--vars\"\n [(ngModel)]=\"Variables\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n placeholder=\"{}\">\n </mj-code-editor>\n }\n </div>\n\n <div class=\"gc-run-bar\">\n <button class=\"gc-run-btn\"\n type=\"button\"\n [disabled]=\"Running\"\n (click)=\"OnRun()\">\n @if (Running) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Running…\n } @else {\n <i class=\"fa-solid fa-play\"></i> Run\n }\n </button>\n @if (ResponseStatus !== 'idle') {\n <div class=\"gc-run-meta\">\n @if (ResponseStatus === 'ok') {\n <span class=\"gc-status-badge gc-status-badge--ok\">\n <i class=\"fa-solid fa-circle-check\"></i> 200 OK\n </span>\n } @else {\n <span class=\"gc-status-badge gc-status-badge--err\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i> Error\n </span>\n }\n @if (ResponseDurationMs != null) {\n <span class=\"gc-meta-pill\"><i class=\"fa-regular fa-clock\"></i> {{ ResponseDurationMs }}ms</span>\n }\n @if (ResponseSizeBytes != null) {\n <span class=\"gc-meta-pill\"><i class=\"fa-solid fa-database\"></i> {{ FormattedSize }}</span>\n }\n </div>\n }\n <span class=\"gc-spacer\"></span>\n @if (ResponseJson) {\n <button class=\"mj-inspector__btn\"\n [class.mj-inspector__btn--success]=\"CopyConfirmed\"\n type=\"button\"\n (click)=\"OnCopyResponse()\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\"></i>\n {{ CopyConfirmed ? 'Copied' : 'Copy' }}\n </button>\n }\n </div>\n\n <div class=\"gc-response-wrap\">\n <div class=\"gc-response-head\">\n <span class=\"gc-editor-label\">Response</span>\n </div>\n @if (ErrorMessage && !ResponseJson) {\n <div class=\"gc-error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ ErrorMessage }}</span>\n </div>\n } @else if (ResponseJson) {\n @if (ErrorMessage) {\n <div class=\"gc-error gc-error--inline\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ ErrorMessage }}</span>\n </div>\n }\n <pre class=\"gc-response\"><code>{{ ResponseJson }}</code></pre>\n } @else {\n <div class=\"gc-empty\">\n <i class=\"fa-solid fa-arrow-up-from-bracket\"></i>\n <span>Run a query to see results here.</span>\n </div>\n }\n </div>\n </div>\n </div>\n</div>\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './app-state-inspector.component';
|
|
2
|
+
export * from './layout-inspector.component';
|
|
3
|
+
export * from './class-registry.component';
|
|
4
|
+
export * from './lazy-module-status.component';
|
|
5
|
+
export * from './settings-explorer.component';
|
|
6
|
+
export * from './event-monitor.component';
|
|
7
|
+
export * from './graphql-console.component';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/DevTools/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './app-state-inspector.component';
|
|
2
|
+
export * from './layout-inspector.component';
|
|
3
|
+
export * from './class-registry.component';
|
|
4
|
+
export * from './lazy-module-status.component';
|
|
5
|
+
export * from './settings-explorer.component';
|
|
6
|
+
export * from './event-monitor.component';
|
|
7
|
+
export * from './graphql-console.component';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/DevTools/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC","sourcesContent":["export * from './app-state-inspector.component';\nexport * from './layout-inspector.component';\nexport * from './class-registry.component';\nexport * from './lazy-module-status.component';\nexport * from './settings-explorer.component';\nexport * from './event-monitor.component';\nexport * from './graphql-console.component';\n"]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';
|
|
2
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
3
|
+
import { WorkspaceStateManager, GoldenLayoutManager } from '@memberjunction/ng-base-application';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
interface LayoutSection {
|
|
6
|
+
id: 'workspace' | 'golden';
|
|
7
|
+
label: string;
|
|
8
|
+
icon: string;
|
|
9
|
+
description: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Layout Inspector — read-only view of the current workspace + Golden Layout
|
|
13
|
+
* configuration. Replaces the legacy "Log Layout (Debug)" user-menu item that
|
|
14
|
+
* only printed to console.
|
|
15
|
+
*/
|
|
16
|
+
export declare class LayoutInspectorComponent extends BaseResourceComponent implements OnInit, OnDestroy {
|
|
17
|
+
private cdr;
|
|
18
|
+
private workspace;
|
|
19
|
+
private layout;
|
|
20
|
+
Sections: LayoutSection[];
|
|
21
|
+
ActiveSection: 'workspace' | 'golden';
|
|
22
|
+
LayoutJson: string;
|
|
23
|
+
CopyConfirmed: boolean;
|
|
24
|
+
LastRefreshed: Date;
|
|
25
|
+
constructor(cdr: ChangeDetectorRef, workspace: WorkspaceStateManager, layout: GoldenLayoutManager);
|
|
26
|
+
ngOnInit(): void;
|
|
27
|
+
ngOnDestroy(): void;
|
|
28
|
+
GetResourceDisplayName(): Promise<string>;
|
|
29
|
+
GetResourceIconClass(): Promise<string>;
|
|
30
|
+
OnSectionClick(section: LayoutSection): void;
|
|
31
|
+
refresh(): void;
|
|
32
|
+
OnCopy(): Promise<void>;
|
|
33
|
+
OnDownload(): void;
|
|
34
|
+
get LastRefreshedLabel(): string;
|
|
35
|
+
get SectionLabel(): string;
|
|
36
|
+
private computeData;
|
|
37
|
+
private jsonReplacer;
|
|
38
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LayoutInspectorComponent, never>;
|
|
39
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LayoutInspectorComponent, "mj-layout-inspector", never, {}, {}, never, never, false, never>;
|
|
40
|
+
}
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=layout-inspector.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-inspector.component.d.ts","sourceRoot":"","sources":["../../src/DevTools/layout-inspector.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;;AAGjG,UAAU,aAAa;IACnB,EAAE,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,qBAOa,wBAAyB,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IAaxF,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IAbX,QAAQ,EAAE,aAAa,EAAE,CAG9B;IAEK,aAAa,EAAE,WAAW,GAAG,QAAQ,CAAe;IACpD,UAAU,SAAQ;IAClB,aAAa,UAAS;IACtB,aAAa,OAAc;gBAGtB,GAAG,EAAE,iBAAiB,EACtB,SAAS,EAAE,qBAAqB,EAChC,MAAM,EAAE,mBAAmB;IAKhC,QAAQ,IAAI,IAAI;IAOP,WAAW,IAAI,IAAI;IAKb,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IACzC,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAEtD,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAO5C,OAAO,IAAI,IAAI;IAMT,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAc7B,UAAU,IAAI,IAAI;IAWzB,IAAW,kBAAkB,IAAI,MAAM,CAEtC;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAID,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,YAAY;yCAlGX,wBAAwB;2CAAxB,wBAAwB;CAyGpC"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Component } from '@angular/core';
|
|
8
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
9
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
10
|
+
import { DevToolsPrefs } from './dev-tools-prefs';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "@memberjunction/ng-base-application";
|
|
13
|
+
import * as i2 from "@angular/forms";
|
|
14
|
+
import * as i3 from "@memberjunction/ng-code-editor";
|
|
15
|
+
const _forTrack0 = ($index, $item) => $item.id;
|
|
16
|
+
function LayoutInspectorComponent_For_22_Template(rf, ctx) { if (rf & 1) {
|
|
17
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
18
|
+
i0.ɵɵelementStart(0, "button", 23);
|
|
19
|
+
i0.ɵɵlistener("click", function LayoutInspectorComponent_For_22_Template_button_click_0_listener() { const section_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnSectionClick(section_r2)); });
|
|
20
|
+
i0.ɵɵelement(1, "i", 24);
|
|
21
|
+
i0.ɵɵelementStart(2, "div", 25)(3, "div", 26);
|
|
22
|
+
i0.ɵɵtext(4);
|
|
23
|
+
i0.ɵɵelementEnd();
|
|
24
|
+
i0.ɵɵelementStart(5, "div", 27);
|
|
25
|
+
i0.ɵɵtext(6);
|
|
26
|
+
i0.ɵɵelementEnd()()();
|
|
27
|
+
} if (rf & 2) {
|
|
28
|
+
const section_r2 = ctx.$implicit;
|
|
29
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
30
|
+
i0.ɵɵclassProp("mj-inspector__nav-item--active", ctx_r2.ActiveSection === section_r2.id);
|
|
31
|
+
i0.ɵɵadvance();
|
|
32
|
+
i0.ɵɵclassMap(section_r2.icon);
|
|
33
|
+
i0.ɵɵadvance(3);
|
|
34
|
+
i0.ɵɵtextInterpolate(section_r2.label);
|
|
35
|
+
i0.ɵɵadvance(2);
|
|
36
|
+
i0.ɵɵtextInterpolate(section_r2.description);
|
|
37
|
+
} }
|
|
38
|
+
/**
|
|
39
|
+
* Layout Inspector — read-only view of the current workspace + Golden Layout
|
|
40
|
+
* configuration. Replaces the legacy "Log Layout (Debug)" user-menu item that
|
|
41
|
+
* only printed to console.
|
|
42
|
+
*/
|
|
43
|
+
let LayoutInspectorComponent = class LayoutInspectorComponent extends BaseResourceComponent {
|
|
44
|
+
cdr;
|
|
45
|
+
workspace;
|
|
46
|
+
layout;
|
|
47
|
+
Sections = [
|
|
48
|
+
{ id: 'workspace', label: 'Workspace State', icon: 'fa-solid fa-table-columns', description: 'Tabs, active tab, app state' },
|
|
49
|
+
{ id: 'golden', label: 'Golden Layout', icon: 'fa-solid fa-window-restore', description: 'Active layout JSON config' }
|
|
50
|
+
];
|
|
51
|
+
ActiveSection = 'workspace';
|
|
52
|
+
LayoutJson = '{}';
|
|
53
|
+
CopyConfirmed = false;
|
|
54
|
+
LastRefreshed = new Date();
|
|
55
|
+
constructor(cdr, workspace, layout) {
|
|
56
|
+
super();
|
|
57
|
+
this.cdr = cdr;
|
|
58
|
+
this.workspace = workspace;
|
|
59
|
+
this.layout = layout;
|
|
60
|
+
}
|
|
61
|
+
ngOnInit() {
|
|
62
|
+
const p = DevToolsPrefs.Get('layoutInspector');
|
|
63
|
+
if (p?.activeSection)
|
|
64
|
+
this.ActiveSection = p.activeSection;
|
|
65
|
+
this.refresh();
|
|
66
|
+
this.NotifyLoadComplete();
|
|
67
|
+
}
|
|
68
|
+
ngOnDestroy() {
|
|
69
|
+
DevToolsPrefs.Save('layoutInspector', { activeSection: this.ActiveSection });
|
|
70
|
+
super.ngOnDestroy();
|
|
71
|
+
}
|
|
72
|
+
async GetResourceDisplayName() { return 'Layout Inspector'; }
|
|
73
|
+
async GetResourceIconClass() { return 'fa-solid fa-table-columns'; }
|
|
74
|
+
OnSectionClick(section) {
|
|
75
|
+
if (this.ActiveSection === section.id)
|
|
76
|
+
return;
|
|
77
|
+
this.ActiveSection = section.id;
|
|
78
|
+
DevToolsPrefs.Save('layoutInspector', { activeSection: this.ActiveSection });
|
|
79
|
+
this.refresh();
|
|
80
|
+
}
|
|
81
|
+
refresh() {
|
|
82
|
+
this.LayoutJson = JSON.stringify(this.computeData(), this.jsonReplacer, 2);
|
|
83
|
+
this.LastRefreshed = new Date();
|
|
84
|
+
this.cdr.markForCheck();
|
|
85
|
+
}
|
|
86
|
+
async OnCopy() {
|
|
87
|
+
try {
|
|
88
|
+
await navigator.clipboard.writeText(this.LayoutJson);
|
|
89
|
+
this.CopyConfirmed = true;
|
|
90
|
+
this.cdr.markForCheck();
|
|
91
|
+
setTimeout(() => {
|
|
92
|
+
this.CopyConfirmed = false;
|
|
93
|
+
this.cdr.markForCheck();
|
|
94
|
+
}, 1800);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// clipboard unavailable
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
OnDownload() {
|
|
101
|
+
const blob = new Blob([this.LayoutJson], { type: 'application/json' });
|
|
102
|
+
const url = URL.createObjectURL(blob);
|
|
103
|
+
const a = document.createElement('a');
|
|
104
|
+
a.href = url;
|
|
105
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
106
|
+
a.download = `mj-layout-${this.ActiveSection}-${stamp}.json`;
|
|
107
|
+
a.click();
|
|
108
|
+
URL.revokeObjectURL(url);
|
|
109
|
+
}
|
|
110
|
+
get LastRefreshedLabel() {
|
|
111
|
+
return this.LastRefreshed.toLocaleTimeString();
|
|
112
|
+
}
|
|
113
|
+
get SectionLabel() {
|
|
114
|
+
return this.Sections.find(s => s.id === this.ActiveSection)?.label ?? '';
|
|
115
|
+
}
|
|
116
|
+
// ---------- private ----------
|
|
117
|
+
computeData() {
|
|
118
|
+
if (this.ActiveSection === 'workspace') {
|
|
119
|
+
return this.workspace.GetConfiguration();
|
|
120
|
+
}
|
|
121
|
+
// Golden Layout: GoldenLayoutManager exposes its raw config when active
|
|
122
|
+
const layoutAny = this.layout;
|
|
123
|
+
if (typeof layoutAny.GetCurrentLayoutConfig === 'function') {
|
|
124
|
+
return layoutAny.GetCurrentLayoutConfig();
|
|
125
|
+
}
|
|
126
|
+
if (layoutAny.CurrentConfig !== undefined) {
|
|
127
|
+
return layoutAny.CurrentConfig;
|
|
128
|
+
}
|
|
129
|
+
return { note: 'Golden Layout config is not currently exposed by GoldenLayoutManager.' };
|
|
130
|
+
}
|
|
131
|
+
jsonReplacer(_key, value) {
|
|
132
|
+
if (value instanceof Date)
|
|
133
|
+
return value.toISOString();
|
|
134
|
+
if (value instanceof Map)
|
|
135
|
+
return Object.fromEntries(value.entries());
|
|
136
|
+
if (value instanceof Set)
|
|
137
|
+
return Array.from(value);
|
|
138
|
+
if (typeof value === 'function')
|
|
139
|
+
return `[Function ${value.name || 'anonymous'}]`;
|
|
140
|
+
return value;
|
|
141
|
+
}
|
|
142
|
+
static ɵfac = function LayoutInspectorComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || LayoutInspectorComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.WorkspaceStateManager), i0.ɵɵdirectiveInject(i1.GoldenLayoutManager)); };
|
|
143
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LayoutInspectorComponent, selectors: [["mj-layout-inspector"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 31, vars: 14, consts: [[1, "mj-inspector"], [1, "mj-inspector__header"], [1, "mj-inspector__header-icon"], [1, "fa-solid", "fa-table-columns"], [1, "mj-inspector__header-title"], [1, "mj-inspector__header-sub"], [1, "mj-inspector__header-spacer"], [1, "mj-inspector__header-actions"], ["type", "button", "title", "Refresh", 1, "mj-inspector__btn", 3, "click"], [1, "fa-solid", "fa-rotate"], ["type", "button", 1, "mj-inspector__btn", 3, "click", "title"], [1, "fa-solid"], ["type", "button", "title", "Download as JSON", 1, "mj-inspector__btn", 3, "click"], [1, "fa-solid", "fa-download"], [1, "mj-inspector__body"], [1, "mj-inspector__sidebar"], ["type", "button", 1, "mj-inspector__nav-item", 3, "mj-inspector__nav-item--active"], [1, "mj-inspector__content"], [1, "mj-inspector__content-head"], [1, "mj-inspector__content-title"], [1, "mj-inspector__content-meta"], [1, "mj-inspector__editor"], [3, "ngModelChange", "ngModel", "language", "readonly", "lineWrapping"], ["type", "button", 1, "mj-inspector__nav-item", 3, "click"], [1, "mj-inspector__nav-icon"], [1, "mj-inspector__nav-text"], [1, "mj-inspector__nav-label"], [1, "mj-inspector__nav-desc"]], template: function LayoutInspectorComponent_Template(rf, ctx) { if (rf & 1) {
|
|
144
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
|
|
145
|
+
i0.ɵɵelement(3, "i", 3);
|
|
146
|
+
i0.ɵɵelementEnd();
|
|
147
|
+
i0.ɵɵelementStart(4, "div")(5, "h3", 4);
|
|
148
|
+
i0.ɵɵtext(6, "Layout Inspector");
|
|
149
|
+
i0.ɵɵelementEnd();
|
|
150
|
+
i0.ɵɵelementStart(7, "div", 5);
|
|
151
|
+
i0.ɵɵtext(8, "Workspace + Golden Layout configuration");
|
|
152
|
+
i0.ɵɵelementEnd()();
|
|
153
|
+
i0.ɵɵelement(9, "span", 6);
|
|
154
|
+
i0.ɵɵelementStart(10, "div", 7)(11, "button", 8);
|
|
155
|
+
i0.ɵɵlistener("click", function LayoutInspectorComponent_Template_button_click_11_listener() { return ctx.refresh(); });
|
|
156
|
+
i0.ɵɵelement(12, "i", 9);
|
|
157
|
+
i0.ɵɵtext(13, " Refresh ");
|
|
158
|
+
i0.ɵɵelementEnd();
|
|
159
|
+
i0.ɵɵelementStart(14, "button", 10);
|
|
160
|
+
i0.ɵɵlistener("click", function LayoutInspectorComponent_Template_button_click_14_listener() { return ctx.OnCopy(); });
|
|
161
|
+
i0.ɵɵelement(15, "i", 11);
|
|
162
|
+
i0.ɵɵtext(16);
|
|
163
|
+
i0.ɵɵelementEnd();
|
|
164
|
+
i0.ɵɵelementStart(17, "button", 12);
|
|
165
|
+
i0.ɵɵlistener("click", function LayoutInspectorComponent_Template_button_click_17_listener() { return ctx.OnDownload(); });
|
|
166
|
+
i0.ɵɵelement(18, "i", 13);
|
|
167
|
+
i0.ɵɵelementEnd()()();
|
|
168
|
+
i0.ɵɵelementStart(19, "div", 14)(20, "aside", 15);
|
|
169
|
+
i0.ɵɵrepeaterCreate(21, LayoutInspectorComponent_For_22_Template, 7, 6, "button", 16, _forTrack0);
|
|
170
|
+
i0.ɵɵelementEnd();
|
|
171
|
+
i0.ɵɵelementStart(23, "div", 17)(24, "div", 18)(25, "h4", 19);
|
|
172
|
+
i0.ɵɵtext(26);
|
|
173
|
+
i0.ɵɵelementEnd();
|
|
174
|
+
i0.ɵɵelementStart(27, "span", 20);
|
|
175
|
+
i0.ɵɵtext(28);
|
|
176
|
+
i0.ɵɵelementEnd()();
|
|
177
|
+
i0.ɵɵelementStart(29, "div", 21)(30, "mj-code-editor", 22);
|
|
178
|
+
i0.ɵɵtwoWayListener("ngModelChange", function LayoutInspectorComponent_Template_mj_code_editor_ngModelChange_30_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.LayoutJson, $event) || (ctx.LayoutJson = $event); return $event; });
|
|
179
|
+
i0.ɵɵelementEnd()()()()();
|
|
180
|
+
} if (rf & 2) {
|
|
181
|
+
i0.ɵɵadvance(14);
|
|
182
|
+
i0.ɵɵclassProp("mj-inspector__btn--success", ctx.CopyConfirmed);
|
|
183
|
+
i0.ɵɵproperty("title", ctx.CopyConfirmed ? "Copied" : "Copy JSON");
|
|
184
|
+
i0.ɵɵadvance();
|
|
185
|
+
i0.ɵɵclassProp("fa-clipboard", !ctx.CopyConfirmed)("fa-check", ctx.CopyConfirmed);
|
|
186
|
+
i0.ɵɵadvance();
|
|
187
|
+
i0.ɵɵtextInterpolate1(" ", ctx.CopyConfirmed ? "Copied" : "Copy", " ");
|
|
188
|
+
i0.ɵɵadvance(5);
|
|
189
|
+
i0.ɵɵrepeater(ctx.Sections);
|
|
190
|
+
i0.ɵɵadvance(5);
|
|
191
|
+
i0.ɵɵtextInterpolate(ctx.SectionLabel);
|
|
192
|
+
i0.ɵɵadvance(2);
|
|
193
|
+
i0.ɵɵtextInterpolate1("Refreshed ", ctx.LastRefreshedLabel);
|
|
194
|
+
i0.ɵɵadvance(2);
|
|
195
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx.LayoutJson);
|
|
196
|
+
i0.ɵɵproperty("language", "json")("readonly", true)("lineWrapping", true);
|
|
197
|
+
} }, dependencies: [i2.NgControlStatus, i2.NgModel, i3.CodeEditorComponent], styles: ["[_nghost-%COMP%] { display: block; height: 100%; }\n\n.mj-inspector[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n font-family: inherit;\n}\n\n\n\n.mj-inspector__header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n.mj-inspector__header-icon[_ngcontent-%COMP%] {\n width: 36px; height: 36px;\n border-radius: 9px;\n background: linear-gradient(135deg, #264FAF 0%, #0076b6 100%);\n color: white;\n display: flex; align-items: center; justify-content: center;\n font-size: 15px;\n flex-shrink: 0;\n}\n.mj-inspector__header-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n letter-spacing: -0.2px;\n}\n.mj-inspector__header-sub[_ngcontent-%COMP%] {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n.mj-inspector__header-spacer[_ngcontent-%COMP%] { flex: 1; }\n.mj-inspector__header-actions[_ngcontent-%COMP%] {\n display: flex; gap: 6px;\n}\n.mj-inspector__btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n border-radius: 7px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n font-family: inherit;\n transition: all 0.15s;\n}\n.mj-inspector__btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n.mj-inspector__btn--success[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 30%, var(--mj-border-default));\n}\n\n\n\n.mj-inspector__body[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.mj-inspector__sidebar[_ngcontent-%COMP%] {\n width: 220px;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n overflow-y: auto;\n flex-shrink: 0;\n padding: 8px;\n}\n.mj-inspector__nav-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.12s;\n margin-bottom: 2px;\n font-family: inherit;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n text-align: left;\n width: 100%;\n}\n.mj-inspector__nav-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n.mj-inspector__nav-item--active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n.mj-inspector__nav-item--active[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n}\n.mj-inspector__nav-icon[_ngcontent-%COMP%] {\n width: 18px;\n text-align: center;\n font-size: 13px;\n margin-top: 1px;\n flex-shrink: 0;\n color: inherit;\n}\n.mj-inspector__nav-text[_ngcontent-%COMP%] { flex: 1; min-width: 0; }\n.mj-inspector__nav-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n}\n.mj-inspector__nav-desc[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 3px;\n line-height: 1.3;\n}\n.mj-inspector__nav-item--active[_ngcontent-%COMP%] .mj-inspector__nav-desc[_ngcontent-%COMP%] {\n color: color-mix(in srgb, var(--mj-brand-primary) 70%, var(--mj-text-muted));\n}\n\n\n\n.mj-inspector__content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n}\n.mj-inspector__content-head[_ngcontent-%COMP%] {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface-card);\n}\n.mj-inspector__content-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.mj-inspector__content-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-inspector__editor[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.mj-inspector__editor[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n\n\n.mj-inspector__empty[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n@media (max-width: 700px) {\n .mj-inspector__body[_ngcontent-%COMP%] { flex-direction: column; }\n .mj-inspector__sidebar[_ngcontent-%COMP%] {\n width: 100%;\n height: auto;\n max-height: 200px;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n }\n .mj-inspector__nav-item[_ngcontent-%COMP%] { flex: 1 1 calc(50% - 8px); margin-bottom: 0; }\n .mj-inspector__nav-desc[_ngcontent-%COMP%] { display: none; }\n .mj-inspector__header[_ngcontent-%COMP%] { padding: 12px 14px; gap: 10px; }\n}"] });
|
|
198
|
+
};
|
|
199
|
+
LayoutInspectorComponent = __decorate([
|
|
200
|
+
RegisterClass(BaseResourceComponent, 'LayoutInspector')
|
|
201
|
+
], LayoutInspectorComponent);
|
|
202
|
+
export { LayoutInspectorComponent };
|
|
203
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LayoutInspectorComponent, [{
|
|
204
|
+
type: Component,
|
|
205
|
+
args: [{ standalone: false, selector: 'mj-layout-inspector', template: "<div class=\"mj-inspector\">\n <div class=\"mj-inspector__header\">\n <div class=\"mj-inspector__header-icon\"><i class=\"fa-solid fa-table-columns\"></i></div>\n <div>\n <h3 class=\"mj-inspector__header-title\">Layout Inspector</h3>\n <div class=\"mj-inspector__header-sub\">Workspace + Golden Layout configuration</div>\n </div>\n <span class=\"mj-inspector__header-spacer\"></span>\n <div class=\"mj-inspector__header-actions\">\n <button class=\"mj-inspector__btn\" type=\"button\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\"></i> Refresh\n </button>\n <button class=\"mj-inspector__btn\"\n [class.mj-inspector__btn--success]=\"CopyConfirmed\"\n type=\"button\" (click)=\"OnCopy()\"\n [title]=\"CopyConfirmed ? 'Copied' : 'Copy JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\"></i>\n {{ CopyConfirmed ? 'Copied' : 'Copy' }}\n </button>\n <button class=\"mj-inspector__btn\" type=\"button\" (click)=\"OnDownload()\" title=\"Download as JSON\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"mj-inspector__body\">\n <aside class=\"mj-inspector__sidebar\">\n @for (section of Sections; track section.id) {\n <button type=\"button\"\n class=\"mj-inspector__nav-item\"\n [class.mj-inspector__nav-item--active]=\"ActiveSection === section.id\"\n (click)=\"OnSectionClick(section)\">\n <i class=\"mj-inspector__nav-icon\" [class]=\"section.icon\"></i>\n <div class=\"mj-inspector__nav-text\">\n <div class=\"mj-inspector__nav-label\">{{ section.label }}</div>\n <div class=\"mj-inspector__nav-desc\">{{ section.description }}</div>\n </div>\n </button>\n }\n </aside>\n\n <div class=\"mj-inspector__content\">\n <div class=\"mj-inspector__content-head\">\n <h4 class=\"mj-inspector__content-title\">{{ SectionLabel }}</h4>\n <span class=\"mj-inspector__content-meta\">Refreshed {{ LastRefreshedLabel }}</span>\n </div>\n <div class=\"mj-inspector__editor\">\n <mj-code-editor\n [(ngModel)]=\"LayoutJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host { display: block; height: 100%; }\n\n.mj-inspector {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n font-family: inherit;\n}\n\n/* Header */\n.mj-inspector__header {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n.mj-inspector__header-icon {\n width: 36px; height: 36px;\n border-radius: 9px;\n background: linear-gradient(135deg, #264FAF 0%, #0076b6 100%);\n color: white;\n display: flex; align-items: center; justify-content: center;\n font-size: 15px;\n flex-shrink: 0;\n}\n.mj-inspector__header-title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n letter-spacing: -0.2px;\n}\n.mj-inspector__header-sub {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n.mj-inspector__header-spacer { flex: 1; }\n.mj-inspector__header-actions {\n display: flex; gap: 6px;\n}\n.mj-inspector__btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n border-radius: 7px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n font-family: inherit;\n transition: all 0.15s;\n}\n.mj-inspector__btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n.mj-inspector__btn--success {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 30%, var(--mj-border-default));\n}\n\n/* Layout: sidebar + content */\n.mj-inspector__body {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.mj-inspector__sidebar {\n width: 220px;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n overflow-y: auto;\n flex-shrink: 0;\n padding: 8px;\n}\n.mj-inspector__nav-item {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.12s;\n margin-bottom: 2px;\n font-family: inherit;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n text-align: left;\n width: 100%;\n}\n.mj-inspector__nav-item:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n.mj-inspector__nav-item--active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n.mj-inspector__nav-item--active:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n}\n.mj-inspector__nav-icon {\n width: 18px;\n text-align: center;\n font-size: 13px;\n margin-top: 1px;\n flex-shrink: 0;\n color: inherit;\n}\n.mj-inspector__nav-text { flex: 1; min-width: 0; }\n.mj-inspector__nav-label {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n}\n.mj-inspector__nav-desc {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 3px;\n line-height: 1.3;\n}\n.mj-inspector__nav-item--active .mj-inspector__nav-desc {\n color: color-mix(in srgb, var(--mj-brand-primary) 70%, var(--mj-text-muted));\n}\n\n/* Content area */\n.mj-inspector__content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n}\n.mj-inspector__content-head {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface-card);\n}\n.mj-inspector__content-title {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.mj-inspector__content-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-inspector__editor {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.mj-inspector__editor mj-code-editor {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n/* Empty state */\n.mj-inspector__empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n@media (max-width: 700px) {\n .mj-inspector__body { flex-direction: column; }\n .mj-inspector__sidebar {\n width: 100%;\n height: auto;\n max-height: 200px;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n }\n .mj-inspector__nav-item { flex: 1 1 calc(50% - 8px); margin-bottom: 0; }\n .mj-inspector__nav-desc { display: none; }\n .mj-inspector__header { padding: 12px 14px; gap: 10px; }\n}\n"] }]
|
|
206
|
+
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.WorkspaceStateManager }, { type: i1.GoldenLayoutManager }], null); })();
|
|
207
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(LayoutInspectorComponent, { className: "LayoutInspectorComponent", filePath: "src/DevTools/layout-inspector.component.ts", lineNumber: 26 }); })();
|
|
208
|
+
//# sourceMappingURL=layout-inspector.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-inspector.component.js","sourceRoot":"","sources":["../../src/DevTools/layout-inspector.component.ts","../../src/DevTools/layout-inspector.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { WorkspaceStateManager, GoldenLayoutManager } from '@memberjunction/ng-base-application';\nimport { DevToolsPrefs } from './dev-tools-prefs';\n\ninterface LayoutSection {\n id: 'workspace' | 'golden';\n label: string;\n icon: string;\n description: string;\n}\n\n/**\n * Layout Inspector — read-only view of the current workspace + Golden Layout\n * configuration. Replaces the legacy \"Log Layout (Debug)\" user-menu item that\n * only printed to console.\n */\n@RegisterClass(BaseResourceComponent, 'LayoutInspector')\n@Component({\n standalone: false,\n selector: 'mj-layout-inspector',\n templateUrl: './layout-inspector.component.html',\n styleUrls: ['./inspector-shared.css']\n})\nexport class LayoutInspectorComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n public Sections: LayoutSection[] = [\n { id: 'workspace', label: 'Workspace State', icon: 'fa-solid fa-table-columns', description: 'Tabs, active tab, app state' },\n { id: 'golden', label: 'Golden Layout', icon: 'fa-solid fa-window-restore', description: 'Active layout JSON config' }\n ];\n\n public ActiveSection: 'workspace' | 'golden' = 'workspace';\n public LayoutJson = '{}';\n public CopyConfirmed = false;\n public LastRefreshed = new Date();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private workspace: WorkspaceStateManager,\n private layout: GoldenLayoutManager\n ) {\n super();\n }\n\n public ngOnInit(): void {\n const p = DevToolsPrefs.Get<{ activeSection?: 'workspace' | 'golden' }>('layoutInspector');\n if (p?.activeSection) this.ActiveSection = p.activeSection;\n this.refresh();\n this.NotifyLoadComplete();\n }\n\n public override ngOnDestroy(): void {\n DevToolsPrefs.Save('layoutInspector', { activeSection: this.ActiveSection });\n super.ngOnDestroy();\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Layout Inspector'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-table-columns'; }\n\n public OnSectionClick(section: LayoutSection): void {\n if (this.ActiveSection === section.id) return;\n this.ActiveSection = section.id;\n DevToolsPrefs.Save('layoutInspector', { activeSection: this.ActiveSection });\n this.refresh();\n }\n\n public refresh(): void {\n this.LayoutJson = JSON.stringify(this.computeData(), this.jsonReplacer, 2);\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n }\n\n public async OnCopy(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.LayoutJson);\n this.CopyConfirmed = true;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.CopyConfirmed = false;\n this.cdr.markForCheck();\n }, 1800);\n } catch {\n // clipboard unavailable\n }\n }\n\n public OnDownload(): void {\n const blob = new Blob([this.LayoutJson], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n a.download = `mj-layout-${this.ActiveSection}-${stamp}.json`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public get SectionLabel(): string {\n return this.Sections.find(s => s.id === this.ActiveSection)?.label ?? '';\n }\n\n // ---------- private ----------\n\n private computeData(): unknown {\n if (this.ActiveSection === 'workspace') {\n return this.workspace.GetConfiguration();\n }\n // Golden Layout: GoldenLayoutManager exposes its raw config when active\n const layoutAny = this.layout as unknown as { GetCurrentLayoutConfig?: () => unknown; CurrentConfig?: unknown };\n if (typeof layoutAny.GetCurrentLayoutConfig === 'function') {\n return layoutAny.GetCurrentLayoutConfig();\n }\n if (layoutAny.CurrentConfig !== undefined) {\n return layoutAny.CurrentConfig;\n }\n return { note: 'Golden Layout config is not currently exposed by GoldenLayoutManager.' };\n }\n\n private jsonReplacer(_key: string, value: unknown): unknown {\n if (value instanceof Date) return value.toISOString();\n if (value instanceof Map) return Object.fromEntries(value.entries());\n if (value instanceof Set) return Array.from(value);\n if (typeof value === 'function') return `[Function ${(value as { name: string }).name || 'anonymous'}]`;\n return value;\n }\n}\n","<div class=\"mj-inspector\">\n <div class=\"mj-inspector__header\">\n <div class=\"mj-inspector__header-icon\"><i class=\"fa-solid fa-table-columns\"></i></div>\n <div>\n <h3 class=\"mj-inspector__header-title\">Layout Inspector</h3>\n <div class=\"mj-inspector__header-sub\">Workspace + Golden Layout configuration</div>\n </div>\n <span class=\"mj-inspector__header-spacer\"></span>\n <div class=\"mj-inspector__header-actions\">\n <button class=\"mj-inspector__btn\" type=\"button\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\"></i> Refresh\n </button>\n <button class=\"mj-inspector__btn\"\n [class.mj-inspector__btn--success]=\"CopyConfirmed\"\n type=\"button\" (click)=\"OnCopy()\"\n [title]=\"CopyConfirmed ? 'Copied' : 'Copy JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\"></i>\n {{ CopyConfirmed ? 'Copied' : 'Copy' }}\n </button>\n <button class=\"mj-inspector__btn\" type=\"button\" (click)=\"OnDownload()\" title=\"Download as JSON\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"mj-inspector__body\">\n <aside class=\"mj-inspector__sidebar\">\n @for (section of Sections; track section.id) {\n <button type=\"button\"\n class=\"mj-inspector__nav-item\"\n [class.mj-inspector__nav-item--active]=\"ActiveSection === section.id\"\n (click)=\"OnSectionClick(section)\">\n <i class=\"mj-inspector__nav-icon\" [class]=\"section.icon\"></i>\n <div class=\"mj-inspector__nav-text\">\n <div class=\"mj-inspector__nav-label\">{{ section.label }}</div>\n <div class=\"mj-inspector__nav-desc\">{{ section.description }}</div>\n </div>\n </button>\n }\n </aside>\n\n <div class=\"mj-inspector__content\">\n <div class=\"mj-inspector__content-head\">\n <h4 class=\"mj-inspector__content-title\">{{ SectionLabel }}</h4>\n <span class=\"mj-inspector__content-meta\">Refreshed {{ LastRefreshedLabel }}</span>\n </div>\n <div class=\"mj-inspector__editor\">\n <mj-code-editor\n [(ngModel)]=\"LayoutJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n </div>\n</div>\n"]}
|