@memberjunction/ng-dashboards 5.22.0 → 5.24.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 (245) hide show
  1. package/README.md +51 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +364 -362
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +2 -2
  6. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +947 -64
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +7645 -430
  9. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  10. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +285 -6
  11. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  12. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +2454 -277
  13. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  14. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  15. package/dist/AI/components/execution-monitoring.component.js +191 -197
  16. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  17. package/dist/AI/components/models/model-management.component.js +9 -8
  18. package/dist/AI/components/models/model-management.component.js.map +1 -1
  19. package/dist/AI/components/prompts/prompt-management.component.js +305 -299
  20. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  21. package/dist/AI/components/system/system-configuration.component.js +319 -313
  22. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  23. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +20 -2
  24. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  25. package/dist/AI/components/vectors/vector-management-resource.component.js +419 -232
  26. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  27. package/dist/APIKeys/api-applications-panel.component.js +10 -12
  28. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  29. package/dist/APIKeys/api-key-create-dialog.component.js +13 -19
  30. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  31. package/dist/APIKeys/api-key-edit-panel.component.js +12 -14
  32. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  33. package/dist/APIKeys/api-scopes-panel.component.js +61 -68
  34. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  35. package/dist/APIKeys/api-usage-panel.component.js +10 -11
  36. package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
  37. package/dist/Actions/components/actions-list-view.component.js +82 -96
  38. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  39. package/dist/Actions/components/actions-overview.component.js +130 -134
  40. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  41. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  42. package/dist/Actions/components/categories-list-view.component.js +40 -46
  43. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  44. package/dist/Actions/components/code-management.component.js +2 -2
  45. package/dist/Actions/components/code-management.component.js.map +1 -1
  46. package/dist/Actions/components/entity-integration.component.js +2 -2
  47. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  48. package/dist/Actions/components/execution-monitoring.component.js +127 -132
  49. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  50. package/dist/Actions/components/executions-list-view.component.js +2 -2
  51. package/dist/Actions/components/executions-list-view.component.js.map +1 -1
  52. package/dist/Actions/components/explorer/action-card.component.js +11 -17
  53. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  54. package/dist/Actions/components/explorer/action-explorer.component.js +5 -11
  55. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  56. package/dist/Actions/components/explorer/action-list-item.component.js +8 -10
  57. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
  58. package/dist/Actions/components/explorer/action-toolbar.component.js +112 -133
  59. package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -1
  60. package/dist/Actions/components/explorer/action-tree-panel.component.js +63 -83
  61. package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -1
  62. package/dist/Actions/components/explorer/new-action-panel.component.js +17 -21
  63. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  64. package/dist/Actions/components/explorer/new-category-panel.component.js +17 -21
  65. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  66. package/dist/Actions/components/scheduled-actions.component.js +2 -2
  67. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  68. package/dist/Actions/components/security-permissions.component.js +2 -2
  69. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  70. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +13 -5
  71. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  72. package/dist/ComponentStudio/component-studio-dashboard.component.js +168 -145
  73. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  74. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +4 -5
  75. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  76. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +197 -200
  77. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  78. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +5 -7
  79. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  80. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +142 -148
  81. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  82. package/dist/ComponentStudio/components/browser/component-browser.component.js +153 -166
  83. package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -1
  84. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +15 -20
  85. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
  86. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +16 -21
  87. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  88. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +18 -23
  89. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
  90. package/dist/ComponentStudio/components/editors/spec-editor.component.js +25 -30
  91. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
  92. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +10 -11
  93. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -1
  94. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -1
  95. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +24 -35
  96. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
  97. package/dist/ComponentStudio/components/text-import-dialog.component.js +15 -17
  98. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
  99. package/dist/Credentials/components/credentials-categories-resource.component.js +7 -6
  100. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  101. package/dist/Credentials/components/credentials-list-resource.component.js +6 -5
  102. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  103. package/dist/Credentials/components/credentials-types-resource.component.js +7 -6
  104. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  105. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -9
  106. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  107. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  108. package/dist/DataExplorer/data-explorer-dashboard.component.js +17 -17
  109. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  110. package/dist/Home/home-dashboard.component.js +4 -4
  111. package/dist/Home/home-dashboard.component.js.map +1 -1
  112. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  113. package/dist/Integration/components/activity/activity.component.js +1 -0
  114. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  115. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  116. package/dist/Integration/components/connections/connections.component.js +5 -4
  117. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  118. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
  119. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +247 -259
  120. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  121. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
  122. package/dist/Integration/components/overview/overview.component.js +1 -0
  123. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  124. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  125. package/dist/Integration/components/pipelines/pipelines.component.js +1 -0
  126. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  127. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
  128. package/dist/Integration/components/schedules/schedules.component.js +1 -0
  129. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  130. package/dist/Integration/components/widgets/integration-card.component.js +7 -9
  131. package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
  132. package/dist/Integration/integration.module.d.ts +6 -10
  133. package/dist/Integration/integration.module.d.ts.map +1 -1
  134. package/dist/Integration/integration.module.js +12 -20
  135. package/dist/Integration/integration.module.js.map +1 -1
  136. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +411 -0
  137. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -0
  138. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +4266 -0
  139. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -0
  140. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +140 -0
  141. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -0
  142. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +780 -0
  143. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -0
  144. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +8 -2
  145. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  146. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +246 -195
  147. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  148. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +75 -0
  149. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -0
  150. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +601 -0
  151. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -0
  152. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +93 -12
  153. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +1 -1
  154. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +637 -107
  155. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +1 -1
  156. package/dist/KnowledgeHub/index.d.ts +3 -0
  157. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  158. package/dist/KnowledgeHub/index.js +3 -0
  159. package/dist/KnowledgeHub/index.js.map +1 -1
  160. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  161. package/dist/Lists/components/lists-browse-resource.component.js +9 -7
  162. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  163. package/dist/Lists/components/lists-my-lists-resource.component.js +5 -4
  164. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  165. package/dist/Lists/components/lists-operations-resource.component.js +10 -9
  166. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  167. package/dist/MCP/components/mcp-connection-dialog.component.js +141 -132
  168. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  169. package/dist/MCP/components/mcp-log-detail-panel.component.js +4 -4
  170. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
  171. package/dist/MCP/components/mcp-server-dialog.component.js +141 -128
  172. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
  173. package/dist/MCP/components/mcp-test-tool-dialog.component.js +210 -218
  174. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  175. package/dist/MCP/mcp-dashboard.component.js +2 -2
  176. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  177. package/dist/MCP/mcp.module.d.ts +6 -9
  178. package/dist/MCP/mcp.module.d.ts.map +1 -1
  179. package/dist/MCP/mcp.module.js +20 -22
  180. package/dist/MCP/mcp.module.js.map +1 -1
  181. package/dist/Scheduling/components/scheduling-activity.component.js +5 -4
  182. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  183. package/dist/Scheduling/components/scheduling-jobs.component.js +6 -5
  184. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  185. package/dist/Scheduling/components/scheduling-overview.component.js +93 -92
  186. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  187. package/dist/Testing/testing-dashboard.component.js +9 -10
  188. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  189. package/dist/__tests__/analytics-resource.test.d.ts +2 -0
  190. package/dist/__tests__/analytics-resource.test.d.ts.map +1 -0
  191. package/dist/__tests__/analytics-resource.test.js +181 -0
  192. package/dist/__tests__/analytics-resource.test.js.map +1 -0
  193. package/dist/__tests__/scheduling.test.d.ts +2 -0
  194. package/dist/__tests__/scheduling.test.d.ts.map +1 -0
  195. package/dist/__tests__/scheduling.test.js +205 -0
  196. package/dist/__tests__/scheduling.test.js.map +1 -0
  197. package/dist/actions-dashboards.module.d.ts +8 -13
  198. package/dist/actions-dashboards.module.d.ts.map +1 -1
  199. package/dist/actions-dashboards.module.js +6 -27
  200. package/dist/actions-dashboards.module.js.map +1 -1
  201. package/dist/ai-dashboards.module.d.ts +20 -20
  202. package/dist/ai-dashboards.module.d.ts.map +1 -1
  203. package/dist/ai-dashboards.module.js +43 -44
  204. package/dist/ai-dashboards.module.js.map +1 -1
  205. package/dist/communication-dashboards.module.d.ts +4 -8
  206. package/dist/communication-dashboards.module.d.ts.map +1 -1
  207. package/dist/communication-dashboards.module.js +0 -19
  208. package/dist/communication-dashboards.module.js.map +1 -1
  209. package/dist/component-studio-dashboards.module.d.ts +7 -11
  210. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  211. package/dist/component-studio-dashboards.module.js +22 -34
  212. package/dist/component-studio-dashboards.module.js.map +1 -1
  213. package/dist/core-dashboards.module.d.ts +12 -18
  214. package/dist/core-dashboards.module.d.ts.map +1 -1
  215. package/dist/core-dashboards.module.js +15 -31
  216. package/dist/core-dashboards.module.js.map +1 -1
  217. package/dist/credentials-dashboards.module.d.ts +5 -8
  218. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  219. package/dist/credentials-dashboards.module.js +3 -19
  220. package/dist/credentials-dashboards.module.js.map +1 -1
  221. package/dist/data-explorer-dashboards.module.d.ts +7 -13
  222. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  223. package/dist/data-explorer-dashboards.module.js +0 -27
  224. package/dist/data-explorer-dashboards.module.js.map +1 -1
  225. package/dist/lists-dashboards.module.d.ts +5 -8
  226. package/dist/lists-dashboards.module.d.ts.map +1 -1
  227. package/dist/lists-dashboards.module.js +3 -19
  228. package/dist/lists-dashboards.module.js.map +1 -1
  229. package/dist/public-api.d.ts +2 -0
  230. package/dist/public-api.d.ts.map +1 -1
  231. package/dist/public-api.js +2 -0
  232. package/dist/public-api.js.map +1 -1
  233. package/dist/scheduling-dashboards.module.d.ts +6 -10
  234. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  235. package/dist/scheduling-dashboards.module.js +3 -23
  236. package/dist/scheduling-dashboards.module.js.map +1 -1
  237. package/dist/shared/entity-field-display.d.ts +44 -0
  238. package/dist/shared/entity-field-display.d.ts.map +1 -0
  239. package/dist/shared/entity-field-display.js +118 -0
  240. package/dist/shared/entity-field-display.js.map +1 -0
  241. package/dist/testing-dashboards.module.d.ts +7 -13
  242. package/dist/testing-dashboards.module.d.ts.map +1 -1
  243. package/dist/testing-dashboards.module.js +0 -27
  244. package/dist/testing-dashboards.module.js.map +1 -1
  245. package/package.json +48 -55
@@ -1 +1 @@
1
- {"version":3,"file":"actions-overview.component.js","sourceRoot":"","sources":["../../../src/Actions/components/actions-overview.component.ts","../../../src/Actions/components/actions-overview.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { CompositeKey, RunView, LogError } from '@memberjunction/core';\nimport { MJActionEntity, MJActionCategoryEntity, MJActionExecutionLogEntity, ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { Subject, BehaviorSubject, combineLatest } from 'rxjs';\nimport { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';\ninterface ActionMetrics {\n totalActions: number;\n activeActions: number;\n pendingActions: number;\n disabledActions: number;\n totalExecutions: number;\n recentExecutions: number;\n successRate: number;\n totalCategories: number;\n aiGeneratedActions: number;\n customActions: number;\n}\n\ninterface CategoryStats {\n categoryId: string;\n categoryName: string;\n actionCount: number;\n executionCount: number;\n successRate: number;\n}\n\ninterface ExecutionWithExpanded extends MJActionExecutionLogEntity {\n isExpanded?: boolean;\n}\n\n/**\n * Actions Overview Resource - displays action management dashboard\n */\n@RegisterClass(BaseResourceComponent, 'ActionsOverviewResource')\n@Component({\n standalone: false,\n selector: 'mj-actions-overview',\n templateUrl: './actions-overview.component.html',\n styleUrls: ['./actions-overview.component.css']\n})\nexport class ActionsOverviewComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading: boolean = true;\n public metrics: ActionMetrics = {\n totalActions: 0,\n activeActions: 0,\n pendingActions: 0,\n disabledActions: 0,\n totalExecutions: 0,\n recentExecutions: 0,\n successRate: 0,\n totalCategories: 0,\n aiGeneratedActions: 0,\n customActions: 0\n };\n\n public categoryStats: CategoryStats[] = [];\n public recentActions: MJActionEntity[] = [];\n public recentExecutions: ExecutionWithExpanded[] = [];\n public topCategories: MJActionCategoryEntity[] = [];\n\n public searchTerm$ = new BehaviorSubject<string>('');\n public selectedStatus$ = new BehaviorSubject<string>('all');\n public selectedType$ = new BehaviorSubject<string>('all');\n\n private destroy$ = new Subject<void>();\n\n constructor(private navigationService: NavigationService, \n private cdr: ChangeDetectorRef ) {\n super();\n }\n\n ngOnInit(): void {\n this.setupFilters();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupFilters(): void {\n combineLatest([\n this.searchTerm$.pipe(debounceTime(300), distinctUntilChanged()),\n this.selectedStatus$.pipe(distinctUntilChanged()),\n this.selectedType$.pipe(distinctUntilChanged())\n ]).pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.loadFilteredData();\n });\n }\n\n private async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Load all data in a single batch using RunViews\n const rv = new RunView();\n \n const [actionsResult, categoriesResult, executionsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Actions', \n OrderBy: '__mj_UpdatedAt DESC' \n },\n {\n EntityName: 'MJ: Action Categories', \n OrderBy: 'Name' \n },\n {\n EntityName: 'MJ: Action Execution Logs', \n OrderBy: 'StartedAt DESC', \n }\n ]);\n \n if (!actionsResult.Success || !categoriesResult.Success || !executionsResult.Success) {\n const errors = [];\n if (!actionsResult.Success) errors.push('Actions: ' + actionsResult.ErrorMessage);\n if (!categoriesResult.Success) errors.push('Categories: ' + categoriesResult.ErrorMessage);\n if (!executionsResult.Success) errors.push('Executions: ' + executionsResult.ErrorMessage);\n throw new Error('Failed to load data: ' + errors.join(', '));\n }\n \n const actions = (actionsResult.Results || []) as MJActionEntity[];\n const categories = (categoriesResult.Results || []) as MJActionCategoryEntity[];\n const executions = (executionsResult.Results || []) as MJActionExecutionLogEntity[];\n\n this.calculateMetrics(actions, categories, executions);\n this.calculateCategoryStats(actions, categories, executions);\n this.recentActions = actions.slice(0, 10);\n this.recentExecutions = executions.slice(0, 10).map(e => ({ ...e, isExpanded: false } as ExecutionWithExpanded));\n this.topCategories = categories.slice(0, 5);\n } catch (error) {\n console.error('Error loading actions overview data:', error);\n LogError('Failed to load actions overview data', undefined, error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n this.NotifyLoadComplete();\n }\n }\n\n private calculateMetrics(\n actions: MJActionEntity[], \n categories: MJActionCategoryEntity[], \n executions: MJActionExecutionLogEntity[]\n ): void {\n this.metrics = {\n totalActions: actions.length,\n activeActions: actions.filter(a => a.Status === 'Active').length,\n pendingActions: actions.filter(a => a.Status === 'Pending').length,\n disabledActions: actions.filter(a => a.Status === 'Disabled').length,\n totalExecutions: executions.length,\n recentExecutions: executions.filter(e => {\n const dayAgo = new Date();\n dayAgo.setDate(dayAgo.getDate() - 1);\n return e.StartedAt && new Date(e.StartedAt) > dayAgo;\n }).length,\n successRate: this.calculateSuccessRate(executions),\n totalCategories: categories.length,\n aiGeneratedActions: actions.filter(a => a.Type === 'Generated').length,\n customActions: actions.filter(a => a.Type === 'Custom').length\n };\n }\n\n private calculateSuccessRate(executions: MJActionExecutionLogEntity[]): number {\n if (!executions || executions.length === 0) return 0;\n // Check for success based on result code - Actions may use different success codes\n const successful = executions.filter(e => {\n const code = e.ResultCode?.toLowerCase();\n return code === 'success' || code === 'ok' || code === 'completed' || code === '200';\n }).length;\n return Math.round((successful / executions.length) * 100);\n }\n\n private calculateCategoryStats(\n actions: MJActionEntity[], \n categories: MJActionCategoryEntity[], \n executions: MJActionExecutionLogEntity[]\n ): void {\n this.categoryStats = categories.map(category => {\n const categoryActions = actions.filter(a => UUIDsEqual(a.CategoryID, category.ID));\n const categoryExecutions = executions.filter(e => \n categoryActions.some(a => UUIDsEqual(a.ID, e.ActionID))\n );\n \n return {\n categoryId: category.ID,\n categoryName: category.Name,\n actionCount: categoryActions.length,\n executionCount: categoryExecutions.length,\n successRate: this.calculateSuccessRate(categoryExecutions)\n };\n });\n }\n\n private async loadFilteredData(): Promise<void> {\n // Implement filtered data loading based on current filter values\n const searchTerm = this.searchTerm$.value;\n const status = this.selectedStatus$.value;\n const type = this.selectedType$.value;\n\n let extraFilter = '';\n const filters: string[] = [];\n\n if (status !== 'all') {\n filters.push(`Status = '${status}'`);\n }\n\n if (type !== 'all') {\n filters.push(`Type = '${type}'`);\n }\n\n if (filters.length > 0) {\n extraFilter = filters.join(' AND ');\n }\n\n try {\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: 'MJ: Actions',\n ExtraFilter: extraFilter,\n OrderBy: '__mj_UpdatedAt DESC',\n UserSearchString: searchTerm,\n IgnoreMaxRows: false,\n MaxRows: 1000\n });\n \n this.recentActions = ((result.Results || []) as MJActionEntity[]).slice(0, 10);\n } catch (error) {\n LogError('Failed to load filtered actions', undefined, error);\n }\n }\n\n public onSearchChange(searchTerm: string): void {\n this.searchTerm$.next(searchTerm);\n }\n\n public onStatusFilterChange(status: string): void {\n this.selectedStatus$.next(status);\n }\n\n public onTypeFilterChange(type: string): void {\n this.selectedType$.next(type);\n }\n\n public openAction(action: MJActionEntity): void {\n const key = new CompositeKey([{ FieldName: 'ID', Value: action.ID }]);\n this.navigationService.OpenEntityRecord('MJ: Actions', key);\n }\n\n public openCategory(categoryId: string): void {\n const key = new CompositeKey([{ FieldName: 'ID', Value: categoryId }]);\n this.navigationService.OpenEntityRecord('MJ: Action Categories', key);\n }\n\n public openExecution(execution: MJActionExecutionLogEntity): void {\n const key = new CompositeKey([{ FieldName: 'ID', Value: execution.ID }]);\n this.navigationService.OpenEntityRecord('MJ: Action Execution Logs', key);\n }\n\n public isExecutionSuccess(execution: MJActionExecutionLogEntity): boolean {\n const code = execution.ResultCode?.toLowerCase();\n return code === 'success' || code === 'ok' || code === 'completed' || code === '200';\n }\n\n public getStatusColor(status: string): 'success' | 'warning' | 'error' | 'info' {\n switch (status) {\n case 'Active': return 'success';\n case 'Pending': return 'warning';\n case 'Disabled': return 'error';\n default: return 'info';\n }\n }\n\n public getTypeIcon(type: string): string {\n switch (type) {\n case 'Generated': return 'fa-solid fa-robot';\n case 'Custom': return 'fa-solid fa-code';\n default: return 'fa-solid fa-cog';\n }\n }\n\n // Metric card click handlers - these now filter the current view\n public onTotalActionsClick(): void {\n // Reset filters to show all actions\n this.selectedStatus$.next('all');\n this.selectedType$.next('all');\n }\n\n public onExecutionsClick(): void {\n // This would navigate to execution monitoring resource\n }\n\n public onCategoriesClick(): void {\n // This would navigate to categories view\n }\n\n public onAIGeneratedClick(): void {\n // Filter to show AI generated actions in the current view\n this.selectedType$.next('Generated');\n }\n\n public onActionGalleryClick(): void {\n // This would navigate to action gallery view\n }\n\n public toggleExecutionExpanded(execution: ExecutionWithExpanded): void {\n execution.isExpanded = !execution.isExpanded;\n }\n\n public formatJsonParams(params: string | null): string {\n if (!params) return '{}';\n try {\n // Try to parse and reformat\n const parsed = JSON.parse(params);\n return JSON.stringify(parsed, null, 2);\n } catch {\n // If parse fails, return as is\n return params;\n }\n }\n\n /**\n * Gets the icon class for an action\n * Falls back to type-based icon if no IconClass is set\n */\n public getActionIcon(action: MJActionEntity): string {\n return action?.IconClass || this.getTypeIcon(action.Type);\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Actions Overview';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-bolt';\n }\n}","<div class=\"actions-overview\" >\n <!-- Header with search and filters -->\n <div class=\"overview-header\">\n <div class=\"filters-row\">\n <div class=\"search-container\">\n <kendo-textbox \n placeholder=\"Search actions...\" \n [value]=\"searchTerm$.value\"\n (valueChange)=\"onSearchChange($event)\">\n <ng-template kendoTextBoxPrefixTemplate>\n <i class=\"fa-solid fa-search\"></i>\n </ng-template>\n </kendo-textbox>\n </div>\n \n <div class=\"filter-container\">\n <kendo-dropdownlist \n [data]=\"[\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Pending', value: 'Pending' },\n { text: 'Disabled', value: 'Disabled' }\n ]\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [value]=\"selectedStatus$.value\"\n (valueChange)=\"onStatusFilterChange($event)\">\n </kendo-dropdownlist>\n </div>\n \n <div class=\"filter-container\">\n <kendo-dropdownlist \n [data]=\"[\n { text: 'All Types', value: 'all' },\n { text: 'AI Generated', value: 'Generated' },\n { text: 'Custom', value: 'Custom' }\n ]\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [value]=\"selectedType$.value\"\n (valueChange)=\"onTypeFilterChange($event)\">\n </kendo-dropdownlist>\n </div>\n </div>\n </div>\n\n <!-- Metrics Cards -->\n <div class=\"metrics-grid\">\n <div class=\"metric-card primary clickable\" (click)=\"onTotalActionsClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-cogs\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.totalActions }}</div>\n <div class=\"metric-label\">Total Actions</div>\n <div class=\"metric-breakdown\">\n <span class=\"active\">{{ metrics.activeActions }} Active</span>\n <span class=\"pending\">{{ metrics.pendingActions }} Pending</span>\n <span class=\"disabled\">{{ metrics.disabledActions }} Disabled</span>\n </div>\n </div>\n </div>\n\n <div class=\"metric-card success clickable\" (click)=\"onExecutionsClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-play-circle\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.totalExecutions }}</div>\n <div class=\"metric-label\">Total Executions</div>\n <div class=\"metric-breakdown\">\n <span class=\"recent\">{{ metrics.recentExecutions }} in last 24h</span>\n <span class=\"success-rate\">{{ metrics.successRate }}% success rate</span>\n </div>\n </div>\n </div>\n\n <div class=\"metric-card info clickable\" (click)=\"onCategoriesClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-sitemap\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.totalCategories }}</div>\n <div class=\"metric-label\">Categories</div>\n <div class=\"metric-breakdown\">\n <span>Organized structure</span>\n </div>\n </div>\n </div>\n\n <div class=\"metric-card warning clickable\" (click)=\"onAIGeneratedClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-robot\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.aiGeneratedActions }}</div>\n <div class=\"metric-label\">AI Generated</div>\n <div class=\"metric-breakdown\">\n <span class=\"custom\">{{ metrics.customActions }} Custom</span>\n </div>\n </div>\n </div>\n \n <div class=\"metric-card gallery clickable\" (click)=\"onActionGalleryClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-th\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">\n <i class=\"fa-solid fa-sparkles\"></i>\n </div>\n <div class=\"metric-label\">Action Gallery</div>\n <div class=\"metric-breakdown\">\n <span>Visual action browser</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Content Grid -->\n <div class=\"content-grid\">\n <!-- Category Statistics -->\n <div class=\"panel category-stats\">\n <div class=\"panel-header\">\n <h3><i class=\"fa-solid fa-chart-bar\"></i> Category Performance</h3>\n </div>\n <div class=\"panel-content\">\n @if (categoryStats.length > 0) {\n <div class=\"category-list\">\n @for (category of categoryStats; track category.categoryId) {\n <div class=\"category-item\" (click)=\"openCategory(category.categoryId)\">\n <div class=\"category-info\">\n <div class=\"category-name\">{{ category.categoryName }}</div>\n <div class=\"category-metrics\">\n <span class=\"metric\">{{ category.actionCount }} actions</span>\n <span class=\"metric\">{{ category.executionCount }} executions</span>\n <span class=\"metric success-rate\">{{ category.successRate }}% success</span>\n </div>\n </div>\n <div class=\"category-chart\">\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" [style.width.%]=\"category.successRate\"></div>\n </div>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-chart-bar\"></i>\n <p>No category statistics available</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Recent Actions -->\n <div class=\"panel recent-actions\">\n <div class=\"panel-header\">\n <h3><i class=\"fa-solid fa-clock\"></i> Recent Actions</h3>\n </div>\n <div class=\"panel-content\">\n @if (recentActions.length > 0) {\n <div class=\"actions-list\">\n @for (action of recentActions; track action.ID) {\n <div class=\"action-item\" (click)=\"openAction(action)\">\n <div class=\"action-icon\">\n <i [class]=\"getActionIcon(action)\"></i>\n </div>\n <div class=\"action-info\">\n <div class=\"action-name\">{{ action.Name }}</div>\n <div class=\"action-description\">{{ action.Description || 'No description' }}</div>\n </div>\n <div class=\"action-status\">\n <kendo-chip \n [themeColor]=\"getStatusColor(action.Status)\"\n [size]=\"'small'\">\n {{ action.Status }}\n </kendo-chip>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-cogs\"></i>\n <p>No recent actions found</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Recent Executions -->\n <div class=\"panel recent-executions\">\n <div class=\"panel-header\">\n <h3><i class=\"fa-solid fa-history\"></i> Recent Executions</h3>\n </div>\n <div class=\"panel-content\">\n @if (recentExecutions.length > 0) {\n <div class=\"executions-list\">\n @for (execution of recentExecutions; track execution.ID) {\n <div class=\"execution-item\" [class.expanded]=\"execution.isExpanded\">\n <div class=\"execution-header\" (click)=\"toggleExecutionExpanded(execution)\">\n <div class=\"execution-time\">\n {{ execution.StartedAt | date:'MMM d, HH:mm' }}\n </div>\n <div class=\"execution-info\">\n <div class=\"execution-action\">{{ execution.Action || 'Action ID: ' + execution.ActionID }}</div>\n <div class=\"execution-user\">{{ execution.User || 'User ID: ' + execution.UserID }}</div>\n </div>\n <div class=\"execution-result\">\n <kendo-chip \n [themeColor]=\"isExecutionSuccess(execution) ? 'success' : 'error'\"\n [size]=\"'small'\">\n {{ execution.ResultCode || 'Unknown' }}\n </kendo-chip>\n </div>\n <div class=\"execution-expand-icon\">\n <i [class]=\"execution.isExpanded ? 'fa-solid fa-chevron-up' : 'fa-solid fa-chevron-down'\"></i>\n </div>\n </div>\n @if (execution.isExpanded) {\n <div class=\"execution-details\">\n <div class=\"params-section\">\n <h5><i class=\"fa-solid fa-sliders\"></i> Parameters</h5>\n <mj-code-editor \n [ngModel]=\"formatJsonParams(execution.Params)\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 150px; width: 100%;\">\n </mj-code-editor>\n </div>\n <div class=\"execution-actions\">\n <button kendoButton \n themeColor=\"primary\" \n size=\"small\"\n (click)=\"openExecution(execution)\">\n <i class=\"fa-solid fa-external-link\"></i> Open Details\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-history\"></i>\n <p>No recent executions found</p>\n </div>\n }\n </div>\n </div>\n </div>\n\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <mj-loading [showText]=\"false\" size=\"medium\"></mj-loading>\n </div>\n }\n</div>"]}
1
+ {"version":3,"file":"actions-overview.component.js","sourceRoot":"","sources":["../../../src/Actions/components/actions-overview.component.ts","../../../src/Actions/components/actions-overview.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { CompositeKey, RunView, LogError } from '@memberjunction/core';\nimport { MJActionEntity, MJActionCategoryEntity, MJActionExecutionLogEntity, ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { Subject, BehaviorSubject, combineLatest } from 'rxjs';\nimport { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';\ninterface ActionMetrics {\n totalActions: number;\n activeActions: number;\n pendingActions: number;\n disabledActions: number;\n totalExecutions: number;\n recentExecutions: number;\n successRate: number;\n totalCategories: number;\n aiGeneratedActions: number;\n customActions: number;\n}\n\ninterface CategoryStats {\n categoryId: string;\n categoryName: string;\n actionCount: number;\n executionCount: number;\n successRate: number;\n}\n\ninterface ExecutionWithExpanded extends MJActionExecutionLogEntity {\n isExpanded?: boolean;\n}\n\n/**\n * Actions Overview Resource - displays action management dashboard\n */\n@RegisterClass(BaseResourceComponent, 'ActionsOverviewResource')\n@Component({\n standalone: false,\n selector: 'mj-actions-overview',\n templateUrl: './actions-overview.component.html',\n styleUrls: ['./actions-overview.component.css']\n})\nexport class ActionsOverviewComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading: boolean = true;\n public metrics: ActionMetrics = {\n totalActions: 0,\n activeActions: 0,\n pendingActions: 0,\n disabledActions: 0,\n totalExecutions: 0,\n recentExecutions: 0,\n successRate: 0,\n totalCategories: 0,\n aiGeneratedActions: 0,\n customActions: 0\n };\n\n public categoryStats: CategoryStats[] = [];\n public recentActions: MJActionEntity[] = [];\n public recentExecutions: ExecutionWithExpanded[] = [];\n public topCategories: MJActionCategoryEntity[] = [];\n\n public searchTerm$ = new BehaviorSubject<string>('');\n public selectedStatus$ = new BehaviorSubject<string>('all');\n public selectedType$ = new BehaviorSubject<string>('all');\n\n private destroy$ = new Subject<void>();\n\n constructor(private navigationService: NavigationService, \n private cdr: ChangeDetectorRef ) {\n super();\n }\n\n ngOnInit(): void {\n this.setupFilters();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupFilters(): void {\n combineLatest([\n this.searchTerm$.pipe(debounceTime(300), distinctUntilChanged()),\n this.selectedStatus$.pipe(distinctUntilChanged()),\n this.selectedType$.pipe(distinctUntilChanged())\n ]).pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.loadFilteredData();\n });\n }\n\n private async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Load all data in a single batch using RunViews\n const rv = new RunView();\n \n const [actionsResult, categoriesResult, executionsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Actions', \n OrderBy: '__mj_UpdatedAt DESC' \n },\n {\n EntityName: 'MJ: Action Categories', \n OrderBy: 'Name' \n },\n {\n EntityName: 'MJ: Action Execution Logs', \n OrderBy: 'StartedAt DESC', \n }\n ]);\n \n if (!actionsResult.Success || !categoriesResult.Success || !executionsResult.Success) {\n const errors = [];\n if (!actionsResult.Success) errors.push('Actions: ' + actionsResult.ErrorMessage);\n if (!categoriesResult.Success) errors.push('Categories: ' + categoriesResult.ErrorMessage);\n if (!executionsResult.Success) errors.push('Executions: ' + executionsResult.ErrorMessage);\n throw new Error('Failed to load data: ' + errors.join(', '));\n }\n \n const actions = (actionsResult.Results || []) as MJActionEntity[];\n const categories = (categoriesResult.Results || []) as MJActionCategoryEntity[];\n const executions = (executionsResult.Results || []) as MJActionExecutionLogEntity[];\n\n this.calculateMetrics(actions, categories, executions);\n this.calculateCategoryStats(actions, categories, executions);\n this.recentActions = actions.slice(0, 10);\n this.recentExecutions = executions.slice(0, 10).map(e => ({ ...e, isExpanded: false } as ExecutionWithExpanded));\n this.topCategories = categories.slice(0, 5);\n } catch (error) {\n console.error('Error loading actions overview data:', error);\n LogError('Failed to load actions overview data', undefined, error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n this.NotifyLoadComplete();\n }\n }\n\n private calculateMetrics(\n actions: MJActionEntity[], \n categories: MJActionCategoryEntity[], \n executions: MJActionExecutionLogEntity[]\n ): void {\n this.metrics = {\n totalActions: actions.length,\n activeActions: actions.filter(a => a.Status === 'Active').length,\n pendingActions: actions.filter(a => a.Status === 'Pending').length,\n disabledActions: actions.filter(a => a.Status === 'Disabled').length,\n totalExecutions: executions.length,\n recentExecutions: executions.filter(e => {\n const dayAgo = new Date();\n dayAgo.setDate(dayAgo.getDate() - 1);\n return e.StartedAt && new Date(e.StartedAt) > dayAgo;\n }).length,\n successRate: this.calculateSuccessRate(executions),\n totalCategories: categories.length,\n aiGeneratedActions: actions.filter(a => a.Type === 'Generated').length,\n customActions: actions.filter(a => a.Type === 'Custom').length\n };\n }\n\n private calculateSuccessRate(executions: MJActionExecutionLogEntity[]): number {\n if (!executions || executions.length === 0) return 0;\n // Check for success based on result code - Actions may use different success codes\n const successful = executions.filter(e => {\n const code = e.ResultCode?.toLowerCase();\n return code === 'success' || code === 'ok' || code === 'completed' || code === '200';\n }).length;\n return Math.round((successful / executions.length) * 100);\n }\n\n private calculateCategoryStats(\n actions: MJActionEntity[], \n categories: MJActionCategoryEntity[], \n executions: MJActionExecutionLogEntity[]\n ): void {\n this.categoryStats = categories.map(category => {\n const categoryActions = actions.filter(a => UUIDsEqual(a.CategoryID, category.ID));\n const categoryExecutions = executions.filter(e => \n categoryActions.some(a => UUIDsEqual(a.ID, e.ActionID))\n );\n \n return {\n categoryId: category.ID,\n categoryName: category.Name,\n actionCount: categoryActions.length,\n executionCount: categoryExecutions.length,\n successRate: this.calculateSuccessRate(categoryExecutions)\n };\n });\n }\n\n private async loadFilteredData(): Promise<void> {\n // Implement filtered data loading based on current filter values\n const searchTerm = this.searchTerm$.value;\n const status = this.selectedStatus$.value;\n const type = this.selectedType$.value;\n\n let extraFilter = '';\n const filters: string[] = [];\n\n if (status !== 'all') {\n filters.push(`Status = '${status}'`);\n }\n\n if (type !== 'all') {\n filters.push(`Type = '${type}'`);\n }\n\n if (filters.length > 0) {\n extraFilter = filters.join(' AND ');\n }\n\n try {\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: 'MJ: Actions',\n ExtraFilter: extraFilter,\n OrderBy: '__mj_UpdatedAt DESC',\n UserSearchString: searchTerm,\n IgnoreMaxRows: false,\n MaxRows: 1000\n });\n \n this.recentActions = ((result.Results || []) as MJActionEntity[]).slice(0, 10);\n } catch (error) {\n LogError('Failed to load filtered actions', undefined, error);\n }\n }\n\n public onSearchChange(searchTerm: string): void {\n this.searchTerm$.next(searchTerm);\n }\n\n public onStatusFilterChange(status: string): void {\n this.selectedStatus$.next(status);\n }\n\n public onTypeFilterChange(type: string): void {\n this.selectedType$.next(type);\n }\n\n public openAction(action: MJActionEntity): void {\n const key = new CompositeKey([{ FieldName: 'ID', Value: action.ID }]);\n this.navigationService.OpenEntityRecord('MJ: Actions', key);\n }\n\n public openCategory(categoryId: string): void {\n const key = new CompositeKey([{ FieldName: 'ID', Value: categoryId }]);\n this.navigationService.OpenEntityRecord('MJ: Action Categories', key);\n }\n\n public openExecution(execution: MJActionExecutionLogEntity): void {\n const key = new CompositeKey([{ FieldName: 'ID', Value: execution.ID }]);\n this.navigationService.OpenEntityRecord('MJ: Action Execution Logs', key);\n }\n\n public isExecutionSuccess(execution: MJActionExecutionLogEntity): boolean {\n const code = execution.ResultCode?.toLowerCase();\n return code === 'success' || code === 'ok' || code === 'completed' || code === '200';\n }\n\n public getStatusColor(status: string): 'success' | 'warning' | 'error' | 'info' {\n switch (status) {\n case 'Active': return 'success';\n case 'Pending': return 'warning';\n case 'Disabled': return 'error';\n default: return 'info';\n }\n }\n\n public getTypeIcon(type: string): string {\n switch (type) {\n case 'Generated': return 'fa-solid fa-robot';\n case 'Custom': return 'fa-solid fa-code';\n default: return 'fa-solid fa-cog';\n }\n }\n\n // Metric card click handlers - these now filter the current view\n public onTotalActionsClick(): void {\n // Reset filters to show all actions\n this.selectedStatus$.next('all');\n this.selectedType$.next('all');\n }\n\n public onExecutionsClick(): void {\n // This would navigate to execution monitoring resource\n }\n\n public onCategoriesClick(): void {\n // This would navigate to categories view\n }\n\n public onAIGeneratedClick(): void {\n // Filter to show AI generated actions in the current view\n this.selectedType$.next('Generated');\n }\n\n public onActionGalleryClick(): void {\n // This would navigate to action gallery view\n }\n\n public toggleExecutionExpanded(execution: ExecutionWithExpanded): void {\n execution.isExpanded = !execution.isExpanded;\n }\n\n public formatJsonParams(params: string | null): string {\n if (!params) return '{}';\n try {\n // Try to parse and reformat\n const parsed = JSON.parse(params);\n return JSON.stringify(parsed, null, 2);\n } catch {\n // If parse fails, return as is\n return params;\n }\n }\n\n /**\n * Gets the icon class for an action\n * Falls back to type-based icon if no IconClass is set\n */\n public getActionIcon(action: MJActionEntity): string {\n return action?.IconClass || this.getTypeIcon(action.Type);\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Actions Overview';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-bolt';\n }\n}","<div class=\"actions-overview\" >\n <!-- Header with search and filters -->\n <div class=\"overview-header\">\n <div class=\"filters-row\">\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\" class=\"mj-input\"\n placeholder=\"Search actions...\"\n [value]=\"searchTerm$.value\"\n (input)=\"onSearchChange($any($event.target).value)\" />\n </div>\n </div>\n \n <div class=\"filter-container\">\n <mj-dropdown\n [Data]=\"[\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Pending', value: 'Pending' },\n { text: 'Disabled', value: 'Disabled' }\n ]\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedStatus$.value\"\n (ValueChange)=\"onStatusFilterChange($any($event))\">\n </mj-dropdown>\n </div>\n \n <div class=\"filter-container\">\n <mj-dropdown\n [Data]=\"[\n { text: 'All Types', value: 'all' },\n { text: 'AI Generated', value: 'Generated' },\n { text: 'Custom', value: 'Custom' }\n ]\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedType$.value\"\n (ValueChange)=\"onTypeFilterChange($any($event))\">\n </mj-dropdown>\n </div>\n </div>\n </div>\n\n <!-- Metrics Cards -->\n <div class=\"metrics-grid\">\n <div class=\"metric-card primary clickable\" (click)=\"onTotalActionsClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-cogs\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.totalActions }}</div>\n <div class=\"metric-label\">Total Actions</div>\n <div class=\"metric-breakdown\">\n <span class=\"active\">{{ metrics.activeActions }} Active</span>\n <span class=\"pending\">{{ metrics.pendingActions }} Pending</span>\n <span class=\"disabled\">{{ metrics.disabledActions }} Disabled</span>\n </div>\n </div>\n </div>\n\n <div class=\"metric-card success clickable\" (click)=\"onExecutionsClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-play-circle\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.totalExecutions }}</div>\n <div class=\"metric-label\">Total Executions</div>\n <div class=\"metric-breakdown\">\n <span class=\"recent\">{{ metrics.recentExecutions }} in last 24h</span>\n <span class=\"success-rate\">{{ metrics.successRate }}% success rate</span>\n </div>\n </div>\n </div>\n\n <div class=\"metric-card info clickable\" (click)=\"onCategoriesClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-sitemap\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.totalCategories }}</div>\n <div class=\"metric-label\">Categories</div>\n <div class=\"metric-breakdown\">\n <span>Organized structure</span>\n </div>\n </div>\n </div>\n\n <div class=\"metric-card warning clickable\" (click)=\"onAIGeneratedClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-robot\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.aiGeneratedActions }}</div>\n <div class=\"metric-label\">AI Generated</div>\n <div class=\"metric-breakdown\">\n <span class=\"custom\">{{ metrics.customActions }} Custom</span>\n </div>\n </div>\n </div>\n \n <div class=\"metric-card gallery clickable\" (click)=\"onActionGalleryClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-th\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">\n <i class=\"fa-solid fa-sparkles\"></i>\n </div>\n <div class=\"metric-label\">Action Gallery</div>\n <div class=\"metric-breakdown\">\n <span>Visual action browser</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Content Grid -->\n <div class=\"content-grid\">\n <!-- Category Statistics -->\n <div class=\"panel category-stats\">\n <div class=\"panel-header\">\n <h3><i class=\"fa-solid fa-chart-bar\"></i> Category Performance</h3>\n </div>\n <div class=\"panel-content\">\n @if (categoryStats.length > 0) {\n <div class=\"category-list\">\n @for (category of categoryStats; track category.categoryId) {\n <div class=\"category-item\" (click)=\"openCategory(category.categoryId)\">\n <div class=\"category-info\">\n <div class=\"category-name\">{{ category.categoryName }}</div>\n <div class=\"category-metrics\">\n <span class=\"metric\">{{ category.actionCount }} actions</span>\n <span class=\"metric\">{{ category.executionCount }} executions</span>\n <span class=\"metric success-rate\">{{ category.successRate }}% success</span>\n </div>\n </div>\n <div class=\"category-chart\">\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" [style.width.%]=\"category.successRate\"></div>\n </div>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-chart-bar\"></i>\n <p>No category statistics available</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Recent Actions -->\n <div class=\"panel recent-actions\">\n <div class=\"panel-header\">\n <h3><i class=\"fa-solid fa-clock\"></i> Recent Actions</h3>\n </div>\n <div class=\"panel-content\">\n @if (recentActions.length > 0) {\n <div class=\"actions-list\">\n @for (action of recentActions; track action.ID) {\n <div class=\"action-item\" (click)=\"openAction(action)\">\n <div class=\"action-icon\">\n <i [class]=\"getActionIcon(action)\"></i>\n </div>\n <div class=\"action-info\">\n <div class=\"action-name\">{{ action.Name }}</div>\n <div class=\"action-description\">{{ action.Description || 'No description' }}</div>\n </div>\n <div class=\"action-status\">\n <span class=\"status-chip\" [attr.data-color]=\"getStatusColor(action.Status)\">\n {{ action.Status }}\n </span>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-cogs\"></i>\n <p>No recent actions found</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Recent Executions -->\n <div class=\"panel recent-executions\">\n <div class=\"panel-header\">\n <h3><i class=\"fa-solid fa-history\"></i> Recent Executions</h3>\n </div>\n <div class=\"panel-content\">\n @if (recentExecutions.length > 0) {\n <div class=\"executions-list\">\n @for (execution of recentExecutions; track execution.ID) {\n <div class=\"execution-item\" [class.expanded]=\"execution.isExpanded\">\n <div class=\"execution-header\" (click)=\"toggleExecutionExpanded(execution)\">\n <div class=\"execution-time\">\n {{ execution.StartedAt | date:'MMM d, HH:mm' }}\n </div>\n <div class=\"execution-info\">\n <div class=\"execution-action\">{{ execution.Action || 'Action ID: ' + execution.ActionID }}</div>\n <div class=\"execution-user\">{{ execution.User || 'User ID: ' + execution.UserID }}</div>\n </div>\n <div class=\"execution-result\">\n <span class=\"status-chip\" [attr.data-color]=\"isExecutionSuccess(execution) ? 'success' : 'error'\">\n {{ execution.ResultCode || 'Unknown' }}\n </span>\n </div>\n <div class=\"execution-expand-icon\">\n <i [class]=\"execution.isExpanded ? 'fa-solid fa-chevron-up' : 'fa-solid fa-chevron-down'\"></i>\n </div>\n </div>\n @if (execution.isExpanded) {\n <div class=\"execution-details\">\n <div class=\"params-section\">\n <h5><i class=\"fa-solid fa-sliders\"></i> Parameters</h5>\n <mj-code-editor \n [ngModel]=\"formatJsonParams(execution.Params)\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 150px; width: 100%;\">\n </mj-code-editor>\n </div>\n <div class=\"execution-actions\">\n <button mjButton\n variant=\"primary\"\n size=\"sm\"\n (click)=\"openExecution(execution)\">\n <i class=\"fa-solid fa-external-link\"></i> Open Details\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-history\"></i>\n <p>No recent executions found</p>\n </div>\n }\n </div>\n </div>\n </div>\n\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <mj-loading [showText]=\"false\" size=\"medium\"></mj-loading>\n </div>\n }\n</div>"]}
@@ -1 +1 @@
1
- {"version":3,"file":"categories-list-view.component.d.ts","sourceRoot":"","sources":["../../../src/Actions/components/categories-list-view.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAU,YAAY,EAAE,MAAM,eAAe,CAAC;AAEnF,OAAO,EAAE,sBAAsB,EAAkB,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAW,eAAe,EAAE,MAAM,MAAM,CAAC;;AAIhD,UAAU,iBAAkB,SAAQ,sBAAsB;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAkSa,2BAA4B,YAAW,MAAM,EAAE,SAAS;IACzD,gBAAgB;oBAAiC,MAAM;kBAAY,MAAM;OAAK;IAEjF,SAAS,UAAQ;IACjB,UAAU,EAAE,iBAAiB,EAAE,CAAM;IACrC,kBAAkB,EAAE,iBAAiB,EAAE,CAAM;IAC7C,WAAW,0BAAmC;IAErD,OAAO,CAAC,QAAQ,CAAuB;;IAIvC,QAAQ,IAAI,IAAI;IAKhB,WAAW,IAAI,IAAI;IAKnB,OAAO,CAAC,WAAW;YAUL,QAAQ;IAmDtB,OAAO,CAAC,WAAW;IAaZ,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIxC,YAAY,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAOpD,WAAW,CAAC,QAAQ,EAAE,sBAAsB,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;yCA3G7D,2BAA2B;2CAA3B,2BAA2B;CAiHvC"}
1
+ {"version":3,"file":"categories-list-view.component.d.ts","sourceRoot":"","sources":["../../../src/Actions/components/categories-list-view.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAU,YAAY,EAAE,MAAM,eAAe,CAAC;AAEnF,OAAO,EAAE,sBAAsB,EAAkB,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAW,eAAe,EAAE,MAAM,MAAM,CAAC;;AAIhD,UAAU,iBAAkB,SAAQ,sBAAsB;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAiSa,2BAA4B,YAAW,MAAM,EAAE,SAAS;IACzD,gBAAgB;oBAAiC,MAAM;kBAAY,MAAM;OAAK;IAEjF,SAAS,UAAQ;IACjB,UAAU,EAAE,iBAAiB,EAAE,CAAM;IACrC,kBAAkB,EAAE,iBAAiB,EAAE,CAAM;IAC7C,WAAW,0BAAmC;IAErD,OAAO,CAAC,QAAQ,CAAuB;;IAIvC,QAAQ,IAAI,IAAI;IAKhB,WAAW,IAAI,IAAI;IAKnB,OAAO,CAAC,WAAW;YAUL,QAAQ;IAmDtB,OAAO,CAAC,WAAW;IAaZ,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIxC,YAAY,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAOpD,WAAW,CAAC,QAAQ,EAAE,sBAAsB,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;yCA3G7D,2BAA2B;2CAA3B,2BAA2B;CAiHvC"}
@@ -4,15 +4,11 @@ import { Subject, BehaviorSubject } from 'rxjs';
4
4
  import { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';
5
5
  import { UUIDsEqual } from '@memberjunction/global';
6
6
  import * as i0 from "@angular/core";
7
- import * as i1 from "@progress/kendo-angular-buttons";
8
- import * as i2 from "@progress/kendo-angular-inputs";
9
- import * as i3 from "@memberjunction/ng-container-directives";
10
- import * as i4 from "@memberjunction/ng-shared-generic";
7
+ import * as i1 from "@memberjunction/ng-ui-components";
8
+ import * as i2 from "@memberjunction/ng-container-directives";
9
+ import * as i3 from "@memberjunction/ng-shared-generic";
11
10
  const _forTrack0 = ($index, $item) => $item.ID;
12
- function CategoriesListViewComponent_ng_template_10_Template(rf, ctx) { if (rf & 1) {
13
- i0.ɵɵelement(0, "i", 11);
14
- } }
15
- function CategoriesListViewComponent_Conditional_12_For_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
11
+ function CategoriesListViewComponent_Conditional_13_For_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
16
12
  i0.ɵɵelementStart(0, "div", 18);
17
13
  i0.ɵɵtext(1);
18
14
  i0.ɵɵelementEnd();
@@ -21,17 +17,17 @@ function CategoriesListViewComponent_Conditional_12_For_1_Conditional_6_Template
21
17
  i0.ɵɵadvance();
22
18
  i0.ɵɵtextInterpolate1(" ", category_r2.Description, " ");
23
19
  } }
24
- function CategoriesListViewComponent_Conditional_12_For_1_Template(rf, ctx) { if (rf & 1) {
20
+ function CategoriesListViewComponent_Conditional_13_For_1_Template(rf, ctx) { if (rf & 1) {
25
21
  const _r1 = i0.ɵɵgetCurrentView();
26
22
  i0.ɵɵelementStart(0, "div", 13);
27
- i0.ɵɵlistener("click", function CategoriesListViewComponent_Conditional_12_For_1_Template_div_click_0_listener() { const category_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.openCategory(category_r2)); });
23
+ i0.ɵɵlistener("click", function CategoriesListViewComponent_Conditional_13_For_1_Template_div_click_0_listener() { const category_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.openCategory(category_r2)); });
28
24
  i0.ɵɵelementStart(1, "div", 14)(2, "div", 15);
29
25
  i0.ɵɵelement(3, "i", 16);
30
26
  i0.ɵɵelementEnd();
31
27
  i0.ɵɵelementStart(4, "h3", 17);
32
28
  i0.ɵɵtext(5);
33
29
  i0.ɵɵelementEnd()();
34
- i0.ɵɵconditionalCreate(6, CategoriesListViewComponent_Conditional_12_For_1_Conditional_6_Template, 2, 1, "div", 18);
30
+ i0.ɵɵconditionalCreate(6, CategoriesListViewComponent_Conditional_13_For_1_Conditional_6_Template, 2, 1, "div", 18);
35
31
  i0.ɵɵelementStart(7, "div", 19)(8, "div", 20)(9, "span", 21);
36
32
  i0.ɵɵtext(10);
37
33
  i0.ɵɵelementEnd();
@@ -45,7 +41,7 @@ function CategoriesListViewComponent_Conditional_12_For_1_Template(rf, ctx) { if
45
41
  i0.ɵɵtext(17, "Active");
46
42
  i0.ɵɵelementEnd()()();
47
43
  i0.ɵɵelementStart(18, "div", 24)(19, "button", 25);
48
- i0.ɵɵlistener("click", function CategoriesListViewComponent_Conditional_12_For_1_Template_button_click_19_listener($event) { const category_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.viewActions(category_r2, $event)); });
44
+ i0.ɵɵlistener("click", function CategoriesListViewComponent_Conditional_13_For_1_Template_button_click_19_listener($event) { const category_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.viewActions(category_r2, $event)); });
49
45
  i0.ɵɵelement(20, "i", 26);
50
46
  i0.ɵɵtext(21, " View Actions ");
51
47
  i0.ɵɵelementEnd()()();
@@ -59,17 +55,15 @@ function CategoriesListViewComponent_Conditional_12_For_1_Template(rf, ctx) { if
59
55
  i0.ɵɵtextInterpolate(category_r2.actionCount || 0);
60
56
  i0.ɵɵadvance(5);
61
57
  i0.ɵɵtextInterpolate(category_r2.activeActionCount || 0);
62
- i0.ɵɵadvance(4);
63
- i0.ɵɵproperty("fillMode", "outline")("size", "small");
64
58
  } }
65
- function CategoriesListViewComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
66
- i0.ɵɵrepeaterCreate(0, CategoriesListViewComponent_Conditional_12_For_1_Template, 22, 6, "div", 12, _forTrack0);
59
+ function CategoriesListViewComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
60
+ i0.ɵɵrepeaterCreate(0, CategoriesListViewComponent_Conditional_13_For_1_Template, 22, 4, "div", 12, _forTrack0);
67
61
  } if (rf & 2) {
68
62
  const ctx_r2 = i0.ɵɵnextContext();
69
63
  i0.ɵɵrepeater(ctx_r2.filteredCategories);
70
64
  } }
71
- function CategoriesListViewComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
72
- i0.ɵɵelementStart(0, "div", 9);
65
+ function CategoriesListViewComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
66
+ i0.ɵɵelementStart(0, "div", 10);
73
67
  i0.ɵɵelement(1, "i", 3);
74
68
  i0.ɵɵelementStart(2, "h3");
75
69
  i0.ɵɵtext(3, "No categories found");
@@ -78,8 +72,8 @@ function CategoriesListViewComponent_Conditional_13_Template(rf, ctx) { if (rf &
78
72
  i0.ɵɵtext(5, "Try adjusting your search criteria");
79
73
  i0.ɵɵelementEnd()();
80
74
  } }
81
- function CategoriesListViewComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
82
- i0.ɵɵelementStart(0, "div", 10);
75
+ function CategoriesListViewComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
76
+ i0.ɵɵelementStart(0, "div", 11);
83
77
  i0.ɵɵelement(1, "mj-loading", 27);
84
78
  i0.ɵɵelementEnd();
85
79
  } if (rf & 2) {
@@ -177,7 +171,7 @@ export class CategoriesListViewComponent {
177
171
  this.openCategory(category);
178
172
  }
179
173
  static ɵfac = function CategoriesListViewComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CategoriesListViewComponent)(); };
180
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CategoriesListViewComponent, selectors: [["mj-categories-list-view"]], outputs: { openEntityRecord: "openEntityRecord" }, standalone: false, decls: 15, vars: 5, consts: [["mjFillContainer", "", 1, "categories-list-view"], [1, "list-header"], [1, "header-title"], [1, "fa-solid", "fa-sitemap"], [1, "results-count"], [1, "search-container"], ["placeholder", "Search categories...", 3, "valueChange", "value"], ["kendoTextBoxPrefixTemplate", ""], [1, "categories-grid"], [1, "empty-state"], [1, "loading-overlay"], [1, "fa-solid", "fa-search"], [1, "category-card"], [1, "category-card", 3, "click"], [1, "category-header"], [1, "category-icon"], [1, "fa-solid", "fa-folder"], [1, "category-name"], [1, "category-description"], [1, "category-stats"], [1, "stat-item"], [1, "stat-value"], [1, "stat-label"], [1, "stat-value", "active"], [1, "category-footer"], ["kendoButton", "", 3, "click", "fillMode", "size"], [1, "fa-solid", "fa-cogs"], ["size", "large", 3, "showText"]], template: function CategoriesListViewComponent_Template(rf, ctx) { if (rf & 1) {
174
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CategoriesListViewComponent, selectors: [["mj-categories-list-view"]], outputs: { openEntityRecord: "openEntityRecord" }, standalone: false, decls: 16, vars: 5, consts: [["mjFillContainer", "", 1, "categories-list-view"], [1, "list-header"], [1, "header-title"], [1, "fa-solid", "fa-sitemap"], [1, "results-count"], [1, "search-container"], [1, "search-input-wrapper"], [1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search categories...", 1, "mj-input", 3, "input", "value"], [1, "categories-grid"], [1, "empty-state"], [1, "loading-overlay"], [1, "category-card"], [1, "category-card", 3, "click"], [1, "category-header"], [1, "category-icon"], [1, "fa-solid", "fa-folder"], [1, "category-name"], [1, "category-description"], [1, "category-stats"], [1, "stat-item"], [1, "stat-value"], [1, "stat-label"], [1, "stat-value", "active"], [1, "category-footer"], ["mjButton", "", "variant", "outline", "size", "sm", 3, "click"], [1, "fa-solid", "fa-cogs"], ["size", "large", 3, "showText"]], template: function CategoriesListViewComponent_Template(rf, ctx) { if (rf & 1) {
181
175
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h2");
182
176
  i0.ɵɵelement(4, "i", 3);
183
177
  i0.ɵɵtext(5, " Action Categories");
@@ -185,25 +179,26 @@ export class CategoriesListViewComponent {
185
179
  i0.ɵɵelementStart(6, "div", 4);
186
180
  i0.ɵɵtext(7);
187
181
  i0.ɵɵelementEnd()();
188
- i0.ɵɵelementStart(8, "div", 5)(9, "kendo-textbox", 6);
189
- i0.ɵɵlistener("valueChange", function CategoriesListViewComponent_Template_kendo_textbox_valueChange_9_listener($event) { return ctx.onSearchChange($event); });
190
- i0.ɵɵtemplate(10, CategoriesListViewComponent_ng_template_10_Template, 1, 0, "ng-template", 7);
191
- i0.ɵɵelementEnd()()();
192
- i0.ɵɵelementStart(11, "div", 8);
193
- i0.ɵɵconditionalCreate(12, CategoriesListViewComponent_Conditional_12_Template, 2, 0)(13, CategoriesListViewComponent_Conditional_13_Template, 6, 0, "div", 9);
182
+ i0.ɵɵelementStart(8, "div", 5)(9, "div", 6);
183
+ i0.ɵɵelement(10, "i", 7);
184
+ i0.ɵɵelementStart(11, "input", 8);
185
+ i0.ɵɵlistener("input", function CategoriesListViewComponent_Template_input_input_11_listener($event) { return ctx.onSearchChange($event.target.value); });
186
+ i0.ɵɵelementEnd()()()();
187
+ i0.ɵɵelementStart(12, "div", 9);
188
+ i0.ɵɵconditionalCreate(13, CategoriesListViewComponent_Conditional_13_Template, 2, 0)(14, CategoriesListViewComponent_Conditional_14_Template, 6, 0, "div", 10);
194
189
  i0.ɵɵelementEnd();
195
- i0.ɵɵconditionalCreate(14, CategoriesListViewComponent_Conditional_14_Template, 2, 1, "div", 10);
190
+ i0.ɵɵconditionalCreate(15, CategoriesListViewComponent_Conditional_15_Template, 2, 1, "div", 11);
196
191
  i0.ɵɵelementEnd();
197
192
  } if (rf & 2) {
198
193
  i0.ɵɵadvance(7);
199
194
  i0.ɵɵtextInterpolate2("", ctx.filteredCategories.length, " of ", ctx.categories.length, " categories");
200
- i0.ɵɵadvance(2);
195
+ i0.ɵɵadvance(4);
201
196
  i0.ɵɵproperty("value", ctx.searchTerm$.value);
202
- i0.ɵɵadvance(3);
203
- i0.ɵɵconditional(ctx.filteredCategories.length > 0 ? 12 : !ctx.isLoading ? 13 : -1);
204
197
  i0.ɵɵadvance(2);
205
- i0.ɵɵconditional(ctx.isLoading ? 14 : -1);
206
- } }, dependencies: [i1.ButtonComponent, i2.TextBoxComponent, i2.TextBoxPrefixTemplateDirective, i3.FillContainer, i4.LoadingComponent], styles: [".categories-list-view[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n padding: 1.5rem;\n height: 100%;\n overflow-y: auto;\n\n .list-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 1rem;\n\n .header-title {\n display: flex;\n align-items: baseline;\n gap: 1rem;\n\n h2 {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n i {\n color: var(--kendo-color-primary);\n }\n }\n\n .results-count {\n color: var(--kendo-color-subtle);\n font-size: 0.875rem;\n }\n }\n\n .search-container {\n min-width: 250px;\n \n kendo-textbox {\n width: 100%;\n }\n }\n }\n\n .categories-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1.5rem;\n flex: 1;\n align-content: start;\n\n .category-card {\n background: var(--kendo-color-surface);\n border: 1px solid var(--kendo-color-border);\n border-radius: 0.75rem;\n padding: 1.5rem;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n\n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n border-color: var(--kendo-color-primary);\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 1rem;\n\n .category-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 3rem;\n height: 3rem;\n background: var(--kendo-color-primary-subtle);\n border-radius: 0.5rem;\n\n i {\n color: var(--kendo-color-primary);\n font-size: 1.25rem;\n }\n }\n\n .category-name {\n margin: 0;\n font-size: 1.125rem;\n font-weight: 600;\n flex: 1;\n }\n }\n\n .category-description {\n color: var(--kendo-color-subtle);\n font-size: 0.875rem;\n line-height: 1.5;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .category-stats {\n display: flex;\n gap: 2rem;\n padding: 1rem;\n background: var(--kendo-color-app-surface);\n border-radius: 0.5rem;\n\n .stat-item {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n\n .stat-value {\n font-size: 1.5rem;\n font-weight: 700;\n color: var(--kendo-color-on-app-surface);\n\n &.active {\n color: var(--kendo-color-success);\n }\n }\n\n .stat-label {\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n font-weight: 600;\n }\n }\n }\n\n .category-footer {\n display: flex;\n justify-content: flex-end;\n margin-top: auto;\n }\n }\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 4rem;\n text-align: center;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n }\n\n @media (max-width: 768px) {\n .categories-list-view[_ngcontent-%COMP%] {\n padding: 1rem;\n\n .list-header {\n flex-direction: column;\n align-items: stretch;\n\n .search-container {\n min-width: unset;\n }\n }\n\n .categories-grid {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n }\n }"] });
198
+ i0.ɵɵconditional(ctx.filteredCategories.length > 0 ? 13 : !ctx.isLoading ? 14 : -1);
199
+ i0.ɵɵadvance(2);
200
+ i0.ɵɵconditional(ctx.isLoading ? 15 : -1);
201
+ } }, dependencies: [i1.MJButtonDirective, i2.FillContainer, i3.LoadingComponent], styles: [".categories-list-view[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n padding: 1.5rem;\n height: 100%;\n overflow-y: auto;\n\n .list-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 1rem;\n\n .header-title {\n display: flex;\n align-items: baseline;\n gap: 1rem;\n\n h2 {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n i {\n color: var(--mj-brand-primary);\n }\n }\n\n .results-count {\n color: var(--mj-text-muted);\n font-size: 0.875rem;\n }\n }\n\n .search-container {\n min-width: 250px;\n \n .search-input-wrapper {\n width: 100%;\n }\n }\n }\n\n .categories-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1.5rem;\n flex: 1;\n align-content: start;\n\n .category-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 0.75rem;\n padding: 1.5rem;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n\n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n border-color: var(--mj-brand-primary);\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 1rem;\n\n .category-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 3rem;\n height: 3rem;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 0.5rem;\n\n i {\n color: var(--mj-brand-primary);\n font-size: 1.25rem;\n }\n }\n\n .category-name {\n margin: 0;\n font-size: 1.125rem;\n font-weight: 600;\n flex: 1;\n }\n }\n\n .category-description {\n color: var(--mj-text-muted);\n font-size: 0.875rem;\n line-height: 1.5;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .category-stats {\n display: flex;\n gap: 2rem;\n padding: 1rem;\n background: var(--mj-bg-surface);\n border-radius: 0.5rem;\n\n .stat-item {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n\n .stat-value {\n font-size: 1.5rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n\n &.active {\n color: var(--mj-status-success);\n }\n }\n\n .stat-label {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-weight: 600;\n }\n }\n }\n\n .category-footer {\n display: flex;\n justify-content: flex-end;\n margin-top: auto;\n }\n }\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 4rem;\n text-align: center;\n color: var(--mj-text-muted);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n }\n\n @media (max-width: 768px) {\n .categories-list-view[_ngcontent-%COMP%] {\n padding: 1rem;\n\n .list-header {\n flex-direction: column;\n align-items: stretch;\n\n .search-container {\n min-width: unset;\n }\n }\n\n .categories-grid {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n }\n }"] });
207
202
  }
208
203
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CategoriesListViewComponent, [{
209
204
  type: Component,
@@ -217,14 +212,13 @@ export class CategoriesListViewComponent {
217
212
  </div>
218
213
 
219
214
  <div class="search-container">
220
- <kendo-textbox
221
- placeholder="Search categories..."
222
- [value]="searchTerm$.value"
223
- (valueChange)="onSearchChange($event)">
224
- <ng-template kendoTextBoxPrefixTemplate>
225
- <i class="fa-solid fa-search"></i>
226
- </ng-template>
227
- </kendo-textbox>
215
+ <div class="search-input-wrapper">
216
+ <i class="fa-solid fa-search search-icon"></i>
217
+ <input type="text" class="mj-input"
218
+ placeholder="Search categories..."
219
+ [value]="searchTerm$.value"
220
+ (input)="onSearchChange($any($event.target).value)" />
221
+ </div>
228
222
  </div>
229
223
  </div>
230
224
 
@@ -258,9 +252,9 @@ export class CategoriesListViewComponent {
258
252
  </div>
259
253
 
260
254
  <div class="category-footer">
261
- <button kendoButton
262
- [fillMode]="'outline'"
263
- [size]="'small'"
255
+ <button mjButton
256
+ variant="outline"
257
+ size="sm"
264
258
  (click)="viewActions(category, $event)">
265
259
  <i class="fa-solid fa-cogs"></i> View Actions
266
260
  </button>
@@ -282,9 +276,9 @@ export class CategoriesListViewComponent {
282
276
  </div>
283
277
  }
284
278
  </div>
285
- `, styles: ["\n .categories-list-view {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n padding: 1.5rem;\n height: 100%;\n overflow-y: auto;\n\n .list-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 1rem;\n\n .header-title {\n display: flex;\n align-items: baseline;\n gap: 1rem;\n\n h2 {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n i {\n color: var(--kendo-color-primary);\n }\n }\n\n .results-count {\n color: var(--kendo-color-subtle);\n font-size: 0.875rem;\n }\n }\n\n .search-container {\n min-width: 250px;\n \n kendo-textbox {\n width: 100%;\n }\n }\n }\n\n .categories-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1.5rem;\n flex: 1;\n align-content: start;\n\n .category-card {\n background: var(--kendo-color-surface);\n border: 1px solid var(--kendo-color-border);\n border-radius: 0.75rem;\n padding: 1.5rem;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n\n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n border-color: var(--kendo-color-primary);\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 1rem;\n\n .category-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 3rem;\n height: 3rem;\n background: var(--kendo-color-primary-subtle);\n border-radius: 0.5rem;\n\n i {\n color: var(--kendo-color-primary);\n font-size: 1.25rem;\n }\n }\n\n .category-name {\n margin: 0;\n font-size: 1.125rem;\n font-weight: 600;\n flex: 1;\n }\n }\n\n .category-description {\n color: var(--kendo-color-subtle);\n font-size: 0.875rem;\n line-height: 1.5;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .category-stats {\n display: flex;\n gap: 2rem;\n padding: 1rem;\n background: var(--kendo-color-app-surface);\n border-radius: 0.5rem;\n\n .stat-item {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n\n .stat-value {\n font-size: 1.5rem;\n font-weight: 700;\n color: var(--kendo-color-on-app-surface);\n\n &.active {\n color: var(--kendo-color-success);\n }\n }\n\n .stat-label {\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n font-weight: 600;\n }\n }\n }\n\n .category-footer {\n display: flex;\n justify-content: flex-end;\n margin-top: auto;\n }\n }\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 4rem;\n text-align: center;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n }\n\n @media (max-width: 768px) {\n .categories-list-view {\n padding: 1rem;\n\n .list-header {\n flex-direction: column;\n align-items: stretch;\n\n .search-container {\n min-width: unset;\n }\n }\n\n .categories-grid {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n }\n }\n "] }]
279
+ `, styles: ["\n .categories-list-view {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n padding: 1.5rem;\n height: 100%;\n overflow-y: auto;\n\n .list-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 1rem;\n\n .header-title {\n display: flex;\n align-items: baseline;\n gap: 1rem;\n\n h2 {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n i {\n color: var(--mj-brand-primary);\n }\n }\n\n .results-count {\n color: var(--mj-text-muted);\n font-size: 0.875rem;\n }\n }\n\n .search-container {\n min-width: 250px;\n \n .search-input-wrapper {\n width: 100%;\n }\n }\n }\n\n .categories-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1.5rem;\n flex: 1;\n align-content: start;\n\n .category-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 0.75rem;\n padding: 1.5rem;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n\n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n border-color: var(--mj-brand-primary);\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 1rem;\n\n .category-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 3rem;\n height: 3rem;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 0.5rem;\n\n i {\n color: var(--mj-brand-primary);\n font-size: 1.25rem;\n }\n }\n\n .category-name {\n margin: 0;\n font-size: 1.125rem;\n font-weight: 600;\n flex: 1;\n }\n }\n\n .category-description {\n color: var(--mj-text-muted);\n font-size: 0.875rem;\n line-height: 1.5;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .category-stats {\n display: flex;\n gap: 2rem;\n padding: 1rem;\n background: var(--mj-bg-surface);\n border-radius: 0.5rem;\n\n .stat-item {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n\n .stat-value {\n font-size: 1.5rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n\n &.active {\n color: var(--mj-status-success);\n }\n }\n\n .stat-label {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-weight: 600;\n }\n }\n }\n\n .category-footer {\n display: flex;\n justify-content: flex-end;\n margin-top: auto;\n }\n }\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 4rem;\n text-align: center;\n color: var(--mj-text-muted);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n }\n\n @media (max-width: 768px) {\n .categories-list-view {\n padding: 1rem;\n\n .list-header {\n flex-direction: column;\n align-items: stretch;\n\n .search-container {\n min-width: unset;\n }\n }\n\n .categories-grid {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n }\n }\n "] }]
286
280
  }], () => [], { openEntityRecord: [{
287
281
  type: Output
288
282
  }] }); })();
289
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CategoriesListViewComponent, { className: "CategoriesListViewComponent", filePath: "src/Actions/components/categories-list-view.component.ts", lineNumber: 303 }); })();
283
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CategoriesListViewComponent, { className: "CategoriesListViewComponent", filePath: "src/Actions/components/categories-list-view.component.ts", lineNumber: 302 }); })();
290
284
  //# sourceMappingURL=categories-list-view.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"categories-list-view.component.js","sourceRoot":"","sources":["../../../src/Actions/components/categories-list-view.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\nimport { RunView, LogError } from '@memberjunction/core';\nimport { MJActionCategoryEntity, MJActionEntity } from '@memberjunction/core-entities';\nimport { Subject, BehaviorSubject } from 'rxjs';\nimport { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';\nimport { UUIDsEqual } from '@memberjunction/global';\n\ninterface CategoryWithStats extends MJActionCategoryEntity {\n actionCount?: number;\n activeActionCount?: number;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-categories-list-view',\n template: `\n <div class=\"categories-list-view\" mjFillContainer>\n <!-- Header with search -->\n <div class=\"list-header\">\n <div class=\"header-title\">\n <h2><i class=\"fa-solid fa-sitemap\"></i> Action Categories</h2>\n <div class=\"results-count\">{{ filteredCategories.length }} of {{ categories.length }} categories</div>\n </div>\n \n <div class=\"search-container\">\n <kendo-textbox \n placeholder=\"Search categories...\" \n [value]=\"searchTerm$.value\"\n (valueChange)=\"onSearchChange($event)\">\n <ng-template kendoTextBoxPrefixTemplate>\n <i class=\"fa-solid fa-search\"></i>\n </ng-template>\n </kendo-textbox>\n </div>\n </div>\n\n <!-- Categories Grid -->\n <div class=\"categories-grid\">\n @if (filteredCategories.length > 0) {\n @for (category of filteredCategories; track category.ID) {\n <div class=\"category-card\" (click)=\"openCategory(category)\">\n <div class=\"category-header\">\n <div class=\"category-icon\">\n <i class=\"fa-solid fa-folder\"></i>\n </div>\n <h3 class=\"category-name\">{{ category.Name }}</h3>\n </div>\n \n @if (category.Description) {\n <div class=\"category-description\">\n {{ category.Description }}\n </div>\n }\n \n <div class=\"category-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-value\">{{ category.actionCount || 0 }}</span>\n <span class=\"stat-label\">Total Actions</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-value active\">{{ category.activeActionCount || 0 }}</span>\n <span class=\"stat-label\">Active</span>\n </div>\n </div>\n \n <div class=\"category-footer\">\n <button kendoButton \n [fillMode]=\"'outline'\" \n [size]=\"'small'\"\n (click)=\"viewActions(category, $event)\">\n <i class=\"fa-solid fa-cogs\"></i> View Actions\n </button>\n </div>\n </div>\n }\n } @else if (!isLoading) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-sitemap\"></i>\n <h3>No categories found</h3>\n <p>Try adjusting your search criteria</p>\n </div>\n }\n </div>\n\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <mj-loading [showText]=\"false\" size=\"large\"></mj-loading>\n </div>\n }\n </div>\n `,\n styles: [`\n .categories-list-view {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n padding: 1.5rem;\n height: 100%;\n overflow-y: auto;\n\n .list-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 1rem;\n\n .header-title {\n display: flex;\n align-items: baseline;\n gap: 1rem;\n\n h2 {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n i {\n color: var(--kendo-color-primary);\n }\n }\n\n .results-count {\n color: var(--kendo-color-subtle);\n font-size: 0.875rem;\n }\n }\n\n .search-container {\n min-width: 250px;\n \n kendo-textbox {\n width: 100%;\n }\n }\n }\n\n .categories-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1.5rem;\n flex: 1;\n align-content: start;\n\n .category-card {\n background: var(--kendo-color-surface);\n border: 1px solid var(--kendo-color-border);\n border-radius: 0.75rem;\n padding: 1.5rem;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n\n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n border-color: var(--kendo-color-primary);\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 1rem;\n\n .category-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 3rem;\n height: 3rem;\n background: var(--kendo-color-primary-subtle);\n border-radius: 0.5rem;\n\n i {\n color: var(--kendo-color-primary);\n font-size: 1.25rem;\n }\n }\n\n .category-name {\n margin: 0;\n font-size: 1.125rem;\n font-weight: 600;\n flex: 1;\n }\n }\n\n .category-description {\n color: var(--kendo-color-subtle);\n font-size: 0.875rem;\n line-height: 1.5;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .category-stats {\n display: flex;\n gap: 2rem;\n padding: 1rem;\n background: var(--kendo-color-app-surface);\n border-radius: 0.5rem;\n\n .stat-item {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n\n .stat-value {\n font-size: 1.5rem;\n font-weight: 700;\n color: var(--kendo-color-on-app-surface);\n\n &.active {\n color: var(--kendo-color-success);\n }\n }\n\n .stat-label {\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n font-weight: 600;\n }\n }\n }\n\n .category-footer {\n display: flex;\n justify-content: flex-end;\n margin-top: auto;\n }\n }\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 4rem;\n text-align: center;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n }\n\n @media (max-width: 768px) {\n .categories-list-view {\n padding: 1rem;\n\n .list-header {\n flex-direction: column;\n align-items: stretch;\n\n .search-container {\n min-width: unset;\n }\n }\n\n .categories-grid {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n }\n }\n `]\n})\nexport class CategoriesListViewComponent implements OnInit, OnDestroy {\n @Output() openEntityRecord = new EventEmitter<{entityName: string; recordId: string}>();\n\n public isLoading = true;\n public categories: CategoryWithStats[] = [];\n public filteredCategories: CategoryWithStats[] = [];\n public searchTerm$ = new BehaviorSubject<string>('');\n\n private destroy$ = new Subject<void>();\n\n constructor() {}\n\n ngOnInit(): void {\n this.setupSearch();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupSearch(): void {\n this.searchTerm$.pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.applyFilter();\n });\n }\n\n private async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n console.log('Loading categories data...');\n \n const rv = new RunView();\n const [categoriesResult, actionsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Action Categories', \n OrderBy: 'Name' \n },\n {\n EntityName: 'MJ: Actions', \n OrderBy: 'Name'\n }\n ]);\n \n console.log('Categories result:', categoriesResult);\n console.log('Actions result for categories:', actionsResult);\n \n if (!categoriesResult.Success) {\n throw new Error('Failed to load categories: ' + categoriesResult.ErrorMessage);\n }\n \n const categories = (categoriesResult.Results || []) as MJActionCategoryEntity[];\n const actions = (actionsResult.Results || []) as MJActionEntity[];\n \n console.log(`Loaded ${categories.length} categories and ${actions.length} actions`);\n\n // Calculate stats for each category\n this.categories = categories.map(category => {\n const categoryActions = actions.filter(a => UUIDsEqual(a.CategoryID, category.ID));\n return {\n ...category,\n actionCount: categoryActions.length,\n activeActionCount: categoryActions.filter(a => a.Status === 'Active').length\n } as CategoryWithStats;\n });\n\n this.applyFilter();\n\n } catch (error) {\n console.error('Error loading categories data:', error);\n LogError('Failed to load categories data', undefined, error);\n this.categories = [];\n this.filteredCategories = [];\n } finally {\n this.isLoading = false;\n }\n }\n\n private applyFilter(): void {\n const searchTerm = this.searchTerm$.value.toLowerCase();\n \n if (!searchTerm) {\n this.filteredCategories = [...this.categories];\n } else {\n this.filteredCategories = this.categories.filter(category => \n category.Name.toLowerCase().includes(searchTerm) ||\n (category.Description || '').toLowerCase().includes(searchTerm)\n );\n }\n }\n\n public onSearchChange(searchTerm: string): void {\n this.searchTerm$.next(searchTerm);\n }\n\n public openCategory(category: MJActionCategoryEntity): void {\n this.openEntityRecord.emit({\n entityName: 'MJ: Action Categories',\n recordId: category.ID\n });\n }\n\n public viewActions(category: MJActionCategoryEntity, event: Event): void {\n event.stopPropagation();\n // This could navigate to the actions list with a pre-applied category filter\n // For now, just open the category\n this.openCategory(category);\n }\n}"]}
1
+ {"version":3,"file":"categories-list-view.component.js","sourceRoot":"","sources":["../../../src/Actions/components/categories-list-view.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\nimport { RunView, LogError } from '@memberjunction/core';\nimport { MJActionCategoryEntity, MJActionEntity } from '@memberjunction/core-entities';\nimport { Subject, BehaviorSubject } from 'rxjs';\nimport { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';\nimport { UUIDsEqual } from '@memberjunction/global';\n\ninterface CategoryWithStats extends MJActionCategoryEntity {\n actionCount?: number;\n activeActionCount?: number;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-categories-list-view',\n template: `\n <div class=\"categories-list-view\" mjFillContainer>\n <!-- Header with search -->\n <div class=\"list-header\">\n <div class=\"header-title\">\n <h2><i class=\"fa-solid fa-sitemap\"></i> Action Categories</h2>\n <div class=\"results-count\">{{ filteredCategories.length }} of {{ categories.length }} categories</div>\n </div>\n \n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\" class=\"mj-input\"\n placeholder=\"Search categories...\"\n [value]=\"searchTerm$.value\"\n (input)=\"onSearchChange($any($event.target).value)\" />\n </div>\n </div>\n </div>\n\n <!-- Categories Grid -->\n <div class=\"categories-grid\">\n @if (filteredCategories.length > 0) {\n @for (category of filteredCategories; track category.ID) {\n <div class=\"category-card\" (click)=\"openCategory(category)\">\n <div class=\"category-header\">\n <div class=\"category-icon\">\n <i class=\"fa-solid fa-folder\"></i>\n </div>\n <h3 class=\"category-name\">{{ category.Name }}</h3>\n </div>\n \n @if (category.Description) {\n <div class=\"category-description\">\n {{ category.Description }}\n </div>\n }\n \n <div class=\"category-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-value\">{{ category.actionCount || 0 }}</span>\n <span class=\"stat-label\">Total Actions</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-value active\">{{ category.activeActionCount || 0 }}</span>\n <span class=\"stat-label\">Active</span>\n </div>\n </div>\n \n <div class=\"category-footer\">\n <button mjButton\n variant=\"outline\"\n size=\"sm\"\n (click)=\"viewActions(category, $event)\">\n <i class=\"fa-solid fa-cogs\"></i> View Actions\n </button>\n </div>\n </div>\n }\n } @else if (!isLoading) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-sitemap\"></i>\n <h3>No categories found</h3>\n <p>Try adjusting your search criteria</p>\n </div>\n }\n </div>\n\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <mj-loading [showText]=\"false\" size=\"large\"></mj-loading>\n </div>\n }\n </div>\n `,\n styles: [`\n .categories-list-view {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n padding: 1.5rem;\n height: 100%;\n overflow-y: auto;\n\n .list-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 1rem;\n\n .header-title {\n display: flex;\n align-items: baseline;\n gap: 1rem;\n\n h2 {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n i {\n color: var(--mj-brand-primary);\n }\n }\n\n .results-count {\n color: var(--mj-text-muted);\n font-size: 0.875rem;\n }\n }\n\n .search-container {\n min-width: 250px;\n \n .search-input-wrapper {\n width: 100%;\n }\n }\n }\n\n .categories-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1.5rem;\n flex: 1;\n align-content: start;\n\n .category-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 0.75rem;\n padding: 1.5rem;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n\n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n border-color: var(--mj-brand-primary);\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 1rem;\n\n .category-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 3rem;\n height: 3rem;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 0.5rem;\n\n i {\n color: var(--mj-brand-primary);\n font-size: 1.25rem;\n }\n }\n\n .category-name {\n margin: 0;\n font-size: 1.125rem;\n font-weight: 600;\n flex: 1;\n }\n }\n\n .category-description {\n color: var(--mj-text-muted);\n font-size: 0.875rem;\n line-height: 1.5;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .category-stats {\n display: flex;\n gap: 2rem;\n padding: 1rem;\n background: var(--mj-bg-surface);\n border-radius: 0.5rem;\n\n .stat-item {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n\n .stat-value {\n font-size: 1.5rem;\n font-weight: 700;\n color: var(--mj-text-primary);\n\n &.active {\n color: var(--mj-status-success);\n }\n }\n\n .stat-label {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n font-weight: 600;\n }\n }\n }\n\n .category-footer {\n display: flex;\n justify-content: flex-end;\n margin-top: auto;\n }\n }\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 4rem;\n text-align: center;\n color: var(--mj-text-muted);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n }\n\n @media (max-width: 768px) {\n .categories-list-view {\n padding: 1rem;\n\n .list-header {\n flex-direction: column;\n align-items: stretch;\n\n .search-container {\n min-width: unset;\n }\n }\n\n .categories-grid {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n }\n }\n `]\n})\nexport class CategoriesListViewComponent implements OnInit, OnDestroy {\n @Output() openEntityRecord = new EventEmitter<{entityName: string; recordId: string}>();\n\n public isLoading = true;\n public categories: CategoryWithStats[] = [];\n public filteredCategories: CategoryWithStats[] = [];\n public searchTerm$ = new BehaviorSubject<string>('');\n\n private destroy$ = new Subject<void>();\n\n constructor() {}\n\n ngOnInit(): void {\n this.setupSearch();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupSearch(): void {\n this.searchTerm$.pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.applyFilter();\n });\n }\n\n private async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n console.log('Loading categories data...');\n \n const rv = new RunView();\n const [categoriesResult, actionsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Action Categories', \n OrderBy: 'Name' \n },\n {\n EntityName: 'MJ: Actions', \n OrderBy: 'Name'\n }\n ]);\n \n console.log('Categories result:', categoriesResult);\n console.log('Actions result for categories:', actionsResult);\n \n if (!categoriesResult.Success) {\n throw new Error('Failed to load categories: ' + categoriesResult.ErrorMessage);\n }\n \n const categories = (categoriesResult.Results || []) as MJActionCategoryEntity[];\n const actions = (actionsResult.Results || []) as MJActionEntity[];\n \n console.log(`Loaded ${categories.length} categories and ${actions.length} actions`);\n\n // Calculate stats for each category\n this.categories = categories.map(category => {\n const categoryActions = actions.filter(a => UUIDsEqual(a.CategoryID, category.ID));\n return {\n ...category,\n actionCount: categoryActions.length,\n activeActionCount: categoryActions.filter(a => a.Status === 'Active').length\n } as CategoryWithStats;\n });\n\n this.applyFilter();\n\n } catch (error) {\n console.error('Error loading categories data:', error);\n LogError('Failed to load categories data', undefined, error);\n this.categories = [];\n this.filteredCategories = [];\n } finally {\n this.isLoading = false;\n }\n }\n\n private applyFilter(): void {\n const searchTerm = this.searchTerm$.value.toLowerCase();\n \n if (!searchTerm) {\n this.filteredCategories = [...this.categories];\n } else {\n this.filteredCategories = this.categories.filter(category => \n category.Name.toLowerCase().includes(searchTerm) ||\n (category.Description || '').toLowerCase().includes(searchTerm)\n );\n }\n }\n\n public onSearchChange(searchTerm: string): void {\n this.searchTerm$.next(searchTerm);\n }\n\n public openCategory(category: MJActionCategoryEntity): void {\n this.openEntityRecord.emit({\n entityName: 'MJ: Action Categories',\n recordId: category.ID\n });\n }\n\n public viewActions(category: MJActionCategoryEntity, event: Event): void {\n event.stopPropagation();\n // This could navigate to the actions list with a pre-applied category filter\n // For now, just open the category\n this.openCategory(category);\n }\n}"]}
@@ -37,7 +37,7 @@ let CodeManagementComponent = class CodeManagementComponent extends BaseResource
37
37
  i0.ɵɵelementStart(5, "p");
38
38
  i0.ɵɵtext(6, "AI code generation approval workflow coming soon...");
39
39
  i0.ɵɵelementEnd()()();
40
- } }, styles: [".code-management-placeholder[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n\n .placeholder-content {\n text-align: center;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }"] });
40
+ } }, styles: [".code-management-placeholder[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n\n .placeholder-content {\n text-align: center;\n color: var(--mj-text-muted);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }"] });
41
41
  };
42
42
  CodeManagementComponent = __decorate([
43
43
  RegisterClass(BaseResourceComponent, 'ActionsCodeResource')
@@ -53,7 +53,7 @@ export { CodeManagementComponent };
53
53
  <p>AI code generation approval workflow coming soon...</p>
54
54
  </div>
55
55
  </div>
56
- `, styles: ["\n .code-management-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n\n .placeholder-content {\n text-align: center;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }\n "] }]
56
+ `, styles: ["\n .code-management-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n\n .placeholder-content {\n text-align: center;\n color: var(--mj-text-muted);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }\n "] }]
57
57
  }], () => [{ type: i1.NavigationService }], null); })();
58
58
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CodeManagementComponent, { className: "CodeManagementComponent", filePath: "src/Actions/components/code-management.component.ts", lineNumber: 52 }); })();
59
59
  //# sourceMappingURL=code-management.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"code-management.component.js","sourceRoot":"","sources":["../../../src/Actions/components/code-management.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;;;AACrF;;GAEG;AA6CI,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,qBAAqB;IAC5C;IAApB,YAAoB,iBAAoC;QACtD,KAAK,EAAE,CAAC;QADU,sBAAiB,GAAjB,iBAAiB,CAAmB;IAExD,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC7C,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QAC3C,OAAO,kBAAkB,CAAC;IAC5B,CAAC;iHAfU,uBAAuB;6DAAvB,uBAAuB;YAtC9B,AADF,8BAA0C,aACP;YAC/B,uBAAgC;YAChC,0BAAI;YAAA,+BAAe;YAAA,iBAAK;YACxB,yBAAG;YAAA,mEAAmD;YAE1D,AADE,AADwD,iBAAI,EACtD,EACF;;;AAiCG,uBAAuB;IA5CnC,aAAa,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;GA4C/C,uBAAuB,CAgBnC;;iFAhBY,uBAAuB;cA3CnC,SAAS;6BACI,KAAK,YACP,oBAAoB,YACpB;;;;;;;;GAQT;;kFAgCU,uBAAuB","sourcesContent":["import { Component, OnInit } from '@angular/core';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\n/**\n * Code Management Resource - displays AI code generation workflow\n */\n@RegisterClass(BaseResourceComponent, 'ActionsCodeResource')\n@Component({\n standalone: false,\n selector: 'mj-code-management',\n template: `\n <div class=\"code-management-placeholder\" >\n <div class=\"placeholder-content\">\n <i class=\"fa-solid fa-code\"></i>\n <h3>Code Management</h3>\n <p>AI code generation approval workflow coming soon...</p>\n </div>\n </div>\n `,\n styles: [`\n .code-management-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n\n .placeholder-content {\n text-align: center;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }\n `]\n})\nexport class CodeManagementComponent extends BaseResourceComponent implements OnInit {\n constructor(private navigationService: NavigationService) {\n super();\n }\n\n ngOnInit(): void {\n this.NotifyLoadComplete();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Code Management';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-code';\n }\n}"]}
1
+ {"version":3,"file":"code-management.component.js","sourceRoot":"","sources":["../../../src/Actions/components/code-management.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;;;AACrF;;GAEG;AA6CI,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,qBAAqB;IAC5C;IAApB,YAAoB,iBAAoC;QACtD,KAAK,EAAE,CAAC;QADU,sBAAiB,GAAjB,iBAAiB,CAAmB;IAExD,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC7C,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QAC3C,OAAO,kBAAkB,CAAC;IAC5B,CAAC;iHAfU,uBAAuB;6DAAvB,uBAAuB;YAtC9B,AADF,8BAA0C,aACP;YAC/B,uBAAgC;YAChC,0BAAI;YAAA,+BAAe;YAAA,iBAAK;YACxB,yBAAG;YAAA,mEAAmD;YAE1D,AADE,AADwD,iBAAI,EACtD,EACF;;;AAiCG,uBAAuB;IA5CnC,aAAa,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;GA4C/C,uBAAuB,CAgBnC;;iFAhBY,uBAAuB;cA3CnC,SAAS;6BACI,KAAK,YACP,oBAAoB,YACpB;;;;;;;;GAQT;;kFAgCU,uBAAuB","sourcesContent":["import { Component, OnInit } from '@angular/core';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\n/**\n * Code Management Resource - displays AI code generation workflow\n */\n@RegisterClass(BaseResourceComponent, 'ActionsCodeResource')\n@Component({\n standalone: false,\n selector: 'mj-code-management',\n template: `\n <div class=\"code-management-placeholder\" >\n <div class=\"placeholder-content\">\n <i class=\"fa-solid fa-code\"></i>\n <h3>Code Management</h3>\n <p>AI code generation approval workflow coming soon...</p>\n </div>\n </div>\n `,\n styles: [`\n .code-management-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n\n .placeholder-content {\n text-align: center;\n color: var(--mj-text-muted);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }\n `]\n})\nexport class CodeManagementComponent extends BaseResourceComponent implements OnInit {\n constructor(private navigationService: NavigationService) {\n super();\n }\n\n ngOnInit(): void {\n this.NotifyLoadComplete();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Code Management';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-code';\n }\n}"]}
@@ -37,7 +37,7 @@ let EntityIntegrationComponent = class EntityIntegrationComponent extends BaseRe
37
37
  i0.ɵɵelementStart(5, "p");
38
38
  i0.ɵɵtext(6, "Entity-action mapping and relationship management coming soon...");
39
39
  i0.ɵɵelementEnd()()();
40
- } }, styles: [".entity-integration-placeholder[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n\n .placeholder-content {\n text-align: center;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }"] });
40
+ } }, styles: [".entity-integration-placeholder[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n\n .placeholder-content {\n text-align: center;\n color: var(--mj-text-muted);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }"] });
41
41
  };
42
42
  EntityIntegrationComponent = __decorate([
43
43
  RegisterClass(BaseResourceComponent, 'ActionsEntitiesResource')
@@ -53,7 +53,7 @@ export { EntityIntegrationComponent };
53
53
  <p>Entity-action mapping and relationship management coming soon...</p>
54
54
  </div>
55
55
  </div>
56
- `, styles: ["\n .entity-integration-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n\n .placeholder-content {\n text-align: center;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }\n "] }]
56
+ `, styles: ["\n .entity-integration-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n\n .placeholder-content {\n text-align: center;\n color: var(--mj-text-muted);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }\n "] }]
57
57
  }], () => [{ type: i1.NavigationService }], null); })();
58
58
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(EntityIntegrationComponent, { className: "EntityIntegrationComponent", filePath: "src/Actions/components/entity-integration.component.ts", lineNumber: 52 }); })();
59
59
  //# sourceMappingURL=entity-integration.component.js.map