@memberjunction/ng-dashboards 5.38.0 → 5.39.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 (244) hide show
  1. package/README.md +14 -7
  2. package/dist/AI/components/agents/agent-configuration.component.js +199 -198
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  5. package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
  6. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  7. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
  8. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  9. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +166 -58
  10. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  11. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  12. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +2 -1
  13. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  14. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +1 -0
  15. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  16. package/dist/AI/components/analytics/model-performance/model-performance.component.js +55 -36
  17. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  18. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +9 -1
  19. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  20. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +158 -117
  21. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  22. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +1 -0
  23. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  24. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +22 -8
  25. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  26. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +89 -856
  27. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  28. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1353 -7841
  29. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  30. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
  31. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
  32. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
  33. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
  34. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
  35. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
  36. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
  37. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
  38. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
  39. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
  40. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
  41. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
  42. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +235 -0
  43. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
  44. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1735 -0
  45. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
  46. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
  47. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
  48. package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
  49. package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
  50. package/dist/AI/components/autotagging/shared/classify.format.d.ts +43 -0
  51. package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
  52. package/dist/AI/components/autotagging/shared/classify.format.js +209 -0
  53. package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
  54. package/dist/AI/components/autotagging/shared/classify.types.d.ts +276 -0
  55. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
  56. package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
  57. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
  58. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
  59. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
  60. package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
  61. package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
  62. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +40 -0
  63. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
  64. package/dist/AI/components/autotagging/tabs/history-tab.component.js +402 -0
  65. package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
  66. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
  67. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
  68. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
  69. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
  70. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +122 -0
  71. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
  72. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +752 -0
  73. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
  74. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +166 -0
  75. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
  76. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1384 -0
  77. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
  78. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +70 -0
  79. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
  80. package/dist/AI/components/autotagging/tabs/tags-tab.component.js +448 -0
  81. package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
  82. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
  83. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
  84. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
  85. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
  86. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +47 -0
  87. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
  88. package/dist/AI/components/autotagging/tabs/types-tab.component.js +220 -0
  89. package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
  90. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +293 -289
  91. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  92. package/dist/AI/components/models/model-management.component.js +209 -208
  93. package/dist/AI/components/models/model-management.component.js.map +1 -1
  94. package/dist/AI/components/prompts/prompt-management.component.js +130 -128
  95. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  96. package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
  97. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  98. package/dist/AI/components/system/system-configuration.component.js +17 -17
  99. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  100. package/dist/AI/components/tags/tags-resource.component.js +550 -532
  101. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  102. package/dist/AI/components/vectors/vector-management-resource.component.js +1 -1
  103. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  104. package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
  105. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  106. package/dist/AI/services/ai-instrumentation.service.js +14 -2
  107. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  108. package/dist/AI/services/cache-metrics.d.ts +50 -0
  109. package/dist/AI/services/cache-metrics.d.ts.map +1 -0
  110. package/dist/AI/services/cache-metrics.js +43 -0
  111. package/dist/AI/services/cache-metrics.js.map +1 -0
  112. package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
  113. package/dist/APIKeys/api-keys-resource.component.js +132 -131
  114. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  115. package/dist/Actions/components/actions-overview.component.js +141 -141
  116. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  117. package/dist/Actions/components/execution-monitoring.component.js +15 -15
  118. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  119. package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
  120. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  121. package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
  122. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  123. package/dist/Admin/admin-data-schema.component.js +2 -2
  124. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  125. package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
  126. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  127. package/dist/Admin/admin-identity-access.component.js +2 -2
  128. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  129. package/dist/Admin/admin-monitoring.component.js +2 -2
  130. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  131. package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
  132. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  133. package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
  134. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  135. package/dist/Communication/communication-logs-resource.component.js +72 -50
  136. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  137. package/dist/Communication/communication-monitor-resource.component.js +103 -102
  138. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  139. package/dist/Communication/communication-providers-resource.component.js +52 -51
  140. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  141. package/dist/Communication/communication-runs-resource.component.js +39 -38
  142. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  143. package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
  144. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  145. package/dist/Communication/communication-templates-resource.component.js +92 -89
  146. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  147. package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
  148. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  149. package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
  150. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  151. package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
  152. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  153. package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
  154. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  155. package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
  156. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  157. package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
  158. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  159. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
  160. package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
  161. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  162. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
  163. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  164. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
  165. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  166. package/dist/DevTools/app-state-inspector.component.js +18 -17
  167. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  168. package/dist/DevTools/class-registry.component.js +88 -85
  169. package/dist/DevTools/class-registry.component.js.map +1 -1
  170. package/dist/DevTools/event-monitor.component.js +155 -150
  171. package/dist/DevTools/event-monitor.component.js.map +1 -1
  172. package/dist/DevTools/graphql-console.component.js +245 -243
  173. package/dist/DevTools/graphql-console.component.js.map +1 -1
  174. package/dist/DevTools/layout-inspector.component.js +18 -17
  175. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  176. package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
  177. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  178. package/dist/Home/home-dashboard.component.js +2 -2
  179. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  180. package/dist/Integration/components/activity/activity.component.js +236 -229
  181. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  182. package/dist/Integration/components/connections/connections.component.js +390 -389
  183. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  184. package/dist/Integration/components/overview/overview.component.js +2 -2
  185. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +2 -2
  186. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  187. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +45 -44
  188. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  189. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
  190. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  191. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
  192. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  193. package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
  194. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  195. package/dist/Lists/components/lists-browse-resource.component.js +525 -566
  196. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  197. package/dist/Lists/components/lists-categories-resource.component.js +135 -134
  198. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  199. package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
  200. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  201. package/dist/MCP/mcp-dashboard.component.js +443 -438
  202. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  203. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  204. package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
  205. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  206. package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
  207. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  208. package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
  209. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  210. package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
  211. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  212. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
  213. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  214. package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
  215. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  216. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
  217. package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
  218. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  219. package/dist/Testing/components/testing-explorer.component.js +436 -427
  220. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  221. package/dist/Testing/components/testing-runs-resource.component.js +1 -1
  222. package/dist/Testing/components/testing-runs.component.js +116 -115
  223. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  224. package/dist/Testing/testing-dashboard.component.js +6 -7
  225. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  226. package/dist/VersionHistory/components/labels-resource.component.js +173 -172
  227. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  228. package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
  229. package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
  230. package/dist/VersionHistory/components/restore-resource.component.js +116 -92
  231. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  232. package/dist/ai-dashboards.module.d.ts +47 -35
  233. package/dist/ai-dashboards.module.d.ts.map +1 -1
  234. package/dist/ai-dashboards.module.js +40 -1
  235. package/dist/ai-dashboards.module.js.map +1 -1
  236. package/dist/communication-dashboards.module.d.ts +1 -1
  237. package/dist/communication-dashboards.module.d.ts.map +1 -1
  238. package/dist/communication-dashboards.module.js +7 -1
  239. package/dist/communication-dashboards.module.js.map +1 -1
  240. package/dist/testing-dashboards.module.d.ts +4 -5
  241. package/dist/testing-dashboards.module.d.ts.map +1 -1
  242. package/dist/testing-dashboards.module.js +7 -5
  243. package/dist/testing-dashboards.module.js.map +1 -1
  244. package/package.json +55 -54
@@ -1 +1 @@
1
- {"version":3,"file":"entity-list.component.js","sourceRoot":"","sources":["../../../src/DatabaseDesigner/components/entity-list.component.ts","../../../src/DatabaseDesigner/components/entity-list.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module entity-list.component\n * @description Displays the list of entities accessible to the current user.\n *\n * Loaded from `DatabaseDesignerEngine.Instance.loadAccessibleEntities()` —\n * data access goes through the engine singleton, not this component directly,\n * so the cache is shared across wizard openings.\n */\n\nimport {\n Component, OnInit, OnDestroy, Output, EventEmitter,\n ChangeDetectionStrategy, ChangeDetectorRef, inject,\n} from '@angular/core';\nimport { Subject, BehaviorSubject, combineLatest } from 'rxjs';\nimport { debounceTime, takeUntil, map } from 'rxjs/operators';\n\nimport { DatabaseDesignerEngine } from '../services/database-designer.engine.js';\nimport type { AccessibleEntity } from '../database-designer.types.js';\n\n// ─── Sort state ───────────────────────────────────────────────────────────────\n\ntype SortField = 'entityName' | 'tableName' | 'schemaName' | 'createdAt' | 'owner';\ntype SortDirection = 'asc' | 'desc';\n\n@Component({\n standalone: false,\n selector: 'mj-database-entity-list',\n templateUrl: './entity-list.component.html',\n styleUrls: ['./entity-list.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EntityListComponent implements OnInit, OnDestroy {\n\n /** Emitted when the user clicks \"Edit\" on an entity row. */\n @Output() public readonly EditEntity = new EventEmitter<AccessibleEntity>();\n /** Emitted when the user clicks \"View Details\" on an entity row. */\n @Output() public readonly ViewEntity = new EventEmitter<AccessibleEntity>();\n /** Emitted when the user clicks \"New Entity\". */\n @Output() public readonly NewEntity = new EventEmitter<void>();\n\n public IsLoading = false;\n public ErrorMessage: string | null = null;\n\n /** Full unfiltered list from the engine. */\n private _allEntities: AccessibleEntity[] = [];\n\n /** Public accessor for the chrome's X-of-Y badge. */\n public get TotalEntityCount(): number {\n return this._allEntities.length;\n }\n\n /** Cached sorted unique schema names — recomputed only when _allEntities changes. */\n private _availableFilterSchemas: string[] = [];\n\n /** Currently displayed (filtered + sorted) rows. */\n public FilteredEntities: AccessibleEntity[] = [];\n\n private readonly _search$ = new BehaviorSubject<string>('');\n private readonly _schema$ = new BehaviorSubject<string>('');\n private readonly _sortField$ = new BehaviorSubject<SortField>('entityName');\n private readonly _sortDir$ = new BehaviorSubject<SortDirection>('asc');\n private readonly _destroy$ = new Subject<void>();\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n // ─── Lifecycle ─────────────────────────────────────────────────────────\n\n ngOnInit(): void {\n this.setupFilter();\n this.loadEntities();\n }\n\n ngOnDestroy(): void {\n this._destroy$.next();\n this._destroy$.complete();\n }\n\n // ─── Template bindings ─────────────────────────────────────────────────\n\n get SearchTerm(): string { return this._search$.value; }\n set SearchTerm(v: string) { this._search$.next(v); }\n\n get SelectedSchema(): string { return this._schema$.value; }\n set SelectedSchema(v: string) { this._schema$.next(v); }\n\n /** Unique schema names present in the loaded entity list, sorted alphabetically. */\n get AvailableFilterSchemas(): string[] { return this._availableFilterSchemas; }\n\n get SortField(): SortField { return this._sortField$.value; }\n get SortDirection(): SortDirection { return this._sortDir$.value; }\n\n /** Toggle sort: same field flips direction; new field defaults to asc. */\n public OnSortChange(field: SortField): void {\n if (this._sortField$.value === field) {\n this._sortDir$.next(this._sortDir$.value === 'asc' ? 'desc' : 'asc');\n } else {\n this._sortField$.next(field);\n this._sortDir$.next('asc');\n }\n }\n\n public OnEditEntity(entity: AccessibleEntity): void {\n this.EditEntity.emit(entity);\n }\n\n public OnViewEntity(entity: AccessibleEntity): void {\n this.ViewEntity.emit(entity);\n }\n\n public OnNewEntity(): void {\n this.NewEntity.emit();\n }\n\n public OnRefresh(): void {\n DatabaseDesignerEngine.Instance.invalidateCache();\n this.loadEntities();\n }\n\n public TrackByEntityId(_: number, entity: AccessibleEntity): string {\n return entity.entityId;\n }\n\n public FormatDate(date: Date): string {\n return date.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n }\n\n // ─── Private helpers ───────────────────────────────────────────────────\n\n private setupFilter(): void {\n combineLatest([this._search$, this._schema$, this._sortField$, this._sortDir$])\n .pipe(\n debounceTime(150),\n map(([search, schema, field, dir]) => this.applyFilterAndSort(search, schema, field, dir)),\n takeUntil(this._destroy$),\n )\n .subscribe(result => {\n this.FilteredEntities = result;\n this.cdr.markForCheck();\n });\n }\n\n private async loadEntities(): Promise<void> {\n this.IsLoading = true;\n this.ErrorMessage = null;\n this.cdr.markForCheck();\n\n try {\n this._allEntities = await DatabaseDesignerEngine.Instance.loadAccessibleEntities();\n this._availableFilterSchemas = [...new Set(this._allEntities.map(e => e.schemaName))].sort();\n // Trigger the combineLatest pipe to recalculate; reset schema filter if\n // the previously selected schema is no longer present in the new entity list.\n const schemas = this._availableFilterSchemas;\n if (this._schema$.value && !schemas.includes(this._schema$.value)) {\n this._schema$.next('');\n } else {\n this._search$.next(this._search$.value);\n }\n } catch (err) {\n this.ErrorMessage = err instanceof Error ? err.message : String(err);\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n private applyFilterAndSort(search: string, schema: string, field: SortField, dir: SortDirection): AccessibleEntity[] {\n const term = search.trim().toLowerCase();\n let results = [...this._allEntities];\n\n if (schema) {\n results = results.filter(e => e.schemaName === schema);\n }\n\n if (term) {\n results = results.filter(e =>\n e.entityName.toLowerCase().includes(term) ||\n e.tableName.toLowerCase().includes(term) ||\n e.schemaName.toLowerCase().includes(term)\n );\n }\n\n results.sort((a, b) => {\n const aVal = this.sortValue(a, field);\n const bVal = this.sortValue(b, field);\n const cmp = aVal < bVal ? -1 : aVal > bVal ? 1 : 0;\n return dir === 'asc' ? cmp : -cmp;\n });\n\n return results;\n }\n\n private sortValue(entity: AccessibleEntity, field: SortField): string | number {\n switch (field) {\n case 'entityName': return entity.entityName.toLowerCase();\n case 'tableName': return entity.tableName.toLowerCase();\n case 'schemaName': return entity.schemaName.toLowerCase();\n case 'createdAt': return entity.createdAt.getTime();\n case 'owner': return entity.isOwner ? 0 : 1;\n default: return entity.entityName.toLowerCase();\n }\n }\n}\n","<!--\n Database Designer is a sub-page of Admin → Data & Schema's left-nav shell, so\n per Section 9b/10 of plans/explorer-chrome-conventions.md we use the interior\n chrome pattern instead of <mj-page-layout> + <mj-page-header> (which would\n produce a doubled-header inside the Admin shell).\n-->\n<mj-page-header-interior\n AriaLabel=\"Database Designer\"\n Title=\"Database Designer\"\n Subtitle=\"Browse and create user-defined entities\">\n <!-- X-of-Y filtered count earns its meta spot per chrome conventions §2.\n Material on this page (~300 entities per deployment) makes the\n narrowing signal valuable. -->\n <div meta>\n <mj-stat-badge\n [Count]=\"FilteredEntities.length\"\n [Total]=\"TotalEntityCount\"\n Label=\"entities\">\n </mj-stat-badge>\n </div>\n <div actions>\n <mj-refresh-button [Loading]=\"IsLoading\" (Clicked)=\"OnRefresh()\"></mj-refresh-button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"OnNewEntity()\">\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i> New Entity\n </button>\n </div>\n <div toolbar>\n <mj-page-search\n Placeholder=\"Search by name, table, or schema...\"\n [Value]=\"SearchTerm\"\n (ValueChange)=\"SearchTerm = $event\">\n </mj-page-search>\n @if (AvailableFilterSchemas.length > 1) {\n <select\n class=\"mj-input schema-filter\"\n [value]=\"SelectedSchema\"\n (change)=\"SelectedSchema = $any($event.target).value\"\n aria-label=\"Filter by schema\">\n <option value=\"\">All Schemas</option>\n @for (schema of AvailableFilterSchemas; track schema) {\n <option [value]=\"schema\">{{ schema }}</option>\n }\n </select>\n }\n </div>\n</mj-page-header-interior>\n\n<mj-page-body-interior [Padding]=\"false\">\n <!-- ── Error ──────────────────────────────────────────────────────────── -->\n @if (ErrorMessage) {\n <div class=\"entity-list-error\" role=\"alert\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ ErrorMessage }}\n </div>\n }\n\n <!-- ── Loading skeleton ───────────────────────────────────────────────── -->\n @if (IsLoading && FilteredEntities.length === 0) {\n <div class=\"skeleton-table\" aria-busy=\"true\" aria-label=\"Loading entities…\">\n @for (_ of [1, 2, 3, 4]; track $index) {\n <div class=\"skeleton-row\">\n <div class=\"skeleton-cell wide\"></div>\n <div class=\"skeleton-cell medium\"></div>\n <div class=\"skeleton-cell narrow\"></div>\n <div class=\"skeleton-cell narrow\"></div>\n <div class=\"skeleton-cell medium\"></div>\n <div class=\"skeleton-cell narrow\"></div>\n </div>\n }\n </div>\n }\n\n <!-- ── Entity table ───────────────────────────────────────────────────── -->\n @if (!IsLoading || FilteredEntities.length > 0) {\n @if (FilteredEntities.length > 0) {\n <div class=\"table-wrap\">\n <table class=\"entity-table\" role=\"grid\" aria-label=\"User-defined entities\">\n <thead>\n <tr>\n <th class=\"col-name sortable\" (click)=\"OnSortChange('entityName')\" scope=\"col\">\n Entity Name\n <span class=\"sort-icon\">\n @if (SortField === 'entityName') {\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"SortDirection === 'asc'\" [class.fa-chevron-down]=\"SortDirection === 'desc'\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-up muted\"></i>\n }\n </span>\n </th>\n <th class=\"col-schema sortable\" (click)=\"OnSortChange('schemaName')\" scope=\"col\">\n Schema\n <span class=\"sort-icon\">\n @if (SortField === 'schemaName') {\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"SortDirection === 'asc'\" [class.fa-chevron-down]=\"SortDirection === 'desc'\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-up muted\"></i>\n }\n </span>\n </th>\n <th class=\"col-table sortable\" (click)=\"OnSortChange('tableName')\" scope=\"col\">\n Table\n <span class=\"sort-icon\">\n @if (SortField === 'tableName') {\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"SortDirection === 'asc'\" [class.fa-chevron-down]=\"SortDirection === 'desc'\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-up muted\"></i>\n }\n </span>\n </th>\n <th class=\"col-owner sortable\" (click)=\"OnSortChange('owner')\" scope=\"col\">\n Owner\n <span class=\"sort-icon\">\n @if (SortField === 'owner') {\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"SortDirection === 'asc'\" [class.fa-chevron-down]=\"SortDirection === 'desc'\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-up muted\"></i>\n }\n </span>\n </th>\n <th class=\"col-created sortable\" (click)=\"OnSortChange('createdAt')\" scope=\"col\">\n Created\n <span class=\"sort-icon\">\n @if (SortField === 'createdAt') {\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"SortDirection === 'asc'\" [class.fa-chevron-down]=\"SortDirection === 'desc'\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-up muted\"></i>\n }\n </span>\n </th>\n <th class=\"col-actions\" scope=\"col\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (entity of FilteredEntities; track TrackByEntityId($index, entity)) {\n <tr class=\"entity-row\">\n <td class=\"col-name\">\n <div class=\"entity-name-cell\">\n <span class=\"entity-name\">{{ entity.entityName }}</span>\n @if (entity.isOwner) {\n <span class=\"owner-badge owner-you\" title=\"You own this entity\">You</span>\n }\n </div>\n </td>\n <td class=\"col-schema\">\n <span class=\"schema-badge\">{{ entity.schemaName }}</span>\n </td>\n <td class=\"col-table\">\n <code class=\"table-name\">{{ entity.tableName }}</code>\n </td>\n <td class=\"col-owner\">\n @if (entity.isOwner) {\n <span class=\"owner-self\">\n <i class=\"fa-solid fa-user-check\"></i>\n You\n </span>\n } @else if (entity.ownerDisplayName) {\n <span class=\"owner-other\">{{ entity.ownerDisplayName }}</span>\n } @else {\n <span class=\"owner-other muted\">—</span>\n }\n </td>\n <td class=\"col-created\">{{ FormatDate(entity.createdAt) }}</td>\n <td class=\"col-actions\">\n <div class=\"row-actions\">\n <button\n mjButton\n buttonStyle=\"secondary\"\n class=\"action-btn\"\n title=\"Edit this entity\"\n (click)=\"OnEditEntity(entity)\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n Edit\n </button>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <div class=\"entity-count\">\n {{ FilteredEntities.length }} {{ FilteredEntities.length === 1 ? 'entity' : 'entities' }}\n @if (SearchTerm) { matching \"{{ SearchTerm }}\" }\n </div>\n } @else if (!IsLoading) {\n <!-- ── Zero state ───────────────────────────────────────────────── -->\n <div class=\"zero-state\">\n <div class=\"zero-state-icon\">\n <i class=\"fa-regular fa-rectangle-list\"></i>\n </div>\n @if (SearchTerm) {\n <h3 class=\"zero-state-title\">No entities match \"{{ SearchTerm }}\"</h3>\n <p class=\"zero-state-body\">Try a different search term or clear the filter.</p>\n <button mjButton buttonStyle=\"secondary\" (click)=\"SearchTerm = ''\">\n Clear search\n </button>\n } @else {\n <h3 class=\"zero-state-title\">No entities yet</h3>\n <p class=\"zero-state-body\">\n Create your first user-defined entity. You can also use the\n Database Designer agent in a conversation for guided design.\n </p>\n <button mjButton buttonStyle=\"primary\" (click)=\"OnNewEntity()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Entity\n </button>\n }\n </div>\n }\n }\n</mj-page-body-interior>\n"]}
1
+ {"version":3,"file":"entity-list.component.js","sourceRoot":"","sources":["../../../src/DatabaseDesigner/components/entity-list.component.ts","../../../src/DatabaseDesigner/components/entity-list.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module entity-list.component\n * @description Displays the list of entities accessible to the current user.\n *\n * Loaded from `DatabaseDesignerEngine.Instance.loadAccessibleEntities()` —\n * data access goes through the engine singleton, not this component directly,\n * so the cache is shared across wizard openings.\n */\n\nimport {\n Component, OnInit, OnDestroy, Output, EventEmitter,\n ChangeDetectionStrategy, ChangeDetectorRef, inject,\n} from '@angular/core';\nimport { Subject, BehaviorSubject, combineLatest } from 'rxjs';\nimport { debounceTime, takeUntil, map } from 'rxjs/operators';\n\nimport { DatabaseDesignerEngine } from '../services/database-designer.engine.js';\nimport type { AccessibleEntity } from '../database-designer.types.js';\n\n// ─── Sort state ───────────────────────────────────────────────────────────────\n\ntype SortField = 'entityName' | 'tableName' | 'schemaName' | 'createdAt' | 'owner';\ntype SortDirection = 'asc' | 'desc';\n\n@Component({\n standalone: false,\n selector: 'mj-database-entity-list',\n templateUrl: './entity-list.component.html',\n styleUrls: ['./entity-list.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EntityListComponent implements OnInit, OnDestroy {\n\n /** Emitted when the user clicks \"Edit\" on an entity row. */\n @Output() public readonly EditEntity = new EventEmitter<AccessibleEntity>();\n /** Emitted when the user clicks \"View Details\" on an entity row. */\n @Output() public readonly ViewEntity = new EventEmitter<AccessibleEntity>();\n /** Emitted when the user clicks \"New Entity\". */\n @Output() public readonly NewEntity = new EventEmitter<void>();\n\n public IsLoading = false;\n public ErrorMessage: string | null = null;\n\n /** Full unfiltered list from the engine. */\n private _allEntities: AccessibleEntity[] = [];\n\n /** Public accessor for the chrome's X-of-Y badge. */\n public get TotalEntityCount(): number {\n return this._allEntities.length;\n }\n\n /** Cached sorted unique schema names — recomputed only when _allEntities changes. */\n private _availableFilterSchemas: string[] = [];\n\n /** Currently displayed (filtered + sorted) rows. */\n public FilteredEntities: AccessibleEntity[] = [];\n\n private readonly _search$ = new BehaviorSubject<string>('');\n private readonly _schema$ = new BehaviorSubject<string>('');\n private readonly _sortField$ = new BehaviorSubject<SortField>('entityName');\n private readonly _sortDir$ = new BehaviorSubject<SortDirection>('asc');\n private readonly _destroy$ = new Subject<void>();\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n // ─── Lifecycle ─────────────────────────────────────────────────────────\n\n ngOnInit(): void {\n this.setupFilter();\n this.loadEntities();\n }\n\n ngOnDestroy(): void {\n this._destroy$.next();\n this._destroy$.complete();\n }\n\n // ─── Template bindings ─────────────────────────────────────────────────\n\n get SearchTerm(): string { return this._search$.value; }\n set SearchTerm(v: string) { this._search$.next(v); }\n\n get SelectedSchema(): string { return this._schema$.value; }\n set SelectedSchema(v: string) { this._schema$.next(v); }\n\n /** Unique schema names present in the loaded entity list, sorted alphabetically. */\n get AvailableFilterSchemas(): string[] { return this._availableFilterSchemas; }\n\n get SortField(): SortField { return this._sortField$.value; }\n get SortDirection(): SortDirection { return this._sortDir$.value; }\n\n /** Toggle sort: same field flips direction; new field defaults to asc. */\n public OnSortChange(field: SortField): void {\n if (this._sortField$.value === field) {\n this._sortDir$.next(this._sortDir$.value === 'asc' ? 'desc' : 'asc');\n } else {\n this._sortField$.next(field);\n this._sortDir$.next('asc');\n }\n }\n\n public OnEditEntity(entity: AccessibleEntity): void {\n this.EditEntity.emit(entity);\n }\n\n public OnViewEntity(entity: AccessibleEntity): void {\n this.ViewEntity.emit(entity);\n }\n\n public OnNewEntity(): void {\n this.NewEntity.emit();\n }\n\n public OnRefresh(): void {\n DatabaseDesignerEngine.Instance.invalidateCache();\n this.loadEntities();\n }\n\n public TrackByEntityId(_: number, entity: AccessibleEntity): string {\n return entity.entityId;\n }\n\n public FormatDate(date: Date): string {\n return date.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n }\n\n // ─── Private helpers ───────────────────────────────────────────────────\n\n private setupFilter(): void {\n combineLatest([this._search$, this._schema$, this._sortField$, this._sortDir$])\n .pipe(\n debounceTime(150),\n map(([search, schema, field, dir]) => this.applyFilterAndSort(search, schema, field, dir)),\n takeUntil(this._destroy$),\n )\n .subscribe(result => {\n this.FilteredEntities = result;\n this.cdr.markForCheck();\n });\n }\n\n private async loadEntities(): Promise<void> {\n this.IsLoading = true;\n this.ErrorMessage = null;\n this.cdr.markForCheck();\n\n try {\n this._allEntities = await DatabaseDesignerEngine.Instance.loadAccessibleEntities();\n this._availableFilterSchemas = [...new Set(this._allEntities.map(e => e.schemaName))].sort();\n // Trigger the combineLatest pipe to recalculate; reset schema filter if\n // the previously selected schema is no longer present in the new entity list.\n const schemas = this._availableFilterSchemas;\n if (this._schema$.value && !schemas.includes(this._schema$.value)) {\n this._schema$.next('');\n } else {\n this._search$.next(this._search$.value);\n }\n } catch (err) {\n this.ErrorMessage = err instanceof Error ? err.message : String(err);\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n private applyFilterAndSort(search: string, schema: string, field: SortField, dir: SortDirection): AccessibleEntity[] {\n const term = search.trim().toLowerCase();\n let results = [...this._allEntities];\n\n if (schema) {\n results = results.filter(e => e.schemaName === schema);\n }\n\n if (term) {\n results = results.filter(e =>\n e.entityName.toLowerCase().includes(term) ||\n e.tableName.toLowerCase().includes(term) ||\n e.schemaName.toLowerCase().includes(term)\n );\n }\n\n results.sort((a, b) => {\n const aVal = this.sortValue(a, field);\n const bVal = this.sortValue(b, field);\n const cmp = aVal < bVal ? -1 : aVal > bVal ? 1 : 0;\n return dir === 'asc' ? cmp : -cmp;\n });\n\n return results;\n }\n\n private sortValue(entity: AccessibleEntity, field: SortField): string | number {\n switch (field) {\n case 'entityName': return entity.entityName.toLowerCase();\n case 'tableName': return entity.tableName.toLowerCase();\n case 'schemaName': return entity.schemaName.toLowerCase();\n case 'createdAt': return entity.createdAt.getTime();\n case 'owner': return entity.isOwner ? 0 : 1;\n default: return entity.entityName.toLowerCase();\n }\n }\n}\n","<!--\n Database Designer is a sub-page of Admin → Data & Schema's left-nav shell, so\n per Section 9b/10 of plans/explorer-chrome-conventions.md we use the interior\n chrome pattern instead of <mj-page-layout> + <mj-page-header> (which would\n produce a doubled-header inside the Admin shell).\n-->\n<mj-page-header-interior\n AriaLabel=\"Database Designer\"\n Title=\"Database Designer\"\n Subtitle=\"Browse and create user-defined entities\">\n <!-- X-of-Y filtered count earns its meta spot per chrome conventions §2.\n Material on this page (~300 entities per deployment) makes the\n narrowing signal valuable. -->\n <div meta>\n <mj-stat-badge\n [Count]=\"FilteredEntities.length\"\n [Total]=\"TotalEntityCount\"\n Label=\"entities\">\n </mj-stat-badge>\n </div>\n <div actions>\n <mj-refresh-button [Loading]=\"IsLoading\" (Clicked)=\"OnRefresh()\"></mj-refresh-button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"OnNewEntity()\">\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i> <span class=\"mj-action-label\">New Entity</span>\n </button>\n </div>\n <div toolbar>\n <mj-page-search\n Placeholder=\"Search by name, table, or schema...\"\n [Value]=\"SearchTerm\"\n (ValueChange)=\"SearchTerm = $event\">\n </mj-page-search>\n @if (AvailableFilterSchemas.length > 1) {\n <select\n class=\"mj-input schema-filter\"\n [value]=\"SelectedSchema\"\n (change)=\"SelectedSchema = $any($event.target).value\"\n aria-label=\"Filter by schema\">\n <option value=\"\">All Schemas</option>\n @for (schema of AvailableFilterSchemas; track schema) {\n <option [value]=\"schema\">{{ schema }}</option>\n }\n </select>\n }\n </div>\n</mj-page-header-interior>\n\n<mj-page-body-interior [Padding]=\"false\">\n <!-- ── Error ──────────────────────────────────────────────────────────── -->\n @if (ErrorMessage) {\n <div class=\"entity-list-error\" role=\"alert\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ ErrorMessage }}\n </div>\n }\n\n <!-- ── Loading skeleton ───────────────────────────────────────────────── -->\n @if (IsLoading && FilteredEntities.length === 0) {\n <div class=\"skeleton-table\" aria-busy=\"true\" aria-label=\"Loading entities…\">\n @for (_ of [1, 2, 3, 4]; track $index) {\n <div class=\"skeleton-row\">\n <div class=\"skeleton-cell wide\"></div>\n <div class=\"skeleton-cell medium\"></div>\n <div class=\"skeleton-cell narrow\"></div>\n <div class=\"skeleton-cell narrow\"></div>\n <div class=\"skeleton-cell medium\"></div>\n <div class=\"skeleton-cell narrow\"></div>\n </div>\n }\n </div>\n }\n\n <!-- ── Entity table ───────────────────────────────────────────────────── -->\n @if (!IsLoading || FilteredEntities.length > 0) {\n @if (FilteredEntities.length > 0) {\n <div class=\"table-wrap\">\n <table class=\"entity-table\" role=\"grid\" aria-label=\"User-defined entities\">\n <thead>\n <tr>\n <th class=\"col-name sortable\" (click)=\"OnSortChange('entityName')\" scope=\"col\">\n Entity Name\n <span class=\"sort-icon\">\n @if (SortField === 'entityName') {\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"SortDirection === 'asc'\" [class.fa-chevron-down]=\"SortDirection === 'desc'\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-up muted\"></i>\n }\n </span>\n </th>\n <th class=\"col-schema sortable\" (click)=\"OnSortChange('schemaName')\" scope=\"col\">\n Schema\n <span class=\"sort-icon\">\n @if (SortField === 'schemaName') {\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"SortDirection === 'asc'\" [class.fa-chevron-down]=\"SortDirection === 'desc'\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-up muted\"></i>\n }\n </span>\n </th>\n <th class=\"col-table sortable\" (click)=\"OnSortChange('tableName')\" scope=\"col\">\n Table\n <span class=\"sort-icon\">\n @if (SortField === 'tableName') {\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"SortDirection === 'asc'\" [class.fa-chevron-down]=\"SortDirection === 'desc'\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-up muted\"></i>\n }\n </span>\n </th>\n <th class=\"col-owner sortable\" (click)=\"OnSortChange('owner')\" scope=\"col\">\n Owner\n <span class=\"sort-icon\">\n @if (SortField === 'owner') {\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"SortDirection === 'asc'\" [class.fa-chevron-down]=\"SortDirection === 'desc'\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-up muted\"></i>\n }\n </span>\n </th>\n <th class=\"col-created sortable\" (click)=\"OnSortChange('createdAt')\" scope=\"col\">\n Created\n <span class=\"sort-icon\">\n @if (SortField === 'createdAt') {\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"SortDirection === 'asc'\" [class.fa-chevron-down]=\"SortDirection === 'desc'\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-up muted\"></i>\n }\n </span>\n </th>\n <th class=\"col-actions\" scope=\"col\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (entity of FilteredEntities; track TrackByEntityId($index, entity)) {\n <tr class=\"entity-row\">\n <td class=\"col-name\">\n <div class=\"entity-name-cell\">\n <span class=\"entity-name\">{{ entity.entityName }}</span>\n @if (entity.isOwner) {\n <span class=\"owner-badge owner-you\" title=\"You own this entity\">You</span>\n }\n </div>\n </td>\n <td class=\"col-schema\">\n <span class=\"schema-badge\">{{ entity.schemaName }}</span>\n </td>\n <td class=\"col-table\">\n <code class=\"table-name\">{{ entity.tableName }}</code>\n </td>\n <td class=\"col-owner\">\n @if (entity.isOwner) {\n <span class=\"owner-self\">\n <i class=\"fa-solid fa-user-check\"></i>\n You\n </span>\n } @else if (entity.ownerDisplayName) {\n <span class=\"owner-other\">{{ entity.ownerDisplayName }}</span>\n } @else {\n <span class=\"owner-other muted\">—</span>\n }\n </td>\n <td class=\"col-created\">{{ FormatDate(entity.createdAt) }}</td>\n <td class=\"col-actions\">\n <div class=\"row-actions\">\n <button\n mjButton\n buttonStyle=\"secondary\"\n class=\"action-btn\"\n title=\"Edit this entity\"\n (click)=\"OnEditEntity(entity)\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n Edit\n </button>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <div class=\"entity-count\">\n {{ FilteredEntities.length }} {{ FilteredEntities.length === 1 ? 'entity' : 'entities' }}\n @if (SearchTerm) { matching \"{{ SearchTerm }}\" }\n </div>\n } @else if (!IsLoading) {\n <!-- ── Zero state ───────────────────────────────────────────────── -->\n <div class=\"zero-state\">\n <div class=\"zero-state-icon\">\n <i class=\"fa-regular fa-rectangle-list\"></i>\n </div>\n @if (SearchTerm) {\n <h3 class=\"zero-state-title\">No entities match \"{{ SearchTerm }}\"</h3>\n <p class=\"zero-state-body\">Try a different search term or clear the filter.</p>\n <button mjButton buttonStyle=\"secondary\" (click)=\"SearchTerm = ''\">\n Clear search\n </button>\n } @else {\n <h3 class=\"zero-state-title\">No entities yet</h3>\n <p class=\"zero-state-body\">\n Create your first user-defined entity. You can also use the\n Database Designer agent in a conversation for guided design.\n </p>\n <button mjButton buttonStyle=\"primary\" (click)=\"OnNewEntity()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Entity\n </button>\n }\n </div>\n }\n }\n</mj-page-body-interior>\n"]}
@@ -17,14 +17,13 @@ import * as i15 from "@angular/common";
17
17
  import * as i16 from "@angular/forms";
18
18
  import * as i17 from "@memberjunction/ng-ui-components";
19
19
  import * as i18 from "@memberjunction/ng-shared-generic";
20
- import * as i19 from "@memberjunction/ng-versions";
21
- import * as i20 from "@memberjunction/ng-markdown";
22
- import * as i21 from "@memberjunction/ng-code-editor";
23
- import * as i22 from "@memberjunction/ng-entity-relationship-diagram";
24
- import * as i23 from "angular-split";
20
+ import * as i19 from "@memberjunction/ng-markdown";
21
+ import * as i20 from "@memberjunction/ng-code-editor";
22
+ import * as i21 from "@memberjunction/ng-entity-relationship-diagram";
23
+ import * as i22 from "angular-split";
25
24
  export declare class DatabaseDesignerDashboardsModule {
26
25
  static ɵfac: i0.ɵɵFactoryDeclaration<DatabaseDesignerDashboardsModule, never>;
27
- static ɵmod: i0.ɵɵNgModuleDeclaration<DatabaseDesignerDashboardsModule, [typeof i1.DatabaseDesignerDashboardComponent, typeof i2.EntityListComponent, typeof i3.WizardStepIndicatorComponent, typeof i4.EntityFieldsGridComponent, typeof i5.EntityReviewPanelComponent, typeof i6.EntityPipelinePanelComponent, typeof i7.DatabasePreviewPaneComponent, typeof i8.DatabaseCreateWizardComponent, typeof i9.StepBasicsComponent, typeof i10.StepFieldsComponent, typeof i11.StepRelationshipsComponent, typeof i12.StepReviewComponent, typeof i13.StepPipelineComponent, typeof i14.DatabaseModifyComponent], [typeof i15.CommonModule, typeof i16.FormsModule, typeof i17.MJButtonDirective, typeof i17.MJPageLayoutComponent, typeof i17.MJPageHeaderComponent, typeof i17.MJPageBodyComponent, typeof i17.MJPageHeaderInteriorComponent, typeof i17.MJPageBodyInteriorComponent, typeof i17.MJPageSearchComponent, typeof i17.MJRefreshButtonComponent, typeof i17.MJStatBadgeComponent, typeof i18.SharedGenericModule, typeof i19.VersionsModule, typeof i20.MarkdownModule, typeof i21.CodeEditorModule, typeof i22.EntityRelationshipDiagramModule, typeof i23.AngularSplitModule], [typeof i1.DatabaseDesignerDashboardComponent, typeof i2.EntityListComponent, typeof i3.WizardStepIndicatorComponent, typeof i4.EntityFieldsGridComponent, typeof i5.EntityReviewPanelComponent, typeof i6.EntityPipelinePanelComponent, typeof i8.DatabaseCreateWizardComponent]>;
26
+ static ɵmod: i0.ɵɵNgModuleDeclaration<DatabaseDesignerDashboardsModule, [typeof i1.DatabaseDesignerDashboardComponent, typeof i2.EntityListComponent, typeof i3.WizardStepIndicatorComponent, typeof i4.EntityFieldsGridComponent, typeof i5.EntityReviewPanelComponent, typeof i6.EntityPipelinePanelComponent, typeof i7.DatabasePreviewPaneComponent, typeof i8.DatabaseCreateWizardComponent, typeof i9.StepBasicsComponent, typeof i10.StepFieldsComponent, typeof i11.StepRelationshipsComponent, typeof i12.StepReviewComponent, typeof i13.StepPipelineComponent, typeof i14.DatabaseModifyComponent], [typeof i15.CommonModule, typeof i16.FormsModule, typeof i17.MJButtonDirective, typeof i17.MJPageLayoutComponent, typeof i17.MJPageHeaderComponent, typeof i17.MJPageBodyComponent, typeof i17.MJPageHeaderInteriorComponent, typeof i17.MJPageBodyInteriorComponent, typeof i17.MJPageSearchComponent, typeof i17.MJRefreshButtonComponent, typeof i17.MJStatBadgeComponent, typeof i17.MjSlidePanelComponent, typeof i18.SharedGenericModule, typeof i19.MarkdownModule, typeof i20.CodeEditorModule, typeof i21.EntityRelationshipDiagramModule, typeof i22.AngularSplitModule], [typeof i1.DatabaseDesignerDashboardComponent, typeof i2.EntityListComponent, typeof i3.WizardStepIndicatorComponent, typeof i4.EntityFieldsGridComponent, typeof i5.EntityReviewPanelComponent, typeof i6.EntityPipelinePanelComponent, typeof i8.DatabaseCreateWizardComponent]>;
28
27
  static ɵinj: i0.ɵɵInjectorDeclaration<DatabaseDesignerDashboardsModule>;
29
28
  }
30
29
  //# sourceMappingURL=database-designer-dashboards.module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"database-designer-dashboards.module.d.ts","sourceRoot":"","sources":["../../src/DatabaseDesigner/database-designer-dashboards.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAkDA,qBAoDa,gCAAgC;yCAAhC,gCAAgC;0CAAhC,gCAAgC;0CAAhC,gCAAgC;CAAG"}
1
+ {"version":3,"file":"database-designer-dashboards.module.d.ts","sourceRoot":"","sources":["../../src/DatabaseDesigner/database-designer-dashboards.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAkDA,qBAoDa,gCAAgC;yCAAhC,gCAAgC;0CAAhC,gCAAgC;0CAAhC,gCAAgC;CAAG"}
@@ -13,9 +13,8 @@
13
13
  import { NgModule } from '@angular/core';
14
14
  import { CommonModule } from '@angular/common';
15
15
  import { FormsModule } from '@angular/forms';
16
- import { MJButtonDirective, MJPageLayoutComponent, MJPageHeaderComponent, MJPageBodyComponent, MJPageHeaderInteriorComponent, MJPageBodyInteriorComponent, MJPageSearchComponent, MJRefreshButtonComponent, MJStatBadgeComponent } from '@memberjunction/ng-ui-components';
16
+ import { MJButtonDirective, MJPageLayoutComponent, MJPageHeaderComponent, MJPageBodyComponent, MJPageHeaderInteriorComponent, MJPageBodyInteriorComponent, MJPageSearchComponent, MJRefreshButtonComponent, MJStatBadgeComponent, MjSlidePanelComponent } from '@memberjunction/ng-ui-components';
17
17
  import { SharedGenericModule } from '@memberjunction/ng-shared-generic';
18
- import { VersionsModule } from '@memberjunction/ng-versions';
19
18
  import { MarkdownModule } from '@memberjunction/ng-markdown';
20
19
  import { CodeEditorModule } from '@memberjunction/ng-code-editor';
21
20
  import { EntityRelationshipDiagramModule } from '@memberjunction/ng-entity-relationship-diagram';
@@ -51,8 +50,8 @@ export class DatabaseDesignerDashboardsModule {
51
50
  MJPageSearchComponent,
52
51
  MJRefreshButtonComponent,
53
52
  MJStatBadgeComponent,
53
+ MjSlidePanelComponent,
54
54
  SharedGenericModule,
55
- VersionsModule,
56
55
  MarkdownModule,
57
56
  CodeEditorModule,
58
57
  EntityRelationshipDiagramModule,
@@ -92,8 +91,8 @@ export class DatabaseDesignerDashboardsModule {
92
91
  MJPageSearchComponent,
93
92
  MJRefreshButtonComponent,
94
93
  MJStatBadgeComponent,
94
+ MjSlidePanelComponent,
95
95
  SharedGenericModule,
96
- VersionsModule,
97
96
  MarkdownModule,
98
97
  CodeEditorModule,
99
98
  EntityRelationshipDiagramModule,
@@ -140,8 +139,8 @@ export class DatabaseDesignerDashboardsModule {
140
139
  MJPageSearchComponent,
141
140
  MJRefreshButtonComponent,
142
141
  MJStatBadgeComponent,
142
+ MjSlidePanelComponent,
143
143
  SharedGenericModule,
144
- VersionsModule,
145
144
  MarkdownModule,
146
145
  CodeEditorModule,
147
146
  EntityRelationshipDiagramModule,
@@ -1 +1 @@
1
- {"version":3,"file":"database-designer-dashboards.module.js","sourceRoot":"","sources":["../../src/DatabaseDesigner/database-designer-dashboards.module.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * DatabaseDesignerDashboardsModule\n *\n * Feature module for the Database Designer dashboard area. Declares the main\n * dashboard component and its entity-list sub-component. The wizard steps and\n * modify view are added in later phases (5c–5e) and will be declared here too.\n *\n * Lazy-loading entry point: DashboardsModule (module.ts) imports this module\n * so MJExplorer can code-split it in the future without touching any other file.\n *\n * Slide-over panels use MjSlidePanelComponent from VersionsModule.\n */\n\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport {\n MJButtonDirective,\n MJPageLayoutComponent,\n MJPageHeaderComponent,\n MJPageBodyComponent,\n MJPageHeaderInteriorComponent,\n MJPageBodyInteriorComponent,\n MJPageSearchComponent,\n MJRefreshButtonComponent,\n MJStatBadgeComponent\n} from '@memberjunction/ng-ui-components';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { VersionsModule } from '@memberjunction/ng-versions';\nimport { MarkdownModule } from '@memberjunction/ng-markdown';\nimport { CodeEditorModule } from '@memberjunction/ng-code-editor';\nimport { EntityRelationshipDiagramModule } from '@memberjunction/ng-entity-relationship-diagram';\nimport { AngularSplitModule } from 'angular-split';\n\nimport { DatabaseDesignerDashboardComponent } from './components/database-designer-dashboard.component';\nimport { EntityListComponent } from './components/entity-list.component';\nimport { WizardStepIndicatorComponent } from './components/shared/wizard-step-indicator.component';\nimport { EntityFieldsGridComponent } from './components/shared/entity-fields-grid.component';\nimport { EntityReviewPanelComponent } from './components/shared/entity-review-panel.component';\nimport { EntityPipelinePanelComponent } from './components/shared/entity-pipeline-panel.component';\nimport { DatabaseCreateWizardComponent } from './components/create-wizard/database-create-wizard.component';\nimport { StepBasicsComponent } from './components/create-wizard/steps/step-basics.component';\nimport { StepFieldsComponent } from './components/create-wizard/steps/step-fields.component';\nimport { StepRelationshipsComponent } from './components/create-wizard/steps/step-relationships.component';\nimport { StepReviewComponent } from './components/create-wizard/steps/step-review.component';\nimport { StepPipelineComponent } from './components/create-wizard/steps/step-pipeline.component';\nimport { DatabaseModifyComponent } from './components/modify/database-modify.component';\nimport { DatabasePreviewPaneComponent } from './components/shared/database-preview-pane.component';\nimport { DatabaseDesignerService } from './services/database-designer.service';\n\n@NgModule({\n declarations: [\n DatabaseDesignerDashboardComponent,\n EntityListComponent,\n // Phase 5c: shared UI\n WizardStepIndicatorComponent,\n EntityFieldsGridComponent,\n EntityReviewPanelComponent,\n EntityPipelinePanelComponent,\n DatabasePreviewPaneComponent,\n // Phase 5d: wizard + steps\n DatabaseCreateWizardComponent,\n StepBasicsComponent,\n StepFieldsComponent,\n StepRelationshipsComponent,\n StepReviewComponent,\n StepPipelineComponent,\n // Phase 5e\n DatabaseModifyComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n MJButtonDirective,\n MJPageLayoutComponent,\n MJPageHeaderComponent,\n MJPageBodyComponent,\n MJPageHeaderInteriorComponent,\n MJPageBodyInteriorComponent,\n MJPageSearchComponent,\n MJRefreshButtonComponent,\n MJStatBadgeComponent,\n SharedGenericModule,\n VersionsModule,\n MarkdownModule,\n CodeEditorModule,\n EntityRelationshipDiagramModule,\n AngularSplitModule,\n ],\n providers: [\n DatabaseDesignerService,\n ],\n exports: [\n DatabaseDesignerDashboardComponent,\n EntityListComponent,\n WizardStepIndicatorComponent,\n EntityFieldsGridComponent,\n EntityReviewPanelComponent,\n EntityPipelinePanelComponent,\n DatabaseCreateWizardComponent,\n ],\n})\nexport class DatabaseDesignerDashboardsModule {}\n"]}
1
+ {"version":3,"file":"database-designer-dashboards.module.js","sourceRoot":"","sources":["../../src/DatabaseDesigner/database-designer-dashboards.module.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * DatabaseDesignerDashboardsModule\n *\n * Feature module for the Database Designer dashboard area. Declares the main\n * dashboard component and its entity-list sub-component. The wizard steps and\n * modify view are added in later phases (5c–5e) and will be declared here too.\n *\n * Lazy-loading entry point: DashboardsModule (module.ts) imports this module\n * so MJExplorer can code-split it in the future without touching any other file.\n *\n * Slide-over panels use MjSlidePanelComponent from VersionsModule.\n */\n\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport {\n MJButtonDirective,\n MJPageLayoutComponent,\n MJPageHeaderComponent,\n MJPageBodyComponent,\n MJPageHeaderInteriorComponent,\n MJPageBodyInteriorComponent,\n MJPageSearchComponent,\n MJRefreshButtonComponent,\n MJStatBadgeComponent,\n MjSlidePanelComponent\n} from '@memberjunction/ng-ui-components';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { MarkdownModule } from '@memberjunction/ng-markdown';\nimport { CodeEditorModule } from '@memberjunction/ng-code-editor';\nimport { EntityRelationshipDiagramModule } from '@memberjunction/ng-entity-relationship-diagram';\nimport { AngularSplitModule } from 'angular-split';\n\nimport { DatabaseDesignerDashboardComponent } from './components/database-designer-dashboard.component';\nimport { EntityListComponent } from './components/entity-list.component';\nimport { WizardStepIndicatorComponent } from './components/shared/wizard-step-indicator.component';\nimport { EntityFieldsGridComponent } from './components/shared/entity-fields-grid.component';\nimport { EntityReviewPanelComponent } from './components/shared/entity-review-panel.component';\nimport { EntityPipelinePanelComponent } from './components/shared/entity-pipeline-panel.component';\nimport { DatabaseCreateWizardComponent } from './components/create-wizard/database-create-wizard.component';\nimport { StepBasicsComponent } from './components/create-wizard/steps/step-basics.component';\nimport { StepFieldsComponent } from './components/create-wizard/steps/step-fields.component';\nimport { StepRelationshipsComponent } from './components/create-wizard/steps/step-relationships.component';\nimport { StepReviewComponent } from './components/create-wizard/steps/step-review.component';\nimport { StepPipelineComponent } from './components/create-wizard/steps/step-pipeline.component';\nimport { DatabaseModifyComponent } from './components/modify/database-modify.component';\nimport { DatabasePreviewPaneComponent } from './components/shared/database-preview-pane.component';\nimport { DatabaseDesignerService } from './services/database-designer.service';\n\n@NgModule({\n declarations: [\n DatabaseDesignerDashboardComponent,\n EntityListComponent,\n // Phase 5c: shared UI\n WizardStepIndicatorComponent,\n EntityFieldsGridComponent,\n EntityReviewPanelComponent,\n EntityPipelinePanelComponent,\n DatabasePreviewPaneComponent,\n // Phase 5d: wizard + steps\n DatabaseCreateWizardComponent,\n StepBasicsComponent,\n StepFieldsComponent,\n StepRelationshipsComponent,\n StepReviewComponent,\n StepPipelineComponent,\n // Phase 5e\n DatabaseModifyComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n MJButtonDirective,\n MJPageLayoutComponent,\n MJPageHeaderComponent,\n MJPageBodyComponent,\n MJPageHeaderInteriorComponent,\n MJPageBodyInteriorComponent,\n MJPageSearchComponent,\n MJRefreshButtonComponent,\n MJStatBadgeComponent,\n MjSlidePanelComponent,\n SharedGenericModule,\n MarkdownModule,\n CodeEditorModule,\n EntityRelationshipDiagramModule,\n AngularSplitModule,\n ],\n providers: [\n DatabaseDesignerService,\n ],\n exports: [\n DatabaseDesignerDashboardComponent,\n EntityListComponent,\n WizardStepIndicatorComponent,\n EntityFieldsGridComponent,\n EntityReviewPanelComponent,\n EntityPipelinePanelComponent,\n DatabaseCreateWizardComponent,\n ],\n})\nexport class DatabaseDesignerDashboardsModule {}\n"]}
@@ -218,30 +218,31 @@ let AppStateInspectorComponent = class AppStateInspectorComponent extends BaseRe
218
218
  return `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}-${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`;
219
219
  }
220
220
  static ɵfac = function AppStateInspectorComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AppStateInspectorComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.WorkspaceStateManager), i0.ɵɵdirectiveInject(i2.DeveloperModeService)); };
221
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AppStateInspectorComponent, selectors: [["mj-app-state-inspector"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 19, vars: 16, consts: [[1, "mj-inspector", "mj-inspector--solo"], ["Role", "region", "AriaLabel", "App State inspector", "Title", "App State Inspector", "Subtitle", "Read-only snapshot of Explorer runtime state"], ["actions", ""], [3, "Clicked", "Loading"], ["mjButton", "", "size", "sm", 3, "click", "variant", "title"], ["aria-hidden", "true", 1, "fa-solid"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Download as JSON", "aria-label", "Download as JSON", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-download"], ["toolbar", ""], [3, "TabChange", "Tabs", "ActiveKey"], [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"]], template: function AppStateInspectorComponent_Template(rf, ctx) { if (rf & 1) {
221
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AppStateInspectorComponent, selectors: [["mj-app-state-inspector"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 20, vars: 16, consts: [[1, "mj-inspector", "mj-inspector--solo"], ["Role", "region", "AriaLabel", "App State inspector", "Title", "App State Inspector", "Subtitle", "Read-only snapshot of Explorer runtime state"], ["actions", ""], [3, "Clicked", "Loading"], ["mjButton", "", "size", "sm", 3, "click", "variant", "title"], ["aria-hidden", "true", 1, "fa-solid"], [1, "mj-action-label"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Download as JSON", "aria-label", "Download as JSON", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-download"], ["toolbar", ""], [3, "TabChange", "Tabs", "ActiveKey"], [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"]], template: function AppStateInspectorComponent_Template(rf, ctx) { if (rf & 1) {
222
222
  i0.ɵɵelementStart(0, "div", 0)(1, "mj-page-header-interior", 1)(2, "div", 2)(3, "mj-refresh-button", 3);
223
223
  i0.ɵɵlistener("Clicked", function AppStateInspectorComponent_Template_mj_refresh_button_Clicked_3_listener() { return ctx.refresh(); });
224
224
  i0.ɵɵelementEnd();
225
225
  i0.ɵɵelementStart(4, "button", 4);
226
226
  i0.ɵɵlistener("click", function AppStateInspectorComponent_Template_button_click_4_listener() { return ctx.OnCopy(); });
227
227
  i0.ɵɵelement(5, "i", 5);
228
- i0.ɵɵtext(6);
229
- i0.ɵɵelementEnd();
230
- i0.ɵɵelementStart(7, "button", 6);
231
- i0.ɵɵlistener("click", function AppStateInspectorComponent_Template_button_click_7_listener() { return ctx.OnDownload(); });
232
- i0.ɵɵelement(8, "i", 7);
228
+ i0.ɵɵelementStart(6, "span", 6);
229
+ i0.ɵɵtext(7);
230
+ i0.ɵɵelementEnd()();
231
+ i0.ɵɵelementStart(8, "button", 7);
232
+ i0.ɵɵlistener("click", function AppStateInspectorComponent_Template_button_click_8_listener() { return ctx.OnDownload(); });
233
+ i0.ɵɵelement(9, "i", 8);
233
234
  i0.ɵɵelementEnd()();
234
- i0.ɵɵelementStart(9, "div", 8)(10, "mj-tab-nav", 9);
235
- i0.ɵɵlistener("TabChange", function AppStateInspectorComponent_Template_mj_tab_nav_TabChange_10_listener($event) { return ctx.onTabChange($event); });
235
+ i0.ɵɵelementStart(10, "div", 9)(11, "mj-tab-nav", 10);
236
+ i0.ɵɵlistener("TabChange", function AppStateInspectorComponent_Template_mj_tab_nav_TabChange_11_listener($event) { return ctx.onTabChange($event); });
236
237
  i0.ɵɵelementEnd()()();
237
- i0.ɵɵelementStart(11, "div", 10)(12, "div", 11)(13, "h4", 12);
238
- i0.ɵɵtext(14);
238
+ i0.ɵɵelementStart(12, "div", 11)(13, "div", 12)(14, "h4", 13);
239
+ i0.ɵɵtext(15);
239
240
  i0.ɵɵelementEnd();
240
- i0.ɵɵelementStart(15, "span", 13);
241
- i0.ɵɵtext(16);
241
+ i0.ɵɵelementStart(16, "span", 14);
242
+ i0.ɵɵtext(17);
242
243
  i0.ɵɵelementEnd()();
243
- i0.ɵɵelementStart(17, "div", 14)(18, "mj-code-editor", 15);
244
- i0.ɵɵtwoWayListener("ngModelChange", function AppStateInspectorComponent_Template_mj_code_editor_ngModelChange_18_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.StateJson, $event) || (ctx.StateJson = $event); return $event; });
244
+ i0.ɵɵelementStart(18, "div", 15)(19, "mj-code-editor", 16);
245
+ i0.ɵɵtwoWayListener("ngModelChange", function AppStateInspectorComponent_Template_mj_code_editor_ngModelChange_19_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.StateJson, $event) || (ctx.StateJson = $event); return $event; });
245
246
  i0.ɵɵelementEnd()()()();
246
247
  } if (rf & 2) {
247
248
  i0.ɵɵadvance(3);
@@ -250,8 +251,8 @@ let AppStateInspectorComponent = class AppStateInspectorComponent extends BaseRe
250
251
  i0.ɵɵproperty("variant", ctx.CopyConfirmed ? "success" : "secondary")("title", ctx.CopyConfirmed ? "Copied" : "Copy JSON");
251
252
  i0.ɵɵadvance();
252
253
  i0.ɵɵclassProp("fa-clipboard", !ctx.CopyConfirmed)("fa-check", ctx.CopyConfirmed);
253
- i0.ɵɵadvance();
254
- i0.ɵɵtextInterpolate1(" ", ctx.CopyConfirmed ? "Copied" : "Copy", " ");
254
+ i0.ɵɵadvance(2);
255
+ i0.ɵɵtextInterpolate(ctx.CopyConfirmed ? "Copied" : "Copy");
255
256
  i0.ɵɵadvance(4);
256
257
  i0.ɵɵproperty("Tabs", ctx.tabsConfig)("ActiveKey", ctx.ActiveSection);
257
258
  i0.ɵɵadvance(4);
@@ -269,7 +270,7 @@ AppStateInspectorComponent = __decorate([
269
270
  export { AppStateInspectorComponent };
270
271
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AppStateInspectorComponent, [{
271
272
  type: Component,
272
- args: [{ standalone: false, selector: 'mj-app-state-inspector', template: "<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"App State inspector\"\n Title=\"App State Inspector\"\n Subtitle=\"Read-only snapshot of Explorer runtime state\">\n <div actions>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n <button mjButton\n [variant]=\"CopyConfirmed ? 'success' : 'secondary'\"\n size=\"sm\"\n (click)=\"OnCopy()\"\n [title]=\"CopyConfirmed ? 'Copied' : 'Copy JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\" aria-hidden=\"true\"></i>\n {{ CopyConfirmed ? 'Copied' : 'Copy' }}\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnDownload()\" title=\"Download as JSON\" aria-label=\"Download as JSON\">\n <i class=\"fa-solid fa-download\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div toolbar>\n <mj-tab-nav\n [Tabs]=\"tabsConfig\"\n [ActiveKey]=\"ActiveSection\"\n (TabChange)=\"onTabChange($event)\">\n </mj-tab-nav>\n </div>\n </mj-page-header-interior>\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)]=\"StateJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n</div>\n", styles: [":host { display: block; height: 100%; }\n\n/*\n Inspector shell \u2014 each Dev Tools sub-page wraps its body in .mj-inspector. The\n chrome (title icon, title, subtitle, action buttons) was previously rendered\n via .mj-inspector__header*, but that's been replaced by <mj-page-header-interior>\n in every inspector template. Action buttons now use the mjButton directive\n (variant=\"secondary\" / \"success\") so they inherit global button styling. App\n State + Layout inspectors used to carry an inner left rail (.mj-inspector__body\n + __sidebar + __nav-item) for L2 sections; that rail was retired 2026-05-19 in\n favor of <mj-tab-nav> projected into the chrome's [toolbar] slot, matching\n SystemDiagnostics and the API Keys tab strip. All inspectors are now \"solo\"\n mode (no sidebar).\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/* 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"] }]
273
+ args: [{ standalone: false, selector: 'mj-app-state-inspector', template: "<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"App State inspector\"\n Title=\"App State Inspector\"\n Subtitle=\"Read-only snapshot of Explorer runtime state\">\n <div actions>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n <button mjButton\n [variant]=\"CopyConfirmed ? 'success' : 'secondary'\"\n size=\"sm\"\n (click)=\"OnCopy()\"\n [title]=\"CopyConfirmed ? 'Copied' : 'Copy JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\" aria-hidden=\"true\"></i>\n <span class=\"mj-action-label\">{{ CopyConfirmed ? 'Copied' : 'Copy' }}</span>\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnDownload()\" title=\"Download as JSON\" aria-label=\"Download as JSON\">\n <i class=\"fa-solid fa-download\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div toolbar>\n <mj-tab-nav\n [Tabs]=\"tabsConfig\"\n [ActiveKey]=\"ActiveSection\"\n (TabChange)=\"onTabChange($event)\">\n </mj-tab-nav>\n </div>\n </mj-page-header-interior>\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)]=\"StateJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n</div>\n", styles: [":host { display: block; height: 100%; }\n\n/*\n Inspector shell \u2014 each Dev Tools sub-page wraps its body in .mj-inspector. The\n chrome (title icon, title, subtitle, action buttons) was previously rendered\n via .mj-inspector__header*, but that's been replaced by <mj-page-header-interior>\n in every inspector template. Action buttons now use the mjButton directive\n (variant=\"secondary\" / \"success\") so they inherit global button styling. App\n State + Layout inspectors used to carry an inner left rail (.mj-inspector__body\n + __sidebar + __nav-item) for L2 sections; that rail was retired 2026-05-19 in\n favor of <mj-tab-nav> projected into the chrome's [toolbar] slot, matching\n SystemDiagnostics and the API Keys tab strip. All inspectors are now \"solo\"\n mode (no sidebar).\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/* 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"] }]
273
274
  }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.WorkspaceStateManager }, { type: i2.DeveloperModeService }], null); })();
274
275
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AppStateInspectorComponent, { className: "AppStateInspectorComponent", filePath: "src/DevTools/app-state-inspector.component.ts", lineNumber: 30 }); })();
275
276
  //# sourceMappingURL=app-state-inspector.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-state-inspector.component.js","sourceRoot":"","sources":["../../src/DevTools/app-state-inspector.component.ts","../../src/DevTools/app-state-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 { TabConfig } from '@memberjunction/ng-ui-components';\nimport { DevToolsPrefs } from './dev-tools-prefs';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { WorkspaceStateManager } from '@memberjunction/ng-base-application';\nimport { DeveloperModeService } from '@memberjunction/ng-shared';\n\ninterface InspectorSection {\n id: string;\n label: string;\n icon: string;\n enabled: boolean;\n description?: string;\n}\n\n/**\n * App State Inspector — read-only structured view of the Explorer's runtime\n * state. Replaces the legacy \"Inspect App State\" user-menu item which only\n * dumped to console. Lives in the Admin app's dev tools area.\n */\n@RegisterClass(BaseResourceComponent, 'AppStateInspector')\n@Component({\n standalone: false,\n selector: 'mj-app-state-inspector',\n templateUrl: './app-state-inspector.component.html',\n styleUrls: ['./inspector-shared.css']\n})\nexport class AppStateInspectorComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n public Sections: InspectorSection[] = [\n { id: 'user', label: 'Current User', icon: 'fa-solid fa-user', enabled: true, description: 'Identity, roles, email' },\n { id: 'provider', label: 'Provider', icon: 'fa-solid fa-plug', enabled: true, description: 'API URL, entities loaded' },\n { id: 'workspace',label: 'Workspace', icon: 'fa-solid fa-table-columns', enabled: true, description: 'Tabs, layout, active state' },\n { id: 'app', label: 'Active Application', icon: 'fa-solid fa-th-large', enabled: true, description: 'Current app + nav items' },\n { id: 'dev', label: 'Developer Mode', icon: 'fa-solid fa-code', enabled: true, description: 'Dev mode flag, eligibility' },\n { id: 'browser', label: 'Browser & Session', icon: 'fa-solid fa-window-maximize',enabled: true, description: 'User agent, viewport, URL' }\n ];\n\n public ActiveSection = 'user';\n public StateJson = '{}';\n public SearchQuery = '';\n public CopyConfirmed = false;\n public LastRefreshed = new Date();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private workspace: WorkspaceStateManager,\n private devMode: DeveloperModeService\n ) {\n super();\n }\n\n public ngOnInit(): void {\n const p = DevToolsPrefs.Get<{ activeSection?: string }>('appStateInspector');\n if (p?.activeSection && this.Sections.some(s => s.id === p.activeSection)) {\n this.ActiveSection = p.activeSection;\n }\n this.refresh();\n this.NotifyLoadComplete();\n }\n\n public override ngOnDestroy(): void {\n DevToolsPrefs.Save('appStateInspector', { activeSection: this.ActiveSection });\n super.ngOnDestroy();\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'App State Inspector'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-magnifying-glass-chart'; }\n\n /** Sections rendered as horizontal tabs in the chrome's [toolbar] slot. */\n public get tabsConfig(): TabConfig[] {\n return this.Sections.map(s => ({\n key: s.id,\n label: s.label,\n icon: s.icon\n }));\n }\n\n /** Adapter for `<mj-tab-nav>`'s string-typed `(TabChange)` output. */\n public onTabChange(key: string): void {\n const section = this.Sections.find(s => s.id === key);\n if (section) {\n this.OnSectionClick(section);\n }\n }\n\n public OnSectionClick(section: InspectorSection): void {\n if (this.ActiveSection === section.id) return;\n this.ActiveSection = section.id;\n DevToolsPrefs.Save('appStateInspector', { activeSection: this.ActiveSection });\n this.refresh();\n }\n\n public refresh(): void {\n this.StateJson = JSON.stringify(this.computeSectionData(this.ActiveSection), 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.StateJson);\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.StateJson], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `mj-app-state-${this.ActiveSection}-${this.timestampSlug()}.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 computeSectionData(section: string): unknown {\n switch (section) {\n case 'user': return this.userData();\n case 'provider': return this.providerData();\n case 'workspace': return this.workspaceData();\n case 'app': return this.appData();\n case 'dev': return this.devData();\n case 'browser': return this.browserData();\n default: return {};\n }\n }\n\n private userData(): unknown {\n const user = this.ProviderToUse?.CurrentUser;\n if (!user) return { error: 'No current user' };\n return {\n ID: user.ID,\n Name: user.Name,\n FirstName: user.FirstName,\n LastName: user.LastName,\n Email: user.Email,\n Type: user.Type,\n IsActive: user.IsActive,\n LinkedRecordType: user.LinkedRecordType,\n CreatedAt: user.__mj_CreatedAt,\n Roles: (user.UserRoles ?? []).map(r => ({ Role: r.Role, RoleID: r.RoleID }))\n };\n }\n\n private providerData(): unknown {\n const provider = this.ProviderToUse;\n if (!provider) return { error: 'No provider' };\n const data: Record<string, unknown> = {\n type: provider.constructor.name,\n EntitiesCount: provider.Entities?.length ?? 0,\n ApplicationsCount: provider.Applications?.length ?? 0,\n QueriesCount: provider.Queries?.length ?? 0,\n RolesCount: provider.Roles?.length ?? 0\n };\n if (provider instanceof GraphQLDataProvider) {\n data.URL = provider.ConfigData?.URL;\n data.WSURL = provider.ConfigData?.WSURL;\n }\n return data;\n }\n\n private workspaceData(): unknown {\n const config = this.workspace.GetConfiguration();\n return config;\n }\n\n private appData(): unknown {\n const config = this.workspace.GetConfiguration();\n if (!config) return { error: 'No workspace configuration' };\n const activeTab = config.tabs?.find(t => t.id === config.activeTabId);\n return {\n ActiveTabId: config.activeTabId,\n ActiveTab: activeTab,\n TabCount: config.tabs?.length ?? 0\n };\n }\n\n private devData(): unknown {\n return {\n IsEnabled: this.devMode.IsEnabled,\n IsDeveloper: this.devMode.IsDeveloper,\n EligibleRoles: ['Developer', 'Admin', 'System Administrator', 'Integration']\n };\n }\n\n private browserData(): unknown {\n return {\n UserAgent: navigator.userAgent,\n Language: navigator.language,\n Languages: navigator.languages,\n Platform: navigator.platform,\n Online: navigator.onLine,\n Viewport: { width: window.innerWidth, height: window.innerHeight, devicePixelRatio: window.devicePixelRatio },\n URL: window.location.href,\n Origin: window.location.origin,\n Path: window.location.pathname + window.location.search,\n Memory: this.readMemory()\n };\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 private readMemory(): { usedJSHeapSize: number; totalJSHeapSize: number } | undefined {\n const memory = (performance as Performance & {\n memory?: { usedJSHeapSize: number; totalJSHeapSize: number };\n }).memory;\n if (!memory) return undefined;\n return { usedJSHeapSize: memory.usedJSHeapSize, totalJSHeapSize: memory.totalJSHeapSize };\n }\n\n private timestampSlug(): string {\n const d = new Date();\n const pad = (n: number) => n.toString().padStart(2, '0');\n return `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}-${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`;\n }\n\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"App State inspector\"\n Title=\"App State Inspector\"\n Subtitle=\"Read-only snapshot of Explorer runtime state\">\n <div actions>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n <button mjButton\n [variant]=\"CopyConfirmed ? 'success' : 'secondary'\"\n size=\"sm\"\n (click)=\"OnCopy()\"\n [title]=\"CopyConfirmed ? 'Copied' : 'Copy JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\" aria-hidden=\"true\"></i>\n {{ CopyConfirmed ? 'Copied' : 'Copy' }}\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnDownload()\" title=\"Download as JSON\" aria-label=\"Download as JSON\">\n <i class=\"fa-solid fa-download\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div toolbar>\n <mj-tab-nav\n [Tabs]=\"tabsConfig\"\n [ActiveKey]=\"ActiveSection\"\n (TabChange)=\"onTabChange($event)\">\n </mj-tab-nav>\n </div>\n </mj-page-header-interior>\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)]=\"StateJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n</div>\n"]}
1
+ {"version":3,"file":"app-state-inspector.component.js","sourceRoot":"","sources":["../../src/DevTools/app-state-inspector.component.ts","../../src/DevTools/app-state-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 { TabConfig } from '@memberjunction/ng-ui-components';\nimport { DevToolsPrefs } from './dev-tools-prefs';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { WorkspaceStateManager } from '@memberjunction/ng-base-application';\nimport { DeveloperModeService } from '@memberjunction/ng-shared';\n\ninterface InspectorSection {\n id: string;\n label: string;\n icon: string;\n enabled: boolean;\n description?: string;\n}\n\n/**\n * App State Inspector — read-only structured view of the Explorer's runtime\n * state. Replaces the legacy \"Inspect App State\" user-menu item which only\n * dumped to console. Lives in the Admin app's dev tools area.\n */\n@RegisterClass(BaseResourceComponent, 'AppStateInspector')\n@Component({\n standalone: false,\n selector: 'mj-app-state-inspector',\n templateUrl: './app-state-inspector.component.html',\n styleUrls: ['./inspector-shared.css']\n})\nexport class AppStateInspectorComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n public Sections: InspectorSection[] = [\n { id: 'user', label: 'Current User', icon: 'fa-solid fa-user', enabled: true, description: 'Identity, roles, email' },\n { id: 'provider', label: 'Provider', icon: 'fa-solid fa-plug', enabled: true, description: 'API URL, entities loaded' },\n { id: 'workspace',label: 'Workspace', icon: 'fa-solid fa-table-columns', enabled: true, description: 'Tabs, layout, active state' },\n { id: 'app', label: 'Active Application', icon: 'fa-solid fa-th-large', enabled: true, description: 'Current app + nav items' },\n { id: 'dev', label: 'Developer Mode', icon: 'fa-solid fa-code', enabled: true, description: 'Dev mode flag, eligibility' },\n { id: 'browser', label: 'Browser & Session', icon: 'fa-solid fa-window-maximize',enabled: true, description: 'User agent, viewport, URL' }\n ];\n\n public ActiveSection = 'user';\n public StateJson = '{}';\n public SearchQuery = '';\n public CopyConfirmed = false;\n public LastRefreshed = new Date();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private workspace: WorkspaceStateManager,\n private devMode: DeveloperModeService\n ) {\n super();\n }\n\n public ngOnInit(): void {\n const p = DevToolsPrefs.Get<{ activeSection?: string }>('appStateInspector');\n if (p?.activeSection && this.Sections.some(s => s.id === p.activeSection)) {\n this.ActiveSection = p.activeSection;\n }\n this.refresh();\n this.NotifyLoadComplete();\n }\n\n public override ngOnDestroy(): void {\n DevToolsPrefs.Save('appStateInspector', { activeSection: this.ActiveSection });\n super.ngOnDestroy();\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'App State Inspector'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-magnifying-glass-chart'; }\n\n /** Sections rendered as horizontal tabs in the chrome's [toolbar] slot. */\n public get tabsConfig(): TabConfig[] {\n return this.Sections.map(s => ({\n key: s.id,\n label: s.label,\n icon: s.icon\n }));\n }\n\n /** Adapter for `<mj-tab-nav>`'s string-typed `(TabChange)` output. */\n public onTabChange(key: string): void {\n const section = this.Sections.find(s => s.id === key);\n if (section) {\n this.OnSectionClick(section);\n }\n }\n\n public OnSectionClick(section: InspectorSection): void {\n if (this.ActiveSection === section.id) return;\n this.ActiveSection = section.id;\n DevToolsPrefs.Save('appStateInspector', { activeSection: this.ActiveSection });\n this.refresh();\n }\n\n public refresh(): void {\n this.StateJson = JSON.stringify(this.computeSectionData(this.ActiveSection), 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.StateJson);\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.StateJson], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `mj-app-state-${this.ActiveSection}-${this.timestampSlug()}.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 computeSectionData(section: string): unknown {\n switch (section) {\n case 'user': return this.userData();\n case 'provider': return this.providerData();\n case 'workspace': return this.workspaceData();\n case 'app': return this.appData();\n case 'dev': return this.devData();\n case 'browser': return this.browserData();\n default: return {};\n }\n }\n\n private userData(): unknown {\n const user = this.ProviderToUse?.CurrentUser;\n if (!user) return { error: 'No current user' };\n return {\n ID: user.ID,\n Name: user.Name,\n FirstName: user.FirstName,\n LastName: user.LastName,\n Email: user.Email,\n Type: user.Type,\n IsActive: user.IsActive,\n LinkedRecordType: user.LinkedRecordType,\n CreatedAt: user.__mj_CreatedAt,\n Roles: (user.UserRoles ?? []).map(r => ({ Role: r.Role, RoleID: r.RoleID }))\n };\n }\n\n private providerData(): unknown {\n const provider = this.ProviderToUse;\n if (!provider) return { error: 'No provider' };\n const data: Record<string, unknown> = {\n type: provider.constructor.name,\n EntitiesCount: provider.Entities?.length ?? 0,\n ApplicationsCount: provider.Applications?.length ?? 0,\n QueriesCount: provider.Queries?.length ?? 0,\n RolesCount: provider.Roles?.length ?? 0\n };\n if (provider instanceof GraphQLDataProvider) {\n data.URL = provider.ConfigData?.URL;\n data.WSURL = provider.ConfigData?.WSURL;\n }\n return data;\n }\n\n private workspaceData(): unknown {\n const config = this.workspace.GetConfiguration();\n return config;\n }\n\n private appData(): unknown {\n const config = this.workspace.GetConfiguration();\n if (!config) return { error: 'No workspace configuration' };\n const activeTab = config.tabs?.find(t => t.id === config.activeTabId);\n return {\n ActiveTabId: config.activeTabId,\n ActiveTab: activeTab,\n TabCount: config.tabs?.length ?? 0\n };\n }\n\n private devData(): unknown {\n return {\n IsEnabled: this.devMode.IsEnabled,\n IsDeveloper: this.devMode.IsDeveloper,\n EligibleRoles: ['Developer', 'Admin', 'System Administrator', 'Integration']\n };\n }\n\n private browserData(): unknown {\n return {\n UserAgent: navigator.userAgent,\n Language: navigator.language,\n Languages: navigator.languages,\n Platform: navigator.platform,\n Online: navigator.onLine,\n Viewport: { width: window.innerWidth, height: window.innerHeight, devicePixelRatio: window.devicePixelRatio },\n URL: window.location.href,\n Origin: window.location.origin,\n Path: window.location.pathname + window.location.search,\n Memory: this.readMemory()\n };\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 private readMemory(): { usedJSHeapSize: number; totalJSHeapSize: number } | undefined {\n const memory = (performance as Performance & {\n memory?: { usedJSHeapSize: number; totalJSHeapSize: number };\n }).memory;\n if (!memory) return undefined;\n return { usedJSHeapSize: memory.usedJSHeapSize, totalJSHeapSize: memory.totalJSHeapSize };\n }\n\n private timestampSlug(): string {\n const d = new Date();\n const pad = (n: number) => n.toString().padStart(2, '0');\n return `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}-${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`;\n }\n\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"App State inspector\"\n Title=\"App State Inspector\"\n Subtitle=\"Read-only snapshot of Explorer runtime state\">\n <div actions>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n <button mjButton\n [variant]=\"CopyConfirmed ? 'success' : 'secondary'\"\n size=\"sm\"\n (click)=\"OnCopy()\"\n [title]=\"CopyConfirmed ? 'Copied' : 'Copy JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\" aria-hidden=\"true\"></i>\n <span class=\"mj-action-label\">{{ CopyConfirmed ? 'Copied' : 'Copy' }}</span>\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnDownload()\" title=\"Download as JSON\" aria-label=\"Download as JSON\">\n <i class=\"fa-solid fa-download\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div toolbar>\n <mj-tab-nav\n [Tabs]=\"tabsConfig\"\n [ActiveKey]=\"ActiveSection\"\n (TabChange)=\"onTabChange($event)\">\n </mj-tab-nav>\n </div>\n </mj-page-header-interior>\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)]=\"StateJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n</div>\n"]}